@qlover/create-app 0.10.1 → 0.10.2
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 +141 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- 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 +4 -1
- package/dist/templates/next-app/next.config.ts +1 -0
- package/dist/templates/next-app/package.json +13 -4
- 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/NavigateBridge.ts +12 -2
- package/dist/templates/next-app/src/base/cases/RouterService.ts +5 -5
- package/dist/templates/next-app/src/base/port/AppApiInterface.ts +22 -0
- package/dist/templates/next-app/src/base/port/IOCInterface.ts +9 -0
- 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 +19 -5
- package/dist/templates/next-app/src/core/bootstraps/BootstrapServer.ts +2 -2
- package/dist/templates/next-app/src/core/bootstraps/BootstrapsRegistry.ts +0 -1
- package/dist/templates/next-app/src/core/clientIoc/ClientIOC.ts +29 -8
- package/dist/templates/next-app/src/core/clientIoc/ClientIOCRegister.ts +4 -2
- package/dist/templates/next-app/src/core/serverIoc/ServerIOC.ts +25 -7
- package/dist/templates/next-app/src/core/serverIoc/ServerIOCRegister.ts +1 -1
- 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/AppPageRouteParams.ts +94 -0
- package/dist/templates/next-app/src/server/NextApiServer.ts +53 -0
- package/dist/templates/next-app/src/server/PagesRouteParams.ts +136 -0
- package/dist/templates/next-app/src/server/{sqlBridges/SupabaseBridge.ts → SupabaseBridge.ts} +2 -0
- package/dist/templates/next-app/src/server/controllers/AdminLocalesController.ts +74 -0
- package/dist/templates/next-app/src/server/controllers/AdminUserController.ts +39 -0
- package/dist/templates/next-app/src/server/controllers/LocalesController.ts +33 -0
- package/dist/templates/next-app/src/server/controllers/UserController.ts +77 -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 +8 -2
- package/dist/templates/next-app/src/{base → server}/services/AdminLocalesService.ts +2 -2
- package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +25 -10
- package/dist/templates/next-app/src/server/services/ApiUserService.ts +5 -2
- package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +4 -2
- package/dist/templates/next-app/src/server/validators/LoginValidator.ts +1 -1
- package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +10 -10
- 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-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/package.json +1 -1
- 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/next-app/{src/app/[locale] → public}/favicon.ico +0 -0
- /package/dist/templates/next-app/src/uikit/{components → components-app}/LogoutButton.tsx +0 -0
|
@@ -1,25 +1,62 @@
|
|
|
1
1
|
import { NextIntlClientProvider } from 'next-intl';
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { setRequestLocale } from 'next-intl/server';
|
|
3
|
+
import type { PageLayoutProps } from '@/base/types/AppPageRouter';
|
|
4
|
+
import { AppPageRouteParams } from '@/server/AppPageRouteParams';
|
|
5
|
+
import { BootstrapsProvider } from '@/uikit/components/BootstrapsProvider';
|
|
6
|
+
import { ClientRootProvider } from '@/uikit/components/ClientRootProvider';
|
|
7
|
+
import { IOCProvider } from '@/uikit/components/IOCProvider';
|
|
8
|
+
import { i18nConfig } from '@config/i18n';
|
|
6
9
|
import '@/styles/css/index.css';
|
|
10
|
+
import { themeConfig } from '@config/theme';
|
|
11
|
+
|
|
12
|
+
export function generateStaticParams() {
|
|
13
|
+
return i18nConfig.supportedLngs.map((locale) => ({ locale }));
|
|
14
|
+
}
|
|
7
15
|
|
|
16
|
+
/**
|
|
17
|
+
* RootLayout is the root layout for the app
|
|
18
|
+
*
|
|
19
|
+
* 注意事项:
|
|
20
|
+
*
|
|
21
|
+
* 1. Layout 组件建议不要使用类似客户端渲染, 比如 useMountedClient 等这样会导致重渲染时dom节点发生变化,
|
|
22
|
+
* 页面闪烁特别是切换语言时
|
|
23
|
+
*
|
|
24
|
+
* 2. Layout 组件内 IOCProvider 置于顶层, 因为整个项目依赖容器化
|
|
25
|
+
* 在 spa 中项目中,也就是前端渲染时是不需要要区分渲染环境(server 和 client)
|
|
26
|
+
*
|
|
27
|
+
* 3. 除了已有的 provider 外, 尽量使用 ClientRootProvider 包裹所有客户端组件
|
|
28
|
+
*
|
|
29
|
+
* @param children - The children components
|
|
30
|
+
* @param params - The page parameters
|
|
31
|
+
* @returns
|
|
32
|
+
*/
|
|
8
33
|
export default async function RootLayout({
|
|
9
34
|
children,
|
|
10
35
|
params
|
|
11
36
|
}: PageLayoutProps) {
|
|
12
|
-
const pageParams = new
|
|
37
|
+
const pageParams = new AppPageRouteParams(await params!);
|
|
13
38
|
const locale = pageParams.getLocale();
|
|
39
|
+
const theme = await pageParams.getTheme();
|
|
40
|
+
|
|
41
|
+
// Enable static rendering
|
|
42
|
+
setRequestLocale(locale);
|
|
43
|
+
|
|
44
|
+
// Get messages for the current locale to prevent flickering during language switch
|
|
45
|
+
// Load default namespaces (common, api) - admin namespaces are loaded in admin layout
|
|
14
46
|
const messages = await pageParams.getI18nMessages();
|
|
15
47
|
|
|
16
|
-
// TODO: suppressHydrationWarning 暂时解决 hydration 问题
|
|
17
48
|
return (
|
|
18
|
-
<html data-testid="RootLayout" lang={locale}
|
|
49
|
+
<html data-testid="AppRoute-RootLayout" lang={locale} data-theme={theme}>
|
|
19
50
|
<body>
|
|
20
|
-
<
|
|
21
|
-
<
|
|
22
|
-
|
|
51
|
+
<IOCProvider>
|
|
52
|
+
<NextIntlClientProvider locale={locale} messages={messages}>
|
|
53
|
+
<BootstrapsProvider>
|
|
54
|
+
<ClientRootProvider themeConfig={themeConfig}>
|
|
55
|
+
{children}
|
|
56
|
+
</ClientRootProvider>
|
|
57
|
+
</BootstrapsProvider>
|
|
58
|
+
</NextIntlClientProvider>
|
|
59
|
+
</IOCProvider>
|
|
23
60
|
</body>
|
|
24
61
|
</html>
|
|
25
62
|
);
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { notFound } from 'next/navigation';
|
|
2
|
-
import type { PageParamsProps } from '@/base/types/
|
|
2
|
+
import type { PageParamsProps } from '@/base/types/AppPageRouter';
|
|
3
3
|
import { BootstrapServer } from '@/core/bootstraps/BootstrapServer';
|
|
4
4
|
import { redirect } from '@/i18n/routing';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
AppPageRouteParams,
|
|
7
|
+
type PageParamsType
|
|
8
|
+
} from '@/server/AppPageRouteParams';
|
|
6
9
|
import { ServerAuth } from '@/server/ServerAuth';
|
|
7
|
-
import { BaseLayout } from '@/uikit/components/BaseLayout';
|
|
8
10
|
import { FeatureItem } from '@/uikit/components/FeatureItem';
|
|
9
|
-
import {
|
|
11
|
+
import { AppRoutePage } from '@/uikit/components-app/AppRoutePage';
|
|
12
|
+
import { loginI18n, i18nConfig, NS_PAGE_LOGIN } from '@config/i18n';
|
|
13
|
+
import { COMMON_ADMIN_TITLE } from '@config/Identifier';
|
|
10
14
|
import { LoginForm } from './LoginForm';
|
|
11
15
|
import type { Metadata } from 'next';
|
|
12
16
|
|
|
@@ -28,7 +32,7 @@ export async function generateMetadata({
|
|
|
28
32
|
}: {
|
|
29
33
|
params: Promise<PageParamsType>;
|
|
30
34
|
}): Promise<Metadata> {
|
|
31
|
-
const pageParams = new
|
|
35
|
+
const pageParams = new AppPageRouteParams(await params);
|
|
32
36
|
|
|
33
37
|
return await pageParams.getI18nInterface(loginI18n);
|
|
34
38
|
}
|
|
@@ -39,7 +43,7 @@ export default async function LoginPage(props: PageParamsProps) {
|
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
const params = await props.params;
|
|
42
|
-
const pageParams = new
|
|
46
|
+
const pageParams = new AppPageRouteParams(params);
|
|
43
47
|
|
|
44
48
|
const server = new BootstrapServer();
|
|
45
49
|
|
|
@@ -47,11 +51,19 @@ export default async function LoginPage(props: PageParamsProps) {
|
|
|
47
51
|
return redirect({ href: '/', locale: params.locale! });
|
|
48
52
|
}
|
|
49
53
|
|
|
50
|
-
const tt = await pageParams.getI18nInterface(
|
|
54
|
+
const tt = await pageParams.getI18nInterface(
|
|
55
|
+
{ ...loginI18n, adminTitle: COMMON_ADMIN_TITLE },
|
|
56
|
+
NS_PAGE_LOGIN
|
|
57
|
+
);
|
|
51
58
|
|
|
52
59
|
return (
|
|
53
|
-
<
|
|
54
|
-
data-testid="LoginPage"
|
|
60
|
+
<AppRoutePage
|
|
61
|
+
data-testid="AppRoute-LoginPage"
|
|
62
|
+
tt={{
|
|
63
|
+
title: tt.title,
|
|
64
|
+
adminTitle: tt.adminTitle
|
|
65
|
+
}}
|
|
66
|
+
headerHref="/login"
|
|
55
67
|
mainProps={{
|
|
56
68
|
className: 'text-xs1 bg-primary flex min-h-screen'
|
|
57
69
|
}}
|
|
@@ -74,6 +86,6 @@ export default async function LoginPage(props: PageParamsProps) {
|
|
|
74
86
|
<LoginForm tt={tt} />
|
|
75
87
|
</div>
|
|
76
88
|
</div>
|
|
77
|
-
</
|
|
89
|
+
</AppRoutePage>
|
|
78
90
|
);
|
|
79
91
|
}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { Button } from 'antd';
|
|
2
|
-
import type { PageParamsProps } from '@/base/types/
|
|
2
|
+
import type { PageParamsProps } from '@/base/types/AppPageRouter';
|
|
3
3
|
import { BootstrapServer } from '@/core/bootstraps/BootstrapServer';
|
|
4
4
|
import { redirect } from '@/i18n/routing';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
AppPageRouteParams,
|
|
7
|
+
type PageParamsType
|
|
8
|
+
} from '@/server/AppPageRouteParams';
|
|
6
9
|
import { ServerAuth } from '@/server/ServerAuth';
|
|
7
|
-
import {
|
|
10
|
+
import { AppRoutePage } from '@/uikit/components-app/AppRoutePage';
|
|
8
11
|
import { i18nConfig, homeI18n } from '@config/i18n';
|
|
12
|
+
import { COMMON_ADMIN_TITLE } from '@config/Identifier';
|
|
9
13
|
import type { Metadata } from 'next';
|
|
10
14
|
|
|
11
15
|
// const navigationItems = [
|
|
@@ -34,22 +38,33 @@ export async function generateMetadata({
|
|
|
34
38
|
}: {
|
|
35
39
|
params: Promise<PageParamsType>;
|
|
36
40
|
}): Promise<Metadata> {
|
|
37
|
-
const pageParams = new
|
|
41
|
+
const pageParams = new AppPageRouteParams(await params);
|
|
38
42
|
return await pageParams.getI18nInterface(homeI18n);
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
export default async function Home({ params }: PageParamsProps) {
|
|
42
46
|
const server = new BootstrapServer();
|
|
43
|
-
const pageParams = new
|
|
47
|
+
const pageParams = new AppPageRouteParams(await params!);
|
|
44
48
|
const locale = pageParams.getLocale();
|
|
45
|
-
const tt = await pageParams.getI18nInterface(
|
|
49
|
+
const tt = await pageParams.getI18nInterface({
|
|
50
|
+
...homeI18n,
|
|
51
|
+
adminTitle: COMMON_ADMIN_TITLE
|
|
52
|
+
});
|
|
46
53
|
|
|
47
54
|
if (!(await server.getIOC(ServerAuth).hasAuth())) {
|
|
48
55
|
return redirect({ href: '/login', locale });
|
|
49
56
|
}
|
|
50
57
|
|
|
51
58
|
return (
|
|
52
|
-
<
|
|
59
|
+
<AppRoutePage
|
|
60
|
+
data-testid="AppRoute-HomePage"
|
|
61
|
+
showLogoutButton
|
|
62
|
+
showAdminButton
|
|
63
|
+
tt={{
|
|
64
|
+
title: tt.title,
|
|
65
|
+
adminTitle: tt.adminTitle
|
|
66
|
+
}}
|
|
67
|
+
>
|
|
53
68
|
{/* Hero Section */}
|
|
54
69
|
<section className="py-16 px-4">
|
|
55
70
|
<div className="max-w-4xl mx-auto text-center">
|
|
@@ -105,6 +120,6 @@ export default async function Home({ params }: PageParamsProps) {
|
|
|
105
120
|
</Button>
|
|
106
121
|
</div>
|
|
107
122
|
</section>
|
|
108
|
-
</
|
|
123
|
+
</AppRoutePage>
|
|
109
124
|
);
|
|
110
125
|
}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { notFound } from 'next/navigation';
|
|
2
|
-
import type { PageParamsProps } from '@/base/types/
|
|
2
|
+
import type { PageParamsProps } from '@/base/types/AppPageRouter';
|
|
3
3
|
import { BootstrapServer } from '@/core/bootstraps/BootstrapServer';
|
|
4
4
|
import { redirect } from '@/i18n/routing';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
AppPageRouteParams,
|
|
7
|
+
type PageParamsType
|
|
8
|
+
} from '@/server/AppPageRouteParams';
|
|
6
9
|
import { ServerAuth } from '@/server/ServerAuth';
|
|
7
|
-
import { BaseLayout } from '@/uikit/components/BaseLayout';
|
|
8
10
|
import { FeatureItem } from '@/uikit/components/FeatureItem';
|
|
11
|
+
import { AppRoutePage } from '@/uikit/components-app/AppRoutePage';
|
|
9
12
|
import { i18nConfig, register18n } from '@config/i18n';
|
|
13
|
+
import { COMMON_ADMIN_TITLE } from '@config/Identifier';
|
|
10
14
|
import { RegisterForm } from './RegisterForm';
|
|
11
15
|
import type { Metadata } from 'next';
|
|
12
16
|
|
|
@@ -28,7 +32,7 @@ export async function generateMetadata({
|
|
|
28
32
|
}: {
|
|
29
33
|
params: Promise<PageParamsType>;
|
|
30
34
|
}): Promise<Metadata> {
|
|
31
|
-
const pageParams = new
|
|
35
|
+
const pageParams = new AppPageRouteParams(await params);
|
|
32
36
|
|
|
33
37
|
return await pageParams.getI18nInterface(register18n);
|
|
34
38
|
}
|
|
@@ -39,7 +43,7 @@ export default async function LoginPage(props: PageParamsProps) {
|
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
const params = await props.params;
|
|
42
|
-
const pageParams = new
|
|
46
|
+
const pageParams = new AppPageRouteParams(params);
|
|
43
47
|
|
|
44
48
|
const server = new BootstrapServer();
|
|
45
49
|
|
|
@@ -47,11 +51,19 @@ export default async function LoginPage(props: PageParamsProps) {
|
|
|
47
51
|
return redirect({ href: '/', locale: params.locale! });
|
|
48
52
|
}
|
|
49
53
|
|
|
50
|
-
const tt = await pageParams.getI18nInterface(
|
|
54
|
+
const tt = await pageParams.getI18nInterface({
|
|
55
|
+
...register18n,
|
|
56
|
+
adminTitle: COMMON_ADMIN_TITLE
|
|
57
|
+
});
|
|
51
58
|
|
|
52
59
|
return (
|
|
53
|
-
<
|
|
54
|
-
data-testid="RegisterPage"
|
|
60
|
+
<AppRoutePage
|
|
61
|
+
data-testid="AppRoute-RegisterPage"
|
|
62
|
+
tt={{
|
|
63
|
+
title: tt.title,
|
|
64
|
+
adminTitle: tt.adminTitle
|
|
65
|
+
}}
|
|
66
|
+
headerHref="/login"
|
|
55
67
|
mainProps={{
|
|
56
68
|
className: 'text-xs1 bg-primary flex min-h-screen'
|
|
57
69
|
}}
|
|
@@ -74,6 +86,6 @@ export default async function LoginPage(props: PageParamsProps) {
|
|
|
74
86
|
<RegisterForm tt={tt} />
|
|
75
87
|
</div>
|
|
76
88
|
</div>
|
|
77
|
-
</
|
|
89
|
+
</AppRoutePage>
|
|
78
90
|
);
|
|
79
91
|
}
|
|
@@ -1,34 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { BootstrapServer } from '@/core/bootstraps/BootstrapServer';
|
|
4
|
-
import { AppErrorApi } from '@/server/AppErrorApi';
|
|
5
|
-
import { AppSuccessApi } from '@/server/AppSuccessApi';
|
|
1
|
+
import { AdminLocalesController } from '@/server/controllers/AdminLocalesController';
|
|
2
|
+
import { NextApiServer } from '@/server/NextApiServer';
|
|
6
3
|
import { AdminAuthPlugin } from '@/server/services/AdminAuthPlugin';
|
|
7
|
-
import { ApiLocaleService } from '@/server/services/ApiLocaleService';
|
|
8
|
-
import { LocalesValidator } from '@/server/validators/LocalesValidator';
|
|
9
4
|
import type { NextRequest } from 'next/server';
|
|
10
5
|
|
|
11
6
|
export async function POST(req: NextRequest) {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
const result = await server
|
|
7
|
+
const requestBody = await req.json();
|
|
8
|
+
return await new NextApiServer()
|
|
15
9
|
.use(new AdminAuthPlugin())
|
|
16
|
-
.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const adminLocalesService = IOC(ApiLocaleService);
|
|
20
|
-
await adminLocalesService.create(localesParams);
|
|
21
|
-
return {
|
|
22
|
-
success: true
|
|
23
|
-
};
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
if (result instanceof ExecutorError) {
|
|
27
|
-
console.error(result);
|
|
28
|
-
return NextResponse.json(new AppErrorApi(result.id, result.message), {
|
|
29
|
-
status: 400
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return NextResponse.json(new AppSuccessApi(result));
|
|
10
|
+
.runWithJson(async ({ parameters: { IOC } }) =>
|
|
11
|
+
IOC(AdminLocalesController).createLocale(requestBody)
|
|
12
|
+
);
|
|
34
13
|
}
|
|
@@ -1,40 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { BootstrapServer } from '@/core/bootstraps/BootstrapServer';
|
|
4
|
-
import { AppErrorApi } from '@/server/AppErrorApi';
|
|
5
|
-
import { AppSuccessApi } from '@/server/AppSuccessApi';
|
|
1
|
+
import { AdminLocalesController } from '@/server/controllers/AdminLocalesController';
|
|
2
|
+
import { NextApiServer } from '@/server/NextApiServer';
|
|
6
3
|
import { AdminAuthPlugin } from '@/server/services/AdminAuthPlugin';
|
|
7
|
-
import { ApiLocaleService } from '@/server/services/ApiLocaleService';
|
|
8
|
-
import { LocalesImportValidator } from '@/server/validators/LocalesValidator';
|
|
9
4
|
import type { NextRequest } from 'next/server';
|
|
10
5
|
|
|
11
6
|
export async function POST(req: NextRequest) {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
const result = await server
|
|
7
|
+
const formData = await req.formData();
|
|
8
|
+
return await new NextApiServer()
|
|
15
9
|
.use(new AdminAuthPlugin())
|
|
16
|
-
.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const localesParams = await IOC(LocalesImportValidator).getThrow({
|
|
20
|
-
values: formData
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const adminLocalesService = IOC(ApiLocaleService);
|
|
24
|
-
|
|
25
|
-
const result = await adminLocalesService.importLocales(localesParams);
|
|
26
|
-
return {
|
|
27
|
-
success: true,
|
|
28
|
-
data: result
|
|
29
|
-
};
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
if (result instanceof ExecutorError) {
|
|
33
|
-
console.error(result);
|
|
34
|
-
return NextResponse.json(new AppErrorApi(result.id, result.message), {
|
|
35
|
-
status: 400
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return NextResponse.json(new AppSuccessApi(result));
|
|
10
|
+
.runWithJson(async ({ parameters: { IOC } }) =>
|
|
11
|
+
IOC(AdminLocalesController).importLocales(formData)
|
|
12
|
+
);
|
|
40
13
|
}
|
|
@@ -1,42 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { AppErrorApi } from '@/server/AppErrorApi';
|
|
5
|
-
import { AppSuccessApi } from '@/server/AppSuccessApi';
|
|
1
|
+
import { AdminLocalesController } from '@/server/controllers/AdminLocalesController';
|
|
2
|
+
import { NextApiServer } from '@/server/NextApiServer';
|
|
3
|
+
import type { BridgeOrderBy } from '@/server/port/DBBridgeInterface';
|
|
6
4
|
import { AdminAuthPlugin } from '@/server/services/AdminAuthPlugin';
|
|
7
|
-
import { ApiLocaleService } from '@/server/services/ApiLocaleService';
|
|
8
|
-
import { PaginationValidator } from '@/server/validators/PaginationValidator';
|
|
9
5
|
import type { NextRequest } from 'next/server';
|
|
10
6
|
|
|
11
7
|
export async function GET(req: NextRequest) {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
const result = await server
|
|
8
|
+
const searchParams = Object.fromEntries(req.nextUrl.searchParams.entries());
|
|
9
|
+
return await new NextApiServer()
|
|
15
10
|
.use(new AdminAuthPlugin())
|
|
16
|
-
.
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
.runWithJson(async ({ parameters: { IOC } }) => {
|
|
12
|
+
return IOC(AdminLocalesController).getLocales(
|
|
13
|
+
searchParams as unknown as {
|
|
14
|
+
page: number;
|
|
15
|
+
pageSize: number;
|
|
16
|
+
orders?: BridgeOrderBy;
|
|
17
|
+
}
|
|
19
18
|
);
|
|
20
|
-
|
|
21
|
-
const paginationParams = IOC(PaginationValidator).getThrow(searchParams);
|
|
22
|
-
|
|
23
|
-
const apiUserService = IOC(ApiLocaleService);
|
|
24
|
-
|
|
25
|
-
const result = await apiUserService.getLocales({
|
|
26
|
-
page: paginationParams.page,
|
|
27
|
-
pageSize: paginationParams.pageSize,
|
|
28
|
-
orderBy: paginationParams.orders
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
return result;
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
if (result instanceof ExecutorError) {
|
|
35
|
-
console.error(result);
|
|
36
|
-
return NextResponse.json(new AppErrorApi(result.id, result.message), {
|
|
37
|
-
status: 400
|
|
38
19
|
});
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return NextResponse.json(new AppSuccessApi(result));
|
|
42
20
|
}
|
|
@@ -1,32 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { BootstrapServer } from '@/core/bootstraps/BootstrapServer';
|
|
4
|
-
import { AppErrorApi } from '@/server/AppErrorApi';
|
|
5
|
-
import { AppSuccessApi } from '@/server/AppSuccessApi';
|
|
1
|
+
import { AdminLocalesController } from '@/server/controllers/AdminLocalesController';
|
|
2
|
+
import { NextApiServer } from '@/server/NextApiServer';
|
|
6
3
|
import { AdminAuthPlugin } from '@/server/services/AdminAuthPlugin';
|
|
7
|
-
import { ApiLocaleService } from '@/server/services/ApiLocaleService';
|
|
8
4
|
import type { NextRequest } from 'next/server';
|
|
9
5
|
|
|
10
6
|
export async function POST(req: NextRequest) {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
const result = await server
|
|
7
|
+
const requestBody = await req.json();
|
|
8
|
+
return await new NextApiServer()
|
|
14
9
|
.use(new AdminAuthPlugin())
|
|
15
|
-
.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
await adminLocalesService.update(requestBody);
|
|
19
|
-
return {
|
|
20
|
-
success: true
|
|
21
|
-
};
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
if (result instanceof ExecutorError) {
|
|
25
|
-
console.error(result);
|
|
26
|
-
return NextResponse.json(new AppErrorApi(result.id, result.message), {
|
|
27
|
-
status: 400
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return NextResponse.json(new AppSuccessApi(result));
|
|
10
|
+
.runWithJson(async ({ parameters: { IOC } }) =>
|
|
11
|
+
IOC(AdminLocalesController).updateLocale(requestBody)
|
|
12
|
+
);
|
|
32
13
|
}
|
|
@@ -1,39 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { AppErrorApi } from '@/server/AppErrorApi';
|
|
5
|
-
import { AppSuccessApi } from '@/server/AppSuccessApi';
|
|
1
|
+
import { AdminUserController } from '@/server/controllers/AdminUserController';
|
|
2
|
+
import { NextApiServer } from '@/server/NextApiServer';
|
|
3
|
+
import type { BridgeOrderBy } from '@/server/port/DBBridgeInterface';
|
|
6
4
|
import { AdminAuthPlugin } from '@/server/services/AdminAuthPlugin';
|
|
7
|
-
import { ApiUserService } from '@/server/services/ApiUserService';
|
|
8
|
-
import { PaginationValidator } from '@/server/validators/PaginationValidator';
|
|
9
5
|
import type { NextRequest } from 'next/server';
|
|
10
6
|
|
|
11
7
|
export async function GET(req: NextRequest) {
|
|
12
|
-
const
|
|
8
|
+
const searchParams = Object.fromEntries(req.nextUrl.searchParams.entries());
|
|
13
9
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const result = await apiUserService.getUsers({
|
|
25
|
-
page: paginationParams.page,
|
|
26
|
-
pageSize: paginationParams.pageSize
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
return result;
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
if (result instanceof ExecutorError) {
|
|
33
|
-
return NextResponse.json(new AppErrorApi(result.id, result.message), {
|
|
34
|
-
status: 400
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return NextResponse.json(new AppSuccessApi(result));
|
|
10
|
+
return await new NextApiServer().use(new AdminAuthPlugin()).runWithJson(
|
|
11
|
+
async ({ parameters: { IOC } }) =>
|
|
12
|
+
await IOC(AdminUserController).getUsers(
|
|
13
|
+
searchParams as unknown as {
|
|
14
|
+
page: number;
|
|
15
|
+
pageSize: number;
|
|
16
|
+
orderBy?: BridgeOrderBy;
|
|
17
|
+
}
|
|
18
|
+
)
|
|
19
|
+
);
|
|
39
20
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ExecutorError } from '@qlover/fe-corekit';
|
|
2
1
|
import { NextResponse, type NextRequest } from 'next/server';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { LocalesController } from '@/server/controllers/LocalesController';
|
|
3
|
+
import { NextApiServer } from '@/server/NextApiServer';
|
|
4
|
+
import type { LocalesControllerJsonQuery } from '@/server/port/LocalesControllerInterface';
|
|
6
5
|
import type { LocaleType } from '@config/i18n';
|
|
6
|
+
import { i18nConfig } from '@config/i18n';
|
|
7
7
|
|
|
8
8
|
// Use literal value instead of imported config to ensure static analysis
|
|
9
9
|
export const revalidate = 60; // Cache time in seconds (matches i18nConfig.localeCacheTime)
|
|
@@ -12,30 +12,18 @@ export async function GET(req: NextRequest) {
|
|
|
12
12
|
const searchParams = Object.fromEntries(req.nextUrl.searchParams.entries());
|
|
13
13
|
const locale = searchParams.locale as LocaleType;
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const result = await server.execNoError(async ({ parameters: { IOC } }) => {
|
|
22
|
-
const localesService = IOC(ApiLocaleService);
|
|
23
|
-
const result = await localesService.getLocalesJson(locale);
|
|
24
|
-
|
|
25
|
-
return result;
|
|
26
|
-
});
|
|
15
|
+
const result = await new NextApiServer().run(
|
|
16
|
+
async ({ parameters: { IOC } }) =>
|
|
17
|
+
IOC(LocalesController).json(
|
|
18
|
+
searchParams as unknown as LocalesControllerJsonQuery
|
|
19
|
+
)
|
|
20
|
+
);
|
|
27
21
|
|
|
28
|
-
if (result
|
|
29
|
-
|
|
30
|
-
return NextResponse.json(
|
|
31
|
-
{},
|
|
32
|
-
{
|
|
33
|
-
status: 400
|
|
34
|
-
}
|
|
35
|
-
);
|
|
22
|
+
if (!result.success) {
|
|
23
|
+
return NextResponse.json({});
|
|
36
24
|
}
|
|
37
25
|
|
|
38
|
-
const response = NextResponse.json(result);
|
|
26
|
+
const response = NextResponse.json(result.data);
|
|
39
27
|
response.headers.set(
|
|
40
28
|
'Cache-Control',
|
|
41
29
|
`s-maxage=${i18nConfig.localeCacheTime}`
|
|
@@ -1,50 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { StringEncryptor } from '@/base/cases/StringEncryptor';
|
|
4
|
-
import { BootstrapServer } from '@/core/bootstraps/BootstrapServer';
|
|
5
|
-
import { AppErrorApi } from '@/server/AppErrorApi';
|
|
6
|
-
import { AppSuccessApi } from '@/server/AppSuccessApi';
|
|
7
|
-
import type { UserServiceInterface } from '@/server/port/UserServiceInterface';
|
|
8
|
-
import { ServerAuth } from '@/server/ServerAuth';
|
|
9
|
-
import { UserService } from '@/server/services/UserService';
|
|
10
|
-
import { LoginValidator } from '@/server/validators/LoginValidator';
|
|
11
|
-
import type { UserSchema } from '@migrations/schema/UserSchema';
|
|
1
|
+
import { UserController } from '@/server/controllers/UserController';
|
|
2
|
+
import { NextApiServer } from '@/server/NextApiServer';
|
|
12
3
|
import type { NextRequest } from 'next/server';
|
|
13
4
|
|
|
14
5
|
export async function POST(req: NextRequest) {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
-
if (requestBody.password) {
|
|
22
|
-
requestBody.password = IOC(StringEncryptor).decrypt(
|
|
23
|
-
requestBody.password
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
} catch {
|
|
27
|
-
throw new ExecutorError(
|
|
28
|
-
'encrypt_password_failed',
|
|
29
|
-
'Encrypt password failed'
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
const body = IOC(LoginValidator).getThrow(requestBody);
|
|
33
|
-
|
|
34
|
-
const userService: UserServiceInterface = IOC(UserService);
|
|
35
|
-
|
|
36
|
-
const user = (await userService.login(body)) as UserSchema;
|
|
37
|
-
|
|
38
|
-
await IOC(ServerAuth).setAuth(user.credential_token);
|
|
39
|
-
|
|
40
|
-
return user;
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
if (result instanceof ExecutorError) {
|
|
44
|
-
return NextResponse.json(new AppErrorApi(result.id, result.message), {
|
|
45
|
-
status: 400
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return NextResponse.json(new AppSuccessApi(result));
|
|
6
|
+
const requestBody = await req.json();
|
|
7
|
+
return await new NextApiServer().runWithJson(
|
|
8
|
+
async ({ parameters: { IOC } }) => IOC(UserController).login(requestBody)
|
|
9
|
+
);
|
|
50
10
|
}
|