@aphexcms/cms-core 0.1.9 → 0.1.10
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/api/assets.d.ts +48 -0
- package/dist/api/assets.d.ts.map +1 -0
- package/dist/api/assets.js +52 -0
- package/dist/api/client.d.ts +37 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +125 -0
- package/dist/api/documents.d.ts +56 -0
- package/dist/api/documents.d.ts.map +1 -0
- package/dist/api/documents.js +77 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +5 -0
- package/dist/api/organizations.d.ts +101 -0
- package/dist/api/organizations.d.ts.map +1 -0
- package/dist/api/organizations.js +92 -0
- package/dist/api/types.d.ts +23 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +1 -0
- package/dist/auth/auth-errors.d.ts +7 -0
- package/dist/auth/auth-errors.d.ts.map +1 -0
- package/dist/auth/auth-errors.js +13 -0
- package/dist/auth/auth-hooks.d.ts +6 -0
- package/dist/auth/auth-hooks.d.ts.map +1 -0
- package/dist/auth/auth-hooks.js +108 -0
- package/dist/auth/provider.d.ts +17 -0
- package/dist/auth/provider.d.ts.map +1 -0
- package/dist/auth/provider.js +1 -0
- package/dist/client/index.d.ts +24 -0
- package/dist/client/index.d.ts.map +1 -0
- package/{src/lib/client/index.ts → dist/client/index.js} +7 -18
- package/dist/components/AdminApp.svelte.d.ts +24 -0
- package/dist/components/AdminApp.svelte.d.ts.map +1 -0
- package/dist/components/admin/AdminLayout.svelte.d.ts +15 -0
- package/dist/components/admin/AdminLayout.svelte.d.ts.map +1 -0
- package/dist/components/admin/DocumentEditor.svelte.d.ts +18 -0
- package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -0
- package/dist/components/admin/DocumentTypesList.svelte.d.ts +14 -0
- package/dist/components/admin/DocumentTypesList.svelte.d.ts.map +1 -0
- package/dist/components/admin/ObjectModal.svelte.d.ts +15 -0
- package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -0
- package/dist/components/admin/SchemaField.svelte.d.ts +19 -0
- package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/ArrayField.svelte.d.ts +12 -0
- package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/BooleanField.svelte.d.ts +13 -0
- package/dist/components/admin/fields/BooleanField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/ImageField.svelte.d.ts +15 -0
- package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/NumberField.svelte.d.ts +14 -0
- package/dist/components/admin/fields/NumberField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/ReferenceField.svelte.d.ts +12 -0
- package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/SlugField.svelte.d.ts +15 -0
- package/dist/components/admin/fields/SlugField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/StringField.svelte.d.ts +14 -0
- package/dist/components/admin/fields/StringField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/TextareaField.svelte.d.ts +14 -0
- package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +1 -0
- package/dist/components/fields/index.d.ts +9 -0
- package/dist/components/fields/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +7 -0
- package/dist/components/index.d.ts.map +1 -0
- package/{src/lib/components/index.ts → dist/components/index.js} +1 -5
- package/dist/components/layout/OrganizationSwitcher.svelte.d.ts +11 -0
- package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -0
- package/dist/components/layout/Sidebar.svelte.d.ts +14 -0
- package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -0
- package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +4 -0
- package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -0
- package/dist/components/layout/sidebar/NavMain.svelte.d.ts +19 -0
- package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -0
- package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts +9 -0
- package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts.map +1 -0
- package/dist/components/layout/sidebar/NavUser.svelte.d.ts +9 -0
- package/dist/components/layout/sidebar/NavUser.svelte.d.ts.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +15 -0
- package/dist/db/adapters/index.d.ts +1 -0
- package/dist/db/adapters/index.d.ts.map +1 -0
- package/{src/lib/db/adapters/index.ts → dist/db/adapters/index.js} +1 -0
- package/dist/db/index.d.ts +2 -0
- package/dist/db/index.d.ts.map +1 -0
- package/{src/lib/db/index.ts → dist/db/index.js} +1 -2
- package/dist/db/interfaces/asset.d.ts +51 -0
- package/dist/db/interfaces/asset.d.ts.map +1 -0
- package/dist/db/interfaces/asset.js +1 -0
- package/dist/db/interfaces/document.d.ts +36 -0
- package/dist/db/interfaces/document.d.ts.map +1 -0
- package/dist/db/interfaces/document.js +1 -0
- package/dist/db/interfaces/index.d.ts +73 -0
- package/dist/db/interfaces/index.d.ts.map +1 -0
- package/dist/db/interfaces/index.js +1 -0
- package/dist/db/interfaces/organization.d.ts +27 -0
- package/dist/db/interfaces/organization.d.ts.map +1 -0
- package/dist/db/interfaces/organization.js +1 -0
- package/dist/db/interfaces/schema.d.ts +21 -0
- package/dist/db/interfaces/schema.d.ts.map +1 -0
- package/dist/db/interfaces/schema.js +1 -0
- package/dist/db/interfaces/user.d.ts +15 -0
- package/dist/db/interfaces/user.d.ts.map +1 -0
- package/dist/db/interfaces/user.js +1 -0
- package/dist/db/utils/reference-resolver.d.ts +18 -0
- package/dist/db/utils/reference-resolver.d.ts.map +1 -0
- package/dist/db/utils/reference-resolver.js +80 -0
- package/dist/define.d.ts +3 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +4 -0
- package/dist/email/index.d.ts +2 -0
- package/dist/email/index.d.ts.map +1 -0
- package/{src/lib/email/index.ts → dist/email/index.js} +1 -2
- package/dist/email/interfaces/email.d.ts +42 -0
- package/dist/email/interfaces/email.d.ts.map +1 -0
- package/dist/email/interfaces/email.js +1 -0
- package/dist/engine.d.ts +26 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +66 -0
- package/dist/field-validation/rule.d.ts +51 -0
- package/dist/field-validation/rule.d.ts.map +1 -0
- package/dist/field-validation/rule.js +221 -0
- package/dist/field-validation/utils.d.ts +21 -0
- package/dist/field-validation/utils.d.ts.map +1 -0
- package/dist/field-validation/utils.js +66 -0
- package/dist/hooks.d.ts +23 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +96 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/{src/lib/index.ts → dist/index.js} +1 -2
- package/dist/is-mobile.svelte.d.ts +5 -0
- package/dist/is-mobile.svelte.d.ts.map +1 -0
- package/{src/lib/is-mobile.svelte.ts → dist/is-mobile.svelte.js} +3 -5
- package/dist/routes/assets-by-id.d.ts +5 -0
- package/dist/routes/assets-by-id.d.ts.map +1 -0
- package/dist/routes/assets-by-id.js +138 -0
- package/dist/routes/assets-cdn.d.ts +3 -0
- package/dist/routes/assets-cdn.d.ts.map +1 -0
- package/dist/routes/assets-cdn.js +155 -0
- package/dist/routes/assets.d.ts +4 -0
- package/dist/routes/assets.d.ts.map +1 -0
- package/dist/routes/assets.js +94 -0
- package/dist/routes/documents-by-id.d.ts +5 -0
- package/dist/routes/documents-by-id.d.ts.map +1 -0
- package/dist/routes/documents-by-id.js +142 -0
- package/dist/routes/documents-publish.d.ts +4 -0
- package/dist/routes/documents-publish.d.ts.map +1 -0
- package/dist/routes/documents-publish.js +151 -0
- package/dist/routes/documents.d.ts +4 -0
- package/dist/routes/documents.d.ts.map +1 -0
- package/dist/routes/documents.js +131 -0
- package/dist/routes/index.d.ts +6 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +10 -0
- package/dist/routes/organizations-by-id.d.ts +5 -0
- package/dist/routes/organizations-by-id.d.ts.map +1 -0
- package/dist/routes/organizations-by-id.js +187 -0
- package/dist/routes/organizations-invitations.d.ts +4 -0
- package/dist/routes/organizations-invitations.d.ts.map +1 -0
- package/dist/routes/organizations-invitations.js +125 -0
- package/dist/routes/organizations-members.d.ts +5 -0
- package/dist/routes/organizations-members.d.ts.map +1 -0
- package/dist/routes/organizations-members.js +206 -0
- package/dist/routes/organizations-switch.d.ts +3 -0
- package/dist/routes/organizations-switch.d.ts.map +1 -0
- package/dist/routes/organizations-switch.js +53 -0
- package/dist/routes/organizations.d.ts +4 -0
- package/dist/routes/organizations.d.ts.map +1 -0
- package/dist/routes/organizations.js +109 -0
- package/dist/routes/schemas-by-type.d.ts +3 -0
- package/dist/routes/schemas-by-type.d.ts.map +1 -0
- package/dist/routes/schemas-by-type.js +25 -0
- package/dist/routes/schemas.d.ts +3 -0
- package/dist/routes/schemas.d.ts.map +1 -0
- package/dist/routes/schemas.js +11 -0
- package/dist/routes-exports.d.ts +14 -0
- package/dist/routes-exports.d.ts.map +1 -0
- package/dist/routes-exports.js +19 -0
- package/dist/schema-context.svelte.d.ts +10 -0
- package/dist/schema-context.svelte.d.ts.map +1 -0
- package/dist/schema-context.svelte.js +18 -0
- package/dist/schema-utils/cleanup.d.ts +21 -0
- package/dist/schema-utils/cleanup.d.ts.map +1 -0
- package/dist/schema-utils/cleanup.js +80 -0
- package/dist/schema-utils/index.d.ts +4 -0
- package/dist/schema-utils/index.d.ts.map +1 -0
- package/dist/schema-utils/index.js +4 -0
- package/dist/schema-utils/utils.d.ts +30 -0
- package/dist/schema-utils/utils.d.ts.map +1 -0
- package/dist/schema-utils/utils.js +37 -0
- package/dist/schema-utils/validator.d.ts +6 -0
- package/dist/schema-utils/validator.d.ts.map +1 -0
- package/dist/schema-utils/validator.js +45 -0
- package/dist/server/index.d.ts +16 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +28 -0
- package/dist/services/asset-service.d.ts +86 -0
- package/dist/services/asset-service.d.ts.map +1 -0
- package/dist/services/asset-service.js +187 -0
- package/dist/services/index.d.ts +3 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +4 -0
- package/dist/storage/adapters/index.d.ts +2 -0
- package/dist/storage/adapters/index.d.ts.map +1 -0
- package/dist/storage/adapters/index.js +2 -0
- package/dist/storage/adapters/local-storage-adapter.d.ts +54 -0
- package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -0
- package/dist/storage/adapters/local-storage-adapter.js +187 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/{src/lib/storage/index.ts → dist/storage/index.js} +2 -4
- package/dist/storage/interfaces/index.d.ts +2 -0
- package/dist/storage/interfaces/index.d.ts.map +1 -0
- package/dist/storage/interfaces/index.js +2 -0
- package/dist/storage/interfaces/storage.d.ts +91 -0
- package/dist/storage/interfaces/storage.d.ts.map +1 -0
- package/dist/storage/interfaces/storage.js +1 -0
- package/dist/storage/providers/storage.d.ts +43 -0
- package/dist/storage/providers/storage.d.ts.map +1 -0
- package/dist/storage/providers/storage.js +64 -0
- package/dist/types/asset.d.ts +73 -0
- package/dist/types/asset.d.ts.map +1 -0
- package/dist/types/asset.js +2 -0
- package/dist/types/auth.d.ts +50 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +41 -0
- package/dist/types/config.d.ts +47 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +1 -0
- package/dist/types/document.d.ts +34 -0
- package/dist/types/document.d.ts.map +1 -0
- package/dist/types/document.js +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/organization.d.ts +105 -0
- package/dist/types/organization.d.ts.map +1 -0
- package/dist/types/organization.js +3 -0
- package/dist/types/schemas.d.ts +114 -0
- package/dist/types/schemas.d.ts.map +1 -0
- package/dist/types/schemas.js +1 -0
- package/dist/types/sidebar.d.ts +33 -0
- package/dist/types/sidebar.d.ts.map +1 -0
- package/dist/types/sidebar.js +1 -0
- package/dist/types/user.d.ts +14 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +1 -0
- package/dist/utils/content-hash.d.ts +22 -0
- package/dist/utils/content-hash.d.ts.map +1 -0
- package/dist/utils/content-hash.js +67 -0
- package/dist/utils/image-url.d.ts +88 -0
- package/dist/utils/image-url.d.ts.map +1 -0
- package/dist/utils/image-url.js +165 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/slug.d.ts +13 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +30 -0
- package/dist/utils.d.ts +13 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +5 -0
- package/package.json +2 -2
- package/src/lib/api/assets.ts +0 -75
- package/src/lib/api/client.ts +0 -150
- package/src/lib/api/documents.ts +0 -102
- package/src/lib/api/index.ts +0 -7
- package/src/lib/api/organizations.ts +0 -154
- package/src/lib/api/types.ts +0 -34
- package/src/lib/auth/auth-errors.ts +0 -23
- package/src/lib/auth/auth-hooks.ts +0 -132
- package/src/lib/auth/provider.ts +0 -25
- package/src/lib/config.ts +0 -18
- package/src/lib/db/interfaces/asset.ts +0 -61
- package/src/lib/db/interfaces/document.ts +0 -53
- package/src/lib/db/interfaces/index.ts +0 -98
- package/src/lib/db/interfaces/organization.ts +0 -51
- package/src/lib/db/interfaces/schema.ts +0 -13
- package/src/lib/db/interfaces/user.ts +0 -16
- package/src/lib/db/utils/reference-resolver.ts +0 -119
- package/src/lib/define.ts +0 -7
- package/src/lib/email/interfaces/email.ts +0 -45
- package/src/lib/engine.ts +0 -85
- package/src/lib/field-validation/rule.ts +0 -287
- package/src/lib/field-validation/utils.ts +0 -91
- package/src/lib/hooks.ts +0 -142
- package/src/lib/routes/assets-by-id.ts +0 -161
- package/src/lib/routes/assets-cdn.ts +0 -185
- package/src/lib/routes/assets.ts +0 -116
- package/src/lib/routes/documents-by-id.ts +0 -188
- package/src/lib/routes/documents-publish.ts +0 -211
- package/src/lib/routes/documents.ts +0 -172
- package/src/lib/routes/index.ts +0 -13
- package/src/lib/routes/organizations-by-id.ts +0 -258
- package/src/lib/routes/organizations-invitations.ts +0 -183
- package/src/lib/routes/organizations-members.ts +0 -301
- package/src/lib/routes/organizations-switch.ts +0 -74
- package/src/lib/routes/organizations.ts +0 -147
- package/src/lib/routes/schemas-by-type.ts +0 -35
- package/src/lib/routes/schemas.ts +0 -19
- package/src/lib/routes-exports.ts +0 -42
- package/src/lib/schema-context.svelte.ts +0 -24
- package/src/lib/schema-utils/cleanup.ts +0 -116
- package/src/lib/schema-utils/index.ts +0 -4
- package/src/lib/schema-utils/utils.ts +0 -47
- package/src/lib/schema-utils/validator.ts +0 -58
- package/src/lib/server/index.ts +0 -40
- package/src/lib/services/asset-service.ts +0 -256
- package/src/lib/services/index.ts +0 -6
- package/src/lib/storage/adapters/index.ts +0 -2
- package/src/lib/storage/adapters/local-storage-adapter.ts +0 -215
- package/src/lib/storage/interfaces/index.ts +0 -2
- package/src/lib/storage/interfaces/storage.ts +0 -114
- package/src/lib/storage/providers/storage.ts +0 -83
- package/src/lib/types/asset.ts +0 -81
- package/src/lib/types/auth.ts +0 -80
- package/src/lib/types/config.ts +0 -45
- package/src/lib/types/document.ts +0 -38
- package/src/lib/types/index.ts +0 -8
- package/src/lib/types/organization.ts +0 -119
- package/src/lib/types/schemas.ts +0 -151
- package/src/lib/types/sidebar.ts +0 -37
- package/src/lib/types/user.ts +0 -17
- package/src/lib/utils/content-hash.ts +0 -75
- package/src/lib/utils/image-url.ts +0 -204
- package/src/lib/utils/index.ts +0 -12
- package/src/lib/utils/slug.ts +0 -33
- package/src/lib/utils.ts +0 -13
- /package/{src/lib → dist}/app.d.ts +0 -0
- /package/{src/lib → dist}/auth/MULTI_TENANCY_PLAN.md +0 -0
- /package/{src/lib → dist}/components/AdminApp.svelte +0 -0
- /package/{src/lib → dist}/components/admin/AdminLayout.svelte +0 -0
- /package/{src/lib → dist}/components/admin/DocumentEditor.svelte +0 -0
- /package/{src/lib → dist}/components/admin/DocumentTypesList.svelte +0 -0
- /package/{src/lib → dist}/components/admin/ObjectModal.svelte +0 -0
- /package/{src/lib → dist}/components/admin/SchemaField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/ArrayField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/BooleanField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/ImageField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/NumberField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/ReferenceField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/SlugField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/StringField.svelte +0 -0
- /package/{src/lib → dist}/components/admin/fields/TextareaField.svelte +0 -0
- /package/{src/lib/components/fields/index.ts → dist/components/fields/index.js} +0 -0
- /package/{src/lib → dist}/components/layout/OrganizationSwitcher.svelte +0 -0
- /package/{src/lib → dist}/components/layout/Sidebar.svelte +0 -0
- /package/{src/lib → dist}/components/layout/sidebar/AppSidebar.svelte +0 -0
- /package/{src/lib → dist}/components/layout/sidebar/NavMain.svelte +0 -0
- /package/{src/lib → dist}/components/layout/sidebar/NavSecondary.svelte +0 -0
- /package/{src/lib → dist}/components/layout/sidebar/NavUser.svelte +0 -0
- /package/{src/lib → dist}/plugins/README.md +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SchemaType } from '../types/schemas.js';
|
|
2
|
+
/**
|
|
3
|
+
* Schema utility functions that work with a schema registry
|
|
4
|
+
* These functions accept schemas as parameters to avoid package-level dependencies
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Get a schema type by name from a collection of schemas
|
|
8
|
+
*/
|
|
9
|
+
export declare function getSchemaByName(schemas: SchemaType[], name: string): SchemaType | null;
|
|
10
|
+
/**
|
|
11
|
+
* Get all available object types (for array field dropdowns)
|
|
12
|
+
*/
|
|
13
|
+
export declare function getObjectTypes(schemas: SchemaType[]): SchemaType[];
|
|
14
|
+
/**
|
|
15
|
+
* Get all available document types
|
|
16
|
+
*/
|
|
17
|
+
export declare function getDocumentTypes(schemas: SchemaType[]): SchemaType[];
|
|
18
|
+
/**
|
|
19
|
+
* Check if a schema type exists
|
|
20
|
+
*/
|
|
21
|
+
export declare function schemaExists(schemas: SchemaType[], name: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Get the available types for an array field
|
|
24
|
+
*/
|
|
25
|
+
export declare function getArrayTypes(schemas: SchemaType[], arrayField: {
|
|
26
|
+
of?: Array<{
|
|
27
|
+
type: string;
|
|
28
|
+
}>;
|
|
29
|
+
}): SchemaType[];
|
|
30
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/schema-utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAEtF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAElE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAEpE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC5B,OAAO,EAAE,UAAU,EAAE,EACrB,UAAU,EAAE;IAAE,EAAE,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAC1C,UAAU,EAAE,CAKd"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema utility functions that work with a schema registry
|
|
3
|
+
* These functions accept schemas as parameters to avoid package-level dependencies
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Get a schema type by name from a collection of schemas
|
|
7
|
+
*/
|
|
8
|
+
export function getSchemaByName(schemas, name) {
|
|
9
|
+
return schemas.find((schema) => schema.name === name) || null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Get all available object types (for array field dropdowns)
|
|
13
|
+
*/
|
|
14
|
+
export function getObjectTypes(schemas) {
|
|
15
|
+
return schemas.filter((schema) => schema.type === 'object');
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get all available document types
|
|
19
|
+
*/
|
|
20
|
+
export function getDocumentTypes(schemas) {
|
|
21
|
+
return schemas.filter((schema) => schema.type === 'document');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if a schema type exists
|
|
25
|
+
*/
|
|
26
|
+
export function schemaExists(schemas, name) {
|
|
27
|
+
return schemas.some((schema) => schema.name === name);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the available types for an array field
|
|
31
|
+
*/
|
|
32
|
+
export function getArrayTypes(schemas, arrayField) {
|
|
33
|
+
if (!arrayField.of)
|
|
34
|
+
return [];
|
|
35
|
+
const typeNames = arrayField.of.map((item) => item.type);
|
|
36
|
+
return schemas.filter((schema) => typeNames.includes(schema.name));
|
|
37
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/lib/schema-utils/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,kBAAkB,CAAC;AAE1D;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAoDpE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate all schema references to ensure they exist
|
|
3
|
+
*/
|
|
4
|
+
export function validateSchemaReferences(schemas) {
|
|
5
|
+
const schemaNames = new Set(schemas.map((schema) => schema.name));
|
|
6
|
+
const errors = [];
|
|
7
|
+
function validateField(field, parentSchema) {
|
|
8
|
+
// Check array field references
|
|
9
|
+
if (field.type === 'array' && field.of) {
|
|
10
|
+
for (const arrayType of field.of) {
|
|
11
|
+
if (!schemaNames.has(arrayType.type)) {
|
|
12
|
+
errors.push(`Schema "${parentSchema}" field "${field.name}" references unknown type "${arrayType.type}"`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// Check object field references (if they reference external types)
|
|
17
|
+
if (field.type === 'object' && typeof field.fields === 'string') {
|
|
18
|
+
if (!schemaNames.has(field.fields)) {
|
|
19
|
+
errors.push(`Schema "${parentSchema}" field "${field.name}" references unknown object type "${field.fields}"`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Recursively check nested fields -- cast type later or something. cba
|
|
23
|
+
if ('fields' in field && Array.isArray(field.fields)) {
|
|
24
|
+
for (const nestedField of field.fields) {
|
|
25
|
+
validateField(nestedField, parentSchema);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Validate each schema
|
|
30
|
+
for (const schema of schemas) {
|
|
31
|
+
if (schema.fields) {
|
|
32
|
+
for (const field of schema.fields) {
|
|
33
|
+
validateField(field, schema.name);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Throw error if any validation issues found
|
|
38
|
+
if (errors.length > 0) {
|
|
39
|
+
console.error('\nSchema Validation Errors:');
|
|
40
|
+
errors.forEach((error) => console.error(error));
|
|
41
|
+
// Just throw the errors directly
|
|
42
|
+
throw new Error(errors.join('\n'));
|
|
43
|
+
}
|
|
44
|
+
console.log('✅ Schema validation passed - all references are valid');
|
|
45
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from '../types/index.js';
|
|
2
|
+
export * from '../auth/provider.js';
|
|
3
|
+
export * from '../email/index.js';
|
|
4
|
+
export { AuthError, type AuthErrorCode } from '../auth/auth-errors.js';
|
|
5
|
+
export { createCMSConfig } from '../config.js';
|
|
6
|
+
export { createCMSHook, type CMSInstances } from '../hooks.js';
|
|
7
|
+
export * from '../db/interfaces/index.js';
|
|
8
|
+
export * from '../storage/index.js';
|
|
9
|
+
export * from '../storage/interfaces/index.js';
|
|
10
|
+
export * from '../storage/providers/storage.js';
|
|
11
|
+
export * from '../services/index.js';
|
|
12
|
+
export { AssetService } from '../services/asset-service.js';
|
|
13
|
+
export * from '../routes-exports.js';
|
|
14
|
+
export * from '../schema-utils/index.js';
|
|
15
|
+
export { createHashForPublishing } from '../utils/content-hash.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAG5D,cAAc,wBAAwB,CAAC;AAGvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzD,cAAc,mBAAmB,CAAC;AAGlC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Aphex CMS Core - Server-side exports
|
|
2
|
+
// These require Node.js and should NOT be imported client-side
|
|
3
|
+
// Export all core types from the new central location
|
|
4
|
+
export * from '../types/index.js';
|
|
5
|
+
export * from '../auth/provider.js';
|
|
6
|
+
export * from '../email/index.js';
|
|
7
|
+
// Authentication errors
|
|
8
|
+
export { AuthError } from '../auth/auth-errors.js';
|
|
9
|
+
// Configuration system
|
|
10
|
+
export { createCMSConfig } from '../config.js';
|
|
11
|
+
// Hooks integration (SvelteKit server hooks)
|
|
12
|
+
export { createCMSHook } from '../hooks.js';
|
|
13
|
+
// Database interfaces (no longer export registry or adapters - use adapter packages)
|
|
14
|
+
export * from '../db/interfaces/index.js';
|
|
15
|
+
// Storage adapters and interfaces
|
|
16
|
+
export * from '../storage/index.js';
|
|
17
|
+
export * from '../storage/interfaces/index.js';
|
|
18
|
+
export * from '../storage/providers/storage.js';
|
|
19
|
+
// Services (includes sharp for image processing)
|
|
20
|
+
export * from '../services/index.js';
|
|
21
|
+
export { AssetService } from '../services/asset-service.js';
|
|
22
|
+
// API Route handlers (for re-exporting in your app's API routes)
|
|
23
|
+
// Re-export from routes-exports to avoid .js extension issues in workspace
|
|
24
|
+
export * from '../routes-exports.js';
|
|
25
|
+
// Schema utilities
|
|
26
|
+
export * from '../schema-utils/index.js';
|
|
27
|
+
// Content hash utilities (server-side)
|
|
28
|
+
export { createHashForPublishing } from '../utils/content-hash.js';
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { StorageAdapter } from '../storage/interfaces/storage.js';
|
|
2
|
+
import type { DatabaseAdapter } from '../db/interfaces/index.js';
|
|
3
|
+
import type { Asset } from '../types/index.js';
|
|
4
|
+
export interface AssetUploadData {
|
|
5
|
+
buffer: Buffer;
|
|
6
|
+
originalFilename: string;
|
|
7
|
+
mimeType: string;
|
|
8
|
+
size: number;
|
|
9
|
+
title?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
alt?: string;
|
|
12
|
+
creditLine?: string;
|
|
13
|
+
createdBy?: string;
|
|
14
|
+
metadata?: {
|
|
15
|
+
schemaType?: string;
|
|
16
|
+
fieldPath?: string;
|
|
17
|
+
[key: string]: any;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface AssetFilters {
|
|
21
|
+
assetType?: 'image' | 'file';
|
|
22
|
+
mimeType?: string;
|
|
23
|
+
search?: string;
|
|
24
|
+
limit?: number;
|
|
25
|
+
offset?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Asset service - coordinates storage and database operations
|
|
29
|
+
* Maintains separation of concerns while providing unified asset management
|
|
30
|
+
*/
|
|
31
|
+
export declare class AssetService {
|
|
32
|
+
private storage;
|
|
33
|
+
private database;
|
|
34
|
+
constructor(storage: StorageAdapter, database: DatabaseAdapter);
|
|
35
|
+
/**
|
|
36
|
+
* Upload and store an asset
|
|
37
|
+
*/
|
|
38
|
+
uploadAsset(organizationId: string, data: AssetUploadData): Promise<Asset>;
|
|
39
|
+
/**
|
|
40
|
+
* Find asset by ID
|
|
41
|
+
*/
|
|
42
|
+
findAssetById(organizationId: string, id: string): Promise<Asset | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Find asset by ID globally (bypasses organization filter for public asset access)
|
|
45
|
+
* Only available on PostgreSQL adapter with RLS bypass
|
|
46
|
+
*/
|
|
47
|
+
findAssetByIdGlobal(id: string): Promise<Asset | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Find multiple assets with filtering
|
|
50
|
+
*/
|
|
51
|
+
findAssets(organizationId: string, filters?: AssetFilters): Promise<Asset[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Delete asset (both file and database record)
|
|
54
|
+
*
|
|
55
|
+
* Note: If the asset was stored by a different adapter (e.g., switching from R2 to local),
|
|
56
|
+
* file deletion may fail. The database record will still be removed for a clean state.
|
|
57
|
+
*/
|
|
58
|
+
deleteAsset(organizationId: string, id: string): Promise<boolean>;
|
|
59
|
+
/**
|
|
60
|
+
* Update asset metadata
|
|
61
|
+
*/
|
|
62
|
+
updateAssetMetadata(organizationId: string, id: string, metadata: {
|
|
63
|
+
title?: string;
|
|
64
|
+
description?: string;
|
|
65
|
+
alt?: string;
|
|
66
|
+
creditLine?: string;
|
|
67
|
+
updatedBy?: string;
|
|
68
|
+
}): Promise<Asset | null>;
|
|
69
|
+
/**
|
|
70
|
+
* Get asset statistics
|
|
71
|
+
*/
|
|
72
|
+
getAssetStats(organizationId: string): Promise<{
|
|
73
|
+
totalAssets: number;
|
|
74
|
+
totalImages: number;
|
|
75
|
+
totalFiles: number;
|
|
76
|
+
totalSize: number;
|
|
77
|
+
}>;
|
|
78
|
+
/**
|
|
79
|
+
* Get health status of both storage and database
|
|
80
|
+
*/
|
|
81
|
+
getHealthStatus(): Promise<{
|
|
82
|
+
storage: boolean;
|
|
83
|
+
database: boolean;
|
|
84
|
+
}>;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=asset-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-service.d.ts","sourceRoot":"","sources":["../../src/lib/services/asset-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QACV,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACnB,CAAC;CACF;AAED,MAAM,WAAW,YAAY;IAC5B,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,YAAY;IAEvB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;gBADR,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,eAAe;IAGlC;;OAEG;IACG,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC;IAoFhF;;OAEG;IACG,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAI9E;;;OAGG;IACG,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAmB5D;;OAEG;IACG,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAItF;;;;;OAKG;IACG,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BvE;;OAEG;IACG,mBAAmB,CACxB,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GACC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAIxB;;OAEG;IACG,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;QACpD,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KAClB,CAAC;IAeF;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,OAAO,CAAC;KAClB,CAAC;CAWF"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// Asset service - orchestrates storage and database operations
|
|
2
|
+
import sharp from 'sharp';
|
|
3
|
+
/**
|
|
4
|
+
* Asset service - coordinates storage and database operations
|
|
5
|
+
* Maintains separation of concerns while providing unified asset management
|
|
6
|
+
*/
|
|
7
|
+
export class AssetService {
|
|
8
|
+
storage;
|
|
9
|
+
database;
|
|
10
|
+
constructor(storage, database) {
|
|
11
|
+
this.storage = storage;
|
|
12
|
+
this.database = database;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Upload and store an asset
|
|
16
|
+
*/
|
|
17
|
+
async uploadAsset(organizationId, data) {
|
|
18
|
+
// Determine asset type
|
|
19
|
+
const assetType = data.mimeType.startsWith('image/') ? 'image' : 'file';
|
|
20
|
+
// Extract image metadata if it's an image
|
|
21
|
+
let width;
|
|
22
|
+
let height;
|
|
23
|
+
let metadata = {
|
|
24
|
+
// Include field metadata for privacy checking
|
|
25
|
+
...data.metadata
|
|
26
|
+
};
|
|
27
|
+
if (assetType === 'image') {
|
|
28
|
+
try {
|
|
29
|
+
const imageMetadata = await sharp(data.buffer).metadata();
|
|
30
|
+
width = imageMetadata.width;
|
|
31
|
+
height = imageMetadata.height;
|
|
32
|
+
// Merge image metadata with field metadata
|
|
33
|
+
metadata = {
|
|
34
|
+
...metadata, // Keep schemaType and fieldPath
|
|
35
|
+
format: imageMetadata.format,
|
|
36
|
+
space: imageMetadata.space,
|
|
37
|
+
channels: imageMetadata.channels,
|
|
38
|
+
density: imageMetadata.density,
|
|
39
|
+
hasProfile: imageMetadata.hasProfile,
|
|
40
|
+
hasAlpha: imageMetadata.hasAlpha
|
|
41
|
+
};
|
|
42
|
+
// Add dominant color
|
|
43
|
+
const stats = await sharp(data.buffer).stats();
|
|
44
|
+
metadata.dominantColor = stats.dominant;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.warn('Could not extract image metadata:', error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// 1. Store file using storage adapter
|
|
51
|
+
const storageFile = await this.storage.store({
|
|
52
|
+
buffer: data.buffer,
|
|
53
|
+
filename: data.originalFilename,
|
|
54
|
+
mimeType: data.mimeType,
|
|
55
|
+
size: data.size
|
|
56
|
+
});
|
|
57
|
+
// 2. Save asset metadata using database adapter
|
|
58
|
+
try {
|
|
59
|
+
const asset = await this.database.createAsset({
|
|
60
|
+
assetType,
|
|
61
|
+
filename: storageFile.path.split('/').pop() || data.originalFilename,
|
|
62
|
+
originalFilename: data.originalFilename,
|
|
63
|
+
mimeType: data.mimeType,
|
|
64
|
+
size: data.size,
|
|
65
|
+
url: storageFile.url || '', // Empty for local storage initially
|
|
66
|
+
path: storageFile.path,
|
|
67
|
+
storageAdapter: this.storage.name,
|
|
68
|
+
organizationId,
|
|
69
|
+
width,
|
|
70
|
+
height,
|
|
71
|
+
metadata,
|
|
72
|
+
title: data.title || undefined,
|
|
73
|
+
description: data.description || undefined,
|
|
74
|
+
alt: data.alt || undefined,
|
|
75
|
+
creditLine: data.creditLine || undefined,
|
|
76
|
+
createdBy: data.createdBy
|
|
77
|
+
});
|
|
78
|
+
// If using local storage, generate and store the CDN URL with the real asset ID
|
|
79
|
+
if (!storageFile.url) {
|
|
80
|
+
const cdnUrl = `/media/${asset.id}/${encodeURIComponent(asset.originalFilename)}`;
|
|
81
|
+
// Update both the object and the database
|
|
82
|
+
asset.url = cdnUrl;
|
|
83
|
+
await this.database.updateAsset(organizationId, asset.id, { url: cdnUrl });
|
|
84
|
+
}
|
|
85
|
+
return asset;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
// If database save fails, clean up the stored file
|
|
89
|
+
await this.storage.delete(storageFile.path);
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Find asset by ID
|
|
95
|
+
*/
|
|
96
|
+
async findAssetById(organizationId, id) {
|
|
97
|
+
return await this.database.findAssetById(organizationId, id);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Find asset by ID globally (bypasses organization filter for public asset access)
|
|
101
|
+
* Only available on PostgreSQL adapter with RLS bypass
|
|
102
|
+
*/
|
|
103
|
+
async findAssetByIdGlobal(id) {
|
|
104
|
+
// Check if the adapter has the global method
|
|
105
|
+
if ('findAssetByIdGlobal' in this.database &&
|
|
106
|
+
typeof this.database.findAssetByIdGlobal === 'function') {
|
|
107
|
+
console.log('[AssetService] Using findAssetByIdGlobal from adapter');
|
|
108
|
+
return await this.database.findAssetByIdGlobal(id);
|
|
109
|
+
}
|
|
110
|
+
// Fallback: not supported
|
|
111
|
+
console.warn('[AssetService] findAssetByIdGlobal not supported by this database adapter');
|
|
112
|
+
console.warn('[AssetService] Database adapter type:', this.database.constructor.name);
|
|
113
|
+
console.warn('[AssetService] Available methods:', Object.getOwnPropertyNames(Object.getPrototypeOf(this.database)));
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Find multiple assets with filtering
|
|
118
|
+
*/
|
|
119
|
+
async findAssets(organizationId, filters = {}) {
|
|
120
|
+
return await this.database.findAssets(organizationId, filters);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Delete asset (both file and database record)
|
|
124
|
+
*
|
|
125
|
+
* Note: If the asset was stored by a different adapter (e.g., switching from R2 to local),
|
|
126
|
+
* file deletion may fail. The database record will still be removed for a clean state.
|
|
127
|
+
*/
|
|
128
|
+
async deleteAsset(organizationId, id) {
|
|
129
|
+
const asset = await this.database.findAssetById(organizationId, id);
|
|
130
|
+
if (!asset) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
// Try to delete file from storage
|
|
134
|
+
// If the asset was stored by a different adapter, this may fail
|
|
135
|
+
if (asset.storageAdapter === this.storage.name) {
|
|
136
|
+
// Same adapter - delete should work
|
|
137
|
+
try {
|
|
138
|
+
await this.storage.delete(asset.path);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.warn(`Failed to delete file from storage: ${asset.path}`, error);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Different adapter - log warning but continue with database cleanup
|
|
146
|
+
console.warn(`Asset ${id} was stored by '${asset.storageAdapter}' but current adapter is '${this.storage.name}'. ` +
|
|
147
|
+
`File at ${asset.path} may need manual cleanup.`);
|
|
148
|
+
}
|
|
149
|
+
// Always delete database record for clean state
|
|
150
|
+
return await this.database.deleteAsset(organizationId, id);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Update asset metadata
|
|
154
|
+
*/
|
|
155
|
+
async updateAssetMetadata(organizationId, id, metadata) {
|
|
156
|
+
return await this.database.updateAsset(organizationId, id, metadata);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get asset statistics
|
|
160
|
+
*/
|
|
161
|
+
async getAssetStats(organizationId) {
|
|
162
|
+
const [totalAssets, assetsByType, totalSize] = await Promise.all([
|
|
163
|
+
this.database.countAssets(organizationId),
|
|
164
|
+
this.database.countAssetsByType(organizationId),
|
|
165
|
+
this.database.getTotalAssetsSize(organizationId)
|
|
166
|
+
]);
|
|
167
|
+
return {
|
|
168
|
+
totalAssets,
|
|
169
|
+
totalImages: assetsByType.image || 0,
|
|
170
|
+
totalFiles: assetsByType.file || 0,
|
|
171
|
+
totalSize
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get health status of both storage and database
|
|
176
|
+
*/
|
|
177
|
+
async getHealthStatus() {
|
|
178
|
+
const [storageHealthy, databaseHealthy] = await Promise.all([
|
|
179
|
+
this.storage.isHealthy(),
|
|
180
|
+
this.database.isHealthy()
|
|
181
|
+
]);
|
|
182
|
+
return {
|
|
183
|
+
storage: storageHealthy,
|
|
184
|
+
database: databaseHealthy
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/services/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/storage/adapters/index.ts"],"names":[],"mappings":"AACA,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { StorageAdapter, StorageConfig, UploadFileData, StorageFile } from '../interfaces/storage.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pure local file system storage adapter - only handles files
|
|
4
|
+
*/
|
|
5
|
+
export declare class LocalStorageAdapter implements StorageAdapter {
|
|
6
|
+
readonly name = "local";
|
|
7
|
+
private config;
|
|
8
|
+
constructor(config: StorageConfig);
|
|
9
|
+
/**
|
|
10
|
+
* Generate unique filename preserving original name
|
|
11
|
+
*/
|
|
12
|
+
private generateUniqueFilename;
|
|
13
|
+
/**
|
|
14
|
+
* Parse filename into name and extension
|
|
15
|
+
*/
|
|
16
|
+
private parseFilename;
|
|
17
|
+
/**
|
|
18
|
+
* Check if file exists on disk
|
|
19
|
+
*/
|
|
20
|
+
private fileExistsOnDisk;
|
|
21
|
+
/**
|
|
22
|
+
* Store a file and return storage info
|
|
23
|
+
*/
|
|
24
|
+
store(data: UploadFileData): Promise<StorageFile>;
|
|
25
|
+
/**
|
|
26
|
+
* Read a file from storage
|
|
27
|
+
* Used by API endpoint to serve files
|
|
28
|
+
*/
|
|
29
|
+
getObject(path: string): Promise<Buffer>;
|
|
30
|
+
/**
|
|
31
|
+
* Delete a file from storage
|
|
32
|
+
*/
|
|
33
|
+
delete(path: string): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if file exists
|
|
36
|
+
*/
|
|
37
|
+
exists(path: string): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Get public URL for a file path
|
|
40
|
+
*/
|
|
41
|
+
getUrl(path: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Get storage information
|
|
44
|
+
*/
|
|
45
|
+
getStorageInfo(): Promise<{
|
|
46
|
+
totalSize: number;
|
|
47
|
+
availableSpace?: number;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Health check - test if we can write to storage
|
|
51
|
+
*/
|
|
52
|
+
isHealthy(): Promise<boolean>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=local-storage-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-storage-adapter.d.ts","sourceRoot":"","sources":["../../../src/lib/storage/adapters/local-storage-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,MAAM,uBAAuB,CAAC;AAa/B;;GAEG;AACH,qBAAa,mBAAoB,YAAW,cAAc;IACzD,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,MAAM,CAA0B;gBAE5B,MAAM,EAAE,aAAa;IAUjC;;OAEG;YACW,sBAAsB;IAcpC;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;YACW,gBAAgB;IAU9B;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IA2CvD;;;OAGG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK9C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS5C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAM5B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAyB/E;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAYnC"}
|