@openora/core 0.4.1-canary.152 → 0.4.1-canary.154
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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/admin-console/__tests__/backoffice.service.int.test.js +20 -3
- package/dist/admin-console/__tests__/backoffice.service.int.test.js.map +1 -1
- package/dist/audit/__tests__/map-event.test.js +46 -0
- package/dist/audit/__tests__/map-event.test.js.map +1 -1
- package/dist/audit/plugin.d.ts.map +1 -1
- package/dist/audit/plugin.js +74 -1
- package/dist/audit/plugin.js.map +1 -1
- package/dist/audit/service/audit.service.d.ts.map +1 -1
- package/dist/audit/service/audit.service.js +1 -6
- package/dist/audit/service/audit.service.js.map +1 -1
- package/dist/casino/gaming/__tests__/admin-reporting.int.test.js +20 -3
- package/dist/casino/gaming/__tests__/admin-reporting.int.test.js.map +1 -1
- package/dist/casino/gaming/__tests__/game-category.service.int.test.d.ts +2 -0
- package/dist/casino/gaming/__tests__/game-category.service.int.test.d.ts.map +1 -0
- package/dist/casino/gaming/__tests__/game-category.service.int.test.js +134 -0
- package/dist/casino/gaming/__tests__/game-category.service.int.test.js.map +1 -0
- package/dist/casino/gaming/__tests__/game-provider.service.int.test.d.ts +2 -0
- package/dist/casino/gaming/__tests__/game-provider.service.int.test.d.ts.map +1 -0
- package/dist/casino/gaming/__tests__/game-provider.service.int.test.js +274 -0
- package/dist/casino/gaming/__tests__/game-provider.service.int.test.js.map +1 -0
- package/dist/casino/gaming/__tests__/gaming-catalog-admin.router.int.test.d.ts +2 -0
- package/dist/casino/gaming/__tests__/gaming-catalog-admin.router.int.test.d.ts.map +1 -0
- package/dist/casino/gaming/__tests__/gaming-catalog-admin.router.int.test.js +174 -0
- package/dist/casino/gaming/__tests__/gaming-catalog-admin.router.int.test.js.map +1 -0
- package/dist/casino/gaming/__tests__/gaming-migration.int.test.d.ts +2 -0
- package/dist/casino/gaming/__tests__/gaming-migration.int.test.d.ts.map +1 -0
- package/dist/casino/gaming/__tests__/gaming-migration.int.test.js +171 -0
- package/dist/casino/gaming/__tests__/gaming-migration.int.test.js.map +1 -0
- package/dist/casino/gaming/__tests__/gaming.service.int.test.js +274 -13
- package/dist/casino/gaming/__tests__/gaming.service.int.test.js.map +1 -1
- package/dist/casino/gaming/contract/index.d.ts +520 -18
- package/dist/casino/gaming/contract/index.d.ts.map +1 -1
- package/dist/casino/gaming/contract/index.js +167 -4
- package/dist/casino/gaming/contract/index.js.map +1 -1
- package/dist/casino/gaming/drizzle/migrations/0005_natural_thunderbolt_ross.sql +223 -0
- package/dist/casino/gaming/drizzle/migrations/meta/0005_snapshot.json +680 -0
- package/dist/casino/gaming/drizzle/migrations/meta/_journal.json +7 -0
- package/dist/casino/gaming/plugin.d.ts.map +1 -1
- package/dist/casino/gaming/plugin.js +9 -2
- package/dist/casino/gaming/plugin.js.map +1 -1
- package/dist/casino/gaming/router/index.d.ts +372 -18
- package/dist/casino/gaming/router/index.d.ts.map +1 -1
- package/dist/casino/gaming/router/index.js +62 -6
- package/dist/casino/gaming/router/index.js.map +1 -1
- package/dist/casino/gaming/schema/index.d.ts +499 -4
- package/dist/casino/gaming/schema/index.d.ts.map +1 -1
- package/dist/casino/gaming/schema/index.js +72 -6
- package/dist/casino/gaming/schema/index.js.map +1 -1
- package/dist/casino/gaming/service/game-category.service.d.ts +109 -0
- package/dist/casino/gaming/service/game-category.service.d.ts.map +1 -0
- package/dist/casino/gaming/service/game-category.service.js +176 -0
- package/dist/casino/gaming/service/game-category.service.js.map +1 -0
- package/dist/casino/gaming/service/game-provider.service.d.ts +118 -0
- package/dist/casino/gaming/service/game-provider.service.d.ts.map +1 -0
- package/dist/casino/gaming/service/game-provider.service.js +251 -0
- package/dist/casino/gaming/service/game-provider.service.js.map +1 -0
- package/dist/casino/gaming/service/gaming.service.d.ts +122 -14
- package/dist/casino/gaming/service/gaming.service.d.ts.map +1 -1
- package/dist/casino/gaming/service/gaming.service.js +189 -23
- package/dist/casino/gaming/service/gaming.service.js.map +1 -1
- package/dist/casino/lobby/__tests__/lobby.cache.int.test.js +137 -4
- package/dist/casino/lobby/__tests__/lobby.cache.int.test.js.map +1 -1
- package/dist/casino/lobby/contract/index.d.ts +68 -8
- package/dist/casino/lobby/contract/index.d.ts.map +1 -1
- package/dist/casino/lobby/contract/index.js +4 -3
- package/dist/casino/lobby/contract/index.js.map +1 -1
- package/dist/casino/lobby/router/index.d.ts +34 -4
- package/dist/casino/lobby/router/index.d.ts.map +1 -1
- package/dist/casino/lobby/service/lobby.service.d.ts +34 -4
- package/dist/casino/lobby/service/lobby.service.d.ts.map +1 -1
- package/dist/casino/lobby/service/lobby.service.js +60 -26
- package/dist/casino/lobby/service/lobby.service.js.map +1 -1
- package/dist/casino/shared/game-catalog.d.ts +32 -0
- package/dist/casino/shared/game-catalog.d.ts.map +1 -0
- package/dist/casino/shared/game-catalog.js +67 -0
- package/dist/casino/shared/game-catalog.js.map +1 -0
- package/dist/compliance/__tests__/compliance.service.int.test.js +248 -25
- package/dist/compliance/__tests__/compliance.service.int.test.js.map +1 -1
- package/dist/compliance/__tests__/regulatory-overview.router.int.test.d.ts +2 -0
- package/dist/compliance/__tests__/regulatory-overview.router.int.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/regulatory-overview.router.int.test.js +102 -0
- package/dist/compliance/__tests__/regulatory-overview.router.int.test.js.map +1 -0
- package/dist/compliance/__tests__/rg-monitoring.service.int.test.js +17 -3
- package/dist/compliance/__tests__/rg-monitoring.service.int.test.js.map +1 -1
- package/dist/compliance/__tests__/rg-self-service.int.test.js +2 -2
- package/dist/compliance/__tests__/rg-self-service.int.test.js.map +1 -1
- package/dist/compliance/contract/index.d.ts +77 -2
- package/dist/compliance/contract/index.d.ts.map +1 -1
- package/dist/compliance/contract/index.js +50 -1
- package/dist/compliance/contract/index.js.map +1 -1
- package/dist/compliance/drizzle/migrations/0008_omniscient_northstar.sql +14 -0
- package/dist/compliance/drizzle/migrations/meta/0008_snapshot.json +870 -0
- package/dist/compliance/drizzle/migrations/meta/_journal.json +7 -0
- package/dist/compliance/plugin.d.ts.map +1 -1
- package/dist/compliance/plugin.js +2 -2
- package/dist/compliance/plugin.js.map +1 -1
- package/dist/compliance/router/index.d.ts +43 -1
- package/dist/compliance/router/index.d.ts.map +1 -1
- package/dist/compliance/router/index.js +32 -4
- package/dist/compliance/router/index.js.map +1 -1
- package/dist/compliance/schema/index.d.ts +181 -2
- package/dist/compliance/schema/index.d.ts.map +1 -1
- package/dist/compliance/schema/index.js +15 -2
- package/dist/compliance/schema/index.js.map +1 -1
- package/dist/compliance/server.d.ts +1 -1
- package/dist/compliance/server.d.ts.map +1 -1
- package/dist/compliance/server.js +1 -1
- package/dist/compliance/server.js.map +1 -1
- package/dist/compliance/service/compliance.service.d.ts +61 -14
- package/dist/compliance/service/compliance.service.d.ts.map +1 -1
- package/dist/compliance/service/compliance.service.js +226 -30
- package/dist/compliance/service/compliance.service.js.map +1 -1
- package/dist/contracts/__tests__/kit.test.js +21 -1
- package/dist/contracts/__tests__/kit.test.js.map +1 -1
- package/dist/contracts/adapters/audit.d.ts +1 -1
- package/dist/contracts/adapters/audit.d.ts.map +1 -1
- package/dist/contracts/adapters/audit.js.map +1 -1
- package/dist/contracts/kit.d.ts +3 -0
- package/dist/contracts/kit.d.ts.map +1 -1
- package/dist/contracts/kit.js +8 -0
- package/dist/contracts/kit.js.map +1 -1
- package/dist/contracts/schemas/__tests__/events.test.js +7 -0
- package/dist/contracts/schemas/__tests__/events.test.js.map +1 -1
- package/dist/contracts/schemas/__tests__/game-schemas.test.d.ts +2 -0
- package/dist/contracts/schemas/__tests__/game-schemas.test.d.ts.map +1 -0
- package/dist/contracts/schemas/__tests__/game-schemas.test.js +43 -0
- package/dist/contracts/schemas/__tests__/game-schemas.test.js.map +1 -0
- package/dist/contracts/schemas/events.d.ts +109 -0
- package/dist/contracts/schemas/events.d.ts.map +1 -1
- package/dist/contracts/schemas/events.js +87 -3
- package/dist/contracts/schemas/events.js.map +1 -1
- package/dist/contracts/schemas/game.d.ts +39 -0
- package/dist/contracts/schemas/game.d.ts.map +1 -1
- package/dist/contracts/schemas/game.js +32 -0
- package/dist/contracts/schemas/game.js.map +1 -1
- package/dist/contracts/schemas/iam.d.ts +2 -1
- package/dist/contracts/schemas/iam.d.ts.map +1 -1
- package/dist/contracts/schemas/iam.js +2 -1
- package/dist/contracts/schemas/iam.js.map +1 -1
- package/dist/iam/seed/data/default-admin-roles.d.ts.map +1 -1
- package/dist/iam/seed/data/default-admin-roles.js +1 -0
- package/dist/iam/seed/data/default-admin-roles.js.map +1 -1
- package/dist/iam/service/iam.service.d.ts +1 -1
- package/dist/react/client.d.ts +2 -1
- package/dist/react/client.d.ts.map +1 -1
- package/dist/react/client.js +2 -1
- package/dist/react/client.js.map +1 -1
- package/dist/server/auth/permissions.d.ts +24 -12
- package/dist/server/auth/permissions.d.ts.map +1 -1
- package/dist/server/auth/permissions.js +2 -1
- package/dist/server/auth/permissions.js.map +1 -1
- package/dist/server/db/__tests__/query-helpers.test.js +47 -1
- package/dist/server/db/__tests__/query-helpers.test.js.map +1 -1
- package/dist/server/db/index.d.ts +1 -1
- package/dist/server/db/index.d.ts.map +1 -1
- package/dist/server/db/index.js +1 -1
- package/dist/server/db/index.js.map +1 -1
- package/dist/server/db/query-helpers.d.ts +5 -0
- package/dist/server/db/query-helpers.d.ts.map +1 -1
- package/dist/server/db/query-helpers.js +37 -0
- package/dist/server/db/query-helpers.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
import { oc } from '@orpc/contract';
|
|
2
2
|
import * as z from 'zod';
|
|
3
|
-
import { CurrencyCodeSchema, GameTypeSchema, IdInputSchema, MoneyAmountSchema, UuidSchema, } from '@openora/core/contracts';
|
|
3
|
+
import { CurrencyCodeSchema, GameCategoryNameSchema, GameCategorySummaryWithTranslationsSchema, GameCategoryTranslationsSchema, GameProviderAggregatorMappingSchema, GameProviderSummarySchema, GameTypeSchema, IdInputSchema, MoneyAmountSchema, PageQuerySchema, QueryBooleanSchema, TimestampSchema, UuidSchema, createKebabSlugSchema, paginated, } from '@openora/core/contracts';
|
|
4
4
|
export { GameTypeSchema } from '@openora/core/contracts';
|
|
5
|
+
export { GameProviderSummarySchema } from '@openora/core/contracts';
|
|
6
|
+
export { GameProviderAggregatorMappingSchema } from '@openora/core/contracts';
|
|
7
|
+
export { GameCategorySummarySchema } from '@openora/core/contracts';
|
|
8
|
+
export { GameCategorySummaryWithTranslationsSchema } from '@openora/core/contracts';
|
|
9
|
+
export { GameCategoryTranslationsSchema } from '@openora/core/contracts';
|
|
5
10
|
export const GAME_ROUND_STATUSES = ['active', 'completed', 'cancelled'];
|
|
6
11
|
export const GameRoundStatusSchema = z.enum(GAME_ROUND_STATUSES);
|
|
7
12
|
export const GameSchema = z.object({
|
|
8
13
|
id: UuidSchema,
|
|
9
14
|
name: z.string(),
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
slug: z.string(),
|
|
16
|
+
provider: GameProviderSummarySchema,
|
|
17
|
+
// Source channel code (eg 'eventmatrix'); 'direct' = directly integrated.
|
|
18
|
+
aggregator: z.string(),
|
|
19
|
+
categories: z.array(GameCategorySummaryWithTranslationsSchema),
|
|
12
20
|
gameType: GameTypeSchema,
|
|
13
21
|
thumbnailUrl: z.string().nullable(),
|
|
14
22
|
isActive: z.boolean(),
|
|
@@ -47,8 +55,20 @@ export const EndRoundOutputSchema = z.object({
|
|
|
47
55
|
// number: the player never sends it and cannot influence it.
|
|
48
56
|
winAmount: MoneyAmountSchema,
|
|
49
57
|
});
|
|
58
|
+
const CatalogQueryBaseSchema = z.object({
|
|
59
|
+
...PageQuerySchema.shape,
|
|
60
|
+
q: z.string().trim().min(1).max(64).optional(),
|
|
61
|
+
});
|
|
62
|
+
export const ListGamesInputSchema = CatalogQueryBaseSchema.extend({
|
|
63
|
+
providerId: UuidSchema.optional(),
|
|
64
|
+
categoryId: UuidSchema.optional(),
|
|
65
|
+
});
|
|
66
|
+
export const CatalogSlugSchema = createKebabSlugSchema(64);
|
|
50
67
|
export const gamingContract = {
|
|
51
|
-
listGames: oc
|
|
68
|
+
listGames: oc
|
|
69
|
+
.route({ method: 'GET', path: '/gaming/games' })
|
|
70
|
+
.input(ListGamesInputSchema)
|
|
71
|
+
.output(paginated(GameSchema)),
|
|
52
72
|
getGame: oc
|
|
53
73
|
.route({ method: 'GET', path: '/gaming/games/{id}' })
|
|
54
74
|
.input(IdInputSchema)
|
|
@@ -62,5 +82,148 @@ export const gamingContract = {
|
|
|
62
82
|
.input(EndRoundInputSchema)
|
|
63
83
|
.output(EndRoundOutputSchema),
|
|
64
84
|
listRounds: oc.route({ method: 'GET', path: '/gaming/rounds' }).output(z.array(GameRoundSchema)),
|
|
85
|
+
listProviders: oc
|
|
86
|
+
.route({ method: 'GET', path: '/gaming/providers' })
|
|
87
|
+
.input(PageQuerySchema)
|
|
88
|
+
.output(paginated(GameProviderSummarySchema)),
|
|
89
|
+
getProviderBySlug: oc
|
|
90
|
+
.route({ method: 'GET', path: '/gaming/providers/{slug}' })
|
|
91
|
+
.input(z.object({ slug: CatalogSlugSchema }))
|
|
92
|
+
.output(GameProviderSummarySchema),
|
|
93
|
+
listCategories: oc
|
|
94
|
+
.route({ method: 'GET', path: '/gaming/categories' })
|
|
95
|
+
.input(PageQuerySchema)
|
|
96
|
+
.output(paginated(GameCategorySummaryWithTranslationsSchema)),
|
|
97
|
+
getCategoryBySlug: oc
|
|
98
|
+
.route({ method: 'GET', path: '/gaming/categories/{slug}' })
|
|
99
|
+
.input(z.object({ slug: CatalogSlugSchema }))
|
|
100
|
+
.output(GameCategorySummaryWithTranslationsSchema),
|
|
101
|
+
};
|
|
102
|
+
// Backoffice catalog management (game-config guarded in the router).
|
|
103
|
+
export const GameProviderDetailSchema = GameProviderSummarySchema.extend({
|
|
104
|
+
aggregatorMappings: z.array(GameProviderAggregatorMappingSchema),
|
|
105
|
+
metadata: z.unknown().nullable(),
|
|
106
|
+
isActive: z.boolean(),
|
|
107
|
+
createdAt: TimestampSchema,
|
|
108
|
+
updatedAt: TimestampSchema,
|
|
109
|
+
});
|
|
110
|
+
// Alias kept for existing imports; new code uses GameProviderDetailSchema.
|
|
111
|
+
export const GameProviderSchema = GameProviderDetailSchema;
|
|
112
|
+
export const GameCategoryDetailSchema = GameCategorySummaryWithTranslationsSchema.extend({
|
|
113
|
+
isActive: z.boolean(),
|
|
114
|
+
createdAt: TimestampSchema,
|
|
115
|
+
updatedAt: TimestampSchema,
|
|
116
|
+
});
|
|
117
|
+
// Alias kept for existing imports; new code uses GameCategoryDetailSchema.
|
|
118
|
+
export const GameCategorySchema = GameCategoryDetailSchema;
|
|
119
|
+
const CatalogFilterSchema = CatalogQueryBaseSchema.extend({
|
|
120
|
+
isActive: QueryBooleanSchema.optional(),
|
|
121
|
+
});
|
|
122
|
+
export const ListAdminGamesInputSchema = ListGamesInputSchema.extend({
|
|
123
|
+
isActive: QueryBooleanSchema.optional(),
|
|
124
|
+
});
|
|
125
|
+
const ProviderAggregatorMappingsInputSchema = z
|
|
126
|
+
.array(GameProviderAggregatorMappingSchema)
|
|
127
|
+
.max(50)
|
|
128
|
+
.superRefine((mappings, ctx) => {
|
|
129
|
+
const seen = new Set();
|
|
130
|
+
for (const [index, mapping] of mappings.entries()) {
|
|
131
|
+
if (seen.has(mapping.aggregator)) {
|
|
132
|
+
ctx.addIssue({
|
|
133
|
+
code: 'custom',
|
|
134
|
+
message: 'Each aggregator can be mapped only once',
|
|
135
|
+
path: [index, 'aggregator'],
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
seen.add(mapping.aggregator);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
const ProviderWriteFieldsSchema = z.object({
|
|
142
|
+
slug: CatalogSlugSchema,
|
|
143
|
+
name: z.string().trim().min(1).max(128),
|
|
144
|
+
aggregatorMappings: ProviderAggregatorMappingsInputSchema,
|
|
145
|
+
logoUrl: z.string().trim().min(1).max(512).nullable(),
|
|
146
|
+
metadata: z.unknown().nullable(),
|
|
147
|
+
});
|
|
148
|
+
export const CreateProviderInputSchema = ProviderWriteFieldsSchema.pick({
|
|
149
|
+
slug: true,
|
|
150
|
+
name: true,
|
|
151
|
+
}).extend({
|
|
152
|
+
aggregatorMappings: ProviderAggregatorMappingsInputSchema.optional(),
|
|
153
|
+
logoUrl: ProviderWriteFieldsSchema.shape.logoUrl.optional(),
|
|
154
|
+
metadata: ProviderWriteFieldsSchema.shape.metadata.optional(),
|
|
155
|
+
});
|
|
156
|
+
export const UpdateProviderInputSchema = ProviderWriteFieldsSchema.partial().extend({
|
|
157
|
+
id: UuidSchema,
|
|
158
|
+
isActive: z.boolean().optional(),
|
|
159
|
+
});
|
|
160
|
+
export const CreateCategoryInputSchema = z.object({
|
|
161
|
+
slug: CatalogSlugSchema,
|
|
162
|
+
name: GameCategoryNameSchema,
|
|
163
|
+
translations: GameCategoryTranslationsSchema.optional(),
|
|
164
|
+
icon: z.string().trim().min(1).max(512).nullable().optional(),
|
|
165
|
+
sortOrder: z.number().int().min(0).optional(),
|
|
166
|
+
});
|
|
167
|
+
export const UpdateCategoryInputSchema = z.object({
|
|
168
|
+
id: UuidSchema,
|
|
169
|
+
slug: CatalogSlugSchema.optional(),
|
|
170
|
+
name: GameCategoryNameSchema.optional(),
|
|
171
|
+
translations: GameCategoryTranslationsSchema.optional(),
|
|
172
|
+
icon: z.string().trim().min(1).max(512).nullable().optional(),
|
|
173
|
+
sortOrder: z.number().int().min(0).optional(),
|
|
174
|
+
isActive: z.boolean().optional(),
|
|
175
|
+
});
|
|
176
|
+
export const UpdateGameInputSchema = z.object({
|
|
177
|
+
id: UuidSchema,
|
|
178
|
+
name: z.string().trim().min(1).max(256).optional(),
|
|
179
|
+
slug: CatalogSlugSchema.optional(),
|
|
180
|
+
providerId: UuidSchema.optional(),
|
|
181
|
+
aggregator: z.string().trim().min(1).max(64).optional(),
|
|
182
|
+
thumbnailUrl: z.string().trim().min(1).max(512).nullable().optional(),
|
|
183
|
+
isActive: z.boolean().optional(),
|
|
184
|
+
metadata: z.unknown().nullable().optional(),
|
|
185
|
+
categoryIds: z.array(UuidSchema).max(50).optional(),
|
|
186
|
+
});
|
|
187
|
+
export const gamingAdminContract = {
|
|
188
|
+
listAdminProviders: oc
|
|
189
|
+
.route({ method: 'GET', path: '/backoffice/gaming/providers' })
|
|
190
|
+
.input(CatalogFilterSchema)
|
|
191
|
+
.output(paginated(GameProviderDetailSchema)),
|
|
192
|
+
getAdminProvider: oc
|
|
193
|
+
.route({ method: 'GET', path: '/backoffice/gaming/providers/{id}' })
|
|
194
|
+
.input(IdInputSchema)
|
|
195
|
+
.output(GameProviderDetailSchema),
|
|
196
|
+
createProvider: oc
|
|
197
|
+
.route({ method: 'POST', path: '/backoffice/gaming/providers' })
|
|
198
|
+
.input(CreateProviderInputSchema)
|
|
199
|
+
.output(GameProviderDetailSchema),
|
|
200
|
+
updateProvider: oc
|
|
201
|
+
.route({ method: 'PATCH', path: '/backoffice/gaming/providers/{id}' })
|
|
202
|
+
.input(UpdateProviderInputSchema)
|
|
203
|
+
.output(GameProviderDetailSchema),
|
|
204
|
+
listAdminCategories: oc
|
|
205
|
+
.route({ method: 'GET', path: '/backoffice/gaming/categories' })
|
|
206
|
+
.input(CatalogFilterSchema)
|
|
207
|
+
.output(paginated(GameCategoryDetailSchema)),
|
|
208
|
+
getAdminCategory: oc
|
|
209
|
+
.route({ method: 'GET', path: '/backoffice/gaming/categories/{id}' })
|
|
210
|
+
.input(IdInputSchema)
|
|
211
|
+
.output(GameCategoryDetailSchema),
|
|
212
|
+
createCategory: oc
|
|
213
|
+
.route({ method: 'POST', path: '/backoffice/gaming/categories' })
|
|
214
|
+
.input(CreateCategoryInputSchema)
|
|
215
|
+
.output(GameCategoryDetailSchema),
|
|
216
|
+
updateCategory: oc
|
|
217
|
+
.route({ method: 'PATCH', path: '/backoffice/gaming/categories/{id}' })
|
|
218
|
+
.input(UpdateCategoryInputSchema)
|
|
219
|
+
.output(GameCategoryDetailSchema),
|
|
220
|
+
updateGame: oc
|
|
221
|
+
.route({ method: 'PATCH', path: '/backoffice/gaming/games/{id}' })
|
|
222
|
+
.input(UpdateGameInputSchema)
|
|
223
|
+
.output(GameSchema),
|
|
224
|
+
listAdminGames: oc
|
|
225
|
+
.route({ method: 'GET', path: '/backoffice/gaming/games' })
|
|
226
|
+
.input(ListAdminGamesInputSchema)
|
|
227
|
+
.output(paginated(GameSchema)),
|
|
65
228
|
};
|
|
66
229
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/casino/gaming/contract/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/casino/gaming/contract/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
CREATE TABLE "game_category" (
|
|
2
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
3
|
+
"slug" text NOT NULL,
|
|
4
|
+
"name" text NOT NULL,
|
|
5
|
+
"translations" jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
6
|
+
"icon" text,
|
|
7
|
+
"sort_order" integer DEFAULT 0 NOT NULL,
|
|
8
|
+
"is_active" boolean DEFAULT true NOT NULL,
|
|
9
|
+
"updated_at" timestamp with time zone NOT NULL,
|
|
10
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
11
|
+
);
|
|
12
|
+
--> statement-breakpoint
|
|
13
|
+
CREATE TABLE "game_category_game" (
|
|
14
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
15
|
+
"game_id" uuid NOT NULL,
|
|
16
|
+
"category_id" uuid NOT NULL
|
|
17
|
+
);
|
|
18
|
+
--> statement-breakpoint
|
|
19
|
+
CREATE TABLE "game_provider" (
|
|
20
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
21
|
+
"slug" text NOT NULL,
|
|
22
|
+
"name" text NOT NULL,
|
|
23
|
+
"logo_url" text,
|
|
24
|
+
"is_active" boolean DEFAULT false NOT NULL,
|
|
25
|
+
"metadata" jsonb,
|
|
26
|
+
"updated_at" timestamp with time zone NOT NULL,
|
|
27
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
28
|
+
);
|
|
29
|
+
--> statement-breakpoint
|
|
30
|
+
CREATE TABLE "game_provider_aggregator_mapping" (
|
|
31
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
32
|
+
"provider_id" uuid NOT NULL,
|
|
33
|
+
"aggregator" text NOT NULL,
|
|
34
|
+
"vendor_id" text NOT NULL
|
|
35
|
+
);
|
|
36
|
+
--> statement-breakpoint
|
|
37
|
+
ALTER TABLE "game" ALTER COLUMN "provider" DROP NOT NULL;--> statement-breakpoint
|
|
38
|
+
ALTER TABLE "game" ALTER COLUMN "category" DROP NOT NULL;--> statement-breakpoint
|
|
39
|
+
ALTER TABLE "game" ALTER COLUMN "is_active" SET DEFAULT false;--> statement-breakpoint
|
|
40
|
+
ALTER TABLE "game" ADD COLUMN "slug" text;--> statement-breakpoint
|
|
41
|
+
ALTER TABLE "game" ADD COLUMN "provider_id" uuid;--> statement-breakpoint
|
|
42
|
+
ALTER TABLE "game" ADD COLUMN "aggregator" text;--> statement-breakpoint
|
|
43
|
+
ALTER TABLE "game_category_game" ADD CONSTRAINT "game_category_game_game_id_game_id_fk" FOREIGN KEY ("game_id") REFERENCES "public"."game"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
44
|
+
ALTER TABLE "game_category_game" ADD CONSTRAINT "game_category_game_category_id_game_category_id_fk" FOREIGN KEY ("category_id") REFERENCES "public"."game_category"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
45
|
+
CREATE UNIQUE INDEX "game_category_slug_key" ON "game_category" USING btree ("slug");--> statement-breakpoint
|
|
46
|
+
CREATE UNIQUE INDEX "game_category_game_key" ON "game_category_game" USING btree ("game_id","category_id");--> statement-breakpoint
|
|
47
|
+
CREATE INDEX "game_category_game_category_id_idx" ON "game_category_game" USING btree ("category_id");--> statement-breakpoint
|
|
48
|
+
CREATE UNIQUE INDEX "game_provider_slug_key" ON "game_provider" USING btree ("slug");--> statement-breakpoint
|
|
49
|
+
ALTER TABLE "game_provider_aggregator_mapping" ADD CONSTRAINT "game_provider_aggregator_mapping_provider_id_game_provider_id_fk" FOREIGN KEY ("provider_id") REFERENCES "public"."game_provider"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
50
|
+
CREATE UNIQUE INDEX "game_provider_aggregator_mapping_provider_aggregator_key" ON "game_provider_aggregator_mapping" USING btree ("provider_id","aggregator");--> statement-breakpoint
|
|
51
|
+
CREATE UNIQUE INDEX "game_provider_aggregator_mapping_aggregator_vendor_id_key" ON "game_provider_aggregator_mapping" USING btree ("aggregator","vendor_id");--> statement-breakpoint
|
|
52
|
+
ALTER TABLE "game" ADD CONSTRAINT "game_provider_id_game_provider_id_fk" FOREIGN KEY ("provider_id") REFERENCES "public"."game_provider"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
53
|
+
CREATE UNIQUE INDEX "game_slug_key" ON "game" USING btree ("slug");--> statement-breakpoint
|
|
54
|
+
CREATE INDEX "game_provider_id_idx" ON "game" USING btree ("provider_id");--> statement-breakpoint
|
|
55
|
+
CREATE INDEX "game_aggregator_idx" ON "game" USING btree ("aggregator");
|
|
56
|
+
--> statement-breakpoint
|
|
57
|
+
-- Backfill (previously standalone 0004): the DDL above added game.slug /
|
|
58
|
+
-- game.provider_id / game.aggregator as nullable and left the legacy
|
|
59
|
+
-- game.provider / game.category text columns in place. The statements below
|
|
60
|
+
-- resolve every pre-existing row into the new shape, install the legacy-insert
|
|
61
|
+
-- triggers so the previous release can keep writing during a rolling deploy,
|
|
62
|
+
-- and only then enforce NOT NULL (see schema/index.ts).
|
|
63
|
+
--
|
|
64
|
+
-- Truncating after the trim would let a name longer than max_length end the
|
|
65
|
+
-- slug on a '-', which CatalogSlugSchema rejects. Returns NULL when the source
|
|
66
|
+
-- has no alphanumerics; every caller supplies its own fallback.
|
|
67
|
+
CREATE OR REPLACE FUNCTION "game_catalog_slugify"(source text, max_length int)
|
|
68
|
+
RETURNS text LANGUAGE sql IMMUTABLE AS $fn$
|
|
69
|
+
SELECT NULLIF(
|
|
70
|
+
regexp_replace(
|
|
71
|
+
left(lower(regexp_replace(source, '[^a-zA-Z0-9]+', '-', 'g')), max_length),
|
|
72
|
+
'(^-+|-+$)', '', 'g'
|
|
73
|
+
),
|
|
74
|
+
''
|
|
75
|
+
)
|
|
76
|
+
$fn$;--> statement-breakpoint
|
|
77
|
+
-- The dedupe suffix is probed rather than taken from a window function:
|
|
78
|
+
-- 'book-of-ra-2' is itself the natural slug of "Book of Ra 2", so a blind
|
|
79
|
+
-- suffix collides with the already-live unique index and aborts the migration.
|
|
80
|
+
-- Each probe is its own statement, so it sees the rows the caller inserted before it.
|
|
81
|
+
CREATE OR REPLACE FUNCTION "game_catalog_unique_slug"(target regclass, source text, fallback text)
|
|
82
|
+
RETURNS text LANGUAGE plpgsql AS $fn$
|
|
83
|
+
DECLARE
|
|
84
|
+
base text := COALESCE("game_catalog_slugify"(source, 60), fallback);
|
|
85
|
+
candidate text := base;
|
|
86
|
+
attempt int := 1;
|
|
87
|
+
taken boolean;
|
|
88
|
+
BEGIN
|
|
89
|
+
LOOP
|
|
90
|
+
EXECUTE format('SELECT EXISTS (SELECT 1 FROM %s WHERE "slug" = $1)', target)
|
|
91
|
+
INTO taken USING candidate;
|
|
92
|
+
EXIT WHEN NOT taken;
|
|
93
|
+
attempt := attempt + 1;
|
|
94
|
+
candidate := "game_catalog_slugify"(base, greatest(1, 63 - length(attempt::text)))
|
|
95
|
+
|| '-' || attempt;
|
|
96
|
+
END LOOP;
|
|
97
|
+
RETURN candidate;
|
|
98
|
+
END
|
|
99
|
+
$fn$;--> statement-breakpoint
|
|
100
|
+
DO $do$
|
|
101
|
+
DECLARE
|
|
102
|
+
source record;
|
|
103
|
+
BEGIN
|
|
104
|
+
FOR source IN
|
|
105
|
+
SELECT DISTINCT COALESCE("provider", 'Unknown') AS "name" FROM "game" ORDER BY 1
|
|
106
|
+
LOOP
|
|
107
|
+
INSERT INTO "game_provider" ("slug", "name", "is_active", "updated_at")
|
|
108
|
+
VALUES (
|
|
109
|
+
"game_catalog_unique_slug"('game_provider', source."name", 'provider-' || left(md5(source."name"), 8)),
|
|
110
|
+
source."name",
|
|
111
|
+
true,
|
|
112
|
+
now()
|
|
113
|
+
);
|
|
114
|
+
END LOOP;
|
|
115
|
+
END
|
|
116
|
+
$do$;--> statement-breakpoint
|
|
117
|
+
DO $do$
|
|
118
|
+
DECLARE
|
|
119
|
+
source record;
|
|
120
|
+
BEGIN
|
|
121
|
+
FOR source IN
|
|
122
|
+
SELECT DISTINCT COALESCE("category", 'Uncategorized') AS "name" FROM "game" ORDER BY 1
|
|
123
|
+
LOOP
|
|
124
|
+
INSERT INTO "game_category" ("slug", "name", "updated_at")
|
|
125
|
+
VALUES (
|
|
126
|
+
"game_catalog_unique_slug"('game_category', source."name", 'category-' || left(md5(source."name"), 8)),
|
|
127
|
+
source."name",
|
|
128
|
+
now()
|
|
129
|
+
);
|
|
130
|
+
END LOOP;
|
|
131
|
+
END
|
|
132
|
+
$do$;--> statement-breakpoint
|
|
133
|
+
INSERT INTO "game_category_game" ("game_id", "category_id")
|
|
134
|
+
SELECT "g"."id", "c"."id" FROM "game" "g"
|
|
135
|
+
JOIN "game_category" "c" ON "c"."name" = COALESCE("g"."category", 'Uncategorized');--> statement-breakpoint
|
|
136
|
+
DO $do$
|
|
137
|
+
DECLARE
|
|
138
|
+
source record;
|
|
139
|
+
BEGIN
|
|
140
|
+
FOR source IN
|
|
141
|
+
SELECT "id", "name", COALESCE("provider", 'Unknown') AS "provider_name"
|
|
142
|
+
FROM "game" ORDER BY "id"
|
|
143
|
+
LOOP
|
|
144
|
+
UPDATE "game" SET
|
|
145
|
+
"slug" = "game_catalog_unique_slug"('game', source."name", 'game-' || left(source."id"::text, 8)),
|
|
146
|
+
"provider_id" = (SELECT "id" FROM "game_provider" WHERE "name" = source."provider_name"),
|
|
147
|
+
"aggregator" = 'direct'
|
|
148
|
+
WHERE "id" = source."id";
|
|
149
|
+
END LOOP;
|
|
150
|
+
END
|
|
151
|
+
$do$;--> statement-breakpoint
|
|
152
|
+
INSERT INTO "game_provider_aggregator_mapping" ("provider_id", "aggregator", "vendor_id")
|
|
153
|
+
SELECT "p"."id", 'direct', "p"."slug" FROM "game_provider" "p"
|
|
154
|
+
ON CONFLICT DO NOTHING;--> statement-breakpoint
|
|
155
|
+
-- Rolling-deploy compatibility: an instance still on the previous release inserts
|
|
156
|
+
-- the legacy shape (name, provider, category) and cannot populate slug, provider_id
|
|
157
|
+
-- or aggregator. BEFORE INSERT derives them exactly as the backfill above does, so
|
|
158
|
+
-- the NOT NULL below holds for old writers too. New code always sets all three, so
|
|
159
|
+
-- the WHEN clause keeps these triggers off its path. Drop both triggers and the
|
|
160
|
+
-- three functions together with the legacy columns in the follow-up contract migration.
|
|
161
|
+
CREATE OR REPLACE FUNCTION "game_legacy_insert"()
|
|
162
|
+
RETURNS trigger LANGUAGE plpgsql AS $fn$
|
|
163
|
+
DECLARE
|
|
164
|
+
provider_name text := COALESCE(NEW."provider", 'Unknown');
|
|
165
|
+
BEGIN
|
|
166
|
+
IF NEW."provider_id" IS NULL THEN
|
|
167
|
+
SELECT "id" INTO NEW."provider_id" FROM "game_provider"
|
|
168
|
+
WHERE "name" = provider_name ORDER BY "created_at", "id" LIMIT 1;
|
|
169
|
+
END IF;
|
|
170
|
+
IF NEW."provider_id" IS NULL THEN
|
|
171
|
+
INSERT INTO "game_provider" ("slug", "name", "is_active", "updated_at")
|
|
172
|
+
VALUES (
|
|
173
|
+
"game_catalog_unique_slug"('game_provider', provider_name, 'provider-' || left(md5(provider_name), 8)),
|
|
174
|
+
provider_name,
|
|
175
|
+
true,
|
|
176
|
+
now()
|
|
177
|
+
)
|
|
178
|
+
RETURNING "id" INTO NEW."provider_id";
|
|
179
|
+
END IF;
|
|
180
|
+
NEW."aggregator" := COALESCE(NEW."aggregator", 'direct');
|
|
181
|
+
NEW."slug" := COALESCE(
|
|
182
|
+
NEW."slug",
|
|
183
|
+
"game_catalog_unique_slug"('game', NEW."name", 'game-' || left(NEW."id"::text, 8))
|
|
184
|
+
);
|
|
185
|
+
INSERT INTO "game_provider_aggregator_mapping" ("provider_id", "aggregator", "vendor_id")
|
|
186
|
+
SELECT "id", NEW."aggregator", "slug" FROM "game_provider" WHERE "id" = NEW."provider_id"
|
|
187
|
+
ON CONFLICT DO NOTHING;
|
|
188
|
+
RETURN NEW;
|
|
189
|
+
END
|
|
190
|
+
$fn$;--> statement-breakpoint
|
|
191
|
+
CREATE TRIGGER "game_legacy_insert" BEFORE INSERT ON "game"
|
|
192
|
+
FOR EACH ROW WHEN (NEW."slug" IS NULL OR NEW."provider_id" IS NULL OR NEW."aggregator" IS NULL)
|
|
193
|
+
EXECUTE FUNCTION "game_legacy_insert"();--> statement-breakpoint
|
|
194
|
+
-- The category link needs the committed game id for its foreign key, so it runs
|
|
195
|
+
-- AFTER INSERT. Only the previous release writes game.category.
|
|
196
|
+
CREATE OR REPLACE FUNCTION "game_legacy_category_link"()
|
|
197
|
+
RETURNS trigger LANGUAGE plpgsql AS $fn$
|
|
198
|
+
DECLARE
|
|
199
|
+
linked_category_id uuid;
|
|
200
|
+
BEGIN
|
|
201
|
+
SELECT "id" INTO linked_category_id FROM "game_category"
|
|
202
|
+
WHERE "name" = NEW."category" ORDER BY "created_at", "id" LIMIT 1;
|
|
203
|
+
IF linked_category_id IS NULL THEN
|
|
204
|
+
INSERT INTO "game_category" ("slug", "name", "updated_at")
|
|
205
|
+
VALUES (
|
|
206
|
+
"game_catalog_unique_slug"('game_category', NEW."category", 'category-' || left(md5(NEW."category"), 8)),
|
|
207
|
+
NEW."category",
|
|
208
|
+
now()
|
|
209
|
+
)
|
|
210
|
+
RETURNING "id" INTO linked_category_id;
|
|
211
|
+
END IF;
|
|
212
|
+
INSERT INTO "game_category_game" ("game_id", "category_id")
|
|
213
|
+
VALUES (NEW."id", linked_category_id)
|
|
214
|
+
ON CONFLICT DO NOTHING;
|
|
215
|
+
RETURN NULL;
|
|
216
|
+
END
|
|
217
|
+
$fn$;--> statement-breakpoint
|
|
218
|
+
CREATE TRIGGER "game_legacy_category_link" AFTER INSERT ON "game"
|
|
219
|
+
FOR EACH ROW WHEN (NEW."category" IS NOT NULL)
|
|
220
|
+
EXECUTE FUNCTION "game_legacy_category_link"();--> statement-breakpoint
|
|
221
|
+
ALTER TABLE "game" ALTER COLUMN "slug" SET NOT NULL;--> statement-breakpoint
|
|
222
|
+
ALTER TABLE "game" ALTER COLUMN "provider_id" SET NOT NULL;--> statement-breakpoint
|
|
223
|
+
ALTER TABLE "game" ALTER COLUMN "aggregator" SET NOT NULL;
|