@webiny/api-headless-cms-sql 0.0.0-unstable.9f53ea597d → 0.0.0-unstable.a4f3e4ea8b

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.
@@ -239,6 +239,17 @@ const createEntriesStorageOperations = (params)=>{
239
239
  await syncToLatest(se);
240
240
  return entry;
241
241
  },
242
+ updateRevision: async (model, { entry, storageEntry })=>{
243
+ await entryTableManager.ensureTable();
244
+ const existing = await query().where("id", storageEntry.id).first();
245
+ const se = storageEntry;
246
+ se.isLatest = existing?.isLatest ?? se.isLatest;
247
+ se.isPublished = existing?.isPublished ?? se.isPublished;
248
+ const row = entryToRow(se);
249
+ const { isLatest: _il, isPublished: _ip, ...rowWithoutFlags } = row;
250
+ await query().where("tenant", model.tenant).andWhere("id", storageEntry.id).update(rowWithoutFlags);
251
+ return entry;
252
+ },
242
253
  publish: async (model, { entry, storageEntry })=>{
243
254
  await entryTableManager.ensureTable();
244
255
  const oldPublishedRows = await query().where("tenant", model.tenant).andWhere("entryId", entry.entryId).andWhere("isPublished", true);
@@ -1 +1 @@
1
- {"version":3,"file":"operations/entry/index.js","sources":["../../../src/operations/entry/index.ts"],"sourcesContent":["import type { Knex } from \"knex\";\nimport type {\n CmsEntry,\n CmsEntryListWhere,\n CmsEntryStorageOperations,\n CmsEntryValues,\n CmsModel,\n CmsStorageEntry\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport type { PluginsContainer } from \"@webiny/plugins\";\nimport type { CmsContext } from \"~/types.js\";\nimport type { EntryTableManager } from \"~/features/entryTableManager/abstractions.js\";\nimport type { IEntryRow } from \"./types.js\";\nimport { entryToRow, rowToEntry, mergeEntryLevelMeta } from \"./mappers.js\";\nimport { StorageTransformRegistry } from \"@webiny/api-headless-cms/exports/api/cms/storage.js\";\nimport { decodeCursor, encodeCursor } from \"@webiny/utils\";\nimport { ValueFilterRegistry } from \"@webiny/db-utils\";\nimport {\n createFields,\n filter,\n sort,\n createStorageModelAccessor,\n createStorageTransformCallable,\n aggregateUniqueFieldValues\n} from \"@webiny/api-headless-cms-storage\";\nimport { KnexClient } from \"@webiny/api-core-sql\";\n\ninterface CreateEntriesStorageOperationsParams {\n knex: KnexClient.Interface;\n entryTableManager: EntryTableManager.Interface;\n container: CmsContext[\"container\"];\n plugins: PluginsContainer;\n}\n\nconst MAX_LIST_LIMIT = 1000000;\n\nconst extractEntryId = (id: string): string => {\n const hashIdx = id.indexOf(\"#\");\n\n if (hashIdx === -1) {\n return id;\n }\n\n return id.slice(0, hashIdx);\n};\n\nexport const createEntriesStorageOperations = (\n params: CreateEntriesStorageOperationsParams\n): CmsEntryStorageOperations => {\n const { knex, entryTableManager, container, plugins } = params;\n\n const storageTransformRegistry = container.resolve(StorageTransformRegistry);\n const { getModel: getStorageOperationsModel } = createStorageModelAccessor(plugins);\n\n const query = (): Knex.QueryBuilder<IEntryRow> => {\n return knex.client<IEntryRow>(entryTableManager.getTableName());\n };\n\n /*\n * Syncs entry-level meta to the latest revision only.\n * Also patches additional fields (e.g., live) if provided.\n */\n const syncToLatest = async (\n entry: CmsStorageEntry,\n extraPatch?: (latest: CmsEntry) => void\n ): Promise<void> => {\n if (entry.isLatest) {\n return;\n }\n\n const latestRow = await query()\n .where(\"entryId\", entry.entryId)\n .andWhere(\"isLatest\", true)\n .first();\n\n if (!latestRow) {\n return;\n }\n\n const latest = JSON.parse(latestRow.data);\n const merged = mergeEntryLevelMeta(entry, latest);\n\n if (extraPatch) {\n extraPatch(merged);\n }\n\n await query()\n .where(\"id\", latestRow.id)\n .update({ data: JSON.stringify(merged) });\n };\n\n /*\n * Patches the data blob on all revisions of an entry.\n * Used by move, moveToBin, restoreFromBin where every revision's data must be updated.\n */\n const patchAllRevisions = async (\n entryId: string,\n tenant: string,\n patch: (entry: CmsEntry) => void,\n columnUpdates?: Partial<IEntryRow>\n ): Promise<void> => {\n const rows = await query().where(\"tenant\", tenant).where(\"entryId\", entryId);\n\n if (rows.length === 0) {\n return;\n }\n\n const cases: Array<{ id: string; data: string }> = rows.map((row: IEntryRow) => {\n const parsed = JSON.parse(row.data);\n patch(parsed);\n return { id: row.id, data: JSON.stringify(parsed) };\n });\n\n const update: Record<string, unknown> = {\n data: knex.client.raw(\n `CASE id ${cases.map(() => \"WHEN ? THEN ?\").join(\" \")} END`,\n cases.flatMap((c: { id: string; data: string }) => [c.id, c.data])\n ),\n ...columnUpdates\n };\n\n await query().where(\"tenant\", tenant).where(\"entryId\", entryId).update(update);\n };\n\n const listEntries = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: {\n where: CmsEntryListWhere;\n sort?: string[];\n search?: string;\n fields?: string[];\n limit: number;\n after?: string | null;\n }\n ) => {\n await entryTableManager.ensureTable();\n\n const model = getStorageOperationsModel(initialModel);\n const {\n where: initialWhere,\n sort: sortBy,\n search,\n fields: searchFields,\n limit: initialLimit,\n after\n } = params;\n\n const limit =\n initialLimit <= 0 || initialLimit >= MAX_LIST_LIMIT ? MAX_LIST_LIMIT : initialLimit;\n\n const qb = query().where(\"tenant\", model.tenant).andWhere(\"modelId\", model.modelId);\n\n if (initialWhere.entryId) {\n qb.andWhere(\"entryId\", initialWhere.entryId);\n } else if (initialWhere.published === true) {\n qb.andWhere(\"isPublished\", true);\n } else {\n qb.andWhere(\"isLatest\", true);\n }\n\n if (initialWhere.wbyDeleted !== undefined) {\n qb.andWhere(\"wbyDeleted\", initialWhere.wbyDeleted);\n } else {\n qb.andWhere(\"wbyDeleted\", false);\n }\n\n const rows: IEntryRow[] = await qb;\n\n if (rows.length === 0) {\n return {\n hasMoreItems: false,\n totalCount: 0,\n cursor: null,\n items: [] as CmsEntry<T>[]\n };\n }\n\n const fromStorage = createStorageTransformCallable(storageTransformRegistry, model);\n\n const records = await Promise.all(\n rows.map(async row => {\n const entry = rowToEntry(row) as CmsStorageEntry;\n\n for (const field of model.fields) {\n entry.values[field.fieldId] = await fromStorage(\n field,\n entry.values[field.fieldId]\n );\n }\n\n return entry as CmsEntry<T>;\n })\n );\n\n const where: Partial<CmsEntryListWhere> = { ...initialWhere };\n delete where[\"published\"];\n delete where[\"latest\"];\n delete where[\"entryId\"];\n delete where[\"wbyDeleted\"];\n\n const modelFields = createFields({\n plugins,\n fields: model.fields\n });\n\n const valueFilterRegistry = container.resolve(ValueFilterRegistry);\n\n const filteredItems = filter<T>({\n items: records,\n where,\n plugins,\n fields: modelFields,\n fullTextSearch: {\n term: search,\n fields: searchFields || []\n },\n valueFilterRegistry\n });\n\n const totalCount = filteredItems.length;\n\n const sortedItems = sort<T>({\n model,\n plugins,\n items: filteredItems,\n sort: sortBy,\n fields: modelFields\n });\n\n const start = parseInt((decodeCursor(after) as string) || \"0\") || 0;\n const hasMoreItems = totalCount > start + limit;\n const slicedItems = sortedItems.slice(start, start + limit);\n const cursor = encodeCursor(`${start + limit}`);\n\n return {\n hasMoreItems,\n totalCount,\n cursor,\n items: slicedItems\n };\n };\n\n return {\n getByIds: async (model, { ids }) => {\n await entryTableManager.ensureTable();\n\n const idList = ids as string[];\n\n const rows: IEntryRow[] = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .whereIn(\"id\", idList);\n\n const entries = rows.map(row => rowToEntry(row));\n const byId = new Map(entries.map(e => [e.id, e]));\n\n return idList.map(id => byId.get(id)).filter(Boolean) as typeof entries;\n },\n\n getPublishedByIds: async (model, { ids }) => {\n await entryTableManager.ensureTable();\n\n const idList = ids as string[];\n const entryIds = idList.map(extractEntryId);\n\n const rows: IEntryRow[] = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .whereIn(\"entryId\", entryIds)\n .andWhere(\"isPublished\", true);\n\n const entries = rows.map(row => rowToEntry(row));\n const byEntryId = new Map(entries.map(e => [e.entryId, e]));\n\n return entryIds.map(eid => byEntryId.get(eid)).filter(Boolean) as typeof entries;\n },\n\n getLatestByIds: async (model, { ids }) => {\n await entryTableManager.ensureTable();\n\n const idList = ids as string[];\n const entryIds = idList.map(extractEntryId);\n\n const rows: IEntryRow[] = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .whereIn(\"entryId\", entryIds)\n .andWhere(\"isLatest\", true);\n\n const entries = rows.map(row => rowToEntry(row));\n const byEntryId = new Map(entries.map(e => [e.entryId, e]));\n\n return entryIds.map(eid => byEntryId.get(eid)).filter(Boolean) as typeof entries;\n },\n\n getRevisions: async (model, { id }) => {\n await entryTableManager.ensureTable();\n\n const entryId = extractEntryId(id);\n\n const rows: IEntryRow[] = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .where(\"entryId\", entryId)\n .orderBy(\"version\", \"desc\");\n\n return rows.map(row => rowToEntry(row));\n },\n\n getRevisionById: async (model, { id }) => {\n await entryTableManager.ensureTable();\n\n const row = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .where(\"id\", id)\n .first();\n\n if (!row) {\n return null;\n }\n\n return rowToEntry(row);\n },\n\n getPublishedRevisionByEntryId: async (model, { id }) => {\n await entryTableManager.ensureTable();\n\n const entryId = extractEntryId(id);\n\n const row = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .where(\"entryId\", entryId)\n .andWhere(\"isPublished\", true)\n .first();\n\n if (!row) {\n return null;\n }\n\n return rowToEntry(row);\n },\n\n getLatestRevisionByEntryId: async (model, { id }) => {\n await entryTableManager.ensureTable();\n\n const entryId = extractEntryId(id);\n\n const row = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .where(\"entryId\", entryId)\n .andWhere(\"isLatest\", true)\n .first();\n\n if (!row) {\n return null;\n }\n\n return rowToEntry(row);\n },\n\n getPreviousRevision: async (model, { entryId, version }) => {\n await entryTableManager.ensureTable();\n\n const row = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .where(\"entryId\", entryId)\n .andWhere(\"version\", \"<\", version)\n .orderBy(\"version\", \"desc\")\n .first();\n\n if (!row) {\n return null;\n }\n\n return rowToEntry(row);\n },\n\n get: async (model, params) => {\n const { items } = await listEntries(model, {\n ...params,\n limit: 1\n });\n\n return items.shift() || null;\n },\n\n list: async (model, params) => {\n return listEntries(model, params);\n },\n\n create: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n /* Enforce invariant: newly created entries are always latest. */\n const se = storageEntry as CmsStorageEntry;\n se.isLatest = true;\n se.isPublished = se.status === \"published\";\n\n const row = entryToRow(se);\n\n await query().insert(row);\n\n return entry;\n },\n\n createRevisionFrom: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n const isPublished = entry.status === \"published\";\n\n /* Mark old latest as no longer latest — patch data blob too. */\n const oldLatestRows = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"entryId\", entry.entryId)\n .andWhere(\"isLatest\", true);\n\n for (const row of oldLatestRows) {\n const parsed = JSON.parse(row.data);\n parsed.isLatest = false;\n\n await query()\n .where(\"id\", row.id)\n .update({\n isLatest: false,\n data: JSON.stringify(parsed)\n });\n }\n\n /* If new revision is published, unpublish old published — patch data blob too. */\n if (isPublished) {\n const oldPublishedRows = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"entryId\", entry.entryId)\n .andWhere(\"isPublished\", true);\n\n for (const row of oldPublishedRows) {\n const parsed = JSON.parse(row.data);\n parsed.isPublished = false;\n parsed.status = \"unpublished\";\n\n await query()\n .where(\"id\", row.id)\n .update({\n isPublished: false,\n data: JSON.stringify(parsed)\n });\n }\n }\n\n /* Enforce invariant: new revision is always latest. */\n const se = storageEntry as CmsStorageEntry;\n se.isLatest = true;\n se.isPublished = isPublished;\n\n const row = entryToRow(se);\n\n await query().insert(row);\n\n return entry;\n },\n\n update: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n /* Read current DB flags so the data blob stays in sync with indexed columns. */\n const existing = await query().where(\"id\", storageEntry.id).first();\n const se = storageEntry as CmsStorageEntry;\n se.isLatest = existing?.isLatest ?? se.isLatest;\n se.isPublished = existing?.isPublished ?? se.isPublished;\n\n const row = entryToRow(se);\n\n /* Strip flags from column update — they are already correct in DB. */\n const { isLatest: _il, isPublished: _ip, ...rowWithoutFlags } = row;\n\n await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"id\", storageEntry.id)\n .update(rowWithoutFlags);\n\n /* Sync entry-level meta to the latest revision. */\n await syncToLatest(se);\n\n return entry;\n },\n\n publish: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n /* Step 1: Unpublish old published — patch data blob (status, isPublished). */\n const oldPublishedRows = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"entryId\", entry.entryId)\n .andWhere(\"isPublished\", true);\n\n for (const row of oldPublishedRows) {\n const parsed = JSON.parse(row.data);\n parsed.isPublished = false;\n parsed.status = \"unpublished\";\n\n await query()\n .where(\"id\", row.id)\n .update({\n isPublished: false,\n data: JSON.stringify(parsed)\n });\n }\n\n /* Step 2: Read current isLatest from DB so the data blob stays in sync. */\n const existing = await query().where(\"id\", storageEntry.id).first();\n const se = storageEntry as CmsStorageEntry;\n se.isLatest = existing?.isLatest ?? se.isLatest;\n se.isPublished = true;\n\n const row = entryToRow(se);\n const { isLatest: _il, ...rowWithoutIsLatest } = row;\n\n await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"id\", storageEntry.id)\n .update(rowWithoutIsLatest);\n\n /* Step 3: Sync entry-level meta + live to the latest revision. */\n const liveValue = { version: entry.version };\n\n await syncToLatest(se, latest => {\n latest.live = liveValue;\n });\n\n return entry;\n },\n\n unpublish: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n /* Read current isLatest from DB so the data blob stays in sync. */\n const existing = await query().where(\"id\", storageEntry.id).first();\n const se = storageEntry as CmsStorageEntry;\n se.isLatest = existing?.isLatest ?? se.isLatest;\n se.isPublished = false;\n\n const row = entryToRow(se);\n const { isLatest: _il, ...rowWithoutIsLatest } = row;\n\n await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"id\", storageEntry.id)\n .update(rowWithoutIsLatest);\n\n /* Sync entry-level meta + live=null to the latest revision. */\n await syncToLatest(se, latest => {\n latest.live = null;\n });\n\n return entry;\n },\n\n move: async (model, id, folderId) => {\n await entryTableManager.ensureTable();\n\n const entryId = extractEntryId(id);\n\n await patchAllRevisions(entryId, model.tenant, parsed => {\n parsed.location = { folderId };\n });\n },\n\n moveToBin: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n await patchAllRevisions(\n entry.entryId,\n model.tenant,\n parsed => {\n const p = parsed as unknown as Record<string, unknown>;\n p[\"wbyDeleted\"] = true;\n p[\"binOriginalFolderId\"] = storageEntry.binOriginalFolderId ?? null;\n p[\"location\"] = storageEntry.location ?? null;\n\n /* Sync entry-level meta into each revision's data. */\n const fields = Object.keys(storageEntry);\n for (const field of fields) {\n if (field === \"createdOn\" || field === \"createdBy\") {\n continue;\n }\n if (\n (field.endsWith(\"On\") || field.endsWith(\"By\")) &&\n !field.startsWith(\"revision\")\n ) {\n p[field] = (storageEntry as Record<string, unknown>)[field];\n }\n }\n },\n { wbyDeleted: true }\n );\n },\n\n restoreFromBin: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n await patchAllRevisions(\n entry.entryId,\n model.tenant,\n parsed => {\n const p = parsed as unknown as Record<string, unknown>;\n p[\"wbyDeleted\"] = false;\n p[\"binOriginalFolderId\"] = null;\n p[\"location\"] = storageEntry.location ?? null;\n\n /* Sync entry-level meta into each revision's data. */\n const fields = Object.keys(storageEntry);\n for (const field of fields) {\n if (field === \"createdOn\" || field === \"createdBy\") {\n continue;\n }\n if (\n (field.endsWith(\"On\") || field.endsWith(\"By\")) &&\n !field.startsWith(\"revision\")\n ) {\n p[field] = (storageEntry as Record<string, unknown>)[field];\n }\n }\n },\n { wbyDeleted: false }\n );\n\n return entry;\n },\n\n deleteRevision: async (model, { storageEntry, latestStorageEntry }) => {\n await entryTableManager.ensureTable();\n\n const wasPublished = storageEntry.status === \"published\";\n\n await query().where(\"tenant\", model.tenant).andWhere(\"id\", storageEntry.id).delete();\n\n /* If deleted row was published: clear live on all remaining rows. */\n if (wasPublished) {\n await patchAllRevisions(storageEntry.entryId, model.tenant, parsed => {\n parsed.live = null;\n });\n }\n\n /* If latestStorageEntry is provided: promote it as latest. */\n if (latestStorageEntry) {\n const latestParsed = structuredClone(latestStorageEntry);\n latestParsed.isLatest = true;\n\n if (wasPublished) {\n latestParsed.live = null;\n }\n\n const latestRow = entryToRow(latestParsed as CmsStorageEntry);\n\n await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"id\", latestStorageEntry.id)\n .update(latestRow);\n }\n },\n\n delete: async (model, { entry }) => {\n await entryTableManager.ensureTable();\n\n const entryId = extractEntryId(entry.id);\n\n await query().where(\"tenant\", model.tenant).andWhere(\"entryId\", entryId).delete();\n },\n\n deleteMultipleEntries: async (model, { entries }) => {\n await entryTableManager.ensureTable();\n\n const entryIds = entries.map(extractEntryId);\n\n await query().where(\"tenant\", model.tenant).whereIn(\"entryId\", entryIds).delete();\n },\n\n getUniqueFieldValues: async (model, params) => {\n const { where, fieldId } = params;\n\n const field = model.fields.find(f => f.fieldId === fieldId);\n\n if (!field) {\n return [];\n }\n\n const { items } = await listEntries(model, {\n where,\n limit: MAX_LIST_LIMIT\n });\n\n return aggregateUniqueFieldValues(items, field.fieldId);\n }\n } as CmsEntryStorageOperations;\n};\n"],"names":["MAX_LIST_LIMIT","extractEntryId","id","hashIdx","createEntriesStorageOperations","params","knex","entryTableManager","container","plugins","storageTransformRegistry","StorageTransformRegistry","getStorageOperationsModel","createStorageModelAccessor","query","syncToLatest","entry","extraPatch","latestRow","latest","JSON","merged","mergeEntryLevelMeta","patchAllRevisions","entryId","tenant","patch","columnUpdates","rows","cases","row","parsed","update","c","listEntries","initialModel","model","initialWhere","sortBy","search","searchFields","initialLimit","after","limit","qb","undefined","fromStorage","createStorageTransformCallable","records","Promise","rowToEntry","field","where","modelFields","createFields","valueFilterRegistry","ValueFilterRegistry","filteredItems","filter","totalCount","sortedItems","sort","start","parseInt","decodeCursor","hasMoreItems","slicedItems","cursor","encodeCursor","ids","idList","entries","byId","Map","e","Boolean","entryIds","byEntryId","eid","version","items","storageEntry","se","entryToRow","isPublished","oldLatestRows","oldPublishedRows","existing","_il","_ip","rowWithoutFlags","rowWithoutIsLatest","liveValue","folderId","p","fields","Object","latestStorageEntry","wasPublished","latestParsed","structuredClone","fieldId","f","aggregateUniqueFieldValues"],"mappings":"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"}
1
+ {"version":3,"file":"operations/entry/index.js","sources":["../../../src/operations/entry/index.ts"],"sourcesContent":["import type { Knex } from \"knex\";\nimport type {\n CmsEntry,\n CmsEntryListWhere,\n CmsEntryStorageOperations,\n CmsEntryValues,\n CmsModel,\n CmsStorageEntry\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport type { PluginsContainer } from \"@webiny/plugins\";\nimport type { CmsContext } from \"~/types.js\";\nimport type { EntryTableManager } from \"~/features/entryTableManager/abstractions.js\";\nimport type { IEntryRow } from \"./types.js\";\nimport { entryToRow, rowToEntry, mergeEntryLevelMeta } from \"./mappers.js\";\nimport { StorageTransformRegistry } from \"@webiny/api-headless-cms/exports/api/cms/storage.js\";\nimport { decodeCursor, encodeCursor } from \"@webiny/utils\";\nimport { ValueFilterRegistry } from \"@webiny/db-utils\";\nimport {\n createFields,\n filter,\n sort,\n createStorageModelAccessor,\n createStorageTransformCallable,\n aggregateUniqueFieldValues\n} from \"@webiny/api-headless-cms-storage\";\nimport { KnexClient } from \"@webiny/api-core-sql\";\n\ninterface CreateEntriesStorageOperationsParams {\n knex: KnexClient.Interface;\n entryTableManager: EntryTableManager.Interface;\n container: CmsContext[\"container\"];\n plugins: PluginsContainer;\n}\n\nconst MAX_LIST_LIMIT = 1000000;\n\nconst extractEntryId = (id: string): string => {\n const hashIdx = id.indexOf(\"#\");\n\n if (hashIdx === -1) {\n return id;\n }\n\n return id.slice(0, hashIdx);\n};\n\nexport const createEntriesStorageOperations = (\n params: CreateEntriesStorageOperationsParams\n): CmsEntryStorageOperations => {\n const { knex, entryTableManager, container, plugins } = params;\n\n const storageTransformRegistry = container.resolve(StorageTransformRegistry);\n const { getModel: getStorageOperationsModel } = createStorageModelAccessor(plugins);\n\n const query = (): Knex.QueryBuilder<IEntryRow> => {\n return knex.client<IEntryRow>(entryTableManager.getTableName());\n };\n\n /*\n * Syncs entry-level meta to the latest revision only.\n * Also patches additional fields (e.g., live) if provided.\n */\n const syncToLatest = async (\n entry: CmsStorageEntry,\n extraPatch?: (latest: CmsEntry) => void\n ): Promise<void> => {\n if (entry.isLatest) {\n return;\n }\n\n const latestRow = await query()\n .where(\"entryId\", entry.entryId)\n .andWhere(\"isLatest\", true)\n .first();\n\n if (!latestRow) {\n return;\n }\n\n const latest = JSON.parse(latestRow.data);\n const merged = mergeEntryLevelMeta(entry, latest);\n\n if (extraPatch) {\n extraPatch(merged);\n }\n\n await query()\n .where(\"id\", latestRow.id)\n .update({ data: JSON.stringify(merged) });\n };\n\n /*\n * Patches the data blob on all revisions of an entry.\n * Used by move, moveToBin, restoreFromBin where every revision's data must be updated.\n */\n const patchAllRevisions = async (\n entryId: string,\n tenant: string,\n patch: (entry: CmsEntry) => void,\n columnUpdates?: Partial<IEntryRow>\n ): Promise<void> => {\n const rows = await query().where(\"tenant\", tenant).where(\"entryId\", entryId);\n\n if (rows.length === 0) {\n return;\n }\n\n const cases: Array<{ id: string; data: string }> = rows.map((row: IEntryRow) => {\n const parsed = JSON.parse(row.data);\n patch(parsed);\n return { id: row.id, data: JSON.stringify(parsed) };\n });\n\n const update: Record<string, unknown> = {\n data: knex.client.raw(\n `CASE id ${cases.map(() => \"WHEN ? THEN ?\").join(\" \")} END`,\n cases.flatMap((c: { id: string; data: string }) => [c.id, c.data])\n ),\n ...columnUpdates\n };\n\n await query().where(\"tenant\", tenant).where(\"entryId\", entryId).update(update);\n };\n\n const listEntries = async <T extends CmsEntryValues = CmsEntryValues>(\n initialModel: CmsModel,\n params: {\n where: CmsEntryListWhere;\n sort?: string[];\n search?: string;\n fields?: string[];\n limit: number;\n after?: string | null;\n }\n ) => {\n await entryTableManager.ensureTable();\n\n const model = getStorageOperationsModel(initialModel);\n const {\n where: initialWhere,\n sort: sortBy,\n search,\n fields: searchFields,\n limit: initialLimit,\n after\n } = params;\n\n const limit =\n initialLimit <= 0 || initialLimit >= MAX_LIST_LIMIT ? MAX_LIST_LIMIT : initialLimit;\n\n const qb = query().where(\"tenant\", model.tenant).andWhere(\"modelId\", model.modelId);\n\n if (initialWhere.entryId) {\n qb.andWhere(\"entryId\", initialWhere.entryId);\n } else if (initialWhere.published === true) {\n qb.andWhere(\"isPublished\", true);\n } else {\n qb.andWhere(\"isLatest\", true);\n }\n\n if (initialWhere.wbyDeleted !== undefined) {\n qb.andWhere(\"wbyDeleted\", initialWhere.wbyDeleted);\n } else {\n qb.andWhere(\"wbyDeleted\", false);\n }\n\n const rows: IEntryRow[] = await qb;\n\n if (rows.length === 0) {\n return {\n hasMoreItems: false,\n totalCount: 0,\n cursor: null,\n items: [] as CmsEntry<T>[]\n };\n }\n\n const fromStorage = createStorageTransformCallable(storageTransformRegistry, model);\n\n const records = await Promise.all(\n rows.map(async row => {\n const entry = rowToEntry(row) as CmsStorageEntry;\n\n for (const field of model.fields) {\n entry.values[field.fieldId] = await fromStorage(\n field,\n entry.values[field.fieldId]\n );\n }\n\n return entry as CmsEntry<T>;\n })\n );\n\n const where: Partial<CmsEntryListWhere> = { ...initialWhere };\n delete where[\"published\"];\n delete where[\"latest\"];\n delete where[\"entryId\"];\n delete where[\"wbyDeleted\"];\n\n const modelFields = createFields({\n plugins,\n fields: model.fields\n });\n\n const valueFilterRegistry = container.resolve(ValueFilterRegistry);\n\n const filteredItems = filter<T>({\n items: records,\n where,\n plugins,\n fields: modelFields,\n fullTextSearch: {\n term: search,\n fields: searchFields || []\n },\n valueFilterRegistry\n });\n\n const totalCount = filteredItems.length;\n\n const sortedItems = sort<T>({\n model,\n plugins,\n items: filteredItems,\n sort: sortBy,\n fields: modelFields\n });\n\n const start = parseInt((decodeCursor(after) as string) || \"0\") || 0;\n const hasMoreItems = totalCount > start + limit;\n const slicedItems = sortedItems.slice(start, start + limit);\n const cursor = encodeCursor(`${start + limit}`);\n\n return {\n hasMoreItems,\n totalCount,\n cursor,\n items: slicedItems\n };\n };\n\n return {\n getByIds: async (model, { ids }) => {\n await entryTableManager.ensureTable();\n\n const idList = ids as string[];\n\n const rows: IEntryRow[] = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .whereIn(\"id\", idList);\n\n const entries = rows.map(row => rowToEntry(row));\n const byId = new Map(entries.map(e => [e.id, e]));\n\n return idList.map(id => byId.get(id)).filter(Boolean) as typeof entries;\n },\n\n getPublishedByIds: async (model, { ids }) => {\n await entryTableManager.ensureTable();\n\n const idList = ids as string[];\n const entryIds = idList.map(extractEntryId);\n\n const rows: IEntryRow[] = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .whereIn(\"entryId\", entryIds)\n .andWhere(\"isPublished\", true);\n\n const entries = rows.map(row => rowToEntry(row));\n const byEntryId = new Map(entries.map(e => [e.entryId, e]));\n\n return entryIds.map(eid => byEntryId.get(eid)).filter(Boolean) as typeof entries;\n },\n\n getLatestByIds: async (model, { ids }) => {\n await entryTableManager.ensureTable();\n\n const idList = ids as string[];\n const entryIds = idList.map(extractEntryId);\n\n const rows: IEntryRow[] = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .whereIn(\"entryId\", entryIds)\n .andWhere(\"isLatest\", true);\n\n const entries = rows.map(row => rowToEntry(row));\n const byEntryId = new Map(entries.map(e => [e.entryId, e]));\n\n return entryIds.map(eid => byEntryId.get(eid)).filter(Boolean) as typeof entries;\n },\n\n getRevisions: async (model, { id }) => {\n await entryTableManager.ensureTable();\n\n const entryId = extractEntryId(id);\n\n const rows: IEntryRow[] = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .where(\"entryId\", entryId)\n .orderBy(\"version\", \"desc\");\n\n return rows.map(row => rowToEntry(row));\n },\n\n getRevisionById: async (model, { id }) => {\n await entryTableManager.ensureTable();\n\n const row = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .where(\"id\", id)\n .first();\n\n if (!row) {\n return null;\n }\n\n return rowToEntry(row);\n },\n\n getPublishedRevisionByEntryId: async (model, { id }) => {\n await entryTableManager.ensureTable();\n\n const entryId = extractEntryId(id);\n\n const row = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .where(\"entryId\", entryId)\n .andWhere(\"isPublished\", true)\n .first();\n\n if (!row) {\n return null;\n }\n\n return rowToEntry(row);\n },\n\n getLatestRevisionByEntryId: async (model, { id }) => {\n await entryTableManager.ensureTable();\n\n const entryId = extractEntryId(id);\n\n const row = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .where(\"entryId\", entryId)\n .andWhere(\"isLatest\", true)\n .first();\n\n if (!row) {\n return null;\n }\n\n return rowToEntry(row);\n },\n\n getPreviousRevision: async (model, { entryId, version }) => {\n await entryTableManager.ensureTable();\n\n const row = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"modelId\", model.modelId)\n .where(\"entryId\", entryId)\n .andWhere(\"version\", \"<\", version)\n .orderBy(\"version\", \"desc\")\n .first();\n\n if (!row) {\n return null;\n }\n\n return rowToEntry(row);\n },\n\n get: async (model, params) => {\n const { items } = await listEntries(model, {\n ...params,\n limit: 1\n });\n\n return items.shift() || null;\n },\n\n list: async (model, params) => {\n return listEntries(model, params);\n },\n\n create: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n /* Enforce invariant: newly created entries are always latest. */\n const se = storageEntry as CmsStorageEntry;\n se.isLatest = true;\n se.isPublished = se.status === \"published\";\n\n const row = entryToRow(se);\n\n await query().insert(row);\n\n return entry;\n },\n\n createRevisionFrom: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n const isPublished = entry.status === \"published\";\n\n /* Mark old latest as no longer latest — patch data blob too. */\n const oldLatestRows = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"entryId\", entry.entryId)\n .andWhere(\"isLatest\", true);\n\n for (const row of oldLatestRows) {\n const parsed = JSON.parse(row.data);\n parsed.isLatest = false;\n\n await query()\n .where(\"id\", row.id)\n .update({\n isLatest: false,\n data: JSON.stringify(parsed)\n });\n }\n\n /* If new revision is published, unpublish old published — patch data blob too. */\n if (isPublished) {\n const oldPublishedRows = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"entryId\", entry.entryId)\n .andWhere(\"isPublished\", true);\n\n for (const row of oldPublishedRows) {\n const parsed = JSON.parse(row.data);\n parsed.isPublished = false;\n parsed.status = \"unpublished\";\n\n await query()\n .where(\"id\", row.id)\n .update({\n isPublished: false,\n data: JSON.stringify(parsed)\n });\n }\n }\n\n /* Enforce invariant: new revision is always latest. */\n const se = storageEntry as CmsStorageEntry;\n se.isLatest = true;\n se.isPublished = isPublished;\n\n const row = entryToRow(se);\n\n await query().insert(row);\n\n return entry;\n },\n\n update: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n /* Read current DB flags so the data blob stays in sync with indexed columns. */\n const existing = await query().where(\"id\", storageEntry.id).first();\n const se = storageEntry as CmsStorageEntry;\n se.isLatest = existing?.isLatest ?? se.isLatest;\n se.isPublished = existing?.isPublished ?? se.isPublished;\n\n const row = entryToRow(se);\n\n /* Strip flags from column update — they are already correct in DB. */\n const { isLatest: _il, isPublished: _ip, ...rowWithoutFlags } = row;\n\n await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"id\", storageEntry.id)\n .update(rowWithoutFlags);\n\n /* Sync entry-level meta to the latest revision. */\n await syncToLatest(se);\n\n return entry;\n },\n\n updateRevision: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n const existing = await query().where(\"id\", storageEntry.id).first();\n const se = storageEntry as CmsStorageEntry;\n se.isLatest = existing?.isLatest ?? se.isLatest;\n se.isPublished = existing?.isPublished ?? se.isPublished;\n\n const row = entryToRow(se);\n const { isLatest: _il, isPublished: _ip, ...rowWithoutFlags } = row;\n\n await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"id\", storageEntry.id)\n .update(rowWithoutFlags);\n\n return entry;\n },\n\n publish: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n /* Step 1: Unpublish old published — patch data blob (status, isPublished). */\n const oldPublishedRows = await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"entryId\", entry.entryId)\n .andWhere(\"isPublished\", true);\n\n for (const row of oldPublishedRows) {\n const parsed = JSON.parse(row.data);\n parsed.isPublished = false;\n parsed.status = \"unpublished\";\n\n await query()\n .where(\"id\", row.id)\n .update({\n isPublished: false,\n data: JSON.stringify(parsed)\n });\n }\n\n /* Step 2: Read current isLatest from DB so the data blob stays in sync. */\n const existing = await query().where(\"id\", storageEntry.id).first();\n const se = storageEntry as CmsStorageEntry;\n se.isLatest = existing?.isLatest ?? se.isLatest;\n se.isPublished = true;\n\n const row = entryToRow(se);\n const { isLatest: _il, ...rowWithoutIsLatest } = row;\n\n await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"id\", storageEntry.id)\n .update(rowWithoutIsLatest);\n\n /* Step 3: Sync entry-level meta + live to the latest revision. */\n const liveValue = { version: entry.version };\n\n await syncToLatest(se, latest => {\n latest.live = liveValue;\n });\n\n return entry;\n },\n\n unpublish: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n /* Read current isLatest from DB so the data blob stays in sync. */\n const existing = await query().where(\"id\", storageEntry.id).first();\n const se = storageEntry as CmsStorageEntry;\n se.isLatest = existing?.isLatest ?? se.isLatest;\n se.isPublished = false;\n\n const row = entryToRow(se);\n const { isLatest: _il, ...rowWithoutIsLatest } = row;\n\n await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"id\", storageEntry.id)\n .update(rowWithoutIsLatest);\n\n /* Sync entry-level meta + live=null to the latest revision. */\n await syncToLatest(se, latest => {\n latest.live = null;\n });\n\n return entry;\n },\n\n move: async (model, id, folderId) => {\n await entryTableManager.ensureTable();\n\n const entryId = extractEntryId(id);\n\n await patchAllRevisions(entryId, model.tenant, parsed => {\n parsed.location = { folderId };\n });\n },\n\n moveToBin: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n await patchAllRevisions(\n entry.entryId,\n model.tenant,\n parsed => {\n const p = parsed as unknown as Record<string, unknown>;\n p[\"wbyDeleted\"] = true;\n p[\"binOriginalFolderId\"] = storageEntry.binOriginalFolderId ?? null;\n p[\"location\"] = storageEntry.location ?? null;\n\n /* Sync entry-level meta into each revision's data. */\n const fields = Object.keys(storageEntry);\n for (const field of fields) {\n if (field === \"createdOn\" || field === \"createdBy\") {\n continue;\n }\n if (\n (field.endsWith(\"On\") || field.endsWith(\"By\")) &&\n !field.startsWith(\"revision\")\n ) {\n p[field] = (storageEntry as Record<string, unknown>)[field];\n }\n }\n },\n { wbyDeleted: true }\n );\n },\n\n restoreFromBin: async (model, { entry, storageEntry }) => {\n await entryTableManager.ensureTable();\n\n await patchAllRevisions(\n entry.entryId,\n model.tenant,\n parsed => {\n const p = parsed as unknown as Record<string, unknown>;\n p[\"wbyDeleted\"] = false;\n p[\"binOriginalFolderId\"] = null;\n p[\"location\"] = storageEntry.location ?? null;\n\n /* Sync entry-level meta into each revision's data. */\n const fields = Object.keys(storageEntry);\n for (const field of fields) {\n if (field === \"createdOn\" || field === \"createdBy\") {\n continue;\n }\n if (\n (field.endsWith(\"On\") || field.endsWith(\"By\")) &&\n !field.startsWith(\"revision\")\n ) {\n p[field] = (storageEntry as Record<string, unknown>)[field];\n }\n }\n },\n { wbyDeleted: false }\n );\n\n return entry;\n },\n\n deleteRevision: async (model, { storageEntry, latestStorageEntry }) => {\n await entryTableManager.ensureTable();\n\n const wasPublished = storageEntry.status === \"published\";\n\n await query().where(\"tenant\", model.tenant).andWhere(\"id\", storageEntry.id).delete();\n\n /* If deleted row was published: clear live on all remaining rows. */\n if (wasPublished) {\n await patchAllRevisions(storageEntry.entryId, model.tenant, parsed => {\n parsed.live = null;\n });\n }\n\n /* If latestStorageEntry is provided: promote it as latest. */\n if (latestStorageEntry) {\n const latestParsed = structuredClone(latestStorageEntry);\n latestParsed.isLatest = true;\n\n if (wasPublished) {\n latestParsed.live = null;\n }\n\n const latestRow = entryToRow(latestParsed as CmsStorageEntry);\n\n await query()\n .where(\"tenant\", model.tenant)\n .andWhere(\"id\", latestStorageEntry.id)\n .update(latestRow);\n }\n },\n\n delete: async (model, { entry }) => {\n await entryTableManager.ensureTable();\n\n const entryId = extractEntryId(entry.id);\n\n await query().where(\"tenant\", model.tenant).andWhere(\"entryId\", entryId).delete();\n },\n\n deleteMultipleEntries: async (model, { entries }) => {\n await entryTableManager.ensureTable();\n\n const entryIds = entries.map(extractEntryId);\n\n await query().where(\"tenant\", model.tenant).whereIn(\"entryId\", entryIds).delete();\n },\n\n getUniqueFieldValues: async (model, params) => {\n const { where, fieldId } = params;\n\n const field = model.fields.find(f => f.fieldId === fieldId);\n\n if (!field) {\n return [];\n }\n\n const { items } = await listEntries(model, {\n where,\n limit: MAX_LIST_LIMIT\n });\n\n return aggregateUniqueFieldValues(items, field.fieldId);\n }\n } as CmsEntryStorageOperations;\n};\n"],"names":["MAX_LIST_LIMIT","extractEntryId","id","hashIdx","createEntriesStorageOperations","params","knex","entryTableManager","container","plugins","storageTransformRegistry","StorageTransformRegistry","getStorageOperationsModel","createStorageModelAccessor","query","syncToLatest","entry","extraPatch","latestRow","latest","JSON","merged","mergeEntryLevelMeta","patchAllRevisions","entryId","tenant","patch","columnUpdates","rows","cases","row","parsed","update","c","listEntries","initialModel","model","initialWhere","sortBy","search","searchFields","initialLimit","after","limit","qb","undefined","fromStorage","createStorageTransformCallable","records","Promise","rowToEntry","field","where","modelFields","createFields","valueFilterRegistry","ValueFilterRegistry","filteredItems","filter","totalCount","sortedItems","sort","start","parseInt","decodeCursor","hasMoreItems","slicedItems","cursor","encodeCursor","ids","idList","entries","byId","Map","e","Boolean","entryIds","byEntryId","eid","version","items","storageEntry","se","entryToRow","isPublished","oldLatestRows","oldPublishedRows","existing","_il","_ip","rowWithoutFlags","rowWithoutIsLatest","liveValue","folderId","p","fields","Object","latestStorageEntry","wasPublished","latestParsed","structuredClone","fieldId","f","aggregateUniqueFieldValues"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-headless-cms-sql",
3
- "version": "0.0.0-unstable.9f53ea597d",
3
+ "version": "0.0.0-unstable.a4f3e4ea8b",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -22,19 +22,19 @@
22
22
  "description": "SQL storage operations for Headless CMS API.",
23
23
  "license": "MIT",
24
24
  "dependencies": {
25
- "@webiny/api-core-sql": "0.0.0-unstable.9f53ea597d",
26
- "@webiny/api-headless-cms": "0.0.0-unstable.9f53ea597d",
27
- "@webiny/api-headless-cms-storage": "0.0.0-unstable.9f53ea597d",
28
- "@webiny/db-utils": "0.0.0-unstable.9f53ea597d",
29
- "@webiny/feature": "0.0.0-unstable.9f53ea597d",
30
- "@webiny/handler": "0.0.0-unstable.9f53ea597d",
31
- "@webiny/plugins": "0.0.0-unstable.9f53ea597d",
32
- "@webiny/utils": "0.0.0-unstable.9f53ea597d",
25
+ "@webiny/api-core-sql": "0.0.0-unstable.a4f3e4ea8b",
26
+ "@webiny/api-headless-cms": "0.0.0-unstable.a4f3e4ea8b",
27
+ "@webiny/api-headless-cms-storage": "0.0.0-unstable.a4f3e4ea8b",
28
+ "@webiny/db-utils": "0.0.0-unstable.a4f3e4ea8b",
29
+ "@webiny/feature": "0.0.0-unstable.a4f3e4ea8b",
30
+ "@webiny/handler": "0.0.0-unstable.a4f3e4ea8b",
31
+ "@webiny/plugins": "0.0.0-unstable.a4f3e4ea8b",
32
+ "@webiny/utils": "0.0.0-unstable.a4f3e4ea8b",
33
33
  "knex": "3.3.0"
34
34
  },
35
35
  "devDependencies": {
36
- "@webiny/build-tools": "0.0.0-unstable.9f53ea597d",
37
- "@webiny/project-utils": "0.0.0-unstable.9f53ea597d",
36
+ "@webiny/build-tools": "0.0.0-unstable.a4f3e4ea8b",
37
+ "@webiny/project-utils": "0.0.0-unstable.a4f3e4ea8b",
38
38
  "better-sqlite3": "13.0.1",
39
39
  "typescript": "7.0.2",
40
40
  "vitest": "4.1.10"