@yimingliao/cms 0.0.57 → 0.0.58

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.
@@ -414,8 +414,8 @@ interface UpdateParams$1 {
414
414
  }
415
415
 
416
416
  declare function createFolderCommandRepository(prisma: any): {
417
- create: ({ parentFolder, ...params }: CreateParams$1) => Promise<Folder>;
418
- update: ({ id, parentFolder, ...params }: UpdateParams$1) => Promise<Folder>;
417
+ create: ({ key, name, parentFolder, }: CreateParams$1) => Promise<Folder>;
418
+ update: ({ id, key, name, parentFolder, }: UpdateParams$1) => Promise<Folder>;
419
419
  delete: ({ id }: {
420
420
  id: string;
421
421
  }) => Promise<Folder>;
@@ -1313,6 +1313,63 @@ declare function createFileFindListCardsAction(ctx: ActionContext): (params: {
1313
1313
  total: number;
1314
1314
  }>>;
1315
1315
 
1316
+ declare const folderCreateValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
1317
+ key: zod.ZodString;
1318
+ name: zod.ZodString;
1319
+ parentFolder: zod.ZodNullable<zod.ZodObject<{
1320
+ id: zod.ZodString;
1321
+ }, zod_v4_core.$strip>>;
1322
+ }, zod_v4_core.$strip>;
1323
+
1324
+ type FolderCreateFormData = Pick<zod__default.infer<ReturnType<typeof folderCreateValidator>>, "name"> & {
1325
+ parentFolder: Folder | null;
1326
+ };
1327
+ declare function createFolderCreateAction(ctx: ActionContext): ({ formData, }: {
1328
+ formData: FolderCreateFormData;
1329
+ }) => Promise<Result<{
1330
+ folder: Folder;
1331
+ }>>;
1332
+
1333
+ declare const folderUpdateValidator: (schemas: ReturnType<typeof createSchemas>, id: string) => zod.ZodObject<{
1334
+ key: zod.ZodString;
1335
+ name: zod.ZodString;
1336
+ parentFolder: zod.ZodNullable<zod.ZodObject<{
1337
+ id: zod.ZodString;
1338
+ }, zod_v4_core.$strip>>;
1339
+ }, zod_v4_core.$strip>;
1340
+
1341
+ type FolderUpdateFormData = Pick<zod__default.infer<ReturnType<typeof folderUpdateValidator>>, "name"> & {
1342
+ parentFolder: Folder | null;
1343
+ };
1344
+ declare function createFolderUpdateAction(ctx: ActionContext): ({ id, formData, }: {
1345
+ id: string;
1346
+ formData: FolderUpdateFormData;
1347
+ }) => Promise<Result<{
1348
+ folder: Folder;
1349
+ }>>;
1350
+
1351
+ declare function createFolderDeleteAction(ctx: ActionContext): ({ id }: {
1352
+ id: string;
1353
+ }) => Promise<Result<void>>;
1354
+
1355
+ declare function createFolderFindFullAction(ctx: ActionContext): (params: {
1356
+ id?: string;
1357
+ key?: string;
1358
+ }) => Promise<Result<{
1359
+ folder: FolderFull;
1360
+ }>>;
1361
+
1362
+ declare function createFolderFindListCardsAction(ctx: ActionContext): (params: {
1363
+ searchString?: string;
1364
+ parentFolderId?: string;
1365
+ folderIds?: string[];
1366
+ page: number;
1367
+ pageSize: number;
1368
+ }) => Promise<Result<{
1369
+ items: FolderFull[];
1370
+ total: number;
1371
+ }>>;
1372
+
1316
1373
  declare class ServerError extends Error {
1317
1374
  readonly i18nKey?: string;
1318
1375
  readonly statusCode?: number;
@@ -1331,4 +1388,4 @@ declare class ServerError extends Error {
1331
1388
  static internalServerError(): ServerError;
1332
1389
  }
1333
1390
 
1334
- export { ADMIN_ORDER_BY, type ActionContext, type AdminCreateFormData, type AdminUpdateFormData, type ChangePasswordFormData, type EmailUnverifiedFormData, type FileCreateFormData, type FileCreateManyFormData, type FileUpdateFormData, type ForgotPasswordFormData, ORDER_BY, POST_ORDER_BY, type RawCacheKey, type ResetPasswordFormData, ServerError, type SignInFormData, type VerifyEmailFormData, createAdminCommandRepository, createAdminCreateAction, createAdminDeleteAction, createAdminFindFullAction, createAdminFindListCardsAction, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenDeleteAction, createAdminRefreshTokenFindManyAction, createAdminRefreshTokenQueryRepository, createAdminUpdateAction, createArgon2Service, createAuthMiddleware, createAuthUseCases, createCache, createCacheResult, createChangePasswordAction, createCookieService, createCryptoService, createEmailUnverifiedAction, createEmailVerificationEmail, createExecuteAction, createExecuteApi, createExist, createFileCommandRepository, createFileCreateAction, createFileCreateManyAction, createFileFindFullAction, createFileFindListCardsAction, createFilePurgeManyAction, createFileQueryRepository, createFileRestoreManyAction, createFileSchema, createFileSoftDeleteAction, createFileSoftDeleteManyAction, createFileUpdateAction, createFolderCommandRepository, createFolderQueryRepository, createForgotPasswordAction, createForgotPasswordEmail, createIpRateLimiter, createJwtService, createMultiFileSchema, createPostCommandRepository, createPostQueryRepository, createRenderEmailTemplate, createResetPasswordAction, createSchemas, createSendEmail, createSeoMetadataCommandRepository, createSignInAction, createSignOutAction, createTocItemSchema, createTransporter, createUnique, createVerifyAccessToken, createVerifyAction, createVerifyEmailAction, createVerifyRefreshToken, createZod, normalizeCacheKey };
1391
+ export { ADMIN_ORDER_BY, type ActionContext, type AdminCreateFormData, type AdminUpdateFormData, type ChangePasswordFormData, type EmailUnverifiedFormData, type FileCreateFormData, type FileCreateManyFormData, type FileUpdateFormData, type FolderCreateFormData, type FolderUpdateFormData, type ForgotPasswordFormData, ORDER_BY, POST_ORDER_BY, type RawCacheKey, type ResetPasswordFormData, ServerError, type SignInFormData, type VerifyEmailFormData, createAdminCommandRepository, createAdminCreateAction, createAdminDeleteAction, createAdminFindFullAction, createAdminFindListCardsAction, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenDeleteAction, createAdminRefreshTokenFindManyAction, createAdminRefreshTokenQueryRepository, createAdminUpdateAction, createArgon2Service, createAuthMiddleware, createAuthUseCases, createCache, createCacheResult, createChangePasswordAction, createCookieService, createCryptoService, createEmailUnverifiedAction, createEmailVerificationEmail, createExecuteAction, createExecuteApi, createExist, createFileCommandRepository, createFileCreateAction, createFileCreateManyAction, createFileFindFullAction, createFileFindListCardsAction, createFilePurgeManyAction, createFileQueryRepository, createFileRestoreManyAction, createFileSchema, createFileSoftDeleteAction, createFileSoftDeleteManyAction, createFileUpdateAction, createFolderCommandRepository, createFolderCreateAction, createFolderDeleteAction, createFolderFindFullAction, createFolderFindListCardsAction, createFolderQueryRepository, createFolderUpdateAction, createForgotPasswordAction, createForgotPasswordEmail, createIpRateLimiter, createJwtService, createMultiFileSchema, createPostCommandRepository, createPostQueryRepository, createRenderEmailTemplate, createResetPasswordAction, createSchemas, createSendEmail, createSeoMetadataCommandRepository, createSignInAction, createSignOutAction, createTocItemSchema, createTransporter, createUnique, createVerifyAccessToken, createVerifyAction, createVerifyEmailAction, createVerifyRefreshToken, createZod, normalizeCacheKey };
@@ -1,4 +1,4 @@
1
- import { ADMIN_ROLES, isFileLocked, ROOT_FOLDER_ID } from '../chunk-FUAJWL2N.js';
1
+ import { ADMIN_ROLES, isFileLocked, isFolderLocked, ROOT_FOLDER_ID, ROOT_FOLDER } from '../chunk-FUAJWL2N.js';
2
2
  import { SIZE, result, mimeToExtension, classifyFileType } from '../chunk-YAUBKQVA.js';
3
3
  import jwt from 'jsonwebtoken';
4
4
  import argon2 from 'argon2';
@@ -1304,17 +1304,20 @@ function createFileQueryRepository(prisma) {
1304
1304
  // src/server/infrastructure/database/folder/command/create-folder-command-repository.ts
1305
1305
  function createFolderCommandRepository(prisma) {
1306
1306
  async function create({
1307
+ // core
1308
+ key,
1309
+ name,
1307
1310
  // ------------------------------------
1308
1311
  // relations
1309
1312
  // ------------------------------------
1310
1313
  // Folder
1311
- parentFolder,
1312
- // rest
1313
- ...params
1314
+ parentFolder
1314
1315
  }) {
1315
1316
  const created = await prisma.folder.create({
1316
1317
  data: {
1317
- ...params,
1318
+ // core
1319
+ key,
1320
+ name,
1318
1321
  // ------------------------------------------------------------------------
1319
1322
  // relations
1320
1323
  // ------------------------------------------------------------------------
@@ -1326,18 +1329,21 @@ function createFolderCommandRepository(prisma) {
1326
1329
  }
1327
1330
  async function update({
1328
1331
  id,
1332
+ // core
1333
+ key,
1334
+ name,
1329
1335
  // ------------------------------------
1330
1336
  // relations
1331
1337
  // ------------------------------------
1332
1338
  // Folder
1333
- parentFolder,
1334
- // rest
1335
- ...params
1339
+ parentFolder
1336
1340
  }) {
1337
1341
  const updated = await prisma.folder.update({
1338
1342
  where: { id },
1339
1343
  data: {
1340
- ...params,
1344
+ // core
1345
+ key,
1346
+ name,
1341
1347
  // ------------------------------------------------------------------------
1342
1348
  // relations
1343
1349
  // ------------------------------------------------------------------------
@@ -2558,11 +2564,13 @@ function createAdminDeleteAction(ctx) {
2558
2564
  function createAdminFindFullAction(ctx) {
2559
2565
  const {
2560
2566
  repositories: { adminQueryRepository },
2567
+ middlewares: { authMiddleware },
2561
2568
  action: { executeAction }
2562
2569
  } = ctx;
2563
2570
  return async function adminFindFullAction(params) {
2564
2571
  return executeAction(
2565
2572
  async () => {
2573
+ await authMiddleware.authenticate();
2566
2574
  const admin = await adminQueryRepository.findFull(params);
2567
2575
  if (!admin) throw ServerError.notFound();
2568
2576
  return {
@@ -3280,6 +3288,204 @@ function createFileFindListCardsAction(ctx) {
3280
3288
  };
3281
3289
  }
3282
3290
 
3291
+ // src/server/interfaces/actions/resources/folder/commands/create/folder-create-validator.ts
3292
+ var folderCreateValidator = (schemas) => schemas.z.object({
3293
+ // core
3294
+ key: schemas.key().unique({ table: "folders", column: "key" }),
3295
+ name: schemas.pathSegment(),
3296
+ // ----------------------------------------------------------------------------
3297
+ // relations
3298
+ // ----------------------------------------------------------------------------
3299
+ // Folder
3300
+ parentFolder: schemas.z.object({ id: schemas.id().exist({ table: "folders", column: "id" }) }).nullable()
3301
+ });
3302
+ function createFolderCreateAction(ctx) {
3303
+ const {
3304
+ repositories: { folderCommandRepository },
3305
+ middlewares: { authMiddleware },
3306
+ action: { executeAction },
3307
+ schemas
3308
+ } = ctx;
3309
+ return async function folderCreateAction({
3310
+ formData
3311
+ }) {
3312
+ return executeAction(
3313
+ async () => {
3314
+ await authMiddleware.authenticate();
3315
+ const combinedKey = path2.join(
3316
+ formData.parentFolder?.key ?? "",
3317
+ formData.name
3318
+ );
3319
+ const { name } = await folderCreateValidator(schemas).parseAsync({
3320
+ ...formData,
3321
+ key: combinedKey
3322
+ });
3323
+ const createdFolder = await folderCommandRepository.create({
3324
+ key: combinedKey,
3325
+ name,
3326
+ parentFolder: formData.parentFolder
3327
+ });
3328
+ return {
3329
+ i18nKey: "ok.store-ok",
3330
+ data: { folder: createdFolder }
3331
+ };
3332
+ },
3333
+ { type: "command" }
3334
+ );
3335
+ };
3336
+ }
3337
+
3338
+ // src/server/interfaces/actions/resources/folder/commands/update/folder-update-validator.ts
3339
+ var folderUpdateValidator = (schemas, id) => schemas.z.object({
3340
+ // core
3341
+ key: schemas.key().unique({
3342
+ table: "folders",
3343
+ column: "key",
3344
+ excludeSelf: { name: "id", value: id }
3345
+ }),
3346
+ name: schemas.pathSegment(),
3347
+ // ----------------------------------------------------------------------------
3348
+ // relations
3349
+ // ----------------------------------------------------------------------------
3350
+ // Folder
3351
+ parentFolder: schemas.z.object({ id: schemas.id().exist({ table: "folders", column: "id" }) }).nullable()
3352
+ });
3353
+ function createFolderUpdateAction(ctx) {
3354
+ const {
3355
+ repositories: { folderCommandRepository },
3356
+ middlewares: { authMiddleware },
3357
+ action: { executeAction },
3358
+ schemas
3359
+ } = ctx;
3360
+ return async function folderUpdateAction({
3361
+ id,
3362
+ formData
3363
+ }) {
3364
+ return executeAction(
3365
+ async () => {
3366
+ await authMiddleware.authenticate();
3367
+ const combinedKey = path2.join(
3368
+ formData.parentFolder?.key ?? "",
3369
+ formData.name
3370
+ );
3371
+ const { name } = await folderUpdateValidator(schemas, id).parseAsync({
3372
+ ...formData,
3373
+ key: combinedKey
3374
+ });
3375
+ const updateddFolder = await folderCommandRepository.update({
3376
+ id,
3377
+ key: combinedKey,
3378
+ name,
3379
+ parentFolder: formData.parentFolder
3380
+ });
3381
+ return {
3382
+ i18nKey: "ok.update-ok",
3383
+ data: { folder: updateddFolder }
3384
+ };
3385
+ },
3386
+ { type: "command" }
3387
+ );
3388
+ };
3389
+ }
3390
+
3391
+ // src/server/interfaces/actions/resources/folder/commands/delete/create-folder-delete-action.ts
3392
+ function createFolderDeleteAction(ctx) {
3393
+ const {
3394
+ repositories: { folderQueryRepository, folderCommandRepository },
3395
+ middlewares: { authMiddleware },
3396
+ action: { executeAction }
3397
+ } = ctx;
3398
+ return async function folderDeleteAction({ id }) {
3399
+ return executeAction(
3400
+ async () => {
3401
+ await authMiddleware.authenticate();
3402
+ const foundFolder = await folderQueryRepository.findFull({ id });
3403
+ if (!foundFolder) throw ServerError.notFound();
3404
+ if (isFolderLocked(foundFolder)) {
3405
+ throw ServerError.forbidden();
3406
+ }
3407
+ await folderCommandRepository.delete({ id });
3408
+ return {
3409
+ i18nKey: "ok.destroy-ok"
3410
+ };
3411
+ },
3412
+ { type: "command" }
3413
+ );
3414
+ };
3415
+ }
3416
+
3417
+ // src/server/interfaces/actions/resources/folder/queries/create-folder-find-full-action.ts
3418
+ function createFolderFindFullAction(ctx) {
3419
+ const {
3420
+ repositories: { folderQueryRepository, fileQueryRepository },
3421
+ middlewares: { authMiddleware },
3422
+ action: { executeAction }
3423
+ } = ctx;
3424
+ return async function folderFindFullAction(params) {
3425
+ return executeAction(
3426
+ async (translator) => {
3427
+ await authMiddleware.authenticate();
3428
+ const resolvedKey = params.key || ROOT_FOLDER_ID;
3429
+ const identity = "id" in params ? params.id : resolvedKey;
3430
+ const isAtRoot = identity === ROOT_FOLDER_ID;
3431
+ let folder = ROOT_FOLDER;
3432
+ if (isAtRoot) {
3433
+ const { items: subFolders } = await folderQueryRepository.findListCards({
3434
+ parentFolderId: ROOT_FOLDER_ID
3435
+ });
3436
+ folder.subFolders = subFolders;
3437
+ const { items: files } = await fileQueryRepository.findListCards({
3438
+ locale: translator.locale,
3439
+ folderId: ROOT_FOLDER_ID
3440
+ });
3441
+ folder.files = files;
3442
+ } else {
3443
+ const found = await folderQueryRepository.findFull(params);
3444
+ if (!found) throw ServerError.notFound();
3445
+ folder = found;
3446
+ }
3447
+ return { data: { folder } };
3448
+ },
3449
+ {
3450
+ type: "query",
3451
+ key: ["file", "findFullAction", params.id, params.key]
3452
+ }
3453
+ );
3454
+ };
3455
+ }
3456
+
3457
+ // src/server/interfaces/actions/resources/folder/queries/create-folder-find-list-cards-action.ts
3458
+ function createFolderFindListCardsAction(ctx) {
3459
+ const {
3460
+ repositories: { folderQueryRepository },
3461
+ middlewares: { authMiddleware },
3462
+ action: { executeAction }
3463
+ } = ctx;
3464
+ return async function folderFindFullAction(params) {
3465
+ return executeAction(
3466
+ async () => {
3467
+ await authMiddleware.authenticate();
3468
+ const { items, total } = await folderQueryRepository.findListCards(params);
3469
+ return {
3470
+ data: { items, total }
3471
+ };
3472
+ },
3473
+ {
3474
+ type: "query",
3475
+ key: [
3476
+ "folder",
3477
+ "findListCardsAction",
3478
+ params.searchString,
3479
+ params.parentFolderId,
3480
+ ...params.folderIds ?? [],
3481
+ params.page,
3482
+ params.pageSize
3483
+ ]
3484
+ }
3485
+ );
3486
+ };
3487
+ }
3488
+
3283
3489
  // src/server/applications/auth/create-auth-use-cases.ts
3284
3490
  function createAuthUseCases({
3285
3491
  prisma,
@@ -3459,4 +3665,4 @@ function createForgotPasswordEmail({
3459
3665
  };
3460
3666
  }
3461
3667
 
3462
- export { ADMIN_ORDER_BY, ORDER_BY, POST_ORDER_BY, ServerError, createAdminCommandRepository, createAdminCreateAction, createAdminDeleteAction, createAdminFindFullAction, createAdminFindListCardsAction, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenDeleteAction, createAdminRefreshTokenFindManyAction, createAdminRefreshTokenQueryRepository, createAdminUpdateAction, createArgon2Service, createAuthMiddleware, createAuthUseCases, createCache, createCacheResult, createChangePasswordAction, createCookieService, createCryptoService, createEmailUnverifiedAction, createEmailVerificationEmail, createExecuteAction, createExecuteApi, createExist, createFileCommandRepository, createFileCreateAction, createFileCreateManyAction, createFileFindFullAction, createFileFindListCardsAction, createFilePurgeManyAction, createFileQueryRepository, createFileRestoreManyAction, createFileSchema, createFileSoftDeleteAction, createFileSoftDeleteManyAction, createFileUpdateAction, createFolderCommandRepository, createFolderQueryRepository, createForgotPasswordAction, createForgotPasswordEmail, createIpRateLimiter, createJwtService, createMultiFileSchema, createPostCommandRepository, createPostQueryRepository, createRenderEmailTemplate, createResetPasswordAction, createSchemas, createSendEmail, createSeoMetadataCommandRepository, createSignInAction, createSignOutAction, createTocItemSchema, createTransporter, createUnique, createVerifyAccessToken, createVerifyAction, createVerifyEmailAction, createVerifyRefreshToken, createZod, normalizeCacheKey };
3668
+ export { ADMIN_ORDER_BY, ORDER_BY, POST_ORDER_BY, ServerError, createAdminCommandRepository, createAdminCreateAction, createAdminDeleteAction, createAdminFindFullAction, createAdminFindListCardsAction, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenDeleteAction, createAdminRefreshTokenFindManyAction, createAdminRefreshTokenQueryRepository, createAdminUpdateAction, createArgon2Service, createAuthMiddleware, createAuthUseCases, createCache, createCacheResult, createChangePasswordAction, createCookieService, createCryptoService, createEmailUnverifiedAction, createEmailVerificationEmail, createExecuteAction, createExecuteApi, createExist, createFileCommandRepository, createFileCreateAction, createFileCreateManyAction, createFileFindFullAction, createFileFindListCardsAction, createFilePurgeManyAction, createFileQueryRepository, createFileRestoreManyAction, createFileSchema, createFileSoftDeleteAction, createFileSoftDeleteManyAction, createFileUpdateAction, createFolderCommandRepository, createFolderCreateAction, createFolderDeleteAction, createFolderFindFullAction, createFolderFindListCardsAction, createFolderQueryRepository, createFolderUpdateAction, createForgotPasswordAction, createForgotPasswordEmail, createIpRateLimiter, createJwtService, createMultiFileSchema, createPostCommandRepository, createPostQueryRepository, createRenderEmailTemplate, createResetPasswordAction, createSchemas, createSendEmail, createSeoMetadataCommandRepository, createSignInAction, createSignOutAction, createTocItemSchema, createTransporter, createUnique, createVerifyAccessToken, createVerifyAction, createVerifyEmailAction, createVerifyRefreshToken, createZod, normalizeCacheKey };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yimingliao/cms",
3
- "version": "0.0.57",
3
+ "version": "0.0.58",
4
4
  "author": "Yiming Liao",
5
5
  "license": "MIT",
6
6
  "type": "module",