@axium/storage 0.13.4 → 0.14.1
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/client/local.d.ts +22 -0
- package/dist/common.d.ts +264 -0
- package/dist/common.js +2 -1
- package/dist/server/api.js +4 -0
- package/dist/server/config.js +23 -2
- package/dist/server/db.d.ts +1 -0
- package/dist/server/db.js +7 -0
- package/dist/server/hooks.js +2 -4
- package/lib/List.svelte +30 -11
- package/package.json +4 -4
- package/routes/files/+layout.ts +2 -2
- package/routes/files/+page.svelte +1 -1
- package/routes/files/[id]/+page.svelte +1 -1
- package/routes/files/shared/+page.svelte +4 -30
- package/routes/files/usage/+page.svelte +1 -1
package/dist/client/local.d.ts
CHANGED
|
@@ -18,6 +18,28 @@ declare const StorageCache: z.ZodObject<{
|
|
|
18
18
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
19
19
|
type: z.ZodString;
|
|
20
20
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
21
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
22
|
+
itemId: z.ZodUUID;
|
|
23
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
24
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
25
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
26
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
27
|
+
id: z.ZodUUID;
|
|
28
|
+
name: z.ZodString;
|
|
29
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
30
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
31
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
32
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
33
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
34
|
+
}, z.core.$strip>>>;
|
|
35
|
+
roles: z.ZodArray<z.ZodString>;
|
|
36
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
37
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
38
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
39
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
40
|
+
}, z.core.$strip>>>;
|
|
41
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
42
|
+
}, z.core.$loose>>>;
|
|
21
43
|
}, z.core.$strip>>;
|
|
22
44
|
users: z.ZodRecord<z.ZodUUID, z.ZodObject<{
|
|
23
45
|
id: z.ZodUUID;
|
package/dist/common.d.ts
CHANGED
|
@@ -22,6 +22,28 @@ export declare const StorageItemMetadata: z.ZodObject<{
|
|
|
22
22
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
23
23
|
type: z.ZodString;
|
|
24
24
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
25
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
26
|
+
itemId: z.ZodUUID;
|
|
27
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
28
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
29
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
30
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
31
|
+
id: z.ZodUUID;
|
|
32
|
+
name: z.ZodString;
|
|
33
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
34
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
35
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
36
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
37
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
38
|
+
}, z.core.$strip>>>;
|
|
39
|
+
roles: z.ZodArray<z.ZodString>;
|
|
40
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
41
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
42
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
43
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
44
|
+
}, z.core.$strip>>>;
|
|
45
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
46
|
+
}, z.core.$loose>>>;
|
|
25
47
|
}, z.core.$strip>;
|
|
26
48
|
export interface StorageItemMetadata<T extends Record<string, unknown> = Record<string, unknown>> extends z.infer<typeof StorageItemMetadata> {
|
|
27
49
|
metadata: T;
|
|
@@ -70,6 +92,28 @@ export declare const UserStorage: z.ZodObject<{
|
|
|
70
92
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
71
93
|
type: z.ZodString;
|
|
72
94
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
95
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
96
|
+
itemId: z.ZodUUID;
|
|
97
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
98
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
99
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
100
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
101
|
+
id: z.ZodUUID;
|
|
102
|
+
name: z.ZodString;
|
|
103
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
104
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
105
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
106
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
107
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
108
|
+
}, z.core.$strip>>>;
|
|
109
|
+
roles: z.ZodArray<z.ZodString>;
|
|
110
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
111
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
112
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
113
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
114
|
+
}, z.core.$strip>>>;
|
|
115
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
116
|
+
}, z.core.$loose>>>;
|
|
73
117
|
}, z.core.$strip>>;
|
|
74
118
|
limits: z.ZodObject<{
|
|
75
119
|
item_size: z.ZodInt;
|
|
@@ -178,6 +222,28 @@ declare const StorageAPI: {
|
|
|
178
222
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
179
223
|
type: z.ZodString;
|
|
180
224
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
225
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
226
|
+
itemId: z.ZodUUID;
|
|
227
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
228
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
229
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
230
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
231
|
+
id: z.ZodUUID;
|
|
232
|
+
name: z.ZodString;
|
|
233
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
234
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
235
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
236
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
237
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
238
|
+
}, z.core.$strip>>>;
|
|
239
|
+
roles: z.ZodArray<z.ZodString>;
|
|
240
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
241
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
242
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
243
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
244
|
+
}, z.core.$strip>>>;
|
|
245
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
246
|
+
}, z.core.$loose>>>;
|
|
181
247
|
}, z.core.$strip>>;
|
|
182
248
|
limits: z.ZodObject<{
|
|
183
249
|
item_size: z.ZodInt;
|
|
@@ -205,6 +271,28 @@ declare const StorageAPI: {
|
|
|
205
271
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
206
272
|
type: z.ZodString;
|
|
207
273
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
274
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
275
|
+
itemId: z.ZodUUID;
|
|
276
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
277
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
278
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
279
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
280
|
+
id: z.ZodUUID;
|
|
281
|
+
name: z.ZodString;
|
|
282
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
283
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
284
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
285
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
286
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
287
|
+
}, z.core.$strip>>>;
|
|
288
|
+
roles: z.ZodArray<z.ZodString>;
|
|
289
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
290
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
291
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
292
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
293
|
+
}, z.core.$strip>>>;
|
|
294
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
295
|
+
}, z.core.$loose>>>;
|
|
208
296
|
}, z.core.$strip>>;
|
|
209
297
|
};
|
|
210
298
|
readonly 'users/:id/storage/trash': {
|
|
@@ -222,6 +310,28 @@ declare const StorageAPI: {
|
|
|
222
310
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
223
311
|
type: z.ZodString;
|
|
224
312
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
313
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
314
|
+
itemId: z.ZodUUID;
|
|
315
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
316
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
317
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
318
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
319
|
+
id: z.ZodUUID;
|
|
320
|
+
name: z.ZodString;
|
|
321
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
322
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
323
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
324
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
325
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
326
|
+
}, z.core.$strip>>>;
|
|
327
|
+
roles: z.ZodArray<z.ZodString>;
|
|
328
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
329
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
330
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
331
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
332
|
+
}, z.core.$strip>>>;
|
|
333
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
334
|
+
}, z.core.$loose>>>;
|
|
225
335
|
}, z.core.$strip>>;
|
|
226
336
|
};
|
|
227
337
|
readonly 'users/:id/storage/shared': {
|
|
@@ -239,6 +349,28 @@ declare const StorageAPI: {
|
|
|
239
349
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
240
350
|
type: z.ZodString;
|
|
241
351
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
352
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
353
|
+
itemId: z.ZodUUID;
|
|
354
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
355
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
356
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
357
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
358
|
+
id: z.ZodUUID;
|
|
359
|
+
name: z.ZodString;
|
|
360
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
361
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
362
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
363
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
364
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
365
|
+
}, z.core.$strip>>>;
|
|
366
|
+
roles: z.ZodArray<z.ZodString>;
|
|
367
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
368
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
369
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
370
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
371
|
+
}, z.core.$strip>>>;
|
|
372
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
373
|
+
}, z.core.$loose>>>;
|
|
242
374
|
}, z.core.$strip>>;
|
|
243
375
|
};
|
|
244
376
|
readonly storage: {
|
|
@@ -281,6 +413,28 @@ declare const StorageAPI: {
|
|
|
281
413
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
282
414
|
type: z.ZodString;
|
|
283
415
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
416
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
417
|
+
itemId: z.ZodUUID;
|
|
418
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
419
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
420
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
421
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
422
|
+
id: z.ZodUUID;
|
|
423
|
+
name: z.ZodString;
|
|
424
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
425
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
426
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
427
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
428
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
429
|
+
}, z.core.$strip>>>;
|
|
430
|
+
roles: z.ZodArray<z.ZodString>;
|
|
431
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
432
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
433
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
434
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
435
|
+
}, z.core.$strip>>>;
|
|
436
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
437
|
+
}, z.core.$loose>>>;
|
|
284
438
|
}, z.core.$strip>>];
|
|
285
439
|
};
|
|
286
440
|
readonly 'storage/item/:id': {
|
|
@@ -298,6 +452,28 @@ declare const StorageAPI: {
|
|
|
298
452
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
299
453
|
type: z.ZodString;
|
|
300
454
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
455
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
456
|
+
itemId: z.ZodUUID;
|
|
457
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
458
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
459
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
460
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
461
|
+
id: z.ZodUUID;
|
|
462
|
+
name: z.ZodString;
|
|
463
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
464
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
465
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
466
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
467
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
468
|
+
}, z.core.$strip>>>;
|
|
469
|
+
roles: z.ZodArray<z.ZodString>;
|
|
470
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
471
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
472
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
473
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
474
|
+
}, z.core.$strip>>>;
|
|
475
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
476
|
+
}, z.core.$loose>>>;
|
|
301
477
|
}, z.core.$strip>;
|
|
302
478
|
readonly DELETE: z.ZodObject<{
|
|
303
479
|
createdAt: z.ZodCoercedDate<unknown>;
|
|
@@ -313,6 +489,28 @@ declare const StorageAPI: {
|
|
|
313
489
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
314
490
|
type: z.ZodString;
|
|
315
491
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
492
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
493
|
+
itemId: z.ZodUUID;
|
|
494
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
495
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
496
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
497
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
498
|
+
id: z.ZodUUID;
|
|
499
|
+
name: z.ZodString;
|
|
500
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
501
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
502
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
503
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
504
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
505
|
+
}, z.core.$strip>>>;
|
|
506
|
+
roles: z.ZodArray<z.ZodString>;
|
|
507
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
508
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
509
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
510
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
511
|
+
}, z.core.$strip>>>;
|
|
512
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
513
|
+
}, z.core.$loose>>>;
|
|
316
514
|
}, z.core.$strip>;
|
|
317
515
|
readonly PATCH: readonly [z.ZodObject<{
|
|
318
516
|
name: z.ZodOptional<z.ZodString>;
|
|
@@ -332,6 +530,28 @@ declare const StorageAPI: {
|
|
|
332
530
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
333
531
|
type: z.ZodString;
|
|
334
532
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
533
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
534
|
+
itemId: z.ZodUUID;
|
|
535
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
536
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
537
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
538
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
539
|
+
id: z.ZodUUID;
|
|
540
|
+
name: z.ZodString;
|
|
541
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
542
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
543
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
544
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
545
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
546
|
+
}, z.core.$strip>>>;
|
|
547
|
+
roles: z.ZodArray<z.ZodString>;
|
|
548
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
549
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
550
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
551
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
552
|
+
}, z.core.$strip>>>;
|
|
553
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
554
|
+
}, z.core.$loose>>>;
|
|
335
555
|
}, z.core.$strip>];
|
|
336
556
|
};
|
|
337
557
|
readonly 'storage/directory/:id': {
|
|
@@ -349,6 +569,28 @@ declare const StorageAPI: {
|
|
|
349
569
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
350
570
|
type: z.ZodString;
|
|
351
571
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
572
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
573
|
+
itemId: z.ZodUUID;
|
|
574
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
575
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
576
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
577
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
578
|
+
id: z.ZodUUID;
|
|
579
|
+
name: z.ZodString;
|
|
580
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
581
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
582
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
583
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
584
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
585
|
+
}, z.core.$strip>>>;
|
|
586
|
+
roles: z.ZodArray<z.ZodString>;
|
|
587
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
588
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
589
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
590
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
591
|
+
}, z.core.$strip>>>;
|
|
592
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
593
|
+
}, z.core.$loose>>>;
|
|
352
594
|
}, z.core.$strip>>;
|
|
353
595
|
};
|
|
354
596
|
readonly 'storage/directory/:id/recursive': {
|
|
@@ -366,6 +608,28 @@ declare const StorageAPI: {
|
|
|
366
608
|
trashedAt: z.ZodNullable<z.ZodCoercedDate<unknown>>;
|
|
367
609
|
type: z.ZodString;
|
|
368
610
|
metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
611
|
+
acl: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
612
|
+
itemId: z.ZodUUID;
|
|
613
|
+
userId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
614
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
615
|
+
tag: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
616
|
+
user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
617
|
+
id: z.ZodUUID;
|
|
618
|
+
name: z.ZodString;
|
|
619
|
+
email: z.ZodOptional<z.ZodEmail>;
|
|
620
|
+
emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
|
|
621
|
+
image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
|
|
622
|
+
preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
|
|
623
|
+
debug: z.ZodDefault<z.ZodBoolean>;
|
|
624
|
+
}, z.core.$strip>>>;
|
|
625
|
+
roles: z.ZodArray<z.ZodString>;
|
|
626
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
627
|
+
registeredAt: z.ZodCoercedDate<unknown>;
|
|
628
|
+
isAdmin: z.ZodOptional<z.ZodBoolean>;
|
|
629
|
+
isSuspended: z.ZodOptional<z.ZodBoolean>;
|
|
630
|
+
}, z.core.$strip>>>;
|
|
631
|
+
createdAt: z.ZodCoercedDate<unknown>;
|
|
632
|
+
}, z.core.$loose>>>;
|
|
369
633
|
path: z.ZodString;
|
|
370
634
|
}, z.core.$strip>>;
|
|
371
635
|
};
|
package/dist/common.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $API, setServerConfig } from '@axium/core';
|
|
1
|
+
import { $API, AccessControl, setServerConfig } from '@axium/core';
|
|
2
2
|
import * as z from 'zod';
|
|
3
3
|
/**
|
|
4
4
|
* An update to file metadata.
|
|
@@ -25,6 +25,7 @@ export const StorageItemMetadata = z.object({
|
|
|
25
25
|
trashedAt: z.coerce.date().nullable(),
|
|
26
26
|
type: z.string(),
|
|
27
27
|
metadata: z.record(z.string(), z.unknown()),
|
|
28
|
+
acl: AccessControl.array().optional(),
|
|
28
29
|
});
|
|
29
30
|
export const syncProtocolVersion = 0;
|
|
30
31
|
export const StorageLimits = z.object({
|
package/dist/server/api.js
CHANGED
|
@@ -9,6 +9,7 @@ import { batchFormatVersion, StorageItemUpdate, syncProtocolVersion } from '../c
|
|
|
9
9
|
import '../polyfills.js';
|
|
10
10
|
import { getLimits } from './config.js';
|
|
11
11
|
import { deleteRecursive, getRecursive, getUserStats, parseItem } from './db.js';
|
|
12
|
+
import { from as aclFrom } from '@axium/server/acl';
|
|
12
13
|
addRoute({
|
|
13
14
|
path: '/api/storage',
|
|
14
15
|
OPTIONS() {
|
|
@@ -70,6 +71,7 @@ addRoute({
|
|
|
70
71
|
error(409, 'Item is not a directory');
|
|
71
72
|
const items = await database
|
|
72
73
|
.selectFrom('storage')
|
|
74
|
+
.select(aclFrom('storage'))
|
|
73
75
|
.where('parentId', '=', itemId)
|
|
74
76
|
.where('trashedAt', 'is', null)
|
|
75
77
|
.selectAll()
|
|
@@ -121,6 +123,7 @@ addRoute({
|
|
|
121
123
|
await checkAuthForUser(request, userId);
|
|
122
124
|
const items = await database
|
|
123
125
|
.selectFrom('storage')
|
|
126
|
+
.select(aclFrom('storage'))
|
|
124
127
|
.where('userId', '=', userId)
|
|
125
128
|
.where('trashedAt', 'is', null)
|
|
126
129
|
.where('parentId', 'is', null)
|
|
@@ -154,6 +157,7 @@ addRoute({
|
|
|
154
157
|
const items = await database
|
|
155
158
|
.selectFrom('storage as item')
|
|
156
159
|
.selectAll('item')
|
|
160
|
+
.select(aclFrom('storage', { alias: 'item' }))
|
|
157
161
|
.where('trashedAt', 'is', null)
|
|
158
162
|
.where(existsInACL('id', user))
|
|
159
163
|
.where(eb => eb.not(existsInACL('parentId', user)))
|
package/dist/server/config.js
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { getConfig, Severity } from '@axium/core';
|
|
2
2
|
import { addEvent } from '@axium/server/audit';
|
|
3
|
+
import { statfsSync } from 'node:fs';
|
|
3
4
|
import * as z from 'zod';
|
|
4
5
|
import '../polyfills.js';
|
|
6
|
+
import { getTotalUse } from './db.js';
|
|
5
7
|
export const defaultCASMime = [/video\/.*/, /audio\/.*/];
|
|
8
|
+
function getSystemAvailable() {
|
|
9
|
+
const { bavail, bsize } = statfsSync(getConfig('@axium/storage').data, { bigint: true });
|
|
10
|
+
return (bavail * bsize) / 1000000n;
|
|
11
|
+
}
|
|
6
12
|
addEvent({
|
|
7
13
|
source: '@axium/storage',
|
|
8
14
|
name: 'storage_type_mismatch',
|
|
@@ -24,11 +30,26 @@ let _getLimits = null;
|
|
|
24
30
|
export function useLimits(handler) {
|
|
25
31
|
_getLimits = handler;
|
|
26
32
|
}
|
|
33
|
+
let _cachedUnlimited, _cachedTime = 0;
|
|
34
|
+
/**
|
|
35
|
+
* Used when there is no user limit, that way users have an idea of how close they are to filling up system storage.
|
|
36
|
+
* @returns The maximum size that we can use in MB
|
|
37
|
+
*/
|
|
38
|
+
async function _unlimitedLimit() {
|
|
39
|
+
if (_cachedUnlimited && Date.now() - _cachedTime < 300_000)
|
|
40
|
+
return _cachedUnlimited;
|
|
41
|
+
_cachedUnlimited = getSystemAvailable() + (await getTotalUse()) / 1000000n;
|
|
42
|
+
_cachedTime = Date.now();
|
|
43
|
+
return _cachedUnlimited;
|
|
44
|
+
}
|
|
27
45
|
export async function getLimits(userId) {
|
|
46
|
+
let limits;
|
|
28
47
|
try {
|
|
29
|
-
|
|
48
|
+
limits = await _getLimits(userId);
|
|
30
49
|
}
|
|
31
50
|
catch {
|
|
32
|
-
|
|
51
|
+
limits = getConfig('@axium/storage').limits;
|
|
33
52
|
}
|
|
53
|
+
limits.user_size ||= Number(await _unlimitedLimit());
|
|
54
|
+
return limits;
|
|
34
55
|
}
|
package/dist/server/db.d.ts
CHANGED
|
@@ -42,3 +42,4 @@ export declare function getRecursive(this: {
|
|
|
42
42
|
}>;
|
|
43
43
|
export declare function getRecursiveIds(...ids: string[]): AsyncGenerator<string>;
|
|
44
44
|
export declare function deleteRecursive(deleteSelf: boolean, ...itemId: string[]): Promise<void>;
|
|
45
|
+
export declare function getTotalUse(): Promise<bigint>;
|
package/dist/server/db.js
CHANGED
|
@@ -64,3 +64,10 @@ export async function deleteRecursive(deleteSelf, ...itemId) {
|
|
|
64
64
|
for (const id of toDelete)
|
|
65
65
|
unlinkSync(join(getConfig('@axium/storage').data, id));
|
|
66
66
|
}
|
|
67
|
+
export async function getTotalUse() {
|
|
68
|
+
const { size } = await database
|
|
69
|
+
.selectFrom('storage')
|
|
70
|
+
.select(eb => eb.fn.sum('size').as('size'))
|
|
71
|
+
.executeTakeFirstOrThrow();
|
|
72
|
+
return BigInt(size);
|
|
73
|
+
}
|
package/dist/server/hooks.js
CHANGED
|
@@ -5,15 +5,13 @@ import { count, database } from '@axium/server/database';
|
|
|
5
5
|
import { mkdirSync } from 'node:fs';
|
|
6
6
|
import '../common.js';
|
|
7
7
|
import './index.js';
|
|
8
|
+
import { getTotalUse } from './db.js';
|
|
8
9
|
export function load() {
|
|
9
10
|
mkdirSync(getConfig('@axium/storage').data, { recursive: true });
|
|
10
11
|
}
|
|
11
12
|
export async function statusText() {
|
|
12
13
|
const { storage: items } = await count('storage');
|
|
13
|
-
const
|
|
14
|
-
.selectFrom('storage')
|
|
15
|
-
.select(eb => eb.fn.sum('size').as('size'))
|
|
16
|
-
.executeTakeFirstOrThrow();
|
|
14
|
+
const size = await getTotalUse();
|
|
17
15
|
return `${items} items totaling ${formatBytes(Number(size))}`;
|
|
18
16
|
}
|
|
19
17
|
export async function clean(opt) {
|
package/lib/List.svelte
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { AccessControlDialog, FormDialog, Icon } from '@axium/client/components';
|
|
3
3
|
import '@axium/client/styles/list';
|
|
4
|
+
import type { AccessControllable, UserPublic } from '@axium/core';
|
|
4
5
|
import { formatBytes } from '@axium/core/format';
|
|
5
6
|
import { forMime as iconForMime } from '@axium/core/icons';
|
|
6
7
|
import { getDirectoryMetadata, updateItemMetadata } from '@axium/storage/client';
|
|
@@ -10,19 +11,18 @@
|
|
|
10
11
|
items = $bindable(),
|
|
11
12
|
appMode,
|
|
12
13
|
emptyText = 'Folder is empty.',
|
|
13
|
-
|
|
14
|
+
user,
|
|
15
|
+
}: { appMode?: boolean; items: (StorageItemMetadata & AccessControllable)[]; emptyText?: string; user?: UserPublic } = $props();
|
|
14
16
|
|
|
15
|
-
let activeIndex = $state<number>(
|
|
16
|
-
|
|
17
|
+
let activeIndex = $state<number>(0);
|
|
18
|
+
const activeItem = $derived(items[activeIndex]);
|
|
17
19
|
const dialogs = $state<Record<string, HTMLDialogElement>>({});
|
|
18
20
|
</script>
|
|
19
21
|
|
|
20
22
|
{#snippet action(name: string, icon: string, i: number)}
|
|
21
23
|
<span
|
|
22
24
|
class="action"
|
|
23
|
-
onclick={(
|
|
24
|
-
e.stopPropagation();
|
|
25
|
-
e.preventDefault();
|
|
25
|
+
onclick={() => {
|
|
26
26
|
activeIndex = i;
|
|
27
27
|
dialogs[name].showModal();
|
|
28
28
|
}}
|
|
@@ -60,10 +60,30 @@
|
|
|
60
60
|
<span class="name">{item.name}</span>
|
|
61
61
|
<span>{item.modifiedAt.toLocaleString()}</span>
|
|
62
62
|
<span>{item.type == 'inode/directory' ? '—' : formatBytes(item.size)}</span>
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
<div
|
|
64
|
+
style:display="contents"
|
|
65
|
+
onclick={e => {
|
|
66
|
+
e.stopPropagation();
|
|
67
|
+
e.stopImmediatePropagation();
|
|
68
|
+
}}
|
|
69
|
+
>
|
|
70
|
+
{@render action('rename', 'pencil', i)}
|
|
71
|
+
{@render action('share' + item.id, 'user-group', i)}
|
|
72
|
+
<AccessControlDialog
|
|
73
|
+
bind:dialog={dialogs['share' + item.id]}
|
|
74
|
+
{item}
|
|
75
|
+
itemType="storage"
|
|
76
|
+
editable={(item.acl?.find(
|
|
77
|
+
a =>
|
|
78
|
+
a.userId == user?.id ||
|
|
79
|
+
(a.role && user?.roles.includes(a.role)) ||
|
|
80
|
+
(a.tag && user?.tags?.includes(a.tag)) ||
|
|
81
|
+
(!a.userId && !a.role && !a.tag)
|
|
82
|
+
)?.manage as boolean | undefined) ?? true}
|
|
83
|
+
/>
|
|
84
|
+
{@render action('download', 'download', i)}
|
|
85
|
+
{@render action('trash', 'trash', i)}
|
|
86
|
+
</div>
|
|
67
87
|
</div>
|
|
68
88
|
{:else}
|
|
69
89
|
<p class="list-empty">{emptyText}</p>
|
|
@@ -84,7 +104,6 @@
|
|
|
84
104
|
<input name="name" type="text" required value={activeItem?.name} />
|
|
85
105
|
</div>
|
|
86
106
|
</FormDialog>
|
|
87
|
-
<AccessControlDialog bind:dialog={dialogs.share} bind:item={activeItem} itemType="storage" editable={true} />
|
|
88
107
|
<FormDialog
|
|
89
108
|
bind:dialog={dialogs.trash}
|
|
90
109
|
submitText="Trash"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@axium/storage",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.1",
|
|
4
4
|
"author": "James Prevett <axium@jamespre.dev>",
|
|
5
5
|
"description": "User file storage for Axium",
|
|
6
6
|
"funding": {
|
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
"build": "tsc"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"@axium/client": ">=0.
|
|
43
|
-
"@axium/core": ">=0.
|
|
44
|
-
"@axium/server": ">=0.
|
|
42
|
+
"@axium/client": ">=0.13.0",
|
|
43
|
+
"@axium/core": ">=0.19.0",
|
|
44
|
+
"@axium/server": ">=0.34.0",
|
|
45
45
|
"@sveltejs/kit": "^2.27.3",
|
|
46
46
|
"utilium": "^2.3.8"
|
|
47
47
|
},
|
package/routes/files/+layout.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { getCurrentSession } from '@axium/client/user';
|
|
2
|
-
import type { Session } from '@axium/core';
|
|
2
|
+
import type { Session, User } from '@axium/core';
|
|
3
3
|
import type { LayoutRouteId } from './$types';
|
|
4
4
|
|
|
5
5
|
export const ssr = false;
|
|
6
6
|
|
|
7
7
|
export async function load({ url, route, parent }) {
|
|
8
|
-
let { session }: { session?: Session | null } = await parent();
|
|
8
|
+
let { session }: { session?: (Session & { user: User }) | null } = await parent();
|
|
9
9
|
|
|
10
10
|
session ||= await getCurrentSession().catch(() => null);
|
|
11
11
|
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
>
|
|
35
35
|
<Icon i="folder-arrow-up" /> Back
|
|
36
36
|
</button>
|
|
37
|
-
<StorageList appMode bind:items />
|
|
37
|
+
<StorageList appMode bind:items user={data.session?.user} />
|
|
38
38
|
<StorageAdd parentId={item.id} onadd={item => items.push(item)} />
|
|
39
39
|
{:else}
|
|
40
40
|
<p>No preview available.</p>
|
|
@@ -1,38 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
3
|
-
import '@axium/client/styles/list';
|
|
4
|
-
import { formatBytes } from '@axium/core/format';
|
|
5
|
-
import { forMime as iconForMime } from '@axium/core/icons';
|
|
6
|
-
import type { PageProps } from './$types';
|
|
2
|
+
import { StorageList } from '@axium/storage/components';
|
|
7
3
|
|
|
8
|
-
const { data }
|
|
4
|
+
const { data } = $props();
|
|
5
|
+
let items = $state(data.items!);
|
|
9
6
|
</script>
|
|
10
7
|
|
|
11
8
|
<svelte:head>
|
|
12
9
|
<title>Files - Shared With You</title>
|
|
13
10
|
</svelte:head>
|
|
14
11
|
|
|
15
|
-
<
|
|
16
|
-
<div class="list-item list-header">
|
|
17
|
-
<span></span>
|
|
18
|
-
<span>Name</span>
|
|
19
|
-
<span>Last Modified</span>
|
|
20
|
-
<span>Size</span>
|
|
21
|
-
</div>
|
|
22
|
-
{#each data.items as item, i (item.id)}
|
|
23
|
-
<div class="list-item">
|
|
24
|
-
<dfn title={item.type}><Icon i={iconForMime(item.type)} /></dfn>
|
|
25
|
-
<span class="name">{item.name}</span>
|
|
26
|
-
<span>{item.modifiedAt.toLocaleString()}</span>
|
|
27
|
-
<span>{formatBytes(item.size)}</span>
|
|
28
|
-
</div>
|
|
29
|
-
{:else}
|
|
30
|
-
<p class="list-empty">No items have been shared with you.</p>
|
|
31
|
-
{/each}
|
|
32
|
-
</div>
|
|
33
|
-
|
|
34
|
-
<style>
|
|
35
|
-
.list-item {
|
|
36
|
-
grid-template-columns: 1em 4fr 15em 5em;
|
|
37
|
-
}
|
|
38
|
-
</style>
|
|
12
|
+
<StorageList appMode bind:items emptyText="No items have been shared with you." user={data.session?.user} />
|
|
@@ -21,4 +21,4 @@
|
|
|
21
21
|
|
|
22
22
|
<p><NumberBar max={limits.user_size * 1_000_000} value={usedBytes} text={barText} /></p>
|
|
23
23
|
|
|
24
|
-
<StorageList bind:items emptyText="You have not uploaded any files yet." />
|
|
24
|
+
<StorageList bind:items emptyText="You have not uploaded any files yet." user={data.session?.user} />
|