@stapel/cdn-react 0.1.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 (164) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/MODULE.md +124 -0
  3. package/README.md +103 -0
  4. package/dist/api/cdnApi.d.ts +122 -0
  5. package/dist/api/cdnApi.d.ts.map +1 -0
  6. package/dist/api/cdnApi.js +27 -0
  7. package/dist/api/cdnApi.js.map +1 -0
  8. package/dist/api/generated/schema.d.ts +1050 -0
  9. package/dist/api/generated/schema.d.ts.map +1 -0
  10. package/dist/api/generated/schema.js +2 -0
  11. package/dist/api/generated/schema.js.map +1 -0
  12. package/dist/api/types.d.ts +76 -0
  13. package/dist/api/types.d.ts.map +1 -0
  14. package/dist/api/types.js +2 -0
  15. package/dist/api/types.js.map +1 -0
  16. package/dist/default/ErrorAlert.d.ts +8 -0
  17. package/dist/default/ErrorAlert.d.ts.map +1 -0
  18. package/dist/default/ErrorAlert.js +26 -0
  19. package/dist/default/ErrorAlert.js.map +1 -0
  20. package/dist/default/ImageUploadField.d.ts +12 -0
  21. package/dist/default/ImageUploadField.d.ts.map +1 -0
  22. package/dist/default/ImageUploadField.js +48 -0
  23. package/dist/default/ImageUploadField.js.map +1 -0
  24. package/dist/default/MediaGalleryField.d.ts +14 -0
  25. package/dist/default/MediaGalleryField.d.ts.map +1 -0
  26. package/dist/default/MediaGalleryField.js +65 -0
  27. package/dist/default/MediaGalleryField.js.map +1 -0
  28. package/dist/default/index.d.ts +15 -0
  29. package/dist/default/index.d.ts.map +1 -0
  30. package/dist/default/index.js +13 -0
  31. package/dist/default/index.js.map +1 -0
  32. package/dist/default/phase.d.ts +17 -0
  33. package/dist/default/phase.d.ts.map +1 -0
  34. package/dist/default/phase.js +25 -0
  35. package/dist/default/phase.js.map +1 -0
  36. package/dist/flows/registry.d.ts +28 -0
  37. package/dist/flows/registry.d.ts.map +1 -0
  38. package/dist/flows/registry.js +26 -0
  39. package/dist/flows/registry.js.map +1 -0
  40. package/dist/headless/CdnProvider.d.ts +18 -0
  41. package/dist/headless/CdnProvider.d.ts.map +1 -0
  42. package/dist/headless/CdnProvider.js +14 -0
  43. package/dist/headless/CdnProvider.js.map +1 -0
  44. package/dist/headless/ImageUpload.d.ts +18 -0
  45. package/dist/headless/ImageUpload.d.ts.map +1 -0
  46. package/dist/headless/ImageUpload.js +16 -0
  47. package/dist/headless/ImageUpload.js.map +1 -0
  48. package/dist/headless/MediaUploader.d.ts +31 -0
  49. package/dist/headless/MediaUploader.d.ts.map +1 -0
  50. package/dist/headless/MediaUploader.js +30 -0
  51. package/dist/headless/MediaUploader.js.map +1 -0
  52. package/dist/headless/useUploadImage.d.ts +33 -0
  53. package/dist/headless/useUploadImage.d.ts.map +1 -0
  54. package/dist/headless/useUploadImage.js +118 -0
  55. package/dist/headless/useUploadImage.js.map +1 -0
  56. package/dist/headless/useUploadPreview.d.ts +22 -0
  57. package/dist/headless/useUploadPreview.d.ts.map +1 -0
  58. package/dist/headless/useUploadPreview.js +37 -0
  59. package/dist/headless/useUploadPreview.js.map +1 -0
  60. package/dist/headless/useUploadQueue.d.ts +83 -0
  61. package/dist/headless/useUploadQueue.d.ts.map +1 -0
  62. package/dist/headless/useUploadQueue.js +0 -0
  63. package/dist/headless/useUploadQueue.js.map +1 -0
  64. package/dist/i18n/errorsMap.d.ts +12 -0
  65. package/dist/i18n/errorsMap.d.ts.map +1 -0
  66. package/dist/i18n/errorsMap.js +22 -0
  67. package/dist/i18n/errorsMap.js.map +1 -0
  68. package/dist/i18n/es.d.ts +17 -0
  69. package/dist/i18n/es.d.ts.map +1 -0
  70. package/dist/i18n/es.js +65 -0
  71. package/dist/i18n/es.js.map +1 -0
  72. package/dist/i18n/generated/errors.es.gen.d.ts +16 -0
  73. package/dist/i18n/generated/errors.es.gen.d.ts.map +1 -0
  74. package/dist/i18n/generated/errors.es.gen.js +58 -0
  75. package/dist/i18n/generated/errors.es.gen.js.map +1 -0
  76. package/dist/i18n/generated/errors.gen.d.ts +353 -0
  77. package/dist/i18n/generated/errors.gen.d.ts.map +1 -0
  78. package/dist/i18n/generated/errors.gen.js +180 -0
  79. package/dist/i18n/generated/errors.gen.js.map +1 -0
  80. package/dist/i18n/generated/errors.ru.gen.d.ts +16 -0
  81. package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -0
  82. package/dist/i18n/generated/errors.ru.gen.js +58 -0
  83. package/dist/i18n/generated/errors.ru.gen.js.map +1 -0
  84. package/dist/i18n/keys.d.ts +61 -0
  85. package/dist/i18n/keys.d.ts.map +1 -0
  86. package/dist/i18n/keys.js +110 -0
  87. package/dist/i18n/keys.js.map +1 -0
  88. package/dist/i18n/ru.d.ts +21 -0
  89. package/dist/i18n/ru.d.ts.map +1 -0
  90. package/dist/i18n/ru.js +70 -0
  91. package/dist/i18n/ru.js.map +1 -0
  92. package/dist/index.d.ts +89 -0
  93. package/dist/index.d.ts.map +1 -0
  94. package/dist/index.js +83 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/model/context.d.ts +11 -0
  97. package/dist/model/context.d.ts.map +1 -0
  98. package/dist/model/context.js +15 -0
  99. package/dist/model/context.js.map +1 -0
  100. package/dist/model/hash.d.ts +36 -0
  101. package/dist/model/hash.d.ts.map +1 -0
  102. package/dist/model/hash.js +59 -0
  103. package/dist/model/hash.js.map +1 -0
  104. package/dist/model/limits.d.ts +86 -0
  105. package/dist/model/limits.d.ts.map +1 -0
  106. package/dist/model/limits.js +163 -0
  107. package/dist/model/limits.js.map +1 -0
  108. package/dist/model/queries.d.ts +29 -0
  109. package/dist/model/queries.d.ts.map +1 -0
  110. package/dist/model/queries.js +32 -0
  111. package/dist/model/queries.js.map +1 -0
  112. package/dist/model/queryKeys.d.ts +18 -0
  113. package/dist/model/queryKeys.d.ts.map +1 -0
  114. package/dist/model/queryKeys.js +18 -0
  115. package/dist/model/queryKeys.js.map +1 -0
  116. package/dist/model/refs.d.ts +54 -0
  117. package/dist/model/refs.d.ts.map +1 -0
  118. package/dist/model/refs.js +82 -0
  119. package/dist/model/refs.js.map +1 -0
  120. package/dist/model/runtime.d.ts +40 -0
  121. package/dist/model/runtime.d.ts.map +1 -0
  122. package/dist/model/runtime.js +23 -0
  123. package/dist/model/runtime.js.map +1 -0
  124. package/dist/model/upload.d.ts +88 -0
  125. package/dist/model/upload.d.ts.map +1 -0
  126. package/dist/model/upload.js +254 -0
  127. package/dist/model/upload.js.map +1 -0
  128. package/llms.txt +83 -0
  129. package/manifest.json +601 -0
  130. package/package.json +120 -0
  131. package/src/analytics/generated/events.json +7 -0
  132. package/src/api/cdnApi.ts +187 -0
  133. package/src/api/generated/schema.ts +1052 -0
  134. package/src/api/types.ts +86 -0
  135. package/src/default/ErrorAlert.tsx +43 -0
  136. package/src/default/ImageUploadField.tsx +131 -0
  137. package/src/default/MediaGalleryField.tsx +233 -0
  138. package/src/default/index.ts +14 -0
  139. package/src/default/phase.ts +34 -0
  140. package/src/flows/registry.ts +38 -0
  141. package/src/headless/CdnProvider.tsx +19 -0
  142. package/src/headless/ImageUpload.tsx +24 -0
  143. package/src/headless/MediaUploader.tsx +43 -0
  144. package/src/headless/useUploadImage.ts +155 -0
  145. package/src/headless/useUploadPreview.ts +48 -0
  146. package/src/headless/useUploadQueue.ts +411 -0
  147. package/src/i18n/errorsMap.ts +33 -0
  148. package/src/i18n/es.ts +81 -0
  149. package/src/i18n/generated/errors.es.gen.ts +64 -0
  150. package/src/i18n/generated/errors.gen.ts +211 -0
  151. package/src/i18n/generated/errors.json +403 -0
  152. package/src/i18n/generated/errors.ru.gen.ts +64 -0
  153. package/src/i18n/keys.ts +131 -0
  154. package/src/i18n/ru.ts +85 -0
  155. package/src/index.ts +154 -0
  156. package/src/model/context.tsx +25 -0
  157. package/src/model/hash.ts +67 -0
  158. package/src/model/limits.ts +207 -0
  159. package/src/model/queries.ts +64 -0
  160. package/src/model/queryKeys.ts +23 -0
  161. package/src/model/refs.ts +95 -0
  162. package/src/model/runtime.ts +52 -0
  163. package/src/model/upload.ts +365 -0
  164. package/tsconfig.json +26 -0
@@ -0,0 +1,1050 @@
1
+ export interface paths {
2
+ "/cdn/api/v1/file/exists/": {
3
+ parameters: {
4
+ query?: never;
5
+ header?: never;
6
+ path?: never;
7
+ cookie?: never;
8
+ };
9
+ /**
10
+ * Check if file exists (GET)
11
+ * @description Check if a file with the given hash already exists in the CDN.
12
+ *
13
+ * Use this before uploading to avoid duplicate uploads.
14
+ *
15
+ * **How to calculate hash:**
16
+ * ```python
17
+ * import hashlib
18
+ *
19
+ * def calculate_file_hash(file_content: bytes) -> str:
20
+ * return hashlib.sha256(file_content).hexdigest()
21
+ * ```
22
+ *
23
+ * **Response:**
24
+ * - `exists: true` - file found, returns file details
25
+ * - `exists: false` - file not found, `type` and `file` are null
26
+ *
27
+ *
28
+ * **Permissions:** `OperandHolder`
29
+ */
30
+ get: operations["check_file_exists_get"];
31
+ put?: never;
32
+ /**
33
+ * Check if file exists (POST)
34
+ * @description Check if a file with the given hash already exists in the CDN.
35
+ *
36
+ * Same as GET method but accepts hash in request body.
37
+ * Useful when hash is very long or contains special characters.
38
+ *
39
+ *
40
+ * **Permissions:** `OperandHolder`
41
+ */
42
+ post: operations["check_file_exists_post"];
43
+ delete?: never;
44
+ options?: never;
45
+ head?: never;
46
+ patch?: never;
47
+ trace?: never;
48
+ };
49
+ "/cdn/api/v1/images/{image_type}/random/": {
50
+ parameters: {
51
+ query?: never;
52
+ header?: never;
53
+ path?: never;
54
+ cookie?: never;
55
+ };
56
+ /**
57
+ * Get random image by type
58
+ * @description Get a random image of the specified type.
59
+ *
60
+ * **Available types:** product, avatar
61
+ *
62
+ * **Requires:** Staff user or API key authentication.
63
+ *
64
+ * **Use case:** Admin UI for quickly selecting test images.
65
+ *
66
+ *
67
+ * **Permissions:** `IsStaffUser`
68
+ */
69
+ get: operations["random_image"];
70
+ put?: never;
71
+ post?: never;
72
+ delete?: never;
73
+ options?: never;
74
+ head?: never;
75
+ patch?: never;
76
+ trace?: never;
77
+ };
78
+ "/cdn/api/v1/images/{image_type}/upload/": {
79
+ parameters: {
80
+ query?: never;
81
+ header?: never;
82
+ path?: never;
83
+ cookie?: never;
84
+ };
85
+ get?: never;
86
+ put?: never;
87
+ /**
88
+ * Upload an image with specific type
89
+ * @description Upload an image file with a specific type (product, avatar).
90
+ *
91
+ * **Supported formats:** JPEG, PNG, GIF, WebP, BMP, HEIC, HEIF
92
+ *
93
+ * **Available types:** product, avatar
94
+ *
95
+ * **Maximum file size:** `STAPEL_CDN["MAX_IMAGE_SIZE"]`, 20MB by default.
96
+ * Enforced before the body is hashed; over it the answer is 413.
97
+ *
98
+ *
99
+ * **Permissions:** `IsNotAnonymousUser`
100
+ */
101
+ post: operations["upload_typed_image"];
102
+ delete?: never;
103
+ options?: never;
104
+ head?: never;
105
+ patch?: never;
106
+ trace?: never;
107
+ };
108
+ "/cdn/api/v1/refs/sync/": {
109
+ parameters: {
110
+ query?: never;
111
+ header?: never;
112
+ path?: never;
113
+ cookie?: never;
114
+ };
115
+ get?: never;
116
+ put?: never;
117
+ /**
118
+ * Sync media references
119
+ * @description Add/remove reference tracking for media files. Used by other services to track which entities reference which media.
120
+ *
121
+ * **Permissions:** `IsServiceRequest`
122
+ */
123
+ post: operations["sync_refs"];
124
+ delete?: never;
125
+ options?: never;
126
+ head?: never;
127
+ patch?: never;
128
+ trace?: never;
129
+ };
130
+ "/cdn/api/v1/upload/avatar/": {
131
+ parameters: {
132
+ query?: never;
133
+ header?: never;
134
+ path?: never;
135
+ cookie?: never;
136
+ };
137
+ get?: never;
138
+ put?: never;
139
+ /**
140
+ * Upload an avatar image
141
+ * @description Upload an avatar image file for processing.
142
+ *
143
+ * **Same as image upload but sets type to 'avatar'.**
144
+ *
145
+ * **Supported formats:** JPEG, PNG, GIF, WebP, BMP, HEIC, HEIF
146
+ *
147
+ * **Maximum file size:** `STAPEL_CDN["MAX_IMAGE_SIZE"]`, 20MB by default.
148
+ * Enforced before the body is hashed; over it the answer is 413.
149
+ *
150
+ *
151
+ * **Permissions:** `IsAuthenticated`
152
+ */
153
+ post: operations["upload_avatar"];
154
+ delete?: never;
155
+ options?: never;
156
+ head?: never;
157
+ patch?: never;
158
+ trace?: never;
159
+ };
160
+ "/cdn/api/v1/upload/file/": {
161
+ parameters: {
162
+ query?: never;
163
+ header?: never;
164
+ path?: never;
165
+ cookie?: never;
166
+ };
167
+ get?: never;
168
+ put?: never;
169
+ /**
170
+ * Upload a file
171
+ * @description Upload a generic file (document, archive, etc.).
172
+ *
173
+ * **Permissions:** `IsNotAnonymousUser`
174
+ */
175
+ post: operations["upload_file"];
176
+ delete?: never;
177
+ options?: never;
178
+ head?: never;
179
+ patch?: never;
180
+ trace?: never;
181
+ };
182
+ "/cdn/api/v1/upload/image/": {
183
+ parameters: {
184
+ query?: never;
185
+ header?: never;
186
+ path?: never;
187
+ cookie?: never;
188
+ };
189
+ get?: never;
190
+ put?: never;
191
+ /**
192
+ * Upload an image
193
+ * @description Upload an image file for processing.
194
+ *
195
+ * **Supported formats:** JPEG, PNG, GIF, WebP, BMP, HEIC, HEIF
196
+ *
197
+ * **What happens on upload:**
198
+ * 1. File hash (SHA-256) is calculated for deduplication
199
+ * 2. If file already exists, returns existing image data (200 OK)
200
+ * 3. If new file, creates image record and generates variants via background task
201
+ * 4. Variants are generated in WebP format at multiple resolutions
202
+ *
203
+ * **Generated variants (all WebP):**
204
+ * - 16px, 32px, 64px, 120px - min-side thumbnails
205
+ * - 160px, 240px, 480px, 560px, 720px, 1080px - w/h preview branches
206
+ *
207
+ * **Request format:** `multipart/form-data` with `file` field
208
+ *
209
+ * **Maximum file size:** `STAPEL_CDN["MAX_IMAGE_SIZE"]`, 20MB by default.
210
+ * Enforced before the body is hashed; over it the answer is 413.
211
+ *
212
+ *
213
+ * **Permissions:** `IsNotAnonymousUser`
214
+ */
215
+ post: operations["upload_image"];
216
+ delete?: never;
217
+ options?: never;
218
+ head?: never;
219
+ patch?: never;
220
+ trace?: never;
221
+ };
222
+ "/cdn/api/v1/upload/video/": {
223
+ parameters: {
224
+ query?: never;
225
+ header?: never;
226
+ path?: never;
227
+ cookie?: never;
228
+ };
229
+ get?: never;
230
+ put?: never;
231
+ /**
232
+ * Upload a video
233
+ * @description Upload a video file for processing.
234
+ *
235
+ * **Supported formats:** MP4, WebM, MOV, AVI, MKV
236
+ *
237
+ * **What happens on upload:**
238
+ * 1. File hash (SHA-256) is calculated for deduplication
239
+ * 2. If file already exists, returns existing video data (200 OK)
240
+ * 3. If new file, creates video record
241
+ * 4. Variant generation via FFmpeg (TODO: not yet implemented)
242
+ *
243
+ * **Planned variants:**
244
+ * - 16p, 32p - animated thumbnails
245
+ * - 240p, 480p, 720p, 1080p, 2160p - video resolutions
246
+ *
247
+ * **Request format:** `multipart/form-data` with `file` field
248
+ *
249
+ * **Maximum file size:** `STAPEL_CDN["MAX_VIDEO_SIZE"]`, 100MB by default.
250
+ * Enforced before the body is hashed; over it the answer is 413.
251
+ *
252
+ *
253
+ * **Permissions:** `IsNotAnonymousUser`
254
+ */
255
+ post: operations["upload_video"];
256
+ delete?: never;
257
+ options?: never;
258
+ head?: never;
259
+ patch?: never;
260
+ trace?: never;
261
+ };
262
+ }
263
+ export type webhooks = Record<string, never>;
264
+ export interface components {
265
+ schemas: {
266
+ /** @description Serializer for file existence check by hash. */
267
+ FileExists: {
268
+ /** @description SHA-256 hash of the file content (64 hex characters) */
269
+ file_hash: string;
270
+ };
271
+ /** @description File existence check result. */
272
+ FileExistsResponse: {
273
+ /** @description File object if found, null otherwise */
274
+ file: (components["schemas"]["Image"] | components["schemas"]["Video"] | components["schemas"]["FileModel"]) | null;
275
+ /**
276
+ * @description Whether the file exists
277
+ * @example true
278
+ */
279
+ exists: boolean;
280
+ /**
281
+ * @description File type if found (image or video)
282
+ * @example image
283
+ */
284
+ type: string | null;
285
+ };
286
+ /** @description Serializer for File model. */
287
+ FileModel: {
288
+ readonly id: number;
289
+ /** @description SHA-256 hash of the original file */
290
+ readonly file_hash: string;
291
+ original_filename: string;
292
+ file_extension: string;
293
+ mime_type?: string;
294
+ /** @description File size in bytes */
295
+ readonly original_size: number;
296
+ /** @description URL prefix: file/<hash> */
297
+ readonly prefix: string;
298
+ /**
299
+ * Format: uri
300
+ * @description URL to original uploaded file
301
+ */
302
+ readonly original_url: string;
303
+ /** @description List of references: service/entity_type/entity_id */
304
+ refs?: string[];
305
+ /** Format: uuid */
306
+ readonly uploaded_by: string | null;
307
+ readonly uploaded_by_username: string;
308
+ /** Format: date-time */
309
+ readonly created_at: string;
310
+ /** Format: date-time */
311
+ readonly updated_at: string;
312
+ };
313
+ /**
314
+ * @description Serializer for file upload requests.
315
+ *
316
+ * Upload a file using multipart/form-data with the 'file' field.
317
+ */
318
+ FileUpload: {
319
+ /**
320
+ * Format: uri
321
+ * @description The file to upload. Images: jpg, jpeg, png, gif, webp, bmp, heic, heif. Videos: mp4, webm, mov, avi, mkv.
322
+ */
323
+ file: string;
324
+ };
325
+ /** @description Successful file upload. */
326
+ FileUploadResponse: {
327
+ /** @description Uploaded file object */
328
+ file: components["schemas"]["FileModel"];
329
+ /**
330
+ * @description Confirmation message
331
+ * @example File uploaded successfully
332
+ */
333
+ message: string;
334
+ };
335
+ /**
336
+ * @description Serializer for Image model.
337
+ *
338
+ * Returns complete image information including all generated variants.
339
+ * Variants are auto-generated in WebP format for optimal compression.
340
+ */
341
+ Image: {
342
+ readonly id: number;
343
+ /** @description SHA-256 hash of the original file */
344
+ readonly file_hash: string;
345
+ original_filename: string;
346
+ file_extension: string;
347
+ /**
348
+ * @description Image type — validated against STAPEL_CDN['ASSET_TYPES'] (default ('avatar',); the historical 'product' default value here is only in scope for host projects that still add it).
349
+ *
350
+ * * `avatar` - Avatar
351
+ * @default product
352
+ */
353
+ readonly type: components["schemas"]["TypeEnum"];
354
+ /** @description URL prefix: <type>/<hash> */
355
+ readonly prefix: string;
356
+ readonly original_width: number;
357
+ readonly original_height: number;
358
+ /** @description File size in bytes */
359
+ readonly original_size: number;
360
+ /**
361
+ * Format: uri
362
+ * @description URL to original uploaded image
363
+ */
364
+ readonly original_url: string;
365
+ /**
366
+ * Format: uri
367
+ * @description 16px micro thumbnail, min-side (WebP)
368
+ */
369
+ readonly variant_16_url: string;
370
+ /**
371
+ * Format: uri
372
+ * @description 32px thumbnail, min-side (WebP)
373
+ */
374
+ readonly variant_32_url: string;
375
+ /**
376
+ * Format: uri
377
+ * @description 64px thumbnail, min-side (WebP)
378
+ */
379
+ readonly variant_64_url: string;
380
+ /**
381
+ * Format: uri
382
+ * @description 120px thumbnail, min-side (WebP)
383
+ */
384
+ readonly variant_120_url: string;
385
+ /**
386
+ * Format: uri
387
+ * @description 160px preview, w-branch (WebP)
388
+ */
389
+ readonly variant_160_url: string;
390
+ /**
391
+ * Format: uri
392
+ * @description 240px preview, w-branch (WebP)
393
+ */
394
+ readonly variant_240_url: string;
395
+ /**
396
+ * Format: uri
397
+ * @description 480px preview, w-branch (WebP)
398
+ */
399
+ readonly variant_480_url: string;
400
+ /**
401
+ * Format: uri
402
+ * @description 560px preview, w-branch (WebP)
403
+ */
404
+ readonly variant_560_url: string;
405
+ /**
406
+ * Format: uri
407
+ * @description 720px preview, w-branch (WebP)
408
+ */
409
+ readonly variant_720_url: string;
410
+ /**
411
+ * Format: uri
412
+ * @description 1080px preview, w-branch (WebP)
413
+ */
414
+ readonly variant_1080_url: string;
415
+ /**
416
+ * Format: uri
417
+ * @description 1440px 2K (WebP)
418
+ */
419
+ readonly variant_1440_url: string;
420
+ /**
421
+ * Format: uri
422
+ * @description 2160px 4K (WebP)
423
+ */
424
+ readonly variant_2160_url: string;
425
+ /** @description Generated variants with geometry: [{tier, branch, url, width, height}] */
426
+ readonly variants_meta: {
427
+ tier: number;
428
+ /**
429
+ * @description None for thumbnail-class (min-side) tiers.
430
+ * @enum {string|null}
431
+ */
432
+ branch?: "w" | "h" | null;
433
+ url: string;
434
+ width: number;
435
+ height: number;
436
+ }[];
437
+ /** @description Whether variants have been generated */
438
+ readonly is_processed: boolean;
439
+ /** Format: uuid */
440
+ readonly uploaded_by: string | null;
441
+ readonly uploaded_by_username: string;
442
+ /** Format: date-time */
443
+ readonly created_at: string;
444
+ /** Format: date-time */
445
+ readonly updated_at: string;
446
+ };
447
+ /** @description Successful image upload. */
448
+ ImageUploadResponse: {
449
+ /** @description Uploaded image object (serialized by ImageSerializer) */
450
+ image: components["schemas"]["Image"];
451
+ /**
452
+ * @description Confirmation message
453
+ * @example Image uploaded successfully
454
+ */
455
+ message: string;
456
+ };
457
+ /** @description CDN reference sync request. */
458
+ RefSyncRequest: {
459
+ /**
460
+ * @description Service name
461
+ * @example auth
462
+ */
463
+ service: string;
464
+ /**
465
+ * @description Entity type
466
+ * @example profile
467
+ */
468
+ entity_type: string;
469
+ /**
470
+ * @description Entity identifier
471
+ * @example 464
472
+ */
473
+ entity_id: string;
474
+ /**
475
+ * @description Previous media references
476
+ * @example [
477
+ * "product/hash1",
478
+ * "product/hash2"
479
+ * ]
480
+ */
481
+ old_hashes: string[];
482
+ /**
483
+ * @description Current media references
484
+ * @example [
485
+ * "product/hash2",
486
+ * "product/hash3"
487
+ * ]
488
+ */
489
+ new_hashes: string[];
490
+ };
491
+ /** @description CDN reference sync result. */
492
+ RefSyncResponse: {
493
+ /**
494
+ * @description Number of refs added
495
+ * @example 1
496
+ */
497
+ added: number;
498
+ /**
499
+ * @description Number of refs removed
500
+ * @example 1
501
+ */
502
+ removed: number;
503
+ /**
504
+ * @description List of unresolved media references
505
+ * @example [
506
+ * "product/nonexistent"
507
+ * ]
508
+ */
509
+ errors: string[];
510
+ };
511
+ /** @description Structured error returned by all Stapel API endpoints. */
512
+ StapelError: {
513
+ /**
514
+ * @description Translation key for client-side localization
515
+ * @example error.404.not_found
516
+ */
517
+ localizable_error: string;
518
+ /** @description Human-readable fallback/debug message — not reliably English, */
519
+ error: string;
520
+ /**
521
+ * @description Context values for template placeholders
522
+ * @example {
523
+ * "retry_after": 30
524
+ * }
525
+ */
526
+ params?: {
527
+ [key: string]: unknown;
528
+ };
529
+ /** @description Active Django locale `error` was rendered in (e.g */
530
+ error_language?: string;
531
+ };
532
+ /**
533
+ * @description * `avatar` - Avatar
534
+ * @enum {string}
535
+ */
536
+ TypeEnum: "avatar";
537
+ /** @description Serializer for Video model. */
538
+ Video: {
539
+ readonly id: number;
540
+ /** @description SHA-256 hash of the original file */
541
+ readonly file_hash: string;
542
+ original_filename: string;
543
+ file_extension: string;
544
+ readonly original_width: number | null;
545
+ readonly original_height: number | null;
546
+ /** @description File size in bytes */
547
+ readonly original_size: number;
548
+ /**
549
+ * Format: double
550
+ * @description Duration in seconds
551
+ */
552
+ readonly duration: number | null;
553
+ /** Format: uri */
554
+ readonly original_url: string;
555
+ /** Format: uri */
556
+ readonly variant_16p_url: string;
557
+ /** Format: uri */
558
+ readonly variant_32p_url: string;
559
+ /** Format: uri */
560
+ readonly variant_240p_url: string;
561
+ /** Format: uri */
562
+ readonly variant_480p_url: string;
563
+ /** Format: uri */
564
+ readonly variant_720p_url: string;
565
+ /** Format: uri */
566
+ readonly variant_1080p_url: string;
567
+ /** Format: uri */
568
+ readonly variant_2160p_url: string;
569
+ /** @description Whether variants have been generated */
570
+ readonly is_processed: boolean;
571
+ /** Format: uuid */
572
+ readonly uploaded_by: string | null;
573
+ readonly uploaded_by_username: string;
574
+ /** Format: date-time */
575
+ readonly created_at: string;
576
+ /** Format: date-time */
577
+ readonly updated_at: string;
578
+ };
579
+ /** @description Successful video upload. */
580
+ VideoUploadResponse: {
581
+ /** @description Uploaded video object (serialized by VideoSerializer) */
582
+ video: components["schemas"]["Video"];
583
+ /**
584
+ * @description Confirmation message
585
+ * @example Video uploaded successfully
586
+ */
587
+ message: string;
588
+ };
589
+ };
590
+ responses: never;
591
+ parameters: never;
592
+ requestBodies: never;
593
+ headers: never;
594
+ pathItems: never;
595
+ }
596
+ export type $defs = Record<string, never>;
597
+ export interface operations {
598
+ check_file_exists_get: {
599
+ parameters: {
600
+ query: {
601
+ /** @description SHA-256 hash of the file (64 hex characters) */
602
+ file_hash: string;
603
+ };
604
+ header?: never;
605
+ path?: never;
606
+ cookie?: never;
607
+ };
608
+ requestBody?: never;
609
+ responses: {
610
+ 200: {
611
+ headers: {
612
+ [name: string]: unknown;
613
+ };
614
+ content: {
615
+ "application/json": components["schemas"]["FileExistsResponse"];
616
+ };
617
+ };
618
+ 400: {
619
+ headers: {
620
+ [name: string]: unknown;
621
+ };
622
+ content: {
623
+ "application/json": components["schemas"]["StapelError"];
624
+ };
625
+ };
626
+ 401: {
627
+ headers: {
628
+ [name: string]: unknown;
629
+ };
630
+ content: {
631
+ "application/json": components["schemas"]["StapelError"];
632
+ };
633
+ };
634
+ };
635
+ };
636
+ check_file_exists_post: {
637
+ parameters: {
638
+ query?: never;
639
+ header?: never;
640
+ path?: never;
641
+ cookie?: never;
642
+ };
643
+ requestBody: {
644
+ content: {
645
+ "application/json": components["schemas"]["FileExists"];
646
+ "application/x-www-form-urlencoded": components["schemas"]["FileExists"];
647
+ "multipart/form-data": components["schemas"]["FileExists"];
648
+ };
649
+ };
650
+ responses: {
651
+ 200: {
652
+ headers: {
653
+ [name: string]: unknown;
654
+ };
655
+ content: {
656
+ "application/json": components["schemas"]["FileExistsResponse"];
657
+ };
658
+ };
659
+ 400: {
660
+ headers: {
661
+ [name: string]: unknown;
662
+ };
663
+ content: {
664
+ "application/json": components["schemas"]["StapelError"];
665
+ };
666
+ };
667
+ 401: {
668
+ headers: {
669
+ [name: string]: unknown;
670
+ };
671
+ content: {
672
+ "application/json": components["schemas"]["StapelError"];
673
+ };
674
+ };
675
+ };
676
+ };
677
+ random_image: {
678
+ parameters: {
679
+ query?: never;
680
+ header?: never;
681
+ path: {
682
+ image_type: string;
683
+ };
684
+ cookie?: never;
685
+ };
686
+ requestBody?: never;
687
+ responses: {
688
+ 200: {
689
+ headers: {
690
+ [name: string]: unknown;
691
+ };
692
+ content: {
693
+ "application/json": components["schemas"]["Image"];
694
+ };
695
+ };
696
+ 400: {
697
+ headers: {
698
+ [name: string]: unknown;
699
+ };
700
+ content: {
701
+ "application/json": components["schemas"]["StapelError"];
702
+ };
703
+ };
704
+ 401: {
705
+ headers: {
706
+ [name: string]: unknown;
707
+ };
708
+ content: {
709
+ "application/json": components["schemas"]["StapelError"];
710
+ };
711
+ };
712
+ 403: {
713
+ headers: {
714
+ [name: string]: unknown;
715
+ };
716
+ content: {
717
+ "application/json": components["schemas"]["StapelError"];
718
+ };
719
+ };
720
+ 404: {
721
+ headers: {
722
+ [name: string]: unknown;
723
+ };
724
+ content: {
725
+ "application/json": components["schemas"]["StapelError"];
726
+ };
727
+ };
728
+ };
729
+ };
730
+ upload_typed_image: {
731
+ parameters: {
732
+ query?: never;
733
+ header?: never;
734
+ path: {
735
+ image_type: string;
736
+ };
737
+ cookie?: never;
738
+ };
739
+ requestBody?: {
740
+ content: {
741
+ "multipart/form-data": {
742
+ /**
743
+ * Format: binary
744
+ * @description Image file to upload
745
+ */
746
+ file: string;
747
+ };
748
+ };
749
+ };
750
+ responses: {
751
+ 200: {
752
+ headers: {
753
+ [name: string]: unknown;
754
+ };
755
+ content: {
756
+ "application/json": components["schemas"]["ImageUploadResponse"];
757
+ };
758
+ };
759
+ 201: {
760
+ headers: {
761
+ [name: string]: unknown;
762
+ };
763
+ content: {
764
+ "application/json": components["schemas"]["ImageUploadResponse"];
765
+ };
766
+ };
767
+ 400: {
768
+ headers: {
769
+ [name: string]: unknown;
770
+ };
771
+ content: {
772
+ "application/json": components["schemas"]["StapelError"];
773
+ };
774
+ };
775
+ 401: {
776
+ headers: {
777
+ [name: string]: unknown;
778
+ };
779
+ content: {
780
+ "application/json": components["schemas"]["StapelError"];
781
+ };
782
+ };
783
+ 500: {
784
+ headers: {
785
+ [name: string]: unknown;
786
+ };
787
+ content: {
788
+ "application/json": components["schemas"]["StapelError"];
789
+ };
790
+ };
791
+ };
792
+ };
793
+ sync_refs: {
794
+ parameters: {
795
+ query?: never;
796
+ header?: never;
797
+ path?: never;
798
+ cookie?: never;
799
+ };
800
+ requestBody: {
801
+ content: {
802
+ "application/json": components["schemas"]["RefSyncRequest"];
803
+ "application/x-www-form-urlencoded": components["schemas"]["RefSyncRequest"];
804
+ "multipart/form-data": components["schemas"]["RefSyncRequest"];
805
+ };
806
+ };
807
+ responses: {
808
+ 200: {
809
+ headers: {
810
+ [name: string]: unknown;
811
+ };
812
+ content: {
813
+ "application/json": components["schemas"]["RefSyncResponse"];
814
+ };
815
+ };
816
+ };
817
+ };
818
+ upload_avatar: {
819
+ parameters: {
820
+ query?: never;
821
+ header?: never;
822
+ path?: never;
823
+ cookie?: never;
824
+ };
825
+ requestBody?: {
826
+ content: {
827
+ "multipart/form-data": {
828
+ /**
829
+ * Format: binary
830
+ * @description Avatar image file to upload
831
+ */
832
+ file: string;
833
+ };
834
+ };
835
+ };
836
+ responses: {
837
+ 200: {
838
+ headers: {
839
+ [name: string]: unknown;
840
+ };
841
+ content: {
842
+ "application/json": components["schemas"]["ImageUploadResponse"];
843
+ };
844
+ };
845
+ 201: {
846
+ headers: {
847
+ [name: string]: unknown;
848
+ };
849
+ content: {
850
+ "application/json": components["schemas"]["ImageUploadResponse"];
851
+ };
852
+ };
853
+ 400: {
854
+ headers: {
855
+ [name: string]: unknown;
856
+ };
857
+ content: {
858
+ "application/json": components["schemas"]["StapelError"];
859
+ };
860
+ };
861
+ 401: {
862
+ headers: {
863
+ [name: string]: unknown;
864
+ };
865
+ content: {
866
+ "application/json": components["schemas"]["StapelError"];
867
+ };
868
+ };
869
+ 500: {
870
+ headers: {
871
+ [name: string]: unknown;
872
+ };
873
+ content: {
874
+ "application/json": components["schemas"]["StapelError"];
875
+ };
876
+ };
877
+ };
878
+ };
879
+ upload_file: {
880
+ parameters: {
881
+ query?: never;
882
+ header?: never;
883
+ path?: never;
884
+ cookie?: never;
885
+ };
886
+ requestBody?: {
887
+ content: {
888
+ "multipart/form-data": {
889
+ /**
890
+ * Format: binary
891
+ * @description File to upload
892
+ */
893
+ file: string;
894
+ };
895
+ };
896
+ };
897
+ responses: {
898
+ 200: {
899
+ headers: {
900
+ [name: string]: unknown;
901
+ };
902
+ content: {
903
+ "application/json": components["schemas"]["FileUploadResponse"];
904
+ };
905
+ };
906
+ 201: {
907
+ headers: {
908
+ [name: string]: unknown;
909
+ };
910
+ content: {
911
+ "application/json": components["schemas"]["FileUploadResponse"];
912
+ };
913
+ };
914
+ 400: {
915
+ headers: {
916
+ [name: string]: unknown;
917
+ };
918
+ content: {
919
+ "application/json": components["schemas"]["StapelError"];
920
+ };
921
+ };
922
+ };
923
+ };
924
+ upload_image: {
925
+ parameters: {
926
+ query?: never;
927
+ header?: never;
928
+ path?: never;
929
+ cookie?: never;
930
+ };
931
+ requestBody: {
932
+ content: {
933
+ "multipart/form-data": components["schemas"]["FileUpload"];
934
+ "application/x-www-form-urlencoded": components["schemas"]["FileUpload"];
935
+ };
936
+ };
937
+ responses: {
938
+ 200: {
939
+ headers: {
940
+ [name: string]: unknown;
941
+ };
942
+ content: {
943
+ "application/json": components["schemas"]["ImageUploadResponse"];
944
+ };
945
+ };
946
+ 201: {
947
+ headers: {
948
+ [name: string]: unknown;
949
+ };
950
+ content: {
951
+ "application/json": components["schemas"]["ImageUploadResponse"];
952
+ };
953
+ };
954
+ 400: {
955
+ headers: {
956
+ [name: string]: unknown;
957
+ };
958
+ content: {
959
+ "application/json": components["schemas"]["StapelError"];
960
+ };
961
+ };
962
+ 401: {
963
+ headers: {
964
+ [name: string]: unknown;
965
+ };
966
+ content: {
967
+ "application/json": components["schemas"]["StapelError"];
968
+ };
969
+ };
970
+ 500: {
971
+ headers: {
972
+ [name: string]: unknown;
973
+ };
974
+ content: {
975
+ "application/json": components["schemas"]["StapelError"];
976
+ };
977
+ };
978
+ };
979
+ };
980
+ upload_video: {
981
+ parameters: {
982
+ query?: never;
983
+ header?: never;
984
+ path?: never;
985
+ cookie?: never;
986
+ };
987
+ requestBody?: {
988
+ content: {
989
+ "multipart/form-data": {
990
+ /**
991
+ * Format: binary
992
+ * @description Video file to upload (mp4, webm, mov, avi, mkv)
993
+ */
994
+ file: string;
995
+ };
996
+ };
997
+ };
998
+ responses: {
999
+ 200: {
1000
+ headers: {
1001
+ [name: string]: unknown;
1002
+ };
1003
+ content: {
1004
+ "application/json": components["schemas"]["VideoUploadResponse"];
1005
+ };
1006
+ };
1007
+ 201: {
1008
+ headers: {
1009
+ [name: string]: unknown;
1010
+ };
1011
+ content: {
1012
+ "application/json": components["schemas"]["VideoUploadResponse"];
1013
+ };
1014
+ };
1015
+ 400: {
1016
+ headers: {
1017
+ [name: string]: unknown;
1018
+ };
1019
+ content: {
1020
+ "application/json": components["schemas"]["StapelError"];
1021
+ };
1022
+ };
1023
+ 401: {
1024
+ headers: {
1025
+ [name: string]: unknown;
1026
+ };
1027
+ content: {
1028
+ "application/json": components["schemas"]["StapelError"];
1029
+ };
1030
+ };
1031
+ 413: {
1032
+ headers: {
1033
+ [name: string]: unknown;
1034
+ };
1035
+ content: {
1036
+ "application/json": components["schemas"]["StapelError"];
1037
+ };
1038
+ };
1039
+ 500: {
1040
+ headers: {
1041
+ [name: string]: unknown;
1042
+ };
1043
+ content: {
1044
+ "application/json": components["schemas"]["StapelError"];
1045
+ };
1046
+ };
1047
+ };
1048
+ };
1049
+ }
1050
+ //# sourceMappingURL=schema.d.ts.map