volleyballsimtypes 0.0.491 → 0.0.493

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/cjs/src/api/index.d.ts +2 -1
  2. package/dist/cjs/src/api/index.js +15 -0
  3. package/dist/cjs/src/api/tactics-player-refs.d.ts +13 -0
  4. package/dist/cjs/src/api/tactics-player-refs.js +43 -0
  5. package/dist/cjs/src/data/event-purge.d.ts +14 -0
  6. package/dist/cjs/src/data/event-purge.js +116 -0
  7. package/dist/cjs/src/data/index.d.ts +1 -0
  8. package/dist/cjs/src/data/index.js +1 -0
  9. package/dist/cjs/src/data/init-models.js +41 -0
  10. package/dist/cjs/src/data/models/competition.d.ts +1 -1
  11. package/dist/cjs/src/data/models/competition.js +1 -1
  12. package/dist/cjs/src/data/models/event-bot-team.d.ts +21 -0
  13. package/dist/cjs/src/data/models/event-bot-team.js +44 -0
  14. package/dist/cjs/src/data/models/event-competition.d.ts +29 -0
  15. package/dist/cjs/src/data/models/event-competition.js +52 -0
  16. package/dist/cjs/src/data/models/event-pack-player.d.ts +22 -0
  17. package/dist/cjs/src/data/models/event-pack-player.js +31 -0
  18. package/dist/cjs/src/data/models/event-pack.d.ts +37 -0
  19. package/dist/cjs/src/data/models/event-pack.js +55 -0
  20. package/dist/cjs/src/data/models/event-result.d.ts +34 -0
  21. package/dist/cjs/src/data/models/event-result.js +48 -0
  22. package/dist/cjs/src/data/models/event-squad.d.ts +30 -0
  23. package/dist/cjs/src/data/models/event-squad.js +46 -0
  24. package/dist/cjs/src/data/models/event.d.ts +51 -0
  25. package/dist/cjs/src/data/models/event.js +82 -0
  26. package/dist/cjs/src/data/models/index.d.ts +7 -0
  27. package/dist/cjs/src/data/models/index.js +7 -0
  28. package/dist/cjs/src/data/models/lineup-preset.d.ts +3 -1
  29. package/dist/cjs/src/data/models/lineup-preset.js +53 -0
  30. package/dist/cjs/src/index.d.ts +1 -0
  31. package/dist/cjs/src/index.js +6 -0
  32. package/dist/cjs/src/service/competition/event-draft.d.ts +40 -0
  33. package/dist/cjs/src/service/competition/event-draft.js +68 -0
  34. package/dist/cjs/src/service/competition/event-draft.test.d.ts +1 -0
  35. package/dist/cjs/src/service/competition/event-draft.test.js +118 -0
  36. package/dist/cjs/src/service/competition/event-rewards.d.ts +26 -0
  37. package/dist/cjs/src/service/competition/event-rewards.js +49 -0
  38. package/dist/cjs/src/service/competition/event-rewards.test.d.ts +1 -0
  39. package/dist/cjs/src/service/competition/event-rewards.test.js +58 -0
  40. package/dist/cjs/src/service/competition/event-schedule.d.ts +126 -0
  41. package/dist/cjs/src/service/competition/event-schedule.js +141 -0
  42. package/dist/cjs/src/service/competition/event-schedule.test.d.ts +1 -0
  43. package/dist/cjs/src/service/competition/event-schedule.test.js +138 -0
  44. package/dist/cjs/src/service/competition/index.d.ts +3 -0
  45. package/dist/cjs/src/service/competition/index.js +3 -0
  46. package/dist/cjs/src/service/match/index.d.ts +1 -0
  47. package/dist/cjs/src/service/match/index.js +1 -0
  48. package/dist/cjs/src/service/match/match-generator.js +25 -48
  49. package/dist/cjs/src/service/match/match-generator.test.d.ts +1 -0
  50. package/dist/cjs/src/service/match/match-generator.test.js +48 -0
  51. package/dist/cjs/src/service/match/round-robin.d.ts +11 -0
  52. package/dist/cjs/src/service/match/round-robin.js +44 -0
  53. package/dist/cjs/src/service/match/round-robin.test.d.ts +1 -0
  54. package/dist/cjs/src/service/match/round-robin.test.js +71 -0
  55. package/dist/cjs/src/service/notification/catalog/en.json +21 -0
  56. package/dist/cjs/src/service/notification/catalog/es.json +21 -0
  57. package/dist/cjs/src/service/notification/catalog/fr.json +21 -0
  58. package/dist/cjs/src/service/notification/catalog/it.json +21 -0
  59. package/dist/cjs/src/service/notification/catalog/pl.json +21 -0
  60. package/dist/cjs/src/service/notification/catalog/pt-BR.json +21 -0
  61. package/dist/cjs/src/service/notification/catalog/tr.json +21 -0
  62. package/dist/cjs/src/service/notification/notification-type.d.ts +1 -1
  63. package/dist/cjs/src/service/notification/notification-type.js +6 -1
  64. package/dist/cjs/src/service/notification/notification.test.js +3 -1
  65. package/dist/cjs/src/service/notification/registry.js +52 -0
  66. package/dist/cjs/src/service/player/player-generator.d.ts +2 -1
  67. package/dist/cjs/src/service/player/player-generator.js +37 -5
  68. package/dist/esm/src/api/index.d.ts +2 -1
  69. package/dist/esm/src/api/index.js +1 -0
  70. package/dist/esm/src/api/tactics-player-refs.d.ts +13 -0
  71. package/dist/esm/src/api/tactics-player-refs.js +40 -0
  72. package/dist/esm/src/data/event-purge.d.ts +14 -0
  73. package/dist/esm/src/data/event-purge.js +110 -0
  74. package/dist/esm/src/data/index.d.ts +1 -0
  75. package/dist/esm/src/data/index.js +1 -0
  76. package/dist/esm/src/data/init-models.js +42 -1
  77. package/dist/esm/src/data/models/competition.d.ts +1 -1
  78. package/dist/esm/src/data/models/competition.js +1 -1
  79. package/dist/esm/src/data/models/event-bot-team.d.ts +21 -0
  80. package/dist/esm/src/data/models/event-bot-team.js +40 -0
  81. package/dist/esm/src/data/models/event-competition.d.ts +29 -0
  82. package/dist/esm/src/data/models/event-competition.js +48 -0
  83. package/dist/esm/src/data/models/event-pack-player.d.ts +22 -0
  84. package/dist/esm/src/data/models/event-pack-player.js +27 -0
  85. package/dist/esm/src/data/models/event-pack.d.ts +37 -0
  86. package/dist/esm/src/data/models/event-pack.js +51 -0
  87. package/dist/esm/src/data/models/event-result.d.ts +34 -0
  88. package/dist/esm/src/data/models/event-result.js +44 -0
  89. package/dist/esm/src/data/models/event-squad.d.ts +30 -0
  90. package/dist/esm/src/data/models/event-squad.js +42 -0
  91. package/dist/esm/src/data/models/event.d.ts +51 -0
  92. package/dist/esm/src/data/models/event.js +78 -0
  93. package/dist/esm/src/data/models/index.d.ts +7 -0
  94. package/dist/esm/src/data/models/index.js +7 -0
  95. package/dist/esm/src/data/models/lineup-preset.d.ts +3 -1
  96. package/dist/esm/src/data/models/lineup-preset.js +20 -0
  97. package/dist/esm/src/index.d.ts +1 -0
  98. package/dist/esm/src/index.js +4 -0
  99. package/dist/esm/src/service/competition/event-draft.d.ts +40 -0
  100. package/dist/esm/src/service/competition/event-draft.js +62 -0
  101. package/dist/esm/src/service/competition/event-draft.test.d.ts +1 -0
  102. package/dist/esm/src/service/competition/event-draft.test.js +116 -0
  103. package/dist/esm/src/service/competition/event-rewards.d.ts +26 -0
  104. package/dist/esm/src/service/competition/event-rewards.js +44 -0
  105. package/dist/esm/src/service/competition/event-rewards.test.d.ts +1 -0
  106. package/dist/esm/src/service/competition/event-rewards.test.js +56 -0
  107. package/dist/esm/src/service/competition/event-schedule.d.ts +126 -0
  108. package/dist/esm/src/service/competition/event-schedule.js +129 -0
  109. package/dist/esm/src/service/competition/event-schedule.test.d.ts +1 -0
  110. package/dist/esm/src/service/competition/event-schedule.test.js +136 -0
  111. package/dist/esm/src/service/competition/index.d.ts +3 -0
  112. package/dist/esm/src/service/competition/index.js +3 -0
  113. package/dist/esm/src/service/match/index.d.ts +1 -0
  114. package/dist/esm/src/service/match/index.js +1 -0
  115. package/dist/esm/src/service/match/match-generator.js +25 -48
  116. package/dist/esm/src/service/match/match-generator.test.d.ts +1 -0
  117. package/dist/esm/src/service/match/match-generator.test.js +43 -0
  118. package/dist/esm/src/service/match/round-robin.d.ts +11 -0
  119. package/dist/esm/src/service/match/round-robin.js +41 -0
  120. package/dist/esm/src/service/match/round-robin.test.d.ts +1 -0
  121. package/dist/esm/src/service/match/round-robin.test.js +69 -0
  122. package/dist/esm/src/service/notification/catalog/en.json +21 -0
  123. package/dist/esm/src/service/notification/catalog/es.json +21 -0
  124. package/dist/esm/src/service/notification/catalog/fr.json +21 -0
  125. package/dist/esm/src/service/notification/catalog/it.json +21 -0
  126. package/dist/esm/src/service/notification/catalog/pl.json +21 -0
  127. package/dist/esm/src/service/notification/catalog/pt-BR.json +21 -0
  128. package/dist/esm/src/service/notification/catalog/tr.json +21 -0
  129. package/dist/esm/src/service/notification/notification-type.d.ts +1 -1
  130. package/dist/esm/src/service/notification/notification-type.js +6 -1
  131. package/dist/esm/src/service/notification/notification.test.js +3 -1
  132. package/dist/esm/src/service/notification/registry.js +52 -0
  133. package/dist/esm/src/service/player/player-generator.d.ts +2 -1
  134. package/dist/esm/src/service/player/player-generator.js +36 -4
  135. package/package.json +6 -1
@@ -1,4 +1,5 @@
1
1
  import { BoxScore, DataProps, DeclineStatus, Division as _Division, League as _League, Match as _Match, MatchSet as _MatchSet, Player as _Player, PlayerPosition, Qualifier as _Qualifier, QualifierMatch as _QualifierMatch, Rally as _Rally, RallyEvent as _RallyEvent, PointBreakdown, RallyMetrics, Season as _Season, Standing as _Standing, Team as _Team, Tournament as _Tournament, TournamentMatch as _TournamentMatch, National as _National, NationalMatch as _NationalMatch, Country as _Country, BlockingAssignment, CourtPosition, ConditionLogic, EnergyBand, MatchForfeitType, PerformanceStats, PinchCondition, RotationSystemEnum, SubBackMode, SubBand } from '../service';
2
+ export * from './tactics-player-refs';
2
3
  export type Rally = DataProps<_Rally> & {
3
4
  homePlayerPosition: PlayerPosition[];
4
5
  awayPlayerPosition: PlayerPosition[];
@@ -16,7 +17,7 @@ export interface Results {
16
17
  away: number[];
17
18
  }
18
19
  export interface MatchCompetition {
19
- type: 'LEAGUE' | 'NATIONAL' | 'QUALIFIER' | 'TOURNAMENT';
20
+ type: 'LEAGUE' | 'NATIONAL' | 'QUALIFIER' | 'TOURNAMENT' | 'EVENT';
20
21
  countryName?: string;
21
22
  countryAlpha2?: string;
22
23
  countryAlpha3?: string;
@@ -1,3 +1,18 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
17
  const service_1 = require("../service");
18
+ __exportStar(require("./tactics-player-refs"), exports);
@@ -0,0 +1,13 @@
1
+ import type { Tactics } from '.';
2
+ /**
3
+ * Every player id a tactics config references, anywhere: the six court slots and the libero, the bench, libero
4
+ * replacements (flat and per-set), the second libero, designated subs and their per-set overrides, designated
5
+ * setters (flat and per-set), the keys of the offensive-weight and blocking-target maps, injury replacements
6
+ * and the libero-injury reserves.
7
+ *
8
+ * There is exactly ONE implementation of this on purpose. It backs three rules that must agree or a player
9
+ * slips through: the dismiss/retire guard (a referenced player cannot be removed), the event rarity check
10
+ * (every referenced player must match the event's rarity), and the simulator's re-validation of an event entry
11
+ * at the registration deadline. A field missed here silently unlocks a player in all three.
12
+ */
13
+ export declare function collectTacticsPlayerIds(config: Tactics): string[];
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.collectTacticsPlayerIds = collectTacticsPlayerIds;
4
+ /**
5
+ * Every player id a tactics config references, anywhere: the six court slots and the libero, the bench, libero
6
+ * replacements (flat and per-set), the second libero, designated subs and their per-set overrides, designated
7
+ * setters (flat and per-set), the keys of the offensive-weight and blocking-target maps, injury replacements
8
+ * and the libero-injury reserves.
9
+ *
10
+ * There is exactly ONE implementation of this on purpose. It backs three rules that must agree or a player
11
+ * slips through: the dismiss/retire guard (a referenced player cannot be removed), the event rarity check
12
+ * (every referenced player must match the event's rarity), and the simulator's re-validation of an event entry
13
+ * at the registration deadline. A field missed here silently unlocks a player in all three.
14
+ */
15
+ function collectTacticsPlayerIds(config) {
16
+ const lineup = config.lineup;
17
+ const referenced = [
18
+ lineup[0], lineup[1], lineup[2], lineup[3], lineup[4], lineup[5], lineup[6],
19
+ ...(Array.isArray(lineup.bench) ? lineup.bench : []),
20
+ ...(config.liberoReplacements ?? []),
21
+ ...((config.designatedSubs ?? []).flatMap(ds => [
22
+ ds.starterId,
23
+ ds.benchId,
24
+ ...((ds.sets ?? []).map(s => s.benchId))
25
+ ])),
26
+ config.secondLibero,
27
+ ...((config.liberoReplacementSets ?? []).flat()),
28
+ ...(config.designatedSetters ?? []),
29
+ ...((config.offensivePreferences ?? []).flatMap(p => Object.keys(p.weights))),
30
+ ...((config.systemSets ?? []).flatMap(s => s.designatedSetters)),
31
+ ...((config.offensivePreferenceSets ?? []).flat().flatMap(p => Object.keys(p.weights))),
32
+ ...((config.blockingPreferences ?? []).flatMap(p => Object.keys(p.targets))),
33
+ ...((config.blockingPreferenceSets ?? []).flat().flatMap(p => Object.keys(p.targets))),
34
+ // Injury replacements reference reserves (roster players outside the lineup); roster membership is the only
35
+ // player check possible here (the schema enforces the bench/reserve role rules).
36
+ ...((config.injuryReplacements ?? []).flatMap(ir => [ir.starterId, ir.replacementId, ir.benchBackfillId])),
37
+ // Libero-injury ids reference reserves/bench players; roster membership is the only check possible here.
38
+ ...(config.liberoInjury != null
39
+ ? [config.liberoInjury.preMatchReplacementId, config.liberoInjury.secondLiberoBackfillId, config.liberoInjury.inMatchDesignateId]
40
+ : [])
41
+ ];
42
+ return [...new Set(referenced.filter((id) => typeof id === 'string' && id.length > 0))];
43
+ }
@@ -0,0 +1,14 @@
1
+ import { Sequelize } from 'sequelize';
2
+ /**
3
+ * Delete everything an event produced, keeping only the Event row itself (with purged_at stamped) so the game
4
+ * retains a record that it ran. Pass `removeEvent` to drop that row too, which is what an admin delete does.
5
+ *
6
+ * Order matters: MatchResult has no FK to Match and must go explicitly (same as the weekly friendly purge);
7
+ * deleting the Match then cascades MatchSet -> Rally/BoxScore, VPER, MatchRating, PlayerImprovementLog and
8
+ * MatchPreset. The drafted squads go the same way as the bots: their throwaway teams and every player in them
9
+ * are deleted, along with any packs whose choices were never picked.
10
+ *
11
+ * EventResult is deliberately NOT touched. It is the permanent record of where each entrant finished and the
12
+ * only event row besides Event itself that outlives this.
13
+ */
14
+ export declare function purgeEvent(sequelize: Sequelize, eventId: string, removeEvent?: boolean): Promise<void>;
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.purgeEvent = purgeEvent;
7
+ const sequelize_1 = require("sequelize");
8
+ const models_1 = require("./models");
9
+ const logger_1 = __importDefault(require("../logger"));
10
+ // Tearing an event down. This lives in Types rather than in either service because BOTH perform it and they
11
+ // must agree exactly: the simulator purges an event on its scheduled date, and the admin API purges one that
12
+ // is being deleted outright. A second implementation of a destructive delete is how orphans get left behind.
13
+ /**
14
+ * Delete everything an event produced, keeping only the Event row itself (with purged_at stamped) so the game
15
+ * retains a record that it ran. Pass `removeEvent` to drop that row too, which is what an admin delete does.
16
+ *
17
+ * Order matters: MatchResult has no FK to Match and must go explicitly (same as the weekly friendly purge);
18
+ * deleting the Match then cascades MatchSet -> Rally/BoxScore, VPER, MatchRating, PlayerImprovementLog and
19
+ * MatchPreset. The drafted squads go the same way as the bots: their throwaway teams and every player in them
20
+ * are deleted, along with any packs whose choices were never picked.
21
+ *
22
+ * EventResult is deliberately NOT touched. It is the permanent record of where each entrant finished and the
23
+ * only event row besides Event itself that outlives this.
24
+ */
25
+ async function purgeEvent(sequelize, eventId, removeEvent = false) {
26
+ await sequelize.transaction(async (transaction) => {
27
+ const competitions = await models_1.EventCompetitionModel.findAll({
28
+ where: { event_id: eventId },
29
+ attributes: ['competition_id'],
30
+ transaction
31
+ });
32
+ const competitionIds = competitions.map(c => c.competition_id);
33
+ const botTeams = await models_1.EventBotTeamModel.findAll({
34
+ where: { event_id: eventId },
35
+ attributes: ['team_id'],
36
+ transaction
37
+ });
38
+ const squads = await models_1.EventSquadModel.findAll({
39
+ where: { event_id: eventId },
40
+ attributes: ['team_id'],
41
+ transaction
42
+ });
43
+ // Bots and drafted squads are the same thing here: throwaway teams full of generated players.
44
+ const botTeamIds = [...botTeams.map(b => b.team_id), ...squads.map(s => s.team_id)];
45
+ if (competitionIds.length > 0) {
46
+ const matchRows = await models_1.CompetitionMatchModel.findAll({
47
+ where: { competition_id: competitionIds },
48
+ attributes: ['match_id'],
49
+ transaction
50
+ });
51
+ const matchIds = matchRows.map(m => m.match_id);
52
+ if (matchIds.length > 0) {
53
+ await models_1.MatchResultModel.destroy({ where: { match_id: matchIds }, transaction });
54
+ await models_1.CompetitionMatchModel.destroy({ where: { competition_id: competitionIds }, transaction });
55
+ await models_1.MatchModel.destroy({ where: { match_id: matchIds }, transaction });
56
+ }
57
+ await models_1.CompetitionStandingsModel.destroy({ where: { competition_id: competitionIds }, transaction });
58
+ await sequelize.query('DELETE FROM "CompetitionStandingsMatch" WHERE competition_id IN (:ids)', {
59
+ replacements: { ids: competitionIds }, type: sequelize_1.QueryTypes.DELETE, transaction
60
+ });
61
+ await models_1.CompetitionTeamsModel.destroy({ where: { competition_id: competitionIds }, transaction });
62
+ await models_1.EventCompetitionModel.destroy({ where: { event_id: eventId }, transaction });
63
+ await models_1.CompetitionModel.destroy({ where: { competition_id: competitionIds }, transaction });
64
+ }
65
+ // Packs first: an unpicked choice still points at a Player row, and the pack points at the picked one, so
66
+ // both references have to go before the players themselves.
67
+ const packs = await models_1.EventPackModel.findAll({
68
+ where: { event_id: eventId },
69
+ attributes: ['pack_id'],
70
+ transaction
71
+ });
72
+ if (packs.length > 0) {
73
+ const packIds = packs.map(p => p.pack_id);
74
+ const choices = await models_1.EventPackPlayerModel.findAll({
75
+ where: { pack_id: packIds },
76
+ attributes: ['player_id'],
77
+ transaction
78
+ });
79
+ await models_1.EventPackPlayerModel.destroy({ where: { pack_id: packIds }, transaction });
80
+ await models_1.EventPackModel.destroy({ where: { event_id: eventId }, transaction });
81
+ // Choices that were never picked belong to no team, so nothing below would reach them.
82
+ const looseIds = choices.map(c => c.player_id);
83
+ if (looseIds.length > 0) {
84
+ await models_1.PlayerTeamModel.destroy({ where: { player_id: looseIds }, transaction });
85
+ await models_1.PlayerModel.destroy({ where: { player_id: looseIds }, transaction });
86
+ }
87
+ }
88
+ // Squads and event lineups go before the teams so no FK from a preset can block the team delete.
89
+ await models_1.EventSquadModel.destroy({ where: { event_id: eventId }, transaction });
90
+ await models_1.LineupPresetModel.destroy({ where: { event_id: eventId }, transaction });
91
+ if (botTeamIds.length > 0) {
92
+ const botPlayers = await models_1.PlayerTeamModel.findAll({
93
+ where: { team_id: botTeamIds },
94
+ attributes: ['player_id'],
95
+ transaction
96
+ });
97
+ const botPlayerIds = botPlayers.map(p => p.player_id);
98
+ await models_1.EventBotTeamModel.destroy({ where: { event_id: eventId }, transaction });
99
+ await models_1.PlayerTeamModel.destroy({ where: { team_id: botTeamIds }, transaction });
100
+ if (botPlayerIds.length > 0) {
101
+ await models_1.PlayerModel.destroy({ where: { player_id: botPlayerIds }, transaction });
102
+ }
103
+ await sequelize.query('DELETE FROM "Tactics" WHERE team_id IN (:ids)', {
104
+ replacements: { ids: botTeamIds }, type: sequelize_1.QueryTypes.DELETE, transaction
105
+ });
106
+ await models_1.TeamModel.destroy({ where: { team_id: botTeamIds }, transaction });
107
+ }
108
+ if (removeEvent) {
109
+ await models_1.EventModel.destroy({ where: { event_id: eventId }, transaction });
110
+ }
111
+ else {
112
+ await models_1.EventModel.update({ status: 'ARCHIVED', purged_at: new Date() }, { where: { event_id: eventId }, transaction });
113
+ }
114
+ });
115
+ logger_1.default.info(`${removeEvent ? 'Deleted' : 'Purged'} event ${eventId}`);
116
+ }
@@ -1,4 +1,5 @@
1
1
  export * from './models';
2
2
  export * from './transformers';
3
3
  export * from './common';
4
+ export * from './event-purge';
4
5
  export { initModels } from './init-models';
@@ -18,5 +18,6 @@ exports.initModels = void 0;
18
18
  __exportStar(require("./models"), exports);
19
19
  __exportStar(require("./transformers"), exports);
20
20
  __exportStar(require("./common"), exports);
21
+ __exportStar(require("./event-purge"), exports);
21
22
  var init_models_1 = require("./init-models");
22
23
  Object.defineProperty(exports, "initModels", { enumerable: true, get: function () { return init_models_1.initModels; } });
@@ -11,6 +11,13 @@ function initModels(sequelize) {
11
11
  const Tactics = models_1.TacticsModel.initModel(sequelize);
12
12
  const LineupPreset = models_1.LineupPresetModel.initModel(sequelize);
13
13
  const MatchPreset = models_1.MatchPresetModel.initModel(sequelize);
14
+ const Event = models_1.EventModel.initModel(sequelize);
15
+ const EventCompetition = models_1.EventCompetitionModel.initModel(sequelize);
16
+ const EventSquad = models_1.EventSquadModel.initModel(sequelize);
17
+ const EventPack = models_1.EventPackModel.initModel(sequelize);
18
+ const EventPackPlayer = models_1.EventPackPlayerModel.initModel(sequelize);
19
+ const EventResult = models_1.EventResultModel.initModel(sequelize);
20
+ const EventBotTeam = models_1.EventBotTeamModel.initModel(sequelize);
14
21
  const AuthUser = models_1.AuthUserModel.initModel(sequelize);
15
22
  const UserCurrency = models_1.UserCurrencyModel.initModel(sequelize);
16
23
  const UserPlayerProgress = models_1.UserPlayerProgressModel.initModel(sequelize);
@@ -229,6 +236,33 @@ function initModels(sequelize) {
229
236
  MatchPreset.belongsTo(Team, { as: 'team', foreignKey: 'team_id' });
230
237
  MatchPreset.belongsTo(LineupPreset, { as: 'preset', foreignKey: 'preset_id' });
231
238
  LineupPreset.hasMany(MatchPreset, { as: 'MatchPresets', foreignKey: 'preset_id' });
239
+ // In-game events. An event owns one Competition per group plus one for the final, the entries that registered
240
+ // for it, the event-scoped lineup presets those entries point at, and the filler bots generated for it.
241
+ // Nothing here is in a default scope: only the event endpoints and the event scheduler load these.
242
+ Event.hasMany(EventCompetition, { as: 'EventCompetitions', foreignKey: 'event_id' });
243
+ EventCompetition.belongsTo(Event, { as: 'Event', foreignKey: 'event_id' });
244
+ EventCompetition.belongsTo(Competition, { as: 'Competition', foreignKey: 'competition_id' });
245
+ Competition.hasOne(EventCompetition, { as: 'EventCompetition', foreignKey: 'competition_id' });
246
+ // The drafted squad an entrant plays with, the packs they opened to build it, and where they finished.
247
+ Event.hasMany(EventSquad, { as: 'EventSquads', foreignKey: 'event_id' });
248
+ EventSquad.belongsTo(Event, { as: 'Event', foreignKey: 'event_id' });
249
+ EventSquad.belongsTo(Team, { as: 'team', foreignKey: 'team_id' });
250
+ Event.hasMany(EventPack, { as: 'EventPacks', foreignKey: 'event_id' });
251
+ EventPack.belongsTo(Event, { as: 'Event', foreignKey: 'event_id' });
252
+ EventPack.belongsTo(Player, { as: 'picked', foreignKey: 'picked_player_id' });
253
+ EventPack.hasMany(EventPackPlayer, { as: 'choices', foreignKey: 'pack_id' });
254
+ EventPackPlayer.belongsTo(EventPack, { as: 'pack', foreignKey: 'pack_id' });
255
+ EventPackPlayer.belongsTo(Player, { as: 'player', foreignKey: 'player_id' });
256
+ // Keyed to the entrant's REAL team, and the only event row besides Event that outlives the purge.
257
+ Event.hasMany(EventResult, { as: 'EventResults', foreignKey: 'event_id' });
258
+ EventResult.belongsTo(Event, { as: 'Event', foreignKey: 'event_id' });
259
+ EventResult.belongsTo(Team, { as: 'team', foreignKey: 'team_id' });
260
+ Team.hasMany(EventResult, { as: 'EventResults', foreignKey: 'team_id' });
261
+ LineupPreset.belongsTo(Event, { as: 'Event', foreignKey: 'event_id' });
262
+ Event.hasMany(EventBotTeam, { as: 'EventBotTeams', foreignKey: 'event_id' });
263
+ EventBotTeam.belongsTo(Event, { as: 'Event', foreignKey: 'event_id' });
264
+ EventBotTeam.belongsTo(Team, { as: 'team', foreignKey: 'team_id' });
265
+ Team.hasOne(EventBotTeam, { as: 'EventBotTeam', foreignKey: 'team_id' });
232
266
  Team.belongsTo(Country, { as: 'country', foreignKey: 'country_id' });
233
267
  Team.belongsToMany(Competition, {
234
268
  as: 'Competitions',
@@ -304,6 +338,13 @@ function initModels(sequelize) {
304
338
  Tactics,
305
339
  LineupPreset,
306
340
  MatchPreset,
341
+ Event,
342
+ EventCompetition,
343
+ EventSquad,
344
+ EventPack,
345
+ EventPackPlayer,
346
+ EventResult,
347
+ EventBotTeam,
307
348
  UserTeam,
308
349
  UserCurrency,
309
350
  UserPlayerProgress,
@@ -19,7 +19,7 @@ export interface CompetitionAttributes {
19
19
  LowerPromotionMatches?: PromotionMatchAttributes[];
20
20
  }
21
21
  export type CompetitionPk = 'competition_id';
22
- export type CompetitionType = 'LEAGUE' | 'TOURNAMENT' | 'QUALIFIER' | 'NATIONAL';
22
+ export type CompetitionType = 'LEAGUE' | 'TOURNAMENT' | 'QUALIFIER' | 'NATIONAL' | 'EVENT';
23
23
  export type CompetitionId = CompetitionModel[CompetitionPk];
24
24
  export type CompetitionCreationAttributes = CompetitionAttributes;
25
25
  export declare class CompetitionModel extends Model<CompetitionAttributes, CompetitionCreationAttributes> implements CompetitionAttributes {
@@ -21,7 +21,7 @@ class CompetitionModel extends sequelize_1.Model {
21
21
  }
22
22
  },
23
23
  type: {
24
- type: sequelize_1.DataTypes.ENUM('LEAGUE', 'TOURNAMENT', 'QUALIFIER', 'NATIONAL'),
24
+ type: sequelize_1.DataTypes.ENUM('LEAGUE', 'TOURNAMENT', 'QUALIFIER', 'NATIONAL', 'EVENT'),
25
25
  allowNull: false
26
26
  },
27
27
  status: {
@@ -0,0 +1,21 @@
1
+ import * as Sequelize from 'sequelize';
2
+ import { Model } from 'sequelize';
3
+ import { EventId, EventModel, TeamId, TeamModel } from '.';
4
+ export interface EventBotTeamAttributes {
5
+ team_id: string;
6
+ event_id: string;
7
+ }
8
+ export type EventBotTeamPk = 'team_id';
9
+ export type EventBotTeamId = EventBotTeamModel[EventBotTeamPk];
10
+ export type EventBotTeamCreationAttributes = EventBotTeamAttributes;
11
+ export declare class EventBotTeamModel extends Model<EventBotTeamAttributes, EventBotTeamCreationAttributes> implements EventBotTeamAttributes {
12
+ team_id: string;
13
+ event_id: string;
14
+ team: TeamModel;
15
+ getTeam: Sequelize.BelongsToGetAssociationMixin<TeamModel>;
16
+ setTeam: Sequelize.BelongsToSetAssociationMixin<TeamModel, TeamId>;
17
+ Event: EventModel;
18
+ getEvent: Sequelize.BelongsToGetAssociationMixin<EventModel>;
19
+ setEvent: Sequelize.BelongsToSetAssociationMixin<EventModel, EventId>;
20
+ static initModel(sequelize: Sequelize.Sequelize): typeof EventBotTeamModel;
21
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventBotTeamModel = void 0;
4
+ const sequelize_1 = require("sequelize");
5
+ class EventBotTeamModel extends sequelize_1.Model {
6
+ static initModel(sequelize) {
7
+ return EventBotTeamModel.init({
8
+ team_id: {
9
+ type: sequelize_1.DataTypes.UUID,
10
+ allowNull: false,
11
+ primaryKey: true,
12
+ references: {
13
+ model: 'Team',
14
+ key: 'team_id'
15
+ }
16
+ },
17
+ event_id: {
18
+ type: sequelize_1.DataTypes.UUID,
19
+ allowNull: false,
20
+ references: {
21
+ model: 'Event',
22
+ key: 'event_id'
23
+ }
24
+ }
25
+ }, {
26
+ sequelize,
27
+ tableName: 'EventBotTeam',
28
+ schema: 'public',
29
+ timestamps: false,
30
+ indexes: [
31
+ {
32
+ name: 'EventBotTeam_pk',
33
+ unique: true,
34
+ fields: [{ name: 'team_id' }]
35
+ },
36
+ {
37
+ name: 'EventBotTeam_event_id_idx',
38
+ fields: [{ name: 'event_id' }]
39
+ }
40
+ ]
41
+ });
42
+ }
43
+ }
44
+ exports.EventBotTeamModel = EventBotTeamModel;
@@ -0,0 +1,29 @@
1
+ import * as Sequelize from 'sequelize';
2
+ import { Model } from 'sequelize';
3
+ import { CompetitionAttributes, CompetitionId, CompetitionModel, EventId, EventModel } from '.';
4
+ /** A group table, or the single Sunday final. */
5
+ export type EventCompetitionStage = 'GROUP' | 'FINAL';
6
+ export interface EventCompetitionAttributes {
7
+ competition_id: string;
8
+ event_id: string;
9
+ stage: EventCompetitionStage;
10
+ /** 0-based group number for a GROUP row; null for the FINAL. */
11
+ group_index: number | null;
12
+ Competition?: CompetitionAttributes;
13
+ }
14
+ export type EventCompetitionPk = 'competition_id';
15
+ export type EventCompetitionId = EventCompetitionModel[EventCompetitionPk];
16
+ export type EventCompetitionCreationAttributes = EventCompetitionAttributes;
17
+ export declare class EventCompetitionModel extends Model<EventCompetitionAttributes, EventCompetitionCreationAttributes> implements EventCompetitionAttributes {
18
+ competition_id: string;
19
+ event_id: string;
20
+ stage: EventCompetitionStage;
21
+ group_index: number | null;
22
+ Competition: CompetitionModel;
23
+ getCompetition: Sequelize.BelongsToGetAssociationMixin<CompetitionModel>;
24
+ setCompetition: Sequelize.BelongsToSetAssociationMixin<CompetitionModel, CompetitionId>;
25
+ Event: EventModel;
26
+ getEvent: Sequelize.BelongsToGetAssociationMixin<EventModel>;
27
+ setEvent: Sequelize.BelongsToSetAssociationMixin<EventModel, EventId>;
28
+ static initModel(sequelize: Sequelize.Sequelize): typeof EventCompetitionModel;
29
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventCompetitionModel = void 0;
4
+ const sequelize_1 = require("sequelize");
5
+ class EventCompetitionModel extends sequelize_1.Model {
6
+ static initModel(sequelize) {
7
+ return EventCompetitionModel.init({
8
+ competition_id: {
9
+ type: sequelize_1.DataTypes.UUID,
10
+ allowNull: false,
11
+ primaryKey: true,
12
+ references: {
13
+ model: 'Competition',
14
+ key: 'competition_id'
15
+ }
16
+ },
17
+ event_id: {
18
+ type: sequelize_1.DataTypes.UUID,
19
+ allowNull: false,
20
+ references: {
21
+ model: 'Event',
22
+ key: 'event_id'
23
+ }
24
+ },
25
+ stage: {
26
+ type: sequelize_1.DataTypes.TEXT,
27
+ allowNull: false
28
+ },
29
+ group_index: {
30
+ type: sequelize_1.DataTypes.INTEGER,
31
+ allowNull: true
32
+ }
33
+ }, {
34
+ sequelize,
35
+ tableName: 'EventCompetition',
36
+ schema: 'public',
37
+ timestamps: false,
38
+ indexes: [
39
+ {
40
+ name: 'EventCompetition_pk',
41
+ unique: true,
42
+ fields: [{ name: 'competition_id' }]
43
+ },
44
+ {
45
+ name: 'EventCompetition_event_id_idx',
46
+ fields: [{ name: 'event_id' }]
47
+ }
48
+ ]
49
+ });
50
+ }
51
+ }
52
+ exports.EventCompetitionModel = EventCompetitionModel;
@@ -0,0 +1,22 @@
1
+ import * as Sequelize from 'sequelize';
2
+ import { Model } from 'sequelize';
3
+ import { EventPackId, EventPackModel, PlayerAttributes, PlayerId, PlayerModel } from '.';
4
+ export interface EventPackPlayerAttributes {
5
+ pack_id: string;
6
+ player_id: string;
7
+ player?: PlayerAttributes;
8
+ }
9
+ export type EventPackPlayerPk = 'pack_id' | 'player_id';
10
+ export type EventPackPlayerId = EventPackPlayerModel[EventPackPlayerPk];
11
+ export type EventPackPlayerCreationAttributes = EventPackPlayerAttributes;
12
+ export declare class EventPackPlayerModel extends Model<EventPackPlayerAttributes, EventPackPlayerCreationAttributes> implements EventPackPlayerAttributes {
13
+ pack_id: string;
14
+ player_id: string;
15
+ pack: EventPackModel;
16
+ getPack: Sequelize.BelongsToGetAssociationMixin<EventPackModel>;
17
+ setPack: Sequelize.BelongsToSetAssociationMixin<EventPackModel, EventPackId>;
18
+ player: PlayerModel;
19
+ getPlayer: Sequelize.BelongsToGetAssociationMixin<PlayerModel>;
20
+ setPlayer: Sequelize.BelongsToSetAssociationMixin<PlayerModel, PlayerId>;
21
+ static initModel(sequelize: Sequelize.Sequelize): typeof EventPackPlayerModel;
22
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventPackPlayerModel = void 0;
4
+ const sequelize_1 = require("sequelize");
5
+ class EventPackPlayerModel extends sequelize_1.Model {
6
+ static initModel(sequelize) {
7
+ return EventPackPlayerModel.init({
8
+ pack_id: {
9
+ type: sequelize_1.DataTypes.UUID,
10
+ allowNull: false,
11
+ primaryKey: true,
12
+ references: { model: 'EventPack', key: 'pack_id' }
13
+ },
14
+ player_id: {
15
+ type: sequelize_1.DataTypes.UUID,
16
+ allowNull: false,
17
+ primaryKey: true,
18
+ references: { model: 'Player', key: 'player_id' }
19
+ }
20
+ }, {
21
+ sequelize,
22
+ tableName: 'EventPackPlayer',
23
+ schema: 'public',
24
+ timestamps: false,
25
+ indexes: [
26
+ { name: 'EventPackPlayer_pk', unique: true, fields: [{ name: 'pack_id' }, { name: 'player_id' }] }
27
+ ]
28
+ });
29
+ }
30
+ }
31
+ exports.EventPackPlayerModel = EventPackPlayerModel;
@@ -0,0 +1,37 @@
1
+ import * as Sequelize from 'sequelize';
2
+ import { Model, Optional } from 'sequelize';
3
+ import { EventId, EventModel, EventPackPlayerModel, PlayerId, PlayerModel } from '.';
4
+ export interface EventPackAttributes {
5
+ pack_id: string;
6
+ event_id: string;
7
+ user_id: string;
8
+ /** Position in DRAFT_PLAN, so the pack's role and the draft's progress are both derivable. */
9
+ index: number;
10
+ /** The role this pack offers. A free pack stores the role it actually rolled, not 'ANY'. */
11
+ role: string;
12
+ opened_at: Date;
13
+ /** Null until the entrant picks; set once, and the three unpicked players are deleted at that moment. */
14
+ picked_player_id: string | null;
15
+ }
16
+ export type EventPackPk = 'pack_id';
17
+ export type EventPackId = EventPackModel[EventPackPk];
18
+ export type EventPackOptionalAttributes = 'pack_id' | 'opened_at' | 'picked_player_id';
19
+ export type EventPackCreationAttributes = Optional<EventPackAttributes, EventPackOptionalAttributes>;
20
+ export declare class EventPackModel extends Model<EventPackAttributes, EventPackCreationAttributes> implements EventPackAttributes {
21
+ pack_id: string;
22
+ event_id: string;
23
+ user_id: string;
24
+ index: number;
25
+ role: string;
26
+ opened_at: Date;
27
+ picked_player_id: string | null;
28
+ Event: EventModel;
29
+ getEvent: Sequelize.BelongsToGetAssociationMixin<EventModel>;
30
+ setEvent: Sequelize.BelongsToSetAssociationMixin<EventModel, EventId>;
31
+ choices: EventPackPlayerModel[];
32
+ getChoices: Sequelize.HasManyGetAssociationsMixin<EventPackPlayerModel>;
33
+ picked: PlayerModel;
34
+ getPicked: Sequelize.BelongsToGetAssociationMixin<PlayerModel>;
35
+ setPicked: Sequelize.BelongsToSetAssociationMixin<PlayerModel, PlayerId>;
36
+ static initModel(sequelize: Sequelize.Sequelize): typeof EventPackModel;
37
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventPackModel = void 0;
4
+ const sequelize_1 = require("sequelize");
5
+ class EventPackModel extends sequelize_1.Model {
6
+ static initModel(sequelize) {
7
+ return EventPackModel.init({
8
+ pack_id: {
9
+ type: sequelize_1.DataTypes.UUID,
10
+ allowNull: false,
11
+ primaryKey: true,
12
+ defaultValue: sequelize_1.DataTypes.UUIDV4
13
+ },
14
+ event_id: {
15
+ type: sequelize_1.DataTypes.UUID,
16
+ allowNull: false,
17
+ references: { model: 'Event', key: 'event_id' }
18
+ },
19
+ user_id: {
20
+ type: sequelize_1.DataTypes.UUID,
21
+ allowNull: false,
22
+ references: { model: 'AuthUser', key: 'user_id' }
23
+ },
24
+ index: {
25
+ type: sequelize_1.DataTypes.INTEGER,
26
+ allowNull: false
27
+ },
28
+ role: {
29
+ type: sequelize_1.DataTypes.TEXT,
30
+ allowNull: false
31
+ },
32
+ opened_at: {
33
+ type: sequelize_1.DataTypes.DATE,
34
+ allowNull: false,
35
+ defaultValue: sequelize_1.DataTypes.NOW
36
+ },
37
+ picked_player_id: {
38
+ type: sequelize_1.DataTypes.UUID,
39
+ allowNull: true,
40
+ references: { model: 'Player', key: 'player_id' }
41
+ }
42
+ }, {
43
+ sequelize,
44
+ tableName: 'EventPack',
45
+ schema: 'public',
46
+ timestamps: false,
47
+ indexes: [
48
+ { name: 'EventPack_pk', unique: true, fields: [{ name: 'pack_id' }] },
49
+ // One pack per position per entrant: reopening returns the stored pack instead of generating a new one.
50
+ { name: 'EventPack_one_per_index', unique: true, fields: [{ name: 'event_id' }, { name: 'user_id' }, { name: 'index' }] }
51
+ ]
52
+ });
53
+ }
54
+ }
55
+ exports.EventPackModel = EventPackModel;