@ttt-productions/q-core 0.1.0 → 0.1.2

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 (178) hide show
  1. package/dist/constants/business.d.ts +12 -0
  2. package/dist/constants/business.d.ts.map +1 -1
  3. package/dist/constants/business.js +24 -0
  4. package/dist/constants/business.js.map +1 -1
  5. package/dist/constants/media.d.ts +1 -0
  6. package/dist/constants/media.d.ts.map +1 -1
  7. package/dist/constants/media.js +5 -0
  8. package/dist/constants/media.js.map +1 -1
  9. package/dist/constants/sports.js.map +1 -1
  10. package/dist/constants/storage-keys.js.map +1 -1
  11. package/dist/doc-schemas/admin-notifications.d.ts +1 -0
  12. package/dist/doc-schemas/admin-notifications.d.ts.map +1 -1
  13. package/dist/doc-schemas/admin-notifications.js +4 -0
  14. package/dist/doc-schemas/admin-notifications.js.map +1 -1
  15. package/dist/doc-schemas/atoms.d.ts +2 -0
  16. package/dist/doc-schemas/atoms.d.ts.map +1 -1
  17. package/dist/doc-schemas/audit-event.d.ts +2 -0
  18. package/dist/doc-schemas/audit-event.d.ts.map +1 -1
  19. package/dist/doc-schemas/catalogs.js.map +1 -1
  20. package/dist/doc-schemas/gallery.d.ts +1 -0
  21. package/dist/doc-schemas/gallery.d.ts.map +1 -1
  22. package/dist/doc-schemas/gallery.js +3 -0
  23. package/dist/doc-schemas/gallery.js.map +1 -1
  24. package/dist/doc-schemas/game-location.js.map +1 -1
  25. package/dist/doc-schemas/game-stats.js.map +1 -1
  26. package/dist/doc-schemas/league-team.js.map +1 -1
  27. package/dist/doc-schemas/migration-console.d.ts +2 -0
  28. package/dist/doc-schemas/migration-console.d.ts.map +1 -1
  29. package/dist/doc-schemas/migration-console.js +5 -0
  30. package/dist/doc-schemas/migration-console.js.map +1 -1
  31. package/dist/doc-schemas/pending-media.d.ts +1 -0
  32. package/dist/doc-schemas/pending-media.d.ts.map +1 -1
  33. package/dist/doc-schemas/pending-media.js +8 -0
  34. package/dist/doc-schemas/pending-media.js.map +1 -1
  35. package/dist/doc-schemas/registry.d.ts +12 -0
  36. package/dist/doc-schemas/registry.d.ts.map +1 -1
  37. package/dist/doc-schemas/registry.js.map +1 -1
  38. package/dist/doc-schemas/sport-game.js.map +1 -1
  39. package/dist/doc-schemas/stats-operation.d.ts.map +1 -1
  40. package/dist/doc-schemas/stats-operation.js +6 -11
  41. package/dist/doc-schemas/stats-operation.js.map +1 -1
  42. package/dist/doc-schemas/system.d.ts +7 -0
  43. package/dist/doc-schemas/system.d.ts.map +1 -1
  44. package/dist/doc-schemas/system.js +4 -1
  45. package/dist/doc-schemas/system.js.map +1 -1
  46. package/dist/doc-schemas/user-profile.d.ts +1 -0
  47. package/dist/doc-schemas/user-profile.d.ts.map +1 -1
  48. package/dist/doc-schemas/user-profile.js +5 -0
  49. package/dist/doc-schemas/user-profile.js.map +1 -1
  50. package/dist/doc-schemas/waiver-template.d.ts +1 -0
  51. package/dist/doc-schemas/waiver-template.d.ts.map +1 -1
  52. package/dist/doc-schemas/waiver-template.js +10 -1
  53. package/dist/doc-schemas/waiver-template.js.map +1 -1
  54. package/dist/doc-schemas/waivers-and-hardware.d.ts +1 -0
  55. package/dist/doc-schemas/waivers-and-hardware.d.ts.map +1 -1
  56. package/dist/doc-schemas/waivers-and-hardware.js +17 -9
  57. package/dist/doc-schemas/waivers-and-hardware.js.map +1 -1
  58. package/dist/ids/index.js.map +1 -1
  59. package/dist/ids/minted-ids.d.ts +1 -0
  60. package/dist/ids/minted-ids.d.ts.map +1 -1
  61. package/dist/ids/minted-ids.js +6 -0
  62. package/dist/ids/minted-ids.js.map +1 -1
  63. package/dist/ids/stats-operation-ids.js.map +1 -1
  64. package/dist/index.js.map +1 -1
  65. package/dist/input-formats/index.d.ts +2 -2
  66. package/dist/input-formats/index.d.ts.map +1 -1
  67. package/dist/input-formats/index.js +2 -2
  68. package/dist/input-formats/index.js.map +1 -1
  69. package/dist/media/file-origins.js.map +1 -1
  70. package/dist/notifications/archive-all.d.ts +2 -0
  71. package/dist/notifications/archive-all.d.ts.map +1 -0
  72. package/dist/notifications/archive-all.js +6 -0
  73. package/dist/notifications/archive-all.js.map +1 -0
  74. package/dist/notifications/index.d.ts +1 -0
  75. package/dist/notifications/index.d.ts.map +1 -1
  76. package/dist/notifications/index.js +1 -0
  77. package/dist/notifications/index.js.map +1 -1
  78. package/dist/paths/collection-refs.js.map +1 -1
  79. package/dist/paths/collections.js.map +1 -1
  80. package/dist/paths/path-builders.js.map +1 -1
  81. package/dist/paths/utils.js.map +1 -1
  82. package/dist/schemas/account-settings.js.map +1 -1
  83. package/dist/schemas/admin-notifications.d.ts +1 -0
  84. package/dist/schemas/admin-notifications.d.ts.map +1 -1
  85. package/dist/schemas/admin-notifications.js +4 -2
  86. package/dist/schemas/admin-notifications.js.map +1 -1
  87. package/dist/schemas/app-config.d.ts +2 -2
  88. package/dist/schemas/app-config.d.ts.map +1 -1
  89. package/dist/schemas/app-config.js +9 -5
  90. package/dist/schemas/app-config.js.map +1 -1
  91. package/dist/schemas/atoms.js.map +1 -1
  92. package/dist/schemas/awards.d.ts +16 -4
  93. package/dist/schemas/awards.d.ts.map +1 -1
  94. package/dist/schemas/awards.js +10 -6
  95. package/dist/schemas/awards.js.map +1 -1
  96. package/dist/schemas/game-locations.d.ts +4 -4
  97. package/dist/schemas/game-locations.d.ts.map +1 -1
  98. package/dist/schemas/game-locations.js +11 -3
  99. package/dist/schemas/game-locations.js.map +1 -1
  100. package/dist/schemas/hardware-loan-contracts.js.map +1 -1
  101. package/dist/schemas/migration-console.d.ts +1 -0
  102. package/dist/schemas/migration-console.d.ts.map +1 -1
  103. package/dist/schemas/pictures.d.ts +3 -0
  104. package/dist/schemas/pictures.d.ts.map +1 -1
  105. package/dist/schemas/schedules.js.map +1 -1
  106. package/dist/schemas/scoring.js.map +1 -1
  107. package/dist/schemas/stats.d.ts +2 -0
  108. package/dist/schemas/stats.d.ts.map +1 -1
  109. package/dist/schemas/stats.js.map +1 -1
  110. package/dist/schemas/team-joining.js.map +1 -1
  111. package/dist/schemas/teams.d.ts +3 -2
  112. package/dist/schemas/teams.d.ts.map +1 -1
  113. package/dist/schemas/teams.js +19 -9
  114. package/dist/schemas/teams.js.map +1 -1
  115. package/dist/schemas/uploads.js.map +1 -1
  116. package/dist/schemas/users.d.ts +7 -3
  117. package/dist/schemas/users.d.ts.map +1 -1
  118. package/dist/schemas/users.js +10 -3
  119. package/dist/schemas/users.js.map +1 -1
  120. package/dist/schemas/waiver-templates.d.ts +1 -0
  121. package/dist/schemas/waiver-templates.d.ts.map +1 -1
  122. package/dist/schemas/waiver-templates.js +4 -1
  123. package/dist/schemas/waiver-templates.js.map +1 -1
  124. package/dist/sports/basketball-scoring.js.map +1 -1
  125. package/dist/sports/basketball.js.map +1 -1
  126. package/dist/sports/bulk-entry.js.map +1 -1
  127. package/dist/sports/contribution.js.map +1 -1
  128. package/dist/sports/curling-scoring.js.map +1 -1
  129. package/dist/sports/finalized-record.js.map +1 -1
  130. package/dist/sports/football-scoring.js.map +1 -1
  131. package/dist/sports/index.d.ts +1 -0
  132. package/dist/sports/index.d.ts.map +1 -1
  133. package/dist/sports/index.js +1 -0
  134. package/dist/sports/index.js.map +1 -1
  135. package/dist/sports/ledger-continuity.d.ts +13 -0
  136. package/dist/sports/ledger-continuity.d.ts.map +1 -0
  137. package/dist/sports/ledger-continuity.js +19 -0
  138. package/dist/sports/ledger-continuity.js.map +1 -0
  139. package/dist/sports/rankings.js.map +1 -1
  140. package/dist/sports/rollup-check.js.map +1 -1
  141. package/dist/sports/scoring.js.map +1 -1
  142. package/dist/sports/store-driver.js.map +1 -1
  143. package/dist/types/audit.d.ts +1 -1
  144. package/dist/types/audit.d.ts.map +1 -1
  145. package/dist/types/audit.js +5 -2
  146. package/dist/types/audit.js.map +1 -1
  147. package/dist/types/documents.js.map +1 -1
  148. package/dist/types/notifications.js.map +1 -1
  149. package/dist/types/picture-owners.js.map +1 -1
  150. package/dist/types/sports.js.map +1 -1
  151. package/dist/types/stats.js.map +1 -1
  152. package/dist/types/unions.d.ts +4 -2
  153. package/dist/types/unions.d.ts.map +1 -1
  154. package/dist/types/unions.js +6 -0
  155. package/dist/types/unions.js.map +1 -1
  156. package/dist/upload-variables/index.d.ts +3 -0
  157. package/dist/upload-variables/index.d.ts.map +1 -0
  158. package/dist/upload-variables/index.js +3 -0
  159. package/dist/upload-variables/index.js.map +1 -0
  160. package/dist/upload-variables/on-progress.d.ts +4 -0
  161. package/dist/upload-variables/on-progress.d.ts.map +1 -0
  162. package/dist/upload-variables/on-progress.js +10 -0
  163. package/dist/upload-variables/on-progress.js.map +1 -0
  164. package/dist/upload-variables/picture-upload-variables.d.ts +32 -0
  165. package/dist/upload-variables/picture-upload-variables.d.ts.map +1 -0
  166. package/dist/upload-variables/picture-upload-variables.js +21 -0
  167. package/dist/upload-variables/picture-upload-variables.js.map +1 -0
  168. package/dist/utils/account-status.js.map +1 -1
  169. package/dist/utils/app-config.d.ts +17 -3
  170. package/dist/utils/app-config.d.ts.map +1 -1
  171. package/dist/utils/app-config.js +21 -14
  172. package/dist/utils/app-config.js.map +1 -1
  173. package/dist/utils/app-routes.js.map +1 -1
  174. package/dist/utils/index.js.map +1 -1
  175. package/dist/utils/league-calendar.js.map +1 -1
  176. package/dist/utils/league-mode.js.map +1 -1
  177. package/dist/utils/team-member-actions.js.map +1 -1
  178. package/package.json +94 -90
@@ -1 +1 @@
1
- {"version":3,"file":"hardware-loan-contracts.js","sourceRoot":"","sources":["../../src/schemas/hardware-loan-contracts.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,mGAAmG;AACnG,oEAAoE;AAEpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;AAE7E,sFAAsF;AACtF,MAAM,CAAC,MAAM,0CAA0C,GAAG,CAAC;KACxD,MAAM,CAAC;IACN,aAAa,EAAE,YAAY;IAC3B,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC;CAC1F,CAAC;KACD,MAAM,EAAE;KACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE;IACvF,OAAO,EAAE,sBAAsB;IAC/B,IAAI,EAAE,CAAC,iBAAiB,CAAC;CAC1B,CAAC,CAAC;AAGL,MAAM,CAAC,MAAM,2CAA2C,GAAG,CAAC;KACzD,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,CAAC;KACpD,MAAM,EAAE,CAAC;AAGZ,qGAAqG;AACrG,uCAAuC;AACvC,MAAM,CAAC,MAAM,8CAA8C,GAAG,CAAC;KAC5D,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;KAC1F,MAAM,EAAE,CAAC;AAGZ,uGAAuG;AACvG,MAAM,CAAC,MAAM,+CAA+C,GAAG,CAAC;KAC7D,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;KACzG,MAAM,EAAE,CAAC;AAGZ,8EAA8E;AAC9E,MAAM,CAAC,MAAM,0CAA0C,GAAG,CAAC;KACxD,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,CAAC;KACpD,MAAM,EAAE,CAAC;AAGZ,kFAAkF;AAClF,MAAM,CAAC,MAAM,2CAA2C,GAAG,CAAC;KACzD,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;KACrG,MAAM,EAAE,CAAC;AAGZ,qGAAqG;AACrG,iBAAiB;AACjB,MAAM,CAAC,MAAM,0CAA0C,GAAG,CAAC;KACxD,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,CAAC;KACpD,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,2CAA2C,GAAG,CAAC;KACzD,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;KAC1E,MAAM,EAAE,CAAC;AAGZ,oGAAoG;AACpG,2DAA2D;AAC3D,MAAM,CAAC,MAAM,+CAA+C,GAAG,CAAC;KAC7D,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,CAAC;KACpD,MAAM,EAAE,CAAC","sourcesContent":["// Callable contracts for hardware loan contracts: an admin creates a loan for a referee, the referee\r\n// signs the agreement, an admin records the equipment returned or deletes a contract never signed,\r\n// and the signature is read back through a callable — never by URL.\r\n\r\nimport { z } from 'zod';\r\nimport { HARDWARE_CATALOG, HARDWARE_CATALOG_ITEM_IDS } from '../constants/business.js';\r\nimport { epochMsSchema, hardwareLoanContractIdSchema } from '../doc-schemas/atoms.js';\r\nimport { userIdSchema } from './atoms.js';\r\nimport { stagingUploadPathSchema } from './uploads.js';\r\n\r\nexport const hardwareCatalogItemIdSchema = z.enum(HARDWARE_CATALOG_ITEM_IDS);\r\n\r\n// The referee must be on the referee roster; each item is a catalog item, named once.\r\nexport const AdminCreateHardwareLoanContractInputSchema = z\r\n .object({\r\n refereeUserId: userIdSchema,\r\n hardwareItemIds: z.array(hardwareCatalogItemIdSchema).min(1).max(HARDWARE_CATALOG.length),\r\n })\r\n .strict()\r\n .refine((input) => new Set(input.hardwareItemIds).size === input.hardwareItemIds.length, {\r\n message: 'Name each item once.',\r\n path: ['hardwareItemIds'],\r\n });\r\nexport type AdminCreateHardwareLoanContractInput = z.infer<typeof AdminCreateHardwareLoanContractInputSchema>;\r\n\r\nexport const AdminCreateHardwareLoanContractResultSchema = z\r\n .object({ contractId: hardwareLoanContractIdSchema })\r\n .strict();\r\nexport type AdminCreateHardwareLoanContractResult = z.infer<typeof AdminCreateHardwareLoanContractResultSchema>;\r\n\r\n// The contract's referee signs it: the drawn PNG staged at their own staging path. The signer is the\r\n// caller — never named in the payload.\r\nexport const SubmitHardwareLoanContractSignatureInputSchema = z\r\n .object({ contractId: hardwareLoanContractIdSchema, storagePath: stagingUploadPathSchema })\r\n .strict();\r\nexport type SubmitHardwareLoanContractSignatureInput = z.infer<typeof SubmitHardwareLoanContractSignatureInputSchema>;\r\n\r\n// `alreadySigned` when this very signing was recorded before: a retry, answered without copying again.\r\nexport const SubmitHardwareLoanContractSignatureResultSchema = z\r\n .object({ contractId: hardwareLoanContractIdSchema, loanedAt: epochMsSchema, alreadySigned: z.boolean() })\r\n .strict();\r\nexport type SubmitHardwareLoanContractSignatureResult = z.infer<typeof SubmitHardwareLoanContractSignatureResultSchema>;\r\n\r\n// An admin records a loaned contract's equipment back. The signature is kept.\r\nexport const AdminReturnHardwareLoanContractInputSchema = z\r\n .object({ contractId: hardwareLoanContractIdSchema })\r\n .strict();\r\nexport type AdminReturnHardwareLoanContractInput = z.infer<typeof AdminReturnHardwareLoanContractInputSchema>;\r\n\r\n// `changed` is false when the contract was already returned: nothing was written.\r\nexport const AdminReturnHardwareLoanContractResultSchema = z\r\n .object({ contractId: hardwareLoanContractIdSchema, returnedAt: epochMsSchema, changed: z.boolean() })\r\n .strict();\r\nexport type AdminReturnHardwareLoanContractResult = z.infer<typeof AdminReturnHardwareLoanContractResultSchema>;\r\n\r\n// An admin deletes a contract the referee has not signed. A signed contract is a legal record and is\r\n// never deleted.\r\nexport const AdminDeleteHardwareLoanContractInputSchema = z\r\n .object({ contractId: hardwareLoanContractIdSchema })\r\n .strict();\r\nexport type AdminDeleteHardwareLoanContractInput = z.infer<typeof AdminDeleteHardwareLoanContractInputSchema>;\r\n\r\nexport const AdminDeleteHardwareLoanContractResultSchema = z\r\n .object({ contractId: hardwareLoanContractIdSchema, deleted: z.boolean() })\r\n .strict();\r\nexport type AdminDeleteHardwareLoanContractResult = z.infer<typeof AdminDeleteHardwareLoanContractResultSchema>;\r\n\r\n// A contract's signature, read by its referee (the member entry) or an admin (the admin entry). The\r\n// answer is `SignatureFileResultSchema`, as a waiver's is.\r\nexport const GetHardwareLoanContractSignatureFileInputSchema = z\r\n .object({ contractId: hardwareLoanContractIdSchema })\r\n .strict();\r\nexport type GetHardwareLoanContractSignatureFileInput = z.infer<typeof GetHardwareLoanContractSignatureFileInputSchema>;\r\n"]}
1
+ {"version":3,"file":"hardware-loan-contracts.js","sourceRoot":"","sources":["../../src/schemas/hardware-loan-contracts.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,mGAAmG;AACnG,oEAAoE;AAEpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;AAE7E,sFAAsF;AACtF,MAAM,CAAC,MAAM,0CAA0C,GAAG,CAAC;KACxD,MAAM,CAAC;IACN,aAAa,EAAE,YAAY;IAC3B,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC;CAC1F,CAAC;KACD,MAAM,EAAE;KACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE;IACvF,OAAO,EAAE,sBAAsB;IAC/B,IAAI,EAAE,CAAC,iBAAiB,CAAC;CAC1B,CAAC,CAAC;AAGL,MAAM,CAAC,MAAM,2CAA2C,GAAG,CAAC;KACzD,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,CAAC;KACpD,MAAM,EAAE,CAAC;AAGZ,qGAAqG;AACrG,uCAAuC;AACvC,MAAM,CAAC,MAAM,8CAA8C,GAAG,CAAC;KAC5D,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;KAC1F,MAAM,EAAE,CAAC;AAGZ,uGAAuG;AACvG,MAAM,CAAC,MAAM,+CAA+C,GAAG,CAAC;KAC7D,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;KACzG,MAAM,EAAE,CAAC;AAGZ,8EAA8E;AAC9E,MAAM,CAAC,MAAM,0CAA0C,GAAG,CAAC;KACxD,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,CAAC;KACpD,MAAM,EAAE,CAAC;AAGZ,kFAAkF;AAClF,MAAM,CAAC,MAAM,2CAA2C,GAAG,CAAC;KACzD,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;KACrG,MAAM,EAAE,CAAC;AAGZ,qGAAqG;AACrG,iBAAiB;AACjB,MAAM,CAAC,MAAM,0CAA0C,GAAG,CAAC;KACxD,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,CAAC;KACpD,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,2CAA2C,GAAG,CAAC;KACzD,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;KAC1E,MAAM,EAAE,CAAC;AAGZ,oGAAoG;AACpG,2DAA2D;AAC3D,MAAM,CAAC,MAAM,+CAA+C,GAAG,CAAC;KAC7D,MAAM,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,CAAC;KACpD,MAAM,EAAE,CAAC","sourcesContent":["// Callable contracts for hardware loan contracts: an admin creates a loan for a referee, the referee\n// signs the agreement, an admin records the equipment returned or deletes a contract never signed,\n// and the signature is read back through a callable — never by URL.\n\nimport { z } from 'zod';\nimport { HARDWARE_CATALOG, HARDWARE_CATALOG_ITEM_IDS } from '../constants/business.js';\nimport { epochMsSchema, hardwareLoanContractIdSchema } from '../doc-schemas/atoms.js';\nimport { userIdSchema } from './atoms.js';\nimport { stagingUploadPathSchema } from './uploads.js';\n\nexport const hardwareCatalogItemIdSchema = z.enum(HARDWARE_CATALOG_ITEM_IDS);\n\n// The referee must be on the referee roster; each item is a catalog item, named once.\nexport const AdminCreateHardwareLoanContractInputSchema = z\n .object({\n refereeUserId: userIdSchema,\n hardwareItemIds: z.array(hardwareCatalogItemIdSchema).min(1).max(HARDWARE_CATALOG.length),\n })\n .strict()\n .refine((input) => new Set(input.hardwareItemIds).size === input.hardwareItemIds.length, {\n message: 'Name each item once.',\n path: ['hardwareItemIds'],\n });\nexport type AdminCreateHardwareLoanContractInput = z.infer<typeof AdminCreateHardwareLoanContractInputSchema>;\n\nexport const AdminCreateHardwareLoanContractResultSchema = z\n .object({ contractId: hardwareLoanContractIdSchema })\n .strict();\nexport type AdminCreateHardwareLoanContractResult = z.infer<typeof AdminCreateHardwareLoanContractResultSchema>;\n\n// The contract's referee signs it: the drawn PNG staged at their own staging path. The signer is the\n// caller — never named in the payload.\nexport const SubmitHardwareLoanContractSignatureInputSchema = z\n .object({ contractId: hardwareLoanContractIdSchema, storagePath: stagingUploadPathSchema })\n .strict();\nexport type SubmitHardwareLoanContractSignatureInput = z.infer<typeof SubmitHardwareLoanContractSignatureInputSchema>;\n\n// `alreadySigned` when this very signing was recorded before: a retry, answered without copying again.\nexport const SubmitHardwareLoanContractSignatureResultSchema = z\n .object({ contractId: hardwareLoanContractIdSchema, loanedAt: epochMsSchema, alreadySigned: z.boolean() })\n .strict();\nexport type SubmitHardwareLoanContractSignatureResult = z.infer<typeof SubmitHardwareLoanContractSignatureResultSchema>;\n\n// An admin records a loaned contract's equipment back. The signature is kept.\nexport const AdminReturnHardwareLoanContractInputSchema = z\n .object({ contractId: hardwareLoanContractIdSchema })\n .strict();\nexport type AdminReturnHardwareLoanContractInput = z.infer<typeof AdminReturnHardwareLoanContractInputSchema>;\n\n// `changed` is false when the contract was already returned: nothing was written.\nexport const AdminReturnHardwareLoanContractResultSchema = z\n .object({ contractId: hardwareLoanContractIdSchema, returnedAt: epochMsSchema, changed: z.boolean() })\n .strict();\nexport type AdminReturnHardwareLoanContractResult = z.infer<typeof AdminReturnHardwareLoanContractResultSchema>;\n\n// An admin deletes a contract the referee has not signed. A signed contract is a legal record and is\n// never deleted.\nexport const AdminDeleteHardwareLoanContractInputSchema = z\n .object({ contractId: hardwareLoanContractIdSchema })\n .strict();\nexport type AdminDeleteHardwareLoanContractInput = z.infer<typeof AdminDeleteHardwareLoanContractInputSchema>;\n\nexport const AdminDeleteHardwareLoanContractResultSchema = z\n .object({ contractId: hardwareLoanContractIdSchema, deleted: z.boolean() })\n .strict();\nexport type AdminDeleteHardwareLoanContractResult = z.infer<typeof AdminDeleteHardwareLoanContractResultSchema>;\n\n// A contract's signature, read by its referee (the member entry) or an admin (the admin entry). The\n// answer is `SignatureFileResultSchema`, as a waiver's is.\nexport const GetHardwareLoanContractSignatureFileInputSchema = z\n .object({ contractId: hardwareLoanContractIdSchema })\n .strict();\nexport type GetHardwareLoanContractSignatureFileInput = z.infer<typeof GetHardwareLoanContractSignatureFileInputSchema>;\n"]}
@@ -594,6 +594,7 @@ export declare const GetMigrationConsoleResultSchema: z.ZodObject<{
594
594
  operationId: z.ZodString;
595
595
  heldByUserId: z.ZodString;
596
596
  expiresAt: z.ZodNumber;
597
+ pageClaimedAt: z.ZodOptional<z.ZodNumber>;
597
598
  }, z.core.$strict>>;
598
599
  updatedAt: z.ZodNumber;
599
600
  }, z.core.$strict>;
@@ -1 +1 @@
1
- {"version":3,"file":"migration-console.d.ts","sourceRoot":"","sources":["../../src/schemas/migration-console.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migration-console.d.ts","sourceRoot":"","sources":["../../src/schemas/migration-console.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ export declare const GalleryPictureEntrySchema: z.ZodObject<{
7
7
  }>;
8
8
  ownerId: z.ZodString;
9
9
  position: z.ZodString;
10
+ sourceIndex: z.ZodOptional<z.ZodNumber>;
10
11
  createdAt: z.ZodNumber;
11
12
  id: z.ZodString;
12
13
  }, z.core.$strict>;
@@ -25,6 +26,7 @@ export declare const AdminMovePictureResultSchema: z.ZodObject<{
25
26
  }>;
26
27
  ownerId: z.ZodString;
27
28
  position: z.ZodString;
29
+ sourceIndex: z.ZodOptional<z.ZodNumber>;
28
30
  createdAt: z.ZodNumber;
29
31
  id: z.ZodString;
30
32
  }, z.core.$strict>;
@@ -362,6 +364,7 @@ export declare const AdminUpdateFeaturedPictureResultSchema: z.ZodObject<{
362
364
  }>;
363
365
  ownerId: z.ZodString;
364
366
  position: z.ZodString;
367
+ sourceIndex: z.ZodOptional<z.ZodNumber>;
365
368
  createdAt: z.ZodNumber;
366
369
  id: z.ZodString;
367
370
  }, z.core.$strict>;
@@ -1 +1 @@
1
- {"version":3,"file":"pictures.d.ts","sourceRoot":"","sources":["../../src/schemas/pictures.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,yBAAyB;;;;;;;;;;kBAAgE,CAAC;AACvG,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,2BAA2B;;;kBAM7B,CAAC;AACZ,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAChF,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAE9B,CAAC;AACZ,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,eAAO,MAAM,qCAAqC;;kBAAoD,CAAC;AACvG,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qCAAqC,CAAC,CAAC;AACpG,eAAO,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAExC,CAAC;AACZ,MAAM,MAAM,gCAAgC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sCAAsC,CAAC,CAAC;AAEtG,eAAO,MAAM,6BAA6B;;;;;;;;;;;;kBAO/B,CAAC;AACZ,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAEhC,CAAC;AACZ,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC"}
1
+ {"version":3,"file":"pictures.d.ts","sourceRoot":"","sources":["../../src/schemas/pictures.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,yBAAyB;;;;;;;;;;;kBAAgE,CAAC;AACvG,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,2BAA2B;;;kBAM7B,CAAC;AACZ,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAChF,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAE9B,CAAC;AACZ,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,eAAO,MAAM,qCAAqC;;kBAAoD,CAAC;AACvG,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qCAAqC,CAAC,CAAC;AACpG,eAAO,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAExC,CAAC;AACZ,MAAM,MAAM,gCAAgC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sCAAsC,CAAC,CAAC;AAEtG,eAAO,MAAM,6BAA6B;;;;;;;;;;;;kBAO/B,CAAC;AACZ,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAEhC,CAAC;AACZ,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","sourceRoot":"","sources":["../../src/schemas/schedules.ts"],"names":[],"mappings":"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","sourcesContent":["// Callable contracts for a league's schedule: a week created with its games, a week's shared fields\r\n// edited, a week deleted with its games; one game added to a week, edited — moved, rescheduled, or\r\n// its teams replaced — or deleted. Every one is admin authority, and the acting admin is\r\n// `request.auth.uid`, never an input field (ARCH-106). Venue labels, calendar days, the sport, and\r\n// every stat field are derived by the server, never sent.\r\n\r\nimport { z } from 'zod';\r\nimport { MAX_SCHEDULE_WEEK_GAMES } from '../constants/business.js';\r\nimport { textFieldSchema } from '../doc-schemas/atoms.js';\r\nimport { SCHEDULE_WEEK_TITLE_INPUT_FORMAT } from '../input-formats/index.js';\r\nimport {\r\n countSchema,\r\n epochMsSchema,\r\n gameIdSchema,\r\n leagueIdSchema,\r\n scheduleWeekIdSchema,\r\n statsOperationIdSchema,\r\n teamIdSchema,\r\n} from '../doc-schemas/atoms.js';\r\nimport { gameLocationIdSchema } from '../doc-schemas/game-location.js';\r\nimport { isByeTeamId } from '../ids/minted-ids.js';\r\nimport { SCHEDULE_WEEK_FIELD_KEYS, SPORT_GAME_SCHEDULE_FIELD_KEYS } from '../types/schedules.js';\r\nimport { gameLocationSubLocationSchema } from './game-locations.js';\r\n\r\nexport const scheduleWeekTitleSchema = textFieldSchema(SCHEDULE_WEEK_TITLE_INPUT_FORMAT);\r\n\r\n// A game's two team slots, by position: team one, then team two. A slot names a team of the league\r\n// or BYE_TEAM_ID; a game has at least one real team, and never one team twice.\r\nexport const scheduleGameTeamsSchema = z\r\n .tuple([teamIdSchema, teamIdSchema])\r\n .refine(([first, second]) => !(isByeTeamId(first) && isByeTeamId(second)), 'A game needs at least one team.')\r\n .refine(([first, second]) => first !== second, 'A game needs two different teams.');\r\nexport type ScheduleGameTeams = z.infer<typeof scheduleGameTeamsSchema>;\r\n\r\n// Where and when one game is played. The venue is named by id, and the server writes the label the\r\n// schedule shows from the venue's own name and the chosen court.\r\nconst scheduleGameShape = {\r\n teams: scheduleGameTeamsSchema,\r\n startTime: epochMsSchema,\r\n gameLocationId: gameLocationIdSchema,\r\n subLocation: gameLocationSubLocationSchema.optional(),\r\n};\r\n\r\nexport const ScheduleGameInputSchema = z.object(scheduleGameShape).strict();\r\nexport type ScheduleGameInput = z.infer<typeof ScheduleGameInputSchema>;\r\n\r\nexport const sportGameScheduleFieldSchema = z.enum(SPORT_GAME_SCHEDULE_FIELD_KEYS);\r\nexport const scheduleWeekFieldSchema = z.enum(SCHEDULE_WEEK_FIELD_KEYS);\r\n\r\n// A new week and its games, saved together. `weekStartDate` is the week's first day as the admin's\r\n// form reads it; the week's venue is the default each game's form starts from, and its name is the\r\n// week's `weekLocation`.\r\nexport const AdminCreateScheduleWeekInputSchema = z\r\n .object({\r\n leagueId: leagueIdSchema,\r\n weekTitle: scheduleWeekTitleSchema,\r\n weekStartDate: epochMsSchema,\r\n weekGameLocationId: gameLocationIdSchema,\r\n games: z.array(ScheduleGameInputSchema).min(1).max(MAX_SCHEDULE_WEEK_GAMES),\r\n })\r\n .strict();\r\nexport type AdminCreateScheduleWeekInput = z.infer<typeof AdminCreateScheduleWeekInputSchema>;\r\nexport const AdminCreateScheduleWeekResultSchema = z\r\n .object({ leagueId: leagueIdSchema, weekId: scheduleWeekIdSchema, gameIds: z.array(gameIdSchema) })\r\n .strict();\r\nexport type AdminCreateScheduleWeekResult = z.infer<typeof AdminCreateScheduleWeekResultSchema>;\r\n\r\n// Only the week's shared fields the admin changed: a field left out keeps what each game holds, so\r\n// two admins editing different fields of one week never write each other's loaded values back\r\n// (BACKEND-116). The venue is named by id, and the week shows its name.\r\nexport const AdminUpdateScheduleWeekInputSchema = z\r\n .object({\r\n leagueId: leagueIdSchema,\r\n weekId: scheduleWeekIdSchema,\r\n weekTitle: scheduleWeekTitleSchema.optional(),\r\n weekStartDate: epochMsSchema.optional(),\r\n weekGameLocationId: gameLocationIdSchema.optional(),\r\n })\r\n .strict()\r\n .refine(\r\n (input) => input.weekTitle !== undefined || input.weekStartDate !== undefined || input.weekGameLocationId !== undefined,\r\n 'Name at least one field to change.',\r\n );\r\nexport type AdminUpdateScheduleWeekInput = z.infer<typeof AdminUpdateScheduleWeekInputSchema>;\r\nexport const AdminUpdateScheduleWeekResultSchema = z\r\n .object({\r\n leagueId: leagueIdSchema,\r\n weekId: scheduleWeekIdSchema,\r\n changedFields: z.array(scheduleWeekFieldSchema),\r\n gamesUpdated: countSchema,\r\n })\r\n .strict();\r\nexport type AdminUpdateScheduleWeekResult = z.infer<typeof AdminUpdateScheduleWeekResultSchema>;\r\n\r\n// A whole week and every game in it. A game with events takes more than one step to delete, so a\r\n// call that runs out of time answers `complete: false` with the games still standing, and running\r\n// it again continues. A week with no game left answers complete.\r\nexport const AdminDeleteScheduleWeekInputSchema = z\r\n .object({ leagueId: leagueIdSchema, weekId: scheduleWeekIdSchema })\r\n .strict();\r\nexport type AdminDeleteScheduleWeekInput = z.infer<typeof AdminDeleteScheduleWeekInputSchema>;\r\nexport const AdminDeleteScheduleWeekResultSchema = z\r\n .object({\r\n leagueId: leagueIdSchema,\r\n weekId: scheduleWeekIdSchema,\r\n deletedGameIds: z.array(gameIdSchema),\r\n remainingGameIds: z.array(gameIdSchema),\r\n complete: z.boolean(),\r\n })\r\n .strict();\r\nexport type AdminDeleteScheduleWeekResult = z.infer<typeof AdminDeleteScheduleWeekResultSchema>;\r\n\r\n// One game added to a saved week, which gives it the week's shared fields.\r\nexport const AdminCreateSportGameInputSchema = z\r\n .object({ leagueId: leagueIdSchema, weekId: scheduleWeekIdSchema, ...scheduleGameShape })\r\n .strict();\r\nexport type AdminCreateSportGameInput = z.infer<typeof AdminCreateSportGameInputSchema>;\r\nexport const AdminCreateSportGameResultSchema = z\r\n .object({ leagueId: leagueIdSchema, weekId: scheduleWeekIdSchema, gameId: gameIdSchema })\r\n .strict();\r\nexport type AdminCreateSportGameResult = z.infer<typeof AdminCreateSportGameResultSchema>;\r\n\r\n// One game's schedule, whole: its week (a reschedule into another saved week), its teams, its start\r\n// time, and its venue. `expectedUpdatedAt` is the game's `updatedAt` as the admin loaded it, so a\r\n// stale form never writes its old values over a newer change. A game that names no venue may keep\r\n// its stored label by naming none; a court is named only with its venue.\r\nexport const AdminUpdateSportGameInputSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n expectedUpdatedAt: epochMsSchema,\r\n weekId: scheduleWeekIdSchema,\r\n teams: scheduleGameTeamsSchema,\r\n startTime: epochMsSchema,\r\n gameLocationId: gameLocationIdSchema.optional(),\r\n subLocation: gameLocationSubLocationSchema.optional(),\r\n })\r\n .strict()\r\n .refine((input) => input.subLocation === undefined || input.gameLocationId !== undefined, {\r\n message: 'A court is chosen within a venue.',\r\n path: ['subLocation'],\r\n });\r\nexport type AdminUpdateSportGameInput = z.infer<typeof AdminUpdateSportGameInputSchema>;\r\nexport const AdminUpdateSportGameResultSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n changedFields: z.array(sportGameScheduleFieldSchema),\r\n updatedAt: epochMsSchema,\r\n })\r\n .strict();\r\nexport type AdminUpdateSportGameResult = z.infer<typeof AdminUpdateSportGameResultSchema>;\r\n\r\n// One game, with its events and roster. The server derives the deletion's operation id from the\r\n// game (`buildGameDeletionOperationId`), so a retry of a finished delete is acknowledged and a retry\r\n// of an interrupted one continues it; the caller names only the game.\r\nexport const AdminDeleteSportGameInputSchema = z.object({ gameId: gameIdSchema }).strict();\r\nexport type AdminDeleteSportGameInput = z.infer<typeof AdminDeleteSportGameInputSchema>;\r\nexport const AdminDeleteSportGameResultSchema = z\r\n .object({ gameId: gameIdSchema, operationId: statsOperationIdSchema, complete: z.boolean() })\r\n .strict();\r\nexport type AdminDeleteSportGameResult = z.infer<typeof AdminDeleteSportGameResultSchema>;\r\n"]}
1
+ {"version":3,"file":"schedules.js","sourceRoot":"","sources":["../../src/schemas/schedules.ts"],"names":[],"mappings":"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","sourcesContent":["// Callable contracts for a league's schedule: a week created with its games, a week's shared fields\n// edited, a week deleted with its games; one game added to a week, edited — moved, rescheduled, or\n// its teams replaced — or deleted. Every one is admin authority, and the acting admin is\n// `request.auth.uid`, never an input field (ARCH-106). Venue labels, calendar days, the sport, and\n// every stat field are derived by the server, never sent.\n\nimport { z } from 'zod';\nimport { MAX_SCHEDULE_WEEK_GAMES } from '../constants/business.js';\nimport { textFieldSchema } from '../doc-schemas/atoms.js';\nimport { SCHEDULE_WEEK_TITLE_INPUT_FORMAT } from '../input-formats/index.js';\nimport {\n countSchema,\n epochMsSchema,\n gameIdSchema,\n leagueIdSchema,\n scheduleWeekIdSchema,\n statsOperationIdSchema,\n teamIdSchema,\n} from '../doc-schemas/atoms.js';\nimport { gameLocationIdSchema } from '../doc-schemas/game-location.js';\nimport { isByeTeamId } from '../ids/minted-ids.js';\nimport { SCHEDULE_WEEK_FIELD_KEYS, SPORT_GAME_SCHEDULE_FIELD_KEYS } from '../types/schedules.js';\nimport { gameLocationSubLocationSchema } from './game-locations.js';\n\nexport const scheduleWeekTitleSchema = textFieldSchema(SCHEDULE_WEEK_TITLE_INPUT_FORMAT);\n\n// A game's two team slots, by position: team one, then team two. A slot names a team of the league\n// or BYE_TEAM_ID; a game has at least one real team, and never one team twice.\nexport const scheduleGameTeamsSchema = z\n .tuple([teamIdSchema, teamIdSchema])\n .refine(([first, second]) => !(isByeTeamId(first) && isByeTeamId(second)), 'A game needs at least one team.')\n .refine(([first, second]) => first !== second, 'A game needs two different teams.');\nexport type ScheduleGameTeams = z.infer<typeof scheduleGameTeamsSchema>;\n\n// Where and when one game is played. The venue is named by id, and the server writes the label the\n// schedule shows from the venue's own name and the chosen court.\nconst scheduleGameShape = {\n teams: scheduleGameTeamsSchema,\n startTime: epochMsSchema,\n gameLocationId: gameLocationIdSchema,\n subLocation: gameLocationSubLocationSchema.optional(),\n};\n\nexport const ScheduleGameInputSchema = z.object(scheduleGameShape).strict();\nexport type ScheduleGameInput = z.infer<typeof ScheduleGameInputSchema>;\n\nexport const sportGameScheduleFieldSchema = z.enum(SPORT_GAME_SCHEDULE_FIELD_KEYS);\nexport const scheduleWeekFieldSchema = z.enum(SCHEDULE_WEEK_FIELD_KEYS);\n\n// A new week and its games, saved together. `weekStartDate` is the week's first day as the admin's\n// form reads it; the week's venue is the default each game's form starts from, and its name is the\n// week's `weekLocation`.\nexport const AdminCreateScheduleWeekInputSchema = z\n .object({\n leagueId: leagueIdSchema,\n weekTitle: scheduleWeekTitleSchema,\n weekStartDate: epochMsSchema,\n weekGameLocationId: gameLocationIdSchema,\n games: z.array(ScheduleGameInputSchema).min(1).max(MAX_SCHEDULE_WEEK_GAMES),\n })\n .strict();\nexport type AdminCreateScheduleWeekInput = z.infer<typeof AdminCreateScheduleWeekInputSchema>;\nexport const AdminCreateScheduleWeekResultSchema = z\n .object({ leagueId: leagueIdSchema, weekId: scheduleWeekIdSchema, gameIds: z.array(gameIdSchema) })\n .strict();\nexport type AdminCreateScheduleWeekResult = z.infer<typeof AdminCreateScheduleWeekResultSchema>;\n\n// Only the week's shared fields the admin changed: a field left out keeps what each game holds, so\n// two admins editing different fields of one week never write each other's loaded values back\n// (BACKEND-116). The venue is named by id, and the week shows its name.\nexport const AdminUpdateScheduleWeekInputSchema = z\n .object({\n leagueId: leagueIdSchema,\n weekId: scheduleWeekIdSchema,\n weekTitle: scheduleWeekTitleSchema.optional(),\n weekStartDate: epochMsSchema.optional(),\n weekGameLocationId: gameLocationIdSchema.optional(),\n })\n .strict()\n .refine(\n (input) => input.weekTitle !== undefined || input.weekStartDate !== undefined || input.weekGameLocationId !== undefined,\n 'Name at least one field to change.',\n );\nexport type AdminUpdateScheduleWeekInput = z.infer<typeof AdminUpdateScheduleWeekInputSchema>;\nexport const AdminUpdateScheduleWeekResultSchema = z\n .object({\n leagueId: leagueIdSchema,\n weekId: scheduleWeekIdSchema,\n changedFields: z.array(scheduleWeekFieldSchema),\n gamesUpdated: countSchema,\n })\n .strict();\nexport type AdminUpdateScheduleWeekResult = z.infer<typeof AdminUpdateScheduleWeekResultSchema>;\n\n// A whole week and every game in it. A game with events takes more than one step to delete, so a\n// call that runs out of time answers `complete: false` with the games still standing, and running\n// it again continues. A week with no game left answers complete.\nexport const AdminDeleteScheduleWeekInputSchema = z\n .object({ leagueId: leagueIdSchema, weekId: scheduleWeekIdSchema })\n .strict();\nexport type AdminDeleteScheduleWeekInput = z.infer<typeof AdminDeleteScheduleWeekInputSchema>;\nexport const AdminDeleteScheduleWeekResultSchema = z\n .object({\n leagueId: leagueIdSchema,\n weekId: scheduleWeekIdSchema,\n deletedGameIds: z.array(gameIdSchema),\n remainingGameIds: z.array(gameIdSchema),\n complete: z.boolean(),\n })\n .strict();\nexport type AdminDeleteScheduleWeekResult = z.infer<typeof AdminDeleteScheduleWeekResultSchema>;\n\n// One game added to a saved week, which gives it the week's shared fields.\nexport const AdminCreateSportGameInputSchema = z\n .object({ leagueId: leagueIdSchema, weekId: scheduleWeekIdSchema, ...scheduleGameShape })\n .strict();\nexport type AdminCreateSportGameInput = z.infer<typeof AdminCreateSportGameInputSchema>;\nexport const AdminCreateSportGameResultSchema = z\n .object({ leagueId: leagueIdSchema, weekId: scheduleWeekIdSchema, gameId: gameIdSchema })\n .strict();\nexport type AdminCreateSportGameResult = z.infer<typeof AdminCreateSportGameResultSchema>;\n\n// One game's schedule, whole: its week (a reschedule into another saved week), its teams, its start\n// time, and its venue. `expectedUpdatedAt` is the game's `updatedAt` as the admin loaded it, so a\n// stale form never writes its old values over a newer change. A game that names no venue may keep\n// its stored label by naming none; a court is named only with its venue.\nexport const AdminUpdateSportGameInputSchema = z\n .object({\n gameId: gameIdSchema,\n expectedUpdatedAt: epochMsSchema,\n weekId: scheduleWeekIdSchema,\n teams: scheduleGameTeamsSchema,\n startTime: epochMsSchema,\n gameLocationId: gameLocationIdSchema.optional(),\n subLocation: gameLocationSubLocationSchema.optional(),\n })\n .strict()\n .refine((input) => input.subLocation === undefined || input.gameLocationId !== undefined, {\n message: 'A court is chosen within a venue.',\n path: ['subLocation'],\n });\nexport type AdminUpdateSportGameInput = z.infer<typeof AdminUpdateSportGameInputSchema>;\nexport const AdminUpdateSportGameResultSchema = z\n .object({\n gameId: gameIdSchema,\n changedFields: z.array(sportGameScheduleFieldSchema),\n updatedAt: epochMsSchema,\n })\n .strict();\nexport type AdminUpdateSportGameResult = z.infer<typeof AdminUpdateSportGameResultSchema>;\n\n// One game, with its events and roster. The server derives the deletion's operation id from the\n// game (`buildGameDeletionOperationId`), so a retry of a finished delete is acknowledged and a retry\n// of an interrupted one continues it; the caller names only the game.\nexport const AdminDeleteSportGameInputSchema = z.object({ gameId: gameIdSchema }).strict();\nexport type AdminDeleteSportGameInput = z.infer<typeof AdminDeleteSportGameInputSchema>;\nexport const AdminDeleteSportGameResultSchema = z\n .object({ gameId: gameIdSchema, operationId: statsOperationIdSchema, complete: z.boolean() })\n .strict();\nexport type AdminDeleteSportGameResult = z.infer<typeof AdminDeleteSportGameResultSchema>;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/schemas/scoring.ts"],"names":[],"mappings":"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","sourcesContent":["// Callable contracts for live scoring: recording stat events, marking a roster entry absent, a\r\n// scorer's memo, and the jump-ball possession arrow. Each action is two entries over one core — the\r\n// member entry for a captain or co-captain of one of the game's two teams, and the admin entry for\r\n// an admin or referee — which share one input and one result.\r\n\r\nimport { z } from 'zod';\r\nimport { MAX_STAT_EVENTS_PER_WRITE } from '../constants/sports.js';\r\nimport { isSportStatEventId } from '../ids/stat-event-ids.js';\r\nimport { GAME_MEMO_INPUT_FORMAT } from '../input-formats/index.js';\r\nimport {\r\n BasketballAssistableShotEventSchema,\r\n BasketballBulkEditEventSchema,\r\n BasketballOnePointEventSchema,\r\n BasketballPlayerTallyEventSchema,\r\n BasketballTimeoutEventSchema,\r\n CurlingBlankEndEventSchema,\r\n CurlingRoundScoreEventSchema,\r\n FootballBulkEditEventSchema,\r\n FootballScoreEventSchema,\r\n StatCorrectionEventSchema,\r\n StatVoidEventSchema,\r\n} from '../doc-schemas/game-stats.js';\r\nimport {\r\n RECORDED_STAT_EVENT_OUTCOME_KEYS,\r\n STAT_EVENT_RECORDER_FIELD_KEYS,\r\n STAT_EVENT_REFUSAL_KEYS,\r\n STAT_EVENT_SNAPSHOT_FIELD_KEYS,\r\n} from '../types/stats.js';\r\nimport type { StatEventRecorderField, StatEventSnapshotField } from '../types/stats.js';\r\nimport {\r\n countSchema,\r\n gameIdSchema,\r\n gameRosterPlayerIdSchema,\r\n statEventIdSchema,\r\n teamIdSchema,\r\n textFieldSchema,\r\n userIdSchema,\r\n} from './atoms.js';\r\n\r\n// ---------------------------------------------------------------------------------------------\r\n// Recording stat events\r\n// ---------------------------------------------------------------------------------------------\r\n\r\ntype ServerDerivedField = StatEventRecorderField | StatEventSnapshotField;\r\nconst SERVER_DERIVED_FIELDS: ReadonlySet<string> = new Set([\r\n ...STAT_EVENT_RECORDER_FIELD_KEYS,\r\n ...STAT_EVENT_SNAPSHOT_FIELD_KEYS,\r\n]);\r\n\r\n/**\r\n * A stored event's fields as its caller sends them: without the sequence and recorder facts the\r\n * writing core derives (ARCH-106), and without a name snapshot, which only a copied event carries.\r\n * Built from the stored event's own declaration, so the wire and the document cannot drift.\r\n */\r\nfunction callerShape<Shape extends z.ZodRawShape, Omitted extends keyof Shape = never>(\r\n shape: Shape,\r\n omitted: readonly Omitted[] = [],\r\n): Omit<Shape, ServerDerivedField | Omitted> {\r\n const dropped = new Set<PropertyKey>([...SERVER_DERIVED_FIELDS, ...omitted]);\r\n return Object.fromEntries(Object.entries(shape).filter(([field]) => !dropped.has(field))) as Omit<\r\n Shape,\r\n ServerDerivedField | Omitted\r\n >;\r\n}\r\n\r\n// A sport event's id as its caller sends it — the id minted at the tap, or, as a void's target, one a\r\n// copied event kept. It becomes a document path, so it is held to the shape a sport event id has.\r\nexport const sportStatEventIdSchema = statEventIdSchema.refine(isSportStatEventId, 'Not a stat event id.');\r\n\r\nconst sportEventId = { eventId: sportStatEventIdSchema };\r\n\r\n/**\r\n * One event of a scoring write, as the tap minted it: a sport event with its id and `recordedAt`, or\r\n * a void naming its target, whose own id the core derives. A bulk edit carries `previousValue`, the\r\n * value the form showed, so a stale form is refused. A correction parses so the core can answer it\r\n * with its refusal: only the game-reconcile core appends one.\r\n */\r\nexport const StatEventSubmissionSchema = z.discriminatedUnion('type', [\r\n z.strictObject({ ...callerShape(BasketballOnePointEventSchema.shape), ...sportEventId }),\r\n z.strictObject({ ...callerShape(BasketballAssistableShotEventSchema.shape), ...sportEventId }),\r\n z.strictObject({ ...callerShape(BasketballPlayerTallyEventSchema.shape), ...sportEventId }),\r\n z.strictObject({ ...callerShape(BasketballTimeoutEventSchema.shape), ...sportEventId }),\r\n z.strictObject({ ...callerShape(BasketballBulkEditEventSchema.shape), ...sportEventId, previousValue: countSchema }),\r\n z.strictObject({ ...callerShape(CurlingRoundScoreEventSchema.shape), ...sportEventId }),\r\n z.strictObject({ ...callerShape(CurlingBlankEndEventSchema.shape), ...sportEventId }),\r\n z.strictObject({ ...callerShape(FootballScoreEventSchema.shape), ...sportEventId }),\r\n z.strictObject({ ...callerShape(FootballBulkEditEventSchema.shape), ...sportEventId }),\r\n z.strictObject({ ...callerShape(StatVoidEventSchema.shape, ['eventId']), targetEventId: sportStatEventIdSchema }),\r\n z.strictObject(callerShape(StatCorrectionEventSchema.shape)),\r\n]);\r\nexport type StatEventSubmission = z.infer<typeof StatEventSubmissionSchema>;\r\n\r\n// A queue drain, a bulk-entry submission, or an undo: one ordered batch, applied whole or not at all.\r\nexport const RecordGameStatEventsInputSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n events: z.array(StatEventSubmissionSchema).min(1).max(MAX_STAT_EVENTS_PER_WRITE),\r\n })\r\n .strict();\r\nexport type RecordGameStatEventsInput = z.infer<typeof RecordGameStatEventsInputSchema>;\r\n\r\n// Each event sent, in order: stored now, or found already stored by an earlier send.\r\nexport const RecordedStatEventSchema = z\r\n .object({\r\n eventId: statEventIdSchema,\r\n outcome: z.enum(RECORDED_STAT_EVENT_OUTCOME_KEYS),\r\n sequence: z.number().int().positive(),\r\n })\r\n .strict();\r\nexport type RecordedStatEvent = z.infer<typeof RecordedStatEventSchema>;\r\n\r\nexport const RecordGameStatEventsResultSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n events: z.array(RecordedStatEventSchema),\r\n })\r\n .strict();\r\nexport type RecordGameStatEventsResult = z.infer<typeof RecordGameStatEventsResultSchema>;\r\n\r\n// What a refused scoring write names in its error details: why, and the first event it refused. No\r\n// event of the batch was stored, and the scorekeeper's failed list shows the refusal's copy beside\r\n// that event.\r\nexport const StatEventRefusalDetailsSchema = z\r\n .object({\r\n refusal: z.enum(STAT_EVENT_REFUSAL_KEYS),\r\n eventId: statEventIdSchema,\r\n })\r\n .strict();\r\nexport type StatEventRefusalDetails = z.infer<typeof StatEventRefusalDetailsSchema>;\r\n\r\n// ---------------------------------------------------------------------------------------------\r\n// Absence — per roster entry, so a person on both teams can be absent on one side only\r\n// ---------------------------------------------------------------------------------------------\r\n\r\nexport const UpdateGameAbsentPlayersInputSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n gameRosterPlayerId: gameRosterPlayerIdSchema,\r\n absent: z.boolean(),\r\n })\r\n .strict();\r\nexport type UpdateGameAbsentPlayersInput = z.infer<typeof UpdateGameAbsentPlayersInputSchema>;\r\n\r\n// `changed` is false when the entry was already marked that way; nothing was written.\r\nexport const UpdateGameAbsentPlayersResultSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n gameRosterPlayerId: gameRosterPlayerIdSchema,\r\n absent: z.boolean(),\r\n changed: z.boolean(),\r\n })\r\n .strict();\r\nexport type UpdateGameAbsentPlayersResult = z.infer<typeof UpdateGameAbsentPlayersResultSchema>;\r\n\r\n// ---------------------------------------------------------------------------------------------\r\n// The memo — a scorer's note on one person in a live game (\"red shirt\", \"#9\")\r\n// ---------------------------------------------------------------------------------------------\r\n\r\n// Built from the memo's one declaration, so the memo form and the callable accept exactly the same\r\n// text: trimmed, one line, empty allowed — an empty memo clears the person's note.\r\nexport const gameMemoSchema = textFieldSchema(GAME_MEMO_INPUT_FORMAT);\r\n\r\nexport const UpdateGameMemoInputSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n userId: userIdSchema,\r\n memo: gameMemoSchema,\r\n })\r\n .strict();\r\nexport type UpdateGameMemoInput = z.infer<typeof UpdateGameMemoInputSchema>;\r\n\r\nexport const UpdateGameMemoResultSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n userId: userIdSchema,\r\n memo: z.string(),\r\n changed: z.boolean(),\r\n })\r\n .strict();\r\nexport type UpdateGameMemoResult = z.infer<typeof UpdateGameMemoResultSchema>;\r\n\r\n// ---------------------------------------------------------------------------------------------\r\n// The jump-ball possession arrow — set to a team, so a retried call lands where the first did\r\n// ---------------------------------------------------------------------------------------------\r\n\r\nexport const UpdateGameJumpBallInputSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n teamId: teamIdSchema,\r\n })\r\n .strict();\r\nexport type UpdateGameJumpBallInput = z.infer<typeof UpdateGameJumpBallInputSchema>;\r\n\r\nexport const UpdateGameJumpBallResultSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n teamId: teamIdSchema,\r\n changed: z.boolean(),\r\n })\r\n .strict();\r\nexport type UpdateGameJumpBallResult = z.infer<typeof UpdateGameJumpBallResultSchema>;\r\n"]}
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/schemas/scoring.ts"],"names":[],"mappings":"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","sourcesContent":["// Callable contracts for live scoring: recording stat events, marking a roster entry absent, a\n// scorer's memo, and the jump-ball possession arrow. Each action is two entries over one core — the\n// member entry for a captain or co-captain of one of the game's two teams, and the admin entry for\n// an admin or referee — which share one input and one result.\n\nimport { z } from 'zod';\nimport { MAX_STAT_EVENTS_PER_WRITE } from '../constants/sports.js';\nimport { isSportStatEventId } from '../ids/stat-event-ids.js';\nimport { GAME_MEMO_INPUT_FORMAT } from '../input-formats/index.js';\nimport {\n BasketballAssistableShotEventSchema,\n BasketballBulkEditEventSchema,\n BasketballOnePointEventSchema,\n BasketballPlayerTallyEventSchema,\n BasketballTimeoutEventSchema,\n CurlingBlankEndEventSchema,\n CurlingRoundScoreEventSchema,\n FootballBulkEditEventSchema,\n FootballScoreEventSchema,\n StatCorrectionEventSchema,\n StatVoidEventSchema,\n} from '../doc-schemas/game-stats.js';\nimport {\n RECORDED_STAT_EVENT_OUTCOME_KEYS,\n STAT_EVENT_RECORDER_FIELD_KEYS,\n STAT_EVENT_REFUSAL_KEYS,\n STAT_EVENT_SNAPSHOT_FIELD_KEYS,\n} from '../types/stats.js';\nimport type { StatEventRecorderField, StatEventSnapshotField } from '../types/stats.js';\nimport {\n countSchema,\n gameIdSchema,\n gameRosterPlayerIdSchema,\n statEventIdSchema,\n teamIdSchema,\n textFieldSchema,\n userIdSchema,\n} from './atoms.js';\n\n// ---------------------------------------------------------------------------------------------\n// Recording stat events\n// ---------------------------------------------------------------------------------------------\n\ntype ServerDerivedField = StatEventRecorderField | StatEventSnapshotField;\nconst SERVER_DERIVED_FIELDS: ReadonlySet<string> = new Set([\n ...STAT_EVENT_RECORDER_FIELD_KEYS,\n ...STAT_EVENT_SNAPSHOT_FIELD_KEYS,\n]);\n\n/**\n * A stored event's fields as its caller sends them: without the sequence and recorder facts the\n * writing core derives (ARCH-106), and without a name snapshot, which only a copied event carries.\n * Built from the stored event's own declaration, so the wire and the document cannot drift.\n */\nfunction callerShape<Shape extends z.ZodRawShape, Omitted extends keyof Shape = never>(\n shape: Shape,\n omitted: readonly Omitted[] = [],\n): Omit<Shape, ServerDerivedField | Omitted> {\n const dropped = new Set<PropertyKey>([...SERVER_DERIVED_FIELDS, ...omitted]);\n return Object.fromEntries(Object.entries(shape).filter(([field]) => !dropped.has(field))) as Omit<\n Shape,\n ServerDerivedField | Omitted\n >;\n}\n\n// A sport event's id as its caller sends it — the id minted at the tap, or, as a void's target, one a\n// copied event kept. It becomes a document path, so it is held to the shape a sport event id has.\nexport const sportStatEventIdSchema = statEventIdSchema.refine(isSportStatEventId, 'Not a stat event id.');\n\nconst sportEventId = { eventId: sportStatEventIdSchema };\n\n/**\n * One event of a scoring write, as the tap minted it: a sport event with its id and `recordedAt`, or\n * a void naming its target, whose own id the core derives. A bulk edit carries `previousValue`, the\n * value the form showed, so a stale form is refused. A correction parses so the core can answer it\n * with its refusal: only the game-reconcile core appends one.\n */\nexport const StatEventSubmissionSchema = z.discriminatedUnion('type', [\n z.strictObject({ ...callerShape(BasketballOnePointEventSchema.shape), ...sportEventId }),\n z.strictObject({ ...callerShape(BasketballAssistableShotEventSchema.shape), ...sportEventId }),\n z.strictObject({ ...callerShape(BasketballPlayerTallyEventSchema.shape), ...sportEventId }),\n z.strictObject({ ...callerShape(BasketballTimeoutEventSchema.shape), ...sportEventId }),\n z.strictObject({ ...callerShape(BasketballBulkEditEventSchema.shape), ...sportEventId, previousValue: countSchema }),\n z.strictObject({ ...callerShape(CurlingRoundScoreEventSchema.shape), ...sportEventId }),\n z.strictObject({ ...callerShape(CurlingBlankEndEventSchema.shape), ...sportEventId }),\n z.strictObject({ ...callerShape(FootballScoreEventSchema.shape), ...sportEventId }),\n z.strictObject({ ...callerShape(FootballBulkEditEventSchema.shape), ...sportEventId }),\n z.strictObject({ ...callerShape(StatVoidEventSchema.shape, ['eventId']), targetEventId: sportStatEventIdSchema }),\n z.strictObject(callerShape(StatCorrectionEventSchema.shape)),\n]);\nexport type StatEventSubmission = z.infer<typeof StatEventSubmissionSchema>;\n\n// A queue drain, a bulk-entry submission, or an undo: one ordered batch, applied whole or not at all.\nexport const RecordGameStatEventsInputSchema = z\n .object({\n gameId: gameIdSchema,\n events: z.array(StatEventSubmissionSchema).min(1).max(MAX_STAT_EVENTS_PER_WRITE),\n })\n .strict();\nexport type RecordGameStatEventsInput = z.infer<typeof RecordGameStatEventsInputSchema>;\n\n// Each event sent, in order: stored now, or found already stored by an earlier send.\nexport const RecordedStatEventSchema = z\n .object({\n eventId: statEventIdSchema,\n outcome: z.enum(RECORDED_STAT_EVENT_OUTCOME_KEYS),\n sequence: z.number().int().positive(),\n })\n .strict();\nexport type RecordedStatEvent = z.infer<typeof RecordedStatEventSchema>;\n\nexport const RecordGameStatEventsResultSchema = z\n .object({\n gameId: gameIdSchema,\n events: z.array(RecordedStatEventSchema),\n })\n .strict();\nexport type RecordGameStatEventsResult = z.infer<typeof RecordGameStatEventsResultSchema>;\n\n// What a refused scoring write names in its error details: why, and the first event it refused. No\n// event of the batch was stored, and the scorekeeper's failed list shows the refusal's copy beside\n// that event.\nexport const StatEventRefusalDetailsSchema = z\n .object({\n refusal: z.enum(STAT_EVENT_REFUSAL_KEYS),\n eventId: statEventIdSchema,\n })\n .strict();\nexport type StatEventRefusalDetails = z.infer<typeof StatEventRefusalDetailsSchema>;\n\n// ---------------------------------------------------------------------------------------------\n// Absence — per roster entry, so a person on both teams can be absent on one side only\n// ---------------------------------------------------------------------------------------------\n\nexport const UpdateGameAbsentPlayersInputSchema = z\n .object({\n gameId: gameIdSchema,\n gameRosterPlayerId: gameRosterPlayerIdSchema,\n absent: z.boolean(),\n })\n .strict();\nexport type UpdateGameAbsentPlayersInput = z.infer<typeof UpdateGameAbsentPlayersInputSchema>;\n\n// `changed` is false when the entry was already marked that way; nothing was written.\nexport const UpdateGameAbsentPlayersResultSchema = z\n .object({\n gameId: gameIdSchema,\n gameRosterPlayerId: gameRosterPlayerIdSchema,\n absent: z.boolean(),\n changed: z.boolean(),\n })\n .strict();\nexport type UpdateGameAbsentPlayersResult = z.infer<typeof UpdateGameAbsentPlayersResultSchema>;\n\n// ---------------------------------------------------------------------------------------------\n// The memo — a scorer's note on one person in a live game (\"red shirt\", \"#9\")\n// ---------------------------------------------------------------------------------------------\n\n// Built from the memo's one declaration, so the memo form and the callable accept exactly the same\n// text: trimmed, one line, empty allowed — an empty memo clears the person's note.\nexport const gameMemoSchema = textFieldSchema(GAME_MEMO_INPUT_FORMAT);\n\nexport const UpdateGameMemoInputSchema = z\n .object({\n gameId: gameIdSchema,\n userId: userIdSchema,\n memo: gameMemoSchema,\n })\n .strict();\nexport type UpdateGameMemoInput = z.infer<typeof UpdateGameMemoInputSchema>;\n\nexport const UpdateGameMemoResultSchema = z\n .object({\n gameId: gameIdSchema,\n userId: userIdSchema,\n memo: z.string(),\n changed: z.boolean(),\n })\n .strict();\nexport type UpdateGameMemoResult = z.infer<typeof UpdateGameMemoResultSchema>;\n\n// ---------------------------------------------------------------------------------------------\n// The jump-ball possession arrow — set to a team, so a retried call lands where the first did\n// ---------------------------------------------------------------------------------------------\n\nexport const UpdateGameJumpBallInputSchema = z\n .object({\n gameId: gameIdSchema,\n teamId: teamIdSchema,\n })\n .strict();\nexport type UpdateGameJumpBallInput = z.infer<typeof UpdateGameJumpBallInputSchema>;\n\nexport const UpdateGameJumpBallResultSchema = z\n .object({\n gameId: gameIdSchema,\n teamId: teamIdSchema,\n changed: z.boolean(),\n })\n .strict();\nexport type UpdateGameJumpBallResult = z.infer<typeof UpdateGameJumpBallResultSchema>;\n"]}
@@ -258,8 +258,10 @@ export declare const RunStatsValidationResultSchema: z.ZodObject<{
258
258
  discrepanciesFound: z.ZodNumber;
259
259
  }, z.core.$strict>;
260
260
  discrepancyCounts: z.ZodRecord<z.ZodEnum<{
261
+ gameUnreadable: "gameUnreadable";
261
262
  invalidEvent: "invalidEvent";
262
263
  eventSequenceMismatch: "eventSequenceMismatch";
264
+ eventSequenceGap: "eventSequenceGap";
263
265
  rollupMismatch: "rollupMismatch";
264
266
  scoreMirrorMismatch: "scoreMirrorMismatch";
265
267
  unrosteredStatLine: "unrosteredStatLine";
@@ -1 +1 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/schemas/stats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/schemas/stats.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/schemas/stats.ts"],"names":[],"mappings":"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","sourcesContent":["// Callable contracts for the stats pipeline: finalize, reopen, the Fix stats actions — the rebuilds,\r\n// the game repairs, the historical baseline, the stats check, and deleting a check's report — and the\r\n// migration's placement of\r\n// an unplaceable stat line.\r\n\r\nimport { z } from 'zod';\r\nimport { MAX_GAME_STATS_CORRECTION_TARGETS } from '../constants/sports.js';\r\nimport { statCounterKeySchema, statsOperationIdSchema, statsValidationReportIdSchema } from '../doc-schemas/atoms.js';\r\nimport { StatsDestinationChangeSchema, StatsOperationCountsSchema } from '../doc-schemas/stats-operation.js';\r\nimport {\r\n StatsValidationReportSchema,\r\n StatsValidationScopeSchema,\r\n StatsValidationSummarySchema,\r\n} from '../doc-schemas/system.js';\r\nimport { HistoricalStatsSchema } from '../doc-schemas/user-profile.js';\r\nimport {\r\n GAME_FINALIZE_OUTCOME_KEYS,\r\n GAME_REOPEN_OUTCOME_KEYS,\r\n GAME_STATS_REPAIR_OUTCOME_KEYS,\r\n UNROSTERED_STAT_LINE_RESOLUTION_OUTCOME_KEYS,\r\n} from '../types/stats.js';\r\nimport {\r\n countSchema,\r\n gameIdSchema,\r\n gameRosterPlayerIdSchema,\r\n leagueIdSchema,\r\n repairReasonSchema,\r\n sportKeySchema,\r\n teamIdSchema,\r\n userIdSchema,\r\n} from './atoms.js';\r\n\r\n// `finalizeGame` (a captain or co-captain of either team) / `adminFinalizeGame` (an admin or a\r\n// referee): make a game's numbers permanent. Everything it writes is derived server-side from the\r\n// game's events; nothing in the input is a number (SPORT-202).\r\nexport const FinalizeGameInputSchema = z.object({ gameId: gameIdSchema }).strict();\r\nexport type FinalizeGameInput = z.infer<typeof FinalizeGameInputSchema>;\r\n\r\n// `alreadyFinalized` when the game was completed before the call: nothing was written (SPORT-203).\r\nexport const FinalizeGameResultSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n leagueId: leagueIdSchema,\r\n outcome: z.enum(GAME_FINALIZE_OUTCOME_KEYS),\r\n nonScoringRosterPlayerIds: z.array(gameRosterPlayerIdSchema),\r\n })\r\n .strict();\r\nexport type FinalizeGameResult = z.infer<typeof FinalizeGameResultSchema>;\r\n\r\n// `reopenGame` (an admin): take a finalized game's numbers back out so it can be scored again. It\r\n// changes a completed record, so the admin says why (SPORT-206, BACKEND-212).\r\nexport const ReopenGameInputSchema = z.object({ gameId: gameIdSchema, reason: repairReasonSchema }).strict();\r\nexport type ReopenGameInput = z.infer<typeof ReopenGameInputSchema>;\r\n\r\n// `alreadyOpen` when the game was not completed: nothing was written.\r\nexport const ReopenGameResultSchema = z\r\n .object({ gameId: gameIdSchema, leagueId: leagueIdSchema, outcome: z.enum(GAME_REOPEN_OUTCOME_KEYS) })\r\n .strict();\r\nexport type ReopenGameResult = z.infer<typeof ReopenGameResultSchema>;\r\n\r\n// `resolve.unrosteredStatLine` (an admin, at the cutover console, before the cutover): a recorded V1\r\n// stat line that no roster entry and no play of the game can place is placed on the team the admin\r\n// names, as the game's missing roster entry; the game's copy is then run again. The admin says why.\r\n// `dryRun` previews the placement — whether the game would then convert — and writes nothing.\r\nexport const AdminResolveUnrosteredStatLineInputSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n userId: userIdSchema,\r\n teamId: teamIdSchema,\r\n reason: repairReasonSchema,\r\n dryRun: z.boolean().optional(),\r\n })\r\n .strict();\r\nexport type AdminResolveUnrosteredStatLineInput = z.infer<typeof AdminResolveUnrosteredStatLineInputSchema>;\r\n\r\n// `gameConverts` says whether the game's stats now convert, so the operator knows the copy can run.\r\nexport const AdminResolveUnrosteredStatLineResultSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n userId: userIdSchema,\r\n teamId: teamIdSchema,\r\n outcome: z.enum(UNROSTERED_STAT_LINE_RESOLUTION_OUTCOME_KEYS),\r\n gameConverts: z.boolean(),\r\n })\r\n .strict();\r\nexport type AdminResolveUnrosteredStatLineResult = z.infer<typeof AdminResolveUnrosteredStatLineResultSchema>;\r\n\r\n// Every rebuild and every game repair is a repair of a completed record: it takes a reason, runs\r\n// under an operation id the admin's browser mints when the admin starts it, and offers a dry run that\r\n// lists each document it would change, with before and after, and writes nothing (BACKEND-212,\r\n// SPORT-206). A real run resumes from its operation document, so a cursor is taken from the client\r\n// only to page a dry run, which keeps no operation.\r\nconst statsRepairFields = {\r\n reason: repairReasonSchema,\r\n operationId: statsOperationIdSchema,\r\n dryRun: z.boolean(),\r\n resumeAfter: z.string().min(1).optional(),\r\n};\r\n\r\nconst cursorOnlyOnDryRun = (input: { dryRun: boolean; resumeAfter?: string }): boolean =>\r\n input.dryRun || input.resumeAfter === undefined;\r\nconst CURSOR_ONLY_ON_DRY_RUN = {\r\n message: 'A real run resumes from its operation; only a dry run takes a cursor.',\r\n path: ['resumeAfter'],\r\n};\r\n\r\n// `recalculateLeagueStats`: every team of one league — its standings line and its per-membership rows.\r\nexport const RecalculateLeagueStatsInputSchema = z\r\n .object({ leagueId: leagueIdSchema, ...statsRepairFields })\r\n .strict()\r\n .refine(cursorOnlyOnDryRun, CURSOR_ONLY_ON_DRY_RUN);\r\nexport type RecalculateLeagueStatsInput = z.infer<typeof RecalculateLeagueStatsInputSchema>;\r\n\r\n// `recalculateAllLeagueStats`: every league, closed ones included, a page of leagues per call.\r\nexport const RecalculateAllLeagueStatsInputSchema = z\r\n .object({ ...statsRepairFields })\r\n .strict()\r\n .refine(cursorOnlyOnDryRun, CURSOR_ONLY_ON_DRY_RUN);\r\nexport type RecalculateAllLeagueStatsInput = z.infer<typeof RecalculateAllLeagueStatsInputSchema>;\r\n\r\n// `recalculateUserStats`: one person's career line in every sport.\r\nexport const RecalculateUserStatsInputSchema = z\r\n .object({ userId: userIdSchema, ...statsRepairFields })\r\n .strict()\r\n .refine(cursorOnlyOnDryRun, CURSOR_ONLY_ON_DRY_RUN);\r\nexport type RecalculateUserStatsInput = z.infer<typeof RecalculateUserStatsInputSchema>;\r\n\r\n// `recalculateAllUserStats`: every profile's career lines, a page of profiles per call.\r\nexport const RecalculateAllUserStatsInputSchema = z\r\n .object({ ...statsRepairFields })\r\n .strict()\r\n .refine(cursorOnlyOnDryRun, CURSOR_ONLY_ON_DRY_RUN);\r\nexport type RecalculateAllUserStatsInput = z.infer<typeof RecalculateAllUserStatsInputSchema>;\r\n\r\n// `recalculateHallOfFame`: one sport's hall of fame — one person's entry, or the whole sport a page\r\n// of profiles per call. Refused for a sport that keeps none.\r\nexport const RecalculateHallOfFameInputSchema = z\r\n .object({ sportKey: sportKeySchema, userId: userIdSchema.optional(), ...statsRepairFields })\r\n .strict()\r\n .refine(cursorOnlyOnDryRun, CURSOR_ONLY_ON_DRY_RUN);\r\nexport type RecalculateHallOfFameInput = z.infer<typeof RecalculateHallOfFameInputSchema>;\r\n\r\n// What one call of a rebuild did. `complete` is false while a paged rebuild has pages left: the\r\n// admin calls again with the same operation id — or, for a dry run, with `resumeAfter` set to\r\n// `nextResumeAfter`. `changes` is every document this call changed or, on a dry run, would change,\r\n// up to MAX_STATS_REPAIR_LISTED_CHANGES (`changesTruncated` says more were left out). A game whose\r\n// stored numbers disagree with its record is named in `stoppedOnGameIds`, and what it feeds is left\r\n// untouched. `scopeChanged` says a game was finalized or reopened in the scope while it ran, so the\r\n// admin runs it again.\r\nexport const StatsRebuildResultSchema = z\r\n .object({\r\n operationId: statsOperationIdSchema,\r\n dryRun: z.boolean(),\r\n complete: z.boolean(),\r\n nextResumeAfter: z.string().min(1).nullable(),\r\n counts: StatsOperationCountsSchema,\r\n stoppedOnGameIds: z.array(gameIdSchema),\r\n changes: z.array(StatsDestinationChangeSchema),\r\n changesTruncated: z.boolean(),\r\n scopeChanged: z.boolean(),\r\n })\r\n .strict();\r\nexport type StatsRebuildResult = z.infer<typeof StatsRebuildResultSchema>;\r\n\r\n// A line a correction sets, by its absolute value: the team line of `teamId`, or the player line\r\n// `{teamId}_{playerUserId}` when a player is named. Only a field the sport's adapter lists in\r\n// `correctableFields` may be set.\r\nexport const GameStatsCorrectionTargetSchema = z\r\n .object({\r\n teamId: teamIdSchema,\r\n playerUserId: userIdSchema.optional(),\r\n stat: statCounterKeySchema,\r\n value: countSchema,\r\n })\r\n .strict();\r\nexport type GameStatsCorrectionTarget = z.infer<typeof GameStatsCorrectionTargetSchema>;\r\n\r\n// `adminCorrectGameStats`: set named fields of a game's lines to the values given, or keep the\r\n// numbers the game stores now — a hand edit made outside the app — as corrections. Exactly one of the\r\n// two.\r\nexport const AdminCorrectGameStatsInputSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n targets: z.array(GameStatsCorrectionTargetSchema).min(1).max(MAX_GAME_STATS_CORRECTION_TARGETS).optional(),\r\n keepStored: z.literal(true).optional(),\r\n reason: repairReasonSchema,\r\n operationId: statsOperationIdSchema,\r\n dryRun: z.boolean(),\r\n })\r\n .strict()\r\n .refine((input) => (input.targets === undefined) !== (input.keepStored === undefined), {\r\n message: 'Give the values to set, or keep the stored numbers — one of the two.',\r\n path: ['targets'],\r\n });\r\nexport type AdminCorrectGameStatsInput = z.infer<typeof AdminCorrectGameStatsInputSchema>;\r\n\r\n// `recalculateGameStats`: restore a game's numbers from its events, discarding a hand edit.\r\nexport const RecalculateGameStatsInputSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n reason: repairReasonSchema,\r\n operationId: statsOperationIdSchema,\r\n dryRun: z.boolean(),\r\n })\r\n .strict();\r\nexport type RecalculateGameStatsInput = z.infer<typeof RecalculateGameStatsInputSchema>;\r\n\r\n// One correction a repair appended, or on a dry run would append.\r\nexport const GameStatsCorrectionSchema = z\r\n .object({ lineKey: z.string().min(1), field: statCounterKeySchema, value: z.number().int() })\r\n .strict();\r\nexport type GameStatsCorrection = z.infer<typeof GameStatsCorrectionSchema>;\r\n\r\n// What a game repair did: `reconciled` it changed the game; `unchanged` there was nothing to change;\r\n// `alreadyApplied` the operation had already committed and this call is its acknowledged retry.\r\nexport const GameStatsRepairResultSchema = z\r\n .object({\r\n gameId: gameIdSchema,\r\n leagueId: leagueIdSchema,\r\n operationId: statsOperationIdSchema,\r\n dryRun: z.boolean(),\r\n outcome: z.enum(GAME_STATS_REPAIR_OUTCOME_KEYS),\r\n corrections: z.array(GameStatsCorrectionSchema),\r\n gameChanged: z.boolean(),\r\n destinationChanges: z.array(StatsDestinationChangeSchema),\r\n })\r\n .strict();\r\nexport type GameStatsRepairResult = z.infer<typeof GameStatsRepairResultSchema>;\r\n\r\n// `adminUpdateHistoricalStats`: a person's pre-Q-Sports career totals for a sport that takes them,\r\n// written whole, and their career line and hall-of-fame entry rebuilt with them.\r\nexport const AdminUpdateHistoricalStatsInputSchema = z\r\n .object({\r\n userId: userIdSchema,\r\n sportKey: sportKeySchema,\r\n stats: HistoricalStatsSchema,\r\n reason: repairReasonSchema,\r\n operationId: statsOperationIdSchema,\r\n dryRun: z.boolean(),\r\n })\r\n .strict();\r\nexport type AdminUpdateHistoricalStatsInput = z.infer<typeof AdminUpdateHistoricalStatsInputSchema>;\r\n\r\nexport const AdminUpdateHistoricalStatsResultSchema = z\r\n .object({\r\n userId: userIdSchema,\r\n sportKey: sportKeySchema,\r\n operationId: statsOperationIdSchema,\r\n dryRun: z.boolean(),\r\n outcome: z.enum(GAME_STATS_REPAIR_OUTCOME_KEYS),\r\n baselineBefore: HistoricalStatsSchema.nullable(),\r\n stoppedOnGameIds: z.array(gameIdSchema),\r\n changes: z.array(StatsDestinationChangeSchema),\r\n })\r\n .strict();\r\nexport type AdminUpdateHistoricalStatsResult = z.infer<typeof AdminUpdateHistoricalStatsResultSchema>;\r\n\r\n// `runStatsValidation`: check one game, one league, or — with neither — everything. A check that\r\n// reaches its time budget saves its place on its operation and answers `complete: false`; calling\r\n// again with the same operation id resumes it. It writes no stat, so it takes no reason.\r\nexport const RunStatsValidationInputSchema = z\r\n .object({ operationId: statsOperationIdSchema, scope: StatsValidationScopeSchema })\r\n .strict();\r\nexport type RunStatsValidationInput = z.infer<typeof RunStatsValidationInputSchema>;\r\n\r\nexport const RunStatsValidationResultSchema = z\r\n .object({\r\n reportId: z.string().min(1),\r\n complete: z.boolean(),\r\n summary: StatsValidationSummarySchema,\r\n discrepancyCounts: StatsValidationReportSchema.shape.discrepancyCounts,\r\n })\r\n .strict();\r\nexport type RunStatsValidationResult = z.infer<typeof RunStatsValidationResultSchema>;\r\n\r\n// `adminDeleteStatsValidationReport`: delete one stats check's report. It writes no stat, so it takes\r\n// no reason; a report that is not there is refused as not found.\r\nexport const AdminDeleteStatsValidationReportInputSchema = z\r\n .object({ reportId: statsValidationReportIdSchema })\r\n .strict();\r\nexport type AdminDeleteStatsValidationReportInput = z.infer<typeof AdminDeleteStatsValidationReportInputSchema>;\r\n\r\nexport const AdminDeleteStatsValidationReportResultSchema = z\r\n .object({ reportId: statsValidationReportIdSchema })\r\n .strict();\r\nexport type AdminDeleteStatsValidationReportResult = z.infer<typeof AdminDeleteStatsValidationReportResultSchema>;\r\n"]}
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/schemas/stats.ts"],"names":[],"mappings":"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","sourcesContent":["// Callable contracts for the stats pipeline: finalize, reopen, the Fix stats actions — the rebuilds,\n// the game repairs, the historical baseline, the stats check, and deleting a check's report — and the\n// migration's placement of\n// an unplaceable stat line.\n\nimport { z } from 'zod';\nimport { MAX_GAME_STATS_CORRECTION_TARGETS } from '../constants/sports.js';\nimport { statCounterKeySchema, statsOperationIdSchema, statsValidationReportIdSchema } from '../doc-schemas/atoms.js';\nimport { StatsDestinationChangeSchema, StatsOperationCountsSchema } from '../doc-schemas/stats-operation.js';\nimport {\n StatsValidationReportSchema,\n StatsValidationScopeSchema,\n StatsValidationSummarySchema,\n} from '../doc-schemas/system.js';\nimport { HistoricalStatsSchema } from '../doc-schemas/user-profile.js';\nimport {\n GAME_FINALIZE_OUTCOME_KEYS,\n GAME_REOPEN_OUTCOME_KEYS,\n GAME_STATS_REPAIR_OUTCOME_KEYS,\n UNROSTERED_STAT_LINE_RESOLUTION_OUTCOME_KEYS,\n} from '../types/stats.js';\nimport {\n countSchema,\n gameIdSchema,\n gameRosterPlayerIdSchema,\n leagueIdSchema,\n repairReasonSchema,\n sportKeySchema,\n teamIdSchema,\n userIdSchema,\n} from './atoms.js';\n\n// `finalizeGame` (a captain or co-captain of either team) / `adminFinalizeGame` (an admin or a\n// referee): make a game's numbers permanent. Everything it writes is derived server-side from the\n// game's events; nothing in the input is a number (SPORT-202).\nexport const FinalizeGameInputSchema = z.object({ gameId: gameIdSchema }).strict();\nexport type FinalizeGameInput = z.infer<typeof FinalizeGameInputSchema>;\n\n// `alreadyFinalized` when the game was completed before the call: nothing was written (SPORT-203).\nexport const FinalizeGameResultSchema = z\n .object({\n gameId: gameIdSchema,\n leagueId: leagueIdSchema,\n outcome: z.enum(GAME_FINALIZE_OUTCOME_KEYS),\n nonScoringRosterPlayerIds: z.array(gameRosterPlayerIdSchema),\n })\n .strict();\nexport type FinalizeGameResult = z.infer<typeof FinalizeGameResultSchema>;\n\n// `reopenGame` (an admin): take a finalized game's numbers back out so it can be scored again. It\n// changes a completed record, so the admin says why (SPORT-206, BACKEND-212).\nexport const ReopenGameInputSchema = z.object({ gameId: gameIdSchema, reason: repairReasonSchema }).strict();\nexport type ReopenGameInput = z.infer<typeof ReopenGameInputSchema>;\n\n// `alreadyOpen` when the game was not completed: nothing was written.\nexport const ReopenGameResultSchema = z\n .object({ gameId: gameIdSchema, leagueId: leagueIdSchema, outcome: z.enum(GAME_REOPEN_OUTCOME_KEYS) })\n .strict();\nexport type ReopenGameResult = z.infer<typeof ReopenGameResultSchema>;\n\n// `resolve.unrosteredStatLine` (an admin, at the cutover console, before the cutover): a recorded V1\n// stat line that no roster entry and no play of the game can place is placed on the team the admin\n// names, as the game's missing roster entry; the game's copy is then run again. The admin says why.\n// `dryRun` previews the placement — whether the game would then convert — and writes nothing.\nexport const AdminResolveUnrosteredStatLineInputSchema = z\n .object({\n gameId: gameIdSchema,\n userId: userIdSchema,\n teamId: teamIdSchema,\n reason: repairReasonSchema,\n dryRun: z.boolean().optional(),\n })\n .strict();\nexport type AdminResolveUnrosteredStatLineInput = z.infer<typeof AdminResolveUnrosteredStatLineInputSchema>;\n\n// `gameConverts` says whether the game's stats now convert, so the operator knows the copy can run.\nexport const AdminResolveUnrosteredStatLineResultSchema = z\n .object({\n gameId: gameIdSchema,\n userId: userIdSchema,\n teamId: teamIdSchema,\n outcome: z.enum(UNROSTERED_STAT_LINE_RESOLUTION_OUTCOME_KEYS),\n gameConverts: z.boolean(),\n })\n .strict();\nexport type AdminResolveUnrosteredStatLineResult = z.infer<typeof AdminResolveUnrosteredStatLineResultSchema>;\n\n// Every rebuild and every game repair is a repair of a completed record: it takes a reason, runs\n// under an operation id the admin's browser mints when the admin starts it, and offers a dry run that\n// lists each document it would change, with before and after, and writes nothing (BACKEND-212,\n// SPORT-206). A real run resumes from its operation document, so a cursor is taken from the client\n// only to page a dry run, which keeps no operation.\nconst statsRepairFields = {\n reason: repairReasonSchema,\n operationId: statsOperationIdSchema,\n dryRun: z.boolean(),\n resumeAfter: z.string().min(1).optional(),\n};\n\nconst cursorOnlyOnDryRun = (input: { dryRun: boolean; resumeAfter?: string }): boolean =>\n input.dryRun || input.resumeAfter === undefined;\nconst CURSOR_ONLY_ON_DRY_RUN = {\n message: 'A real run resumes from its operation; only a dry run takes a cursor.',\n path: ['resumeAfter'],\n};\n\n// `recalculateLeagueStats`: every team of one league — its standings line and its per-membership rows.\nexport const RecalculateLeagueStatsInputSchema = z\n .object({ leagueId: leagueIdSchema, ...statsRepairFields })\n .strict()\n .refine(cursorOnlyOnDryRun, CURSOR_ONLY_ON_DRY_RUN);\nexport type RecalculateLeagueStatsInput = z.infer<typeof RecalculateLeagueStatsInputSchema>;\n\n// `recalculateAllLeagueStats`: every league, closed ones included, a page of leagues per call.\nexport const RecalculateAllLeagueStatsInputSchema = z\n .object({ ...statsRepairFields })\n .strict()\n .refine(cursorOnlyOnDryRun, CURSOR_ONLY_ON_DRY_RUN);\nexport type RecalculateAllLeagueStatsInput = z.infer<typeof RecalculateAllLeagueStatsInputSchema>;\n\n// `recalculateUserStats`: one person's career line in every sport.\nexport const RecalculateUserStatsInputSchema = z\n .object({ userId: userIdSchema, ...statsRepairFields })\n .strict()\n .refine(cursorOnlyOnDryRun, CURSOR_ONLY_ON_DRY_RUN);\nexport type RecalculateUserStatsInput = z.infer<typeof RecalculateUserStatsInputSchema>;\n\n// `recalculateAllUserStats`: every profile's career lines, a page of profiles per call.\nexport const RecalculateAllUserStatsInputSchema = z\n .object({ ...statsRepairFields })\n .strict()\n .refine(cursorOnlyOnDryRun, CURSOR_ONLY_ON_DRY_RUN);\nexport type RecalculateAllUserStatsInput = z.infer<typeof RecalculateAllUserStatsInputSchema>;\n\n// `recalculateHallOfFame`: one sport's hall of fame — one person's entry, or the whole sport a page\n// of profiles per call. Refused for a sport that keeps none.\nexport const RecalculateHallOfFameInputSchema = z\n .object({ sportKey: sportKeySchema, userId: userIdSchema.optional(), ...statsRepairFields })\n .strict()\n .refine(cursorOnlyOnDryRun, CURSOR_ONLY_ON_DRY_RUN);\nexport type RecalculateHallOfFameInput = z.infer<typeof RecalculateHallOfFameInputSchema>;\n\n// What one call of a rebuild did. `complete` is false while a paged rebuild has pages left: the\n// admin calls again with the same operation id — or, for a dry run, with `resumeAfter` set to\n// `nextResumeAfter`. `changes` is every document this call changed or, on a dry run, would change,\n// up to MAX_STATS_REPAIR_LISTED_CHANGES (`changesTruncated` says more were left out). A game whose\n// stored numbers disagree with its record is named in `stoppedOnGameIds`, and what it feeds is left\n// untouched. `scopeChanged` says a game was finalized or reopened in the scope while it ran, so the\n// admin runs it again.\nexport const StatsRebuildResultSchema = z\n .object({\n operationId: statsOperationIdSchema,\n dryRun: z.boolean(),\n complete: z.boolean(),\n nextResumeAfter: z.string().min(1).nullable(),\n counts: StatsOperationCountsSchema,\n stoppedOnGameIds: z.array(gameIdSchema),\n changes: z.array(StatsDestinationChangeSchema),\n changesTruncated: z.boolean(),\n scopeChanged: z.boolean(),\n })\n .strict();\nexport type StatsRebuildResult = z.infer<typeof StatsRebuildResultSchema>;\n\n// A line a correction sets, by its absolute value: the team line of `teamId`, or the player line\n// `{teamId}_{playerUserId}` when a player is named. Only a field the sport's adapter lists in\n// `correctableFields` may be set.\nexport const GameStatsCorrectionTargetSchema = z\n .object({\n teamId: teamIdSchema,\n playerUserId: userIdSchema.optional(),\n stat: statCounterKeySchema,\n value: countSchema,\n })\n .strict();\nexport type GameStatsCorrectionTarget = z.infer<typeof GameStatsCorrectionTargetSchema>;\n\n// `adminCorrectGameStats`: set named fields of a game's lines to the values given, or keep the\n// numbers the game stores now — a hand edit made outside the app — as corrections. Exactly one of the\n// two.\nexport const AdminCorrectGameStatsInputSchema = z\n .object({\n gameId: gameIdSchema,\n targets: z.array(GameStatsCorrectionTargetSchema).min(1).max(MAX_GAME_STATS_CORRECTION_TARGETS).optional(),\n keepStored: z.literal(true).optional(),\n reason: repairReasonSchema,\n operationId: statsOperationIdSchema,\n dryRun: z.boolean(),\n })\n .strict()\n .refine((input) => (input.targets === undefined) !== (input.keepStored === undefined), {\n message: 'Give the values to set, or keep the stored numbers — one of the two.',\n path: ['targets'],\n });\nexport type AdminCorrectGameStatsInput = z.infer<typeof AdminCorrectGameStatsInputSchema>;\n\n// `recalculateGameStats`: restore a game's numbers from its events, discarding a hand edit.\nexport const RecalculateGameStatsInputSchema = z\n .object({\n gameId: gameIdSchema,\n reason: repairReasonSchema,\n operationId: statsOperationIdSchema,\n dryRun: z.boolean(),\n })\n .strict();\nexport type RecalculateGameStatsInput = z.infer<typeof RecalculateGameStatsInputSchema>;\n\n// One correction a repair appended, or on a dry run would append.\nexport const GameStatsCorrectionSchema = z\n .object({ lineKey: z.string().min(1), field: statCounterKeySchema, value: z.number().int() })\n .strict();\nexport type GameStatsCorrection = z.infer<typeof GameStatsCorrectionSchema>;\n\n// What a game repair did: `reconciled` it changed the game; `unchanged` there was nothing to change;\n// `alreadyApplied` the operation had already committed and this call is its acknowledged retry.\nexport const GameStatsRepairResultSchema = z\n .object({\n gameId: gameIdSchema,\n leagueId: leagueIdSchema,\n operationId: statsOperationIdSchema,\n dryRun: z.boolean(),\n outcome: z.enum(GAME_STATS_REPAIR_OUTCOME_KEYS),\n corrections: z.array(GameStatsCorrectionSchema),\n gameChanged: z.boolean(),\n destinationChanges: z.array(StatsDestinationChangeSchema),\n })\n .strict();\nexport type GameStatsRepairResult = z.infer<typeof GameStatsRepairResultSchema>;\n\n// `adminUpdateHistoricalStats`: a person's pre-Q-Sports career totals for a sport that takes them,\n// written whole, and their career line and hall-of-fame entry rebuilt with them.\nexport const AdminUpdateHistoricalStatsInputSchema = z\n .object({\n userId: userIdSchema,\n sportKey: sportKeySchema,\n stats: HistoricalStatsSchema,\n reason: repairReasonSchema,\n operationId: statsOperationIdSchema,\n dryRun: z.boolean(),\n })\n .strict();\nexport type AdminUpdateHistoricalStatsInput = z.infer<typeof AdminUpdateHistoricalStatsInputSchema>;\n\nexport const AdminUpdateHistoricalStatsResultSchema = z\n .object({\n userId: userIdSchema,\n sportKey: sportKeySchema,\n operationId: statsOperationIdSchema,\n dryRun: z.boolean(),\n outcome: z.enum(GAME_STATS_REPAIR_OUTCOME_KEYS),\n baselineBefore: HistoricalStatsSchema.nullable(),\n stoppedOnGameIds: z.array(gameIdSchema),\n changes: z.array(StatsDestinationChangeSchema),\n })\n .strict();\nexport type AdminUpdateHistoricalStatsResult = z.infer<typeof AdminUpdateHistoricalStatsResultSchema>;\n\n// `runStatsValidation`: check one game, one league, or — with neither — everything. A check that\n// reaches its time budget saves its place on its operation and answers `complete: false`; calling\n// again with the same operation id resumes it. It writes no stat, so it takes no reason.\nexport const RunStatsValidationInputSchema = z\n .object({ operationId: statsOperationIdSchema, scope: StatsValidationScopeSchema })\n .strict();\nexport type RunStatsValidationInput = z.infer<typeof RunStatsValidationInputSchema>;\n\nexport const RunStatsValidationResultSchema = z\n .object({\n reportId: z.string().min(1),\n complete: z.boolean(),\n summary: StatsValidationSummarySchema,\n discrepancyCounts: StatsValidationReportSchema.shape.discrepancyCounts,\n })\n .strict();\nexport type RunStatsValidationResult = z.infer<typeof RunStatsValidationResultSchema>;\n\n// `adminDeleteStatsValidationReport`: delete one stats check's report. It writes no stat, so it takes\n// no reason; a report that is not there is refused as not found.\nexport const AdminDeleteStatsValidationReportInputSchema = z\n .object({ reportId: statsValidationReportIdSchema })\n .strict();\nexport type AdminDeleteStatsValidationReportInput = z.infer<typeof AdminDeleteStatsValidationReportInputSchema>;\n\nexport const AdminDeleteStatsValidationReportResultSchema = z\n .object({ reportId: statsValidationReportIdSchema })\n .strict();\nexport type AdminDeleteStatsValidationReportResult = z.infer<typeof AdminDeleteStatsValidationReportResultSchema>;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"team-joining.js","sourceRoot":"","sources":["../../src/schemas/team-joining.ts"],"names":[],"mappings":"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","sourcesContent":["// Callable contracts for the ways onto a team: an invitation the team sends, a join request the\r\n// player sends, and a free-agent signup an admin answers by placing the player. Every door that\r\n// makes a membership ends in the membership core. The acting user is always `request.auth.uid` —\r\n// never an input field (ARCH-106) — and the entry, never a field of the payload, decides the\r\n// authority (BACKEND-004): each action is its own callable, never a choice made by a payload field\r\n// (BACKEND-305).\r\n\r\nimport { z } from 'zod';\r\nimport { membershipRosterSyncStatusSchema } from '../doc-schemas/atoms.js';\r\nimport {\r\n epochMsSchema,\r\n leagueIdSchema,\r\n teamIdSchema,\r\n teamInvitationIdSchema,\r\n teamInvitationMessageSchema,\r\n teamJoinRequestIdSchema,\r\n teamJoinRequestMessageSchema,\r\n userIdSchema,\r\n} from './atoms.js';\r\n\r\n// ---------------------------------------------------------------------------------------------\r\n// Invitations — sent and withdrawn by the team's captain or a co-captain (`createTeamInvitation`,\r\n// `cancelTeamInvitation`) or by an admin (`adminCreateTeamInvitation`, `adminCancelTeamInvitation`);\r\n// accepted or declined by the invitee alone (`acceptTeamInvitation`, `rejectTeamInvitation`).\r\n// ---------------------------------------------------------------------------------------------\r\n\r\nexport const CreateTeamInvitationInputSchema = z\r\n .object({ teamId: teamIdSchema, invitedUserId: userIdSchema, message: teamInvitationMessageSchema })\r\n .strict();\r\nexport type CreateTeamInvitationInput = z.infer<typeof CreateTeamInvitationInputSchema>;\r\n\r\n// Names the invitation a cancel, an acceptance, or a decline acts on.\r\nexport const TeamInvitationTargetInputSchema = z.object({ teamInvitationId: teamInvitationIdSchema }).strict();\r\nexport type TeamInvitationTargetInput = z.infer<typeof TeamInvitationTargetInputSchema>;\r\n\r\n// What sending, cancelling, and declining answer with: the invitation and the ids a client names in\r\n// its domain event.\r\nexport const TeamInvitationResultSchema = z\r\n .object({\r\n leagueId: leagueIdSchema,\r\n teamId: teamIdSchema,\r\n teamInvitationId: teamInvitationIdSchema,\r\n invitedUserId: userIdSchema,\r\n })\r\n .strict();\r\nexport type TeamInvitationResult = z.infer<typeof TeamInvitationResultSchema>;\r\n\r\n// `rosterSyncStatus` is where the new membership's roster work stood when the call returned: the\r\n// membership is committed either way, and `pending` finishes in the background.\r\nexport const AcceptTeamInvitationResultSchema = TeamInvitationResultSchema.extend({\r\n rosterSyncStatus: membershipRosterSyncStatusSchema,\r\n}).strict();\r\nexport type AcceptTeamInvitationResult = z.infer<typeof AcceptTeamInvitationResultSchema>;\r\n\r\n// ---------------------------------------------------------------------------------------------\r\n// Join requests — sent and withdrawn by the player (`createTeamJoinRequest`,\r\n// `cancelTeamJoinRequest`); accepted or rejected by the team's captain or a co-captain\r\n// (`acceptTeamJoinRequest`, `rejectTeamJoinRequest`) or by an admin (`adminAcceptTeamJoinRequest`,\r\n// `adminRejectTeamJoinRequest`).\r\n// ---------------------------------------------------------------------------------------------\r\n\r\nexport const CreateTeamJoinRequestInputSchema = z\r\n .object({ teamId: teamIdSchema, message: teamJoinRequestMessageSchema })\r\n .strict();\r\nexport type CreateTeamJoinRequestInput = z.infer<typeof CreateTeamJoinRequestInputSchema>;\r\n\r\n// Names the join request a cancel, an acceptance, or a rejection acts on.\r\nexport const TeamJoinRequestTargetInputSchema = z.object({ teamJoinRequestId: teamJoinRequestIdSchema }).strict();\r\nexport type TeamJoinRequestTargetInput = z.infer<typeof TeamJoinRequestTargetInputSchema>;\r\n\r\nexport const TeamJoinRequestResultSchema = z\r\n .object({\r\n leagueId: leagueIdSchema,\r\n teamId: teamIdSchema,\r\n teamJoinRequestId: teamJoinRequestIdSchema,\r\n userId: userIdSchema,\r\n })\r\n .strict();\r\nexport type TeamJoinRequestResult = z.infer<typeof TeamJoinRequestResultSchema>;\r\n\r\nexport const AcceptTeamJoinRequestResultSchema = TeamJoinRequestResultSchema.extend({\r\n rosterSyncStatus: membershipRosterSyncStatusSchema,\r\n}).strict();\r\nexport type AcceptTeamJoinRequestResult = z.infer<typeof AcceptTeamJoinRequestResultSchema>;\r\n\r\n// ---------------------------------------------------------------------------------------------\r\n// Free agents — a player signs up in a league (`createLeagueFreeAgent`) or withdraws\r\n// (`deleteLeagueFreeAgent`); an admin places a signed-up player on a team\r\n// (`adminAssignLeagueFreeAgent`).\r\n// ---------------------------------------------------------------------------------------------\r\n\r\n// The league a player signs up in, or withdraws from. The player is the caller.\r\nexport const LeagueFreeAgentInputSchema = z.object({ leagueId: leagueIdSchema }).strict();\r\nexport type LeagueFreeAgentInput = z.infer<typeof LeagueFreeAgentInputSchema>;\r\n\r\n// `createdAt` is the signup's own moment: a repeated signup answers the one already on record.\r\nexport const CreateLeagueFreeAgentResultSchema = z\r\n .object({ leagueId: leagueIdSchema, userId: userIdSchema, createdAt: epochMsSchema })\r\n .strict();\r\nexport type CreateLeagueFreeAgentResult = z.infer<typeof CreateLeagueFreeAgentResultSchema>;\r\n\r\n// `deleted` is false when no signup was on record — a repeated withdrawal changes nothing.\r\nexport const DeleteLeagueFreeAgentResultSchema = z\r\n .object({ leagueId: leagueIdSchema, userId: userIdSchema, deleted: z.boolean() })\r\n .strict();\r\nexport type DeleteLeagueFreeAgentResult = z.infer<typeof DeleteLeagueFreeAgentResultSchema>;\r\n\r\nexport const AdminAssignLeagueFreeAgentInputSchema = z\r\n .object({ leagueId: leagueIdSchema, userId: userIdSchema, teamId: teamIdSchema })\r\n .strict();\r\nexport type AdminAssignLeagueFreeAgentInput = z.infer<typeof AdminAssignLeagueFreeAgentInputSchema>;\r\n\r\nexport const AdminAssignLeagueFreeAgentResultSchema = z\r\n .object({\r\n leagueId: leagueIdSchema,\r\n teamId: teamIdSchema,\r\n userId: userIdSchema,\r\n rosterSyncStatus: membershipRosterSyncStatusSchema,\r\n })\r\n .strict();\r\nexport type AdminAssignLeagueFreeAgentResult = z.infer<typeof AdminAssignLeagueFreeAgentResultSchema>;\r\n"]}
1
+ {"version":3,"file":"team-joining.js","sourceRoot":"","sources":["../../src/schemas/team-joining.ts"],"names":[],"mappings":"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","sourcesContent":["// Callable contracts for the ways onto a team: an invitation the team sends, a join request the\n// player sends, and a free-agent signup an admin answers by placing the player. Every door that\n// makes a membership ends in the membership core. The acting user is always `request.auth.uid` —\n// never an input field (ARCH-106) — and the entry, never a field of the payload, decides the\n// authority (BACKEND-004): each action is its own callable, never a choice made by a payload field\n// (BACKEND-305).\n\nimport { z } from 'zod';\nimport { membershipRosterSyncStatusSchema } from '../doc-schemas/atoms.js';\nimport {\n epochMsSchema,\n leagueIdSchema,\n teamIdSchema,\n teamInvitationIdSchema,\n teamInvitationMessageSchema,\n teamJoinRequestIdSchema,\n teamJoinRequestMessageSchema,\n userIdSchema,\n} from './atoms.js';\n\n// ---------------------------------------------------------------------------------------------\n// Invitations — sent and withdrawn by the team's captain or a co-captain (`createTeamInvitation`,\n// `cancelTeamInvitation`) or by an admin (`adminCreateTeamInvitation`, `adminCancelTeamInvitation`);\n// accepted or declined by the invitee alone (`acceptTeamInvitation`, `rejectTeamInvitation`).\n// ---------------------------------------------------------------------------------------------\n\nexport const CreateTeamInvitationInputSchema = z\n .object({ teamId: teamIdSchema, invitedUserId: userIdSchema, message: teamInvitationMessageSchema })\n .strict();\nexport type CreateTeamInvitationInput = z.infer<typeof CreateTeamInvitationInputSchema>;\n\n// Names the invitation a cancel, an acceptance, or a decline acts on.\nexport const TeamInvitationTargetInputSchema = z.object({ teamInvitationId: teamInvitationIdSchema }).strict();\nexport type TeamInvitationTargetInput = z.infer<typeof TeamInvitationTargetInputSchema>;\n\n// What sending, cancelling, and declining answer with: the invitation and the ids a client names in\n// its domain event.\nexport const TeamInvitationResultSchema = z\n .object({\n leagueId: leagueIdSchema,\n teamId: teamIdSchema,\n teamInvitationId: teamInvitationIdSchema,\n invitedUserId: userIdSchema,\n })\n .strict();\nexport type TeamInvitationResult = z.infer<typeof TeamInvitationResultSchema>;\n\n// `rosterSyncStatus` is where the new membership's roster work stood when the call returned: the\n// membership is committed either way, and `pending` finishes in the background.\nexport const AcceptTeamInvitationResultSchema = TeamInvitationResultSchema.extend({\n rosterSyncStatus: membershipRosterSyncStatusSchema,\n}).strict();\nexport type AcceptTeamInvitationResult = z.infer<typeof AcceptTeamInvitationResultSchema>;\n\n// ---------------------------------------------------------------------------------------------\n// Join requests — sent and withdrawn by the player (`createTeamJoinRequest`,\n// `cancelTeamJoinRequest`); accepted or rejected by the team's captain or a co-captain\n// (`acceptTeamJoinRequest`, `rejectTeamJoinRequest`) or by an admin (`adminAcceptTeamJoinRequest`,\n// `adminRejectTeamJoinRequest`).\n// ---------------------------------------------------------------------------------------------\n\nexport const CreateTeamJoinRequestInputSchema = z\n .object({ teamId: teamIdSchema, message: teamJoinRequestMessageSchema })\n .strict();\nexport type CreateTeamJoinRequestInput = z.infer<typeof CreateTeamJoinRequestInputSchema>;\n\n// Names the join request a cancel, an acceptance, or a rejection acts on.\nexport const TeamJoinRequestTargetInputSchema = z.object({ teamJoinRequestId: teamJoinRequestIdSchema }).strict();\nexport type TeamJoinRequestTargetInput = z.infer<typeof TeamJoinRequestTargetInputSchema>;\n\nexport const TeamJoinRequestResultSchema = z\n .object({\n leagueId: leagueIdSchema,\n teamId: teamIdSchema,\n teamJoinRequestId: teamJoinRequestIdSchema,\n userId: userIdSchema,\n })\n .strict();\nexport type TeamJoinRequestResult = z.infer<typeof TeamJoinRequestResultSchema>;\n\nexport const AcceptTeamJoinRequestResultSchema = TeamJoinRequestResultSchema.extend({\n rosterSyncStatus: membershipRosterSyncStatusSchema,\n}).strict();\nexport type AcceptTeamJoinRequestResult = z.infer<typeof AcceptTeamJoinRequestResultSchema>;\n\n// ---------------------------------------------------------------------------------------------\n// Free agents — a player signs up in a league (`createLeagueFreeAgent`) or withdraws\n// (`deleteLeagueFreeAgent`); an admin places a signed-up player on a team\n// (`adminAssignLeagueFreeAgent`).\n// ---------------------------------------------------------------------------------------------\n\n// The league a player signs up in, or withdraws from. The player is the caller.\nexport const LeagueFreeAgentInputSchema = z.object({ leagueId: leagueIdSchema }).strict();\nexport type LeagueFreeAgentInput = z.infer<typeof LeagueFreeAgentInputSchema>;\n\n// `createdAt` is the signup's own moment: a repeated signup answers the one already on record.\nexport const CreateLeagueFreeAgentResultSchema = z\n .object({ leagueId: leagueIdSchema, userId: userIdSchema, createdAt: epochMsSchema })\n .strict();\nexport type CreateLeagueFreeAgentResult = z.infer<typeof CreateLeagueFreeAgentResultSchema>;\n\n// `deleted` is false when no signup was on record — a repeated withdrawal changes nothing.\nexport const DeleteLeagueFreeAgentResultSchema = z\n .object({ leagueId: leagueIdSchema, userId: userIdSchema, deleted: z.boolean() })\n .strict();\nexport type DeleteLeagueFreeAgentResult = z.infer<typeof DeleteLeagueFreeAgentResultSchema>;\n\nexport const AdminAssignLeagueFreeAgentInputSchema = z\n .object({ leagueId: leagueIdSchema, userId: userIdSchema, teamId: teamIdSchema })\n .strict();\nexport type AdminAssignLeagueFreeAgentInput = z.infer<typeof AdminAssignLeagueFreeAgentInputSchema>;\n\nexport const AdminAssignLeagueFreeAgentResultSchema = z\n .object({\n leagueId: leagueIdSchema,\n teamId: teamIdSchema,\n userId: userIdSchema,\n rosterSyncStatus: membershipRosterSyncStatusSchema,\n })\n .strict();\nexport type AdminAssignLeagueFreeAgentResult = z.infer<typeof AdminAssignLeagueFreeAgentResultSchema>;\n"]}
@@ -256,15 +256,18 @@ export declare const CreateLeagueTeamResultSchema: z.ZodObject<{
256
256
  captainUserId: z.ZodString;
257
257
  }, z.core.$strict>;
258
258
  export type CreateLeagueTeamResult = z.infer<typeof CreateLeagueTeamResultSchema>;
259
+ export declare const ghostCreateRequestIdSchema: z.ZodString;
259
260
  export declare const CreateTeamGhostPlayerInputSchema: z.ZodObject<{
260
261
  teamId: z.ZodString;
261
262
  displayName: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
263
+ requestId: z.ZodString;
262
264
  }, z.core.$strict>;
263
265
  export type CreateTeamGhostPlayerInput = z.infer<typeof CreateTeamGhostPlayerInputSchema>;
264
266
  export declare const CreateGameGhostPlayerInputSchema: z.ZodObject<{
265
267
  gameId: z.ZodString;
266
268
  teamId: z.ZodString;
267
269
  displayName: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
270
+ requestId: z.ZodString;
268
271
  }, z.core.$strict>;
269
272
  export type CreateGameGhostPlayerInput = z.infer<typeof CreateGameGhostPlayerInputSchema>;
270
273
  export declare const CreateGhostPlayerResultSchema: z.ZodObject<{
@@ -322,7 +325,6 @@ export declare const LinkGhostPlayerInputSchema: z.ZodObject<{
322
325
  teamId: z.ZodString;
323
326
  ghostUserId: z.ZodString;
324
327
  userId: z.ZodString;
325
- reason: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
326
328
  }, z.core.$strict>;
327
329
  export type LinkGhostPlayerInput = z.infer<typeof LinkGhostPlayerInputSchema>;
328
330
  export declare const LinkGhostPlayerResultSchema: z.ZodObject<{
@@ -345,7 +347,6 @@ export declare const AdminLinkClosedLeagueGhostPlayerInputSchema: z.ZodObject<{
345
347
  teamId: z.ZodString;
346
348
  ghostUserId: z.ZodString;
347
349
  userId: z.ZodString;
348
- reason: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
349
350
  }, z.core.$strict>;
350
351
  export type AdminLinkClosedLeagueGhostPlayerInput = LinkGhostPlayerInput;
351
352
  export declare const AdminLinkClosedLeagueGhostPlayerResultSchema: z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../src/schemas/teams.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../src/schemas/teams.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,12 @@
3
3
  // (BACKEND-004); an admin entry's schema adds only what its authority needs.
4
4
  import { z } from 'zod';
5
5
  import { leagueJoinWarningActedOnSchema, leagueJoinWarningFindingSchema, } from '../utils/league-join-warning.js';
6
- import { membershipRosterSyncStatusSchema } from '../doc-schemas/atoms.js';
7
- import { isGhostUserId } from '../ids/minted-ids.js';
6
+ import { documentIdSegmentSchema, membershipRosterSyncStatusSchema } from '../doc-schemas/atoms.js';
7
+ import { buildGhostUserIdForRequest, isGhostUserId } from '../ids/minted-ids.js';
8
+ import { isDocumentIdSegment } from '../paths/utils.js';
8
9
  import { GHOST_LINK_MEMBERSHIP_OUTCOME_KEYS } from '../types/stats.js';
9
10
  import { MEMBER_ASSIGNABLE_TEAM_ROLES } from '../types/unions.js';
10
- import { contactPhoneSchema, countSchema, displayNameSchema, gameIdSchema, leagueIdSchema, repairReasonSchema, teamIconSchema, teamIdSchema, teamNameSchema, teamRoleSchema, teamTypeSchema, userIdSchema, } from './atoms.js';
11
+ import { contactPhoneSchema, countSchema, displayNameSchema, gameIdSchema, leagueIdSchema, teamIconSchema, teamIdSchema, teamNameSchema, teamRoleSchema, teamTypeSchema, userIdSchema, } from './atoms.js';
11
12
  // ---------------------------------------------------------------------------------------------
12
13
  // Team creation — `createLeagueTeam` (the creator becomes captain) and `adminCreateLeagueTeam`
13
14
  // (an admin creates the team with a newly minted ghost captain). Both write the team's contact
@@ -31,13 +32,22 @@ export const CreateLeagueTeamResultSchema = z
31
32
  // Ghost add — one core behind two doors. The team page door (`createTeamGhostPlayer` /
32
33
  // `adminCreateTeamGhostPlayer`) needs authority over the team; the game page door
33
34
  // (`createGameGhostPlayer` / `adminCreateGameGhostPlayer`) needs scoring authority over the game
34
- // and adds to one of its two teams. The ghost id is always minted by the server.
35
+ // and adds to one of its two teams. The ghost id is derived by the server from the add's
36
+ // `requestId`, which the client mints once when the add starts and re-sends on every retry, so a
37
+ // retry after an unknown outcome is recognised as the same add (`buildGhostUserIdForRequest`).
35
38
  // ---------------------------------------------------------------------------------------------
39
+ // One document-id segment (ARCH-106), short enough that the ghost id derived from it is one too.
40
+ export const ghostCreateRequestIdSchema = documentIdSegmentSchema.refine((requestId) => isDocumentIdSegment(buildGhostUserIdForRequest(requestId)), 'Not a ghost add request id.');
36
41
  export const CreateTeamGhostPlayerInputSchema = z
37
- .object({ teamId: teamIdSchema, displayName: displayNameSchema })
42
+ .object({ teamId: teamIdSchema, displayName: displayNameSchema, requestId: ghostCreateRequestIdSchema })
38
43
  .strict();
39
44
  export const CreateGameGhostPlayerInputSchema = z
40
- .object({ gameId: gameIdSchema, teamId: teamIdSchema, displayName: displayNameSchema })
45
+ .object({
46
+ gameId: gameIdSchema,
47
+ teamId: teamIdSchema,
48
+ displayName: displayNameSchema,
49
+ requestId: ghostCreateRequestIdSchema,
50
+ })
41
51
  .strict();
42
52
  // `rosterSyncStatus` is where the new membership's roster work stood when the call returned: the
43
53
  // membership is committed either way, and `pending` finishes in the background.
@@ -88,8 +98,9 @@ export const AdminRetryLeagueTeamRosterSyncResultSchema = z
88
98
  .strict();
89
99
  // ---------------------------------------------------------------------------------------------
90
100
  // Linking a ghost to a real account — `linkGhostPlayerToUser` in a league that is not closed, and
91
- // `adminLinkClosedLeagueGhostPlayer` in a closed one. Both are admin-only, act on one team, and take
92
- // a reason, because a link rewrites completed records (BACKEND-212). The ghost and the account are
101
+ // `adminLinkClosedLeagueGhostPlayer` in a closed one. Both are admin-only and act on one team. A link
102
+ // takes no reason: the admin chooses the account and confirms, and the link's audit event records
103
+ // who linked which ghost to whom and what moved (BACKEND-212). The ghost and the account are
93
104
  // ids the core checks itself, so a ghost id named as the account, or a real id named as the ghost,
94
105
  // is refused with a failure record rather than at the parse. Every name the link records is read
95
106
  // server-side, never sent.
@@ -99,7 +110,6 @@ export const LinkGhostPlayerInputSchema = z
99
110
  teamId: teamIdSchema,
100
111
  ghostUserId: userIdSchema,
101
112
  userId: userIdSchema,
102
- reason: repairReasonSchema,
103
113
  })
104
114
  .strict();
105
115
  // `complete` is false when the call ran out of time part-way: the link stays under way, and the same