@porulle/core 0.10.8 → 0.11.0

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 (114) hide show
  1. package/dist/config/types.d.ts +3 -0
  2. package/dist/config/types.d.ts.map +1 -1
  3. package/dist/index.d.ts +3 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -0
  6. package/dist/interfaces/rest/index.d.ts.map +1 -1
  7. package/dist/interfaces/rest/index.js +4 -0
  8. package/dist/interfaces/rest/routes/admin/custom-field-proposals.d.ts +5 -0
  9. package/dist/interfaces/rest/routes/admin/custom-field-proposals.d.ts.map +1 -0
  10. package/dist/interfaces/rest/routes/admin/custom-field-proposals.js +22 -0
  11. package/dist/interfaces/rest/routes/admin/entity-field-definitions.d.ts +5 -0
  12. package/dist/interfaces/rest/routes/admin/entity-field-definitions.d.ts.map +1 -0
  13. package/dist/interfaces/rest/routes/admin/entity-field-definitions.js +39 -0
  14. package/dist/interfaces/rest/routes/catalog.d.ts.map +1 -1
  15. package/dist/interfaces/rest/routes/catalog.js +37 -2
  16. package/dist/interfaces/rest/routes/search.d.ts.map +1 -1
  17. package/dist/interfaces/rest/routes/search.js +12 -0
  18. package/dist/interfaces/rest/schemas/admin-custom-field-proposals.d.ts +134 -0
  19. package/dist/interfaces/rest/schemas/admin-custom-field-proposals.d.ts.map +1 -0
  20. package/dist/interfaces/rest/schemas/admin-custom-field-proposals.js +26 -0
  21. package/dist/interfaces/rest/schemas/admin-entity-field-definitions.d.ts +592 -0
  22. package/dist/interfaces/rest/schemas/admin-entity-field-definitions.d.ts.map +1 -0
  23. package/dist/interfaces/rest/schemas/admin-entity-field-definitions.js +109 -0
  24. package/dist/interfaces/rest/schemas/catalog.d.ts +1364 -401
  25. package/dist/interfaces/rest/schemas/catalog.d.ts.map +1 -1
  26. package/dist/interfaces/rest/schemas/catalog.js +86 -0
  27. package/dist/interfaces/rest/schemas/pricing.d.ts +1 -0
  28. package/dist/interfaces/rest/schemas/pricing.d.ts.map +1 -1
  29. package/dist/interfaces/rest/schemas/search.d.ts +1 -0
  30. package/dist/interfaces/rest/schemas/search.d.ts.map +1 -1
  31. package/dist/interfaces/rest/schemas/search.js +1 -0
  32. package/dist/modules/catalog/entity-service.d.ts +5 -3
  33. package/dist/modules/catalog/entity-service.d.ts.map +1 -1
  34. package/dist/modules/catalog/entity-service.js +73 -22
  35. package/dist/modules/catalog/module.d.ts +6 -1
  36. package/dist/modules/catalog/module.d.ts.map +1 -1
  37. package/dist/modules/catalog/module.js +6 -1
  38. package/dist/modules/catalog/ownership.d.ts +5 -0
  39. package/dist/modules/catalog/ownership.d.ts.map +1 -0
  40. package/dist/modules/catalog/ownership.js +11 -0
  41. package/dist/modules/catalog/repository/index.d.ts +52 -1
  42. package/dist/modules/catalog/repository/index.d.ts.map +1 -1
  43. package/dist/modules/catalog/repository/index.js +321 -2
  44. package/dist/modules/catalog/revision.d.ts +4 -0
  45. package/dist/modules/catalog/revision.d.ts.map +1 -0
  46. package/dist/modules/catalog/revision.js +33 -0
  47. package/dist/modules/catalog/schema.d.ts +979 -110
  48. package/dist/modules/catalog/schema.d.ts.map +1 -1
  49. package/dist/modules/catalog/schema.js +112 -2
  50. package/dist/modules/catalog/schemas.d.ts +2 -0
  51. package/dist/modules/catalog/schemas.d.ts.map +1 -1
  52. package/dist/modules/catalog/schemas.js +2 -0
  53. package/dist/modules/catalog/service.d.ts +66 -3
  54. package/dist/modules/catalog/service.d.ts.map +1 -1
  55. package/dist/modules/catalog/service.js +512 -11
  56. package/dist/modules/channels/adapter.d.ts +85 -0
  57. package/dist/modules/channels/adapter.d.ts.map +1 -1
  58. package/dist/modules/channels/adapter.js +9 -1
  59. package/dist/modules/media/module.d.ts +68 -0
  60. package/dist/modules/media/module.d.ts.map +1 -1
  61. package/dist/modules/media/module.js +2 -0
  62. package/dist/modules/media/schema.d.ts +70 -0
  63. package/dist/modules/media/schema.d.ts.map +1 -1
  64. package/dist/modules/media/schema.js +20 -2
  65. package/dist/modules/media/service.d.ts +8 -1
  66. package/dist/modules/media/service.d.ts.map +1 -1
  67. package/dist/modules/media/service.js +66 -18
  68. package/dist/modules/pricing/schema.d.ts +17 -0
  69. package/dist/modules/pricing/schema.d.ts.map +1 -1
  70. package/dist/modules/pricing/schema.js +1 -0
  71. package/dist/modules/pricing/schemas.d.ts +1 -0
  72. package/dist/modules/pricing/schemas.d.ts.map +1 -1
  73. package/dist/modules/pricing/schemas.js +1 -0
  74. package/dist/modules/pricing/service.d.ts.map +1 -1
  75. package/dist/modules/pricing/service.js +6 -1
  76. package/dist/modules/search/adapter.d.ts +2 -0
  77. package/dist/modules/search/adapter.d.ts.map +1 -1
  78. package/dist/modules/search/module.d.ts.map +1 -1
  79. package/dist/modules/search/module.js +2 -0
  80. package/dist/modules/search/service.d.ts +4 -0
  81. package/dist/modules/search/service.d.ts.map +1 -1
  82. package/dist/modules/search/service.js +74 -5
  83. package/dist/runtime/kernel-modules.d.ts +73 -0
  84. package/dist/runtime/kernel-modules.d.ts.map +1 -1
  85. package/package.json +1 -1
  86. package/src/config/types.ts +3 -0
  87. package/src/index.ts +14 -0
  88. package/src/interfaces/rest/index.ts +4 -0
  89. package/src/interfaces/rest/routes/admin/custom-field-proposals.ts +37 -0
  90. package/src/interfaces/rest/routes/admin/entity-field-definitions.ts +89 -0
  91. package/src/interfaces/rest/routes/catalog.ts +85 -0
  92. package/src/interfaces/rest/routes/search.ts +16 -0
  93. package/src/interfaces/rest/schemas/admin-custom-field-proposals.ts +29 -0
  94. package/src/interfaces/rest/schemas/admin-entity-field-definitions.ts +120 -0
  95. package/src/interfaces/rest/schemas/catalog.ts +92 -0
  96. package/src/interfaces/rest/schemas/search.ts +2 -0
  97. package/src/modules/catalog/entity-service.ts +73 -20
  98. package/src/modules/catalog/module.ts +15 -0
  99. package/src/modules/catalog/ownership.ts +17 -0
  100. package/src/modules/catalog/repository/index.ts +547 -1
  101. package/src/modules/catalog/revision.ts +35 -0
  102. package/src/modules/catalog/schema.ts +169 -1
  103. package/src/modules/catalog/schemas.ts +2 -0
  104. package/src/modules/catalog/service.ts +738 -13
  105. package/src/modules/channels/adapter.ts +107 -1
  106. package/src/modules/media/module.ts +2 -0
  107. package/src/modules/media/schema.ts +23 -2
  108. package/src/modules/media/service.ts +84 -23
  109. package/src/modules/pricing/schema.ts +1 -0
  110. package/src/modules/pricing/schemas.ts +1 -0
  111. package/src/modules/pricing/service.ts +7 -2
  112. package/src/modules/search/adapter.ts +2 -0
  113. package/src/modules/search/module.ts +2 -0
  114. package/src/modules/search/service.ts +87 -6
@@ -8,6 +8,7 @@ export interface ChannelConnectorCapabilities {
8
8
  readonly importCatalog: boolean;
9
9
  readonly importInventory: boolean;
10
10
  readonly pushOrder: boolean;
11
+ readonly pushCatalog?: boolean;
11
12
  readonly receiveWebhooks: boolean;
12
13
  readonly reserve?: boolean;
13
14
  }
@@ -20,11 +21,45 @@ export interface ChannelStore {
20
21
  status: "connected" | "disconnected" | "error";
21
22
  webhookSecret: string | null;
22
23
  }
24
+ export interface ChannelCatalogLocalizedAttributes {
25
+ locale: string;
26
+ title: string;
27
+ subtitle?: string;
28
+ description?: string;
29
+ richDescription?: unknown;
30
+ seoTitle?: string;
31
+ seoDescription?: string;
32
+ }
33
+ export interface ChannelCatalogImage {
34
+ externalId?: string;
35
+ url: string;
36
+ alt?: string;
37
+ role: "primary" | "gallery" | "thumbnail" | "video" | "document";
38
+ sortOrder?: number;
39
+ variantExternalIds?: string[];
40
+ }
41
+ export interface ChannelCatalogOptionType {
42
+ name: string;
43
+ displayName: string;
44
+ sortOrder?: number;
45
+ values: Array<{
46
+ value: string;
47
+ displayValue: string;
48
+ sortOrder?: number;
49
+ }>;
50
+ }
51
+ export interface ChannelCatalogPrice {
52
+ currency: string;
53
+ amount: number;
54
+ compareAtAmount?: number;
55
+ }
23
56
  export interface ChannelCatalogVariant {
24
57
  externalId: string;
25
58
  sku?: string;
26
59
  barcode?: string;
27
60
  metadata?: Record<string, unknown>;
61
+ optionValues?: Record<string, string>;
62
+ prices?: ChannelCatalogPrice[];
28
63
  }
29
64
  export interface ChannelCatalogItem {
30
65
  externalId: string;
@@ -33,6 +68,13 @@ export interface ChannelCatalogItem {
33
68
  description?: string;
34
69
  variants: ChannelCatalogVariant[];
35
70
  metadata?: Record<string, unknown>;
71
+ attributes?: ChannelCatalogLocalizedAttributes[];
72
+ images?: ChannelCatalogImage[];
73
+ options?: ChannelCatalogOptionType[];
74
+ tags?: string[];
75
+ brand?: string;
76
+ categories?: string[];
77
+ status?: "draft" | "active" | "archived" | "discontinued";
36
78
  }
37
79
  export interface ChannelCatalogPage {
38
80
  items: ChannelCatalogItem[];
@@ -65,6 +107,46 @@ export interface ChannelPushOrderResult {
65
107
  remoteOrderId: string;
66
108
  remoteUrl?: string;
67
109
  }
110
+ export type ChannelPushCatalogIntent = "filterable" | "display" | "tag";
111
+ export interface ChannelPushCatalogField {
112
+ fieldPath: string;
113
+ intent: ChannelPushCatalogIntent;
114
+ value: unknown;
115
+ locale?: string;
116
+ remoteKey?: string;
117
+ }
118
+ export interface ChannelPushCatalogImage {
119
+ externalId?: string;
120
+ url: string;
121
+ alt?: string;
122
+ role: "primary" | "gallery" | "thumbnail" | "video" | "document";
123
+ sortOrder?: number;
124
+ variantExternalIds?: string[];
125
+ }
126
+ export interface ChannelPushCatalogVariant {
127
+ externalId: string;
128
+ fields: ChannelPushCatalogField[];
129
+ }
130
+ export interface ChannelPushCatalogItem {
131
+ externalId: string;
132
+ variants?: ChannelPushCatalogVariant[];
133
+ fields: ChannelPushCatalogField[];
134
+ images?: ChannelPushCatalogImage[];
135
+ }
136
+ export interface ChannelPushCatalogPreviousField {
137
+ fieldPath: string;
138
+ value: unknown;
139
+ }
140
+ export interface ChannelPushCatalogItemOutcome {
141
+ externalId: string;
142
+ ok: boolean;
143
+ error?: ChannelConnectorError;
144
+ remoteUpdatedAt?: string;
145
+ previousFields?: ChannelPushCatalogPreviousField[];
146
+ }
147
+ export interface ChannelPushCatalogResult {
148
+ outcomes: ChannelPushCatalogItemOutcome[];
149
+ }
68
150
  export interface ChannelOrderStatus {
69
151
  status: "pending" | "confirmed" | "failed" | "cancelled" | "fulfilled";
70
152
  }
@@ -100,6 +182,9 @@ export interface ChannelConnector {
100
182
  importCatalog(store: ChannelStore, cursor?: string): Promise<Result<ChannelCatalogPage>>;
101
183
  fetchInventory(store: ChannelStore, ids?: string[]): Promise<Result<ChannelInventoryLevel[]>>;
102
184
  pushOrder(store: ChannelStore, slice: ChannelOrderSlice): Promise<Result<ChannelPushOrderResult, ChannelConnectorError>>;
185
+ pushCatalog?(store: ChannelStore, items: ChannelPushCatalogItem[], opts?: {
186
+ dryRun?: boolean;
187
+ }): Promise<Result<ChannelPushCatalogResult, ChannelConnectorError>>;
103
188
  fetchOrderStatus(store: ChannelStore, remoteId: string): Promise<Result<ChannelOrderStatus, ChannelConnectorError>>;
104
189
  verifyWebhook(store: ChannelStore, request: Request): Promise<Result<ChannelWebhookEvent>>;
105
190
  verifyAppWebhook?(request: Request): Promise<Result<{
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/modules/channels/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/modules/channels/adapter.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,11 @@
1
1
  export function defineChannelConnector(connector) {
2
- return connector;
2
+ if (connector.capabilities.pushCatalog !== undefined)
3
+ return connector;
4
+ return {
5
+ ...connector,
6
+ capabilities: {
7
+ ...connector.capabilities,
8
+ pushCatalog: false,
9
+ },
10
+ };
3
11
  }
@@ -176,6 +176,57 @@ export declare const mediaModule: import("../../kernel/module/define.js").AppMod
176
176
  }, {}, {
177
177
  $type: Record<string, unknown>;
178
178
  }>;
179
+ origin: import("drizzle-orm/pg-core").PgColumn<{
180
+ name: "origin";
181
+ tableName: "media_assets";
182
+ dataType: "string";
183
+ columnType: "PgEnumColumn";
184
+ data: "generated" | "merchant" | "imported";
185
+ driverParam: string;
186
+ notNull: true;
187
+ hasDefault: true;
188
+ isPrimaryKey: false;
189
+ isAutoincrement: false;
190
+ hasRuntimeDefault: false;
191
+ enumValues: ["merchant", "generated", "imported"];
192
+ baseColumn: never;
193
+ identity: undefined;
194
+ generated: undefined;
195
+ }, {}, {}>;
196
+ confidence: import("drizzle-orm/pg-core").PgColumn<{
197
+ name: "confidence";
198
+ tableName: "media_assets";
199
+ dataType: "string";
200
+ columnType: "PgNumeric";
201
+ data: string;
202
+ driverParam: string;
203
+ notNull: false;
204
+ hasDefault: false;
205
+ isPrimaryKey: false;
206
+ isAutoincrement: false;
207
+ hasRuntimeDefault: false;
208
+ enumValues: undefined;
209
+ baseColumn: never;
210
+ identity: undefined;
211
+ generated: undefined;
212
+ }, {}, {}>;
213
+ derivedFromAssetId: import("drizzle-orm/pg-core").PgColumn<{
214
+ name: "derived_from_asset_id";
215
+ tableName: "media_assets";
216
+ dataType: "string";
217
+ columnType: "PgUUID";
218
+ data: string;
219
+ driverParam: string;
220
+ notNull: false;
221
+ hasDefault: false;
222
+ isPrimaryKey: false;
223
+ isAutoincrement: false;
224
+ hasRuntimeDefault: false;
225
+ enumValues: undefined;
226
+ baseColumn: never;
227
+ identity: undefined;
228
+ generated: undefined;
229
+ }, {}, {}>;
179
230
  uploadedAt: import("drizzle-orm/pg-core").PgColumn<{
180
231
  name: "uploaded_at";
181
232
  tableName: "media_assets";
@@ -285,6 +336,23 @@ export declare const mediaModule: import("../../kernel/module/define.js").AppMod
285
336
  identity: undefined;
286
337
  generated: undefined;
287
338
  }, {}, {}>;
339
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
340
+ name: "created_at";
341
+ tableName: "entity_media";
342
+ dataType: "date";
343
+ columnType: "PgTimestamp";
344
+ data: Date;
345
+ driverParam: string;
346
+ notNull: true;
347
+ hasDefault: true;
348
+ isPrimaryKey: false;
349
+ isAutoincrement: false;
350
+ hasRuntimeDefault: false;
351
+ enumValues: undefined;
352
+ baseColumn: never;
353
+ identity: undefined;
354
+ generated: undefined;
355
+ }, {}, {}>;
288
356
  };
289
357
  dialect: "pg";
290
358
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/modules/media/module.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCAgBtB,CAAC"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/modules/media/module.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCAkBtB,CAAC"}
@@ -17,6 +17,8 @@ export const mediaModule = defineModule({
17
17
  catalogRepository: new CatalogRepository(db),
18
18
  storage,
19
19
  config: deps.config,
20
+ database: deps.db,
21
+ services: deps.services,
20
22
  });
21
23
  },
22
24
  });
@@ -1,3 +1,5 @@
1
+ export declare const mediaAssetOrigin: import("drizzle-orm/pg-core").PgEnum<["merchant", "generated", "imported"]>;
2
+ export type MediaAssetOrigin = (typeof mediaAssetOrigin.enumValues)[number];
1
3
  export declare const mediaAssets: import("drizzle-orm/pg-core").PgTableWithColumns<{
2
4
  name: "media_assets";
3
5
  schema: undefined;
@@ -174,6 +176,57 @@ export declare const mediaAssets: import("drizzle-orm/pg-core").PgTableWithColum
174
176
  }, {}, {
175
177
  $type: Record<string, unknown>;
176
178
  }>;
179
+ origin: import("drizzle-orm/pg-core").PgColumn<{
180
+ name: "origin";
181
+ tableName: "media_assets";
182
+ dataType: "string";
183
+ columnType: "PgEnumColumn";
184
+ data: "generated" | "merchant" | "imported";
185
+ driverParam: string;
186
+ notNull: true;
187
+ hasDefault: true;
188
+ isPrimaryKey: false;
189
+ isAutoincrement: false;
190
+ hasRuntimeDefault: false;
191
+ enumValues: ["merchant", "generated", "imported"];
192
+ baseColumn: never;
193
+ identity: undefined;
194
+ generated: undefined;
195
+ }, {}, {}>;
196
+ confidence: import("drizzle-orm/pg-core").PgColumn<{
197
+ name: "confidence";
198
+ tableName: "media_assets";
199
+ dataType: "string";
200
+ columnType: "PgNumeric";
201
+ data: string;
202
+ driverParam: string;
203
+ notNull: false;
204
+ hasDefault: false;
205
+ isPrimaryKey: false;
206
+ isAutoincrement: false;
207
+ hasRuntimeDefault: false;
208
+ enumValues: undefined;
209
+ baseColumn: never;
210
+ identity: undefined;
211
+ generated: undefined;
212
+ }, {}, {}>;
213
+ derivedFromAssetId: import("drizzle-orm/pg-core").PgColumn<{
214
+ name: "derived_from_asset_id";
215
+ tableName: "media_assets";
216
+ dataType: "string";
217
+ columnType: "PgUUID";
218
+ data: string;
219
+ driverParam: string;
220
+ notNull: false;
221
+ hasDefault: false;
222
+ isPrimaryKey: false;
223
+ isAutoincrement: false;
224
+ hasRuntimeDefault: false;
225
+ enumValues: undefined;
226
+ baseColumn: never;
227
+ identity: undefined;
228
+ generated: undefined;
229
+ }, {}, {}>;
177
230
  uploadedAt: import("drizzle-orm/pg-core").PgColumn<{
178
231
  name: "uploaded_at";
179
232
  tableName: "media_assets";
@@ -283,6 +336,23 @@ export declare const entityMedia: import("drizzle-orm/pg-core").PgTableWithColum
283
336
  identity: undefined;
284
337
  generated: undefined;
285
338
  }, {}, {}>;
339
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
340
+ name: "created_at";
341
+ tableName: "entity_media";
342
+ dataType: "date";
343
+ columnType: "PgTimestamp";
344
+ data: Date;
345
+ driverParam: string;
346
+ notNull: true;
347
+ hasDefault: true;
348
+ isPrimaryKey: false;
349
+ isAutoincrement: false;
350
+ hasRuntimeDefault: false;
351
+ enumValues: undefined;
352
+ baseColumn: never;
353
+ identity: undefined;
354
+ generated: undefined;
355
+ }, {}, {}>;
286
356
  };
287
357
  dialect: "pg";
288
358
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/modules/media/schema.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBvB,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EActB,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/modules/media/schema.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB,6EAAsE,CAAC;AACpG,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,gBAAgB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBvB,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBrB,CAAC"}
@@ -1,6 +1,8 @@
1
- import { index, integer, jsonb, pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core";
1
+ import { sql } from "drizzle-orm";
2
+ import { index, integer, jsonb, numeric, pgEnum, pgTable, text, timestamp, uniqueIndex, uuid } from "drizzle-orm/pg-core";
2
3
  import { organization } from "../../auth/auth-schema.js";
3
4
  import { sellableEntities, variants } from "../catalog/schema.js";
5
+ export const mediaAssetOrigin = pgEnum("media_asset_origin", ["merchant", "generated", "imported"]);
4
6
  export const mediaAssets = pgTable("media_assets", {
5
7
  id: uuid("id").defaultRandom().primaryKey(),
6
8
  organizationId: text("organization_id")
@@ -14,6 +16,11 @@ export const mediaAssets = pgTable("media_assets", {
14
16
  height: integer("height"),
15
17
  alt: text("alt"),
16
18
  metadata: jsonb("metadata").$type().default({}),
19
+ origin: mediaAssetOrigin("origin").notNull().default("merchant"),
20
+ confidence: numeric("confidence", { precision: 4, scale: 3 }),
21
+ derivedFromAssetId: uuid("derived_from_asset_id").references(() => mediaAssets.id, {
22
+ onDelete: "set null",
23
+ }),
17
24
  uploadedAt: timestamp("uploaded_at", { withTimezone: true }).defaultNow().notNull(),
18
25
  }, (table) => ({
19
26
  orgIdx: index("idx_media_assets_org").on(table.organizationId),
@@ -32,4 +39,15 @@ export const entityMedia = pgTable("entity_media", {
32
39
  enum: ["primary", "gallery", "thumbnail", "video", "document"],
33
40
  }).notNull(),
34
41
  sortOrder: integer("sort_order").notNull().default(0),
35
- });
42
+ createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(),
43
+ }, (table) => ({
44
+ // Two partial indexes instead of one NULLS DISTINCT index: Postgres treats
45
+ // null variant ids as distinct, so a single index cannot reject duplicate
46
+ // entity-level rows.
47
+ entityLevelUnique: uniqueIndex("entity_media_entity_level_unique")
48
+ .on(table.entityId, table.mediaAssetId)
49
+ .where(sql `${table.variantId} IS NULL`),
50
+ variantLevelUnique: uniqueIndex("entity_media_variant_level_unique")
51
+ .on(table.entityId, table.variantId, table.mediaAssetId)
52
+ .where(sql `${table.variantId} IS NOT NULL`),
53
+ }));
@@ -2,15 +2,18 @@ import type { Actor } from "../../auth/types.js";
2
2
  import type { CommerceConfig } from "../../config/types.js";
3
3
  import type { StorageAdapter, StoredFile } from "./adapter.js";
4
4
  import { type Result } from "../../kernel/result.js";
5
- import type { MediaRepository } from "./repository/index.js";
5
+ import type { MediaRepository, MediaAsset } from "./repository/index.js";
6
6
  import type { CatalogRepository } from "../catalog/repository/index.js";
7
7
  import type { TxContext } from "../../kernel/database/tx-context.js";
8
+ import type { DatabaseAdapter } from "../../kernel/database/adapter.js";
9
+ import type { MediaAssetOrigin } from "./schema.js";
8
10
  export interface UploadMediaInput {
9
11
  filename: string;
10
12
  contentType: string;
11
13
  data: ArrayBuffer;
12
14
  alt?: string;
13
15
  metadata?: Record<string, unknown>;
16
+ origin?: MediaAssetOrigin;
14
17
  }
15
18
  export interface AttachMediaInput {
16
19
  entityId: string;
@@ -33,13 +36,17 @@ interface MediaServiceDeps {
33
36
  catalogRepository: CatalogRepository;
34
37
  storage: StorageAdapter;
35
38
  config: CommerceConfig;
39
+ database?: DatabaseAdapter;
40
+ services?: Record<string, unknown>;
36
41
  }
42
+ export declare function assertMediaWritable(asset: Pick<MediaAsset, "origin">, actor: Actor | null): void;
37
43
  export declare function detectMimeFromBuffer(buffer: Uint8Array): string | null;
38
44
  export declare class MediaService {
39
45
  private deps;
40
46
  private readonly repo;
41
47
  private readonly catalogRepo;
42
48
  constructor(deps: MediaServiceDeps);
49
+ private withTransaction;
43
50
  upload(input: UploadMediaInput, actor?: Actor | null, ctx?: TxContext): Promise<Result<{
44
51
  id: string;
45
52
  url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/media/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/media/service.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { resolveOrgId } from "../../auth/org.js";
2
+ import { assertPermission } from "../../auth/permissions.js";
2
3
  import { Err, Ok } from "../../kernel/result.js";
3
- import { CommerceNotFoundError, CommerceValidationError, } from "../../kernel/errors.js";
4
+ import { CommerceConflictError, CommerceNotFoundError, CommerceValidationError, toCommerceError, } from "../../kernel/errors.js";
5
+ import { createTxContext } from "../../kernel/database/tx-context.js";
4
6
  import { makeId } from "../../utils/id.js";
5
7
  const DEFAULT_ALLOWED_MIME_TYPES = [
6
8
  "image/png",
@@ -9,6 +11,18 @@ const DEFAULT_ALLOWED_MIME_TYPES = [
9
11
  "image/webp",
10
12
  "application/pdf",
11
13
  ];
14
+ export function assertMediaWritable(asset, actor) {
15
+ if (asset.origin === "merchant")
16
+ assertPermission(actor, "media:write");
17
+ }
18
+ function isUniqueViolation(error) {
19
+ if (error == null || typeof error !== "object")
20
+ return false;
21
+ const value = error;
22
+ if (value.code === "23505")
23
+ return true;
24
+ return isUniqueViolation(value.cause);
25
+ }
12
26
  function isSvgOrXml(buffer) {
13
27
  const prefix = new TextDecoder()
14
28
  .decode(buffer.slice(0, 256))
@@ -46,6 +60,13 @@ export class MediaService {
46
60
  this.repo = deps.repository;
47
61
  this.catalogRepo = deps.catalogRepository;
48
62
  }
63
+ async withTransaction(actor, ctx, fn) {
64
+ if (ctx?.tx != null)
65
+ return fn(ctx);
66
+ if (this.deps.database == null)
67
+ throw new Error("Database is required for media mutations.");
68
+ return this.deps.database.transaction(async (tx) => fn(createTxContext(tx, { actor })));
69
+ }
49
70
  async upload(input, actor, ctx) {
50
71
  if (!input.filename || !input.contentType) {
51
72
  return Err(new CommerceValidationError("filename and contentType are required."));
@@ -78,6 +99,7 @@ export class MediaService {
78
99
  contentType: effectiveMime,
79
100
  size: input.data.byteLength,
80
101
  metadata: input.metadata ?? {},
102
+ origin: input.origin ?? "merchant",
81
103
  uploadedAt: new Date(),
82
104
  ...(input.alt !== undefined ? { alt: input.alt } : {}),
83
105
  }, ctx);
@@ -112,6 +134,12 @@ export class MediaService {
112
134
  const asset = await this.repo.findAssetById(id, ctx, orgId);
113
135
  if (!asset)
114
136
  return Err(new CommerceNotFoundError("Media asset not found."));
137
+ try {
138
+ assertMediaWritable(asset, actor ?? ctx?.actor ?? null);
139
+ }
140
+ catch (error) {
141
+ return Err(toCommerceError(error));
142
+ }
115
143
  const deleted = await this.deps.storage.delete(asset.storageKey);
116
144
  if (!deleted.ok)
117
145
  return deleted;
@@ -126,25 +154,45 @@ export class MediaService {
126
154
  return Ok(listed.value);
127
155
  }
128
156
  async attachToEntity(input, actor, ctx) {
129
- const orgId = resolveOrgId(actor ?? ctx?.actor ?? null);
130
- const entity = await this.catalogRepo.findEntityById(input.entityId, ctx, orgId);
131
- if (!entity) {
132
- return Err(new CommerceNotFoundError("Entity not found."));
157
+ try {
158
+ return await this.withTransaction(actor ?? ctx?.actor ?? null, ctx, async (txCtx) => {
159
+ const orgId = resolveOrgId(actor ?? txCtx.actor);
160
+ const entity = await this.catalogRepo.findEntityById(input.entityId, txCtx, orgId);
161
+ if (!entity)
162
+ return Err(new CommerceNotFoundError("Entity not found."));
163
+ const asset = await this.repo.findAssetById(input.mediaAssetId, txCtx, orgId);
164
+ if (!asset)
165
+ return Err(new CommerceNotFoundError("Media asset not found."));
166
+ const existing = await this.repo.findEntityMedia(input.entityId, input.variantId, txCtx);
167
+ if (existing.some((link) => link.mediaAssetId === input.mediaAssetId)) {
168
+ return Err(new CommerceConflictError("Media asset is already attached at this level."));
169
+ }
170
+ await this.repo.createEntityMedia({
171
+ entityId: input.entityId,
172
+ mediaAssetId: input.mediaAssetId,
173
+ role: input.role,
174
+ sortOrder: input.sortOrder ?? 0,
175
+ ...(input.variantId !== undefined
176
+ ? { variantId: input.variantId }
177
+ : {}),
178
+ }, txCtx);
179
+ const catalog = this.deps.services?.catalog;
180
+ if (catalog == null || typeof catalog !== "object") {
181
+ throw new Error("Catalog service is required for media revision capture.");
182
+ }
183
+ const catalogService = catalog;
184
+ const revision = await catalogService.recordEntityRevision(input.entityId, actor ?? txCtx.actor, "update", txCtx);
185
+ if (!revision.ok)
186
+ throw revision.error;
187
+ return Ok(undefined);
188
+ });
133
189
  }
134
- const asset = await this.repo.findAssetById(input.mediaAssetId, ctx, orgId);
135
- if (!asset) {
136
- return Err(new CommerceNotFoundError("Media asset not found."));
190
+ catch (error) {
191
+ if (isUniqueViolation(error)) {
192
+ return Err(new CommerceConflictError("Media asset is already attached at this level."));
193
+ }
194
+ return Err(toCommerceError(error));
137
195
  }
138
- await this.repo.createEntityMedia({
139
- entityId: input.entityId,
140
- mediaAssetId: input.mediaAssetId,
141
- role: input.role,
142
- sortOrder: input.sortOrder ?? 0,
143
- ...(input.variantId !== undefined
144
- ? { variantId: input.variantId }
145
- : {}),
146
- }, ctx);
147
- return Ok(undefined);
148
196
  }
149
197
  /**
150
198
  * Media attached to an entity, resolved to public URLs and ordered by
@@ -104,6 +104,23 @@ export declare const prices: import("drizzle-orm/pg-core").PgTableWithColumns<{
104
104
  identity: undefined;
105
105
  generated: undefined;
106
106
  }, {}, {}>;
107
+ compareAtAmount: import("drizzle-orm/pg-core").PgColumn<{
108
+ name: "compare_at_amount";
109
+ tableName: "prices";
110
+ dataType: "number";
111
+ columnType: "PgInteger";
112
+ data: number;
113
+ driverParam: string | number;
114
+ notNull: false;
115
+ hasDefault: false;
116
+ isPrimaryKey: false;
117
+ isAutoincrement: false;
118
+ hasRuntimeDefault: false;
119
+ enumValues: undefined;
120
+ baseColumn: never;
121
+ identity: undefined;
122
+ generated: undefined;
123
+ }, {}, {}>;
107
124
  customerGroupId: import("drizzle-orm/pg-core").PgColumn<{
108
125
  name: "customer_group_id";
109
126
  tableName: "prices";
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/modules/pricing/schema.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiClB,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B1B,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/modules/pricing/schema.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkClB,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B1B,CAAC"}
@@ -12,6 +12,7 @@ export const prices = pgTable("prices", {
12
12
  variantId: uuid("variant_id").references(() => variants.id, { onDelete: "cascade" }),
13
13
  currency: text("currency").notNull(),
14
14
  amount: integer("amount").notNull(),
15
+ compareAtAmount: integer("compare_at_amount"),
15
16
  customerGroupId: text("customer_group_id"),
16
17
  minQuantity: integer("min_quantity"),
17
18
  maxQuantity: integer("max_quantity"),
@@ -4,6 +4,7 @@ export declare const SetBasePriceBodySchema: z.ZodObject<{
4
4
  variantId: z.ZodOptional<z.ZodString>;
5
5
  currency: z.ZodString;
6
6
  amount: z.ZodNumber;
7
+ compareAtAmount: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
7
8
  customerGroupId: z.ZodOptional<z.ZodString>;
8
9
  minQuantity: z.ZodOptional<z.ZodNumber>;
9
10
  maxQuantity: z.ZodOptional<z.ZodNumber>;
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/modules/pricing/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAItC,eAAO,MAAM,sBAAsB;;;;;;;;;;;iBAWF,CAAC;AAElC,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;iBAeF,CAAC;AAIpC,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACvE,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/modules/pricing/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAItC,eAAO,MAAM,sBAAsB;;;;;;;;;;;;iBAYF,CAAC;AAElC,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;iBAeF,CAAC;AAIpC,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACvE,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -5,6 +5,7 @@ export const SetBasePriceBodySchema = z.object({
5
5
  variantId: z.string().optional().openapi({ example: "variant-uuid" }),
6
6
  currency: z.string().length(3).openapi({ example: "USD" }),
7
7
  amount: z.number().openapi({ example: 29.99 }),
8
+ compareAtAmount: z.number().nullable().optional(),
8
9
  customerGroupId: z.string().optional(),
9
10
  minQuantity: z.number().int().optional(),
10
11
  maxQuantity: z.number().int().optional(),