@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.
Files changed (108) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/templates/next-app/config/IOCIdentifier.ts +2 -2
  5. package/dist/templates/next-app/config/Identifier/common/common.ts +14 -0
  6. package/dist/templates/next-app/config/Identifier/pages/index.ts +1 -0
  7. package/dist/templates/next-app/config/Identifier/pages/page.about.ts +20 -0
  8. package/dist/templates/next-app/config/common.ts +1 -1
  9. package/dist/templates/next-app/config/cookies.ts +23 -0
  10. package/dist/templates/next-app/config/i18n/AboutI18n.ts +14 -0
  11. package/dist/templates/next-app/config/i18n/i18nConfig.ts +3 -1
  12. package/dist/templates/next-app/config/i18n/index.ts +1 -0
  13. package/dist/templates/next-app/config/i18n/loginI18n.ts +8 -0
  14. package/dist/templates/next-app/config/theme.ts +4 -0
  15. package/dist/templates/next-app/eslint.config.mjs +4 -1
  16. package/dist/templates/next-app/next.config.ts +1 -0
  17. package/dist/templates/next-app/package.json +13 -4
  18. package/dist/templates/next-app/public/locales/en.json +5 -0
  19. package/dist/templates/next-app/public/locales/zh.json +5 -0
  20. package/dist/templates/next-app/src/app/[locale]/admin/AdminI18nProvider.tsx +37 -0
  21. package/dist/templates/next-app/src/app/[locale]/admin/layout.tsx +30 -6
  22. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +1 -1
  23. package/dist/templates/next-app/src/app/[locale]/layout.tsx +47 -10
  24. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +1 -1
  25. package/dist/templates/next-app/src/app/[locale]/login/page.tsx +22 -10
  26. package/dist/templates/next-app/src/app/[locale]/page.tsx +23 -8
  27. package/dist/templates/next-app/src/app/[locale]/register/page.tsx +21 -9
  28. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +7 -28
  29. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +7 -34
  30. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +12 -34
  31. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +7 -26
  32. package/dist/templates/next-app/src/app/api/admin/users/route.ts +14 -33
  33. package/dist/templates/next-app/src/app/api/locales/json/route.ts +13 -25
  34. package/dist/templates/next-app/src/app/api/user/login/route.ts +6 -46
  35. package/dist/templates/next-app/src/app/api/user/logout/route.ts +5 -24
  36. package/dist/templates/next-app/src/app/api/user/register/route.ts +6 -45
  37. package/dist/templates/next-app/src/app/manifest.ts +16 -0
  38. package/dist/templates/next-app/src/app/robots.txt +2 -0
  39. package/dist/templates/next-app/src/base/cases/NavigateBridge.ts +12 -2
  40. package/dist/templates/next-app/src/base/cases/RouterService.ts +5 -5
  41. package/dist/templates/next-app/src/base/port/AppApiInterface.ts +22 -0
  42. package/dist/templates/next-app/src/base/port/IOCInterface.ts +9 -0
  43. package/dist/templates/next-app/src/base/types/{PageProps.ts → AppPageRouter.ts} +4 -1
  44. package/dist/templates/next-app/src/base/types/PagesRouter.ts +9 -0
  45. package/dist/templates/next-app/src/core/bootstraps/BootstrapClient.ts +19 -5
  46. package/dist/templates/next-app/src/core/bootstraps/BootstrapServer.ts +2 -2
  47. package/dist/templates/next-app/src/core/bootstraps/BootstrapsRegistry.ts +0 -1
  48. package/dist/templates/next-app/src/core/clientIoc/ClientIOC.ts +29 -8
  49. package/dist/templates/next-app/src/core/clientIoc/ClientIOCRegister.ts +4 -2
  50. package/dist/templates/next-app/src/core/serverIoc/ServerIOC.ts +25 -7
  51. package/dist/templates/next-app/src/core/serverIoc/ServerIOCRegister.ts +1 -1
  52. package/dist/templates/next-app/src/i18n/loadMessages.ts +103 -0
  53. package/dist/templates/next-app/src/i18n/request.ts +3 -22
  54. package/dist/templates/next-app/src/pages/[locale]/about.tsx +61 -0
  55. package/dist/templates/next-app/src/pages/_app.tsx +50 -0
  56. package/dist/templates/next-app/src/pages/_document.tsx +13 -0
  57. package/dist/templates/next-app/src/{middleware.ts → proxy.ts} +2 -1
  58. package/dist/templates/next-app/src/server/AppPageRouteParams.ts +94 -0
  59. package/dist/templates/next-app/src/server/NextApiServer.ts +53 -0
  60. package/dist/templates/next-app/src/server/PagesRouteParams.ts +136 -0
  61. package/dist/templates/next-app/src/server/{sqlBridges/SupabaseBridge.ts → SupabaseBridge.ts} +2 -0
  62. package/dist/templates/next-app/src/server/controllers/AdminLocalesController.ts +74 -0
  63. package/dist/templates/next-app/src/server/controllers/AdminUserController.ts +39 -0
  64. package/dist/templates/next-app/src/server/controllers/LocalesController.ts +33 -0
  65. package/dist/templates/next-app/src/server/controllers/UserController.ts +77 -0
  66. package/dist/templates/next-app/src/server/port/AIControllerInterface.ts +8 -0
  67. package/dist/templates/next-app/src/server/port/AdminLocalesControllerInterface.ts +21 -0
  68. package/dist/templates/next-app/src/server/port/AdminUserControllerInterface.ts +11 -0
  69. package/dist/templates/next-app/src/server/port/LocalesControllerInterface.ts +10 -0
  70. package/dist/templates/next-app/src/server/port/{ParamsHandlerInterface.ts → RouteParamsnHandlerInterface.ts} +9 -2
  71. package/dist/templates/next-app/src/server/port/ServerInterface.ts +2 -2
  72. package/dist/templates/next-app/src/server/port/UserControllerInerface.ts +8 -0
  73. package/dist/templates/next-app/src/server/port/UserServiceInterface.ts +1 -1
  74. package/dist/templates/next-app/src/server/port/ValidatorInterface.ts +2 -2
  75. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +8 -2
  76. package/dist/templates/next-app/src/{base → server}/services/AdminLocalesService.ts +2 -2
  77. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +25 -10
  78. package/dist/templates/next-app/src/server/services/ApiUserService.ts +5 -2
  79. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +4 -2
  80. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +1 -1
  81. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +10 -10
  82. package/dist/templates/next-app/src/styles/css/antd-themes/_common/_default.css +0 -44
  83. package/dist/templates/next-app/src/styles/css/antd-themes/_common/dark.css +0 -44
  84. package/dist/templates/next-app/src/styles/css/antd-themes/_common/pink.css +0 -44
  85. package/dist/templates/next-app/src/styles/css/index.css +1 -1
  86. package/dist/templates/next-app/src/styles/css/scrollbar.css +34 -0
  87. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +34 -11
  88. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +69 -39
  89. package/dist/templates/next-app/src/uikit/components/ClientRootProvider.tsx +64 -0
  90. package/dist/templates/next-app/src/uikit/components/ClinetRenderProvider.tsx +42 -0
  91. package/dist/templates/next-app/src/uikit/components/IOCProvider.tsx +34 -0
  92. package/dist/templates/next-app/src/uikit/components-app/AppBridge.tsx +17 -0
  93. package/dist/templates/next-app/src/uikit/components-app/AppRoutePage.tsx +112 -0
  94. package/dist/templates/next-app/src/uikit/{components → components-app}/LanguageSwitcher.tsx +15 -19
  95. package/dist/templates/next-app/src/uikit/{components → components-app}/ThemeSwitcher.tsx +53 -52
  96. package/dist/templates/next-app/src/uikit/components-pages/LanguageSwitcher.tsx +98 -0
  97. package/dist/templates/next-app/src/uikit/components-pages/PagesRoutePage.tsx +93 -0
  98. package/dist/templates/next-app/src/uikit/context/IOCContext.ts +16 -4
  99. package/dist/templates/next-app/src/uikit/hook/useStrictEffect.ts +32 -0
  100. package/dist/templates/next-app/tsconfig.json +3 -2
  101. package/package.json +1 -1
  102. package/dist/templates/next-app/src/server/PageParams.ts +0 -66
  103. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +0 -80
  104. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +0 -65
  105. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +0 -58
  106. package/dist/templates/next-app/src/uikit/components/NextIntlProvider.tsx +0 -21
  107. /package/dist/templates/next-app/{src/app/[locale] → public}/favicon.ico +0 -0
  108. /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 type { PageLayoutProps } from '@/base/types/PageProps';
3
- import { PageParams } from '@/server/PageParams';
4
- import { ComboProvider } from '@/uikit/components/ComboProvider';
5
- import { themeConfig } from '@config/theme';
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 PageParams(await params!);
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} suppressHydrationWarning>
49
+ <html data-testid="AppRoute-RootLayout" lang={locale} data-theme={theme}>
19
50
  <body>
20
- <NextIntlClientProvider locale={locale} messages={messages}>
21
- <ComboProvider themeConfig={themeConfig}>{children}</ComboProvider>
22
- </NextIntlClientProvider>
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
  );
@@ -28,7 +28,7 @@ export function LoginForm(props: { tt: LoginI18nInterface }) {
28
28
  try {
29
29
  setLoading(true);
30
30
  await userService.login(values);
31
- routerService.gotoHome();
31
+ routerService.replaceHome();
32
32
  } catch (error) {
33
33
  logger.error(error);
34
34
  } finally {
@@ -1,12 +1,16 @@
1
1
  import { notFound } from 'next/navigation';
2
- import type { PageParamsProps } from '@/base/types/PageProps';
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 { PageParams, type PageParamsType } from '@/server/PageParams';
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 { loginI18n, i18nConfig } from '@config/i18n';
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 PageParams(await params);
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 PageParams(params);
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(loginI18n);
54
+ const tt = await pageParams.getI18nInterface(
55
+ { ...loginI18n, adminTitle: COMMON_ADMIN_TITLE },
56
+ NS_PAGE_LOGIN
57
+ );
51
58
 
52
59
  return (
53
- <BaseLayout
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
- </BaseLayout>
89
+ </AppRoutePage>
78
90
  );
79
91
  }
@@ -1,11 +1,15 @@
1
1
  import { Button } from 'antd';
2
- import type { PageParamsProps } from '@/base/types/PageProps';
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 { PageParams, type PageParamsType } from '@/server/PageParams';
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';
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 PageParams(await params);
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 PageParams(await params!);
47
+ const pageParams = new AppPageRouteParams(await params!);
44
48
  const locale = pageParams.getLocale();
45
- const tt = await pageParams.getI18nInterface(homeI18n);
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
- <BaseLayout data-testid="HomePage" showLogoutButton showAdminButton>
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
- </BaseLayout>
123
+ </AppRoutePage>
109
124
  );
110
125
  }
@@ -1,12 +1,16 @@
1
1
  import { notFound } from 'next/navigation';
2
- import type { PageParamsProps } from '@/base/types/PageProps';
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 { PageParams, type PageParamsType } from '@/server/PageParams';
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 PageParams(await params);
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 PageParams(params);
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(register18n);
54
+ const tt = await pageParams.getI18nInterface({
55
+ ...register18n,
56
+ adminTitle: COMMON_ADMIN_TITLE
57
+ });
51
58
 
52
59
  return (
53
- <BaseLayout
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
- </BaseLayout>
89
+ </AppRoutePage>
78
90
  );
79
91
  }
@@ -1,34 +1,13 @@
1
- import { ExecutorError } from '@qlover/fe-corekit';
2
- import { NextResponse } from 'next/server';
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 server = new BootstrapServer();
13
-
14
- const result = await server
7
+ const requestBody = await req.json();
8
+ return await new NextApiServer()
15
9
  .use(new AdminAuthPlugin())
16
- .execNoError(async ({ parameters: { IOC } }) => {
17
- const requestBody = await req.json();
18
- const localesParams = IOC(LocalesValidator).getThrow(requestBody);
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 { ExecutorError } from '@qlover/fe-corekit';
2
- import { NextResponse } from 'next/server';
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 server = new BootstrapServer();
13
-
14
- const result = await server
7
+ const formData = await req.formData();
8
+ return await new NextApiServer()
15
9
  .use(new AdminAuthPlugin())
16
- .execNoError(async ({ parameters: { IOC } }) => {
17
- const formData = await req.formData();
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 { ExecutorError } from '@qlover/fe-corekit';
2
- import { NextResponse } from 'next/server';
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';
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 server = new BootstrapServer();
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
- .execNoError(async ({ parameters: { IOC } }) => {
17
- const searchParams = Object.fromEntries(
18
- req.nextUrl.searchParams.entries()
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 { ExecutorError } from '@qlover/fe-corekit';
2
- import { NextResponse } from 'next/server';
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 server = new BootstrapServer();
12
-
13
- const result = await server
7
+ const requestBody = await req.json();
8
+ return await new NextApiServer()
14
9
  .use(new AdminAuthPlugin())
15
- .execNoError(async ({ parameters: { IOC } }) => {
16
- const requestBody = await req.json();
17
- const adminLocalesService = IOC(ApiLocaleService);
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 { ExecutorError } from '@qlover/fe-corekit';
2
- import { NextResponse } from 'next/server';
3
- import { BootstrapServer } from '@/core/bootstraps/BootstrapServer';
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 server = new BootstrapServer();
8
+ const searchParams = Object.fromEntries(req.nextUrl.searchParams.entries());
13
9
 
14
- const result = await server
15
- .use(new AdminAuthPlugin())
16
- .execNoError(async ({ parameters: { IOC } }) => {
17
- const searchParams = Object.fromEntries(
18
- req.nextUrl.searchParams.entries()
19
- );
20
- const paginationParams = IOC(PaginationValidator).getThrow(searchParams);
21
-
22
- const apiUserService = IOC(ApiUserService);
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 { BootstrapServer } from '@/core/bootstraps/BootstrapServer';
4
- import { ApiLocaleService } from '@/server/services/ApiLocaleService';
5
- import { i18nConfig } from '@config/i18n';
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
- if (!locale || !i18nConfig.supportedLngs.includes(locale)) {
16
- return NextResponse.json({}, { status: 404 });
17
- }
18
-
19
- const server = new BootstrapServer();
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 instanceof ExecutorError) {
29
- console.error(result);
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 { ExecutorError } from '@qlover/fe-corekit';
2
- import { NextResponse } from 'next/server';
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 server = new BootstrapServer();
16
-
17
- const result = await server.execNoError(async ({ parameters: { IOC } }) => {
18
- const requestBody = await req.json();
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
  }