From 8a458d0e4afd8b2538a21161a26f1dce1992acc7 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Tue, 10 Dec 2024 04:44:52 -0800 Subject: [PATCH] Refactor addDatabaseEntry to handle multiple database tables and update timestamps --- .../src/sdk-utils/add/addDatabaseEntry.ts | 209 +++++++++--------- .../studiocms_core/src/sdk-utils/types.ts | 16 -- .../studiocms_core/src/sdk-utils/utils.ts | 1 + 3 files changed, 107 insertions(+), 119 deletions(-) diff --git a/packages/studiocms_core/src/sdk-utils/add/addDatabaseEntry.ts b/packages/studiocms_core/src/sdk-utils/add/addDatabaseEntry.ts index 05cf71a1..28f050a5 100644 --- a/packages/studiocms_core/src/sdk-utils/add/addDatabaseEntry.ts +++ b/packages/studiocms_core/src/sdk-utils/add/addDatabaseEntry.ts @@ -1,115 +1,118 @@ /// import { db } from 'astro:db'; import { tsPageContent, tsPageData } from '../../db/tsTables'; -import type { - addDatabaseEntryDatabase, - addDatabaseEntryInsertPage, - tsPageContentInsert, - tsPageDataInsert, -} from '../types'; +import type { addDatabaseEntryInsertPage, tsPageContentInsert, tsPageDataInsert } from '../types'; -/** - * Adds a new entry to the specified database table. - */ -export function addDatabaseEntry(database: addDatabaseEntryDatabase) { - switch (database) { - case 'pages': { - return { - /** - * Adds a new page entry to the database. - * - * @param pageData - An object containing the page metadata. - * @param pageContent - An object containing the page content. - * - * @returns A promise that resolves to an object containing the newly inserted page data and content. - * - * @throws Will throw an error if there is an error during the insertion process. - */ - insert: async ( - pageData: tsPageDataInsert, - pageContent: tsPageContentInsert - ): Promise => { - const newContentID = crypto.randomUUID().toString(); +interface AddDatabaseEntry { + pages: { + insert: ( + pageData: tsPageDataInsert, + pageContent: tsPageContentInsert + ) => Promise; + }; + pageContent: { + insert: () => void; + }; + tags: { + insert: () => void; + }; + categories: { + insert: () => void; + }; + permissions: { + insert: () => void; + }; +} - const { - title, - slug, - description, - authorId = null, - package: packageName = 'studiocms', - contentLang = 'default', - heroImage = '', - showOnNav = false, - showAuthor = false, - showContributors = false, - } = pageData; +export const addDatabaseEntry: AddDatabaseEntry = { + pages: { + /** + * Adds a new page entry to the database. + * + * @param pageData - An object containing the page metadata. + * @param pageContent - An object containing the page content. + * + * @returns A promise that resolves to an object containing the newly inserted page data and content. + * + * @throws Will throw an error if there is an error during the insertion process. + */ + insert: async ( + pageData: tsPageDataInsert, + pageContent: tsPageContentInsert + ): Promise => { + const newContentID = crypto.randomUUID().toString(); - const stringified = { - categories: JSON.stringify(pageData.categories), - tags: JSON.stringify(pageData.tags), - contributorIds: JSON.stringify(pageData.contributorIds), - }; + const { + title, + slug, + description, + authorId = null, + package: packageName = 'studiocms', + contentLang = 'default', + heroImage = '', + showOnNav = false, + showAuthor = false, + showContributors = false, + } = pageData; - const contentData = { - id: crypto.randomUUID().toString(), - contentId: newContentID, - contentLang: pageContent.contentLang || 'default', - content: pageContent.content || '', - }; + const stringified = { + categories: JSON.stringify(pageData.categories), + tags: JSON.stringify(pageData.tags), + contributorIds: JSON.stringify(pageData.contributorIds), + }; - const NOW = new Date(); + const contentData = { + id: crypto.randomUUID().toString(), + contentId: newContentID, + contentLang: pageContent.contentLang || 'default', + content: pageContent.content || '', + }; - const [newPageData, newPageContent] = await db - .batch([ - db - .insert(tsPageData) - .values({ - id: newContentID, - title, - slug, - description, - authorId, - contentLang, - heroImage, - showAuthor, - showContributors, - showOnNav, - package: packageName, - publishedAt: NOW, - updatedAt: NOW, - ...stringified, - }) - .returning({ id: tsPageData.id }), - db.insert(tsPageContent).values(contentData).returning({ id: tsPageContent.id }), - ]) - .catch((error) => { - throw new Error(error); - }); + const NOW = new Date(); + + const [newPageData, newPageContent] = await db + .batch([ + db + .insert(tsPageData) + .values({ + id: newContentID, + title, + slug, + description, + authorId, + contentLang, + heroImage, + showAuthor, + showContributors, + showOnNav, + package: packageName, + publishedAt: NOW, + updatedAt: NOW, + ...stringified, + }) + .returning({ id: tsPageData.id }), + db.insert(tsPageContent).values(contentData).returning({ id: tsPageContent.id }), + ]) + .catch((error) => { + throw new Error(error); + }); - return { - pageData: newPageData, - pageContent: newPageContent, - }; - }, - }; - } - case 'tags': { - return { - insert: async () => {}, - }; - } - case 'categories': { - return { - insert: async () => {}, - }; - } - case 'permissions': { return { - insert: async () => {}, + pageData: newPageData, + pageContent: newPageContent, }; - } - default: { - throw new Error('Invalid database entry'); - } - } -} + }, + }, + pageContent: { + insert: async () => {}, + }, + tags: { + insert: async () => {}, + }, + categories: { + insert: async () => {}, + }, + permissions: { + insert: async () => {}, + }, +}; diff --git a/packages/studiocms_core/src/sdk-utils/types.ts b/packages/studiocms_core/src/sdk-utils/types.ts index 7d077063..3b51301b 100644 --- a/packages/studiocms_core/src/sdk-utils/types.ts +++ b/packages/studiocms_core/src/sdk-utils/types.ts @@ -226,22 +226,6 @@ export type addDatabaseEntryInsertPage = { pageContent: PageContentReturnId[]; }; -/** - * Represents the possible database entries that can be added. - * - * @property {'pages'} pages - Represents the pages database entry. - * @property {'pageContent'} pageContent - Represents the page content database entry. - * @property {'tags'} tags - Represents the tags database entry. - * @property {'categories'} categories - Represents the categories database entry. - * @property {'permissions'} permissions - Represents the permissions database entry. - */ -export type addDatabaseEntryDatabase = - | 'pages' - | 'pageContent' - | 'tags' - | 'categories' - | 'permissions'; - /** * Interface for retrieving user data from the database. * Provides methods to fetch user data by different identifiers. diff --git a/packages/studiocms_core/src/sdk-utils/utils.ts b/packages/studiocms_core/src/sdk-utils/utils.ts index 99218379..4c735155 100644 --- a/packages/studiocms_core/src/sdk-utils/utils.ts +++ b/packages/studiocms_core/src/sdk-utils/utils.ts @@ -1,3 +1,4 @@ +/// import { db, eq } from 'astro:db'; import { tsOAuthAccounts,