@mano8/astro-media-m8 0.1.0-alpha.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/LICENSE +201 -0
- package/README.md +203 -0
- package/dist/src/integration.d.ts +57 -0
- package/dist/src/integration.d.ts.map +1 -0
- package/dist/src/integration.js +87 -0
- package/dist/src/integration.js.map +1 -0
- package/dist/src/lib/csp.d.ts +27 -0
- package/dist/src/lib/csp.d.ts.map +1 -0
- package/dist/src/lib/csp.js +54 -0
- package/dist/src/lib/csp.js.map +1 -0
- package/dist/src/middleware.d.ts +4 -0
- package/dist/src/middleware.d.ts.map +1 -0
- package/dist/src/middleware.js +24 -0
- package/dist/src/middleware.js.map +1 -0
- package/dist/src/runtime/api/admin.d.ts +22 -0
- package/dist/src/runtime/api/admin.d.ts.map +1 -0
- package/dist/src/runtime/api/admin.js +115 -0
- package/dist/src/runtime/api/admin.js.map +1 -0
- package/dist/src/runtime/api/categories.d.ts +12 -0
- package/dist/src/runtime/api/categories.d.ts.map +1 -0
- package/dist/src/runtime/api/categories.js +56 -0
- package/dist/src/runtime/api/categories.js.map +1 -0
- package/dist/src/runtime/api/dashboard.d.ts +5 -0
- package/dist/src/runtime/api/dashboard.d.ts.map +1 -0
- package/dist/src/runtime/api/dashboard.js +22 -0
- package/dist/src/runtime/api/dashboard.js.map +1 -0
- package/dist/src/runtime/api/index.d.ts +72 -0
- package/dist/src/runtime/api/index.d.ts.map +1 -0
- package/dist/src/runtime/api/index.js +74 -0
- package/dist/src/runtime/api/index.js.map +1 -0
- package/dist/src/runtime/api/internal.server.d.ts +19 -0
- package/dist/src/runtime/api/internal.server.d.ts.map +1 -0
- package/dist/src/runtime/api/internal.server.js +64 -0
- package/dist/src/runtime/api/internal.server.js.map +1 -0
- package/dist/src/runtime/api/objects.d.ts +7 -0
- package/dist/src/runtime/api/objects.d.ts.map +1 -0
- package/dist/src/runtime/api/objects.js +71 -0
- package/dist/src/runtime/api/objects.js.map +1 -0
- package/dist/src/runtime/api/presets.d.ts +6 -0
- package/dist/src/runtime/api/presets.d.ts.map +1 -0
- package/dist/src/runtime/api/presets.js +31 -0
- package/dist/src/runtime/api/presets.js.map +1 -0
- package/dist/src/runtime/api/shares.d.ts +10 -0
- package/dist/src/runtime/api/shares.d.ts.map +1 -0
- package/dist/src/runtime/api/shares.js +38 -0
- package/dist/src/runtime/api/shares.js.map +1 -0
- package/dist/src/runtime/api/uploads.d.ts +5 -0
- package/dist/src/runtime/api/uploads.d.ts.map +1 -0
- package/dist/src/runtime/api/uploads.js +28 -0
- package/dist/src/runtime/api/uploads.js.map +1 -0
- package/dist/src/runtime/api/variants.d.ts +18 -0
- package/dist/src/runtime/api/variants.d.ts.map +1 -0
- package/dist/src/runtime/api/variants.js +61 -0
- package/dist/src/runtime/api/variants.js.map +1 -0
- package/dist/src/runtime/authAdapter.d.ts +48 -0
- package/dist/src/runtime/authAdapter.d.ts.map +1 -0
- package/dist/src/runtime/authAdapter.js +62 -0
- package/dist/src/runtime/authAdapter.js.map +1 -0
- package/dist/src/runtime/client.d.ts +24 -0
- package/dist/src/runtime/client.d.ts.map +1 -0
- package/dist/src/runtime/client.js +87 -0
- package/dist/src/runtime/client.js.map +1 -0
- package/dist/src/runtime/compatibility.d.ts +32 -0
- package/dist/src/runtime/compatibility.d.ts.map +1 -0
- package/dist/src/runtime/compatibility.js +101 -0
- package/dist/src/runtime/compatibility.js.map +1 -0
- package/dist/src/runtime/config.d.ts +27 -0
- package/dist/src/runtime/config.d.ts.map +1 -0
- package/dist/src/runtime/config.js +32 -0
- package/dist/src/runtime/config.js.map +1 -0
- package/dist/src/runtime/errors.d.ts +23 -0
- package/dist/src/runtime/errors.d.ts.map +1 -0
- package/dist/src/runtime/errors.js +50 -0
- package/dist/src/runtime/errors.js.map +1 -0
- package/dist/src/runtime/hooks/index.d.ts +8 -0
- package/dist/src/runtime/hooks/index.d.ts.map +1 -0
- package/dist/src/runtime/hooks/index.js +8 -0
- package/dist/src/runtime/hooks/index.js.map +1 -0
- package/dist/src/runtime/hooks/useDownloadUrl.d.ts +12 -0
- package/dist/src/runtime/hooks/useDownloadUrl.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useDownloadUrl.js +40 -0
- package/dist/src/runtime/hooks/useDownloadUrl.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaAdmin.d.ts +30 -0
- package/dist/src/runtime/hooks/useMediaAdmin.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaAdmin.js +145 -0
- package/dist/src/runtime/hooks/useMediaAdmin.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaObject.d.ts +17 -0
- package/dist/src/runtime/hooks/useMediaObject.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaObject.js +62 -0
- package/dist/src/runtime/hooks/useMediaObject.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaObjects.d.ts +12 -0
- package/dist/src/runtime/hooks/useMediaObjects.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaObjects.js +76 -0
- package/dist/src/runtime/hooks/useMediaObjects.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaPresets.d.ts +24 -0
- package/dist/src/runtime/hooks/useMediaPresets.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaPresets.js +55 -0
- package/dist/src/runtime/hooks/useMediaPresets.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaUpload.d.ts +11 -0
- package/dist/src/runtime/hooks/useMediaUpload.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaUpload.js +34 -0
- package/dist/src/runtime/hooks/useMediaUpload.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaVariants.d.ts +18 -0
- package/dist/src/runtime/hooks/useMediaVariants.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaVariants.js +78 -0
- package/dist/src/runtime/hooks/useMediaVariants.js.map +1 -0
- package/dist/src/runtime/listParams.d.ts +27 -0
- package/dist/src/runtime/listParams.d.ts.map +1 -0
- package/dist/src/runtime/listParams.js +66 -0
- package/dist/src/runtime/listParams.js.map +1 -0
- package/dist/src/runtime/queryKeys.d.ts +18 -0
- package/dist/src/runtime/queryKeys.d.ts.map +1 -0
- package/dist/src/runtime/queryKeys.js +23 -0
- package/dist/src/runtime/queryKeys.js.map +1 -0
- package/dist/src/runtime/react/AdminMediaPanel.d.ts +2 -0
- package/dist/src/runtime/react/AdminMediaPanel.d.ts.map +1 -0
- package/dist/src/runtime/react/AdminMediaPanel.js +14 -0
- package/dist/src/runtime/react/AdminMediaPanel.js.map +1 -0
- package/dist/src/runtime/react/MediaLibrary.d.ts +6 -0
- package/dist/src/runtime/react/MediaLibrary.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaLibrary.js +138 -0
- package/dist/src/runtime/react/MediaLibrary.js.map +1 -0
- package/dist/src/runtime/react/MediaProvider.d.ts +18 -0
- package/dist/src/runtime/react/MediaProvider.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaProvider.js +79 -0
- package/dist/src/runtime/react/MediaProvider.js.map +1 -0
- package/dist/src/runtime/react/MediaQueryProvider.d.ts +8 -0
- package/dist/src/runtime/react/MediaQueryProvider.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaQueryProvider.js +11 -0
- package/dist/src/runtime/react/MediaQueryProvider.js.map +1 -0
- package/dist/src/runtime/react/MediaUploadDropzone.d.ts +8 -0
- package/dist/src/runtime/react/MediaUploadDropzone.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaUploadDropzone.js +34 -0
- package/dist/src/runtime/react/MediaUploadDropzone.js.map +1 -0
- package/dist/src/runtime/react/ObjectDetail.d.ts +5 -0
- package/dist/src/runtime/react/ObjectDetail.d.ts.map +1 -0
- package/dist/src/runtime/react/ObjectDetail.js +34 -0
- package/dist/src/runtime/react/ObjectDetail.js.map +1 -0
- package/dist/src/runtime/react/PresetEditor.d.ts +3 -0
- package/dist/src/runtime/react/PresetEditor.d.ts.map +1 -0
- package/dist/src/runtime/react/PresetEditor.js +36 -0
- package/dist/src/runtime/react/PresetEditor.js.map +1 -0
- package/dist/src/runtime/react/RequireSuperuser.d.ts +7 -0
- package/dist/src/runtime/react/RequireSuperuser.d.ts.map +1 -0
- package/dist/src/runtime/react/RequireSuperuser.js +10 -0
- package/dist/src/runtime/react/RequireSuperuser.js.map +1 -0
- package/dist/src/runtime/react/VariantPicker.d.ts +5 -0
- package/dist/src/runtime/react/VariantPicker.d.ts.map +1 -0
- package/dist/src/runtime/react/VariantPicker.js +28 -0
- package/dist/src/runtime/react/VariantPicker.js.map +1 -0
- package/dist/src/runtime/react/default-ui/index.d.ts +25 -0
- package/dist/src/runtime/react/default-ui/index.d.ts.map +1 -0
- package/dist/src/runtime/react/default-ui/index.js +33 -0
- package/dist/src/runtime/react/default-ui/index.js.map +1 -0
- package/dist/src/runtime/react/index.d.ts +10 -0
- package/dist/src/runtime/react/index.d.ts.map +1 -0
- package/dist/src/runtime/react/index.js +10 -0
- package/dist/src/runtime/react/index.js.map +1 -0
- package/dist/src/runtime/routes.d.ts +19 -0
- package/dist/src/runtime/routes.d.ts.map +1 -0
- package/dist/src/runtime/routes.js +35 -0
- package/dist/src/runtime/routes.js.map +1 -0
- package/dist/src/runtime/schemas.d.ts +812 -0
- package/dist/src/runtime/schemas.d.ts.map +1 -0
- package/dist/src/runtime/schemas.js +427 -0
- package/dist/src/runtime/schemas.js.map +1 -0
- package/dist/src/runtime/upload/index.d.ts +2 -0
- package/dist/src/runtime/upload/index.d.ts.map +1 -0
- package/dist/src/runtime/upload/index.js +2 -0
- package/dist/src/runtime/upload/index.js.map +1 -0
- package/dist/src/runtime/upload/uploadController.d.ts +71 -0
- package/dist/src/runtime/upload/uploadController.d.ts.map +1 -0
- package/dist/src/runtime/upload/uploadController.js +217 -0
- package/dist/src/runtime/upload/uploadController.js.map +1 -0
- package/package.json +97 -0
- package/registry/r/admin-media-dashboard.json +23 -0
- package/registry/r/data-table.json +23 -0
- package/registry/r/media-dashboard-overview.json +26 -0
- package/registry/r/media-maintenance-panel.json +23 -0
- package/registry/r/media-storage-chart.json +21 -0
- package/registry/r/registry.json +37 -0
- package/registry.json +92 -0
- package/src/routes/admin/media.astro +12 -0
- package/src/routes/library.astro +12 -0
- package/src/routes/object/[id].astro +14 -0
- package/src/routes/presets.astro +12 -0
- package/src/routes/upload.astro +12 -0
- package/src/scaffold/styles/media.css +208 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../../../src/runtime/compatibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type MediaPollingConfig = {
|
|
2
|
+
/** Interval between variant-job status polls, in milliseconds. */
|
|
3
|
+
variantJobMs: number;
|
|
4
|
+
/** Interval between object scan-status polls, in milliseconds. */
|
|
5
|
+
uploadScanMs: number;
|
|
6
|
+
/** Hard ceiling for any polling helper, in milliseconds. */
|
|
7
|
+
timeoutMs: number;
|
|
8
|
+
};
|
|
9
|
+
export type MediaRuntimeConfig = {
|
|
10
|
+
/** Service mount, e.g. "/media" — prepended to every request path. */
|
|
11
|
+
apiBase: string;
|
|
12
|
+
/** Sub-prefix for the versioned resource routes (uploads/objects/...). */
|
|
13
|
+
v1Base: string;
|
|
14
|
+
/** Sub-prefix for legacy routes (dashboard/category); usually empty. */
|
|
15
|
+
legacyBase: string;
|
|
16
|
+
/** Header sent on every request so a same-origin stack can pin CSRF. */
|
|
17
|
+
csrfHeader: string;
|
|
18
|
+
/** Role string that grants admin access through the auth adapter. */
|
|
19
|
+
adminRole: string;
|
|
20
|
+
polling: MediaPollingConfig;
|
|
21
|
+
};
|
|
22
|
+
export declare function configureMedia(config?: Partial<Omit<MediaRuntimeConfig, "polling">> & {
|
|
23
|
+
polling?: Partial<MediaPollingConfig>;
|
|
24
|
+
}): MediaRuntimeConfig;
|
|
25
|
+
export declare function getMediaConfig(): MediaRuntimeConfig;
|
|
26
|
+
export declare function resetMediaConfig(): void;
|
|
27
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/runtime/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,kBAAkB,CAAC;CAC7B,CAAC;AAqBF,wBAAgB,cAAc,CAAC,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,GAAG;IACpF,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAClC,GAAG,kBAAkB,CAQ1B;AAED,wBAAgB,cAAc,IAAI,kBAAkB,CAEnD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const DEFAULT_CONFIG = {
|
|
2
|
+
apiBase: "/media",
|
|
3
|
+
v1Base: "/v1",
|
|
4
|
+
legacyBase: "",
|
|
5
|
+
csrfHeader: "X-Requested-With",
|
|
6
|
+
adminRole: "is_superuser",
|
|
7
|
+
polling: {
|
|
8
|
+
variantJobMs: 1500,
|
|
9
|
+
uploadScanMs: 2000,
|
|
10
|
+
timeoutMs: 120000
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
let runtimeConfig = cloneConfig(DEFAULT_CONFIG);
|
|
14
|
+
function cloneConfig(config) {
|
|
15
|
+
return { ...config, polling: { ...config.polling } };
|
|
16
|
+
}
|
|
17
|
+
export function configureMedia(config = {}) {
|
|
18
|
+
const { polling, ...rest } = config;
|
|
19
|
+
runtimeConfig = {
|
|
20
|
+
...runtimeConfig,
|
|
21
|
+
...rest,
|
|
22
|
+
polling: { ...runtimeConfig.polling, ...polling }
|
|
23
|
+
};
|
|
24
|
+
return runtimeConfig;
|
|
25
|
+
}
|
|
26
|
+
export function getMediaConfig() {
|
|
27
|
+
return runtimeConfig;
|
|
28
|
+
}
|
|
29
|
+
export function resetMediaConfig() {
|
|
30
|
+
runtimeConfig = cloneConfig(DEFAULT_CONFIG);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/runtime/config.ts"],"names":[],"mappings":"AAuBA,MAAM,cAAc,GAAuB;IACzC,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,kBAAkB;IAC9B,SAAS,EAAE,cAAc;IACzB,OAAO,EAAE;QACP,YAAY,EAAE,IAAI;QAClB,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,MAAM;KAClB;CACF,CAAC;AAEF,IAAI,aAAa,GAAuB,WAAW,CAAC,cAAc,CAAC,CAAC;AAEpE,SAAS,WAAW,CAAC,MAA0B;IAC7C,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAE3B,EAAE;IACJ,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IACpC,aAAa,GAAG;QACd,GAAG,aAAa;QAChB,GAAG,IAAI;QACP,OAAO,EAAE,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE;KAClD,CAAC;IACF,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,aAAa,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const ApiErrorBody: z.ZodObject<{
|
|
3
|
+
detail: z.ZodUnknown;
|
|
4
|
+
}, z.core.$strip>;
|
|
5
|
+
/**
|
|
6
|
+
* Derive a human-readable message from a normalized FastAPI error detail.
|
|
7
|
+
* Strings are surfaced as-is; validation arrays ({ msg }) are joined; anything
|
|
8
|
+
* else yields `undefined` so callers fall back to a generic message.
|
|
9
|
+
*/
|
|
10
|
+
export declare function messageFromDetail(detail: unknown): string | undefined;
|
|
11
|
+
export declare class ApiError extends Error {
|
|
12
|
+
readonly status: number;
|
|
13
|
+
readonly detail: unknown;
|
|
14
|
+
constructor(status: number, detail: unknown, message?: string);
|
|
15
|
+
}
|
|
16
|
+
export declare class UnauthenticatedError extends ApiError {
|
|
17
|
+
constructor(message?: string);
|
|
18
|
+
}
|
|
19
|
+
export declare class ForbiddenError extends ApiError {
|
|
20
|
+
constructor(message?: string);
|
|
21
|
+
}
|
|
22
|
+
export declare function normalizeFastApiError(payload: unknown): unknown;
|
|
23
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/runtime/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;iBAEvB,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAarE;AAED,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;gBAEb,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;CAM9D;AAED,qBAAa,oBAAqB,SAAQ,QAAQ;gBACpC,OAAO,SAA4B;CAIhD;AAED,qBAAa,cAAe,SAAQ,QAAQ;gBAC9B,OAAO,SAAsD;CAI1E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAG/D"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ApiErrorBody = z.object({
|
|
3
|
+
detail: z.unknown()
|
|
4
|
+
});
|
|
5
|
+
/**
|
|
6
|
+
* Derive a human-readable message from a normalized FastAPI error detail.
|
|
7
|
+
* Strings are surfaced as-is; validation arrays ({ msg }) are joined; anything
|
|
8
|
+
* else yields `undefined` so callers fall back to a generic message.
|
|
9
|
+
*/
|
|
10
|
+
export function messageFromDetail(detail) {
|
|
11
|
+
if (typeof detail === "string" && detail.trim())
|
|
12
|
+
return detail;
|
|
13
|
+
if (Array.isArray(detail)) {
|
|
14
|
+
const parts = detail
|
|
15
|
+
.map((item) => item && typeof item === "object" && "msg" in item && item.msg
|
|
16
|
+
? String(item.msg)
|
|
17
|
+
: null)
|
|
18
|
+
.filter((part) => part !== null);
|
|
19
|
+
if (parts.length)
|
|
20
|
+
return parts.join("; ");
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
export class ApiError extends Error {
|
|
25
|
+
status;
|
|
26
|
+
detail;
|
|
27
|
+
constructor(status, detail, message) {
|
|
28
|
+
super(message ?? messageFromDetail(detail) ?? "Media API request failed");
|
|
29
|
+
this.name = "ApiError";
|
|
30
|
+
this.status = status;
|
|
31
|
+
this.detail = detail;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class UnauthenticatedError extends ApiError {
|
|
35
|
+
constructor(message = "Authentication required") {
|
|
36
|
+
super(401, message, message);
|
|
37
|
+
this.name = "UnauthenticatedError";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class ForbiddenError extends ApiError {
|
|
41
|
+
constructor(message = "You do not have permission to perform this action") {
|
|
42
|
+
super(403, message, message);
|
|
43
|
+
this.name = "ForbiddenError";
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function normalizeFastApiError(payload) {
|
|
47
|
+
const parsed = ApiErrorBody.safeParse(payload);
|
|
48
|
+
return parsed.success ? parsed.data.detail : payload;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/runtime/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;CACpB,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM;aACjB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACZ,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAK,IAAyB,CAAC,GAAG;YACjF,CAAC,CAAC,MAAM,CAAE,IAAyB,CAAC,GAAG,CAAC;YACxC,CAAC,CAAC,IAAI,CACT;aACA,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,MAAM,CAAS;IACf,MAAM,CAAU;IAEzB,YAAY,MAAc,EAAE,MAAe,EAAE,OAAgB;QAC3D,KAAK,CAAC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,0BAA0B,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,QAAQ;IAChD,YAAY,OAAO,GAAG,yBAAyB;QAC7C,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,QAAQ;IAC1C,YAAY,OAAO,GAAG,mDAAmD;QACvE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./useMediaObjects.js";
|
|
2
|
+
export * from "./useMediaObject.js";
|
|
3
|
+
export * from "./useMediaUpload.js";
|
|
4
|
+
export * from "./useMediaVariants.js";
|
|
5
|
+
export * from "./useMediaPresets.js";
|
|
6
|
+
export * from "./useMediaAdmin.js";
|
|
7
|
+
export * from "./useDownloadUrl.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./useMediaObjects.js";
|
|
2
|
+
export * from "./useMediaObject.js";
|
|
3
|
+
export * from "./useMediaUpload.js";
|
|
4
|
+
export * from "./useMediaVariants.js";
|
|
5
|
+
export * from "./useMediaPresets.js";
|
|
6
|
+
export * from "./useMediaAdmin.js";
|
|
7
|
+
export * from "./useDownloadUrl.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/runtime/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DownloadUrlResponse } from "../schemas.js";
|
|
2
|
+
export type UseDownloadUrl = {
|
|
3
|
+
data: DownloadUrlResponse | null;
|
|
4
|
+
loading: boolean;
|
|
5
|
+
error: unknown;
|
|
6
|
+
/** Generate a fresh presigned URL for an owned object. */
|
|
7
|
+
request: () => Promise<DownloadUrlResponse>;
|
|
8
|
+
/** Resolve a public share token to a presigned URL. */
|
|
9
|
+
resolve: (token: string) => Promise<DownloadUrlResponse>;
|
|
10
|
+
};
|
|
11
|
+
export declare function useDownloadUrl(objectId: string | null): UseDownloadUrl;
|
|
12
|
+
//# sourceMappingURL=useDownloadUrl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDownloadUrl.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/useDownloadUrl.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,0DAA0D;IAC1D,OAAO,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC5C,uDAAuD;IACvD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC1D,CAAC;AAEF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAmCtE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useCallback } from "react";
|
|
2
|
+
import { useMutation, useQueryClient } from "@tanstack/react-query";
|
|
3
|
+
import { getDownloadUrl } from "../api/objects.js";
|
|
4
|
+
import { resolveShare } from "../api/shares.js";
|
|
5
|
+
import { mediaKeys } from "../queryKeys.js";
|
|
6
|
+
export function useDownloadUrl(objectId) {
|
|
7
|
+
const queryClient = useQueryClient();
|
|
8
|
+
const requestMutation = useMutation({
|
|
9
|
+
mutationKey: objectId ? mediaKeys.downloadUrl(objectId) : ["media", "download-url", ""],
|
|
10
|
+
mutationFn: async () => {
|
|
11
|
+
if (!objectId)
|
|
12
|
+
throw new Error("No object selected");
|
|
13
|
+
const result = await getDownloadUrl(objectId);
|
|
14
|
+
queryClient.setQueryData(mediaKeys.downloadUrl(objectId), result);
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const resolveMutation = useMutation({
|
|
19
|
+
mutationFn: (token) => resolveShare(token)
|
|
20
|
+
});
|
|
21
|
+
const { mutateAsync: requestDownloadUrlAsync } = requestMutation;
|
|
22
|
+
const { mutateAsync: resolveShareAsync } = resolveMutation;
|
|
23
|
+
const request = useCallback(() => {
|
|
24
|
+
if (!objectId)
|
|
25
|
+
throw new Error("No object selected");
|
|
26
|
+
return requestDownloadUrlAsync();
|
|
27
|
+
}, [objectId, requestDownloadUrlAsync]);
|
|
28
|
+
const resolve = useCallback((token) => resolveShareAsync(token), [resolveShareAsync]);
|
|
29
|
+
const requestIsLatest = requestMutation.submittedAt >= resolveMutation.submittedAt;
|
|
30
|
+
const latestData = requestIsLatest ? requestMutation.data : resolveMutation.data;
|
|
31
|
+
const latestError = requestIsLatest ? requestMutation.error : resolveMutation.error;
|
|
32
|
+
return {
|
|
33
|
+
data: latestData ?? null,
|
|
34
|
+
loading: requestMutation.isPending || resolveMutation.isPending,
|
|
35
|
+
error: latestError ?? null,
|
|
36
|
+
request,
|
|
37
|
+
resolve
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=useDownloadUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDownloadUrl.js","sourceRoot":"","sources":["../../../../src/runtime/hooks/useDownloadUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAa5C,MAAM,UAAU,cAAc,CAAC,QAAuB;IACpD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,eAAe,GAAG,WAAW,CAAqC;QACtE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;QACvF,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9C,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YAClE,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,WAAW,CAAuC;QACxE,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;KAC3C,CAAC,CAAC;IACH,MAAM,EAAE,WAAW,EAAE,uBAAuB,EAAE,GAAG,eAAe,CAAC;IACjE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,eAAe,CAAC;IAE3D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACrD,OAAO,uBAAuB,EAAE,CAAC;IACnC,CAAC,EAAE,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAE9F,MAAM,eAAe,GAAG,eAAe,CAAC,WAAW,IAAI,eAAe,CAAC,WAAW,CAAC;IACnF,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;IACjF,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC;IAEpF,OAAO;QACL,IAAI,EAAE,UAAU,IAAI,IAAI;QACxB,OAAO,EAAE,eAAe,CAAC,SAAS,IAAI,eAAe,CAAC,SAAS;QAC/D,KAAK,EAAE,WAAW,IAAI,IAAI;QAC1B,OAAO;QACP,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type UseMutationResult } from "@tanstack/react-query";
|
|
2
|
+
import type { HardPurgeResponse, OrphanReport, PurgeStaleResponse, StaleUploadsResponse, StorageStatsResponse, SubscriptionListResponse } from "../schemas.js";
|
|
3
|
+
type PurgeStaleMutation = UseMutationResult<PurgeStaleResponse, unknown, void>;
|
|
4
|
+
type RepairMutation = UseMutationResult<OrphanReport, unknown, boolean>;
|
|
5
|
+
type PurgeExpiredMutation = UseMutationResult<HardPurgeResponse, unknown, void>;
|
|
6
|
+
type RemoveSubscriptionMutation = UseMutationResult<void, unknown, string>;
|
|
7
|
+
export type UseMediaAdmin = {
|
|
8
|
+
allowed: boolean;
|
|
9
|
+
stats: StorageStatsResponse | null;
|
|
10
|
+
stale: StaleUploadsResponse | null;
|
|
11
|
+
orphans: OrphanReport | null;
|
|
12
|
+
subscriptions: SubscriptionListResponse | null;
|
|
13
|
+
loading: boolean;
|
|
14
|
+
error: unknown;
|
|
15
|
+
loadStats: () => Promise<void>;
|
|
16
|
+
loadStale: () => Promise<void>;
|
|
17
|
+
purgeStale: () => Promise<PurgeStaleResponse>;
|
|
18
|
+
loadOrphans: () => Promise<void>;
|
|
19
|
+
repair: (confirm: boolean) => Promise<OrphanReport>;
|
|
20
|
+
purgeExpiredObjects: () => Promise<HardPurgeResponse>;
|
|
21
|
+
loadSubscriptions: () => Promise<void>;
|
|
22
|
+
removeSubscription: (id: string) => Promise<void>;
|
|
23
|
+
purgeStaleMutation: PurgeStaleMutation;
|
|
24
|
+
repairMutation: RepairMutation;
|
|
25
|
+
purgeExpiredMutation: PurgeExpiredMutation;
|
|
26
|
+
removeSubscriptionMutation: RemoveSubscriptionMutation;
|
|
27
|
+
};
|
|
28
|
+
export declare function useMediaAdmin(): UseMediaAdmin;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=useMediaAdmin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMediaAdmin.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/useMediaAdmin.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAc/B,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,eAAe,CAAC;AAEvB,KAAK,kBAAkB,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC/E,KAAK,cAAc,GAAG,iBAAiB,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACxE,KAAK,oBAAoB,GAAG,iBAAiB,CAAC,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAChF,KAAK,0BAA0B,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAE3E,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,UAAU,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9C,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACpD,mBAAmB,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACtD,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,cAAc,EAAE,cAAc,CAAC;IAC/B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,0BAA0B,EAAE,0BAA0B,CAAC;CACxD,CAAC;AAeF,wBAAgB,aAAa,IAAI,aAAa,CA2I7C"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { useCallback } from "react";
|
|
2
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
3
|
+
import { deleteSubscription, getOrphans, getStaleUploads, getStorageStats, listSubscriptions, purgeExpired, purgeStaleUploads, repairOrphans } from "../api/admin.js";
|
|
4
|
+
import { ForbiddenError } from "../errors.js";
|
|
5
|
+
import { mediaKeys } from "../queryKeys.js";
|
|
6
|
+
import { useMediaContext } from "../react/MediaProvider.js";
|
|
7
|
+
/**
|
|
8
|
+
* Admin operations gated client-side: when the auth adapter already reports a
|
|
9
|
+
* non-superuser, every action rejects with `ForbiddenError` before any request.
|
|
10
|
+
*/
|
|
11
|
+
async function refetchOrThrow(refetch) {
|
|
12
|
+
const result = await refetch();
|
|
13
|
+
if (result.error)
|
|
14
|
+
throw result.error;
|
|
15
|
+
if (result.data === undefined)
|
|
16
|
+
throw new Error("No data returned");
|
|
17
|
+
return result.data;
|
|
18
|
+
}
|
|
19
|
+
export function useMediaAdmin() {
|
|
20
|
+
const { isSuperuser } = useMediaContext();
|
|
21
|
+
const queryClient = useQueryClient();
|
|
22
|
+
const guard = useCallback((task) => {
|
|
23
|
+
if (!isSuperuser)
|
|
24
|
+
return Promise.reject(new ForbiddenError());
|
|
25
|
+
return task();
|
|
26
|
+
}, [isSuperuser]);
|
|
27
|
+
const statsQuery = useQuery({
|
|
28
|
+
queryKey: mediaKeys.adminStats(),
|
|
29
|
+
queryFn: () => guard(getStorageStats),
|
|
30
|
+
enabled: false
|
|
31
|
+
});
|
|
32
|
+
const staleQuery = useQuery({
|
|
33
|
+
queryKey: mediaKeys.adminStaleUploads(),
|
|
34
|
+
queryFn: () => guard(getStaleUploads),
|
|
35
|
+
enabled: false
|
|
36
|
+
});
|
|
37
|
+
const orphansQuery = useQuery({
|
|
38
|
+
queryKey: mediaKeys.adminOrphans(),
|
|
39
|
+
queryFn: () => guard(getOrphans),
|
|
40
|
+
enabled: false
|
|
41
|
+
});
|
|
42
|
+
const subscriptionsQuery = useQuery({
|
|
43
|
+
queryKey: mediaKeys.adminSubscriptions(),
|
|
44
|
+
queryFn: () => guard(listSubscriptions),
|
|
45
|
+
enabled: false
|
|
46
|
+
});
|
|
47
|
+
const purgeStaleMutation = useMutation({
|
|
48
|
+
mutationFn: () => guard(purgeStaleUploads),
|
|
49
|
+
onSuccess: async () => {
|
|
50
|
+
await Promise.all([
|
|
51
|
+
queryClient.invalidateQueries({ queryKey: mediaKeys.adminStaleUploads(), exact: true }),
|
|
52
|
+
queryClient.invalidateQueries({ queryKey: mediaKeys.adminStats(), exact: true })
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
const repairMutation = useMutation({
|
|
57
|
+
mutationFn: (confirm) => guard(() => repairOrphans(confirm)),
|
|
58
|
+
onSuccess: async (report) => {
|
|
59
|
+
queryClient.setQueryData(mediaKeys.adminOrphans(), report);
|
|
60
|
+
await queryClient.invalidateQueries({ queryKey: mediaKeys.adminStats(), exact: true });
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const purgeExpiredMutation = useMutation({
|
|
64
|
+
mutationFn: () => guard(purgeExpired),
|
|
65
|
+
onSuccess: async () => {
|
|
66
|
+
await Promise.all([
|
|
67
|
+
queryClient.invalidateQueries({ queryKey: mediaKeys.adminStats(), exact: true }),
|
|
68
|
+
queryClient.invalidateQueries({ queryKey: mediaKeys.adminOrphans(), exact: true }),
|
|
69
|
+
queryClient.invalidateQueries({ queryKey: mediaKeys.objectLists() })
|
|
70
|
+
]);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
const removeSubscriptionMutation = useMutation({
|
|
74
|
+
mutationFn: (id) => guard(() => deleteSubscription(id)),
|
|
75
|
+
onSuccess: (_result, id) => {
|
|
76
|
+
queryClient.setQueryData(mediaKeys.adminSubscriptions(), (current) => current
|
|
77
|
+
? {
|
|
78
|
+
count: Math.max(0, current.count - 1),
|
|
79
|
+
items: current.items.filter((item) => item.id !== id)
|
|
80
|
+
}
|
|
81
|
+
: current);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
const { refetch: refetchStats } = statsQuery;
|
|
85
|
+
const { refetch: refetchStale } = staleQuery;
|
|
86
|
+
const { refetch: refetchOrphans } = orphansQuery;
|
|
87
|
+
const { refetch: refetchSubscriptions } = subscriptionsQuery;
|
|
88
|
+
const { mutateAsync: purgeStaleAsync } = purgeStaleMutation;
|
|
89
|
+
const { mutateAsync: repairAsync } = repairMutation;
|
|
90
|
+
const { mutateAsync: purgeExpiredAsync } = purgeExpiredMutation;
|
|
91
|
+
const { mutateAsync: removeSubscriptionAsync } = removeSubscriptionMutation;
|
|
92
|
+
const loadStats = useCallback(async () => {
|
|
93
|
+
await refetchOrThrow(refetchStats);
|
|
94
|
+
}, [refetchStats]);
|
|
95
|
+
const loadStale = useCallback(async () => {
|
|
96
|
+
await refetchOrThrow(refetchStale);
|
|
97
|
+
}, [refetchStale]);
|
|
98
|
+
const loadOrphans = useCallback(async () => {
|
|
99
|
+
await refetchOrThrow(refetchOrphans);
|
|
100
|
+
}, [refetchOrphans]);
|
|
101
|
+
const loadSubscriptions = useCallback(async () => {
|
|
102
|
+
await refetchOrThrow(refetchSubscriptions);
|
|
103
|
+
}, [refetchSubscriptions]);
|
|
104
|
+
const purgeStale = useCallback(() => purgeStaleAsync(), [purgeStaleAsync]);
|
|
105
|
+
const repair = useCallback((confirm) => repairAsync(confirm), [repairAsync]);
|
|
106
|
+
const purgeExpiredObjects = useCallback(() => purgeExpiredAsync(), [purgeExpiredAsync]);
|
|
107
|
+
const removeSubscription = useCallback((id) => removeSubscriptionAsync(id), [removeSubscriptionAsync]);
|
|
108
|
+
return {
|
|
109
|
+
allowed: isSuperuser,
|
|
110
|
+
stats: statsQuery.data ?? null,
|
|
111
|
+
stale: staleQuery.data ?? null,
|
|
112
|
+
orphans: orphansQuery.data ?? null,
|
|
113
|
+
subscriptions: subscriptionsQuery.data ?? null,
|
|
114
|
+
loading: statsQuery.isFetching ||
|
|
115
|
+
staleQuery.isFetching ||
|
|
116
|
+
orphansQuery.isFetching ||
|
|
117
|
+
subscriptionsQuery.isFetching ||
|
|
118
|
+
purgeStaleMutation.isPending ||
|
|
119
|
+
repairMutation.isPending ||
|
|
120
|
+
purgeExpiredMutation.isPending ||
|
|
121
|
+
removeSubscriptionMutation.isPending,
|
|
122
|
+
error: statsQuery.error ??
|
|
123
|
+
staleQuery.error ??
|
|
124
|
+
orphansQuery.error ??
|
|
125
|
+
subscriptionsQuery.error ??
|
|
126
|
+
purgeStaleMutation.error ??
|
|
127
|
+
repairMutation.error ??
|
|
128
|
+
purgeExpiredMutation.error ??
|
|
129
|
+
removeSubscriptionMutation.error ??
|
|
130
|
+
null,
|
|
131
|
+
loadStats,
|
|
132
|
+
loadStale,
|
|
133
|
+
purgeStale,
|
|
134
|
+
loadOrphans,
|
|
135
|
+
repair,
|
|
136
|
+
purgeExpiredObjects,
|
|
137
|
+
loadSubscriptions,
|
|
138
|
+
removeSubscription,
|
|
139
|
+
purgeStaleMutation,
|
|
140
|
+
repairMutation,
|
|
141
|
+
purgeExpiredMutation,
|
|
142
|
+
removeSubscriptionMutation
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=useMediaAdmin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMediaAdmin.js","sourceRoot":"","sources":["../../../../src/runtime/hooks/useMediaAdmin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type UseMutationResult } from "@tanstack/react-query";
|
|
2
|
+
import type { MediaObjectPublic, MediaObjectUpdate } from "../schemas.js";
|
|
3
|
+
type UpdateObjectMutation = UseMutationResult<MediaObjectPublic, unknown, MediaObjectUpdate>;
|
|
4
|
+
type RemoveObjectMutation = UseMutationResult<void, unknown, void>;
|
|
5
|
+
export type UseMediaObject = {
|
|
6
|
+
object: MediaObjectPublic | null;
|
|
7
|
+
loading: boolean;
|
|
8
|
+
error: unknown;
|
|
9
|
+
reload: () => Promise<void>;
|
|
10
|
+
update: (patch: MediaObjectUpdate) => Promise<MediaObjectPublic>;
|
|
11
|
+
remove: () => Promise<void>;
|
|
12
|
+
updateMutation: UpdateObjectMutation;
|
|
13
|
+
removeMutation: RemoveObjectMutation;
|
|
14
|
+
};
|
|
15
|
+
export declare function useMediaObject(objectId: string | null): UseMediaObject;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=useMediaObject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMediaObject.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/useMediaObject.ts"],"names":[],"mappings":"AACA,OAAO,EAAyC,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAGtG,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE1E,KAAK,oBAAoB,GAAG,iBAAiB,CAAC,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC7F,KAAK,oBAAoB,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACjE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,cAAc,EAAE,oBAAoB,CAAC;IACrC,cAAc,EAAE,oBAAoB,CAAC;CACtC,CAAC;AAEF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CA0DtE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useCallback } from "react";
|
|
2
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
3
|
+
import { deleteObject, getObject, updateObject } from "../api/objects.js";
|
|
4
|
+
import { mediaKeys } from "../queryKeys.js";
|
|
5
|
+
export function useMediaObject(objectId) {
|
|
6
|
+
const queryClient = useQueryClient();
|
|
7
|
+
const queryKey = mediaKeys.object(objectId ?? "");
|
|
8
|
+
const query = useQuery({
|
|
9
|
+
queryKey,
|
|
10
|
+
queryFn: () => (objectId ? getObject(objectId) : null),
|
|
11
|
+
enabled: Boolean(objectId)
|
|
12
|
+
});
|
|
13
|
+
const updateMutation = useMutation({
|
|
14
|
+
mutationFn: async (patch) => {
|
|
15
|
+
if (!objectId)
|
|
16
|
+
throw new Error("No object selected");
|
|
17
|
+
return updateObject(objectId, patch);
|
|
18
|
+
},
|
|
19
|
+
onSuccess: async (next) => {
|
|
20
|
+
queryClient.setQueryData(queryKey, next);
|
|
21
|
+
await Promise.all([
|
|
22
|
+
queryClient.invalidateQueries({ queryKey, exact: true, refetchType: "none" }),
|
|
23
|
+
queryClient.invalidateQueries({ queryKey: mediaKeys.objectLists() })
|
|
24
|
+
]);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
const removeMutation = useMutation({
|
|
28
|
+
mutationFn: async () => {
|
|
29
|
+
if (!objectId)
|
|
30
|
+
throw new Error("No object selected");
|
|
31
|
+
await deleteObject(objectId);
|
|
32
|
+
},
|
|
33
|
+
onSuccess: async () => {
|
|
34
|
+
queryClient.setQueryData(queryKey, null);
|
|
35
|
+
await Promise.all([
|
|
36
|
+
queryClient.invalidateQueries({ queryKey, exact: true, refetchType: "none" }),
|
|
37
|
+
queryClient.invalidateQueries({ queryKey: mediaKeys.objectLists() })
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
const { refetch } = query;
|
|
42
|
+
const { mutateAsync: updateObjectAsync } = updateMutation;
|
|
43
|
+
const { mutateAsync: removeObjectAsync } = removeMutation;
|
|
44
|
+
const reload = useCallback(async () => {
|
|
45
|
+
if (!objectId)
|
|
46
|
+
return;
|
|
47
|
+
await refetch();
|
|
48
|
+
}, [objectId, refetch]);
|
|
49
|
+
const update = useCallback((patch) => updateObjectAsync(patch), [updateObjectAsync]);
|
|
50
|
+
const remove = useCallback(() => removeObjectAsync(), [removeObjectAsync]);
|
|
51
|
+
return {
|
|
52
|
+
object: query.data ?? null,
|
|
53
|
+
loading: query.isFetching,
|
|
54
|
+
error: query.error ?? null,
|
|
55
|
+
reload,
|
|
56
|
+
update,
|
|
57
|
+
remove,
|
|
58
|
+
updateMutation,
|
|
59
|
+
removeMutation
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=useMediaObject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMediaObject.js","sourceRoot":"","sources":["../../../../src/runtime/hooks/useMediaObject.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MediaObjectPublic, ObjectListParams } from "../schemas.js";
|
|
2
|
+
export type UseMediaObjects = {
|
|
3
|
+
items: MediaObjectPublic[];
|
|
4
|
+
count: number;
|
|
5
|
+
loading: boolean;
|
|
6
|
+
error: unknown;
|
|
7
|
+
hasMore: boolean;
|
|
8
|
+
refresh: () => Promise<void>;
|
|
9
|
+
loadMore: () => Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
export declare function useMediaObjects(params?: ObjectListParams): UseMediaObjects;
|
|
12
|
+
//# sourceMappingURL=useMediaObjects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMediaObjects.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/useMediaObjects.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAsB,MAAM,eAAe,CAAC;AAE7F,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B,CAAC;AAkBF,wBAAgB,eAAe,CAAC,MAAM,GAAE,gBAAqB,GAAG,eAAe,CAqF9E"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { useInfiniteQuery, useQueryClient } from "@tanstack/react-query";
|
|
2
|
+
import { useCallback, useMemo, useRef } from "react";
|
|
3
|
+
import { listObjects } from "../api/objects.js";
|
|
4
|
+
import { mediaKeys } from "../queryKeys.js";
|
|
5
|
+
function listParamsWithoutCursor(params) {
|
|
6
|
+
const next = { ...params };
|
|
7
|
+
delete next.cursor;
|
|
8
|
+
return next;
|
|
9
|
+
}
|
|
10
|
+
function flattenPages(data) {
|
|
11
|
+
return data?.pages.flatMap((page) => page.items) ?? [];
|
|
12
|
+
}
|
|
13
|
+
function latestCount(data) {
|
|
14
|
+
return data?.pages.at(-1)?.count ?? 0;
|
|
15
|
+
}
|
|
16
|
+
export function useMediaObjects(params = {}) {
|
|
17
|
+
const queryClient = useQueryClient();
|
|
18
|
+
const { category, visibility, status, mime_prefix, created_from, created_to, q, sort_by, order, limit, owner_user_id, include_deleted } = params;
|
|
19
|
+
const listParams = useMemo(() => listParamsWithoutCursor({
|
|
20
|
+
category,
|
|
21
|
+
visibility,
|
|
22
|
+
status,
|
|
23
|
+
mime_prefix,
|
|
24
|
+
created_from,
|
|
25
|
+
created_to,
|
|
26
|
+
q,
|
|
27
|
+
sort_by,
|
|
28
|
+
order,
|
|
29
|
+
limit,
|
|
30
|
+
owner_user_id,
|
|
31
|
+
include_deleted
|
|
32
|
+
}), [
|
|
33
|
+
category,
|
|
34
|
+
created_from,
|
|
35
|
+
created_to,
|
|
36
|
+
include_deleted,
|
|
37
|
+
limit,
|
|
38
|
+
mime_prefix,
|
|
39
|
+
order,
|
|
40
|
+
owner_user_id,
|
|
41
|
+
q,
|
|
42
|
+
sort_by,
|
|
43
|
+
status,
|
|
44
|
+
visibility
|
|
45
|
+
]);
|
|
46
|
+
const queryKey = useMemo(() => mediaKeys.objects(listParams), [listParams]);
|
|
47
|
+
const query = useInfiniteQuery({
|
|
48
|
+
queryKey,
|
|
49
|
+
initialPageParam: null,
|
|
50
|
+
queryFn: ({ pageParam }) => listObjects({ ...listParams, cursor: pageParam ?? undefined }),
|
|
51
|
+
getNextPageParam: (lastPage) => lastPage.next_cursor ?? undefined
|
|
52
|
+
});
|
|
53
|
+
const { fetchNextPage } = query;
|
|
54
|
+
const hasNextPageRef = useRef(query.hasNextPage);
|
|
55
|
+
const isFetchingNextPageRef = useRef(query.isFetchingNextPage);
|
|
56
|
+
hasNextPageRef.current = query.hasNextPage;
|
|
57
|
+
isFetchingNextPageRef.current = query.isFetchingNextPage;
|
|
58
|
+
const refresh = useCallback(async () => {
|
|
59
|
+
await queryClient.resetQueries({ queryKey, exact: true });
|
|
60
|
+
}, [queryClient, queryKey]);
|
|
61
|
+
const loadMore = useCallback(async () => {
|
|
62
|
+
if (!hasNextPageRef.current || isFetchingNextPageRef.current)
|
|
63
|
+
return;
|
|
64
|
+
await fetchNextPage();
|
|
65
|
+
}, [fetchNextPage]);
|
|
66
|
+
return {
|
|
67
|
+
items: flattenPages(query.data),
|
|
68
|
+
count: latestCount(query.data),
|
|
69
|
+
loading: query.isFetching,
|
|
70
|
+
error: query.error ?? null,
|
|
71
|
+
hasMore: query.hasNextPage,
|
|
72
|
+
refresh,
|
|
73
|
+
loadMore
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=useMediaObjects.js.map
|