@yimingliao/cms 0.0.25 → 0.0.26

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.
@@ -27,7 +27,7 @@ declare function createJwtService({ defaultSecret, ...options }: CreateJwtServic
27
27
 
28
28
  declare function createArgon2Service(): {
29
29
  hash: (password: string) => Promise<string>;
30
- verify: (hash: string, plain: string) => Promise<boolean>;
30
+ verify: (digest: string, password: string) => Promise<boolean>;
31
31
  };
32
32
 
33
33
  interface CreateCryptoServiceOptions {
@@ -622,6 +622,50 @@ interface CreateExecuteApiOptions {
622
622
  }
623
623
  declare function createExecuteApi({ initI18n, logger, }: CreateExecuteApiOptions): (fn: Api) => Promise<NextResponse<unknown>>;
624
624
 
625
+ interface CreateAuthUseCases {
626
+ prisma: any;
627
+ adminQueryRepository: ReturnType<typeof createAdminQueryRepository>;
628
+ adminRefreshTokenCommandRepository: ReturnType<typeof createAdminRefreshTokenCommandRepository>;
629
+ jwtService: ReturnType<typeof createJwtService>;
630
+ argon2Service: ReturnType<typeof createArgon2Service>;
631
+ cryptoService: ReturnType<typeof createCryptoService>;
632
+ config: {
633
+ resetPasswordSecret: string;
634
+ resetPasswordTtl: number;
635
+ verifyEmailSecret: string;
636
+ verifyEmailTtl: number;
637
+ refreshTokenTtl: number;
638
+ };
639
+ }
640
+ declare function createAuthUseCases({ prisma, adminQueryRepository, adminRefreshTokenCommandRepository, jwtService, argon2Service, cryptoService, config, }: CreateAuthUseCases): {
641
+ verifyCredentials: ({ email, password, }: {
642
+ email: string;
643
+ password: string;
644
+ }) => Promise<Admin>;
645
+ updatePassword: ({ email, password, }: {
646
+ email: string;
647
+ password: string;
648
+ }) => Promise<Admin>;
649
+ signPasswordResetToken: ({ admin }: {
650
+ admin: AdminSafe;
651
+ }) => string;
652
+ verifyPasswordResetToken: ({ token }: {
653
+ token: string;
654
+ }) => {
655
+ email: string;
656
+ };
657
+ signEmailVerificationToken: () => string;
658
+ verifyEmailAndUpdate: ({ token, admin, }: {
659
+ token: string;
660
+ admin: AdminSafe;
661
+ }) => Promise<AdminSafe>;
662
+ createRefreshToken: ({ admin, deviceInfo, ip, }: {
663
+ admin: AdminSafe;
664
+ deviceInfo: DeviceInfo;
665
+ ip: string;
666
+ }) => Promise<string>;
667
+ };
668
+
625
669
  declare class ServerError extends Error {
626
670
  readonly i18nKey?: string;
627
671
  readonly statusCode?: number;
@@ -640,4 +684,4 @@ declare class ServerError extends Error {
640
684
  static internalServerError(): ServerError;
641
685
  }
642
686
 
643
- export { ADMIN_ORDER_BY, ORDER_BY, POST_ORDER_BY, type RawCacheKey, ServerError, createAdminCommandRepository, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenQueryRepository, createArgon2Service, createCache, createCacheResult, createCookieService, createCryptoService, createExecuteAction, createExecuteApi, createFileCommandRepository, createFileQueryRepository, createFolderCommandRepository, createFolderQueryRepository, createIpRateLimiter, createJwtService, createPostCommandRepository, createPostQueryRepository, createSeoMetadataCommandRepository, normalizeCacheKey };
687
+ export { ADMIN_ORDER_BY, ORDER_BY, POST_ORDER_BY, type RawCacheKey, ServerError, createAdminCommandRepository, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenQueryRepository, createArgon2Service, createAuthUseCases, createCache, createCacheResult, createCookieService, createCryptoService, createExecuteAction, createExecuteApi, createFileCommandRepository, createFileQueryRepository, createFolderCommandRepository, createFolderQueryRepository, createIpRateLimiter, createJwtService, createPostCommandRepository, createPostQueryRepository, createSeoMetadataCommandRepository, normalizeCacheKey };
@@ -54,8 +54,8 @@ function createArgon2Service() {
54
54
  async function hash(password) {
55
55
  return await argon2.hash(password, DEFAULT_OPTIONS);
56
56
  }
57
- async function verify(hash2, plain) {
58
- return await argon2.verify(hash2, plain);
57
+ async function verify(digest, password) {
58
+ return await argon2.verify(digest, password);
59
59
  }
60
60
  return {
61
61
  hash,
@@ -1497,7 +1497,7 @@ function createExecuteAction({
1497
1497
  }) {
1498
1498
  return async function executeAction(fn, options = {}) {
1499
1499
  const translator = await initI18n();
1500
- const withCache = options.key && options.type === "query";
1500
+ const withCache = options.type === "query" && options.key;
1501
1501
  try {
1502
1502
  const { data, i18nKey, message, meta } = withCache ? await cacheResult({
1503
1503
  key: options.key,
@@ -1508,7 +1508,7 @@ function createExecuteAction({
1508
1508
  const finalMessage = i18nKey ? translator.t(i18nKey) : message;
1509
1509
  return result.success({
1510
1510
  ...finalMessage ? { message: finalMessage } : {},
1511
- ...data ? { data: data ?? {} } : {},
1511
+ ...data !== void 0 ? { data } : {},
1512
1512
  ...meta ? { meta } : {}
1513
1513
  });
1514
1514
  } catch (error) {
@@ -1546,4 +1546,104 @@ function createExecuteApi({
1546
1546
  };
1547
1547
  }
1548
1548
 
1549
- export { ADMIN_ORDER_BY, ORDER_BY, POST_ORDER_BY, ServerError, createAdminCommandRepository, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenQueryRepository, createArgon2Service, createCache, createCacheResult, createCookieService, createCryptoService, createExecuteAction, createExecuteApi, createFileCommandRepository, createFileQueryRepository, createFolderCommandRepository, createFolderQueryRepository, createIpRateLimiter, createJwtService, createPostCommandRepository, createPostQueryRepository, createSeoMetadataCommandRepository, normalizeCacheKey };
1549
+ // src/server/applications/auth/create-auth-use-cases.ts
1550
+ function createAuthUseCases({
1551
+ prisma,
1552
+ adminQueryRepository,
1553
+ adminRefreshTokenCommandRepository,
1554
+ jwtService,
1555
+ argon2Service,
1556
+ cryptoService,
1557
+ config
1558
+ }) {
1559
+ async function verifyCredentials({
1560
+ email,
1561
+ password
1562
+ }) {
1563
+ const found = await adminQueryRepository.findWithPasswordHash({ email });
1564
+ if (found) {
1565
+ const isValid = await argon2Service.verify(found.passwordHash, password);
1566
+ if (isValid) return found;
1567
+ }
1568
+ throw new ServerError({ i18nKey: "error.credentials-incorrect" });
1569
+ }
1570
+ async function updatePassword({
1571
+ email,
1572
+ password
1573
+ }) {
1574
+ const updatedAdmin = await prisma.admin.update({
1575
+ where: { email },
1576
+ data: { passwordHash: await argon2Service.hash(password) }
1577
+ });
1578
+ return updatedAdmin;
1579
+ }
1580
+ function signPasswordResetToken({ admin }) {
1581
+ const payload = { email: admin.email };
1582
+ const passwordResetToken = jwtService.sign({
1583
+ payload,
1584
+ secret: config.resetPasswordSecret,
1585
+ expiresIn: config.resetPasswordTtl
1586
+ });
1587
+ return passwordResetToken;
1588
+ }
1589
+ function verifyPasswordResetToken({ token }) {
1590
+ const payload = jwtService.verify({
1591
+ token,
1592
+ secret: config.resetPasswordSecret
1593
+ });
1594
+ return payload;
1595
+ }
1596
+ function signEmailVerificationToken() {
1597
+ const emailVerificationToken = jwtService.sign({
1598
+ payload: {},
1599
+ secret: config.verifyEmailSecret,
1600
+ expiresIn: config.verifyEmailTtl
1601
+ });
1602
+ return emailVerificationToken;
1603
+ }
1604
+ async function verifyEmailAndUpdate({
1605
+ token,
1606
+ admin
1607
+ }) {
1608
+ let updatedAdmin = admin;
1609
+ jwtService.verify({
1610
+ token,
1611
+ secret: config.verifyEmailSecret
1612
+ });
1613
+ updatedAdmin = await prisma.admin.update({
1614
+ where: { email: admin.email },
1615
+ data: { emailVerifiedAt: /* @__PURE__ */ new Date() }
1616
+ });
1617
+ return updatedAdmin;
1618
+ }
1619
+ async function createRefreshToken({
1620
+ admin,
1621
+ deviceInfo,
1622
+ ip
1623
+ }) {
1624
+ const token = cryptoService.generateToken();
1625
+ const tokenHash = cryptoService.hash(token);
1626
+ await adminRefreshTokenCommandRepository.create({
1627
+ tokenHash,
1628
+ ip,
1629
+ deviceInfo,
1630
+ expiresAt: new Date(Date.now() + config.refreshTokenTtl * 1e3),
1631
+ adminId: admin.id,
1632
+ email: admin.email
1633
+ });
1634
+ return token;
1635
+ }
1636
+ return {
1637
+ verifyCredentials,
1638
+ updatePassword,
1639
+ // reset password
1640
+ signPasswordResetToken,
1641
+ verifyPasswordResetToken,
1642
+ // verify email
1643
+ signEmailVerificationToken,
1644
+ verifyEmailAndUpdate,
1645
+ createRefreshToken
1646
+ };
1647
+ }
1648
+
1649
+ export { ADMIN_ORDER_BY, ORDER_BY, POST_ORDER_BY, ServerError, createAdminCommandRepository, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenQueryRepository, createArgon2Service, createAuthUseCases, createCache, createCacheResult, createCookieService, createCryptoService, createExecuteAction, createExecuteApi, createFileCommandRepository, createFileQueryRepository, createFolderCommandRepository, createFolderQueryRepository, createIpRateLimiter, createJwtService, createPostCommandRepository, createPostQueryRepository, createSeoMetadataCommandRepository, normalizeCacheKey };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yimingliao/cms",
3
- "version": "0.0.25",
3
+ "version": "0.0.26",
4
4
  "author": "Yiming Liao",
5
5
  "license": "MIT",
6
6
  "type": "module",