From cb7f3049b3f0caa55d263fb7a4d6bdff740eea89 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 10 Feb 2025 11:21:33 +0100 Subject: [PATCH 1/4] initial translations for encounter form --- .../backend/translate/assets/i18n/en/all.json | 38 +++++++++++++++++ .../translate/assets/i18n/fr_BE/all.json | 37 ++++++++++++++++ .../translate/assets/i18n/nl_BE/all.json | 37 ++++++++++++++++ libs/utils/src/lib/i18n.generated.ts | 42 +++++++++++++++++++ 4 files changed, 154 insertions(+) diff --git a/libs/backend/translate/assets/i18n/en/all.json b/libs/backend/translate/assets/i18n/en/all.json index 91530da9f..fdfc633a3 100644 --- a/libs/backend/translate/assets/i18n/en/all.json +++ b/libs/backend/translate/assets/i18n/en/all.json @@ -82,6 +82,7 @@ "start": "Start date", "titles": { "encounters": "Encounters", + "encounter-form": "Encounter form", "matrix": "Assembly matrix", "players": "Players", "plural": "Clubs", @@ -432,6 +433,43 @@ "tuesday": "Tuesday", "wednesday": "Wednesday" }, + "encounterFormPage": { + "title": "Encounter form", + "steps": { + "0": "Info", + "1": "Results", + "2": "Confirm" + }, + "sectionTitles": { + "register": "Register", + "confirmEncounter": "Confirm encounter", + "confirmPresence": "Confirm presence", + "cancelPresence": "Cancel presence", + "confirmConfirmed": "Confirm encounter", + "cancelConfirmed": "Cancel confirmation" + }, + "prompts": { + "confirmPresence": "Is the team captain, {fullName}, present for this encounter?", + "cancelPresence": "Do you want to cancel the presence of {fullName}?", + "confirmConfirmed": "Does the team captain, {fullName}, confirm the result of this encounter?", + "cancelConfirmed": "Do you want to cancel the confirmation of {fullName}?" + }, + "buttons": { + "back": "Back", + "next": "Next", + "submit": "Submit", + "cancel": "Cancel", + "confirm": "Confirm" + }, + "inputs": { + "present": "Present", + "confirm": "Confirm" + }, + "positions": { + "captain": "Captain", + "gameLeader": "Game leader" + } + }, "event": { "checkEncounterForFilledIn": "Send notifications when encounter is not entered or confirmed", "last-sync": "Last sync", diff --git a/libs/backend/translate/assets/i18n/fr_BE/all.json b/libs/backend/translate/assets/i18n/fr_BE/all.json index ce9d7510f..6e391bb22 100644 --- a/libs/backend/translate/assets/i18n/fr_BE/all.json +++ b/libs/backend/translate/assets/i18n/fr_BE/all.json @@ -432,6 +432,43 @@ "tuesday": "Mardi", "wednesday": "Mercredi" }, + "encounterFormPage": { + "title": "Formulaire de rencontre", + "steps": { + "0": "Informations", + "1": "Résultats", + "2": "Confirmation" + }, + "sectionTitles": { + "register": "S'inscrire", + "confirmEncounter": "Confirmer la rencontre", + "confirmPresence": "Confirmer la présence", + "cancelPresence": "Annuler la présence", + "confirmConfirmed": "Confirmer la rencontre", + "cancelConfirmed": "Annuler la rencontre" + }, + "prompts": { + "confirmPresence": "Le capitaine de l'équipe, {fullName}, est-il présent pour cette rencontre?", + "cancelPresence": "Voulez-vous annuler la présence de {fullName}?", + "confirmConfirmed": "Le capitaine de l'équipe, {fullName}, confirme-t-il le résultat de cette rencontre?", + "cancelConfirmed": "Voulez-vous annuler la confirmation de {fullName}?" + }, + "buttons": { + "back": "Retour", + "next": "Suivant", + "submit": "Envoyer", + "cancel": "Annuler", + "confirm": "Confirmer" + }, + "inputs": { + "present": "Présent", + "confirm": "Confirmer" + }, + "positions": { + "captain": "Capitaine", + "gameLeader": "Chef de jeu" + } + }, "event": { "checkEncounterForFilledIn": "Envoyer des notifications lorsque le match n'est pas saisi ou confirmé", "last-sync": "Dernière mise à jour", diff --git a/libs/backend/translate/assets/i18n/nl_BE/all.json b/libs/backend/translate/assets/i18n/nl_BE/all.json index 51d740bd2..b6d81a8ce 100644 --- a/libs/backend/translate/assets/i18n/nl_BE/all.json +++ b/libs/backend/translate/assets/i18n/nl_BE/all.json @@ -432,6 +432,43 @@ "tuesday": "Dinsdag", "wednesday": "Woensdag" }, + "encounterFormPage": { + "title": "Ontmoetingsformulier", + "steps": { + "0": "Info", + "1": "Uitslagen", + "2": "Bevestigen" + }, + "sectionTitles": { + "register": "Aanmelden", + "confirmEncounter": "Ontmoeting bevestigen", + "confirmPresence": "Bevestig aanwezigheid ", + "cancelPresence": "Annuleer aanwezigheid", + "confirmConfirmed": "Bevestig ontmoeting", + "cancelConfirmed": "Annuleer bevestiging" + }, + "prompts": { + "confirmPresence": "Is de ploegkapitein, {fullName}, aanwezig voor deze ontmoeting?", + "cancelPresence": "Wil je de aanwezigheid van {fullName}, annuleren?", + "confirmConfirmed": "Bevestigd de ploegkapitein, {fullName}, de uitslag van deze ontmoeting?", + "cancelConfirmed": "Wil je de bevestiging van {fullName} annuleren?" + }, + "inputs": { + "present": "Aanwezig", + "confirm": "Bevestig" + }, + "buttons": { + "back": "Terug", + "next": "Volgende", + "submit": "Indienen", + "cancel": "Annuleren", + "confirm": "Bevestigen" + }, + "positions": { + "captain": "Ploegkapitein", + "gameLeader": "Wedstrijdleider" + } + }, "event": { "checkEncounterForFilledIn": "Stuur notificaties wanneer de wedstrijd niet ingevuld of bevestigd is", "last-sync": "Laatste update", diff --git a/libs/utils/src/lib/i18n.generated.ts b/libs/utils/src/lib/i18n.generated.ts index 1276b20f0..17ba6b7cc 100644 --- a/libs/utils/src/lib/i18n.generated.ts +++ b/libs/utils/src/lib/i18n.generated.ts @@ -89,6 +89,7 @@ export type I18nTranslations = { "start": string; "titles": { "encounters": string; + "encounter-form": string; "matrix": string; "players": string; "plural": string; @@ -439,6 +440,43 @@ export type I18nTranslations = { "tuesday": string; "wednesday": string; }; + "encounterFormPage": { + "title": string; + "steps": { + "0": string; + "1": string; + "2": string; + }; + "sectionTitles": { + "register": string; + "confirmEncounter": string; + "confirmPresence": string; + "cancelPresence": string; + "confirmConfirmed": string; + "cancelConfirmed": string; + }; + "prompts": { + "confirmPresence": string; + "cancelPresence": string; + "confirmConfirmed": string; + "cancelConfirmed": string; + }; + "buttons": { + "back": string; + "next": string; + "submit": string; + "cancel": string; + "confirm": string; + }; + "inputs": { + "present": string; + "confirm": string; + }; + "positions": { + "captain": string; + "gameLeader": string; + }; + }; "event": { "checkEncounterForFilledIn": string; "last-sync": string; @@ -1360,6 +1398,10 @@ export type I18nTranslations = { "teamFormation": { "title": string; "notFound": string; + "messages": { + "saved": string; + "downloaded": string; + }; "buttons": { "cancel": string; "save": string; From c4d0ca7092cd13e5cb2e4911cd552ca579656b40 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Thu, 13 Feb 2025 10:42:59 +0100 Subject: [PATCH 2/4] added: translations, a migration and a mutation on encounters --- ...r_form_fields_to_encounter_competitions.js | 41 ++++++++++++++++++ dump.rdb | Bin 0 -> 666 bytes .../src/models/encounter-validation.model.ts | 21 +++++++++ .../encounter-competition.model.ts | 24 ++++++++++ .../event/competition/encounter.resolver.ts | 22 ++++++++++ .../backend/translate/assets/i18n/en/all.json | 24 ++++++++-- .../translate/assets/i18n/fr_BE/all.json | 21 +++++++-- .../translate/assets/i18n/nl_BE/all.json | 21 +++++++-- libs/utils/src/lib/i18n.generated.ts | 16 +++++++ 9 files changed, 178 insertions(+), 12 deletions(-) create mode 100644 database/migrations/20250210100019-add_encounter_form_fields_to_encounter_competitions.js create mode 100644 dump.rdb diff --git a/database/migrations/20250210100019-add_encounter_form_fields_to_encounter_competitions.js b/database/migrations/20250210100019-add_encounter_form_fields_to_encounter_competitions.js new file mode 100644 index 000000000..bff5ff624 --- /dev/null +++ b/database/migrations/20250210100019-add_encounter_form_fields_to_encounter_competitions.js @@ -0,0 +1,41 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ + +const columnsToAdd = ["homeCaptainPresent", "awayCaptainPresent", "gameLeaderPresent", "homeCaptainAccepted", "awayCaptainAccepted", "gameLeaderAccepted"]; + +module.exports = { + async up (queryInterface, Sequelize) { + return queryInterface.sequelize.transaction(t => { + return Promise.all( + columnsToAdd.map(column => queryInterface.addColumn( + { tableName: 'EncounterCompetitions', schema: 'event' }, + column, + { + type: Sequelize.DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + { transaction: t }, + )) + ); + }); + }, + + async down (queryInterface, Sequelize) { + return queryInterface.sequelize.transaction(t => { + return Promise.all( + columnsToAdd.map(column => queryInterface.removeColumn( + { tableName: 'EncounterCompetitions', schema: 'event' }, + column, + { + type: Sequelize.DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + { transaction: t }, + )) + ); + }); + } +}; diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..9cc63b6c62412cc395364622b810424b5476254f GIT binary patch literal 666 zcmcK0&rZTH9Ki7oHs!DX6OWqROn|H#WMd~1#Ke;cc+i`LRcu(hWi1#&h;N`z;wzX1 zuiktCAHkc+OhnLxKL>7lZ2L{~`Tgp(=2&s;XpA9dcllRzZXp+cvy*) zmLL?5&YvFJQKHMSlc$)D-d}e?ltA8fzKJ*v!58>c0LV1Eu50r?YuUsJ<2xJk^DQDm zie<9^fH;UtF-elfa(ey_*Axf4s2>8EA&NJvH@MZQv6k0m0ta07e8Hb9^~%NeKn*bU zdiac;AmXZaDfb4p)~g=%T`cg`-T@K<(@Cz{FsJ@}s@hskosPi;qWcW4eUnRga7~l literal 0 HcmV?d00001 diff --git a/libs/backend/competition/change-encounter/src/models/encounter-validation.model.ts b/libs/backend/competition/change-encounter/src/models/encounter-validation.model.ts index d9ed50501..db2705390 100644 --- a/libs/backend/competition/change-encounter/src/models/encounter-validation.model.ts +++ b/libs/backend/competition/change-encounter/src/models/encounter-validation.model.ts @@ -14,6 +14,27 @@ export class EncounterValidationInput { clubId?: string; } +@InputType() +export class updateEncounterCompetitionInput { + @Field(() => Boolean, { nullable: true }) + gameLeaderPresent?: boolean; + + @Field(() => Boolean, { nullable: true }) + homeCaptainPresent?: boolean; + + @Field(() => Boolean, { nullable: true }) + awayCaptainPresent?: boolean; + + @Field(() => Boolean, { nullable: true }) + gameLeaderAccepted?: boolean; + + @Field(() => Boolean, { nullable: true }) + homeCaptainAccepted?: boolean; + + @Field(() => Boolean, { nullable: true }) + awayCaptainAccepted?: boolean; +} + @InputType() export class Suggestions { @Field(() => Date) diff --git a/libs/backend/database/src/models/event/competition/encounter-competition.model.ts b/libs/backend/database/src/models/event/competition/encounter-competition.model.ts index b8791b3ef..11e925b52 100644 --- a/libs/backend/database/src/models/event/competition/encounter-competition.model.ts +++ b/libs/backend/database/src/models/event/competition/encounter-competition.model.ts @@ -145,6 +145,30 @@ export class EncounterCompetition extends Model< @BelongsTo(() => Player, 'acceptedById') acceptedBy?: Relation; + @Field(() => Boolean, { nullable: false }) + @Column(DataType.BOOLEAN) + homeCaptainPresent?: boolean; + + @Field(() => Boolean, { nullable: false }) + @Column(DataType.BOOLEAN) + awayCaptainPresent?: boolean; + + @Field(() => Boolean, { nullable: false }) + @Column(DataType.BOOLEAN) + gameLeaderPresent?: boolean; + + @Field(() => Boolean, { nullable: false }) + @Column(DataType.BOOLEAN) + gameLeaderAccepted?: boolean; + + @Field(() => Boolean, { nullable: false }) + @Column(DataType.BOOLEAN) + homeCaptainAccepted?: boolean; + + @Field(() => Boolean, { nullable: false }) + @Column(DataType.BOOLEAN) + awayCaptainAccepted?: boolean; + @Field(() => Date, { nullable: true }) @Column(DataType.DATE) enteredOn?: Date; diff --git a/libs/backend/graphql/src/resolvers/event/competition/encounter.resolver.ts b/libs/backend/graphql/src/resolvers/event/competition/encounter.resolver.ts index 66b73365a..edaf9c8ec 100644 --- a/libs/backend/graphql/src/resolvers/event/competition/encounter.resolver.ts +++ b/libs/backend/graphql/src/resolvers/event/competition/encounter.resolver.ts @@ -3,6 +3,7 @@ import { EncounterValidationInput, EncounterValidationOutput, EncounterValidationService, + updateEncounterCompetitionInput, } from '@badman/backend-change-encounter'; import { Assembly, @@ -362,4 +363,25 @@ export class EncounterCompetitionResolver { } } + + @Mutation(() => EncounterCompetition) + async updateEncounterCompetition( + @User() user: Player, + @Args('encounterId') encounterId: string, + @Args('data') updateEncounterCompetitionData: updateEncounterCompetitionInput, + ) { + const encounter = await EncounterCompetition.findByPk(encounterId); + + if (!encounter) { + throw new NotFoundException(`${EncounterCompetition.name}: ${encounterId}`); + } + + if (!(await user.hasAnyPermission(['change-any:encounter']) || encounter.gameLeaderId === user.id)) { + throw new UnauthorizedException(`You do not have permission to edit this encounter`); + } + + await encounter.update(updateEncounterCompetitionData); + + return encounter; + } } diff --git a/libs/backend/translate/assets/i18n/en/all.json b/libs/backend/translate/assets/i18n/en/all.json index fdfc633a3..8bbb9139a 100644 --- a/libs/backend/translate/assets/i18n/en/all.json +++ b/libs/backend/translate/assets/i18n/en/all.json @@ -442,11 +442,13 @@ }, "sectionTitles": { "register": "Register", + "teams": "Teams", "confirmEncounter": "Confirm encounter", "confirmPresence": "Confirm presence", "cancelPresence": "Cancel presence", "confirmConfirmed": "Confirm encounter", - "cancelConfirmed": "Cancel confirmation" + "cancelConfirmed": "Cancel confirmation", + "results": "Results" }, "prompts": { "confirmPresence": "Is the team captain, {fullName}, present for this encounter?", @@ -454,20 +456,33 @@ "confirmConfirmed": "Does the team captain, {fullName}, confirm the result of this encounter?", "cancelConfirmed": "Do you want to cancel the confirmation of {fullName}?" }, + "messages": { + "areComments": "{numberOfComments} comments", + "noComments": "No Comments", + "presenceUpdated": "{position} presence updated" + }, "buttons": { "back": "Back", "next": "Next", "submit": "Submit", "cancel": "Cancel", - "confirm": "Confirm" + "confirm": "Confirm", + "seeTeamFormation": "See team details" }, "inputs": { "present": "Present", - "confirm": "Confirm" + "confirm": "Confirm", + "league": "League", + "date": "Date" }, "positions": { "captain": "Captain", - "gameLeader": "Game leader" + "gameLeader": "Game leader", + "homeCaptain": "Home captain", + "awayCaptain": "Away captain" + }, + "errors": { + "presenceNotUpdated": "{position} presence not updated" } }, "event": { @@ -1450,6 +1465,7 @@ }, "teamFormation": { "title": "Select players", + "disabledTitle": "Players", "noClub": "Team has no club", "selectPlayer": "Select player", "categories": { diff --git a/libs/backend/translate/assets/i18n/fr_BE/all.json b/libs/backend/translate/assets/i18n/fr_BE/all.json index 6e391bb22..31d1abfd3 100644 --- a/libs/backend/translate/assets/i18n/fr_BE/all.json +++ b/libs/backend/translate/assets/i18n/fr_BE/all.json @@ -441,32 +441,45 @@ }, "sectionTitles": { "register": "S'inscrire", + "teams": "Équipes", "confirmEncounter": "Confirmer la rencontre", "confirmPresence": "Confirmer la présence", "cancelPresence": "Annuler la présence", "confirmConfirmed": "Confirmer la rencontre", - "cancelConfirmed": "Annuler la rencontre" + "cancelConfirmed": "Annuler la rencontre", + "results": "Résultats" }, "prompts": { "confirmPresence": "Le capitaine de l'équipe, {fullName}, est-il présent pour cette rencontre?", "cancelPresence": "Voulez-vous annuler la présence de {fullName}?", "confirmConfirmed": "Le capitaine de l'équipe, {fullName}, confirme-t-il le résultat de cette rencontre?", "cancelConfirmed": "Voulez-vous annuler la confirmation de {fullName}?" + }, + "messages": { + "areComments": "{numberOfComments} commentaires", + "noComments": "Pas de commentaires" }, "buttons": { "back": "Retour", "next": "Suivant", "submit": "Envoyer", "cancel": "Annuler", - "confirm": "Confirmer" + "confirm": "Confirmer", + "seeTeamFormation": "Voir la formation de l'équipe" }, "inputs": { "present": "Présent", - "confirm": "Confirmer" + "confirm": "Confirmer", + "league": "Ligue" }, "positions": { "captain": "Capitaine", - "gameLeader": "Chef de jeu" + "gameLeader": "Chef de jeu", + "homeCaptain": "Capitaine à domicile", + "awayCaptain": "Capitaine à l'extérieur" + }, + "errors": { + "presenceNotUpdated": "présence du {position} non mise à jour" } }, "event": { diff --git a/libs/backend/translate/assets/i18n/nl_BE/all.json b/libs/backend/translate/assets/i18n/nl_BE/all.json index b6d81a8ce..b2987c62c 100644 --- a/libs/backend/translate/assets/i18n/nl_BE/all.json +++ b/libs/backend/translate/assets/i18n/nl_BE/all.json @@ -441,11 +441,13 @@ }, "sectionTitles": { "register": "Aanmelden", + "teams": "Ploegen", "confirmEncounter": "Ontmoeting bevestigen", "confirmPresence": "Bevestig aanwezigheid ", "cancelPresence": "Annuleer aanwezigheid", "confirmConfirmed": "Bevestig ontmoeting", - "cancelConfirmed": "Annuleer bevestiging" + "cancelConfirmed": "Annuleer bevestiging", + "results": "Uitslagen" }, "prompts": { "confirmPresence": "Is de ploegkapitein, {fullName}, aanwezig voor deze ontmoeting?", @@ -453,20 +455,31 @@ "confirmConfirmed": "Bevestigd de ploegkapitein, {fullName}, de uitslag van deze ontmoeting?", "cancelConfirmed": "Wil je de bevestiging van {fullName} annuleren?" }, + "messages": { + "areComments": "{numberOfComments} opmerkingen", + "noComments": "Geen opmerkingen" + }, "inputs": { "present": "Aanwezig", - "confirm": "Bevestig" + "confirm": "Bevestig", + "league": "Afdeling" }, "buttons": { "back": "Terug", "next": "Volgende", "submit": "Indienen", "cancel": "Annuleren", - "confirm": "Bevestigen" + "confirm": "Bevestigen", + "seeTeamFormation": "Bekijk ploegopstelling" }, "positions": { "captain": "Ploegkapitein", - "gameLeader": "Wedstrijdleider" + "gameLeader": "Wedstrijdleider", + "homeCaptain": "thuis kapitein", + "awayCaptain": "uit kapitein" + }, + "errors": { + "presenceNotUpdated": "{position} aanwezigheid niet bijgewerkt" } }, "event": { diff --git a/libs/utils/src/lib/i18n.generated.ts b/libs/utils/src/lib/i18n.generated.ts index 17ba6b7cc..592167c3e 100644 --- a/libs/utils/src/lib/i18n.generated.ts +++ b/libs/utils/src/lib/i18n.generated.ts @@ -449,11 +449,13 @@ export type I18nTranslations = { }; "sectionTitles": { "register": string; + "teams": string; "confirmEncounter": string; "confirmPresence": string; "cancelPresence": string; "confirmConfirmed": string; "cancelConfirmed": string; + "results": string; }; "prompts": { "confirmPresence": string; @@ -461,20 +463,33 @@ export type I18nTranslations = { "confirmConfirmed": string; "cancelConfirmed": string; }; + "messages": { + "areComments": string; + "noComments": string; + "presenceUpdated": string; + }; "buttons": { "back": string; "next": string; "submit": string; "cancel": string; "confirm": string; + "seeTeamFormation": string; }; "inputs": { "present": string; "confirm": string; + "league": string; + "date": string; }; "positions": { "captain": string; "gameLeader": string; + "homeCaptain": string; + "awayCaptain": string; + }; + "errors": { + "presenceNotUpdated": string; }; }; "event": { @@ -1457,6 +1472,7 @@ export type I18nTranslations = { }; "teamFormation": { "title": string; + "disabledTitle": string; "noClub": string; "selectPlayer": string; "categories": { From 620462a973a73153ef94e42b3aa511d781661d7e Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Fri, 21 Feb 2025 15:30:02 +0100 Subject: [PATCH 3/4] added: more ontmoetingsformulier changes - added encounterID as foreign key on comments, to add comments directly to ontmoetingsformulier - added input new input types for games, comments and encounter competitions --- ...50220103101-add_encounterId_to_comments.js | 41 ++++++ ...unterCommentId_to_encounter_competition.js | 48 ++++++ .../src/models/encounter-validation.model.ts | 21 --- .../database/src/models/comment.model.ts | 6 + .../encounter-competition.model.ts | 60 +++++++- .../database/src/models/event/game.model.ts | 45 +++++- .../src/resolvers/comment/comment.resolver.ts | 22 +-- .../event/competition/encounter.resolver.ts | 16 +- .../src/resolvers/game/game.resolver.ts | 139 +++++++++++++++++- .../backend/translate/assets/i18n/en/all.json | 29 +++- .../translate/assets/i18n/fr_BE/all.json | 29 +++- .../translate/assets/i18n/nl_BE/all.json | 30 +++- libs/utils/src/lib/i18n.generated.ts | 19 +++ 13 files changed, 454 insertions(+), 51 deletions(-) create mode 100644 database/migrations/20250220103101-add_encounterId_to_comments.js create mode 100644 database/migrations/20250220103145-add_encounterCommentId_to_encounter_competition.js diff --git a/database/migrations/20250220103101-add_encounterId_to_comments.js b/database/migrations/20250220103101-add_encounterId_to_comments.js new file mode 100644 index 000000000..e4318bc20 --- /dev/null +++ b/database/migrations/20250220103101-add_encounterId_to_comments.js @@ -0,0 +1,41 @@ +'use strict'; + +const columnsToAdd = ["encounterId"]; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + return queryInterface.sequelize.transaction(t => { + return Promise.all( + columnsToAdd.map(column => queryInterface.addColumn( + { tableName: 'Comments', schema: 'public' }, + column, + { + type: Sequelize.DataTypes.UUID, + allowNull: true, + references: { + model: { + tableName: 'EncounterCompetitions', + schema: 'event', + }, + key: 'id', + }, + }, + { transaction: t }, + )) + ); + }); + }, + + async down (queryInterface, Sequelize) { + return queryInterface.sequelize.transaction(t => { + return Promise.all( + columnsToAdd.map(column => queryInterface.removeColumn( + { tableName: 'Comments', schema: 'public' }, + column, + { transaction: t }, + )) + ); + }); + } +}; diff --git a/database/migrations/20250220103145-add_encounterCommentId_to_encounter_competition.js b/database/migrations/20250220103145-add_encounterCommentId_to_encounter_competition.js new file mode 100644 index 000000000..4937b4573 --- /dev/null +++ b/database/migrations/20250220103145-add_encounterCommentId_to_encounter_competition.js @@ -0,0 +1,48 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + const t = await queryInterface.sequelize.transaction(); + + try { + await queryInterface.addConstraint( + { tableName: 'Comments', schema: 'public' }, + { + fields: ['encounterId'], + type: 'foreign key', + references: { + table: {tableName: 'EncounterCompetitions', schema: 'event'}, + field: 'id', + }, + onDelete: 'cascade', + onUpdate: 'cascade', + name: 'Comments_encounterId_fkey', + + }, + {transaction: t} + ); + return t.commit(); + } catch (error) { + console.log('error', error) + await t.rollback(); + throw error; + } + }, + + async down (queryInterface, Sequelize) { + const t = await queryInterface.sequelize.transaction(); + + try { + await queryInterface.removeConstraint( + { tableName: 'Comments', schema: 'public' }, + 'Comments_encounterId_fkey', + { transaction: t }, + ); + return t.commit(); + } catch (error) { + await t.rollback(); + throw error; + } + }, +}; diff --git a/libs/backend/competition/change-encounter/src/models/encounter-validation.model.ts b/libs/backend/competition/change-encounter/src/models/encounter-validation.model.ts index db2705390..d9ed50501 100644 --- a/libs/backend/competition/change-encounter/src/models/encounter-validation.model.ts +++ b/libs/backend/competition/change-encounter/src/models/encounter-validation.model.ts @@ -14,27 +14,6 @@ export class EncounterValidationInput { clubId?: string; } -@InputType() -export class updateEncounterCompetitionInput { - @Field(() => Boolean, { nullable: true }) - gameLeaderPresent?: boolean; - - @Field(() => Boolean, { nullable: true }) - homeCaptainPresent?: boolean; - - @Field(() => Boolean, { nullable: true }) - awayCaptainPresent?: boolean; - - @Field(() => Boolean, { nullable: true }) - gameLeaderAccepted?: boolean; - - @Field(() => Boolean, { nullable: true }) - homeCaptainAccepted?: boolean; - - @Field(() => Boolean, { nullable: true }) - awayCaptainAccepted?: boolean; -} - @InputType() export class Suggestions { @Field(() => Date) diff --git a/libs/backend/database/src/models/comment.model.ts b/libs/backend/database/src/models/comment.model.ts index e7d073f83..b16807e4d 100644 --- a/libs/backend/database/src/models/comment.model.ts +++ b/libs/backend/database/src/models/comment.model.ts @@ -67,6 +67,12 @@ export class Comment extends Model { @Column(DataType.UUIDV4) clubId?: string; + @ForeignKey(() => EncounterCompetition) + @Index + @Field(() => ID, { nullable: true }) + @Column(DataType.UUIDV4) + encounterId?: string; + @BelongsTo(() => EventCompetition, { foreignKey: 'linkId', constraints: false, diff --git a/libs/backend/database/src/models/event/competition/encounter-competition.model.ts b/libs/backend/database/src/models/event/competition/encounter-competition.model.ts index 11e925b52..29e64d6d2 100644 --- a/libs/backend/database/src/models/event/competition/encounter-competition.model.ts +++ b/libs/backend/database/src/models/event/competition/encounter-competition.model.ts @@ -1,4 +1,4 @@ -import { Field, ID, Int, ObjectType } from '@nestjs/graphql'; +import { Field, ID, InputType, Int, ObjectType } from '@nestjs/graphql'; import { BelongsToGetAssociationMixin, BelongsToSetAssociationMixin, @@ -280,6 +280,16 @@ export class EncounterCompetition extends Model< }) awayCommentsChange?: Relation; + @Field(() => Comment, { nullable: true }) + @HasOne(() => Comment, { + foreignKey: 'linkId', + constraints: true, + scope: { + linkType: 'encounter', + }, + }) + encounterComment?: Relation; + // Has many Game getGames!: HasManyGetAssociationsMixin; setGames!: HasManySetAssociationsMixin; @@ -303,6 +313,10 @@ export class EncounterCompetition extends Model< getAway!: BelongsToGetAssociationMixin; setAway!: BelongsToSetAssociationMixin; + // Belongs to Away + getAcceptedBy!: BelongsToGetAssociationMixin; + setAccdeptedBy!: BelongsToSetAssociationMixin; + // Has one EncounterChange getEncounterChange!: HasOneGetAssociationMixin; setEncounterChange!: HasOneSetAssociationMixin; @@ -348,6 +362,11 @@ export class EncounterCompetition extends Model< hasAwayComments!: HasManyHasAssociationsMixin; countAwayComments!: HasManyCountAssociationsMixin; + // Has one EncounterComment + getEncounterComment!: BelongsToGetAssociationMixin; + setEncounterComment!: BelongsToSetAssociationMixin; + + // Has many HomeCommentsChange getHomeCommentsChanges!: HasManyGetAssociationsMixin; setHomeCommentsChanges!: HasManySetAssociationsMixin; @@ -370,3 +389,42 @@ export class EncounterCompetition extends Model< hasAwayCommentsChanges!: HasManyHasAssociationsMixin; countAwayCommentsChanges!: HasManyCountAssociationsMixin; } + +@InputType() +export class updateEncounterCompetitionInput { + @Field(() => Boolean, { nullable: true }) + gameLeaderPresent?: boolean; + + @Field(() => Boolean, { nullable: true }) + homeCaptainPresent?: boolean; + + @Field(() => Boolean, { nullable: true }) + awayCaptainPresent?: boolean; + + @Field(() => Boolean, { nullable: true }) + gameLeaderAccepted?: boolean; + + @Field(() => Boolean, { nullable: true }) + homeCaptainAccepted?: boolean; + + @Field(() => Boolean, { nullable: true }) + awayCaptainAccepted?: boolean; + + @Field(() => String, { nullable: true }) + startHour?: string; + + @Field(() => String, { nullable: true }) + endHour?: string; + + @Field(() => String, { nullable: true }) + shuttle?: string; + + @Field(() => Boolean, { nullable: true }) + accepted?: boolean; + + @Field(() => String, { nullable: true }) + acceptedById?: string; + + @Field(() => Date, { nullable: true }) + acceptedOn?: Date; +} diff --git a/libs/backend/database/src/models/event/game.model.ts b/libs/backend/database/src/models/event/game.model.ts index 8b7e87796..10e87e638 100644 --- a/libs/backend/database/src/models/event/game.model.ts +++ b/libs/backend/database/src/models/event/game.model.ts @@ -1,5 +1,5 @@ // import { SocketEmitter, EVENTS } from '../../../sockets'; -import { Field, ID, Int, ObjectType } from '@nestjs/graphql'; +import { Field, ID, InputType, Int, ObjectType, OmitType, PartialType } from '@nestjs/graphql'; import { BelongsToGetAssociationMixin, BelongsToManyAddAssociationMixin, @@ -265,3 +265,46 @@ export class Game extends Model, InferCreationAttributes; countPlayer!: BelongsToManyCountAssociationsMixin; } + +@InputType() +export class GameNewInputPlayers { + @Field(() => ID) + id!: string; + + @Field(() => ID) + systemId!: string; + + @Field(() => Int) + team!: number; + + @Field(() => Int) + player!: number; +} + +@InputType() +export class GameNewInput extends PartialType( + OmitType(Game, ['id', 'visualCode', "rankingPoints", "players", 'competition','linkId', 'linkType', "tournament", "createdAt", "updatedAt"] as const), + InputType +) { + @Field(() => ID, { nullable: true }) + linkId!: string; + + @Field(() => String, { nullable: true }) + linkType!: string; + + @Field(() => [GameNewInputPlayers], { nullable: true }) + players!: GameNewInputPlayers[]; +} + +@InputType() +export class GameUpdateInput extends PartialType( + OmitType(Game, ['id', 'visualCode', "rankingPoints", "players", 'competition','linkId', 'linkType', "tournament", "createdAt", "updatedAt"] as const), + InputType +) { + @Field(() => ID, { nullable: true }) + linkId!: string; + + @Field(() => ID, { nullable: true }) + gameId!: string; +} + diff --git a/libs/backend/graphql/src/resolvers/comment/comment.resolver.ts b/libs/backend/graphql/src/resolvers/comment/comment.resolver.ts index a5fa21a04..a73bcd963 100644 --- a/libs/backend/graphql/src/resolvers/comment/comment.resolver.ts +++ b/libs/backend/graphql/src/resolvers/comment/comment.resolver.ts @@ -75,7 +75,8 @@ export class CommentResolver { playerId: user.id, linkId: newCommentData.linkId, linkType: newCommentData.linkType, - clubId: newCommentData.clubId, + ...(newCommentData.clubId ? {clubId: newCommentData.clubId} : {}), + ...(newCommentData.encounterId ? {encounterId: newCommentData.encounterId} : {}), }, defaults: { ...newCommentData, @@ -105,7 +106,7 @@ export class CommentResolver { if (!(link instanceof EncounterCompetition)) { throw new BadRequestException(`linkType is not home_comment_chamge`); } - await this.encounterComment(link, comment, user, transaction); + await this.encounterComment(link, comment, user, transaction); break; } @@ -177,6 +178,8 @@ export class CommentResolver { return EventCompetition.findByPk(linkId); case 'encounterChange': return EncounterCompetition.findByPk(linkId); + case 'encounter': + return EncounterCompetition.findByPk(linkId); default: throw new NotFoundException(`${linkType}: ${linkId}`); } @@ -230,13 +233,14 @@ export class CommentResolver { ) { throw new UnauthorizedException(`You do not have permission to edit this comment`); } - - if (home.clubId === comment.clubId) { - await link.addHomeComment(comment, { transaction }); - } else if (away.clubId === comment.clubId) { - await link.addAwayComment(comment, { transaction }); - } else { - throw new BadRequestException(`clubId: ${comment.clubId} is not home or away`); + if (comment.clubId !== null && comment.encounterId === null) { + if (home.clubId === comment.clubId) { + await link.addHomeComment(comment, { transaction }); + } else if (away.clubId === comment.clubId) { + await link.addAwayComment(comment, { transaction }); + } else { + throw new BadRequestException(`clubId: ${comment.clubId} is not home or away`); + } } } } diff --git a/libs/backend/graphql/src/resolvers/event/competition/encounter.resolver.ts b/libs/backend/graphql/src/resolvers/event/competition/encounter.resolver.ts index 668c5d78e..edfd32e82 100644 --- a/libs/backend/graphql/src/resolvers/event/competition/encounter.resolver.ts +++ b/libs/backend/graphql/src/resolvers/event/competition/encounter.resolver.ts @@ -2,8 +2,7 @@ import { User } from '@badman/backend-authorization'; import { EncounterValidationInput, EncounterValidationOutput, - EncounterValidationService, - updateEncounterCompetitionInput, + EncounterValidationService } from '@badman/backend-change-encounter'; import { Assembly, @@ -16,6 +15,7 @@ import { Player, RankingSystem, Team, + updateEncounterCompetitionInput, } from '@badman/backend-database'; import { Sync, SyncQueue } from '@badman/backend-queue'; import { PointsService } from '@badman/backend-ranking'; @@ -199,6 +199,11 @@ export class EncounterCompetitionResolver { return encounter.getGameLeader(); } + @ResolveField(() => Player) + async acceptedBy(@Parent() encounter: EncounterCompetition): Promise { + return encounter.getAcceptedBy(); + } + @ResolveField(() => [Comment], { nullable: true }) async homeComments(@Parent() encounter: EncounterCompetition): Promise { return encounter.getHomeComments(); @@ -209,6 +214,11 @@ export class EncounterCompetitionResolver { return encounter.getAwayComments(); } + @ResolveField(() => Comment, { nullable: true }) + async encounterComment(@Parent() encounter: EncounterCompetition): Promise { + return encounter.getEncounterComment(); + } + @ResolveField(() => [Comment], { nullable: true }) async homeCommentsChange(@Parent() encounter: EncounterCompetition): Promise { return encounter.getHomeComments(); @@ -371,6 +381,8 @@ export class EncounterCompetitionResolver { ) { const encounter = await EncounterCompetition.findByPk(encounterId); + console.log('updateEncounterCompetitionData.acceptedById', updateEncounterCompetitionData.acceptedById) + if (!encounter) { throw new NotFoundException(`${EncounterCompetition.name}: ${encounterId}`); } diff --git a/libs/backend/graphql/src/resolvers/game/game.resolver.ts b/libs/backend/graphql/src/resolvers/game/game.resolver.ts index 452734fbc..89d2811d4 100644 --- a/libs/backend/graphql/src/resolvers/game/game.resolver.ts +++ b/libs/backend/graphql/src/resolvers/game/game.resolver.ts @@ -7,14 +7,20 @@ import { Player, RankingPoint, RankingSystem, + GameNewInput, + GameUpdateInput, } from '@badman/backend-database'; -import { NotFoundException } from '@nestjs/common'; -import { Args, ID, Parent, Query, ResolveField, Resolver } from '@nestjs/graphql'; +import { Logger, NotFoundException } from '@nestjs/common'; +import { Args, ID, Mutation, Parent, Query, ResolveField, Resolver } from '@nestjs/graphql'; import { ListArgs } from '../../utils'; import { getRankingProtected } from '@badman/utils'; +import { User } from '@badman/backend-authorization'; +import { Sequelize } from 'sequelize-typescript'; @Resolver(() => Game) export class GamesResolver { + private readonly logger = new Logger(GamesResolver.name); + constructor(private _sequelize: Sequelize) {} @Query(() => Game) async game(@Args('id', { type: () => ID }) id: string): Promise { const game = await Game.findByPk(id); @@ -115,4 +121,133 @@ export class GamesResolver { } as Player & GamePlayerMembership; }); } + + @Mutation(() => Game) + async createGame(@Args('data') newGameData: GameNewInput, @User() user: Player): Promise { + const transaction = await this._sequelize.transaction(); + try { + const encounter = await EncounterCompetition.findByPk(newGameData.linkId, { + transaction, + }); + + if (!encounter) { + throw new NotFoundException(`${EncounterCompetition.name}: ${newGameData.linkId}`); + } + + if (encounter.gameLeaderId !== user.id) { + throw new NotFoundException('You are not the game leader'); + } + + const gameData = {...newGameData}; + + const game = await Game.create( + { + playedAt: gameData.playedAt, + linkId: gameData.linkId, + linkType: gameData.linkType, + set1Team1: gameData.set1Team1, + set1Team2: gameData.set1Team2, + set2Team1: gameData.set2Team1, + set2Team2: gameData.set2Team2, + set3Team1: gameData.set3Team1, + set3Team2: gameData.set3Team2, + gameType: gameData.gameType, + winner: gameData.winner, + order: gameData.order, + status: gameData.status, + }, + { transaction }, + ); + + if (gameData.players) { + for (const player of gameData.players) { + await GamePlayerMembership.create({ + playerId: player.id, + gameId: game.id, + team: player.team, + player: player.player, + systemId: player.systemId, + }, { + transaction, + }); + } + } + + // if game is not a draw, update the score of the encounter + if (gameData.winner !== 0){ + await encounter.update({ + ...(gameData.winner === 1 ? { homeScore: encounter.homeScore + 1 } : {}), + ...(gameData.winner === 2 ? { awayScore: encounter.awayScore + 1 } : {}), + }, {transaction}); + } + + await transaction.commit(); + return game; + } catch (e) { + this.logger.warn('rollback', e); + await transaction.rollback(); + throw e; + } + } + + @Mutation(() => Game) + async updateGame(@Args('data') updateGameData: GameUpdateInput, @User() user: Player): Promise { + const transaction = await this._sequelize.transaction(); + try { + const encounter = await EncounterCompetition.findByPk(updateGameData.linkId, { + transaction, + }); + + if (!encounter) { + throw new NotFoundException(`${EncounterCompetition.name}: ${updateGameData.linkId}`); + } + + if (encounter.gameLeaderId !== user.id) { + throw new NotFoundException('You are not the game leader'); + } + + const gameData = {...updateGameData}; + + const game = await Game.findByPk(gameData.gameId, { + transaction, + }); + + if (!game) { + throw new NotFoundException(`${Game.name}: ${gameData.gameId}`); + } + + // used to check the current winner of the game against the update data, to see if the score of the new loser needs to drop + const oldGameWinner = game.winner; + + const updatedGame = await game.update( + { + set1Team1: gameData.set1Team1, + set1Team2: gameData.set1Team2, + set2Team1: gameData.set2Team1, + set2Team2: gameData.set2Team2, + set3Team1: gameData.set3Team1, + set3Team2: gameData.set3Team2, + gameType: gameData.gameType, + winner: gameData.winner, + }, + { transaction }, + ); + + // if game is not a draw, update the score of the encounter + if (gameData.winner !== 0 && oldGameWinner !== gameData.winner){ + // updates the score of the encounter, and if the winner changes for whatever reason, the score is corrected on both sides + await encounter.update({ + ...(gameData.winner === 1 ? { homeScore: encounter.homeScore + 1, ...(oldGameWinner === 2 ? {awayScore: encounter.awayScore - 1} : {}) } : {}), + ...(gameData.winner === 2 ? { awayScore: encounter.awayScore + 1, ...(oldGameWinner === 1 ? {homeScore: encounter.homeScore - 1} : {}) } : {}), + }, {transaction}); + } + + await transaction.commit(); + return updatedGame; + } catch (e) { + this.logger.warn('rollback', e); + await transaction.rollback(); + throw e; + } + } } diff --git a/libs/backend/translate/assets/i18n/en/all.json b/libs/backend/translate/assets/i18n/en/all.json index faae38dbe..800342482 100644 --- a/libs/backend/translate/assets/i18n/en/all.json +++ b/libs/backend/translate/assets/i18n/en/all.json @@ -448,7 +448,9 @@ "cancelPresence": "Cancel presence", "confirmConfirmed": "Confirm encounter", "cancelConfirmed": "Cancel confirmation", - "results": "Results" + "results": "Results", + "players": "Players", + "information": "Information" }, "prompts": { "confirmPresence": "Is the team captain, {fullName}, present for this encounter?", @@ -459,7 +461,9 @@ "messages": { "areComments": "{numberOfComments} comments", "noComments": "No Comments", - "presenceUpdated": "{position} presence updated" + "presenceUpdated": "{position} presence updated", + "gameCreated": "Game successfully created", + "gameUpdated": "Game successfully updated" }, "buttons": { "back": "Back", @@ -467,13 +471,26 @@ "submit": "Submit", "cancel": "Cancel", "confirm": "Confirm", - "seeTeamFormation": "See team details" + "seeTeamFormation": "See team details", + "2Sets": "2 sets", + "3Sets": "3 sets", + "saveChanges": "Save changes" }, "inputs": { "present": "Present", "confirm": "Confirm", "league": "League", - "date": "Date" + "date": "Date", + "players": "Players", + "player": "Player", + "winner": "Winner", + "set1": "Set 1", + "set2": "Set 2", + "set3": "Set 3", + "startTime": "Start time", + "endTime": "End time", + "shuttle": "Shuttle", + "commentsOptional": "Comments (optional)" }, "positions": { "captain": "Captain", @@ -482,7 +499,9 @@ "awayCaptain": "Away captain" }, "errors": { - "presenceNotUpdated": "{position} presence not updated" + "presenceNotUpdated": "{position} presence not updated", + "errorCreatingGame": "Error creating game", + "errorUpdatingGame": "Error updating game" } }, "event": { diff --git a/libs/backend/translate/assets/i18n/fr_BE/all.json b/libs/backend/translate/assets/i18n/fr_BE/all.json index 31d1abfd3..974890dc6 100644 --- a/libs/backend/translate/assets/i18n/fr_BE/all.json +++ b/libs/backend/translate/assets/i18n/fr_BE/all.json @@ -447,7 +447,9 @@ "cancelPresence": "Annuler la présence", "confirmConfirmed": "Confirmer la rencontre", "cancelConfirmed": "Annuler la rencontre", - "results": "Résultats" + "results": "Résultats", + "players": "Joueurs", + "information": "Informations" }, "prompts": { "confirmPresence": "Le capitaine de l'équipe, {fullName}, est-il présent pour cette rencontre?", @@ -457,7 +459,9 @@ }, "messages": { "areComments": "{numberOfComments} commentaires", - "noComments": "Pas de commentaires" + "noComments": "Pas de commentaires", + "gameCreated": "Le match a été créé", + "gameUpdated": "Le match a été mis à jour" }, "buttons": { "back": "Retour", @@ -465,12 +469,25 @@ "submit": "Envoyer", "cancel": "Annuler", "confirm": "Confirmer", - "seeTeamFormation": "Voir la formation de l'équipe" + "seeTeamFormation": "Voir la formation de l'équipe", + "2Sets": "2 sets", + "3Sets": "3 sets", + "saveChanges": "Sauvegarder les modifications" }, "inputs": { "present": "Présent", "confirm": "Confirmer", - "league": "Ligue" + "league": "Ligue", + "players": "Joueurs", + "player": "Joueur", + "winner": "Gagnant", + "set1": "Set 1", + "set2": "Set 2", + "set3": "Set 3", + "startTime": "Heure de début", + "endTime": "Heure de fin", + "shuttle": "Navette", + "commentsOptional": "Commentaires (facultatif)" }, "positions": { "captain": "Capitaine", @@ -479,7 +496,9 @@ "awayCaptain": "Capitaine à l'extérieur" }, "errors": { - "presenceNotUpdated": "présence du {position} non mise à jour" + "presenceNotUpdated": "présence du {position} non mise à jour", + "errorCreatingGame": "Erreur lors de la création du match", + "errorUpdatingGame": "Erreur lors de la mise à jour du match" } }, "event": { diff --git a/libs/backend/translate/assets/i18n/nl_BE/all.json b/libs/backend/translate/assets/i18n/nl_BE/all.json index b2987c62c..900e22274 100644 --- a/libs/backend/translate/assets/i18n/nl_BE/all.json +++ b/libs/backend/translate/assets/i18n/nl_BE/all.json @@ -447,7 +447,9 @@ "cancelPresence": "Annuleer aanwezigheid", "confirmConfirmed": "Bevestig ontmoeting", "cancelConfirmed": "Annuleer bevestiging", - "results": "Uitslagen" + "results": "Uitslagen", + "players": "Spelers", + "information": "Informatie" }, "prompts": { "confirmPresence": "Is de ploegkapitein, {fullName}, aanwezig voor deze ontmoeting?", @@ -457,12 +459,24 @@ }, "messages": { "areComments": "{numberOfComments} opmerkingen", - "noComments": "Geen opmerkingen" + "noComments": "Geen opmerkingen", + "gameCreated": "Wedstrijd aangemaakt", + "gameUpdated": "Wedstrijd bijgewerkt" }, "inputs": { "present": "Aanwezig", "confirm": "Bevestig", - "league": "Afdeling" + "league": "Afdeling", + "players": "Spelers", + "player": "Speler", + "winner": "Winnaar", + "set1": "Set 1", + "set2": "Set 2", + "set3": "Set 3", + "startTime": "Starttijd", + "endTime": "Eindtijd", + "shuttle": "Shuttle", + "commentsOptional": "Opmerkingen (optioneel)" }, "buttons": { "back": "Terug", @@ -470,7 +484,10 @@ "submit": "Indienen", "cancel": "Annuleren", "confirm": "Bevestigen", - "seeTeamFormation": "Bekijk ploegopstelling" + "seeTeamFormation": "Bekijk ploegopstelling", + "2Sets": "2 sets", + "3Sets": "3 sets", + "saveChanges": "Wijzigingen opslaan" }, "positions": { "captain": "Ploegkapitein", @@ -479,7 +496,10 @@ "awayCaptain": "uit kapitein" }, "errors": { - "presenceNotUpdated": "{position} aanwezigheid niet bijgewerkt" + "presenceNotUpdated": "{position} aanwezigheid niet bijgewerkt", + "errorCreatingGame": "Er is een fout opgetreden bij het aanmaken van de wedstrijd", + "errorUpdatingGame": "Er is een fout opgetreden bij het bijwerken van de wedstrijd" + } }, "event": { diff --git a/libs/utils/src/lib/i18n.generated.ts b/libs/utils/src/lib/i18n.generated.ts index c6171fd82..cff981257 100644 --- a/libs/utils/src/lib/i18n.generated.ts +++ b/libs/utils/src/lib/i18n.generated.ts @@ -456,6 +456,8 @@ export type I18nTranslations = { "confirmConfirmed": string; "cancelConfirmed": string; "results": string; + "players": string; + "information": string; }; "prompts": { "confirmPresence": string; @@ -467,6 +469,8 @@ export type I18nTranslations = { "areComments": string; "noComments": string; "presenceUpdated": string; + "gameCreated": string; + "gameUpdated": string; }; "buttons": { "back": string; @@ -475,12 +479,25 @@ export type I18nTranslations = { "cancel": string; "confirm": string; "seeTeamFormation": string; + "2Sets": string; + "3Sets": string; + "saveChanges": string; }; "inputs": { "present": string; "confirm": string; "league": string; "date": string; + "players": string; + "player": string; + "winner": string; + "set1": string; + "set2": string; + "set3": string; + "startTime": string; + "endTime": string; + "shuttle": string; + "commentsOptional": string; }; "positions": { "captain": string; @@ -490,6 +507,8 @@ export type I18nTranslations = { }; "errors": { "presenceNotUpdated": string; + "errorCreatingGame": string; + "errorUpdatingGame": string; }; }; "event": { From 276396367cc4879ecb27a3afe7391651f747e193 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Fri, 21 Feb 2025 15:33:04 +0100 Subject: [PATCH 4/4] removed console.log --- .../src/resolvers/event/competition/encounter.resolver.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/libs/backend/graphql/src/resolvers/event/competition/encounter.resolver.ts b/libs/backend/graphql/src/resolvers/event/competition/encounter.resolver.ts index edfd32e82..42216e056 100644 --- a/libs/backend/graphql/src/resolvers/event/competition/encounter.resolver.ts +++ b/libs/backend/graphql/src/resolvers/event/competition/encounter.resolver.ts @@ -381,8 +381,6 @@ export class EncounterCompetitionResolver { ) { const encounter = await EncounterCompetition.findByPk(encounterId); - console.log('updateEncounterCompetitionData.acceptedById', updateEncounterCompetitionData.acceptedById) - if (!encounter) { throw new NotFoundException(`${EncounterCompetition.name}: ${encounterId}`); }