studiocms
Version:
Astro Native CMS for AstroDB. Built from the ground up by the Astro community.
281 lines (270 loc) • 9.12 kB
text/typescript
import { and, eq } from 'astro:db';
import { GhostUserDefaults } from '../../../consts.js';
import { Effect, genLogger } from '../../../effect.js';
import { AstroDB, SDKCore_Users } from '../effect/index.js';
import {
tsDiffTracking,
tsPageContent,
tsPageData,
tsPageDataCategories,
tsPageDataTags,
tsPageFolderStructure,
tsPermissions,
tsUsers,
} from '../tables.js';
import { _clearLibSQLError } from '../utils.js';
import { SDKCore_CLEAR } from './clear.js';
import { SDKCore_UPDATE } from './update.js';
/**
* Provides deletion operations for various StudioCMS entities such as pages, page content, tags, categories,
* permissions, diff tracking, folders, and users. Each deletion method interacts with the database and handles
* errors specific to LibSQLDatabase.
*
* @remarks
* This service is part of the StudioCMS SDK core and depends on AstroDB, SDKCore_CLEAR, SDKCore_Users, and SDKCore_UPDATE.
*
* @example
* ```typescript
* const deleteService = new SDKCore_DELETE();
* await Effect.runPromise(deleteService.page('page-id'));
* ```
*
* @see SDKCore_CLEAR
* @see SDKCore_Users
* @see SDKCore_UPDATE
*/
export class SDKCore_DELETE extends Effect.Service<SDKCore_DELETE>()(
'studiocms/sdk/SDKCore/modules/delete',
{
dependencies: [
AstroDB.Default,
SDKCore_CLEAR.Default,
SDKCore_Users.Default,
SDKCore_UPDATE.Default,
],
effect: genLogger('studiocms/sdk/SDKCore/modules/delete/effect')(function* () {
const [dbService, CLEAR, { clearUserReferences }, UPDATE] = yield* Effect.all([
AstroDB,
SDKCore_CLEAR,
SDKCore_Users,
SDKCore_UPDATE,
]);
const DELETE = {
/**
* Deletes a page from the database.
*
* @param id - The ID of the page to delete.
* @returns A promise that resolves to a deletion response.
* @throws {StudioCMS_SDK_Error} If an error occurs while deleting the page.
*/
page: (id: string) =>
Effect.gen(function* () {
yield* dbService.execute((db) =>
db.delete(tsDiffTracking).where(eq(tsDiffTracking.pageId, id))
);
yield* dbService.execute((db) =>
db.delete(tsPageContent).where(eq(tsPageContent.contentId, id))
);
yield* dbService.execute((db) => db.delete(tsPageData).where(eq(tsPageData.id, id)));
yield* CLEAR.pages();
return {
status: 'success',
message: `Page with ID ${id} has been deleted successfully`,
};
}).pipe(
Effect.catchTags({
LibSQLClientError: (cause) => _clearLibSQLError('DELETE.page', cause),
})
),
/**
* Deletes a page content from the database.
*
* @param id - The ID of the page content to delete.
* @returns A promise that resolves to a deletion response.
* @throws {StudioCMS_SDK_Error} If an error occurs while deleting the page content.
*/
pageContent: (id: string) =>
Effect.gen(function* () {
yield* dbService.execute((db) =>
db.delete(tsPageContent).where(eq(tsPageContent.contentId, id))
);
return {
status: 'success',
message: `Page content with ID ${id} has been deleted successfully`,
};
}).pipe(
Effect.catchTags({
LibSQLClientError: (cause) => _clearLibSQLError('DELETE.pageContent', cause),
})
),
/**
* Deletes a page content lang from the database.
*
* @param id - The ID of the page content to delete.
* @param lang - The lang of the page content to delete.
* @returns A promise that resolves to a deletion response.
* @throws {StudioCMS_SDK_Error} If an error occurs while deleting the page content lang.
*/
pageContentLang: (id: string, lang: string) =>
Effect.gen(function* () {
yield* dbService.execute((db) =>
db
.delete(tsPageContent)
.where(and(eq(tsPageContent.contentId, id), eq(tsPageContent.contentLang, lang)))
);
return {
status: 'success',
message: `Page content with ID ${id} and lang ${lang} has been deleted successfully`,
};
}).pipe(
Effect.catchTags({
LibSQLClientError: (cause) => _clearLibSQLError('DELETE.pageContentLang', cause),
})
),
/**
* Deletes a tag from the database.
*
* @param id - The ID of the tag to delete.
* @returns A promise that resolves to a deletion response.
* @throws {StudioCMS_SDK_Error} If an error occurs while deleting the tag.
*/
tags: (id: number) =>
Effect.gen(function* () {
yield* dbService.execute((db) =>
db.delete(tsPageDataTags).where(eq(tsPageDataTags.id, id))
);
return {
status: 'success',
message: `Tag with ID ${id} has been deleted successfully`,
};
}).pipe(
Effect.catchTags({
LibSQLClientError: (cause) => _clearLibSQLError('DELETE.tags', cause),
})
),
/**
* Deletes a category from the database.
*
* @param id - The ID of the category to delete.
* @returns A promise that resolves to a deletion response.
* @throws {StudioCMS_SDK_Error} If an error occurs while deleting the category.
*/
categories: (id: number) =>
Effect.gen(function* () {
yield* dbService.execute((db) =>
db.delete(tsPageDataCategories).where(eq(tsPageDataCategories.id, id))
);
return {
status: 'success',
message: `Category with ID ${id} has been deleted successfully`,
};
}).pipe(
Effect.catchTags({
LibSQLClientError: (cause) => _clearLibSQLError('DELETE.categories', cause),
})
),
/**
* Deletes a permission from the database.
*
* @param userId - The ID of the user to delete the permission for.
* @returns A promise that resolves to a deletion response.
* @throws {StudioCMS_SDK_Error} If an error occurs while deleting the permission.
*/
permissions: (userId: string) =>
Effect.gen(function* () {
yield* dbService.execute((db) =>
db.delete(tsPermissions).where(eq(tsPermissions.user, userId))
);
return {
status: 'success',
message: `Permissions for user with ID ${userId} have been deleted successfully`,
};
}).pipe(
Effect.catchTags({
LibSQLClientError: (cause) => _clearLibSQLError('DELETE.permissions', cause),
})
),
/**
* Deletes a site configuration from the database.
*
* @param id - The ID of the site configuration to delete.
* @returns A promise that resolves to a deletion response.
* @throws {StudioCMS_SDK_Error} If an error occurs while deleting the site configuration.
*/
diffTracking: (id: string) =>
Effect.gen(function* () {
yield* dbService.execute((db) =>
db.delete(tsDiffTracking).where(eq(tsDiffTracking.id, id))
);
return {
status: 'success',
message: `Diff tracking with ID ${id} has been deleted successfully`,
};
}).pipe(
Effect.catchTags({
LibSQLClientError: (cause) => _clearLibSQLError('DELETE.diffTracking', cause),
})
),
/**
* Deletes a folder from the database.
*
* @param id - The ID of the folder to delete.
* @returns A promise that resolves to a deletion response.
* @throws {StudioCMS_SDK_Error} If an error occurs while deleting the folder.
*/
folder: (id: string) =>
Effect.gen(function* () {
yield* dbService.execute((db) =>
db.delete(tsPageFolderStructure).where(eq(tsPageFolderStructure.id, id))
);
yield* CLEAR.folderList();
yield* CLEAR.folderTree();
yield* UPDATE.folderList;
yield* UPDATE.folderTree;
return {
status: 'success',
message: `Folder with ID ${id} has been deleted successfully`,
};
}).pipe(
Effect.catchTags({
LibSQLClientError: (cause) => _clearLibSQLError('DELETE.folder', cause),
})
),
/**
* Deletes a user from the database.
*
* @param id - The ID of the user to delete.
* @returns A promise that resolves to a deletion response.
* @throws {StudioCMS_SDK_Error} If an error occurs while deleting the user.
*/
user: (id: string) =>
Effect.gen(function* () {
if (id === GhostUserDefaults.id) {
return yield* _clearLibSQLError(
'DELETE.user',
`User with ID ${id} is an internal user and cannot be deleted.`
);
}
yield* clearUserReferences(id).pipe(
Effect.catchAll(() =>
_clearLibSQLError(
'DELETE.user',
`There was an issue deleting User with ID ${id}. Please manually remove all references before deleting the user. Or try again.`
)
)
);
yield* dbService.execute((db) => db.delete(tsUsers).where(eq(tsUsers.id, id)));
return {
status: 'success',
message: `User with ID ${id} has been deleted successfully`,
};
}).pipe(
Effect.catchTags({
LibSQLClientError: (cause) => _clearLibSQLError('DELETE.user', cause),
})
),
};
return DELETE;
}),
}
) {}