convex-cms 0.0.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/cli/commands/admin.d.ts +16 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +88 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +18 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/detectConvexUrl.d.ts +13 -0
- package/dist/cli/utils/detectConvexUrl.d.ts.map +1 -0
- package/dist/cli/utils/detectConvexUrl.js +48 -0
- package/dist/cli/utils/detectConvexUrl.js.map +1 -0
- package/dist/cli/utils/openBrowser.d.ts +7 -0
- package/dist/cli/utils/openBrowser.d.ts.map +1 -0
- package/dist/cli/utils/openBrowser.js +17 -0
- package/dist/cli/utils/openBrowser.js.map +1 -0
- package/dist/client/admin-config.d.ts +126 -0
- package/dist/client/admin-config.d.ts.map +1 -0
- package/dist/client/admin-config.js +117 -0
- package/dist/client/admin-config.js.map +1 -0
- package/dist/client/adminApi.d.ts +2273 -0
- package/dist/client/adminApi.d.ts.map +1 -0
- package/dist/client/adminApi.js +716 -0
- package/dist/client/adminApi.js.map +1 -0
- package/dist/client/agentTools.d.ts +933 -0
- package/dist/client/agentTools.d.ts.map +1 -0
- package/dist/client/agentTools.js +1004 -0
- package/dist/client/agentTools.js.map +1 -0
- package/dist/client/argTypes.d.ts +212 -0
- package/dist/client/argTypes.d.ts.map +1 -0
- package/dist/client/argTypes.js +5 -0
- package/dist/client/argTypes.js.map +1 -0
- package/dist/client/field-types.d.ts +55 -0
- package/dist/client/field-types.d.ts.map +1 -0
- package/dist/client/field-types.js +152 -0
- package/dist/client/field-types.js.map +1 -0
- package/dist/client/index.d.ts +189 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +668 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/queryBuilder.d.ts +765 -0
- package/dist/client/queryBuilder.d.ts.map +1 -0
- package/dist/client/queryBuilder.js +970 -0
- package/dist/client/queryBuilder.js.map +1 -0
- package/dist/client/schema/codegen.d.ts +128 -0
- package/dist/client/schema/codegen.d.ts.map +1 -0
- package/dist/client/schema/codegen.js +318 -0
- package/dist/client/schema/codegen.js.map +1 -0
- package/dist/client/schema/defineContentType.d.ts +221 -0
- package/dist/client/schema/defineContentType.d.ts.map +1 -0
- package/dist/client/schema/defineContentType.js +380 -0
- package/dist/client/schema/defineContentType.js.map +1 -0
- package/dist/client/schema/index.d.ts +85 -0
- package/dist/client/schema/index.d.ts.map +1 -0
- package/dist/client/schema/index.js +92 -0
- package/dist/client/schema/index.js.map +1 -0
- package/dist/client/schema/schemaDrift.d.ts +199 -0
- package/dist/client/schema/schemaDrift.d.ts.map +1 -0
- package/dist/client/schema/schemaDrift.js +340 -0
- package/dist/client/schema/schemaDrift.js.map +1 -0
- package/dist/client/schema/typedClient.d.ts +401 -0
- package/dist/client/schema/typedClient.d.ts.map +1 -0
- package/dist/client/schema/typedClient.js +269 -0
- package/dist/client/schema/typedClient.js.map +1 -0
- package/dist/client/schema/types.d.ts +477 -0
- package/dist/client/schema/types.d.ts.map +1 -0
- package/dist/client/schema/types.js +39 -0
- package/dist/client/schema/types.js.map +1 -0
- package/dist/client/types.d.ts +449 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +149 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/workflows.d.ts +51 -0
- package/dist/client/workflows.d.ts.map +1 -0
- package/dist/client/workflows.js +103 -0
- package/dist/client/workflows.js.map +1 -0
- package/dist/client/wrapper.d.ts +2198 -0
- package/dist/client/wrapper.d.ts.map +1 -0
- package/dist/client/wrapper.js +2651 -0
- package/dist/client/wrapper.js.map +1 -0
- package/dist/component/_generated/api.d.ts +124 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +4321 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +121 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +78 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/auditLog.d.ts +410 -0
- package/dist/component/auditLog.d.ts.map +1 -0
- package/dist/component/auditLog.js +607 -0
- package/dist/component/auditLog.js.map +1 -0
- package/dist/component/authorization.d.ts +323 -0
- package/dist/component/authorization.d.ts.map +1 -0
- package/dist/component/authorization.js +464 -0
- package/dist/component/authorization.js.map +1 -0
- package/dist/component/authorizationHooks.d.ts +184 -0
- package/dist/component/authorizationHooks.d.ts.map +1 -0
- package/dist/component/authorizationHooks.js +521 -0
- package/dist/component/authorizationHooks.js.map +1 -0
- package/dist/component/bulkOperations.d.ts +200 -0
- package/dist/component/bulkOperations.d.ts.map +1 -0
- package/dist/component/bulkOperations.js +568 -0
- package/dist/component/bulkOperations.js.map +1 -0
- package/dist/component/contentEntries.d.ts +719 -0
- package/dist/component/contentEntries.d.ts.map +1 -0
- package/dist/component/contentEntries.js +1617 -0
- package/dist/component/contentEntries.js.map +1 -0
- package/dist/component/contentEntryMutations.d.ts +505 -0
- package/dist/component/contentEntryMutations.d.ts.map +1 -0
- package/dist/component/contentEntryMutations.js +1009 -0
- package/dist/component/contentEntryMutations.js.map +1 -0
- package/dist/component/contentEntryValidation.d.ts +115 -0
- package/dist/component/contentEntryValidation.d.ts.map +1 -0
- package/dist/component/contentEntryValidation.js +546 -0
- package/dist/component/contentEntryValidation.js.map +1 -0
- package/dist/component/contentLock.d.ts +328 -0
- package/dist/component/contentLock.d.ts.map +1 -0
- package/dist/component/contentLock.js +471 -0
- package/dist/component/contentLock.js.map +1 -0
- package/dist/component/contentTypeMigration.d.ts +411 -0
- package/dist/component/contentTypeMigration.d.ts.map +1 -0
- package/dist/component/contentTypeMigration.js +805 -0
- package/dist/component/contentTypeMigration.js.map +1 -0
- package/dist/component/contentTypeMutations.d.ts +975 -0
- package/dist/component/contentTypeMutations.d.ts.map +1 -0
- package/dist/component/contentTypeMutations.js +768 -0
- package/dist/component/contentTypeMutations.js.map +1 -0
- package/dist/component/contentTypes.d.ts +538 -0
- package/dist/component/contentTypes.d.ts.map +1 -0
- package/dist/component/contentTypes.js +304 -0
- package/dist/component/contentTypes.js.map +1 -0
- package/dist/component/convex.config.d.ts +42 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +43 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/documentTypes.d.ts +186 -0
- package/dist/component/documentTypes.d.ts.map +1 -0
- package/dist/component/documentTypes.js +23 -0
- package/dist/component/documentTypes.js.map +1 -0
- package/dist/component/eventEmitter.d.ts +281 -0
- package/dist/component/eventEmitter.d.ts.map +1 -0
- package/dist/component/eventEmitter.js +300 -0
- package/dist/component/eventEmitter.js.map +1 -0
- package/dist/component/exportImport.d.ts +1120 -0
- package/dist/component/exportImport.d.ts.map +1 -0
- package/dist/component/exportImport.js +931 -0
- package/dist/component/exportImport.js.map +1 -0
- package/dist/component/index.d.ts +28 -0
- package/dist/component/index.d.ts.map +1 -0
- package/dist/component/index.js +142 -0
- package/dist/component/index.js.map +1 -0
- package/dist/component/lib/deepReferenceResolver.d.ts +252 -0
- package/dist/component/lib/deepReferenceResolver.d.ts.map +1 -0
- package/dist/component/lib/deepReferenceResolver.js +601 -0
- package/dist/component/lib/deepReferenceResolver.js.map +1 -0
- package/dist/component/lib/errors.d.ts +306 -0
- package/dist/component/lib/errors.d.ts.map +1 -0
- package/dist/component/lib/errors.js +407 -0
- package/dist/component/lib/errors.js.map +1 -0
- package/dist/component/lib/index.d.ts +10 -0
- package/dist/component/lib/index.d.ts.map +1 -0
- package/dist/component/lib/index.js +33 -0
- package/dist/component/lib/index.js.map +1 -0
- package/dist/component/lib/mediaReferenceResolver.d.ts +217 -0
- package/dist/component/lib/mediaReferenceResolver.d.ts.map +1 -0
- package/dist/component/lib/mediaReferenceResolver.js +326 -0
- package/dist/component/lib/mediaReferenceResolver.js.map +1 -0
- package/dist/component/lib/metadataExtractor.d.ts +245 -0
- package/dist/component/lib/metadataExtractor.d.ts.map +1 -0
- package/dist/component/lib/metadataExtractor.js +548 -0
- package/dist/component/lib/metadataExtractor.js.map +1 -0
- package/dist/component/lib/mutationAuth.d.ts +95 -0
- package/dist/component/lib/mutationAuth.d.ts.map +1 -0
- package/dist/component/lib/mutationAuth.js +146 -0
- package/dist/component/lib/mutationAuth.js.map +1 -0
- package/dist/component/lib/queries.d.ts +17 -0
- package/dist/component/lib/queries.d.ts.map +1 -0
- package/dist/component/lib/queries.js +49 -0
- package/dist/component/lib/queries.js.map +1 -0
- package/dist/component/lib/ragContentChunker.d.ts +423 -0
- package/dist/component/lib/ragContentChunker.d.ts.map +1 -0
- package/dist/component/lib/ragContentChunker.js +897 -0
- package/dist/component/lib/ragContentChunker.js.map +1 -0
- package/dist/component/lib/referenceResolver.d.ts +175 -0
- package/dist/component/lib/referenceResolver.d.ts.map +1 -0
- package/dist/component/lib/referenceResolver.js +293 -0
- package/dist/component/lib/referenceResolver.js.map +1 -0
- package/dist/component/lib/slugGenerator.d.ts +71 -0
- package/dist/component/lib/slugGenerator.d.ts.map +1 -0
- package/dist/component/lib/slugGenerator.js +207 -0
- package/dist/component/lib/slugGenerator.js.map +1 -0
- package/dist/component/lib/slugUniqueness.d.ts +131 -0
- package/dist/component/lib/slugUniqueness.d.ts.map +1 -0
- package/dist/component/lib/slugUniqueness.js +229 -0
- package/dist/component/lib/slugUniqueness.js.map +1 -0
- package/dist/component/lib/softDelete.d.ts +18 -0
- package/dist/component/lib/softDelete.d.ts.map +1 -0
- package/dist/component/lib/softDelete.js +29 -0
- package/dist/component/lib/softDelete.js.map +1 -0
- package/dist/component/localeFallbackChain.d.ts +410 -0
- package/dist/component/localeFallbackChain.d.ts.map +1 -0
- package/dist/component/localeFallbackChain.js +467 -0
- package/dist/component/localeFallbackChain.js.map +1 -0
- package/dist/component/localeFields.d.ts +508 -0
- package/dist/component/localeFields.d.ts.map +1 -0
- package/dist/component/localeFields.js +592 -0
- package/dist/component/localeFields.js.map +1 -0
- package/dist/component/mediaAssetMutations.d.ts +235 -0
- package/dist/component/mediaAssetMutations.d.ts.map +1 -0
- package/dist/component/mediaAssetMutations.js +558 -0
- package/dist/component/mediaAssetMutations.js.map +1 -0
- package/dist/component/mediaAssets.d.ts +168 -0
- package/dist/component/mediaAssets.d.ts.map +1 -0
- package/dist/component/mediaAssets.js +618 -0
- package/dist/component/mediaAssets.js.map +1 -0
- package/dist/component/mediaFolderMutations.d.ts +642 -0
- package/dist/component/mediaFolderMutations.d.ts.map +1 -0
- package/dist/component/mediaFolderMutations.js +849 -0
- package/dist/component/mediaFolderMutations.js.map +1 -0
- package/dist/component/mediaUploadMutations.d.ts +136 -0
- package/dist/component/mediaUploadMutations.d.ts.map +1 -0
- package/dist/component/mediaUploadMutations.js +205 -0
- package/dist/component/mediaUploadMutations.js.map +1 -0
- package/dist/component/mediaVariantMutations.d.ts +468 -0
- package/dist/component/mediaVariantMutations.d.ts.map +1 -0
- package/dist/component/mediaVariantMutations.js +737 -0
- package/dist/component/mediaVariantMutations.js.map +1 -0
- package/dist/component/mediaVariants.d.ts +525 -0
- package/dist/component/mediaVariants.d.ts.map +1 -0
- package/dist/component/mediaVariants.js +661 -0
- package/dist/component/mediaVariants.js.map +1 -0
- package/dist/component/ragContentIndexer.d.ts +595 -0
- package/dist/component/ragContentIndexer.d.ts.map +1 -0
- package/dist/component/ragContentIndexer.js +794 -0
- package/dist/component/ragContentIndexer.js.map +1 -0
- package/dist/component/rateLimitHooks.d.ts +266 -0
- package/dist/component/rateLimitHooks.d.ts.map +1 -0
- package/dist/component/rateLimitHooks.js +412 -0
- package/dist/component/rateLimitHooks.js.map +1 -0
- package/dist/component/roles.d.ts +649 -0
- package/dist/component/roles.d.ts.map +1 -0
- package/dist/component/roles.js +884 -0
- package/dist/component/roles.js.map +1 -0
- package/dist/component/scheduledPublish.d.ts +182 -0
- package/dist/component/scheduledPublish.d.ts.map +1 -0
- package/dist/component/scheduledPublish.js +304 -0
- package/dist/component/scheduledPublish.js.map +1 -0
- package/dist/component/schema.d.ts +4114 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +469 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/component/taxonomies.d.ts +476 -0
- package/dist/component/taxonomies.d.ts.map +1 -0
- package/dist/component/taxonomies.js +785 -0
- package/dist/component/taxonomies.js.map +1 -0
- package/dist/component/taxonomyMutations.d.ts +206 -0
- package/dist/component/taxonomyMutations.d.ts.map +1 -0
- package/dist/component/taxonomyMutations.js +1001 -0
- package/dist/component/taxonomyMutations.js.map +1 -0
- package/dist/component/trash.d.ts +265 -0
- package/dist/component/trash.d.ts.map +1 -0
- package/dist/component/trash.js +621 -0
- package/dist/component/trash.js.map +1 -0
- package/dist/component/types.d.ts +4 -0
- package/dist/component/types.d.ts.map +1 -0
- package/dist/component/types.js +2 -0
- package/dist/component/types.js.map +1 -0
- package/dist/component/userContext.d.ts +508 -0
- package/dist/component/userContext.d.ts.map +1 -0
- package/dist/component/userContext.js +615 -0
- package/dist/component/userContext.js.map +1 -0
- package/dist/component/validation.d.ts +387 -0
- package/dist/component/validation.d.ts.map +1 -0
- package/dist/component/validation.js +1052 -0
- package/dist/component/validation.js.map +1 -0
- package/dist/component/validators.d.ts +4645 -0
- package/dist/component/validators.d.ts.map +1 -0
- package/dist/component/validators.js +641 -0
- package/dist/component/validators.js.map +1 -0
- package/dist/component/versionMutations.d.ts +216 -0
- package/dist/component/versionMutations.d.ts.map +1 -0
- package/dist/component/versionMutations.js +321 -0
- package/dist/component/versionMutations.js.map +1 -0
- package/dist/component/webhookTrigger.d.ts +770 -0
- package/dist/component/webhookTrigger.d.ts.map +1 -0
- package/dist/component/webhookTrigger.js +1413 -0
- package/dist/component/webhookTrigger.js.map +1 -0
- package/dist/react/index.d.ts +316 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +558 -0
- package/dist/react/index.js.map +1 -0
- package/dist/test.d.ts +2230 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +1107 -0
- package/dist/test.js.map +1 -0
- package/package.json +95 -0
- package/src/cli/commands/admin.ts +104 -0
- package/src/cli/index.ts +21 -0
- package/src/cli/utils/detectConvexUrl.ts +54 -0
- package/src/cli/utils/openBrowser.ts +16 -0
- package/src/client/admin-config.ts +138 -0
- package/src/client/adminApi.ts +942 -0
- package/src/client/agentTools.ts +1311 -0
- package/src/client/argTypes.ts +316 -0
- package/src/client/field-types.ts +187 -0
- package/src/client/index.ts +1301 -0
- package/src/client/queryBuilder.ts +1100 -0
- package/src/client/schema/codegen.ts +500 -0
- package/src/client/schema/defineContentType.ts +501 -0
- package/src/client/schema/index.ts +169 -0
- package/src/client/schema/schemaDrift.ts +574 -0
- package/src/client/schema/typedClient.ts +688 -0
- package/src/client/schema/types.ts +666 -0
- package/src/client/types.ts +723 -0
- package/src/client/workflows.ts +141 -0
- package/src/client/wrapper.ts +4304 -0
- package/src/component/_generated/api.ts +140 -0
- package/src/component/_generated/component.ts +5029 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +156 -0
- package/src/component/authorization.ts +647 -0
- package/src/component/authorizationHooks.ts +668 -0
- package/src/component/bulkOperations.ts +687 -0
- package/src/component/contentEntries.ts +1976 -0
- package/src/component/contentEntryMutations.ts +1223 -0
- package/src/component/contentEntryValidation.ts +707 -0
- package/src/component/contentLock.ts +550 -0
- package/src/component/contentTypeMigration.ts +1064 -0
- package/src/component/contentTypeMutations.ts +969 -0
- package/src/component/contentTypes.ts +346 -0
- package/src/component/convex.config.ts +44 -0
- package/src/component/documentTypes.ts +240 -0
- package/src/component/eventEmitter.ts +485 -0
- package/src/component/exportImport.ts +1169 -0
- package/src/component/index.ts +491 -0
- package/src/component/lib/deepReferenceResolver.ts +999 -0
- package/src/component/lib/errors.ts +816 -0
- package/src/component/lib/index.ts +145 -0
- package/src/component/lib/mediaReferenceResolver.ts +495 -0
- package/src/component/lib/metadataExtractor.ts +792 -0
- package/src/component/lib/mutationAuth.ts +199 -0
- package/src/component/lib/queries.ts +79 -0
- package/src/component/lib/ragContentChunker.ts +1371 -0
- package/src/component/lib/referenceResolver.ts +430 -0
- package/src/component/lib/slugGenerator.ts +262 -0
- package/src/component/lib/slugUniqueness.ts +333 -0
- package/src/component/lib/softDelete.ts +44 -0
- package/src/component/localeFallbackChain.ts +673 -0
- package/src/component/localeFields.ts +896 -0
- package/src/component/mediaAssetMutations.ts +725 -0
- package/src/component/mediaAssets.ts +932 -0
- package/src/component/mediaFolderMutations.ts +1046 -0
- package/src/component/mediaUploadMutations.ts +224 -0
- package/src/component/mediaVariantMutations.ts +900 -0
- package/src/component/mediaVariants.ts +793 -0
- package/src/component/ragContentIndexer.ts +1067 -0
- package/src/component/rateLimitHooks.ts +572 -0
- package/src/component/roles.ts +1360 -0
- package/src/component/scheduledPublish.ts +358 -0
- package/src/component/schema.ts +617 -0
- package/src/component/taxonomies.ts +949 -0
- package/src/component/taxonomyMutations.ts +1210 -0
- package/src/component/trash.ts +724 -0
- package/src/component/userContext.ts +898 -0
- package/src/component/validation.ts +1388 -0
- package/src/component/validators.ts +949 -0
- package/src/component/versionMutations.ts +392 -0
- package/src/component/webhookTrigger.ts +1922 -0
- package/src/react/index.ts +898 -0
- package/src/test.ts +1580 -0
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media Asset Query Functions
|
|
3
|
+
*
|
|
4
|
+
* Provides query functions for retrieving media assets from the CMS.
|
|
5
|
+
* Media assets are file records that reference Convex's built-in file storage,
|
|
6
|
+
* along with metadata like dimensions, MIME type, and organization tags.
|
|
7
|
+
*/
|
|
8
|
+
import { v } from "convex/values";
|
|
9
|
+
import { isDeleted } from "./lib/softDelete.js";
|
|
10
|
+
import { stream } from "convex-helpers/server/stream";
|
|
11
|
+
import { query } from "./_generated/server.js";
|
|
12
|
+
import {
|
|
13
|
+
// mediaItemDoc,
|
|
14
|
+
listMediaAssetsArgs, paginationResultValidator, } from "./validators.js";
|
|
15
|
+
import schema, { mediaAssetItemValidator } from "./schema.js";
|
|
16
|
+
/**
|
|
17
|
+
* Return type for the get query.
|
|
18
|
+
* Extends the base media asset document with the resolved storage URL
|
|
19
|
+
* and optimization hints for efficient asset delivery.
|
|
20
|
+
*/
|
|
21
|
+
const mediaAssetWithUrlDoc = v.object({
|
|
22
|
+
...mediaAssetItemValidator.fields,
|
|
23
|
+
_id: v.id("mediaItems"),
|
|
24
|
+
_creationTime: v.number(),
|
|
25
|
+
/** The resolved public URL for accessing the asset file */
|
|
26
|
+
url: v.union(v.string(), v.null()),
|
|
27
|
+
/**
|
|
28
|
+
* Optimization hints for efficient asset usage.
|
|
29
|
+
* Includes dimensions for images, duration for audio/video,
|
|
30
|
+
* and recommended transformations based on asset type.
|
|
31
|
+
*/
|
|
32
|
+
optimizationHints: v.object({
|
|
33
|
+
/** Whether the asset is an image that can be resized */
|
|
34
|
+
isResizable: v.boolean(),
|
|
35
|
+
/** Suggested aspect ratio for maintaining proportions (width / height) */
|
|
36
|
+
aspectRatio: v.optional(v.number()),
|
|
37
|
+
/** Whether the asset supports transparent backgrounds (PNG, WebP, GIF) */
|
|
38
|
+
hasTransparency: v.optional(v.boolean()),
|
|
39
|
+
/** Whether the asset is a vector format (SVG) that scales without loss */
|
|
40
|
+
isVector: v.optional(v.boolean()),
|
|
41
|
+
/** Suggested max display width based on original dimensions */
|
|
42
|
+
suggestedMaxWidth: v.optional(v.number()),
|
|
43
|
+
/** For video/audio: total duration in seconds */
|
|
44
|
+
durationSeconds: v.optional(v.number()),
|
|
45
|
+
}),
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Arguments for retrieving a single media asset.
|
|
49
|
+
*/
|
|
50
|
+
const getMediaAssetArgs = v.object({
|
|
51
|
+
/** The ID of the media asset to retrieve */
|
|
52
|
+
id: v.id("mediaItems"),
|
|
53
|
+
/** Whether to include soft-deleted assets (default: false) */
|
|
54
|
+
includeDeleted: v.optional(v.boolean()),
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* Query to retrieve a single media asset by ID.
|
|
58
|
+
*
|
|
59
|
+
* Returns the asset metadata along with a resolved storage URL and
|
|
60
|
+
* optimization hints for efficient frontend rendering.
|
|
61
|
+
*
|
|
62
|
+
* @param id - The media asset ID to retrieve
|
|
63
|
+
* @param includeDeleted - Whether to include soft-deleted assets (default: false)
|
|
64
|
+
* @returns The media asset document with URL and optimization hints, or null if not found
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* // Basic usage - get asset by ID
|
|
69
|
+
* const asset = await ctx.runQuery(api.mediaAssets.get, {
|
|
70
|
+
* id: assetId,
|
|
71
|
+
* });
|
|
72
|
+
*
|
|
73
|
+
* if (asset) {
|
|
74
|
+
* console.log("Asset URL:", asset.url);
|
|
75
|
+
* console.log("Dimensions:", asset.width, "x", asset.height);
|
|
76
|
+
*
|
|
77
|
+
* // Use optimization hints for responsive images
|
|
78
|
+
* if (asset.optimizationHints.isResizable) {
|
|
79
|
+
* console.log("Aspect ratio:", asset.optimizationHints.aspectRatio);
|
|
80
|
+
* console.log("Max width:", asset.optimizationHints.suggestedMaxWidth);
|
|
81
|
+
* }
|
|
82
|
+
* }
|
|
83
|
+
*
|
|
84
|
+
* // Including deleted assets (for admin recovery UI)
|
|
85
|
+
* const deletedAsset = await ctx.runQuery(api.mediaAssets.get, {
|
|
86
|
+
* id: assetId,
|
|
87
|
+
* includeDeleted: true,
|
|
88
|
+
* });
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export const get = query({
|
|
92
|
+
args: getMediaAssetArgs.fields,
|
|
93
|
+
returns: v.union(mediaAssetWithUrlDoc, v.null()),
|
|
94
|
+
handler: async (ctx, args) => {
|
|
95
|
+
const { id, includeDeleted = false } = args;
|
|
96
|
+
const item = await ctx.db.get(id);
|
|
97
|
+
// Return null if item doesn't exist or is not an asset
|
|
98
|
+
if (!item || item.kind !== "asset") {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
// Filter out soft-deleted assets unless explicitly requested
|
|
102
|
+
// This respects the soft delete pattern used throughout the CMS
|
|
103
|
+
if (!includeDeleted && isDeleted(item)) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
// Resolve the storage URL from Convex file storage
|
|
107
|
+
// This generates a public URL that can be used directly in img/video tags
|
|
108
|
+
const url = await ctx.storage.getUrl(item.storageId);
|
|
109
|
+
// Build optimization hints based on asset type and metadata
|
|
110
|
+
const optimizationHints = buildOptimizationHints(item);
|
|
111
|
+
return {
|
|
112
|
+
...item,
|
|
113
|
+
url,
|
|
114
|
+
optimizationHints,
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
/**
|
|
119
|
+
* MIME types that support transparency.
|
|
120
|
+
*/
|
|
121
|
+
const TRANSPARENT_MIME_TYPES = [
|
|
122
|
+
"image/png",
|
|
123
|
+
"image/webp",
|
|
124
|
+
"image/gif",
|
|
125
|
+
"image/avif",
|
|
126
|
+
];
|
|
127
|
+
/**
|
|
128
|
+
* MIME types that are vector formats.
|
|
129
|
+
*/
|
|
130
|
+
const VECTOR_MIME_TYPES = ["image/svg+xml"];
|
|
131
|
+
/**
|
|
132
|
+
* MIME types that can be resized (raster images).
|
|
133
|
+
*/
|
|
134
|
+
const RESIZABLE_MIME_TYPES = [
|
|
135
|
+
"image/jpeg",
|
|
136
|
+
"image/jpg",
|
|
137
|
+
"image/png",
|
|
138
|
+
"image/webp",
|
|
139
|
+
"image/avif",
|
|
140
|
+
"image/gif",
|
|
141
|
+
];
|
|
142
|
+
/**
|
|
143
|
+
* Builds optimization hints based on the asset's type and metadata.
|
|
144
|
+
*
|
|
145
|
+
* These hints help frontends make intelligent decisions about:
|
|
146
|
+
* - Image sizing and responsive layouts
|
|
147
|
+
* - Placeholder dimensions
|
|
148
|
+
* - Format support (transparency, vectors)
|
|
149
|
+
* - Media playback (duration)
|
|
150
|
+
*/
|
|
151
|
+
function buildOptimizationHints(asset) {
|
|
152
|
+
const hints = {
|
|
153
|
+
isResizable: false,
|
|
154
|
+
};
|
|
155
|
+
// Check if the asset is a resizable raster image
|
|
156
|
+
if (RESIZABLE_MIME_TYPES.includes(asset.mimeType)) {
|
|
157
|
+
hints.isResizable = true;
|
|
158
|
+
}
|
|
159
|
+
// Check for transparency support
|
|
160
|
+
if (TRANSPARENT_MIME_TYPES.includes(asset.mimeType)) {
|
|
161
|
+
hints.hasTransparency = true;
|
|
162
|
+
}
|
|
163
|
+
// Check for vector format
|
|
164
|
+
if (VECTOR_MIME_TYPES.includes(asset.mimeType)) {
|
|
165
|
+
hints.isVector = true;
|
|
166
|
+
// Vectors are infinitely resizable but in a different way
|
|
167
|
+
hints.isResizable = false;
|
|
168
|
+
}
|
|
169
|
+
// Calculate aspect ratio if dimensions are available
|
|
170
|
+
if (asset.width && asset.height && asset.height > 0) {
|
|
171
|
+
hints.aspectRatio = Math.round((asset.width / asset.height) * 1000) / 1000;
|
|
172
|
+
hints.suggestedMaxWidth = asset.width;
|
|
173
|
+
}
|
|
174
|
+
// Include duration for video/audio assets
|
|
175
|
+
if (asset.duration !== undefined && asset.duration > 0) {
|
|
176
|
+
hints.durationSeconds = asset.duration;
|
|
177
|
+
}
|
|
178
|
+
return hints;
|
|
179
|
+
}
|
|
180
|
+
// =============================================================================
|
|
181
|
+
// List Media Assets Query
|
|
182
|
+
// =============================================================================
|
|
183
|
+
/**
|
|
184
|
+
* Default page size for media assets list queries.
|
|
185
|
+
*/
|
|
186
|
+
const DEFAULT_NUM_ITEMS = 50;
|
|
187
|
+
/**
|
|
188
|
+
* Maximum page size for media assets list queries.
|
|
189
|
+
*/
|
|
190
|
+
const MAX_NUM_ITEMS = 250;
|
|
191
|
+
/**
|
|
192
|
+
* Paginated response type for media assets list.
|
|
193
|
+
* Reuses the mediaAssetWithUrlDoc defined above.
|
|
194
|
+
*/
|
|
195
|
+
const paginatedMediaAssetsResponse = paginationResultValidator(mediaAssetWithUrlDoc);
|
|
196
|
+
/**
|
|
197
|
+
* Query to list media assets with optional folder filter and pagination.
|
|
198
|
+
*
|
|
199
|
+
* Supports filtering by:
|
|
200
|
+
* - Folder: Filter to assets in a specific folder or root level
|
|
201
|
+
* - MIME type: Exact match or prefix match (e.g., "image/")
|
|
202
|
+
* - Media type: Category filter (image, video, audio, document, other)
|
|
203
|
+
* - Tags: Assets must contain ALL specified tags
|
|
204
|
+
* - Search: Full-text search on filename, title, description
|
|
205
|
+
*
|
|
206
|
+
* Supports sorting by:
|
|
207
|
+
* - _creationTime (default, descending)
|
|
208
|
+
* - filename
|
|
209
|
+
* - size
|
|
210
|
+
* - type
|
|
211
|
+
* - mimeType
|
|
212
|
+
*
|
|
213
|
+
* @param folderId - Filter to assets in this folder (optional)
|
|
214
|
+
* @param includeRootLevel - Include assets without a folder (default: false with folderId, true without)
|
|
215
|
+
* @param type - Filter by media type category
|
|
216
|
+
* @param mimeType - Filter by exact MIME type
|
|
217
|
+
* @param mimeTypePrefix - Filter by MIME type prefix (e.g., "image/")
|
|
218
|
+
* @param search - Full-text search term
|
|
219
|
+
* @param tags - Filter by tags (must match ALL)
|
|
220
|
+
* @param includeDeleted - Include soft-deleted assets (default: false)
|
|
221
|
+
* @param sortField - Field to sort by (default: "_creationTime")
|
|
222
|
+
* @param sortDirection - Sort direction (default: "desc")
|
|
223
|
+
* @param paginationOpts - Pagination options with numItems and cursor
|
|
224
|
+
* @returns Paginated list of media assets with URLs and optimization hints
|
|
225
|
+
*
|
|
226
|
+
* @example
|
|
227
|
+
* ```typescript
|
|
228
|
+
* // List all images in a specific folder
|
|
229
|
+
* const result = await ctx.runQuery(api.mediaAssets.list, {
|
|
230
|
+
* folderId: folderId,
|
|
231
|
+
* type: "image",
|
|
232
|
+
* paginationOpts: { numItems: 20 }
|
|
233
|
+
* });
|
|
234
|
+
*
|
|
235
|
+
* // Search for assets by name
|
|
236
|
+
* const searchResult = await ctx.runQuery(api.mediaAssets.list, {
|
|
237
|
+
* search: "hero banner",
|
|
238
|
+
* mimeTypePrefix: "image/",
|
|
239
|
+
* paginationOpts: { numItems: 10 }
|
|
240
|
+
* });
|
|
241
|
+
*
|
|
242
|
+
* // List all PDFs sorted by size
|
|
243
|
+
* const pdfs = await ctx.runQuery(api.mediaAssets.list, {
|
|
244
|
+
* mimeType: "application/pdf",
|
|
245
|
+
* sortField: "size",
|
|
246
|
+
* sortDirection: "desc",
|
|
247
|
+
* paginationOpts: { numItems: 50 }
|
|
248
|
+
* });
|
|
249
|
+
*
|
|
250
|
+
* // Paginate through results
|
|
251
|
+
* const nextPage = await ctx.runQuery(api.mediaAssets.list, {
|
|
252
|
+
* paginationOpts: {
|
|
253
|
+
* numItems: 20,
|
|
254
|
+
* cursor: result.continueCursor
|
|
255
|
+
* }
|
|
256
|
+
* });
|
|
257
|
+
* ```
|
|
258
|
+
*/
|
|
259
|
+
export const list = query({
|
|
260
|
+
args: listMediaAssetsArgs.fields,
|
|
261
|
+
returns: paginatedMediaAssetsResponse,
|
|
262
|
+
handler: async (ctx, args) => {
|
|
263
|
+
const { folderId, includeRootLevel, type, mimeType, mimeTypePrefix, search, tags, includeDeleted = false, deletedOnly = false, sortField = "_creationTime", sortDirection = "desc", paginationOpts, } = args;
|
|
264
|
+
// Map folderId to parentId for the unified mediaItems table
|
|
265
|
+
const parentId = folderId;
|
|
266
|
+
// Clamp numItems to valid range
|
|
267
|
+
const numItems = Math.min(Math.max(1, paginationOpts.numItems ?? DEFAULT_NUM_ITEMS), MAX_NUM_ITEMS);
|
|
268
|
+
const clampedPaginationOpts = {
|
|
269
|
+
...paginationOpts,
|
|
270
|
+
numItems,
|
|
271
|
+
};
|
|
272
|
+
const sortOptions = {
|
|
273
|
+
sortField,
|
|
274
|
+
sortDirection,
|
|
275
|
+
};
|
|
276
|
+
// Handle full-text search queries
|
|
277
|
+
if (search && search.trim().length > 0) {
|
|
278
|
+
return handleSearchQuery(ctx, {
|
|
279
|
+
search: search.trim(),
|
|
280
|
+
parentId,
|
|
281
|
+
includeRootLevel,
|
|
282
|
+
type,
|
|
283
|
+
mimeType,
|
|
284
|
+
mimeTypePrefix,
|
|
285
|
+
tags,
|
|
286
|
+
includeDeleted,
|
|
287
|
+
deletedOnly,
|
|
288
|
+
sortOptions,
|
|
289
|
+
paginationOpts: clampedPaginationOpts,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
// Handle standard index-based queries
|
|
293
|
+
return handleIndexQuery(ctx, {
|
|
294
|
+
parentId,
|
|
295
|
+
includeRootLevel,
|
|
296
|
+
type,
|
|
297
|
+
mimeType,
|
|
298
|
+
mimeTypePrefix,
|
|
299
|
+
tags,
|
|
300
|
+
includeDeleted,
|
|
301
|
+
deletedOnly,
|
|
302
|
+
sortOptions,
|
|
303
|
+
paginationOpts: clampedPaginationOpts,
|
|
304
|
+
});
|
|
305
|
+
},
|
|
306
|
+
});
|
|
307
|
+
/**
|
|
308
|
+
* Get a sortable value from an asset based on the sort field.
|
|
309
|
+
*/
|
|
310
|
+
function getSortValue(asset, sortField) {
|
|
311
|
+
return asset[sortField];
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Compare two values for sorting.
|
|
315
|
+
* Handles null/undefined by pushing them to the end.
|
|
316
|
+
*/
|
|
317
|
+
function compareValues(a, b, direction) {
|
|
318
|
+
// Handle null/undefined - push them to the end
|
|
319
|
+
if (a === null || a === undefined) {
|
|
320
|
+
return direction === "asc" ? 1 : -1;
|
|
321
|
+
}
|
|
322
|
+
if (b === null || b === undefined) {
|
|
323
|
+
return direction === "asc" ? -1 : 1;
|
|
324
|
+
}
|
|
325
|
+
// Compare numbers
|
|
326
|
+
if (typeof a === "number" && typeof b === "number") {
|
|
327
|
+
return direction === "asc" ? a - b : b - a;
|
|
328
|
+
}
|
|
329
|
+
// Compare strings (case-insensitive)
|
|
330
|
+
if (typeof a === "string" && typeof b === "string") {
|
|
331
|
+
const comparison = a.toLowerCase().localeCompare(b.toLowerCase());
|
|
332
|
+
return direction === "asc" ? comparison : -comparison;
|
|
333
|
+
}
|
|
334
|
+
// Fallback: convert to string and compare
|
|
335
|
+
const aStr = String(a);
|
|
336
|
+
const bStr = String(b);
|
|
337
|
+
const comparison = aStr.localeCompare(bStr);
|
|
338
|
+
return direction === "asc" ? comparison : -comparison;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Sort an array of assets by the specified sort options.
|
|
342
|
+
*/
|
|
343
|
+
function sortAssets(assets, sortOptions) {
|
|
344
|
+
return [...assets].sort((a, b) => {
|
|
345
|
+
const aValue = getSortValue(a, sortOptions.sortField);
|
|
346
|
+
const bValue = getSortValue(b, sortOptions.sortField);
|
|
347
|
+
return compareValues(aValue, bValue, sortOptions.sortDirection);
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Check if an asset matches the MIME type filter criteria.
|
|
352
|
+
*/
|
|
353
|
+
function matchesMimeType(asset, mimeType, mimeTypePrefix) {
|
|
354
|
+
if (mimeType && asset.mimeType !== mimeType) {
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
if (mimeTypePrefix && !asset.mimeType.startsWith(mimeTypePrefix)) {
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
return true;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Check if an asset has all the specified tags.
|
|
364
|
+
*/
|
|
365
|
+
function matchesTags(asset, requiredTags) {
|
|
366
|
+
if (!requiredTags || requiredTags.length === 0) {
|
|
367
|
+
return true;
|
|
368
|
+
}
|
|
369
|
+
if (!asset.tags || asset.tags.length === 0) {
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
return requiredTags.every((tag) => asset.tags.includes(tag));
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Enrich an asset with URL and optimization hints.
|
|
376
|
+
*/
|
|
377
|
+
async function enrichAsset(ctx, asset) {
|
|
378
|
+
const url = await ctx.storage.getUrl(asset.storageId);
|
|
379
|
+
const optimizationHints = buildOptimizationHints(asset);
|
|
380
|
+
return {
|
|
381
|
+
...asset,
|
|
382
|
+
url,
|
|
383
|
+
optimizationHints,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Internal helper to handle full-text search queries.
|
|
388
|
+
* Uses the search_assets search index for efficient text matching.
|
|
389
|
+
*/
|
|
390
|
+
async function handleSearchQuery(ctx, args) {
|
|
391
|
+
const { search, parentId, includeRootLevel, type, mimeType, mimeTypePrefix, tags, includeDeleted, deletedOnly, sortOptions, paginationOpts, } = args;
|
|
392
|
+
const { numItems, cursor } = paginationOpts;
|
|
393
|
+
// Build search query with filter fields available in the index
|
|
394
|
+
// The search_media index supports filtering by kind, type, and parentId
|
|
395
|
+
const searchQuery = ctx.db
|
|
396
|
+
.query("mediaItems")
|
|
397
|
+
.withSearchIndex("search_media", (q) => {
|
|
398
|
+
let query = q.search("searchText", search);
|
|
399
|
+
// Always filter for assets only
|
|
400
|
+
query = query.eq("kind", "asset");
|
|
401
|
+
// Apply filter fields available in the search index
|
|
402
|
+
if (type) {
|
|
403
|
+
query = query.eq("type", type);
|
|
404
|
+
}
|
|
405
|
+
if (parentId) {
|
|
406
|
+
query = query.eq("parentId", parentId);
|
|
407
|
+
}
|
|
408
|
+
return query;
|
|
409
|
+
});
|
|
410
|
+
// Fetch more results for post-filtering
|
|
411
|
+
const hasMimeFilter = mimeType || mimeTypePrefix;
|
|
412
|
+
const hasTagFilter = tags && tags.length > 0;
|
|
413
|
+
const fetchMultiplier = !includeDeleted || hasMimeFilter || hasTagFilter ? 4 : 1;
|
|
414
|
+
const results = await searchQuery.take((numItems + 1) * fetchMultiplier);
|
|
415
|
+
// Apply post-processing filters
|
|
416
|
+
let filteredResults = results;
|
|
417
|
+
// Filter by soft-delete status
|
|
418
|
+
if (deletedOnly) {
|
|
419
|
+
// Only show deleted items
|
|
420
|
+
filteredResults = filteredResults.filter((asset) => isDeleted(asset));
|
|
421
|
+
}
|
|
422
|
+
else if (!includeDeleted) {
|
|
423
|
+
// Exclude deleted items
|
|
424
|
+
filteredResults = filteredResults.filter((asset) => !isDeleted(asset));
|
|
425
|
+
}
|
|
426
|
+
// Filter by folder (for root level handling)
|
|
427
|
+
if (parentId && includeRootLevel) {
|
|
428
|
+
// Show both folder assets and root-level assets
|
|
429
|
+
filteredResults = filteredResults.filter((asset) => asset.parentId === parentId || asset.parentId === undefined);
|
|
430
|
+
}
|
|
431
|
+
else if (!parentId && includeRootLevel === false) {
|
|
432
|
+
// Explicitly exclude root-level assets when not filtering by folder
|
|
433
|
+
filteredResults = filteredResults.filter((asset) => asset.parentId !== undefined);
|
|
434
|
+
}
|
|
435
|
+
// Default (no parentId, includeRootLevel undefined/true): show all assets
|
|
436
|
+
// Filter by MIME type
|
|
437
|
+
if (hasMimeFilter) {
|
|
438
|
+
filteredResults = filteredResults.filter((asset) => matchesMimeType(asset, mimeType, mimeTypePrefix));
|
|
439
|
+
}
|
|
440
|
+
// Filter by tags
|
|
441
|
+
if (hasTagFilter) {
|
|
442
|
+
filteredResults = filteredResults.filter((asset) => matchesTags(asset, tags));
|
|
443
|
+
}
|
|
444
|
+
// Apply sorting
|
|
445
|
+
const sortedResults = sortAssets(filteredResults, sortOptions);
|
|
446
|
+
// Handle cursor-based pagination
|
|
447
|
+
let startIndex = 0;
|
|
448
|
+
if (cursor) {
|
|
449
|
+
const cursorIndex = sortedResults.findIndex((asset) => asset._id === cursor);
|
|
450
|
+
if (cursorIndex !== -1) {
|
|
451
|
+
startIndex = cursorIndex + 1;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// Get the page of results
|
|
455
|
+
const pageResults = sortedResults.slice(startIndex, startIndex + numItems + 1);
|
|
456
|
+
const isDone = pageResults.length <= numItems;
|
|
457
|
+
const page = isDone ? pageResults : pageResults.slice(0, numItems);
|
|
458
|
+
// Enrich assets with URLs and optimization hints
|
|
459
|
+
const enrichedPage = await Promise.all(page.map((asset) => enrichAsset(ctx, asset)));
|
|
460
|
+
// Get continuation cursor
|
|
461
|
+
const continueCursor = !isDone && page.length > 0 ? page[page.length - 1]._id : null;
|
|
462
|
+
return {
|
|
463
|
+
page: enrichedPage,
|
|
464
|
+
continueCursor,
|
|
465
|
+
isDone,
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Internal helper to handle index-based queries using convex-helpers stream.
|
|
470
|
+
* Selects the optimal index based on provided filters.
|
|
471
|
+
*/
|
|
472
|
+
async function handleIndexQuery(ctx, args) {
|
|
473
|
+
const { parentId, includeRootLevel, type, mimeType, mimeTypePrefix, tags, includeDeleted, deletedOnly, sortOptions, paginationOpts, } = args;
|
|
474
|
+
const { numItems, cursor } = paginationOpts;
|
|
475
|
+
// Determine if we need in-memory sorting
|
|
476
|
+
const needsCustomSort = sortOptions.sortField !== "_creationTime";
|
|
477
|
+
// Check for post-processing filters
|
|
478
|
+
const hasMimeFilter = mimeType || mimeTypePrefix;
|
|
479
|
+
const hasTagFilter = tags && tags.length > 0;
|
|
480
|
+
const hasFolderLogic = parentId || includeRootLevel !== undefined;
|
|
481
|
+
const hasTypeFilter = !!type;
|
|
482
|
+
const needsPostFiltering = !includeDeleted || hasMimeFilter || hasTagFilter || hasTypeFilter;
|
|
483
|
+
// Create the stream-based query
|
|
484
|
+
const streamDb = stream(ctx.db, schema);
|
|
485
|
+
// Select the best index based on filters
|
|
486
|
+
// Always need to filter for kind: "asset"
|
|
487
|
+
// Note: `type` filtering is now done post-query since type is derived from mimeType
|
|
488
|
+
let baseQuery;
|
|
489
|
+
if (deletedOnly) {
|
|
490
|
+
// Use by_deleted index to efficiently query only deleted items
|
|
491
|
+
// q.gte("deletedAt", null) matches all items where deletedAt has a timestamp value
|
|
492
|
+
// In Convex type ordering: undefined < null < numbers, so gte(null) gets all timestamps
|
|
493
|
+
baseQuery = streamDb
|
|
494
|
+
.query("mediaItems")
|
|
495
|
+
.withIndex("by_deleted", (q) => q.gte("deletedAt", null));
|
|
496
|
+
}
|
|
497
|
+
else if (mimeType) {
|
|
498
|
+
// Use by_mime_type index for exact MIME type match (assets only)
|
|
499
|
+
baseQuery = streamDb
|
|
500
|
+
.query("mediaItems")
|
|
501
|
+
.withIndex("by_mime_type", (q) => q.eq("mimeType", mimeType));
|
|
502
|
+
}
|
|
503
|
+
else if (parentId) {
|
|
504
|
+
// Use by_kind_and_parent index when filtering by folder
|
|
505
|
+
baseQuery = streamDb
|
|
506
|
+
.query("mediaItems")
|
|
507
|
+
.withIndex("by_kind_and_parent", (q) => q.eq("kind", "asset").eq("parentId", parentId));
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
// Default: use by_kind index to get only assets
|
|
511
|
+
baseQuery = streamDb
|
|
512
|
+
.query("mediaItems")
|
|
513
|
+
.withIndex("by_kind", (q) => q.eq("kind", "asset"));
|
|
514
|
+
}
|
|
515
|
+
// Apply order for index-based sorting
|
|
516
|
+
const order = sortOptions.sortDirection;
|
|
517
|
+
const orderedQuery = baseQuery.order(order);
|
|
518
|
+
// Apply filterWith for post-processing filters
|
|
519
|
+
const filteredQuery = orderedQuery.filterWith(async (item) => {
|
|
520
|
+
// Ensure this is an asset (required since by_deleted index doesn't filter by kind)
|
|
521
|
+
if (item.kind !== "asset") {
|
|
522
|
+
return false;
|
|
523
|
+
}
|
|
524
|
+
// Filter by soft-delete status
|
|
525
|
+
// When deletedOnly is true, we're using the by_deleted index which already
|
|
526
|
+
// filters to only items with deletedAt defined - no additional check needed
|
|
527
|
+
if (!deletedOnly && !includeDeleted && isDeleted(item)) {
|
|
528
|
+
// Exclude deleted items unless includeDeleted is true or deletedOnly is true
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
531
|
+
// Filter by folder logic (when not already using folder index)
|
|
532
|
+
if (!parentId && hasFolderLogic) {
|
|
533
|
+
if (includeRootLevel === true && item.parentId !== undefined) {
|
|
534
|
+
return false; // Only show root-level assets
|
|
535
|
+
}
|
|
536
|
+
if (includeRootLevel === false && item.parentId === undefined) {
|
|
537
|
+
return false; // Exclude root-level assets
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
// Filter by MIME type (when not already using mimeType index)
|
|
541
|
+
if (hasMimeFilter && !mimeType) {
|
|
542
|
+
if (!matchesMimeType(item, undefined, mimeTypePrefix)) {
|
|
543
|
+
return false;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
// Filter by tags
|
|
547
|
+
if (hasTagFilter && !matchesTags(item, tags)) {
|
|
548
|
+
return false;
|
|
549
|
+
}
|
|
550
|
+
// Filter by media type category (type is derived from mimeType)
|
|
551
|
+
if (type) {
|
|
552
|
+
// Map type to mimeType prefix for filtering
|
|
553
|
+
const mimePrefix = type === "other" ? null : `${type}/`;
|
|
554
|
+
if (mimePrefix && !item.mimeType.startsWith(mimePrefix)) {
|
|
555
|
+
return false;
|
|
556
|
+
}
|
|
557
|
+
// For "other" type, exclude known media types
|
|
558
|
+
if (type === "other" && (item.mimeType.startsWith("image/") ||
|
|
559
|
+
item.mimeType.startsWith("video/") ||
|
|
560
|
+
item.mimeType.startsWith("audio/") ||
|
|
561
|
+
item.mimeType.startsWith("application/pdf") ||
|
|
562
|
+
item.mimeType.includes("document") ||
|
|
563
|
+
item.mimeType.includes("sheet") ||
|
|
564
|
+
item.mimeType.includes("presentation"))) {
|
|
565
|
+
return false;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
return true;
|
|
569
|
+
});
|
|
570
|
+
// For custom sorting, we need to fetch all and sort in memory
|
|
571
|
+
if (needsCustomSort) {
|
|
572
|
+
// Fetch more results for in-memory sorting and filtering
|
|
573
|
+
const fetchMultiplier = needsPostFiltering ? 10 : 5;
|
|
574
|
+
const results = [];
|
|
575
|
+
let fetchedCount = 0;
|
|
576
|
+
const maxFetch = (numItems + 1) * fetchMultiplier;
|
|
577
|
+
// Manual iteration with filterWith
|
|
578
|
+
for await (const asset of filteredQuery) {
|
|
579
|
+
results.push(asset);
|
|
580
|
+
fetchedCount++;
|
|
581
|
+
if (fetchedCount >= maxFetch) {
|
|
582
|
+
break;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
// Apply custom sorting
|
|
586
|
+
const sortedResults = sortAssets(results, sortOptions);
|
|
587
|
+
// Handle cursor-based pagination
|
|
588
|
+
let startIndex = 0;
|
|
589
|
+
if (cursor) {
|
|
590
|
+
const cursorIndex = sortedResults.findIndex((asset) => asset._id === cursor);
|
|
591
|
+
if (cursorIndex !== -1) {
|
|
592
|
+
startIndex = cursorIndex + 1;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
// Get the page of results
|
|
596
|
+
const pageResults = sortedResults.slice(startIndex, startIndex + numItems + 1);
|
|
597
|
+
const isDone = pageResults.length <= numItems;
|
|
598
|
+
const page = isDone ? pageResults : pageResults.slice(0, numItems);
|
|
599
|
+
// Enrich assets with URLs and optimization hints
|
|
600
|
+
const enrichedPage = await Promise.all(page.map((asset) => enrichAsset(ctx, asset)));
|
|
601
|
+
const continueCursor = !isDone && page.length > 0 ? page[page.length - 1]._id : null;
|
|
602
|
+
return {
|
|
603
|
+
page: enrichedPage,
|
|
604
|
+
continueCursor,
|
|
605
|
+
isDone,
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
// For default sorting (_creationTime), use paginator
|
|
609
|
+
const result = await filteredQuery.paginate(paginationOpts);
|
|
610
|
+
// Enrich assets with URLs and optimization hints
|
|
611
|
+
const enrichedPage = await Promise.all(result.page.map((asset) => enrichAsset(ctx, asset)));
|
|
612
|
+
return {
|
|
613
|
+
page: enrichedPage,
|
|
614
|
+
continueCursor: result.continueCursor,
|
|
615
|
+
isDone: result.isDone,
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
//# sourceMappingURL=mediaAssets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaAssets.js","sourceRoot":"","sources":["../../src/component/mediaAssets.ts"],"names":[],"mappings":"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"}
|