create-nextjs-cms 0.9.30 → 0.9.32

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 (145) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +71 -71
  3. package/dist/helpers/utils.js +16 -16
  4. package/dist/lib/section-creators.js +166 -166
  5. package/package.json +1 -1
  6. package/templates/default/.eslintrc.json +5 -5
  7. package/templates/default/.prettierignore +7 -7
  8. package/templates/default/.prettierrc.json +27 -27
  9. package/templates/default/CHANGELOG.md +140 -140
  10. package/templates/default/_gitignore +57 -57
  11. package/templates/default/app/(auth)/auth/login/LoginPage.tsx +192 -192
  12. package/templates/default/app/(auth)/auth/login/page.tsx +11 -11
  13. package/templates/default/app/(auth)/auth-language-provider.tsx +34 -34
  14. package/templates/default/app/(auth)/layout.tsx +81 -81
  15. package/templates/default/app/(rootLayout)/(plugins)/[...slug]/error.tsx +64 -0
  16. package/templates/default/app/(rootLayout)/(plugins)/[...slug]/page.tsx +59 -47
  17. package/templates/default/app/(rootLayout)/(plugins)/[...slug]/plugin-server-registry.ts +14 -16
  18. package/templates/default/app/(rootLayout)/admins/page.tsx +10 -10
  19. package/templates/default/app/(rootLayout)/browse/[section]/[page]/page.tsx +22 -22
  20. package/templates/default/app/(rootLayout)/categorized/[section]/page.tsx +15 -15
  21. package/templates/default/app/(rootLayout)/dashboard/page.tsx +68 -70
  22. package/templates/default/app/(rootLayout)/edit/[section]/[itemId]/page.tsx +20 -20
  23. package/templates/default/app/(rootLayout)/layout.tsx +81 -81
  24. package/templates/default/app/(rootLayout)/loading.tsx +10 -10
  25. package/templates/default/app/(rootLayout)/log/page.tsx +5 -7
  26. package/templates/default/app/(rootLayout)/new/[section]/page.tsx +15 -15
  27. package/templates/default/app/(rootLayout)/section/[section]/page.tsx +19 -19
  28. package/templates/default/app/(rootLayout)/settings/page.tsx +11 -13
  29. package/templates/default/app/api/auth/csrf/route.ts +25 -25
  30. package/templates/default/app/api/auth/refresh/route.ts +10 -10
  31. package/templates/default/app/api/auth/route.ts +49 -49
  32. package/templates/default/app/api/auth/session/route.ts +20 -20
  33. package/templates/default/app/api/document/route.ts +165 -165
  34. package/templates/default/app/api/editor/photo/route.ts +49 -49
  35. package/templates/default/app/api/photo/route.ts +27 -27
  36. package/templates/default/app/api/submit/section/item/[slug]/route.ts +95 -95
  37. package/templates/default/app/api/submit/section/item/route.ts +56 -56
  38. package/templates/default/app/api/submit/section/simple/route.ts +86 -86
  39. package/templates/default/app/api/video/route.ts +174 -174
  40. package/templates/default/app/globals.css +236 -236
  41. package/templates/default/cms.config.ts +56 -56
  42. package/templates/default/components/admin/admin-card.tsx +165 -165
  43. package/templates/default/components/admin/admin-edit-page.tsx +124 -124
  44. package/templates/default/components/admin/admin-privilege-card.tsx +184 -184
  45. package/templates/default/components/admin/new-admin-form.tsx +172 -172
  46. package/templates/default/components/container-box.tsx +24 -24
  47. package/templates/default/components/dnd-kit/draggable.tsx +21 -21
  48. package/templates/default/components/dnd-kit/droppable.tsx +20 -20
  49. package/templates/default/components/dnd-kit/sortable-item.tsx +18 -18
  50. package/templates/default/components/feedback/error-component.tsx +16 -16
  51. package/templates/default/components/feedback/info-card.tsx +93 -93
  52. package/templates/default/components/feedback/loading-spinners.tsx +67 -67
  53. package/templates/default/components/feedback/modal.tsx +166 -166
  54. package/templates/default/components/feedback/progress-bar.tsx +48 -48
  55. package/templates/default/components/feedback/tooltip-component.tsx +27 -27
  56. package/templates/default/components/form/form-input-element.tsx +70 -70
  57. package/templates/default/components/form/helpers/_section-hot-reload.js +1 -1
  58. package/templates/default/components/form/helpers/util.ts +17 -17
  59. package/templates/default/components/form/inputs/checkbox-form-input.tsx +46 -46
  60. package/templates/default/components/form/inputs/color-form-input.tsx +44 -44
  61. package/templates/default/components/form/inputs/date-form-input.tsx +93 -93
  62. package/templates/default/components/form/inputs/map-form-input.tsx +141 -141
  63. package/templates/default/components/form/inputs/multiple-select-form-input.tsx +85 -85
  64. package/templates/default/components/form/inputs/number-form-input.tsx +43 -43
  65. package/templates/default/components/form/inputs/password-form-input.tsx +47 -47
  66. package/templates/default/components/form/inputs/photo-form-input.tsx +279 -279
  67. package/templates/default/components/form/inputs/rich-text-form-input.tsx +148 -148
  68. package/templates/default/components/form/inputs/select-form-input.tsx +159 -159
  69. package/templates/default/components/form/inputs/slug-form-input.tsx +131 -131
  70. package/templates/default/components/form/inputs/tags-form-input.tsx +255 -255
  71. package/templates/default/components/form/inputs/text-form-input.tsx +61 -61
  72. package/templates/default/components/form/inputs/textarea-form-input.tsx +61 -61
  73. package/templates/default/components/layout/default-nav-items.tsx +3 -3
  74. package/templates/default/components/layout/layout.tsx +84 -84
  75. package/templates/default/components/layout/navbar.tsx +258 -258
  76. package/templates/default/components/layout/sidebar-dropdown-item.tsx +83 -83
  77. package/templates/default/components/layout/sidebar-item.tsx +24 -24
  78. package/templates/default/components/layout/sidebar.tsx +229 -229
  79. package/templates/default/components/layout/theme-provider.tsx +8 -8
  80. package/templates/default/components/layout/theme-toggle.tsx +39 -39
  81. package/templates/default/components/locale/locale-switcher.tsx +98 -98
  82. package/templates/default/components/media/dropzone.tsx +154 -154
  83. package/templates/default/components/media/protected-document.tsx +44 -44
  84. package/templates/default/components/media/protected-image.tsx +143 -143
  85. package/templates/default/components/media/protected-video.tsx +76 -76
  86. package/templates/default/components/multi-select.tsx +1150 -1150
  87. package/templates/default/components/pages/admins-page.tsx +43 -43
  88. package/templates/default/components/pages/browse-page.tsx +106 -106
  89. package/templates/default/components/pages/categorized-section-page.tsx +31 -31
  90. package/templates/default/components/pages/dashboard-page-alt.tsx +45 -45
  91. package/templates/default/components/pages/item-edit-page.tsx +267 -267
  92. package/templates/default/components/pages/log-page.tsx +107 -107
  93. package/templates/default/components/pages/new-page.tsx +183 -183
  94. package/templates/default/components/pages/section-page.tsx +203 -203
  95. package/templates/default/components/pages/settings-page.tsx +232 -232
  96. package/templates/default/components/pagination/pagination-buttons.tsx +147 -147
  97. package/templates/default/components/pagination/pagination.tsx +36 -36
  98. package/templates/default/components/sections/category-delete-confirm-page.tsx +130 -130
  99. package/templates/default/components/sections/category-section-select-input.tsx +139 -139
  100. package/templates/default/components/sections/conditional-fields.tsx +49 -49
  101. package/templates/default/components/sections/section-icon.tsx +8 -8
  102. package/templates/default/components/sections/section-item-card.tsx +143 -143
  103. package/templates/default/components/sections/section-item-status-badge.tsx +17 -17
  104. package/templates/default/components/sections/select-input-buttons.tsx +125 -125
  105. package/templates/default/components/select-box.tsx +98 -98
  106. package/templates/default/components/ui/accordion.tsx +53 -53
  107. package/templates/default/components/ui/alert-dialog.tsx +113 -113
  108. package/templates/default/components/ui/alert.tsx +47 -47
  109. package/templates/default/components/ui/badge.tsx +38 -38
  110. package/templates/default/components/ui/card.tsx +43 -43
  111. package/templates/default/components/ui/command.tsx +137 -137
  112. package/templates/default/components/ui/custom-alert-dialog.tsx +113 -113
  113. package/templates/default/components/ui/custom-dialog.tsx +123 -123
  114. package/templates/default/components/ui/dialog.tsx +123 -123
  115. package/templates/default/components/ui/direction.tsx +22 -22
  116. package/templates/default/components/ui/dropdown-menu.tsx +182 -182
  117. package/templates/default/components/ui/input-group.tsx +54 -54
  118. package/templates/default/components/ui/input.tsx +22 -22
  119. package/templates/default/components/ui/label.tsx +19 -19
  120. package/templates/default/components/ui/popover.tsx +42 -42
  121. package/templates/default/components/ui/progress.tsx +31 -31
  122. package/templates/default/components/ui/scroll-area.tsx +42 -42
  123. package/templates/default/components/ui/select.tsx +165 -165
  124. package/templates/default/components/ui/separator.tsx +28 -28
  125. package/templates/default/components/ui/sheet.tsx +103 -103
  126. package/templates/default/components/ui/spinner.tsx +16 -16
  127. package/templates/default/components/ui/switch.tsx +29 -29
  128. package/templates/default/components/ui/table.tsx +83 -83
  129. package/templates/default/components/ui/tabs.tsx +55 -55
  130. package/templates/default/components/ui/toast.tsx +113 -113
  131. package/templates/default/components/ui/toaster.tsx +35 -35
  132. package/templates/default/components/ui/tooltip.tsx +30 -30
  133. package/templates/default/components/ui/use-toast.ts +187 -187
  134. package/templates/default/drizzle.config.ts +4 -4
  135. package/templates/default/dynamic-schemas/schema.ts +225 -75
  136. package/templates/default/env/env.ts +46 -46
  137. package/templates/default/envConfig.ts +4 -4
  138. package/templates/default/lib/postinstall.js +14 -14
  139. package/templates/default/lib/utils.ts +6 -6
  140. package/templates/default/next-env.d.ts +6 -6
  141. package/templates/default/next.config.ts +24 -24
  142. package/templates/default/package.json +1 -1
  143. package/templates/default/postcss.config.mjs +6 -6
  144. package/templates/default/proxy.ts +32 -32
  145. package/templates/default/tsconfig.json +48 -48
@@ -1,81 +1,81 @@
1
- import { Inter, Cairo } from 'next/font/google'
2
- import '../globals.css'
3
- import type { Metadata } from 'next'
4
- import { cn } from '@/lib/utils'
5
- import { ThemeProvider } from '@/components/layout/theme-provider'
6
- import Providers from '@/app/providers'
7
- import auth from 'nextjs-cms/auth'
8
- import { getCMSConfig } from 'nextjs-cms/core'
9
- import { I18nProviderClient } from 'nextjs-cms/translations/client'
10
- import { resolveLanguage, RTL_LANGUAGES } from 'nextjs-cms/translations'
11
- import { getClientDictionaries } from 'nextjs-cms/translations/server'
12
- import { api, HydrateClient } from '@/app/_trpc/server'
13
- import Layout from '@/components/layout/layout'
14
- import { redirect } from 'next/navigation'
15
- import { DirectionProvider } from "@/components/ui/direction"
16
-
17
- const inter = Inter({
18
- subsets: ['latin'],
19
- variable: '--font-sans',
20
- })
21
-
22
- const cairo = Cairo({
23
- subsets: ['arabic', 'latin'],
24
- variable: '--font-cairo',
25
- })
26
-
27
- export async function generateMetadata(): Promise<Metadata> {
28
- const cmsConfig = await getCMSConfig()
29
- return {
30
- title: cmsConfig.ui.title,
31
- description: 'nextjs-cms',
32
- }
33
- }
34
-
35
- export default async function CMSLayout({ children }: { children: React.ReactNode }) {
36
- const [session, cmsConfig, _] = await Promise.all([
37
- auth(),
38
- getCMSConfig(),
39
- api.navigation.getSidebar.prefetch(),
40
- ])
41
-
42
- if (!session) {
43
- redirect('/auth/login')
44
- }
45
-
46
- const { supportedLanguages, fallbackLanguage } = cmsConfig.i18n
47
- const language = resolveLanguage(session.user.language, supportedLanguages, fallbackLanguage)
48
- const isRTL = RTL_LANGUAGES.has(language)
49
- const dictionaries = getClientDictionaries(supportedLanguages)
50
-
51
- return (
52
- <html lang={language} dir={isRTL ? 'rtl' : 'ltr'} suppressHydrationWarning>
53
- <body
54
- className={cn(
55
- 'bg-background min-h-screen font-sans antialiased',
56
- isRTL ? cairo.variable : inter.variable,
57
- )}
58
- >
59
- <DirectionProvider dir={isRTL ? 'rtl' : 'ltr'} direction={isRTL ? 'rtl' : 'ltr'}>
60
- <I18nProviderClient locale={language} dictionaries={dictionaries}>
61
- <ThemeProvider
62
- attribute='class'
63
- defaultTheme={cmsConfig.ui.defaultTheme}
64
- enableSystem
65
- disableTransitionOnChange
66
- >
67
- <Providers session={session ?? undefined}>
68
- <HydrateClient>
69
- <Layout logoUrlPath={cmsConfig.ui.logo} logoText={cmsConfig.ui.logoText} isRTL={isRTL}>
70
- {children}
71
- </Layout>
72
- </HydrateClient>
73
- </Providers>
74
- </ThemeProvider>
75
- </I18nProviderClient>
76
- </DirectionProvider>
77
- </body>
78
- </html>
79
-
80
- )
81
- }
1
+ import { Inter, Cairo } from 'next/font/google'
2
+ import '../globals.css'
3
+ import type { Metadata } from 'next'
4
+ import { cn } from '@/lib/utils'
5
+ import { ThemeProvider } from '@/components/layout/theme-provider'
6
+ import Providers from '@/app/providers'
7
+ import auth from 'nextjs-cms/auth'
8
+ import { getCMSConfig } from 'nextjs-cms/core'
9
+ import { I18nProviderClient } from 'nextjs-cms/translations/client'
10
+ import { resolveLanguage, RTL_LANGUAGES } from 'nextjs-cms/translations'
11
+ import { getClientDictionaries } from 'nextjs-cms/translations/server'
12
+ import { api, HydrateClient } from '@/app/_trpc/server'
13
+ import Layout from '@/components/layout/layout'
14
+ import { redirect } from 'next/navigation'
15
+ import { DirectionProvider } from "@/components/ui/direction"
16
+
17
+ const inter = Inter({
18
+ subsets: ['latin'],
19
+ variable: '--font-sans',
20
+ })
21
+
22
+ const cairo = Cairo({
23
+ subsets: ['arabic', 'latin'],
24
+ variable: '--font-cairo',
25
+ })
26
+
27
+ export async function generateMetadata(): Promise<Metadata> {
28
+ const cmsConfig = await getCMSConfig()
29
+ return {
30
+ title: cmsConfig.ui.title,
31
+ description: 'nextjs-cms',
32
+ }
33
+ }
34
+
35
+ export default async function CMSLayout({ children }: { children: React.ReactNode }) {
36
+ const [session, cmsConfig, _] = await Promise.all([
37
+ auth(),
38
+ getCMSConfig(),
39
+ api.navigation.getSidebar.prefetch(),
40
+ ])
41
+
42
+ if (!session) {
43
+ redirect('/auth/login')
44
+ }
45
+
46
+ const { supportedLanguages, fallbackLanguage } = cmsConfig.i18n
47
+ const language = resolveLanguage(session.user.language, supportedLanguages, fallbackLanguage)
48
+ const isRTL = RTL_LANGUAGES.has(language)
49
+ const dictionaries = getClientDictionaries(supportedLanguages)
50
+
51
+ return (
52
+ <html lang={language} dir={isRTL ? 'rtl' : 'ltr'} suppressHydrationWarning>
53
+ <body
54
+ className={cn(
55
+ 'bg-background min-h-screen font-sans antialiased',
56
+ isRTL ? cairo.variable : inter.variable,
57
+ )}
58
+ >
59
+ <DirectionProvider dir={isRTL ? 'rtl' : 'ltr'} direction={isRTL ? 'rtl' : 'ltr'}>
60
+ <I18nProviderClient locale={language} dictionaries={dictionaries}>
61
+ <ThemeProvider
62
+ attribute='class'
63
+ defaultTheme={cmsConfig.ui.defaultTheme}
64
+ enableSystem
65
+ disableTransitionOnChange
66
+ >
67
+ <Providers session={session ?? undefined}>
68
+ <HydrateClient>
69
+ <Layout logoUrlPath={cmsConfig.ui.logo} logoText={cmsConfig.ui.logoText} isRTL={isRTL}>
70
+ {children}
71
+ </Layout>
72
+ </HydrateClient>
73
+ </Providers>
74
+ </ThemeProvider>
75
+ </I18nProviderClient>
76
+ </DirectionProvider>
77
+ </body>
78
+ </html>
79
+
80
+ )
81
+ }
@@ -1,10 +1,10 @@
1
- import LoadingSpinners from '@/components/feedback/loading-spinners'
2
-
3
- export default function Loading() {
4
- // You can add any UI inside Loading, including a Skeleton.
5
- return (
6
- <div className='p-20'>
7
- <LoadingSpinners />
8
- </div>
9
- )
10
- }
1
+ import LoadingSpinners from '@/components/feedback/loading-spinners'
2
+
3
+ export default function Loading() {
4
+ // You can add any UI inside Loading, including a Skeleton.
5
+ return (
6
+ <div className='p-20'>
7
+ <LoadingSpinners />
8
+ </div>
9
+ )
10
+ }
@@ -1,7 +1,5 @@
1
- import LogPage from '@/components/pages/log-page'
2
-
3
- export const dynamic = 'force-dynamic'
4
-
5
- export default async function Page() {
6
- return <LogPage />
7
- }
1
+ import LogPage from '@/components/pages/log-page'
2
+
3
+ export default async function Page() {
4
+ return <LogPage />
5
+ }
@@ -1,15 +1,15 @@
1
- import NewPage from '@/components/pages/new-page'
2
- import { api, HydrateClient } from '@/app/_trpc/server'
3
- type Params = Promise<{ section: string }>
4
-
5
- export default async function Page(props: { params: Params }) {
6
- const params = await props.params
7
- await api.hasItemsSections.newItem.prefetch({
8
- sectionName: params.section,
9
- })
10
- return (
11
- <HydrateClient>
12
- <NewPage sectionType='has_items' section={params.section} />
13
- </HydrateClient>
14
- )
15
- }
1
+ import NewPage from '@/components/pages/new-page'
2
+ import { api, HydrateClient } from '@/app/_trpc/server'
3
+ type Params = Promise<{ section: string }>
4
+
5
+ export default async function Page(props: { params: Params }) {
6
+ const params = await props.params
7
+ await api.hasItemsSections.newItem.prefetch({
8
+ sectionName: params.section,
9
+ })
10
+ return (
11
+ <HydrateClient>
12
+ <NewPage sectionType='has_items' section={params.section} />
13
+ </HydrateClient>
14
+ )
15
+ }
@@ -1,19 +1,19 @@
1
- import SectionPage from '@/components/pages/section-page'
2
- import { api, HydrateClient } from '@/app/_trpc/server'
3
- type Params = Promise<{ section: string }>
4
- type SearchParams = Promise<{ locale?: string }>
5
-
6
- export default async function Page(props: { params: Params; searchParams: SearchParams }) {
7
- const params = await props.params
8
- const searchParams = await props.searchParams
9
- await api.simpleSections.create.prefetch({
10
- sectionName: params.section,
11
- locale: searchParams.locale,
12
- })
13
-
14
- return (
15
- <HydrateClient>
16
- <SectionPage section={params.section} />
17
- </HydrateClient>
18
- )
19
- }
1
+ import SectionPage from '@/components/pages/section-page'
2
+ import { api, HydrateClient } from '@/app/_trpc/server'
3
+ type Params = Promise<{ section: string }>
4
+ type SearchParams = Promise<{ locale?: string }>
5
+
6
+ export default async function Page(props: { params: Params; searchParams: SearchParams }) {
7
+ const params = await props.params
8
+ const searchParams = await props.searchParams
9
+ await api.simpleSections.create.prefetch({
10
+ sectionName: params.section,
11
+ locale: searchParams.locale,
12
+ })
13
+
14
+ return (
15
+ <HydrateClient>
16
+ <SectionPage section={params.section} />
17
+ </HydrateClient>
18
+ )
19
+ }
@@ -1,13 +1,11 @@
1
- import SettingsPage from '@/components/pages/settings-page'
2
- import { api, HydrateClient } from '@/app/_trpc/server'
3
-
4
- export const dynamic = 'force-dynamic'
5
-
6
- export default async function Page() {
7
- await api.accountSettings.get.prefetch()
8
- return (
9
- <HydrateClient>
10
- <SettingsPage />
11
- </HydrateClient>
12
- )
13
- }
1
+ import SettingsPage from '@/components/pages/settings-page'
2
+ import { api, HydrateClient } from '@/app/_trpc/server'
3
+
4
+ export default async function Page() {
5
+ await api.accountSettings.get.prefetch()
6
+ return (
7
+ <HydrateClient>
8
+ <SettingsPage />
9
+ </HydrateClient>
10
+ )
11
+ }
@@ -1,25 +1,25 @@
1
- import { responseHeaders } from 'nextjs-cms/utils'
2
- import { createCSRFToken } from 'nextjs-cms/auth/actions'
3
- import { cookies } from 'next/headers'
4
-
5
- export async function GET() {
6
- const cookieStore = await cookies()
7
- const csrfTokenCookie = cookieStore.get('csrf_token')
8
- const { csrfToken, cookie } = await createCSRFToken(csrfTokenCookie?.value)
9
-
10
- if (cookie) {
11
- (await cookies()).set({
12
- name: 'csrf_token',
13
- value: cookie,
14
- httpOnly: true,
15
- secure: true,
16
- sameSite: true,
17
- })
18
- }
19
- return Response.json(
20
- {
21
- csrfToken,
22
- },
23
- responseHeaders,
24
- )
25
- }
1
+ import { responseHeaders } from 'nextjs-cms/utils'
2
+ import { createCSRFToken } from 'nextjs-cms/auth/actions'
3
+ import { cookies } from 'next/headers'
4
+
5
+ export async function GET() {
6
+ const cookieStore = await cookies()
7
+ const csrfTokenCookie = cookieStore.get('csrf_token')
8
+ const { csrfToken, cookie } = await createCSRFToken(csrfTokenCookie?.value)
9
+
10
+ if (cookie) {
11
+ (await cookies()).set({
12
+ name: 'csrf_token',
13
+ value: cookie,
14
+ httpOnly: true,
15
+ secure: true,
16
+ sameSite: true,
17
+ })
18
+ }
19
+ return Response.json(
20
+ {
21
+ csrfToken,
22
+ },
23
+ responseHeaders,
24
+ )
25
+ }
@@ -1,10 +1,10 @@
1
- import { NextRequest } from 'next/server'
2
- import { authRefresh } from 'nextjs-cms/auth/actions'
3
-
4
- export async function GET(request: NextRequest) {
5
- const refreshToken = request.cookies.get('refresh_token')
6
- const loginResult = await authRefresh(refreshToken)
7
- return Response.json(loginResult, {
8
- status: loginResult.status,
9
- })
10
- }
1
+ import { NextRequest } from 'next/server'
2
+ import { authRefresh } from 'nextjs-cms/auth/actions'
3
+
4
+ export async function GET(request: NextRequest) {
5
+ const refreshToken = request.cookies.get('refresh_token')
6
+ const loginResult = await authRefresh(refreshToken)
7
+ return Response.json(loginResult, {
8
+ status: loginResult.status,
9
+ })
10
+ }
@@ -1,49 +1,49 @@
1
- import { NextRequest } from 'next/server'
2
- import auth from 'nextjs-cms/auth'
3
- import { deleteSession, login } from 'nextjs-cms/auth/actions'
4
- import { getRequestMetadataFromHeaders, recordLog } from 'nextjs-cms/logging'
5
-
6
- export async function POST(request: NextRequest) {
7
- const { username, password, language } = await request.json()
8
- try {
9
- const loginResult = await login({ username, password, language })
10
- const requestMetadata = getRequestMetadataFromHeaders(request.headers)
11
-
12
- await recordLog({
13
- eventType: 'auth.login',
14
- actorId: loginResult.user?.id ?? null,
15
- actorUsername: loginResult.user?.username ?? null,
16
- entityType: 'admin',
17
- entityId: loginResult.user?.id ?? null,
18
- entityLabel: loginResult.user?.username ?? null,
19
- sectionName: 'auth',
20
- requestMetadata,
21
- })
22
- return Response.json(loginResult, { status: 200 })
23
- } catch (error: any) {
24
- return Response.json({ error: error.message }, { status: 400 })
25
- }
26
- }
27
-
28
- export async function DELETE(request: NextRequest) {
29
- const session = await auth()
30
- try {
31
- const loginResult = await deleteSession(session)
32
- if (session?.user?.id) {
33
- const requestMetadata = getRequestMetadataFromHeaders(request.headers)
34
- await recordLog({
35
- eventType: 'auth.logout',
36
- actorId: session.user.id,
37
- actorUsername: session.user.name ?? null,
38
- entityType: 'admin',
39
- entityId: session.user.id,
40
- entityLabel: session.user.name ?? null,
41
- sectionName: 'auth',
42
- requestMetadata,
43
- })
44
- }
45
- return Response.json(loginResult, { status: 200 })
46
- } catch (error: any) {
47
- return Response.json({ error: error.message }, { status: 400 })
48
- }
49
- }
1
+ import { NextRequest } from 'next/server'
2
+ import auth from 'nextjs-cms/auth'
3
+ import { deleteSession, login } from 'nextjs-cms/auth/actions'
4
+ import { getRequestMetadataFromHeaders, recordLog } from 'nextjs-cms/logging'
5
+
6
+ export async function POST(request: NextRequest) {
7
+ const { username, password, language } = await request.json()
8
+ try {
9
+ const loginResult = await login({ username, password, language })
10
+ const requestMetadata = getRequestMetadataFromHeaders(request.headers)
11
+
12
+ await recordLog({
13
+ eventType: 'auth.login',
14
+ actorId: loginResult.user?.id ?? null,
15
+ actorUsername: loginResult.user?.username ?? null,
16
+ entityType: 'admin',
17
+ entityId: loginResult.user?.id ?? null,
18
+ entityLabel: loginResult.user?.username ?? null,
19
+ sectionName: 'auth',
20
+ requestMetadata,
21
+ })
22
+ return Response.json(loginResult, { status: 200 })
23
+ } catch (error: any) {
24
+ return Response.json({ error: error.message }, { status: 400 })
25
+ }
26
+ }
27
+
28
+ export async function DELETE(request: NextRequest) {
29
+ const session = await auth()
30
+ try {
31
+ const loginResult = await deleteSession(session)
32
+ if (session?.user?.id) {
33
+ const requestMetadata = getRequestMetadataFromHeaders(request.headers)
34
+ await recordLog({
35
+ eventType: 'auth.logout',
36
+ actorId: session.user.id,
37
+ actorUsername: session.user.name ?? null,
38
+ entityType: 'admin',
39
+ entityId: session.user.id,
40
+ entityLabel: session.user.name ?? null,
41
+ sectionName: 'auth',
42
+ requestMetadata,
43
+ })
44
+ }
45
+ return Response.json(loginResult, { status: 200 })
46
+ } catch (error: any) {
47
+ return Response.json({ error: error.message }, { status: 400 })
48
+ }
49
+ }
@@ -1,20 +1,20 @@
1
- import auth from 'nextjs-cms/auth'
2
- import { NextRequest } from 'next/server'
3
-
4
- export async function GET(request: NextRequest) {
5
- const session = await auth()
6
- return Response.json(session, {
7
- status: session ? 200 : 404,
8
- })
9
- }
10
-
11
- export async function POST(request: NextRequest) {
12
- const session = await auth()
13
- if (!session) {
14
- return Response.json('Unauthorized', { status: 401 })
15
- }
16
-
17
- // TODO: Handle POST request to update session with new data
18
-
19
- return Response.json(session)
20
- }
1
+ import auth from 'nextjs-cms/auth'
2
+ import { NextRequest } from 'next/server'
3
+
4
+ export async function GET(request: NextRequest) {
5
+ const session = await auth()
6
+ return Response.json(session, {
7
+ status: session ? 200 : 404,
8
+ })
9
+ }
10
+
11
+ export async function POST(request: NextRequest) {
12
+ const session = await auth()
13
+ if (!session) {
14
+ return Response.json('Unauthorized', { status: 401 })
15
+ }
16
+
17
+ // TODO: Handle POST request to update session with new data
18
+
19
+ return Response.json(session)
20
+ }