This commit is contained in:
2026-07-13 23:56:19 -07:00
parent 778f0f7994
commit 19f61ac454
10 changed files with 287 additions and 145 deletions
+11 -2
View File
@@ -3,6 +3,7 @@ import { superTokensAdminFunctionMiddleware, superTokensFunctionMiddleware } fro
import { createServerFn } from "@tanstack/react-start";
import { pbAdmin } from "@/lib/pocketbase/client";
import { z } from "zod";
import { emitServerEvent } from "@/lib/events/emitter";
export const getPlayerBadges = createServerFn()
.validator(z.string())
@@ -14,7 +15,11 @@ export const getPlayerBadges = createServerFn()
export const migrateBadgeProgress = createServerFn()
.middleware([superTokensAdminFunctionMiddleware])
.handler(async () =>
toServerResult(() => pbAdmin.migrateBadgeProgress())
toServerResult(async () => {
const result = await pbAdmin.migrateBadgeProgress();
emitServerEvent({ type: "badge" });
return result;
})
);
export const getAllBadges = createServerFn()
@@ -34,5 +39,9 @@ export const awardManualBadge = createServerFn()
}))
.middleware([superTokensAdminFunctionMiddleware])
.handler(async ({ data }) =>
toServerResult(() => pbAdmin.awardManualBadge(data.playerId, data.badgeId))
toServerResult(async () => {
const result = await pbAdmin.awardManualBadge(data.playerId, data.badgeId);
emitServerEvent({ type: "badge", playerId: data.playerId });
return result;
})
);
+15 -6
View File
@@ -6,7 +6,7 @@ import { z } from "zod";
import { toServerResult } from "@/lib/tanstack-query/utils/to-server-result";
import brackets from "@/features/bracket/utils";
import { Match, MatchInput } from "@/features/matches/types";
import { serverEvents } from "@/lib/events/emitter";
import { emitServerEvent } from "@/lib/events/emitter";
import { superTokensFunctionMiddleware } from "@/utils/supertokens";
import { PlayerInfo } from "../players/types";
import { serverFnLoggingMiddleware } from "@/utils/activities";
@@ -129,6 +129,8 @@ export const generateTournamentBracket = createServerFn()
matchCount: createdMatches.length,
});
emitServerEvent({ type: "tournament", tournamentId });
return {
tournament,
matchCount: createdMatches.length,
@@ -154,7 +156,7 @@ export const startMatch = createServerFn()
status: "started",
});
serverEvents.emit("match", {
emitServerEvent({
type: "match",
matchId: match.id,
tournamentId: match.tournament.id
@@ -180,7 +182,9 @@ export const populateKnockoutBracket = createServerFn()
throw new Error("Tournament must have group_config");
}
return await populateKnockoutBracketInternal(tournamentId, tournament.group_config);
const result = await populateKnockoutBracketInternal(tournamentId, tournament.group_config);
emitServerEvent({ type: "tournament", tournamentId });
return result;
})
);
@@ -479,7 +483,7 @@ export const endMatch = createServerFn()
});
if (match.lid === -1) {
serverEvents.emit("match", {
emitServerEvent({
type: "match",
matchId: match.id,
tournamentId: match.tournament.id
@@ -504,6 +508,11 @@ export const endMatch = createServerFn()
});
await pbAdmin.deleteMatch(winner.id);
emitServerEvent({
type: "match",
matchId: match.id,
tournamentId: match.tournament.id
});
return match;
}
}
@@ -530,7 +539,7 @@ export const endMatch = createServerFn()
});
}
serverEvents.emit("match", {
emitServerEvent({
type: "match",
matchId: match.id,
tournamentId: match.tournament.id
@@ -590,7 +599,7 @@ export const toggleMatchReaction = createServerFn()
const reactions = Object.values(reactionsByEmoji);
serverEvents.emit("reaction", {
emitServerEvent({
type: "reaction",
matchId,
reactions,
+13
View File
@@ -68,6 +68,9 @@ export const updatePlayer = createServerFn()
await setUserMetadata({ data: { first_name: data.first_name, last_name: data.last_name } });
const { emitServerEvent } = await import("@/lib/events/emitter");
emitServerEvent({ type: "player", playerId: existing.id! });
return updatedPlayer;
})
);
@@ -95,6 +98,12 @@ export const createPlayer = createServerFn()
await setUserMetadata({ data: { first_name: data.first_name, last_name: data.last_name, player_id: newPlayer?.id?.toString() } });
logger.info('Created player', newPlayer);
if (newPlayer?.id) {
const { emitServerEvent } = await import("@/lib/events/emitter");
emitServerEvent({ type: "player", playerId: newPlayer.id });
}
return newPlayer;
})
);
@@ -123,6 +132,10 @@ export const associatePlayer = createServerFn()
const player = await pbAdmin.getPlayer(data);
logger.info('Associated player', player);
const { emitServerEvent } = await import("@/lib/events/emitter");
emitServerEvent({ type: "player", playerId: data });
return player;
})
);
+7 -2
View File
@@ -7,6 +7,7 @@ import { teamInputSchema, teamUpdateSchema } from "./types";
import { logger } from "@/lib/logger";
import { Match } from "../matches/types";
import { serverFnLoggingMiddleware } from "@/utils/activities";
import { emitServerEvent } from "@/lib/events/emitter";
export const listTeamInfos = createServerFn()
@@ -42,7 +43,9 @@ export const createTeam = createServerFn()
//}
logger.info("Creating team", { name: data.name, userId, isAdmin });
return pbAdmin.createTeam(data);
const team = await pbAdmin.createTeam(data);
emitServerEvent({ type: "team", teamId: team?.id });
return team;
})
);
@@ -68,7 +71,9 @@ export const updateTeam = createServerFn()
// }
logger.info("Updating team", { teamId: id, userId, isAdmin });
return pbAdmin.updateTeam(id, updates);
const updated = await pbAdmin.updateTeam(id, updates);
emitServerEvent({ type: "team", teamId: id });
return updated;
})
);
+31 -6
View File
@@ -6,6 +6,7 @@ import { logger } from ".";
import { z } from "zod";
import { toServerResult } from "@/lib/tanstack-query/utils/to-server-result";
import { serverFnLoggingMiddleware } from "@/utils/activities";
import { emitServerEvent } from "@/lib/events/emitter";
import brackets from "@/features/bracket/utils";
import { MatchInput } from "@/features/matches/types";
import { generateSingleEliminationBracket } from "./utils/bracket-generator";
@@ -19,8 +20,12 @@ export const listTournaments = createServerFn()
export const createTournament = createServerFn()
.validator(tournamentInputSchema)
.middleware([superTokensAdminFunctionMiddleware, serverFnLoggingMiddleware])
.handler(async ({ data }) =>
toServerResult(() => pbAdmin.createTournament(data))
.handler(async ({ data }) =>
toServerResult(async () => {
const tournament = await pbAdmin.createTournament(data);
emitServerEvent({ type: "tournament", tournamentId: tournament.id });
return tournament;
})
);
export const updateTournament = createServerFn()
@@ -29,8 +34,12 @@ export const updateTournament = createServerFn()
updates: tournamentInputSchema.partial()
}))
.middleware([superTokensAdminFunctionMiddleware, serverFnLoggingMiddleware])
.handler(async ({ data }) =>
toServerResult(() => pbAdmin.updateTournament(data.id, data.updates))
.handler(async ({ data }) =>
toServerResult(async () => {
const tournament = await pbAdmin.updateTournament(data.id, data.updates);
emitServerEvent({ type: "tournament", tournamentId: data.id });
return tournament;
})
);
export const getTournament = createServerFn()
@@ -76,6 +85,7 @@ export const enrollTeam = createServerFn()
logger.info('Enrolling team in tournament', { tournamentId, teamId, userId });
const tournament = await pbAdmin.enrollTeam(tournamentId, teamId);
emitServerEvent({ type: "tournament", tournamentId });
return tournament;
})
);
@@ -86,8 +96,12 @@ export const unenrollTeam = createServerFn()
teamId: z.string()
}))
.middleware([superTokensFunctionMiddleware, serverFnLoggingMiddleware])
.handler(async ({ data: { tournamentId, teamId }, context }) =>
toServerResult(() => pbAdmin.unenrollTeam(tournamentId, teamId))
.handler(async ({ data: { tournamentId, teamId }, context }) =>
toServerResult(async () => {
const result = await pbAdmin.unenrollTeam(tournamentId, teamId);
emitServerEvent({ type: "tournament", tournamentId });
return result;
})
);
export const getUnenrolledTeams = createServerFn()
@@ -115,6 +129,7 @@ export const enrollFreeAgent = createServerFn()
await pbAdmin.enrollFreeAgent(player.id, data.phone, data.tournamentId);
logger.info('Player enrolled as free agent', { playerId: player.id, phone: data.phone });
emitServerEvent({ type: "tournament", tournamentId: data.tournamentId });
})
);
@@ -129,6 +144,7 @@ export const unenrollFreeAgent = createServerFn()
await pbAdmin.unenrollFreeAgent(player.id, data.tournamentId);
logger.info('Player unenrolled as free agent', { playerId: player.id });
emitServerEvent({ type: "tournament", tournamentId: data.tournamentId });
})
);
@@ -382,6 +398,9 @@ export const confirmTeamAssignments = createServerFn()
newCount: createdTeams.length - reusedCount
});
emitServerEvent({ type: "team" });
emitServerEvent({ type: "tournament", tournamentId: data.tournamentId });
return { teams: createdTeams };
})
);
@@ -702,6 +721,8 @@ export const generateKnockoutBracket = createServerFn()
qualifiedTeamCount: qualifiedTeams.length
});
emitServerEvent({ type: "tournament", tournamentId: data.tournamentId });
return {
tournament,
matchCount: createdMatches.length,
@@ -720,6 +741,7 @@ export const adminEnrollPlayer = createServerFn()
toServerResult(async () => {
await pbAdmin.enrollFreeAgent(data.playerId, "", data.tournamentId);
logger.info('Admin enrolled player', { playerId: data.playerId, tournamentId: data.tournamentId });
emitServerEvent({ type: "tournament", tournamentId: data.tournamentId });
})
);
@@ -733,6 +755,7 @@ export const adminUnenrollPlayer = createServerFn()
toServerResult(async () => {
await pbAdmin.unenrollFreeAgent(data.playerId, data.tournamentId);
logger.info('Admin unenrolled player', { playerId: data.playerId, tournamentId: data.tournamentId });
emitServerEvent({ type: "tournament", tournamentId: data.tournamentId });
})
);
@@ -881,6 +904,8 @@ export const generateGroupStage = createServerFn()
totalMatchCount: createdMatches.length
});
emitServerEvent({ type: "tournament", tournamentId: data.tournamentId });
return {
tournament,
groups: createdGroups,