Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { GraphQLFieldResolver } from 'graphql';
import { AudienceDisplayScreen } from '@lems/database';
import { AudienceDisplay } from '@lems/database';
import db from '../../../../database';

interface FieldWithDivisionId {
Expand All @@ -8,26 +8,23 @@ interface FieldWithDivisionId {

/**
* Resolver for Division.audienceDisplay field.
* Fetches field information for a division from the division_states collection.
* Fetches field information for a division from the divisions table's state column.
*/
export const audienceDisplayResolver: GraphQLFieldResolver<
FieldWithDivisionId,
unknown,
unknown,
Promise<Record<AudienceDisplayScreen, Record<string, unknown>> | null>
Promise<AudienceDisplay>
> = async (field: FieldWithDivisionId) => {
try {
const divisionState = await db.raw.mongo
.collection('division_states')
.findOne({ divisionId: field.divisionId });
const division = await db.divisions.byId(field.divisionId).get();
const divisionState = division?.state;

if (!divisionState) {
throw new Error(`Division state not found for division ID: ${field.divisionId}`);
}

return divisionState.audienceDisplay ?? {
activeDisplay: 'logo'
};
return divisionState.audienceDisplay;
} catch (error) {
console.error('Error fetching audience display for division:', field.divisionId, error);
throw error;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,11 @@ export const currentStageResolver: GraphQLFieldResolver<
Promise<string>
> = async (field: FieldWithDivisionId) => {
try {
const divisionState = await db.raw.mongo
.collection('division_states')
.findOne({ divisionId: field.divisionId });
const division = await db.divisions.byId(field.divisionId).get();
const divisionState = division?.state;

if (!divisionState || !divisionState.field?.currentStage) {
// Default to PRACTICE if no current stage is set
if (!divisionState) {
// Default to PRACTICE if the division state is not found
return 'PRACTICE';
}

Expand Down
11 changes: 5 additions & 6 deletions apps/backend/src/lib/graphql/resolvers/divisions/field/field.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ interface DivisionWithId {

/**
* Resolver for Division.field field.
* Fetches field information for a division from the division_states collection.
* Fetches field information for a division from the divisions table's state column.
*/
export const divisionFieldResolver: GraphQLFieldResolver<
DivisionWithId,
Expand All @@ -22,18 +22,17 @@ export const divisionFieldResolver: GraphQLFieldResolver<
Promise<FieldGraphQL>
> = async (division: DivisionWithId) => {
try {
const divisionState = await db.raw.mongo
.collection('division_states')
.findOne({ divisionId: division.id });
const divisionRow = await db.divisions.byId(division.id).get();
const divisionState = divisionRow?.state;

if (!divisionState) {
throw new Error(`Division state not found for division ID: ${division.id}`);
}

return {
divisionId: division.id,
loadedMatch: divisionState.field?.loadedMatch ?? null,
activeMatch: divisionState.field?.activeMatch ?? null
loadedMatch: divisionState.field.loadedMatch,
activeMatch: divisionState.field.activeMatch
};
} catch (error) {
console.error('Error fetching field for division:', division.id, error);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { GraphQLFieldResolver } from 'graphql';
import { RedisEventTypes } from '@lems/types/api/lems/redis';
import { MutationError, MutationErrorCode } from '@lems/types/api/lems';
import { DivisionState, AudienceDisplayScreen } from '@lems/database';
import { AudienceDisplayScreen } from '@lems/database';
import type { GraphQLContext } from '../../../apollo-server';
import db from '../../../../database';
import { getRedisPubSub } from '../../../../redis/redis-pubsub';
Expand Down Expand Up @@ -40,16 +40,12 @@ export const switchActiveDisplayResolver: GraphQLFieldResolver<
}
}

// Update the division's active display in MongoDB
const result = await db.raw.mongo.collection<DivisionState>('division_states').findOneAndUpdate(
{ divisionId },
{
$set: {
'audienceDisplay.activeDisplay': newDisplay
}
},
{ returnDocument: 'after' }
);
// Update the division's active display
const result = await db.divisions.byId(divisionId).updateState({
audienceDisplay: {
activeDisplay: newDisplay
}
});

if (!result) {
throw new MutationError(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { GraphQLFieldResolver } from 'graphql';
import { RedisEventTypes } from '@lems/types/api/lems/redis';
import { MutationError, MutationErrorCode } from '@lems/types/api/lems';
import { DivisionState, AwardsPresentation } from '@lems/database';
import { AwardsPresentation } from '@lems/database';
import type { GraphQLContext } from '../../../apollo-server';
import db from '../../../../database';
import { getRedisPubSub } from '../../../../redis/redis-pubsub';
Expand Down Expand Up @@ -41,19 +41,15 @@ export const updatePresentationResolver: GraphQLFieldResolver<
}
}

// Update the division's active display in MongoDB
const result = await db.raw.mongo.collection<DivisionState>('division_states').findOneAndUpdate(
{ divisionId },
{
$set: {
'audienceDisplay.awardsPresentation': {
slideIndex,
stepIndex
}
// Update the division's awards presentation
const result = await db.divisions.byId(divisionId).updateState({
audienceDisplay: {
awardsPresentation: {
slideIndex,
stepIndex
}
},
{ returnDocument: 'after' }
);
}
});

if (!result) {
throw new MutationError(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { GraphQLFieldResolver } from 'graphql';
import { RedisEventTypes } from '@lems/types/api/lems/redis';
import { MutationError, MutationErrorCode } from '@lems/types/api/lems';
import { DivisionState, AudienceDisplayScreen } from '@lems/database';
import { AudienceDisplayScreen } from '@lems/database';
import type { GraphQLContext } from '../../../apollo-server';
import db from '../../../../database';
import { getRedisPubSub } from '../../../../redis/redis-pubsub';
Expand Down Expand Up @@ -33,16 +33,16 @@ export const updateAudienceDisplaySettingResolver: GraphQLFieldResolver<
try {
await authorizeAudienceDisplayAccess(context, divisionId);

// Update the division's settings in MongoDB
const result = await db.raw.mongo.collection<DivisionState>('division_states').findOneAndUpdate(
{ divisionId },
{
$set: {
[`audienceDisplay.settings.${display}.${settingKey}`]: settingValue
// Update the division's audience display settings
const result = await db.divisions.byId(divisionId).updateState({
audienceDisplay: {
settings: {
[display]: {
[settingKey]: settingValue
}
}
},
{ returnDocument: 'after' }
);
}
});

if (!result) {
throw new MutationError(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,8 @@ export const authorizeAudienceDisplayAccess = async (
}

// Check 4: Division must have division state
const divisionState = await db.raw.mongo
.collection<DivisionState>('division_states')
.findOne({ divisionId });
const division = await db.divisions.byId(divisionId).get();
const divisionState = division?.state;

if (!divisionState) {
throw new MutationError(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { GraphQLFieldResolver } from 'graphql';
import { RedisEventTypes } from '@lems/types/api/lems/redis';
import { MutationError, MutationErrorCode } from '@lems/types/api/lems';
import { DivisionState } from '@lems/database';
import type { GraphQLContext } from '../../../apollo-server';
import db from '../../../../database';
import { getRedisPubSub } from '../../../../redis/redis-pubsub';
Expand Down Expand Up @@ -60,18 +59,12 @@ export const abortMatchResolver: GraphQLFieldResolver<
// The dequeue failure should be monitored separately
}

const divisionStateResult = await db.raw.mongo
.collection<DivisionState>('division_states')
.findOneAndUpdate(
{ divisionId },
{
$set: {
'field.activeMatch': null,
'field.loadedMatch': match.stage === 'TEST' ? null : matchId
}
},
{ returnDocument: 'after' }
);
const divisionStateResult = await db.divisions.byId(divisionId).updateState({
field: {
activeMatch: null,
loadedMatch: match.stage === 'TEST' ? null : matchId
}
});

if (!divisionStateResult) {
throw new MutationError(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { GraphQLFieldResolver } from 'graphql';
import { RedisEventTypes } from '@lems/types/api/lems/redis';
import { MutationError, MutationErrorCode } from '@lems/types/api/lems';
import { DivisionState } from '@lems/database';
import type { GraphQLContext } from '../../../apollo-server';
import db from '../../../../database';
import { getRedisPubSub } from '../../../../redis/redis-pubsub';
Expand Down Expand Up @@ -49,16 +48,12 @@ export const loadMatchResolver: GraphQLFieldResolver<
);
}

// Update the division's loaded match in MongoDB
const result = await db.raw.mongo.collection<DivisionState>('division_states').findOneAndUpdate(
{ divisionId },
{
$set: {
'field.loadedMatch': matchId
}
},
{ returnDocument: 'after' }
);
// Update the division's loaded match
const result = await db.divisions.byId(divisionId).updateState({
field: {
loadedMatch: matchId
}
});

if (!result) {
throw new MutationError(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import dayjs from 'dayjs';
import { GraphQLFieldResolver } from 'graphql';
import { RedisEventTypes } from '@lems/types/api/lems/redis';
import { MutationError, MutationErrorCode } from '@lems/types/api/lems';
import { DivisionState } from '@lems/database';
import type { GraphQLContext } from '../../../apollo-server';
import db from '../../../../database';
import { getRedisPubSub } from '../../../../redis/redis-pubsub';
Expand Down Expand Up @@ -45,13 +44,11 @@ export const startMatchResolver: GraphQLFieldResolver<
);
}

const divisionState = await db.raw.mongo
.collection<DivisionState>('division_states')
.findOne({ divisionId });
const divisionState = division.state;

// Advance stage if this is the first ranking match being started
const shouldAdvanceStage =
match.stage === 'RANKING' && divisionState?.field?.currentStage === 'PRACTICE';
match.stage === 'RANKING' && divisionState.field.currentStage === 'PRACTICE';

const startTime = dayjs();
const scheduledTime = dayjs(match.scheduled_time);
Expand All @@ -72,18 +69,12 @@ export const startMatchResolver: GraphQLFieldResolver<
}

// Update division state with active match
const divisionUpdateResult = await db.raw.mongo
.collection<DivisionState>('division_states')
.findOneAndUpdate(
{ divisionId },
{
$set: {
'field.activeMatch': matchId,
...(shouldAdvanceStage && { 'field.currentStage': 'RANKING' })
}
},
{ returnDocument: 'after' }
);
const divisionUpdateResult = await db.divisions.byId(divisionId).updateState({
field: {
activeMatch: matchId,
...(shouldAdvanceStage && { currentStage: 'RANKING' })
}
});

if (!divisionUpdateResult) {
throw new MutationError(
Expand All @@ -107,13 +98,9 @@ export const startMatchResolver: GraphQLFieldResolver<
try {
const autoLoadedMatchId = await getAutoLoadMatch(divisionId, currentStage, matchId);
if (autoLoadedMatchId) {
await db.raw.mongo
.collection<DivisionState>('division_states')
.findOneAndUpdate(
{ divisionId },
{ $set: { 'field.loadedMatch': autoLoadedMatchId } },
{ returnDocument: 'after' }
);
await db.divisions.byId(divisionId).updateState({
field: { loadedMatch: autoLoadedMatchId }
});
console.log(
`[StartMatch] Auto-loaded match ${autoLoadedMatchId} for division ${divisionId}`
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { GraphQLFieldResolver } from 'graphql';
import { MutationError, MutationErrorCode } from '@lems/types/api/lems';
import { DivisionState } from '@lems/database';
import type { GraphQLContext } from '../../../apollo-server';
import db from '../../../../database';

Expand Down Expand Up @@ -87,11 +86,10 @@ export const setMatchParticipantTeamResolver: GraphQLFieldResolver<
}

// Check 3: Match must not be currently loaded
const divisionState = await db.raw.mongo
.collection<DivisionState>('division_states')
.findOne({ divisionId });
const division = await db.divisions.byId(divisionId).get();
const divisionState = division?.state;

if (divisionState?.field?.loadedMatch === matchId) {
if (divisionState?.field.loadedMatch === matchId) {
throw new MutationError(
MutationErrorCode.CONFLICT,
'Cannot change teams in currently loaded match'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { GraphQLFieldResolver } from 'graphql';
import { MutationError, MutationErrorCode } from '@lems/types/api/lems';
import { DivisionState } from '@lems/database';
import type { GraphQLContext } from '../../../apollo-server';
import db from '../../../../database';

Expand Down Expand Up @@ -87,11 +86,10 @@ export const swapMatchTeamsResolver: GraphQLFieldResolver<
}

// Check 3: Match must not be currently loaded
const divisionState = await db.raw.mongo
.collection<DivisionState>('division_states')
.findOne({ divisionId });
const division = await db.divisions.byId(divisionId).get();
const divisionState = division?.state;

if (divisionState?.field?.loadedMatch === matchId) {
if (divisionState?.field.loadedMatch === matchId) {
throw new MutationError(
MutationErrorCode.CONFLICT,
'Cannot swap teams in currently loaded match'
Expand Down
10 changes: 3 additions & 7 deletions apps/backend/src/lib/queues/handlers/match-completed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,9 @@ export async function handleMatchCompleted(job: Job<ScheduledEvent>): Promise<vo
console.log(`[MatchCompletionHandler] Updated match ${matchId} status to completed`);

// Update division state: clear active match
await db.raw.mongo
.collection('division_states')
.findOneAndUpdate(
{ divisionId },
{ $set: { 'field.activeMatch': null } },
{ returnDocument: 'after' }
);
await db.divisions.byId(divisionId).updateState({
field: { activeMatch: null }
});

const pubSub = getRedisPubSub();
await pubSub.publish(divisionId, RedisEventTypes.MATCH_COMPLETED, {
Expand Down
Loading