@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.
- package/CHANGELOG.md +178 -0
- package/dist/configs/_common/.github/workflows/general-check.yml +1 -1
- package/dist/configs/_common/.github/workflows/release.yml +2 -2
- package/dist/index.cjs +4 -4
- package/dist/index.js +4 -4
- package/dist/templates/next-app/config/IOCIdentifier.ts +2 -2
- package/dist/templates/next-app/config/Identifier/common/common.ts +14 -0
- package/dist/templates/next-app/config/Identifier/pages/index.ts +1 -0
- package/dist/templates/next-app/config/Identifier/pages/page.about.ts +20 -0
- package/dist/templates/next-app/config/common.ts +1 -1
- package/dist/templates/next-app/config/cookies.ts +23 -0
- package/dist/templates/next-app/config/i18n/AboutI18n.ts +14 -0
- package/dist/templates/next-app/config/i18n/i18nConfig.ts +3 -1
- package/dist/templates/next-app/config/i18n/index.ts +1 -0
- package/dist/templates/next-app/config/i18n/loginI18n.ts +8 -0
- package/dist/templates/next-app/config/theme.ts +4 -0
- package/dist/templates/next-app/eslint.config.mjs +9 -2
- package/dist/templates/next-app/next.config.ts +1 -0
- package/dist/templates/next-app/package.json +17 -6
- package/dist/templates/next-app/public/locales/en.json +5 -0
- package/dist/templates/next-app/public/locales/zh.json +5 -0
- package/dist/templates/next-app/src/app/[locale]/admin/AdminI18nProvider.tsx +37 -0
- package/dist/templates/next-app/src/app/[locale]/admin/layout.tsx +30 -6
- package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +1 -1
- package/dist/templates/next-app/src/app/[locale]/layout.tsx +47 -10
- package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +1 -1
- package/dist/templates/next-app/src/app/[locale]/login/page.tsx +22 -10
- package/dist/templates/next-app/src/app/[locale]/page.tsx +23 -8
- package/dist/templates/next-app/src/app/[locale]/register/page.tsx +21 -9
- package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +7 -28
- package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +7 -34
- package/dist/templates/next-app/src/app/api/admin/locales/route.ts +12 -34
- package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +7 -26
- package/dist/templates/next-app/src/app/api/admin/users/route.ts +14 -33
- package/dist/templates/next-app/src/app/api/locales/json/route.ts +13 -25
- package/dist/templates/next-app/src/app/api/user/login/route.ts +6 -46
- package/dist/templates/next-app/src/app/api/user/logout/route.ts +5 -24
- package/dist/templates/next-app/src/app/api/user/register/route.ts +6 -45
- package/dist/templates/next-app/src/app/manifest.ts +16 -0
- package/dist/templates/next-app/src/app/robots.txt +2 -0
- package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +3 -3
- package/dist/templates/next-app/src/base/cases/AppConfig.ts +14 -13
- package/dist/templates/next-app/src/base/cases/Datetime.ts +3 -3
- package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +8 -2
- package/dist/templates/next-app/src/base/cases/DialogHandler.ts +30 -4
- package/dist/templates/next-app/src/base/cases/InversifyContainer.ts +16 -4
- package/dist/templates/next-app/src/base/cases/NavigateBridge.ts +20 -4
- package/dist/templates/next-app/src/base/cases/RequestEncryptPlugin.ts +8 -2
- package/dist/templates/next-app/src/base/cases/ResourceState.ts +3 -3
- package/dist/templates/next-app/src/base/cases/RouterService.ts +28 -10
- package/dist/templates/next-app/src/base/cases/StringEncryptor.ts +14 -2
- package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +1 -1
- package/dist/templates/next-app/src/base/cases/UserServiceApi.ts +20 -5
- package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +31 -8
- package/dist/templates/next-app/src/base/port/AdminLayoutInterface.ts +4 -1
- package/dist/templates/next-app/src/base/port/AppApiInterface.ts +22 -0
- package/dist/templates/next-app/src/base/port/I18nServiceInterface.ts +27 -7
- package/dist/templates/next-app/src/base/port/IOCInterface.ts +9 -0
- package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +1 -1
- package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +3 -3
- package/dist/templates/next-app/src/base/services/I18nService.ts +20 -10
- package/dist/templates/next-app/src/base/services/ResourceService.ts +32 -11
- package/dist/templates/next-app/src/base/services/UserService.ts +12 -3
- package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +9 -6
- package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +20 -5
- package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +21 -4
- package/dist/templates/next-app/src/base/services/appApi/AppUserApi.ts +12 -3
- package/dist/templates/next-app/src/base/services/appApi/AppUserApiBootstrap.ts +10 -2
- package/dist/templates/next-app/src/base/types/{PageProps.ts → AppPageRouter.ts} +4 -1
- package/dist/templates/next-app/src/base/types/PagesRouter.ts +9 -0
- package/dist/templates/next-app/src/core/bootstraps/BootstrapClient.ts +20 -6
- package/dist/templates/next-app/src/core/bootstraps/BootstrapServer.ts +27 -9
- package/dist/templates/next-app/src/core/bootstraps/BootstrapsRegistry.ts +6 -4
- package/dist/templates/next-app/src/core/clientIoc/ClientIOC.ts +39 -9
- package/dist/templates/next-app/src/core/clientIoc/ClientIOCRegister.ts +9 -2
- package/dist/templates/next-app/src/core/serverIoc/ServerIOC.ts +37 -10
- package/dist/templates/next-app/src/core/serverIoc/ServerIOCRegister.ts +9 -2
- package/dist/templates/next-app/src/i18n/loadMessages.ts +103 -0
- package/dist/templates/next-app/src/i18n/request.ts +3 -22
- package/dist/templates/next-app/src/pages/[locale]/about.tsx +61 -0
- package/dist/templates/next-app/src/pages/_app.tsx +50 -0
- package/dist/templates/next-app/src/pages/_document.tsx +13 -0
- package/dist/templates/next-app/src/{middleware.ts → proxy.ts} +2 -1
- package/dist/templates/next-app/src/server/AppErrorApi.ts +1 -1
- package/dist/templates/next-app/src/server/AppPageRouteParams.ts +107 -0
- package/dist/templates/next-app/src/server/AppSuccessApi.ts +1 -1
- package/dist/templates/next-app/src/server/NextApiServer.ts +62 -0
- package/dist/templates/next-app/src/server/PagesRouteParams.ts +146 -0
- package/dist/templates/next-app/src/server/PasswordEncrypt.ts +8 -2
- package/dist/templates/next-app/src/server/ServerAuth.ts +20 -5
- package/dist/templates/next-app/src/server/{sqlBridges/SupabaseBridge.ts → SupabaseBridge.ts} +50 -8
- package/dist/templates/next-app/src/server/UserCredentialToken.ts +8 -2
- package/dist/templates/next-app/src/server/controllers/AdminLocalesController.ts +86 -0
- package/dist/templates/next-app/src/server/controllers/AdminUserController.ts +42 -0
- package/dist/templates/next-app/src/server/controllers/LocalesController.ts +36 -0
- package/dist/templates/next-app/src/server/controllers/UserController.ts +86 -0
- package/dist/templates/next-app/src/server/port/AIControllerInterface.ts +8 -0
- package/dist/templates/next-app/src/server/port/AdminLocalesControllerInterface.ts +21 -0
- package/dist/templates/next-app/src/server/port/AdminUserControllerInterface.ts +11 -0
- package/dist/templates/next-app/src/server/port/LocalesControllerInterface.ts +10 -0
- package/dist/templates/next-app/src/server/port/{ParamsHandlerInterface.ts → RouteParamsnHandlerInterface.ts} +9 -2
- package/dist/templates/next-app/src/server/port/ServerInterface.ts +2 -2
- package/dist/templates/next-app/src/server/port/UserControllerInerface.ts +8 -0
- package/dist/templates/next-app/src/server/port/UserServiceInterface.ts +1 -1
- package/dist/templates/next-app/src/server/port/ValidatorInterface.ts +2 -2
- package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +31 -9
- package/dist/templates/next-app/src/server/repositorys/UserRepository.ts +15 -6
- package/dist/templates/next-app/src/server/services/AIService.ts +3 -1
- package/dist/templates/next-app/src/server/services/AdminAuthPlugin.ts +5 -2
- package/dist/templates/next-app/src/{base → server}/services/AdminLocalesService.ts +2 -2
- package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +29 -14
- package/dist/templates/next-app/src/server/services/ApiUserService.ts +6 -3
- package/dist/templates/next-app/src/server/services/UserService.ts +12 -3
- package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +24 -7
- package/dist/templates/next-app/src/server/validators/LoginValidator.ts +17 -5
- package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +17 -11
- package/dist/templates/next-app/src/styles/css/antd-themes/_common/_default.css +0 -44
- package/dist/templates/next-app/src/styles/css/antd-themes/_common/dark.css +0 -44
- package/dist/templates/next-app/src/styles/css/antd-themes/_common/pink.css +0 -44
- package/dist/templates/next-app/src/styles/css/index.css +1 -1
- package/dist/templates/next-app/src/styles/css/scrollbar.css +34 -0
- package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +34 -11
- package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +69 -39
- package/dist/templates/next-app/src/uikit/components/ClientRootProvider.tsx +64 -0
- package/dist/templates/next-app/src/uikit/components/ClinetRenderProvider.tsx +42 -0
- package/dist/templates/next-app/src/uikit/components/IOCProvider.tsx +34 -0
- package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +7 -1
- package/dist/templates/next-app/src/uikit/components-app/AppBridge.tsx +17 -0
- package/dist/templates/next-app/src/uikit/components-app/AppRoutePage.tsx +112 -0
- package/dist/templates/next-app/src/uikit/{components → components-app}/LanguageSwitcher.tsx +15 -19
- package/dist/templates/next-app/src/uikit/{components → components-app}/ThemeSwitcher.tsx +53 -52
- package/dist/templates/next-app/src/uikit/components-pages/LanguageSwitcher.tsx +98 -0
- package/dist/templates/next-app/src/uikit/components-pages/PagesRoutePage.tsx +93 -0
- package/dist/templates/next-app/src/uikit/context/IOCContext.ts +16 -4
- package/dist/templates/next-app/src/uikit/hook/useStrictEffect.ts +32 -0
- package/dist/templates/next-app/tsconfig.json +3 -2
- package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +3 -1
- package/dist/templates/react-app/__tests__/__mocks__/MockAppConfig.ts +19 -19
- package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +8 -8
- package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +9 -9
- package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +1 -1
- package/dist/templates/react-app/__tests__/__mocks__/i18nextHttpBackend.ts +5 -5
- package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +9 -5
- package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +8 -4
- package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +4 -4
- package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +5 -5
- package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +3 -3
- package/dist/templates/react-app/__tests__/src/uikit/components/chatMessage/ChatRoot.test.tsx +1 -1
- package/dist/templates/react-app/docs/en/components/chat-message-component.md +35 -29
- package/dist/templates/react-app/docs/en/components/chat-message-refactor.md +18 -5
- package/dist/templates/react-app/docs/en/components/message-base-list-component.md +11 -12
- package/dist/templates/react-app/docs/en/request.md +1 -3
- package/dist/templates/react-app/docs/zh/components/chat-message-component.md +35 -29
- package/dist/templates/react-app/docs/zh/components/chat-message-refactor.md +18 -5
- package/dist/templates/react-app/docs/zh/components/message-base-list-component.md +11 -12
- package/dist/templates/react-app/docs/zh/request.md +1 -3
- package/dist/templates/react-app/eslint.config.mjs +10 -5
- package/dist/templates/react-app/src/App.tsx +1 -1
- package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +2 -2
- package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +14 -11
- package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +10 -16
- package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -10
- package/dist/templates/react-app/src/base/cases/AppConfig.ts +19 -19
- package/dist/templates/react-app/src/base/cases/DialogHandler.ts +28 -5
- package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +5 -2
- package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +16 -4
- package/dist/templates/react-app/src/base/cases/PublicAssetsPath.ts +1 -1
- package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +6 -3
- package/dist/templates/react-app/src/base/cases/RequestLogger.ts +17 -8
- package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +4 -6
- package/dist/templates/react-app/src/base/cases/ResourceState.ts +3 -3
- package/dist/templates/react-app/src/base/cases/RouterLoader.ts +3 -3
- package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +1 -1
- package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -2
- package/dist/templates/react-app/src/base/port/IOCInterface.ts +4 -2
- package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +5 -5
- package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +7 -7
- package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +8 -8
- package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +4 -2
- package/dist/templates/react-app/src/base/services/BaseLayoutService.ts +3 -3
- package/dist/templates/react-app/src/base/services/I18nService.ts +24 -13
- package/dist/templates/react-app/src/base/services/IdentifierService.ts +21 -26
- package/dist/templates/react-app/src/base/services/RouteService.ts +8 -8
- package/dist/templates/react-app/src/base/services/UserBootstrap.ts +2 -2
- package/dist/templates/react-app/src/base/services/UserGatewayPlugin.ts +9 -5
- package/dist/templates/react-app/src/base/services/UserService.ts +10 -4
- package/dist/templates/react-app/src/core/bootstraps/BootstrapClient.ts +3 -1
- package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +5 -2
- package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +11 -4
- package/dist/templates/react-app/src/core/clientIoc/ClientIOCRegister.ts +5 -4
- package/dist/templates/react-app/src/pages/base/Layout.tsx +1 -1
- package/dist/templates/react-app/src/styles/css/antd-themes/_common/_default.css +0 -44
- package/dist/templates/react-app/src/styles/css/antd-themes/_common/dark.css +0 -44
- package/dist/templates/react-app/src/styles/css/antd-themes/_common/pink.css +0 -44
- package/dist/templates/react-app/src/styles/css/index.css +1 -1
- package/dist/templates/react-app/src/styles/css/scrollbar.css +34 -0
- package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +2 -2
- package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +4 -4
- package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +8 -2
- package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +6 -6
- package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +1 -1
- package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +1 -3
- package/dist/templates/react-app/src/uikit/components/MessageBaseList.tsx +4 -1
- package/dist/templates/react-app/src/uikit/components/chatMessage/ChatMessageBridge.ts +39 -16
- package/dist/templates/react-app/src/uikit/components/chatMessage/MessageApi.ts +4 -2
- package/package.json +3 -3
- package/dist/templates/next-app/src/server/PageParams.ts +0 -66
- package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +0 -80
- package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +0 -65
- package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +0 -58
- package/dist/templates/next-app/src/uikit/components/NextIntlProvider.tsx +0 -21
- package/dist/templates/react-app/makes/eslint-utils.mjs +0 -195
- /package/dist/templates/next-app/{src/app/[locale] → public}/favicon.ico +0 -0
- /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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
65
|
+
/**
|
|
66
|
+
* @override
|
|
67
|
+
*/
|
|
68
|
+
public async throwIfNotAuth(): Promise<void> {
|
|
54
69
|
const hasAuth = await this.hasAuth();
|
|
55
70
|
|
|
56
71
|
if (!hasAuth) {
|
package/dist/templates/next-app/src/server/{sqlBridges/SupabaseBridge.ts → SupabaseBridge.ts}
RENAMED
|
@@ -46,19 +46,30 @@ export class SupabaseBridge implements DBBridgeInterface {
|
|
|
46
46
|
);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
/**
|
|
50
|
+
* @override
|
|
51
|
+
*/
|
|
52
|
+
public getSupabase(): SupabaseClient {
|
|
50
53
|
return this.supabase;
|
|
51
54
|
}
|
|
52
55
|
|
|
53
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3
|
+
/**
|
|
4
|
+
* 用于处理页面渲染的路由参数处理接口
|
|
5
|
+
*/
|
|
6
|
+
export interface RouteParamsnHandlerInterface {
|
|
4
7
|
getLocale(defaultLocale?: string): string;
|
|
5
8
|
getI18nWithNotFound(): string;
|
|
6
|
-
getI18nMessages(
|
|
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<
|
|
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):
|
|
22
|
+
getThrow(data: unknown): Promise<T> | T;
|
|
23
23
|
}
|