@aotter/mantle-runtime 0.0.11-alpha.42 → 0.0.11-alpha.44
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/domain/port/MediaAssetRepository.d.ts +18 -0
- package/dist/domain/port/MediaAssetRepository.d.ts.map +1 -1
- package/dist/domain/port/SiteConfigRepository.d.ts +8 -3
- package/dist/domain/port/SiteConfigRepository.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js +5 -1
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseMediaAssetRepository.d.ts +2 -1
- package/dist/infrastructure/persistence/DatabaseMediaAssetRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/DatabaseMediaAssetRepository.js +54 -0
- package/dist/infrastructure/persistence/DatabaseMediaAssetRepository.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts +1 -0
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js +60 -19
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js.map +1 -1
- package/dist/runtime.d.ts +7 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +5 -1
- package/dist/runtime.js.map +1 -1
- package/dist/usecase/content/CreateDraftUseCase.d.ts +2 -3
- package/dist/usecase/content/CreateDraftUseCase.d.ts.map +1 -1
- package/dist/usecase/content/CreateDraftUseCase.js +7 -8
- package/dist/usecase/content/CreateDraftUseCase.js.map +1 -1
- package/dist/usecase/content/UpdateDraftUseCase.js +15 -15
- package/dist/usecase/content/UpdateDraftUseCase.js.map +1 -1
- package/dist/usecase/dto/media/index.d.ts +16 -0
- package/dist/usecase/dto/media/index.d.ts.map +1 -1
- package/dist/usecase/media/DeleteMediaAssetUseCase.d.ts +32 -0
- package/dist/usecase/media/DeleteMediaAssetUseCase.d.ts.map +1 -0
- package/dist/usecase/media/DeleteMediaAssetUseCase.js +56 -0
- package/dist/usecase/media/DeleteMediaAssetUseCase.js.map +1 -0
- package/dist/usecase/media/GetMediaAssetUseCase.d.ts +13 -0
- package/dist/usecase/media/GetMediaAssetUseCase.d.ts.map +1 -0
- package/dist/usecase/media/GetMediaAssetUseCase.js +21 -0
- package/dist/usecase/media/GetMediaAssetUseCase.js.map +1 -0
- package/dist/usecase/media/ListMediaAssetsUseCase.d.ts +15 -0
- package/dist/usecase/media/ListMediaAssetsUseCase.d.ts.map +1 -0
- package/dist/usecase/media/ListMediaAssetsUseCase.js +21 -0
- package/dist/usecase/media/ListMediaAssetsUseCase.js.map +1 -0
- package/dist/usecase/media/UpdateMediaAssetUseCase.d.ts +20 -0
- package/dist/usecase/media/UpdateMediaAssetUseCase.d.ts.map +1 -0
- package/dist/usecase/media/UpdateMediaAssetUseCase.js +33 -0
- package/dist/usecase/media/UpdateMediaAssetUseCase.js.map +1 -0
- package/dist/usecase/media/index.d.ts +4 -0
- package/dist/usecase/media/index.d.ts.map +1 -1
- package/dist/usecase/media/index.js +4 -0
- package/dist/usecase/media/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -30,5 +30,23 @@ export interface MediaAssetRepository {
|
|
|
30
30
|
findManyByIds(ids: readonly string[]): Promise<ReadonlyMap<string, MediaAsset>>;
|
|
31
31
|
save(asset: MediaAsset): Promise<void>;
|
|
32
32
|
delete(id: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Newest-first page of committed assets for the admin media library
|
|
35
|
+
* (#434). Cursor-paginated like `EntryRepository.list` — offset-based
|
|
36
|
+
* behind an opaque token. `search` (optional) is a substring match
|
|
37
|
+
* over alt/caption/id; the store owns escaping. No tag/folder filter
|
|
38
|
+
* — `media_assets` carries no such column (see the repository impl).
|
|
39
|
+
*/
|
|
40
|
+
list(args: MediaAssetListArgs): Promise<MediaAssetListResult>;
|
|
41
|
+
}
|
|
42
|
+
export interface MediaAssetListArgs {
|
|
43
|
+
readonly limit?: number;
|
|
44
|
+
readonly cursor?: string;
|
|
45
|
+
readonly search?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface MediaAssetListResult {
|
|
48
|
+
readonly rows: readonly MediaAsset[];
|
|
49
|
+
/** Present when there may be more rows; pass back as `cursor`. */
|
|
50
|
+
readonly nextCursor?: string;
|
|
33
51
|
}
|
|
34
52
|
//# sourceMappingURL=MediaAssetRepository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaAssetRepository.d.ts","sourceRoot":"","sources":["../../../src/domain/port/MediaAssetRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,aAAa,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"MediaAssetRepository.d.ts","sourceRoot":"","sources":["../../../src/domain/port/MediaAssetRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,aAAa,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC;;;;;;OAMG;IACH,IAAI,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,CAAC;IACrC,kEAAkE;IAClE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B"}
|
|
@@ -3,9 +3,14 @@ import type { MediaPurposePolicy, SiteConfig, SiteDefaults } from "@aotter/mantl
|
|
|
3
3
|
* `SiteConfigRepository` — the `site_config` row read/write surface
|
|
4
4
|
* the runtime exposes to render paths and `bootInit`.
|
|
5
5
|
*
|
|
6
|
-
* `seed`
|
|
7
|
-
* `siteDefaults
|
|
8
|
-
* (
|
|
6
|
+
* `seed` runs on every `bootInit` with the config-supplied
|
|
7
|
+
* `siteDefaults`, but treats keys differently depending on ownership:
|
|
8
|
+
* UI-editable keys (brand/title/description/…) seed once (INSERT …
|
|
9
|
+
* ON CONFLICT DO NOTHING) so operator edits are preserved; keys with
|
|
10
|
+
* no admin-UI edit path (`locales`, `mediaPurposes`) are synced from
|
|
11
|
+
* config on every boot (upsert when the value differs) since code is
|
|
12
|
+
* their only source of truth. See `DatabaseSiteConfigRepository`'s
|
|
13
|
+
* header comment for the full rationale (#441).
|
|
9
14
|
*
|
|
10
15
|
* `load` returns the merged view template authors and adapters see.
|
|
11
16
|
* `readLocales` exists separately because boot-time validation needs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SiteConfigRepository.d.ts","sourceRoot":"","sources":["../../../src/domain/port/SiteConfigRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExF
|
|
1
|
+
{"version":3,"file":"SiteConfigRepository.d.ts","sourceRoot":"","sources":["../../../src/domain/port/SiteConfigRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAC1C;;;yEAGqE;IACrE,iBAAiB,IAAI,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAAC;CAC7D"}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export type { KvCache, KvPutOptions, KvListResult } from "./domain/port/KvCache.
|
|
|
20
20
|
export type { AssetServer } from "./domain/port/AssetServer.js";
|
|
21
21
|
export type { MediaStorage, CreateUploadArgs, CreateUploadVariantSpec, CreateUploadResult, UploadCapability, CommitUploadArgs, CommitUploadVariantSpec, GetPublicUrlArgs, DeleteObjectArgs, MediaAsset, MediaVariant, MediaVariantRole, } from "./domain/port/MediaStorage.js";
|
|
22
22
|
export { pickPrimaryVariant } from "./domain/port/MediaStorage.js";
|
|
23
|
-
export type { MediaAssetRepository } from "./domain/port/MediaAssetRepository.js";
|
|
23
|
+
export type { MediaAssetRepository, MediaAssetListArgs, MediaAssetListResult, } from "./domain/port/MediaAssetRepository.js";
|
|
24
24
|
export type { EmailSender, EmailSendArgs, } from "./domain/port/EmailSender.js";
|
|
25
25
|
export { extensionForMime } from "./usecase/media/mediaAllowlist.js";
|
|
26
26
|
export type { DeferredHookDispatcher, DeferredHookEnvelope, CtxSnapshot, } from "./domain/port/DeferredHookDispatcher.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EACL,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,UAAU,GAChB,MAAM,cAAc,CAAC;AAKtB,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,eAAe,EACf,SAAS,GACV,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACpF,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EACL,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,UAAU,GAChB,MAAM,cAAc,CAAC;AAKtB,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,eAAe,EACf,SAAS,GACV,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACpF,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,WAAW,EACX,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,YAAY,EACV,sBAAsB,EACtB,oBAAoB,EACpB,WAAW,GACZ,MAAM,yCAAyC,CAAC;AAKjD,OAAO,EAAE,KAAK,WAAW,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGrF,YAAY,EACV,UAAU,EACV,cAAc,GACf,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EACL,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACrB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,GACxB,MAAM,qCAAqC,CAAC;AAI7C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,yBAAyB,EACzB,WAAW,EACX,UAAU,GACX,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,WAAW,GACZ,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,sCAAsC,CAAC;AAI9C,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,8CAA8C,CAAC;AAItD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AAIpF,OAAO,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,iBAAiB;AACjB,OAAO,EACL,gBAAgB,GAGjB,MAAM,cAAc,CAAC;AA6BtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,iBAAiB;AACjB,OAAO,EACL,gBAAgB,GAGjB,MAAM,cAAc,CAAC;AA6BtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAUnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAOrE,qEAAqE;AACrE,oEAAoE;AACpE,wDAAwD;AACxD,OAAO,EAAoB,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAQrF,OAAO,EACL,gBAAgB,GAKjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,wBAAwB,GAIzB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,GAGlB,MAAM,qCAAqC,CAAC;AAE7C,kEAAkE;AAClE,oEAAoE;AACpE,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,yBAAyB,EACzB,WAAW,EACX,UAAU,GACX,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,WAAW,GACZ,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,sCAAsC,CAAC;AAE9C,iEAAiE;AACjE,4DAA4D;AAC5D,OAAO,EACL,oBAAoB,GAGrB,MAAM,8CAA8C,CAAC;AAEtD,6DAA6D;AAC7D,4DAA4D;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AAEpF,qEAAqE;AACrE,gCAAgC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC"}
|
|
@@ -235,10 +235,14 @@ const CURSOR_PREFIX = "o:";
|
|
|
235
235
|
function encodeCursor(offset) {
|
|
236
236
|
return `${CURSOR_PREFIX}${offset}`;
|
|
237
237
|
}
|
|
238
|
+
/** Upper bound on a decoded offset. `Number("1e10")` passes
|
|
239
|
+
* `Number.isInteger`, so an attacker-supplied cursor could otherwise
|
|
240
|
+
* drive `OFFSET 10_000_000_000`. Reject anything past a sane cap. */
|
|
241
|
+
const MAX_CURSOR_OFFSET = 1_000_000;
|
|
238
242
|
function decodeCursor(cursor) {
|
|
239
243
|
if (!cursor || !cursor.startsWith(CURSOR_PREFIX))
|
|
240
244
|
return 0;
|
|
241
245
|
const n = Number(cursor.slice(CURSOR_PREFIX.length));
|
|
242
|
-
return Number.isInteger(n) && n >= 0 ? n : 0;
|
|
246
|
+
return Number.isInteger(n) && n >= 0 && n <= MAX_CURSOR_OFFSET ? n : 0;
|
|
243
247
|
}
|
|
244
248
|
//# sourceMappingURL=DatabaseEntryRepository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatabaseEntryRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/persistence/DatabaseEntryRepository.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,GAEX,MAAM,gCAAgC,CAAC;AAExC;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,uBAAuB;IACL;IAA7B,YAA6B,EAAkB;QAAlB,OAAE,GAAF,EAAE,CAAgB;IAAG,CAAC;IAEnD,KAAK,CAAC,MAAM,CAAC,IAAqB;QAChC,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;yCACiC,CAClC;aACA,IAAI,CACH,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EACzB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,GAAG,CACT;aACA,GAAG,EAAE,CAAC;QACT,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,GAAG;YACnB,SAAS,EAAE,IAAI,CAAC,GAAG;SACpB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;mCAC2B,CAC5B;aACA,IAAI,CAAC,EAAE,CAAC;aACR,KAAK,EAAc,CAAC;QACvB,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAqB;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;;4FAEoF,CACrF;aACA,IAAI,CACH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EACzB,UAAU,EACV,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,eAAe,CACrB;aACA,KAAK,EAAc,CAAC;QACvB,IAAI,CAAC,GAAG;YAAE,MAAM,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1E,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAqB;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YACjC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SAClE,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvC,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAsB;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;;4FAEoF,CACrF;aACA,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC;aACzD,KAAK,EAAc,CAAC;QACvB,IAAI,CAAC,GAAG;YAAE,MAAM,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1E,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAA0B;QAC/C,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;QACjD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;uBACe,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;4FACsD,CACrF;aACA,IAAI,CAAC,GAAG,KAAK,CAAC;aACd,KAAK,EAAc,CAAC;QACvB,IAAI,GAAG;YAAE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/B,mEAAmE;QACnE,kEAAkE;QAClE,+DAA+D;QAC/D,0BAA0B;QAC1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE;aACxB,OAAO,CAAC,kDAAkD,CAAC;aAC3D,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;aACb,KAAK,EAAuC,CAAC;QAChD,IAAI,eAAe,KAAK,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;YAChF,MAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,IAAI,mBAAmB,CAC3B,IAAI,CAAC,EAAE,EACP,cAAc,IAAI,IAAI,CAAC,EAAE,EACxB,KAAK,EAAE,MAAmC,IAAI,IAAI,CAAC,EAAE,CACvD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAqB;QAC9B,6DAA6D;QAC7D,+DAA+D;QAC/D,6DAA6D;QAC7D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,+DAA+D;QAC/D,0CAA0C;QAC1C,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;QACxB,MAAM,UAAU,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACtC,MAAM,KAAK,GAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,+DAA+D;YAC/D,+DAA+D;YAC/D,4DAA4D;YAC5D,WAAW;YACX,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,UAAU,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YAC1F,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;8BACsB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;4DACM,CACrD;aACA,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,EAAc,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YACzB,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;SAC/D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAA8B;QAClD,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM;YACtB,CAAC,CAAC,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;;;8CAGkC,CACnC;iBACA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;YACzD,CAAC,CAAC,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;;;8CAGkC,CACnC;iBACA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,EAAc,CAAC;QAC3C,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAA+B;QACpD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,MAAM,UAAU,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACtC,MAAM,KAAK,GAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACrC,UAAU,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;;iBAES,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;0CACC,CACnC;aACA,IAAI,CAAC,GAAG,KAAK,CAAC;aACd,KAAK,EAAc,CAAC;QACvB,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,EAAU,EACV,QAAgB;QAEhB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE;aACxB,OAAO,CAAC,0CAA0C,CAAC;aACnD,IAAI,CAAC,EAAE,CAAC;aACR,KAAK,EAAuB,CAAC;QAChC,OAAO,IAAI,oBAAoB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;CACF;AAaD,SAAS,SAAS,CAAC,GAAe;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAA4B,CAAC;IAC7D,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC;QACxB,MAAM,EAAE,GAAG,CAAC,MAAsB;QAClC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI;QACJ,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAa;IAC7C,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;AACpE,CAAC;AAED;;uCAEuC;AACvC,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACH,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,GAAG,aAAa,GAAG,MAAM,EAAE,CAAC;AACrC,CAAC;AACD,SAAS,YAAY,CAAC,MAA0B;IAC9C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"DatabaseEntryRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/persistence/DatabaseEntryRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
|
|
2
|
-
import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js";
|
|
2
|
+
import type { MediaAssetListArgs, MediaAssetListResult, MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js";
|
|
3
3
|
import type { MediaAsset } from "../../domain/port/MediaStorage.js";
|
|
4
4
|
/**
|
|
5
5
|
* `media_assets` row read/write. The variants set + free-form
|
|
@@ -23,5 +23,6 @@ export declare class DatabaseMediaAssetRepository implements MediaAssetRepositor
|
|
|
23
23
|
findManyByIds(ids: readonly string[]): Promise<ReadonlyMap<string, MediaAsset>>;
|
|
24
24
|
save(asset: MediaAsset): Promise<void>;
|
|
25
25
|
delete(id: string): Promise<void>;
|
|
26
|
+
list(args: MediaAssetListArgs): Promise<MediaAssetListResult>;
|
|
26
27
|
}
|
|
27
28
|
//# sourceMappingURL=DatabaseMediaAssetRepository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatabaseMediaAssetRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/persistence/DatabaseMediaAssetRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"DatabaseMediaAssetRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/persistence/DatabaseMediaAssetRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EACV,UAAU,EAEX,MAAM,mCAAmC,CAAC;AAG3C;;;;;;;;;;;;;;GAcG;AACH,qBAAa,4BAA6B,YAAW,oBAAoB;IAC3D,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,cAAc;IAEzC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAYhD,aAAa,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAmB/E,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBtC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,IAAI,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAmCpE"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { clampLimit } from "../../domain/service/Pagination.js";
|
|
1
2
|
/**
|
|
2
3
|
* `media_assets` row read/write. The variants set + free-form
|
|
3
4
|
* metadata go in as JSON-encoded TEXT — variants is closed-shape so
|
|
@@ -61,8 +62,61 @@ export class DatabaseMediaAssetRepository {
|
|
|
61
62
|
async delete(id) {
|
|
62
63
|
await this.db.prepare(`DELETE FROM media_assets WHERE id = ?`).bind(id).run();
|
|
63
64
|
}
|
|
65
|
+
async list(args) {
|
|
66
|
+
const limit = clampLimit(args.limit);
|
|
67
|
+
const offset = decodeCursor(args.cursor);
|
|
68
|
+
// Fetch limit+1 to detect a next page without a second query — the
|
|
69
|
+
// extra row never reaches the caller (mirrors EntryRepository.list).
|
|
70
|
+
const probe = limit + 1;
|
|
71
|
+
const conditions = [];
|
|
72
|
+
const binds = [];
|
|
73
|
+
if (args.search) {
|
|
74
|
+
// LIKE over alt/caption/id — media_assets has no FTS index and no
|
|
75
|
+
// tag/folder column, so this is the whole filter surface. Escape
|
|
76
|
+
// the caller's own wildcards so "50%" stays a literal.
|
|
77
|
+
const term = escapeLikeTerm(args.search);
|
|
78
|
+
conditions.push("(id LIKE '%'||?||'%' ESCAPE '\\' OR alt LIKE '%'||?||'%' ESCAPE '\\' OR caption LIKE '%'||?||'%' ESCAPE '\\')");
|
|
79
|
+
binds.push(term, term, term);
|
|
80
|
+
}
|
|
81
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
82
|
+
binds.push(probe, offset);
|
|
83
|
+
const rows = await this.db
|
|
84
|
+
.prepare(`SELECT id, created_at, owner_id, alt, caption, variants, metadata
|
|
85
|
+
FROM media_assets ${where}
|
|
86
|
+
ORDER BY created_at DESC, id DESC LIMIT ? OFFSET ?`)
|
|
87
|
+
.bind(...binds)
|
|
88
|
+
.all();
|
|
89
|
+
const hasMore = rows.length > limit;
|
|
90
|
+
const page = hasMore ? rows.slice(0, limit) : rows;
|
|
91
|
+
return {
|
|
92
|
+
rows: page.map(rowToAsset),
|
|
93
|
+
nextCursor: hasMore ? encodeCursor(offset + limit) : undefined,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
64
96
|
}
|
|
65
97
|
const CHUNK = 100;
|
|
98
|
+
/** Offset-based cursor, prefixed so a future row-value cursor can
|
|
99
|
+
* coexist by switching on the prefix. Callers treat it as opaque.
|
|
100
|
+
* Matches `DatabaseEntryRepository`'s scheme. */
|
|
101
|
+
const CURSOR_PREFIX = "o:";
|
|
102
|
+
function encodeCursor(offset) {
|
|
103
|
+
return `${CURSOR_PREFIX}${offset}`;
|
|
104
|
+
}
|
|
105
|
+
/** Upper bound on a decoded offset. `Number("1e10")` passes
|
|
106
|
+
* `Number.isInteger`, so an attacker-supplied cursor could otherwise
|
|
107
|
+
* drive `OFFSET 10_000_000_000`. Reject anything past a sane cap. */
|
|
108
|
+
const MAX_CURSOR_OFFSET = 1_000_000;
|
|
109
|
+
function decodeCursor(cursor) {
|
|
110
|
+
if (!cursor || !cursor.startsWith(CURSOR_PREFIX))
|
|
111
|
+
return 0;
|
|
112
|
+
const n = Number(cursor.slice(CURSOR_PREFIX.length));
|
|
113
|
+
return Number.isInteger(n) && n >= 0 && n <= MAX_CURSOR_OFFSET ? n : 0;
|
|
114
|
+
}
|
|
115
|
+
/** Escape LIKE metacharacters in a user-supplied search term so `%`,
|
|
116
|
+
* `_`, and `\` are matched literally (ESCAPE '\'). */
|
|
117
|
+
function escapeLikeTerm(term) {
|
|
118
|
+
return term.replace(/[\\%_]/g, (ch) => `\\${ch}`);
|
|
119
|
+
}
|
|
66
120
|
function rowToAsset(row) {
|
|
67
121
|
const variants = JSON.parse(row.variants);
|
|
68
122
|
const metadata = row.metadata
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatabaseMediaAssetRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/persistence/DatabaseMediaAssetRepository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DatabaseMediaAssetRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/persistence/DatabaseMediaAssetRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export declare class DatabaseSiteConfigRepository implements SiteConfigRepositor
|
|
|
5
5
|
private readonly db;
|
|
6
6
|
constructor(db: DatabaseDriver);
|
|
7
7
|
seed(defaults: SiteDefaults | undefined): Promise<void>;
|
|
8
|
+
private upsertIfChanged;
|
|
8
9
|
load(): Promise<SiteConfig>;
|
|
9
10
|
readLocales(): Promise<readonly string[]>;
|
|
10
11
|
readMediaPurposes(): Promise<readonly MediaPurposePolicy[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatabaseSiteConfigRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/persistence/DatabaseSiteConfigRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"DatabaseSiteConfigRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/persistence/DatabaseSiteConfigRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAmEtF,qBAAa,4BAA6B,YAAW,oBAAoB;IAC3D,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,cAAc;IAEzC,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YAsD/C,eAAe;IAcvB,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAqB3B,WAAW,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;IAQzC,iBAAiB,IAAI,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC;CAOlE"}
|
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
import { assertSiteDefaultsCanonical, } from "@aotter/mantle-spec";
|
|
2
2
|
/**
|
|
3
|
-
* `site_config` row read/write.
|
|
4
|
-
* `
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* `site_config` row read/write. `seed` runs once per boot (called from
|
|
4
|
+
* `bootInit`) and treats keys differently depending on who owns them:
|
|
5
|
+
*
|
|
6
|
+
* - **UI-editable, seed-once** (`brand`, `title`, `description`,
|
|
7
|
+
* `origin`, `faviconUrl`, `ga4MeasurementId`, `facebookPixelId`):
|
|
8
|
+
* written via INSERT … ON CONFLICT DO NOTHING. The admin settings
|
|
9
|
+
* UI (`/admin/api/site-settings`) can edit a subset of these
|
|
10
|
+
* directly, and the rest are conceptually the same "operator can
|
|
11
|
+
* override" bucket — either way, DB wins once the row exists, so a
|
|
12
|
+
* later `mantleConfig.ts` edit never clobbers an operator's change.
|
|
13
|
+
*
|
|
14
|
+
* - **code-canonical, boot-synced** (`mediaPurposes`, `locales`):
|
|
15
|
+
* these have no admin-UI edit path — `mantleConfig.ts` is the only
|
|
16
|
+
* source of truth — so `seed` upserts them on every boot, writing
|
|
17
|
+
* only when the serialized value actually differs from what's
|
|
18
|
+
* stored (read-compare-write; avoids a write on every boot when
|
|
19
|
+
* nothing changed). Fixes #441: pre-fix, both classes were
|
|
20
|
+
* DO-NOTHING, so a `mediaPurposes` edit in code (new mime, new
|
|
21
|
+
* purpose, adjusted `maxBytes`) silently never reached a
|
|
22
|
+
* already-deployed site's D1 row.
|
|
7
23
|
*
|
|
8
24
|
* The runtime calls `seed` once during bootInit; the result of `load`
|
|
9
25
|
* is what every render path and template sees.
|
|
@@ -59,40 +75,65 @@ export class DatabaseSiteConfigRepository {
|
|
|
59
75
|
return;
|
|
60
76
|
assertSiteDefaultsCanonical(defaults);
|
|
61
77
|
const stmts = [];
|
|
62
|
-
const
|
|
78
|
+
const insertOnce = (key, value) => this.db
|
|
63
79
|
.prepare(`INSERT INTO site_config (key, value) VALUES (?, ?) ON CONFLICT(key) DO NOTHING`)
|
|
64
80
|
.bind(key, value);
|
|
81
|
+
// UI-editable, seed-once — DB wins once the row exists.
|
|
65
82
|
if (defaults.brand && defaults.brand.length > 0) {
|
|
66
|
-
stmts.push(
|
|
83
|
+
stmts.push(insertOnce(KEYS.brand, defaults.brand));
|
|
67
84
|
}
|
|
68
85
|
if (defaults.title && defaults.title.length > 0) {
|
|
69
|
-
stmts.push(
|
|
86
|
+
stmts.push(insertOnce(KEYS.title, defaults.title));
|
|
70
87
|
}
|
|
71
88
|
if (defaults.description && defaults.description.length > 0) {
|
|
72
|
-
stmts.push(
|
|
89
|
+
stmts.push(insertOnce(KEYS.description, defaults.description));
|
|
73
90
|
}
|
|
74
91
|
if (defaults.origin && defaults.origin.length > 0) {
|
|
75
|
-
stmts.push(
|
|
92
|
+
stmts.push(insertOnce(KEYS.origin, defaults.origin));
|
|
76
93
|
}
|
|
77
94
|
if (defaults.faviconUrl && defaults.faviconUrl.length > 0) {
|
|
78
|
-
stmts.push(
|
|
95
|
+
stmts.push(insertOnce(KEYS.faviconUrl, defaults.faviconUrl));
|
|
79
96
|
}
|
|
80
97
|
if (defaults.ga4MeasurementId && defaults.ga4MeasurementId.length > 0) {
|
|
81
|
-
stmts.push(
|
|
98
|
+
stmts.push(insertOnce(KEYS.ga4MeasurementId, defaults.ga4MeasurementId));
|
|
82
99
|
}
|
|
83
100
|
if (defaults.facebookPixelId && defaults.facebookPixelId.length > 0) {
|
|
84
|
-
stmts.push(
|
|
85
|
-
}
|
|
86
|
-
if (defaults.locales && defaults.locales.length > 0) {
|
|
87
|
-
stmts.push(insert(KEYS.locales, defaults.locales.join(",")));
|
|
88
|
-
}
|
|
89
|
-
const purposes = defaults.media?.purposes;
|
|
90
|
-
if (purposes && purposes.length > 0) {
|
|
91
|
-
stmts.push(insert(KEYS.mediaPurposes, JSON.stringify(purposes)));
|
|
101
|
+
stmts.push(insertOnce(KEYS.facebookPixelId, defaults.facebookPixelId));
|
|
92
102
|
}
|
|
93
103
|
if (stmts.length > 0) {
|
|
94
104
|
await this.db.batch(stmts);
|
|
95
105
|
}
|
|
106
|
+
// Code-canonical, boot-synced — no admin-UI edit path for these
|
|
107
|
+
// keys, so `mantleConfig.ts` is the only source of truth. Upsert
|
|
108
|
+
// whenever the serialized value differs from what's stored;
|
|
109
|
+
// read-compare-write avoids issuing a write on every boot when
|
|
110
|
+
// nothing actually changed (#441).
|
|
111
|
+
const syncedValues = [
|
|
112
|
+
[KEYS.locales, defaults.locales && defaults.locales.length > 0 ? defaults.locales.join(",") : undefined],
|
|
113
|
+
[
|
|
114
|
+
KEYS.mediaPurposes,
|
|
115
|
+
defaults.media?.purposes && defaults.media.purposes.length > 0
|
|
116
|
+
? JSON.stringify(defaults.media.purposes)
|
|
117
|
+
: undefined,
|
|
118
|
+
],
|
|
119
|
+
];
|
|
120
|
+
for (const [key, value] of syncedValues) {
|
|
121
|
+
if (value === undefined)
|
|
122
|
+
continue;
|
|
123
|
+
await this.upsertIfChanged(key, value);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async upsertIfChanged(key, value) {
|
|
127
|
+
const current = await this.db
|
|
128
|
+
.prepare(`SELECT value FROM site_config WHERE key = ?`)
|
|
129
|
+
.bind(key)
|
|
130
|
+
.first();
|
|
131
|
+
if (current?.value === value)
|
|
132
|
+
return;
|
|
133
|
+
await this.db
|
|
134
|
+
.prepare(`INSERT INTO site_config (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value`)
|
|
135
|
+
.bind(key, value)
|
|
136
|
+
.run();
|
|
96
137
|
}
|
|
97
138
|
async load() {
|
|
98
139
|
const rows = await this.db
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatabaseSiteConfigRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/persistence/DatabaseSiteConfigRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,GAI5B,MAAM,qBAAqB,CAAC;AAI7B
|
|
1
|
+
{"version":3,"file":"DatabaseSiteConfigRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/persistence/DatabaseSiteConfigRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,GAI5B,MAAM,qBAAqB,CAAC;AAI7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,aAAa;IAC1B,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,gBAAgB,EAAE,kBAAkB;IACpC,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;CACtB,CAAC;AAEX,SAAS,QAAQ,CAAC,GAAuB;IACvC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAuB;IACjD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,OAAO,MAAuC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,OAAO,4BAA4B;IACV;IAA7B,YAA6B,EAAkB;QAAlB,OAAE,GAAF,EAAE,CAAgB;IAAG,CAAC;IAEnD,KAAK,CAAC,IAAI,CAAC,QAAkC;QAC3C,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE,CAChD,IAAI,CAAC,EAAE;aACJ,OAAO,CAAC,gFAAgF,CAAC;aACzF,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtB,wDAAwD;QACxD,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QAED,gEAAgE;QAChE,iEAAiE;QACjE,4DAA4D;QAC5D,+DAA+D;QAC/D,mCAAmC;QACnC,MAAM,YAAY,GAAwC;YACxD,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACxG;gBACE,IAAI,CAAC,aAAa;gBAClB,QAAQ,CAAC,KAAK,EAAE,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;oBAC5D,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;oBACzC,CAAC,CAAC,SAAS;aACd;SACF,CAAC;QACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;YACxC,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS;YAClC,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,GAAW,EAAE,KAAa;QACtD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,OAAO,CAAC,6CAA6C,CAAC;aACtD,IAAI,CAAC,GAAG,CAAC;aACT,KAAK,EAAqB,CAAC;QAC9B,IAAI,OAAO,EAAE,KAAK,KAAK,KAAK;YAAE,OAAO;QACrC,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN,0GAA0G,CAC3G;aACA,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;aAChB,GAAG,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,OAAO,CAAC,oCAAoC,CAAC;aAC7C,GAAG,EAAkC,CAAC;QACzC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC/D,OAAO;YACL,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK;YACjC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;YAC1C,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAChC,OAAO;YACP,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI;YACnC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc;YAC1C,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,SAAS;YAC/C,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,SAAS;YAC3D,eAAe,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,SAAS;YACzD,KAAK,EAAE,EAAE,QAAQ,EAAE;SACpB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,6CAA6C,CAAC;aACtD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;aAClB,KAAK,EAAqB,CAAC;QAC9B,OAAO,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,6CAA6C,CAAC;aACtD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;aACxB,KAAK,EAAqB,CAAC;QAC9B,OAAO,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;CACF"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ import { ExecuteViewUseCase } from "./usecase/view/index.js";
|
|
|
17
17
|
import { ValidateBootUseCase } from "./usecase/boot/index.js";
|
|
18
18
|
import { RunDeferredHookUseCase } from "./usecase/lifecycle/index.js";
|
|
19
19
|
import { ComposeEntrySeoMetaUseCase, ComposeLlmsTxtUseCase, ComposeSitemapUseCase, PreviewEntryUseCase, RenderEntryLiveUseCase, RenderListLiveUseCase } from "./usecase/render/index.js";
|
|
20
|
-
import { CommitMediaUploadUseCase, CreateMediaUploadUseCase } from "./usecase/media/index.js";
|
|
20
|
+
import { CommitMediaUploadUseCase, CreateMediaUploadUseCase, ListMediaAssetsUseCase, GetMediaAssetUseCase, UpdateMediaAssetUseCase, DeleteMediaAssetUseCase } from "./usecase/media/index.js";
|
|
21
21
|
import type { PublicPathResolver } from "./domain/service/PublicPathResolver.js";
|
|
22
22
|
import type { MediaAsset } from "./domain/port/MediaStorage.js";
|
|
23
23
|
/**
|
|
@@ -113,6 +113,12 @@ export interface CmsRuntime {
|
|
|
113
113
|
readonly storage: MediaStorage;
|
|
114
114
|
readonly createUpload: CreateMediaUploadUseCase;
|
|
115
115
|
readonly commitUpload: CommitMediaUploadUseCase;
|
|
116
|
+
/** Admin media-library use cases (#434): list/get/patch/delete over
|
|
117
|
+
* committed assets. Adapters route `/admin/api/media*` off these. */
|
|
118
|
+
readonly listAssets: ListMediaAssetsUseCase;
|
|
119
|
+
readonly getAsset: GetMediaAssetUseCase;
|
|
120
|
+
readonly updateAsset: UpdateMediaAssetUseCase;
|
|
121
|
+
readonly deleteAsset: DeleteMediaAssetUseCase;
|
|
116
122
|
resolve(id: string): Promise<MediaAsset | null>;
|
|
117
123
|
resolveMany(ids: readonly string[]): Promise<ReadonlyMap<string, MediaAsset>>;
|
|
118
124
|
} | null;
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAEtF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEL,sBAAsB,EACvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EACL,sBAAsB,EAEvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,wBAAwB,EACxB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.js
CHANGED
|
@@ -8,7 +8,7 @@ import { ExecuteViewUseCase } from "./usecase/view/index.js";
|
|
|
8
8
|
import { ValidateBootUseCase } from "./usecase/boot/index.js";
|
|
9
9
|
import { RunDeferredHookUseCase, RunLifecycleHooksUseCase, } from "./usecase/lifecycle/index.js";
|
|
10
10
|
import { ComposeEntrySeoMetaUseCase, ComposeLlmsTxtUseCase, ComposeSitemapUseCase, PreviewEntryUseCase, RenderEntryLiveUseCase, RenderListLiveUseCase, } from "./usecase/render/index.js";
|
|
11
|
-
import { CommitMediaUploadUseCase, CreateMediaUploadUseCase, } from "./usecase/media/index.js";
|
|
11
|
+
import { CommitMediaUploadUseCase, CreateMediaUploadUseCase, ListMediaAssetsUseCase, GetMediaAssetUseCase, UpdateMediaAssetUseCase, DeleteMediaAssetUseCase, } from "./usecase/media/index.js";
|
|
12
12
|
import { TemplateRegistry as TemplateRegistryImpl } from "./domain/model/TemplateRegistry.js";
|
|
13
13
|
import { TriggerIndex } from "./domain/service/TriggerIndex.js";
|
|
14
14
|
import { DatabaseEntryRepository } from "./infrastructure/persistence/DatabaseEntryRepository.js";
|
|
@@ -92,6 +92,10 @@ export function createCmsRuntime(args) {
|
|
|
92
92
|
storage: args.mediaStorage,
|
|
93
93
|
createUpload: new CreateMediaUploadUseCase(args.mediaStorage, args.kv, clock, idgen, siteConfig, { allowSvg: args.mediaAllowSvg ?? false }),
|
|
94
94
|
commitUpload: new CommitMediaUploadUseCase(args.mediaStorage, args.kv, clock, mediaAssets),
|
|
95
|
+
listAssets: new ListMediaAssetsUseCase(mediaAssets),
|
|
96
|
+
getAsset: new GetMediaAssetUseCase(mediaAssets),
|
|
97
|
+
updateAsset: new UpdateMediaAssetUseCase(mediaAssets),
|
|
98
|
+
deleteAsset: new DeleteMediaAssetUseCase(args.mediaStorage, mediaAssets),
|
|
95
99
|
resolve: (id) => mediaAssets.findById(id),
|
|
96
100
|
resolveMany: (ids) => mediaAssets.findManyByIds(ids),
|
|
97
101
|
}
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAOnB,MAAM,qBAAqB,CAAC;AAW7B,OAAO,EAAE,WAAW,EAAc,MAAM,wBAAwB,CAAC;AACjE,OAAO,EACL,mBAAmB,GAEpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,oBAAoB,GAErB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,wBAAwB,EACxB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,8 @@ import type { IdGenerator } from "../../domain/port/IdGenerator.js";
|
|
|
6
6
|
import type { SiteConfigRepository } from "../../domain/port/SiteConfigRepository.js";
|
|
7
7
|
import type { CreateDraftRequest } from "../dto/content/index.js";
|
|
8
8
|
/**
|
|
9
|
-
* `CreateDraftUseCase` — create a
|
|
10
|
-
*
|
|
11
|
-
* at publish time.
|
|
9
|
+
* `CreateDraftUseCase` — create a draft for content lifecycles, or a
|
|
10
|
+
* live row for `lifecycle: none` operational records.
|
|
12
11
|
*/
|
|
13
12
|
export declare class CreateDraftUseCase {
|
|
14
13
|
private readonly entries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateDraftUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/content/CreateDraftUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"CreateDraftUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/content/CreateDraftUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAOlE;;;GAGG;AACH,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAJX,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,WAAW,EAClB,UAAU,CAAC,EAAE,oBAAoB,YAAA;IAG9C,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;CAqC9D"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { DiagnosticError, } from "@aotter/mantle-spec";
|
|
2
|
-
import { resolveLifecycle } from "@aotter/mantle-spec";
|
|
1
|
+
import { DiagnosticError, resolveLifecycle, } from "@aotter/mantle-spec";
|
|
3
2
|
import { projectAndStamp } from "../../domain/service/BuiltinProjector.js";
|
|
4
3
|
import { schemaUnknownDiagnostic, withConflictDiagnostic, } from "./diagnostics.js";
|
|
5
4
|
import { assertEntryWritable } from "../../domain/service/io/EntryWriteGuard.js";
|
|
6
5
|
/**
|
|
7
|
-
* `CreateDraftUseCase` — create a
|
|
8
|
-
*
|
|
9
|
-
* at publish time.
|
|
6
|
+
* `CreateDraftUseCase` — create a draft for content lifecycles, or a
|
|
7
|
+
* live row for `lifecycle: none` operational records.
|
|
10
8
|
*/
|
|
11
9
|
export class CreateDraftUseCase {
|
|
12
10
|
entries;
|
|
@@ -30,6 +28,7 @@ export class CreateDraftUseCase {
|
|
|
30
28
|
const id = this.idgen.next();
|
|
31
29
|
const now = this.clock.now();
|
|
32
30
|
const ctx = authoringContext(request.ctx, request.authorId);
|
|
31
|
+
const lifecycle = resolveLifecycle(schema);
|
|
33
32
|
const data = projectAndStamp({ schema, input: request.data, ctx, clockNow: now });
|
|
34
33
|
await assertEntryWritable({
|
|
35
34
|
opPath,
|
|
@@ -37,15 +36,15 @@ export class CreateDraftUseCase {
|
|
|
37
36
|
schema,
|
|
38
37
|
data,
|
|
39
38
|
siteConfig: this.siteConfig,
|
|
40
|
-
//
|
|
41
|
-
partial:
|
|
39
|
+
// Real drafts save incomplete; lifecycle:none records are live immediately.
|
|
40
|
+
partial: lifecycle !== "none",
|
|
42
41
|
});
|
|
43
42
|
return withConflictDiagnostic(opPath, () => this.entries.create({
|
|
44
43
|
id,
|
|
45
44
|
collection: request.collection,
|
|
46
45
|
// Operational records (lifecycle: none) have no publish step —
|
|
47
46
|
// they are live the moment they exist.
|
|
48
|
-
status:
|
|
47
|
+
status: lifecycle === "none" ? "published" : "draft",
|
|
49
48
|
data,
|
|
50
49
|
authorId: request.authorId,
|
|
51
50
|
now,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateDraftUseCase.js","sourceRoot":"","sources":["../../../src/usecase/content/CreateDraftUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,
|
|
1
|
+
{"version":3,"file":"CreateDraftUseCase.js","sourceRoot":"","sources":["../../../src/usecase/content/CreateDraftUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,gBAAgB,GAEjB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAE3E,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAEjF;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAEV;IACA;IACA;IACA;IACA;IALnB,YACmB,OAAwB,EACxB,OAA4C,EAC5C,KAAY,EACZ,KAAkB,EAClB,UAAiC;QAJjC,YAAO,GAAP,OAAO,CAAiB;QACxB,YAAO,GAAP,OAAO,CAAqC;QAC5C,UAAK,GAAL,KAAK,CAAO;QACZ,UAAK,GAAL,KAAK,CAAa;QAClB,eAAU,GAAV,UAAU,CAAuB;IACjD,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA2B;QACvC,MAAM,MAAM,GAAG,uBAAuB,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,eAAe,CACvB,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAC9E,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAClF,MAAM,mBAAmB,CAAC;YACxB,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM;YACN,IAAI;YACJ,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,4EAA4E;YAC5E,OAAO,EAAE,SAAS,KAAK,MAAM;SAC9B,CAAC,CAAC;QACH,OAAO,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,CACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAClB,EAAE;YACF,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,+DAA+D;YAC/D,uCAAuC;YACvC,MAAM,EAAE,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO;YACpD,IAAI;YACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,GAAG;YACH,WAAW,EAAE,GAAG;YAChB,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CACH,CAAC;IACJ,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,GAA+B,EAAE,QAAuB;IAChF,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;QACxC,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,EAAE;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -24,19 +24,6 @@ export class UpdateDraftUseCase {
|
|
|
24
24
|
if (!existing) {
|
|
25
25
|
throw new DiagnosticError(notFoundDiagnostic(opPath, "<unknown>", request.id));
|
|
26
26
|
}
|
|
27
|
-
// lifecycle: none records have no draft/published workflow — they
|
|
28
|
-
// are editable in place regardless of stored status.
|
|
29
|
-
const lifecycle = resolveLifecycle(this.schemas.get(existing.collection));
|
|
30
|
-
if (existing.status !== "draft" && lifecycle !== "none") {
|
|
31
|
-
throw new DiagnosticError(runtimeDiagnostic({
|
|
32
|
-
code: "CONFLICT",
|
|
33
|
-
severity: "error",
|
|
34
|
-
path: opPath,
|
|
35
|
-
value: existing.status,
|
|
36
|
-
expected: "row.status === 'draft'",
|
|
37
|
-
message: `Entry '${request.id}' is in status '${existing.status}'; only drafts are editable. Unpublish first.`,
|
|
38
|
-
}));
|
|
39
|
-
}
|
|
40
27
|
const schema = this.schemas.get(existing.collection);
|
|
41
28
|
if (!schema) {
|
|
42
29
|
throw new DiagnosticError(runtimeDiagnostic({
|
|
@@ -49,6 +36,19 @@ export class UpdateDraftUseCase {
|
|
|
49
36
|
message: `Entry '${request.id}' belongs to unknown Schema '${existing.collection}'.`,
|
|
50
37
|
}));
|
|
51
38
|
}
|
|
39
|
+
// lifecycle: none records have no draft/published workflow — they
|
|
40
|
+
// are editable in place regardless of stored status.
|
|
41
|
+
const lifecycle = resolveLifecycle(schema);
|
|
42
|
+
if (existing.status !== "draft" && lifecycle !== "none") {
|
|
43
|
+
throw new DiagnosticError(runtimeDiagnostic({
|
|
44
|
+
code: "CONFLICT",
|
|
45
|
+
severity: "error",
|
|
46
|
+
path: opPath,
|
|
47
|
+
value: existing.status,
|
|
48
|
+
expected: "row.status === 'draft'",
|
|
49
|
+
message: `Entry '${request.id}' is in status '${existing.status}'; only drafts are editable. Unpublish first.`,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
52
|
const now = this.clock.now();
|
|
53
53
|
const ctx = authoringContext(request.ctx, existing.authorId);
|
|
54
54
|
const data = projectUpdateAndStamp({
|
|
@@ -65,8 +65,8 @@ export class UpdateDraftUseCase {
|
|
|
65
65
|
data,
|
|
66
66
|
excludeId: existing.id,
|
|
67
67
|
siteConfig: this.siteConfig,
|
|
68
|
-
//
|
|
69
|
-
partial:
|
|
68
|
+
// Real drafts save incomplete; lifecycle:none records are live immediately.
|
|
69
|
+
partial: lifecycle !== "none",
|
|
70
70
|
});
|
|
71
71
|
return withConflictDiagnostic(opPath, () => this.entries.update({
|
|
72
72
|
id: request.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdateDraftUseCase.js","sourceRoot":"","sources":["../../../src/usecase/content/UpdateDraftUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAEjF,OAAO,EACL,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAEjF;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IAEV;IACA;IACA;IACA;IAJnB,YACmB,OAAwB,EACxB,OAA4C,EAC5C,KAAY,EACZ,UAAiC;QAHjC,YAAO,GAAP,OAAO,CAAiB;QACxB,YAAO,GAAP,OAAO,CAAqC;QAC5C,UAAK,GAAL,KAAK,CAAO;QACZ,eAAU,GAAV,UAAU,CAAuB;IACjD,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA2B;QACvC,MAAM,MAAM,GAAG,uBAAuB,OAAO,CAAC,EAAE,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,eAAe,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,
|
|
1
|
+
{"version":3,"file":"UpdateDraftUseCase.js","sourceRoot":"","sources":["../../../src/usecase/content/UpdateDraftUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,4 +45,20 @@ export interface CommitMediaUploadRequest {
|
|
|
45
45
|
readonly alt?: string;
|
|
46
46
|
readonly caption?: string;
|
|
47
47
|
}
|
|
48
|
+
/** Admin media library list request (#434). Cursor-paginated,
|
|
49
|
+
* newest-first; `search` is an optional substring over id/alt/caption. */
|
|
50
|
+
export interface ListMediaAssetsRequest {
|
|
51
|
+
readonly limit?: number;
|
|
52
|
+
readonly cursor?: string;
|
|
53
|
+
readonly search?: string;
|
|
54
|
+
}
|
|
55
|
+
/** Patch alt/caption on a committed asset (#434). Only these two
|
|
56
|
+
* fields are operator-editable — variants/mime/bytes are frozen at
|
|
57
|
+
* commit. `undefined` leaves a field unchanged; an empty string
|
|
58
|
+
* clears it. */
|
|
59
|
+
export interface UpdateMediaAssetRequest {
|
|
60
|
+
readonly id: string;
|
|
61
|
+
readonly alt?: string;
|
|
62
|
+
readonly caption?: string;
|
|
63
|
+
}
|
|
48
64
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/usecase/dto/media/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAE7E,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,+BAA+B,CAAC,CAAC;IAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;sEACkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;CACjC;AAED,MAAM,WAAW,yBAAyB;IACxC;yDACqD;IACrD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,kCAAkC,CAAC,CAAC;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/usecase/dto/media/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAE7E,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,+BAA+B,CAAC,CAAC;IAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;sEACkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;CACjC;AAED,MAAM,WAAW,yBAAyB;IACxC;yDACqD;IACrD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,kCAAkC,CAAC,CAAC;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;2EAC2E;AAC3E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;iBAGiB;AACjB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js";
|
|
2
|
+
import type { MediaStorage } from "../../domain/port/MediaStorage.js";
|
|
3
|
+
/**
|
|
4
|
+
* `DeleteMediaAssetUseCase` — remove a committed asset (#434).
|
|
5
|
+
* Orchestrates the two-sided deletion the ports describe: delete every
|
|
6
|
+
* variant's R2 object via `MediaStorage.deleteObject`, then delete the
|
|
7
|
+
* `media_assets` row. Ordering matters — drop the objects first so a
|
|
8
|
+
* crash between the two leaves an orphan *row* (which the sweeper can
|
|
9
|
+
* reconcile from a bucket listing) rather than a dangling *reference*
|
|
10
|
+
* to bytes that are already gone.
|
|
11
|
+
*
|
|
12
|
+
* # Reference safety (v1 decision)
|
|
13
|
+
*
|
|
14
|
+
* Entries reference assets by id (`x-mantle-ref: media_assets`) with no
|
|
15
|
+
* reverse index. A full back-scan across every collection's JSON blobs
|
|
16
|
+
* to block/anonymise a referenced asset is O(all-content) per delete —
|
|
17
|
+
* too heavy for the admin path at this stage. v1 deletes cleanly and
|
|
18
|
+
* unconditionally; a stale reference resolves to null at render time
|
|
19
|
+
* (renderers already tolerate a missing asset). A cheap warn-on-
|
|
20
|
+
* reference (or a maintained reverse index) is a follow-up, not a
|
|
21
|
+
* blocker for shipping delete.
|
|
22
|
+
*/
|
|
23
|
+
export declare class DeleteMediaAssetUseCase {
|
|
24
|
+
private readonly storage;
|
|
25
|
+
private readonly assets;
|
|
26
|
+
constructor(storage: MediaStorage, assets: MediaAssetRepository);
|
|
27
|
+
execute(id: string): Promise<{
|
|
28
|
+
deleted: true;
|
|
29
|
+
variantsRemoved: number;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=DeleteMediaAssetUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteMediaAssetUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/media/DeleteMediaAssetUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGtE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,oBAAoB;IAGzC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;CAkC/E"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { DiagnosticError } from "@aotter/mantle-spec";
|
|
2
|
+
import { mediaAssetNotFoundDiagnostic } from "./diagnostics.js";
|
|
3
|
+
/**
|
|
4
|
+
* `DeleteMediaAssetUseCase` — remove a committed asset (#434).
|
|
5
|
+
* Orchestrates the two-sided deletion the ports describe: delete every
|
|
6
|
+
* variant's R2 object via `MediaStorage.deleteObject`, then delete the
|
|
7
|
+
* `media_assets` row. Ordering matters — drop the objects first so a
|
|
8
|
+
* crash between the two leaves an orphan *row* (which the sweeper can
|
|
9
|
+
* reconcile from a bucket listing) rather than a dangling *reference*
|
|
10
|
+
* to bytes that are already gone.
|
|
11
|
+
*
|
|
12
|
+
* # Reference safety (v1 decision)
|
|
13
|
+
*
|
|
14
|
+
* Entries reference assets by id (`x-mantle-ref: media_assets`) with no
|
|
15
|
+
* reverse index. A full back-scan across every collection's JSON blobs
|
|
16
|
+
* to block/anonymise a referenced asset is O(all-content) per delete —
|
|
17
|
+
* too heavy for the admin path at this stage. v1 deletes cleanly and
|
|
18
|
+
* unconditionally; a stale reference resolves to null at render time
|
|
19
|
+
* (renderers already tolerate a missing asset). A cheap warn-on-
|
|
20
|
+
* reference (or a maintained reverse index) is a follow-up, not a
|
|
21
|
+
* blocker for shipping delete.
|
|
22
|
+
*/
|
|
23
|
+
export class DeleteMediaAssetUseCase {
|
|
24
|
+
storage;
|
|
25
|
+
assets;
|
|
26
|
+
constructor(storage, assets) {
|
|
27
|
+
this.storage = storage;
|
|
28
|
+
this.assets = assets;
|
|
29
|
+
}
|
|
30
|
+
async execute(id) {
|
|
31
|
+
const asset = await this.assets.findById(id);
|
|
32
|
+
if (!asset) {
|
|
33
|
+
throw new DiagnosticError(mediaAssetNotFoundDiagnostic("usecase/DeleteMediaAsset", id));
|
|
34
|
+
}
|
|
35
|
+
// Attempt EVERY reachable object delete before touching the row —
|
|
36
|
+
// a single rejecting deleteObject must not abort the loop (which
|
|
37
|
+
// would leave both partial R2 objects AND the D1 row, contradicting
|
|
38
|
+
// the docstring's crash-safety invariant). Failures are collected,
|
|
39
|
+
// not thrown: orphan objects are the sweeper's job. A variant with
|
|
40
|
+
// no storageKey has no object to drop, so skip it rather than call
|
|
41
|
+
// deleteObject with an empty key.
|
|
42
|
+
const deletable = asset.variants.filter((v) => v.storageKey);
|
|
43
|
+
const results = await Promise.allSettled(deletable.map((variant) => this.storage.deleteObject({ storageKey: variant.storageKey })));
|
|
44
|
+
for (const r of results) {
|
|
45
|
+
if (r.status === "rejected") {
|
|
46
|
+
console.warn("[DeleteMediaAsset] object delete failed; leaving orphan for sweeper", r.reason);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Delete the row only after every reachable object delete was
|
|
50
|
+
// attempted — even if some failed (orphan objects are recoverable
|
|
51
|
+
// from a bucket listing; a dangling reference to gone bytes is not).
|
|
52
|
+
await this.assets.delete(id);
|
|
53
|
+
return { deleted: true, variantsRemoved: asset.variants.length };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=DeleteMediaAssetUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteMediaAssetUseCase.js","sourceRoot":"","sources":["../../../src/usecase/media/DeleteMediaAssetUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,uBAAuB;IAEf;IACA;IAFnB,YACmB,OAAqB,EACrB,MAA4B;QAD5B,YAAO,GAAP,OAAO,CAAc;QACrB,WAAM,GAAN,MAAM,CAAsB;IAC5C,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,eAAe,CACvB,4BAA4B,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAC7D,CAAC;QACJ,CAAC;QACD,kEAAkE;QAClE,iEAAiE;QACjE,oEAAoE;QACpE,mEAAmE;QACnE,mEAAmE;QACnE,mEAAmE;QACnE,kCAAkC;QAClC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACxB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAC9D,CACF,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,CACV,qEAAqE,EACrE,CAAC,CAAC,MAAM,CACT,CAAC;YACJ,CAAC;QACH,CAAC;QACD,8DAA8D;QAC9D,kEAAkE;QAClE,qEAAqE;QACrE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IACnE,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js";
|
|
2
|
+
import type { MediaAsset } from "../../domain/port/MediaStorage.js";
|
|
3
|
+
/**
|
|
4
|
+
* `GetMediaAssetUseCase` — one committed asset by id (#434). Throws
|
|
5
|
+
* `MEDIA_ASSET_NOT_FOUND` (404 on the wire) when absent, so the admin
|
|
6
|
+
* detail/picker surfaces get a structured 404 rather than a bare null.
|
|
7
|
+
*/
|
|
8
|
+
export declare class GetMediaAssetUseCase {
|
|
9
|
+
private readonly assets;
|
|
10
|
+
constructor(assets: MediaAssetRepository);
|
|
11
|
+
execute(id: string): Promise<MediaAsset>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=GetMediaAssetUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GetMediaAssetUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/media/GetMediaAssetUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAGpE;;;;GAIG;AACH,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,oBAAoB;IAEnD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAS/C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { DiagnosticError } from "@aotter/mantle-spec";
|
|
2
|
+
import { mediaAssetNotFoundDiagnostic } from "./diagnostics.js";
|
|
3
|
+
/**
|
|
4
|
+
* `GetMediaAssetUseCase` — one committed asset by id (#434). Throws
|
|
5
|
+
* `MEDIA_ASSET_NOT_FOUND` (404 on the wire) when absent, so the admin
|
|
6
|
+
* detail/picker surfaces get a structured 404 rather than a bare null.
|
|
7
|
+
*/
|
|
8
|
+
export class GetMediaAssetUseCase {
|
|
9
|
+
assets;
|
|
10
|
+
constructor(assets) {
|
|
11
|
+
this.assets = assets;
|
|
12
|
+
}
|
|
13
|
+
async execute(id) {
|
|
14
|
+
const asset = await this.assets.findById(id);
|
|
15
|
+
if (!asset) {
|
|
16
|
+
throw new DiagnosticError(mediaAssetNotFoundDiagnostic("usecase/GetMediaAsset", id));
|
|
17
|
+
}
|
|
18
|
+
return asset;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=GetMediaAssetUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GetMediaAssetUseCase.js","sourceRoot":"","sources":["../../../src/usecase/media/GetMediaAssetUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IACF;IAA7B,YAA6B,MAA4B;QAA5B,WAAM,GAAN,MAAM,CAAsB;IAAG,CAAC;IAE7D,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,eAAe,CACvB,4BAA4B,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAC1D,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MediaAssetListResult, MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js";
|
|
2
|
+
import type { ListMediaAssetsRequest } from "../dto/media/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* `ListMediaAssetsUseCase` — newest-first page of committed media
|
|
5
|
+
* assets for the admin media library (#434). Thin over
|
|
6
|
+
* `MediaAssetRepository.list`; the repo owns clamping + cursor
|
|
7
|
+
* round-tripping (shared with entry listing). No manifest lookup: the
|
|
8
|
+
* media library is a flat store, not a Schema collection.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ListMediaAssetsUseCase {
|
|
11
|
+
private readonly assets;
|
|
12
|
+
constructor(assets: MediaAssetRepository);
|
|
13
|
+
execute(request: ListMediaAssetsRequest): Promise<MediaAssetListResult>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=ListMediaAssetsUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListMediaAssetsUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/media/ListMediaAssetsUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE;;;;;;GAMG;AACH,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,oBAAoB;IAEnD,OAAO,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAO9E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ListMediaAssetsUseCase` — newest-first page of committed media
|
|
3
|
+
* assets for the admin media library (#434). Thin over
|
|
4
|
+
* `MediaAssetRepository.list`; the repo owns clamping + cursor
|
|
5
|
+
* round-tripping (shared with entry listing). No manifest lookup: the
|
|
6
|
+
* media library is a flat store, not a Schema collection.
|
|
7
|
+
*/
|
|
8
|
+
export class ListMediaAssetsUseCase {
|
|
9
|
+
assets;
|
|
10
|
+
constructor(assets) {
|
|
11
|
+
this.assets = assets;
|
|
12
|
+
}
|
|
13
|
+
async execute(request) {
|
|
14
|
+
return this.assets.list({
|
|
15
|
+
limit: request.limit,
|
|
16
|
+
cursor: request.cursor,
|
|
17
|
+
search: request.search,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ListMediaAssetsUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListMediaAssetsUseCase.js","sourceRoot":"","sources":["../../../src/usecase/media/ListMediaAssetsUseCase.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AACH,MAAM,OAAO,sBAAsB;IACJ;IAA7B,YAA6B,MAA4B;QAA5B,WAAM,GAAN,MAAM,CAAsB;IAAG,CAAC;IAE7D,KAAK,CAAC,OAAO,CAAC,OAA+B;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js";
|
|
2
|
+
import type { MediaAsset } from "../../domain/port/MediaStorage.js";
|
|
3
|
+
import type { UpdateMediaAssetRequest } from "../dto/media/index.js";
|
|
4
|
+
/**
|
|
5
|
+
* `UpdateMediaAssetUseCase` — patch alt/caption on a committed asset
|
|
6
|
+
* (#434). Variants/mime/bytes/createdAt are frozen at commit; only the
|
|
7
|
+
* two operator-authored text fields are mutable here. `save` upserts by
|
|
8
|
+
* id (the commit use case shares the same writer), so the read →
|
|
9
|
+
* merge → save round-trips the full row while touching only alt/caption.
|
|
10
|
+
*
|
|
11
|
+
* A field left `undefined` in the request is preserved; an empty string
|
|
12
|
+
* clears it. Rejects `MEDIA_ASSET_NOT_FOUND` when the id is absent so a
|
|
13
|
+
* PATCH against a deleted asset doesn't silently re-create a partial row.
|
|
14
|
+
*/
|
|
15
|
+
export declare class UpdateMediaAssetUseCase {
|
|
16
|
+
private readonly assets;
|
|
17
|
+
constructor(assets: MediaAssetRepository);
|
|
18
|
+
execute(request: UpdateMediaAssetRequest): Promise<MediaAsset>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=UpdateMediaAssetUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UpdateMediaAssetUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/media/UpdateMediaAssetUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGrE;;;;;;;;;;GAUG;AACH,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,oBAAoB;IAEnD,OAAO,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,UAAU,CAAC;CAerE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { DiagnosticError } from "@aotter/mantle-spec";
|
|
2
|
+
import { mediaAssetNotFoundDiagnostic } from "./diagnostics.js";
|
|
3
|
+
/**
|
|
4
|
+
* `UpdateMediaAssetUseCase` — patch alt/caption on a committed asset
|
|
5
|
+
* (#434). Variants/mime/bytes/createdAt are frozen at commit; only the
|
|
6
|
+
* two operator-authored text fields are mutable here. `save` upserts by
|
|
7
|
+
* id (the commit use case shares the same writer), so the read →
|
|
8
|
+
* merge → save round-trips the full row while touching only alt/caption.
|
|
9
|
+
*
|
|
10
|
+
* A field left `undefined` in the request is preserved; an empty string
|
|
11
|
+
* clears it. Rejects `MEDIA_ASSET_NOT_FOUND` when the id is absent so a
|
|
12
|
+
* PATCH against a deleted asset doesn't silently re-create a partial row.
|
|
13
|
+
*/
|
|
14
|
+
export class UpdateMediaAssetUseCase {
|
|
15
|
+
assets;
|
|
16
|
+
constructor(assets) {
|
|
17
|
+
this.assets = assets;
|
|
18
|
+
}
|
|
19
|
+
async execute(request) {
|
|
20
|
+
const existing = await this.assets.findById(request.id);
|
|
21
|
+
if (!existing) {
|
|
22
|
+
throw new DiagnosticError(mediaAssetNotFoundDiagnostic("usecase/UpdateMediaAsset", request.id));
|
|
23
|
+
}
|
|
24
|
+
const next = {
|
|
25
|
+
...existing,
|
|
26
|
+
alt: request.alt !== undefined ? request.alt : existing.alt,
|
|
27
|
+
caption: request.caption !== undefined ? request.caption : existing.caption,
|
|
28
|
+
};
|
|
29
|
+
await this.assets.save(next);
|
|
30
|
+
return next;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=UpdateMediaAssetUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UpdateMediaAssetUseCase.js","sourceRoot":"","sources":["../../../src/usecase/media/UpdateMediaAssetUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAItD,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;;;;;;;;;GAUG;AACH,MAAM,OAAO,uBAAuB;IACL;IAA7B,YAA6B,MAA4B;QAA5B,WAAM,GAAN,MAAM,CAAsB;IAAG,CAAC;IAE7D,KAAK,CAAC,OAAO,CAAC,OAAgC;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,eAAe,CACvB,4BAA4B,CAAC,0BAA0B,EAAE,OAAO,CAAC,EAAE,CAAC,CACrE,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAe;YACvB,GAAG,QAAQ;YACX,GAAG,EAAE,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG;YAC3D,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO;SAC5E,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export { CreateMediaUploadUseCase } from "./CreateMediaUploadUseCase.js";
|
|
2
2
|
export { CommitMediaUploadUseCase } from "./CommitMediaUploadUseCase.js";
|
|
3
|
+
export { ListMediaAssetsUseCase } from "./ListMediaAssetsUseCase.js";
|
|
4
|
+
export { GetMediaAssetUseCase } from "./GetMediaAssetUseCase.js";
|
|
5
|
+
export { UpdateMediaAssetUseCase } from "./UpdateMediaAssetUseCase.js";
|
|
6
|
+
export { DeleteMediaAssetUseCase } from "./DeleteMediaAssetUseCase.js";
|
|
3
7
|
export { DEFAULT_MAX_BYTES, MEDIA_MIME_ALLOWLIST, MEDIA_SVG_MIME, PENDING_UPLOAD_KV_PREFIX, PENDING_UPLOAD_KV_TTL_SECONDS, UPLOAD_URL_TTL_SECONDS, extensionForMime, isAllowedMime, type MediaMimeType, } from "./mediaAllowlist.js";
|
|
4
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/usecase/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/usecase/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export { CreateMediaUploadUseCase } from "./CreateMediaUploadUseCase.js";
|
|
2
2
|
export { CommitMediaUploadUseCase } from "./CommitMediaUploadUseCase.js";
|
|
3
|
+
export { ListMediaAssetsUseCase } from "./ListMediaAssetsUseCase.js";
|
|
4
|
+
export { GetMediaAssetUseCase } from "./GetMediaAssetUseCase.js";
|
|
5
|
+
export { UpdateMediaAssetUseCase } from "./UpdateMediaAssetUseCase.js";
|
|
6
|
+
export { DeleteMediaAssetUseCase } from "./DeleteMediaAssetUseCase.js";
|
|
3
7
|
export { DEFAULT_MAX_BYTES, MEDIA_MIME_ALLOWLIST, MEDIA_SVG_MIME, PENDING_UPLOAD_KV_PREFIX, PENDING_UPLOAD_KV_TTL_SECONDS, UPLOAD_URL_TTL_SECONDS, extensionForMime, isAllowedMime, } from "./mediaAllowlist.js";
|
|
4
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/usecase/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GAEd,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/usecase/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GAEd,MAAM,qBAAqB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aotter/mantle-runtime",
|
|
3
|
-
"version": "0.0.11-alpha.
|
|
3
|
+
"version": "0.0.11-alpha.44",
|
|
4
4
|
"description": "Runtime engine for mantle: dispatcher + entry-writer + view executor + content-ops + render pipeline + auth + MCP. Defines adapter-agnostic ports. MUST NOT import D1Database / KVNamespace types.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://mantle.tools/",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"README.md"
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@aotter/mantle-spec": "0.0.11-alpha.
|
|
32
|
+
"@aotter/mantle-spec": "0.0.11-alpha.44"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"zod": "^4.0.0"
|