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.
- package/LICENSE +21 -21
- package/README.md +71 -71
- package/dist/helpers/utils.js +16 -16
- package/dist/lib/section-creators.js +166 -166
- package/package.json +1 -1
- package/templates/default/.eslintrc.json +5 -5
- package/templates/default/.prettierignore +7 -7
- package/templates/default/.prettierrc.json +27 -27
- package/templates/default/CHANGELOG.md +140 -140
- package/templates/default/_gitignore +57 -57
- package/templates/default/app/(auth)/auth/login/LoginPage.tsx +192 -192
- package/templates/default/app/(auth)/auth/login/page.tsx +11 -11
- package/templates/default/app/(auth)/auth-language-provider.tsx +34 -34
- package/templates/default/app/(auth)/layout.tsx +81 -81
- package/templates/default/app/(rootLayout)/(plugins)/[...slug]/error.tsx +64 -0
- package/templates/default/app/(rootLayout)/(plugins)/[...slug]/page.tsx +59 -47
- package/templates/default/app/(rootLayout)/(plugins)/[...slug]/plugin-server-registry.ts +14 -16
- package/templates/default/app/(rootLayout)/admins/page.tsx +10 -10
- package/templates/default/app/(rootLayout)/browse/[section]/[page]/page.tsx +22 -22
- package/templates/default/app/(rootLayout)/categorized/[section]/page.tsx +15 -15
- package/templates/default/app/(rootLayout)/dashboard/page.tsx +68 -70
- package/templates/default/app/(rootLayout)/edit/[section]/[itemId]/page.tsx +20 -20
- package/templates/default/app/(rootLayout)/layout.tsx +81 -81
- package/templates/default/app/(rootLayout)/loading.tsx +10 -10
- package/templates/default/app/(rootLayout)/log/page.tsx +5 -7
- package/templates/default/app/(rootLayout)/new/[section]/page.tsx +15 -15
- package/templates/default/app/(rootLayout)/section/[section]/page.tsx +19 -19
- package/templates/default/app/(rootLayout)/settings/page.tsx +11 -13
- package/templates/default/app/api/auth/csrf/route.ts +25 -25
- package/templates/default/app/api/auth/refresh/route.ts +10 -10
- package/templates/default/app/api/auth/route.ts +49 -49
- package/templates/default/app/api/auth/session/route.ts +20 -20
- package/templates/default/app/api/document/route.ts +165 -165
- package/templates/default/app/api/editor/photo/route.ts +49 -49
- package/templates/default/app/api/photo/route.ts +27 -27
- package/templates/default/app/api/submit/section/item/[slug]/route.ts +95 -95
- package/templates/default/app/api/submit/section/item/route.ts +56 -56
- package/templates/default/app/api/submit/section/simple/route.ts +86 -86
- package/templates/default/app/api/video/route.ts +174 -174
- package/templates/default/app/globals.css +236 -236
- package/templates/default/cms.config.ts +56 -56
- package/templates/default/components/admin/admin-card.tsx +165 -165
- package/templates/default/components/admin/admin-edit-page.tsx +124 -124
- package/templates/default/components/admin/admin-privilege-card.tsx +184 -184
- package/templates/default/components/admin/new-admin-form.tsx +172 -172
- package/templates/default/components/container-box.tsx +24 -24
- package/templates/default/components/dnd-kit/draggable.tsx +21 -21
- package/templates/default/components/dnd-kit/droppable.tsx +20 -20
- package/templates/default/components/dnd-kit/sortable-item.tsx +18 -18
- package/templates/default/components/feedback/error-component.tsx +16 -16
- package/templates/default/components/feedback/info-card.tsx +93 -93
- package/templates/default/components/feedback/loading-spinners.tsx +67 -67
- package/templates/default/components/feedback/modal.tsx +166 -166
- package/templates/default/components/feedback/progress-bar.tsx +48 -48
- package/templates/default/components/feedback/tooltip-component.tsx +27 -27
- package/templates/default/components/form/form-input-element.tsx +70 -70
- package/templates/default/components/form/helpers/_section-hot-reload.js +1 -1
- package/templates/default/components/form/helpers/util.ts +17 -17
- package/templates/default/components/form/inputs/checkbox-form-input.tsx +46 -46
- package/templates/default/components/form/inputs/color-form-input.tsx +44 -44
- package/templates/default/components/form/inputs/date-form-input.tsx +93 -93
- package/templates/default/components/form/inputs/map-form-input.tsx +141 -141
- package/templates/default/components/form/inputs/multiple-select-form-input.tsx +85 -85
- package/templates/default/components/form/inputs/number-form-input.tsx +43 -43
- package/templates/default/components/form/inputs/password-form-input.tsx +47 -47
- package/templates/default/components/form/inputs/photo-form-input.tsx +279 -279
- package/templates/default/components/form/inputs/rich-text-form-input.tsx +148 -148
- package/templates/default/components/form/inputs/select-form-input.tsx +159 -159
- package/templates/default/components/form/inputs/slug-form-input.tsx +131 -131
- package/templates/default/components/form/inputs/tags-form-input.tsx +255 -255
- package/templates/default/components/form/inputs/text-form-input.tsx +61 -61
- package/templates/default/components/form/inputs/textarea-form-input.tsx +61 -61
- package/templates/default/components/layout/default-nav-items.tsx +3 -3
- package/templates/default/components/layout/layout.tsx +84 -84
- package/templates/default/components/layout/navbar.tsx +258 -258
- package/templates/default/components/layout/sidebar-dropdown-item.tsx +83 -83
- package/templates/default/components/layout/sidebar-item.tsx +24 -24
- package/templates/default/components/layout/sidebar.tsx +229 -229
- package/templates/default/components/layout/theme-provider.tsx +8 -8
- package/templates/default/components/layout/theme-toggle.tsx +39 -39
- package/templates/default/components/locale/locale-switcher.tsx +98 -98
- package/templates/default/components/media/dropzone.tsx +154 -154
- package/templates/default/components/media/protected-document.tsx +44 -44
- package/templates/default/components/media/protected-image.tsx +143 -143
- package/templates/default/components/media/protected-video.tsx +76 -76
- package/templates/default/components/multi-select.tsx +1150 -1150
- package/templates/default/components/pages/admins-page.tsx +43 -43
- package/templates/default/components/pages/browse-page.tsx +106 -106
- package/templates/default/components/pages/categorized-section-page.tsx +31 -31
- package/templates/default/components/pages/dashboard-page-alt.tsx +45 -45
- package/templates/default/components/pages/item-edit-page.tsx +267 -267
- package/templates/default/components/pages/log-page.tsx +107 -107
- package/templates/default/components/pages/new-page.tsx +183 -183
- package/templates/default/components/pages/section-page.tsx +203 -203
- package/templates/default/components/pages/settings-page.tsx +232 -232
- package/templates/default/components/pagination/pagination-buttons.tsx +147 -147
- package/templates/default/components/pagination/pagination.tsx +36 -36
- package/templates/default/components/sections/category-delete-confirm-page.tsx +130 -130
- package/templates/default/components/sections/category-section-select-input.tsx +139 -139
- package/templates/default/components/sections/conditional-fields.tsx +49 -49
- package/templates/default/components/sections/section-icon.tsx +8 -8
- package/templates/default/components/sections/section-item-card.tsx +143 -143
- package/templates/default/components/sections/section-item-status-badge.tsx +17 -17
- package/templates/default/components/sections/select-input-buttons.tsx +125 -125
- package/templates/default/components/select-box.tsx +98 -98
- package/templates/default/components/ui/accordion.tsx +53 -53
- package/templates/default/components/ui/alert-dialog.tsx +113 -113
- package/templates/default/components/ui/alert.tsx +47 -47
- package/templates/default/components/ui/badge.tsx +38 -38
- package/templates/default/components/ui/card.tsx +43 -43
- package/templates/default/components/ui/command.tsx +137 -137
- package/templates/default/components/ui/custom-alert-dialog.tsx +113 -113
- package/templates/default/components/ui/custom-dialog.tsx +123 -123
- package/templates/default/components/ui/dialog.tsx +123 -123
- package/templates/default/components/ui/direction.tsx +22 -22
- package/templates/default/components/ui/dropdown-menu.tsx +182 -182
- package/templates/default/components/ui/input-group.tsx +54 -54
- package/templates/default/components/ui/input.tsx +22 -22
- package/templates/default/components/ui/label.tsx +19 -19
- package/templates/default/components/ui/popover.tsx +42 -42
- package/templates/default/components/ui/progress.tsx +31 -31
- package/templates/default/components/ui/scroll-area.tsx +42 -42
- package/templates/default/components/ui/select.tsx +165 -165
- package/templates/default/components/ui/separator.tsx +28 -28
- package/templates/default/components/ui/sheet.tsx +103 -103
- package/templates/default/components/ui/spinner.tsx +16 -16
- package/templates/default/components/ui/switch.tsx +29 -29
- package/templates/default/components/ui/table.tsx +83 -83
- package/templates/default/components/ui/tabs.tsx +55 -55
- package/templates/default/components/ui/toast.tsx +113 -113
- package/templates/default/components/ui/toaster.tsx +35 -35
- package/templates/default/components/ui/tooltip.tsx +30 -30
- package/templates/default/components/ui/use-toast.ts +187 -187
- package/templates/default/drizzle.config.ts +4 -4
- package/templates/default/dynamic-schemas/schema.ts +225 -75
- package/templates/default/env/env.ts +46 -46
- package/templates/default/envConfig.ts +4 -4
- package/templates/default/lib/postinstall.js +14 -14
- package/templates/default/lib/utils.ts +6 -6
- package/templates/default/next-env.d.ts +6 -6
- package/templates/default/next.config.ts +24 -24
- package/templates/default/package.json +1 -1
- package/templates/default/postcss.config.mjs +6 -6
- package/templates/default/proxy.ts +32 -32
- 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
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
+
}
|