@qlover/create-app 0.10.1 → 0.10.3

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.
Files changed (214) hide show
  1. package/CHANGELOG.md +178 -0
  2. package/dist/configs/_common/.github/workflows/general-check.yml +1 -1
  3. package/dist/configs/_common/.github/workflows/release.yml +2 -2
  4. package/dist/index.cjs +4 -4
  5. package/dist/index.js +4 -4
  6. package/dist/templates/next-app/config/IOCIdentifier.ts +2 -2
  7. package/dist/templates/next-app/config/Identifier/common/common.ts +14 -0
  8. package/dist/templates/next-app/config/Identifier/pages/index.ts +1 -0
  9. package/dist/templates/next-app/config/Identifier/pages/page.about.ts +20 -0
  10. package/dist/templates/next-app/config/common.ts +1 -1
  11. package/dist/templates/next-app/config/cookies.ts +23 -0
  12. package/dist/templates/next-app/config/i18n/AboutI18n.ts +14 -0
  13. package/dist/templates/next-app/config/i18n/i18nConfig.ts +3 -1
  14. package/dist/templates/next-app/config/i18n/index.ts +1 -0
  15. package/dist/templates/next-app/config/i18n/loginI18n.ts +8 -0
  16. package/dist/templates/next-app/config/theme.ts +4 -0
  17. package/dist/templates/next-app/eslint.config.mjs +9 -2
  18. package/dist/templates/next-app/next.config.ts +1 -0
  19. package/dist/templates/next-app/package.json +17 -6
  20. package/dist/templates/next-app/public/locales/en.json +5 -0
  21. package/dist/templates/next-app/public/locales/zh.json +5 -0
  22. package/dist/templates/next-app/src/app/[locale]/admin/AdminI18nProvider.tsx +37 -0
  23. package/dist/templates/next-app/src/app/[locale]/admin/layout.tsx +30 -6
  24. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +1 -1
  25. package/dist/templates/next-app/src/app/[locale]/layout.tsx +47 -10
  26. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +1 -1
  27. package/dist/templates/next-app/src/app/[locale]/login/page.tsx +22 -10
  28. package/dist/templates/next-app/src/app/[locale]/page.tsx +23 -8
  29. package/dist/templates/next-app/src/app/[locale]/register/page.tsx +21 -9
  30. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +7 -28
  31. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +7 -34
  32. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +12 -34
  33. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +7 -26
  34. package/dist/templates/next-app/src/app/api/admin/users/route.ts +14 -33
  35. package/dist/templates/next-app/src/app/api/locales/json/route.ts +13 -25
  36. package/dist/templates/next-app/src/app/api/user/login/route.ts +6 -46
  37. package/dist/templates/next-app/src/app/api/user/logout/route.ts +5 -24
  38. package/dist/templates/next-app/src/app/api/user/register/route.ts +6 -45
  39. package/dist/templates/next-app/src/app/manifest.ts +16 -0
  40. package/dist/templates/next-app/src/app/robots.txt +2 -0
  41. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +3 -3
  42. package/dist/templates/next-app/src/base/cases/AppConfig.ts +14 -13
  43. package/dist/templates/next-app/src/base/cases/Datetime.ts +3 -3
  44. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +8 -2
  45. package/dist/templates/next-app/src/base/cases/DialogHandler.ts +30 -4
  46. package/dist/templates/next-app/src/base/cases/InversifyContainer.ts +16 -4
  47. package/dist/templates/next-app/src/base/cases/NavigateBridge.ts +20 -4
  48. package/dist/templates/next-app/src/base/cases/RequestEncryptPlugin.ts +8 -2
  49. package/dist/templates/next-app/src/base/cases/ResourceState.ts +3 -3
  50. package/dist/templates/next-app/src/base/cases/RouterService.ts +28 -10
  51. package/dist/templates/next-app/src/base/cases/StringEncryptor.ts +14 -2
  52. package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +1 -1
  53. package/dist/templates/next-app/src/base/cases/UserServiceApi.ts +20 -5
  54. package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +31 -8
  55. package/dist/templates/next-app/src/base/port/AdminLayoutInterface.ts +4 -1
  56. package/dist/templates/next-app/src/base/port/AppApiInterface.ts +22 -0
  57. package/dist/templates/next-app/src/base/port/I18nServiceInterface.ts +27 -7
  58. package/dist/templates/next-app/src/base/port/IOCInterface.ts +9 -0
  59. package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +1 -1
  60. package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +3 -3
  61. package/dist/templates/next-app/src/base/services/I18nService.ts +20 -10
  62. package/dist/templates/next-app/src/base/services/ResourceService.ts +32 -11
  63. package/dist/templates/next-app/src/base/services/UserService.ts +12 -3
  64. package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +9 -6
  65. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +20 -5
  66. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +21 -4
  67. package/dist/templates/next-app/src/base/services/appApi/AppUserApi.ts +12 -3
  68. package/dist/templates/next-app/src/base/services/appApi/AppUserApiBootstrap.ts +10 -2
  69. package/dist/templates/next-app/src/base/types/{PageProps.ts → AppPageRouter.ts} +4 -1
  70. package/dist/templates/next-app/src/base/types/PagesRouter.ts +9 -0
  71. package/dist/templates/next-app/src/core/bootstraps/BootstrapClient.ts +20 -6
  72. package/dist/templates/next-app/src/core/bootstraps/BootstrapServer.ts +27 -9
  73. package/dist/templates/next-app/src/core/bootstraps/BootstrapsRegistry.ts +6 -4
  74. package/dist/templates/next-app/src/core/clientIoc/ClientIOC.ts +39 -9
  75. package/dist/templates/next-app/src/core/clientIoc/ClientIOCRegister.ts +9 -2
  76. package/dist/templates/next-app/src/core/serverIoc/ServerIOC.ts +37 -10
  77. package/dist/templates/next-app/src/core/serverIoc/ServerIOCRegister.ts +9 -2
  78. package/dist/templates/next-app/src/i18n/loadMessages.ts +103 -0
  79. package/dist/templates/next-app/src/i18n/request.ts +3 -22
  80. package/dist/templates/next-app/src/pages/[locale]/about.tsx +61 -0
  81. package/dist/templates/next-app/src/pages/_app.tsx +50 -0
  82. package/dist/templates/next-app/src/pages/_document.tsx +13 -0
  83. package/dist/templates/next-app/src/{middleware.ts → proxy.ts} +2 -1
  84. package/dist/templates/next-app/src/server/AppErrorApi.ts +1 -1
  85. package/dist/templates/next-app/src/server/AppPageRouteParams.ts +107 -0
  86. package/dist/templates/next-app/src/server/AppSuccessApi.ts +1 -1
  87. package/dist/templates/next-app/src/server/NextApiServer.ts +62 -0
  88. package/dist/templates/next-app/src/server/PagesRouteParams.ts +146 -0
  89. package/dist/templates/next-app/src/server/PasswordEncrypt.ts +8 -2
  90. package/dist/templates/next-app/src/server/ServerAuth.ts +20 -5
  91. package/dist/templates/next-app/src/server/{sqlBridges/SupabaseBridge.ts → SupabaseBridge.ts} +50 -8
  92. package/dist/templates/next-app/src/server/UserCredentialToken.ts +8 -2
  93. package/dist/templates/next-app/src/server/controllers/AdminLocalesController.ts +86 -0
  94. package/dist/templates/next-app/src/server/controllers/AdminUserController.ts +42 -0
  95. package/dist/templates/next-app/src/server/controllers/LocalesController.ts +36 -0
  96. package/dist/templates/next-app/src/server/controllers/UserController.ts +86 -0
  97. package/dist/templates/next-app/src/server/port/AIControllerInterface.ts +8 -0
  98. package/dist/templates/next-app/src/server/port/AdminLocalesControllerInterface.ts +21 -0
  99. package/dist/templates/next-app/src/server/port/AdminUserControllerInterface.ts +11 -0
  100. package/dist/templates/next-app/src/server/port/LocalesControllerInterface.ts +10 -0
  101. package/dist/templates/next-app/src/server/port/{ParamsHandlerInterface.ts → RouteParamsnHandlerInterface.ts} +9 -2
  102. package/dist/templates/next-app/src/server/port/ServerInterface.ts +2 -2
  103. package/dist/templates/next-app/src/server/port/UserControllerInerface.ts +8 -0
  104. package/dist/templates/next-app/src/server/port/UserServiceInterface.ts +1 -1
  105. package/dist/templates/next-app/src/server/port/ValidatorInterface.ts +2 -2
  106. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +31 -9
  107. package/dist/templates/next-app/src/server/repositorys/UserRepository.ts +15 -6
  108. package/dist/templates/next-app/src/server/services/AIService.ts +3 -1
  109. package/dist/templates/next-app/src/server/services/AdminAuthPlugin.ts +5 -2
  110. package/dist/templates/next-app/src/{base → server}/services/AdminLocalesService.ts +2 -2
  111. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +29 -14
  112. package/dist/templates/next-app/src/server/services/ApiUserService.ts +6 -3
  113. package/dist/templates/next-app/src/server/services/UserService.ts +12 -3
  114. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +24 -7
  115. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +17 -5
  116. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +17 -11
  117. package/dist/templates/next-app/src/styles/css/antd-themes/_common/_default.css +0 -44
  118. package/dist/templates/next-app/src/styles/css/antd-themes/_common/dark.css +0 -44
  119. package/dist/templates/next-app/src/styles/css/antd-themes/_common/pink.css +0 -44
  120. package/dist/templates/next-app/src/styles/css/index.css +1 -1
  121. package/dist/templates/next-app/src/styles/css/scrollbar.css +34 -0
  122. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +34 -11
  123. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +69 -39
  124. package/dist/templates/next-app/src/uikit/components/ClientRootProvider.tsx +64 -0
  125. package/dist/templates/next-app/src/uikit/components/ClinetRenderProvider.tsx +42 -0
  126. package/dist/templates/next-app/src/uikit/components/IOCProvider.tsx +34 -0
  127. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +7 -1
  128. package/dist/templates/next-app/src/uikit/components-app/AppBridge.tsx +17 -0
  129. package/dist/templates/next-app/src/uikit/components-app/AppRoutePage.tsx +112 -0
  130. package/dist/templates/next-app/src/uikit/{components → components-app}/LanguageSwitcher.tsx +15 -19
  131. package/dist/templates/next-app/src/uikit/{components → components-app}/ThemeSwitcher.tsx +53 -52
  132. package/dist/templates/next-app/src/uikit/components-pages/LanguageSwitcher.tsx +98 -0
  133. package/dist/templates/next-app/src/uikit/components-pages/PagesRoutePage.tsx +93 -0
  134. package/dist/templates/next-app/src/uikit/context/IOCContext.ts +16 -4
  135. package/dist/templates/next-app/src/uikit/hook/useStrictEffect.ts +32 -0
  136. package/dist/templates/next-app/tsconfig.json +3 -2
  137. package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +3 -1
  138. package/dist/templates/react-app/__tests__/__mocks__/MockAppConfig.ts +19 -19
  139. package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +8 -8
  140. package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +9 -9
  141. package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +1 -1
  142. package/dist/templates/react-app/__tests__/__mocks__/i18nextHttpBackend.ts +5 -5
  143. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +9 -5
  144. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +8 -4
  145. package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +4 -4
  146. package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +5 -5
  147. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +3 -3
  148. package/dist/templates/react-app/__tests__/src/uikit/components/chatMessage/ChatRoot.test.tsx +1 -1
  149. package/dist/templates/react-app/docs/en/components/chat-message-component.md +35 -29
  150. package/dist/templates/react-app/docs/en/components/chat-message-refactor.md +18 -5
  151. package/dist/templates/react-app/docs/en/components/message-base-list-component.md +11 -12
  152. package/dist/templates/react-app/docs/en/request.md +1 -3
  153. package/dist/templates/react-app/docs/zh/components/chat-message-component.md +35 -29
  154. package/dist/templates/react-app/docs/zh/components/chat-message-refactor.md +18 -5
  155. package/dist/templates/react-app/docs/zh/components/message-base-list-component.md +11 -12
  156. package/dist/templates/react-app/docs/zh/request.md +1 -3
  157. package/dist/templates/react-app/eslint.config.mjs +10 -5
  158. package/dist/templates/react-app/src/App.tsx +1 -1
  159. package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +2 -2
  160. package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +14 -11
  161. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +10 -16
  162. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -10
  163. package/dist/templates/react-app/src/base/cases/AppConfig.ts +19 -19
  164. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +28 -5
  165. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +5 -2
  166. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +16 -4
  167. package/dist/templates/react-app/src/base/cases/PublicAssetsPath.ts +1 -1
  168. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +6 -3
  169. package/dist/templates/react-app/src/base/cases/RequestLogger.ts +17 -8
  170. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +4 -6
  171. package/dist/templates/react-app/src/base/cases/ResourceState.ts +3 -3
  172. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +3 -3
  173. package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +1 -1
  174. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -2
  175. package/dist/templates/react-app/src/base/port/IOCInterface.ts +4 -2
  176. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +5 -5
  177. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +7 -7
  178. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +8 -8
  179. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +4 -2
  180. package/dist/templates/react-app/src/base/services/BaseLayoutService.ts +3 -3
  181. package/dist/templates/react-app/src/base/services/I18nService.ts +24 -13
  182. package/dist/templates/react-app/src/base/services/IdentifierService.ts +21 -26
  183. package/dist/templates/react-app/src/base/services/RouteService.ts +8 -8
  184. package/dist/templates/react-app/src/base/services/UserBootstrap.ts +2 -2
  185. package/dist/templates/react-app/src/base/services/UserGatewayPlugin.ts +9 -5
  186. package/dist/templates/react-app/src/base/services/UserService.ts +10 -4
  187. package/dist/templates/react-app/src/core/bootstraps/BootstrapClient.ts +3 -1
  188. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +5 -2
  189. package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +11 -4
  190. package/dist/templates/react-app/src/core/clientIoc/ClientIOCRegister.ts +5 -4
  191. package/dist/templates/react-app/src/pages/base/Layout.tsx +1 -1
  192. package/dist/templates/react-app/src/styles/css/antd-themes/_common/_default.css +0 -44
  193. package/dist/templates/react-app/src/styles/css/antd-themes/_common/dark.css +0 -44
  194. package/dist/templates/react-app/src/styles/css/antd-themes/_common/pink.css +0 -44
  195. package/dist/templates/react-app/src/styles/css/index.css +1 -1
  196. package/dist/templates/react-app/src/styles/css/scrollbar.css +34 -0
  197. package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +2 -2
  198. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +4 -4
  199. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +8 -2
  200. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +6 -6
  201. package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +1 -1
  202. package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +1 -3
  203. package/dist/templates/react-app/src/uikit/components/MessageBaseList.tsx +4 -1
  204. package/dist/templates/react-app/src/uikit/components/chatMessage/ChatMessageBridge.ts +39 -16
  205. package/dist/templates/react-app/src/uikit/components/chatMessage/MessageApi.ts +4 -2
  206. package/package.json +3 -3
  207. package/dist/templates/next-app/src/server/PageParams.ts +0 -66
  208. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +0 -80
  209. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +0 -65
  210. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +0 -58
  211. package/dist/templates/next-app/src/uikit/components/NextIntlProvider.tsx +0 -21
  212. package/dist/templates/react-app/makes/eslint-utils.mjs +0 -195
  213. /package/dist/templates/next-app/{src/app/[locale] → public}/favicon.ico +0 -0
  214. /package/dist/templates/next-app/src/uikit/{components → components-app}/LogoutButton.tsx +0 -0
@@ -18,13 +18,19 @@ export class ServerAuth implements ServerAuthInterface {
18
18
  this.userTokenKey = server.userTokenKey;
19
19
  }
20
20
 
21
- async setAuth(credential_token: string): Promise<void> {
21
+ /**
22
+ * @override
23
+ */
24
+ public async setAuth(credential_token: string): Promise<void> {
22
25
  const cookieStore = await cookies();
23
26
 
24
27
  cookieStore.set(this.userTokenKey, credential_token);
25
28
  }
26
29
 
27
- async hasAuth(): Promise<boolean> {
30
+ /**
31
+ * @override
32
+ */
33
+ public async hasAuth(): Promise<boolean> {
28
34
  const token = await this.getAuth();
29
35
 
30
36
  if (!token) {
@@ -40,17 +46,26 @@ export class ServerAuth implements ServerAuthInterface {
40
46
  }
41
47
  }
42
48
 
43
- async getAuth(): Promise<string> {
49
+ /**
50
+ * @override
51
+ */
52
+ public async getAuth(): Promise<string> {
44
53
  const cookieStore = await cookies();
45
54
  return cookieStore.get(this.userTokenKey)?.value || '';
46
55
  }
47
56
 
48
- async clear(): Promise<void> {
57
+ /**
58
+ * @override
59
+ */
60
+ public async clear(): Promise<void> {
49
61
  const cookieStore = await cookies();
50
62
  cookieStore.delete(this.userTokenKey);
51
63
  }
52
64
 
53
- async throwIfNotAuth(): Promise<void> {
65
+ /**
66
+ * @override
67
+ */
68
+ public async throwIfNotAuth(): Promise<void> {
54
69
  const hasAuth = await this.hasAuth();
55
70
 
56
71
  if (!hasAuth) {
@@ -46,19 +46,30 @@ export class SupabaseBridge implements DBBridgeInterface {
46
46
  );
47
47
  }
48
48
 
49
- getSupabase(): SupabaseClient {
49
+ /**
50
+ * @override
51
+ */
52
+ public getSupabase(): SupabaseClient {
50
53
  return this.supabase;
51
54
  }
52
55
 
53
- async execSql(sql: string): Promise<SupabaseBridgeResponse<unknown>> {
56
+ /**
57
+ * @override
58
+ */
59
+ public async execSql(sql: string): Promise<SupabaseBridgeResponse<unknown>> {
54
60
  const res = await this.supabase.rpc('exec_sql', { sql });
55
61
  return this.catch(res);
56
62
  }
57
63
 
64
+ /**
65
+ * @override
66
+ */
58
67
  protected async catch(
59
68
  result: PostgrestSingleResponse<unknown>
60
69
  ): Promise<SupabaseBridgeResponse<unknown>> {
61
70
  if (result.error) {
71
+ this.logger.error('', result);
72
+
62
73
  if (this.hasPausedProject(result)) {
63
74
  throw new Error(
64
75
  'Project is paused, Please Restore project: https://supabase.com/dashboard'
@@ -71,12 +82,18 @@ export class SupabaseBridge implements DBBridgeInterface {
71
82
  return result as SupabaseBridgeResponse<unknown>;
72
83
  }
73
84
 
85
+ /**
86
+ * @override
87
+ */
74
88
  protected hasPausedProject(error: PostgrestResponseFailure): boolean {
75
89
  return (
76
90
  error.status === 0 && error.error.message === 'TypeError: fetch failed'
77
91
  );
78
92
  }
79
93
 
94
+ /**
95
+ * @override
96
+ */
80
97
  protected handleWhere(
81
98
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
82
99
  handler: PostgrestFilterBuilder<any, any, any, any, string, unknown, any>,
@@ -99,6 +116,9 @@ export class SupabaseBridge implements DBBridgeInterface {
99
116
  }
100
117
  }
101
118
 
119
+ /**
120
+ * @override
121
+ */
102
122
  protected handleOrderBy(
103
123
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
104
124
  handler: PostgrestFilterBuilder<any, any, any, any, string, unknown, any>,
@@ -109,7 +129,10 @@ export class SupabaseBridge implements DBBridgeInterface {
109
129
  }
110
130
  }
111
131
 
112
- async add(event: BridgeEvent): Promise<DBBridgeResponse<unknown>> {
132
+ /**
133
+ * @override
134
+ */
135
+ public async add(event: BridgeEvent): Promise<DBBridgeResponse<unknown>> {
113
136
  const { table, data } = event;
114
137
  if (!data) {
115
138
  throw new Error('Data is required for add operation');
@@ -120,7 +143,10 @@ export class SupabaseBridge implements DBBridgeInterface {
120
143
  return this.catch(res);
121
144
  }
122
145
 
123
- async upsert(event: BridgeEvent): Promise<DBBridgeResponse<unknown>> {
146
+ /**
147
+ * @override
148
+ */
149
+ public async upsert(event: BridgeEvent): Promise<DBBridgeResponse<unknown>> {
124
150
  const { table, data, fields = '*' } = event;
125
151
  if (!data) {
126
152
  throw new Error('Data is required for upsert operation');
@@ -135,7 +161,10 @@ export class SupabaseBridge implements DBBridgeInterface {
135
161
  return this.catch(res);
136
162
  }
137
163
 
138
- async update(event: BridgeEvent): Promise<DBBridgeResponse<unknown>> {
164
+ /**
165
+ * @override
166
+ */
167
+ public async update(event: BridgeEvent): Promise<DBBridgeResponse<unknown>> {
139
168
  const { table, data, where } = event;
140
169
  if (!data) {
141
170
  throw new Error('Data is required for update operation');
@@ -148,7 +177,10 @@ export class SupabaseBridge implements DBBridgeInterface {
148
177
  return this.catch(await handler);
149
178
  }
150
179
 
151
- async delete(event: BridgeEvent): Promise<DBBridgeResponse<unknown>> {
180
+ /**
181
+ * @override
182
+ */
183
+ public async delete(event: BridgeEvent): Promise<DBBridgeResponse<unknown>> {
152
184
  const { table, where } = event;
153
185
  const handler = this.supabase.from(table).delete();
154
186
 
@@ -157,7 +189,12 @@ export class SupabaseBridge implements DBBridgeInterface {
157
189
  return this.catch(await handler);
158
190
  }
159
191
 
160
- async get(event: BridgeEvent): Promise<SupabaseBridgeResponse<unknown>> {
192
+ /**
193
+ * @override
194
+ */
195
+ public async get(
196
+ event: BridgeEvent
197
+ ): Promise<SupabaseBridgeResponse<unknown>> {
161
198
  const { table, fields = '*', where, orderBy } = event;
162
199
  const selectFields = Array.isArray(fields) ? fields.join(',') : fields;
163
200
  const handler = this.supabase.from(table).select(selectFields);
@@ -169,7 +206,12 @@ export class SupabaseBridge implements DBBridgeInterface {
169
206
  return this.catch(await handler);
170
207
  }
171
208
 
172
- async pagination(event: BridgeEvent): Promise<DBBridgeResponse<unknown[]>> {
209
+ /**
210
+ * @override
211
+ */
212
+ public async pagination(
213
+ event: BridgeEvent
214
+ ): Promise<DBBridgeResponse<unknown[]>> {
173
215
  const {
174
216
  table,
175
217
  fields = '*',
@@ -16,7 +16,10 @@ export class UserCredentialToken implements CrentialTokenInterface<UserCredentia
16
16
  this.jwtExpiresIn = config.jwtExpiresIn;
17
17
  }
18
18
 
19
- async generateToken(
19
+ /**
20
+ * @override
21
+ */
22
+ public async generateToken(
20
23
  data: UserCredentialTokenValue,
21
24
  options: { expiresIn?: string } = {}
22
25
  ): Promise<string> {
@@ -29,7 +32,10 @@ export class UserCredentialToken implements CrentialTokenInterface<UserCredentia
29
32
  });
30
33
  }
31
34
 
32
- async parseToken(token: string): Promise<UserCredentialTokenValue> {
35
+ /**
36
+ * @override
37
+ */
38
+ public async parseToken(token: string): Promise<UserCredentialTokenValue> {
33
39
  try {
34
40
  const decoded = jwt.verify(token, this.jwtSecret) as {
35
41
  i: UserSchema['id'];
@@ -0,0 +1,86 @@
1
+ import { inject, injectable } from 'inversify';
2
+ import { AdminLocalesService } from '@/server/services/AdminLocalesService';
3
+ import type { LocalesSchema } from '@migrations/schema/LocalesSchema';
4
+ import {
5
+ ApiLocaleService,
6
+ type ImportLocalesData
7
+ } from '../services/ApiLocaleService';
8
+ import {
9
+ LocalesImportValidator,
10
+ LocalesValidator
11
+ } from '../validators/LocalesValidator';
12
+ import { PaginationValidator } from '../validators/PaginationValidator';
13
+ import type { AdminLocalesControllerInterface } from '../port/AdminLocalesControllerInterface';
14
+ import type { BridgeOrderBy } from '../port/DBBridgeInterface';
15
+ import type { UpsertResult } from '../port/LocalesRepositoryInterface';
16
+ import type { PaginationInterface } from '../port/PaginationInterface';
17
+ import type { ValidatorInterface } from '../port/ValidatorInterface';
18
+ import type { PaginationParams } from '../validators/PaginationValidator';
19
+
20
+ @injectable()
21
+ export class AdminLocalesController implements AdminLocalesControllerInterface {
22
+ constructor(
23
+ @inject(AdminLocalesService)
24
+ protected adminLocalesService: AdminLocalesService,
25
+ @inject(PaginationValidator)
26
+ protected paginationValidator: ValidatorInterface<PaginationParams>,
27
+ @inject(ApiLocaleService)
28
+ protected apiLocaleService: ApiLocaleService,
29
+ @inject(LocalesValidator)
30
+ protected localesValidator: ValidatorInterface<Partial<LocalesSchema>>,
31
+ @inject(LocalesImportValidator)
32
+ protected localesImportValidator: ValidatorInterface<ImportLocalesData>
33
+ ) {}
34
+
35
+ /**
36
+ * @override
37
+ */
38
+ public async getLocales(query: {
39
+ page: number;
40
+ pageSize: number;
41
+ orders?: BridgeOrderBy;
42
+ }): Promise<PaginationInterface<LocalesSchema>> {
43
+ const paginationParams = await this.paginationValidator.getThrow(query);
44
+
45
+ const result = await this.apiLocaleService.getLocales({
46
+ page: paginationParams.page,
47
+ pageSize: paginationParams.pageSize,
48
+ orderBy: paginationParams?.orders
49
+ });
50
+
51
+ return result;
52
+ }
53
+
54
+ /**
55
+ * @override
56
+ */
57
+ public async createLocale(
58
+ body: Omit<LocalesSchema, 'id' | 'created_at' | 'updated_at'>
59
+ ): Promise<{ success: boolean }> {
60
+ const localesParams = await this.localesValidator.getThrow(body);
61
+
62
+ await this.apiLocaleService.create(localesParams);
63
+
64
+ return {
65
+ success: true
66
+ };
67
+ }
68
+ /**
69
+ * @override
70
+ */
71
+ public async updateLocale(body: Partial<LocalesSchema>): Promise<void> {
72
+ await this.apiLocaleService.update(body);
73
+ }
74
+ /**
75
+ * @override
76
+ */
77
+ public async importLocales(formData: unknown): Promise<UpsertResult> {
78
+ const localesParams = await this.localesImportValidator.getThrow({
79
+ values: formData
80
+ });
81
+
82
+ const result = await this.apiLocaleService.importLocales(localesParams);
83
+
84
+ return result;
85
+ }
86
+ }
@@ -0,0 +1,42 @@
1
+ import { inject, injectable } from 'inversify';
2
+
3
+ import type { UserSchema } from '@migrations/schema/UserSchema';
4
+ import { UserRepository } from '../repositorys/UserRepository';
5
+ import { ApiUserService } from '../services/ApiUserService';
6
+ import { PaginationValidator } from '../validators/PaginationValidator';
7
+ import type { AdminUserControllerInterface } from '../port/AdminUserControllerInterface';
8
+ import type { BridgeOrderBy } from '../port/DBBridgeInterface';
9
+ import type { PaginationInterface } from '../port/PaginationInterface';
10
+ import type { UserRepositoryInterface } from '../port/UserRepositoryInterface';
11
+ import type { ValidatorInterface } from '../port/ValidatorInterface';
12
+ import type { PaginationParams } from '../validators/PaginationValidator';
13
+
14
+ @injectable()
15
+ export class AdminUserController implements AdminUserControllerInterface {
16
+ constructor(
17
+ @inject(UserRepository)
18
+ protected userRepository: UserRepositoryInterface,
19
+ @inject(PaginationValidator)
20
+ protected paginationValidator: ValidatorInterface<PaginationParams>,
21
+ @inject(ApiUserService)
22
+ protected apiUserService: ApiUserService
23
+ ) {}
24
+
25
+ /**
26
+ * @override
27
+ */
28
+ public async getUsers(query: {
29
+ page: number;
30
+ pageSize: number;
31
+ orderBy?: BridgeOrderBy;
32
+ }): Promise<PaginationInterface<UserSchema>> {
33
+ const paginationParams = await this.paginationValidator.getThrow(query);
34
+
35
+ const result = await this.apiUserService.getUsers({
36
+ page: paginationParams.page,
37
+ pageSize: paginationParams.pageSize
38
+ });
39
+
40
+ return result;
41
+ }
42
+ }
@@ -0,0 +1,36 @@
1
+ import { inject, injectable } from 'inversify';
2
+ import { i18nConfig } from '@config/i18n';
3
+ import type { LocaleType } from '@config/i18n';
4
+ import { ApiLocaleService } from '../services/ApiLocaleService';
5
+ import type {
6
+ LocalesControllerInterface,
7
+ LocalesControllerJsonQuery
8
+ } from '../port/LocalesControllerInterface';
9
+
10
+ @injectable()
11
+ export class LocalesController implements LocalesControllerInterface {
12
+ constructor(
13
+ @inject(ApiLocaleService)
14
+ protected apiLocaleService: ApiLocaleService
15
+ ) {}
16
+
17
+ /**
18
+ * @override
19
+ */
20
+ public async json(
21
+ query: LocalesControllerJsonQuery
22
+ ): Promise<Record<string, string>> {
23
+ const locale = query.locale as LocaleType;
24
+
25
+ if (!locale || !i18nConfig.supportedLngs.includes(locale)) {
26
+ return {};
27
+ }
28
+
29
+ const result = await this.apiLocaleService.getLocalesJson(
30
+ locale,
31
+ query.orderBy
32
+ );
33
+
34
+ return result;
35
+ }
36
+ }
@@ -0,0 +1,86 @@
1
+ import { ExecutorError } from '@qlover/fe-corekit';
2
+ import { inject, injectable } from 'inversify';
3
+ import { StringEncryptor } from '@/base/cases/StringEncryptor';
4
+ import type { UserSchema } from '@migrations/schema/UserSchema';
5
+ import { ServerAuth } from '../ServerAuth';
6
+ import { UserService } from '../services/UserService';
7
+ import {
8
+ LoginValidator,
9
+ type LoginValidatorData
10
+ } from '../validators/LoginValidator';
11
+ import type { ServerAuthInterface } from '../port/ServerAuthInterface';
12
+ import type { UserControllerInerface } from '../port/UserControllerInerface';
13
+ import type { UserServiceInterface } from '../port/UserServiceInterface';
14
+ import type { ValidatorInterface } from '../port/ValidatorInterface';
15
+ import type { Encryptor } from '@qlover/fe-corekit';
16
+
17
+ @injectable()
18
+ export class UserController implements UserControllerInerface {
19
+ constructor(
20
+ @inject(ServerAuth) protected serverAuth: ServerAuthInterface,
21
+ @inject(StringEncryptor)
22
+ protected stringEncryptor: Encryptor<string, string>,
23
+ @inject(LoginValidator)
24
+ protected loginValidator: ValidatorInterface<LoginValidatorData>,
25
+ @inject(UserService) protected userService: UserServiceInterface
26
+ ) {}
27
+
28
+ /**
29
+ * @override
30
+ */
31
+ public async login(requestBody: LoginValidatorData): Promise<UserSchema> {
32
+ try {
33
+ if (requestBody.password) {
34
+ requestBody.password = this.stringEncryptor.decrypt(
35
+ requestBody.password
36
+ );
37
+ }
38
+ } catch {
39
+ throw new ExecutorError(
40
+ 'encrypt_password_failed',
41
+ 'Encrypt password failed'
42
+ );
43
+ }
44
+ const body = await this.loginValidator.getThrow(requestBody);
45
+
46
+ const user = await this.userService.login(body);
47
+
48
+ await this.serverAuth.setAuth(user.credential_token);
49
+
50
+ return user;
51
+ }
52
+
53
+ /**
54
+ * @override
55
+ */
56
+ public async register(requestBody: LoginValidatorData): Promise<UserSchema> {
57
+ try {
58
+ if (requestBody.password) {
59
+ requestBody.password = this.stringEncryptor.decrypt(
60
+ requestBody.password
61
+ );
62
+ }
63
+ } catch {
64
+ throw new ExecutorError(
65
+ 'encrypt_password_failed',
66
+ 'Encrypt password failed'
67
+ );
68
+ }
69
+
70
+ const body = await this.loginValidator.getThrow(requestBody);
71
+
72
+ const user = await this.userService.register({
73
+ email: body.email,
74
+ password: body.password
75
+ });
76
+
77
+ return user;
78
+ }
79
+
80
+ /**
81
+ * @override
82
+ */
83
+ public async logout(): Promise<void> {
84
+ return await this.userService.logout();
85
+ }
86
+ }
@@ -0,0 +1,8 @@
1
+ import type { AppApiResult } from '@/base/port/AppApiInterface';
2
+ import type { ChatCompletionMessageParam } from 'openai/resources/chat/completions';
3
+
4
+ export interface AIControllerInterface {
5
+ completions(body: {
6
+ messages: ChatCompletionMessageParam[];
7
+ }): Promise<AppApiResult<unknown>>;
8
+ }
@@ -0,0 +1,21 @@
1
+ import type { LocalesSchema } from '@migrations/schema/LocalesSchema';
2
+ import type { BridgeOrderBy } from './DBBridgeInterface';
3
+ import type { UpsertResult } from './LocalesRepositoryInterface';
4
+ import type { PaginationInterface } from './PaginationInterface';
5
+ import type { ImportLocalesData } from '../services/ApiLocaleService';
6
+
7
+ export interface AdminLocalesControllerInterface {
8
+ getLocales(query: {
9
+ page: number;
10
+ pageSize: number;
11
+ orderBy?: BridgeOrderBy;
12
+ }): Promise<PaginationInterface<LocalesSchema>>;
13
+
14
+ createLocale(
15
+ body: Omit<LocalesSchema, 'id' | 'created_at' | 'updated_at'>
16
+ ): Promise<{ success: boolean }>;
17
+
18
+ updateLocale(body: Partial<LocalesSchema>): Promise<void>;
19
+
20
+ importLocales(formData: ImportLocalesData): Promise<UpsertResult>;
21
+ }
@@ -0,0 +1,11 @@
1
+ import type { UserSchema } from '@migrations/schema/UserSchema';
2
+ import type { BridgeOrderBy } from './DBBridgeInterface';
3
+ import type { PaginationInterface } from './PaginationInterface';
4
+
5
+ export interface AdminUserControllerInterface {
6
+ getUsers(query: {
7
+ page: number;
8
+ pageSize: number;
9
+ orderBy?: BridgeOrderBy;
10
+ }): Promise<PaginationInterface<UserSchema>>;
11
+ }
@@ -0,0 +1,10 @@
1
+ import type { BridgeOrderBy } from './DBBridgeInterface';
2
+
3
+ export interface LocalesControllerJsonQuery {
4
+ locale: string;
5
+ orderBy?: BridgeOrderBy;
6
+ }
7
+
8
+ export interface LocalesControllerInterface {
9
+ json(query: LocalesControllerJsonQuery): Promise<Record<string, string>>;
10
+ }
@@ -1,11 +1,18 @@
1
1
  import type { PageI18nInterface } from '@config/i18n';
2
2
 
3
- export interface ParamsHandlerInterface {
3
+ /**
4
+ * 用于处理页面渲染的路由参数处理接口
5
+ */
6
+ export interface RouteParamsnHandlerInterface {
4
7
  getLocale(defaultLocale?: string): string;
5
8
  getI18nWithNotFound(): string;
6
- getI18nMessages(): Promise<Record<string, string>>;
9
+ getI18nMessages(
10
+ namespace?: string | string[]
11
+ ): Promise<Record<string, string>>;
7
12
  getI18nInterface<T extends PageI18nInterface>(
8
13
  i18nInterface: T,
9
14
  namespace?: string
10
15
  ): Promise<T>;
16
+
17
+ getTheme(): string | Promise<string>;
11
18
  }
@@ -3,9 +3,9 @@ import { type IOCIdentifierMapServer } from '@config/IOCIdentifier';
3
3
  import type {
4
4
  ServiceIdentifier,
5
5
  IOCContainerInterface,
6
- IOCFunctionInterface,
7
- LoggerInterface
6
+ IOCFunctionInterface
8
7
  } from '@qlover/corekit-bridge';
8
+ import type { LoggerInterface } from '@qlover/logger';
9
9
 
10
10
  export interface ServerInterface {
11
11
  readonly logger: LoggerInterface;
@@ -0,0 +1,8 @@
1
+ import type { UserSchema } from '@migrations/schema/UserSchema';
2
+ import type { LoginValidatorData } from '../validators/LoginValidator';
3
+
4
+ export interface UserControllerInerface {
5
+ login(body: LoginValidatorData): Promise<UserSchema>;
6
+ register(body: LoginValidatorData): Promise<UserSchema>;
7
+ logout(): Promise<void>;
8
+ }
@@ -2,7 +2,7 @@ import type { UserSchema } from '@migrations/schema/UserSchema';
2
2
 
3
3
  export interface UserServiceInterface {
4
4
  register(params: { email: string; password: string }): Promise<UserSchema>;
5
- login(params: { email: string; password: string }): Promise<unknown>;
5
+ login(params: { email: string; password: string }): Promise<UserSchema>;
6
6
 
7
7
  logout(): Promise<void>;
8
8
  }
@@ -3,7 +3,7 @@ export interface ValidationFaildResult {
3
3
  message: string;
4
4
  }
5
5
 
6
- export interface ValidatorInterface {
6
+ export interface ValidatorInterface<T> {
7
7
  /**
8
8
  * Validate the data and return validation result
9
9
  * @param data - The data to validate
@@ -19,5 +19,5 @@ export interface ValidatorInterface {
19
19
  * @returns The data if it is valid
20
20
  * @throws {import('@qlover/fe-corekit').ExecutorError} if the data is invalid, with validation errors
21
21
  */
22
- getThrow(data: unknown): unknown;
22
+ getThrow(data: unknown): Promise<T> | T;
23
23
  }