@latte-macchiat-io/latte-payload 1.0.1
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/.claude/settings.local.json +9 -0
- package/.env.example +29 -0
- package/.github/workflows/ci.yml +160 -0
- package/.github/workflows/publish.yml +126 -0
- package/.nvmrc +1 -0
- package/.prettierignore +2 -0
- package/.prettierrc +11 -0
- package/CHANGELOG.md +87 -0
- package/README.md +364 -0
- package/TESTING_AND_DOCUMENTATION_SETUP.md +348 -0
- package/dist/access/adminAccessOnly.d.ts +25 -0
- package/dist/access/adminAccessOnly.d.ts.map +1 -0
- package/dist/access/adminAccessOnly.js +11 -0
- package/dist/access/adminAccessOnly.js.map +1 -0
- package/dist/access/admins.d.ts +72 -0
- package/dist/access/admins.d.ts.map +1 -0
- package/dist/access/admins.js +76 -0
- package/dist/access/admins.js.map +1 -0
- package/dist/access/anyone.d.ts +35 -0
- package/dist/access/anyone.d.ts.map +1 -0
- package/dist/access/anyone.js +34 -0
- package/dist/access/anyone.js.map +1 -0
- package/dist/access/authenticated.d.ts +63 -0
- package/dist/access/authenticated.d.ts.map +1 -0
- package/dist/access/authenticated.js +68 -0
- package/dist/access/authenticated.js.map +1 -0
- package/dist/access/authenticatedAccessOnly.d.ts +13 -0
- package/dist/access/authenticatedAccessOnly.d.ts.map +1 -0
- package/dist/access/authenticatedAccessOnly.js +11 -0
- package/dist/access/authenticatedAccessOnly.js.map +1 -0
- package/dist/access/index.d.ts +7 -0
- package/dist/access/index.d.ts.map +1 -0
- package/dist/access/index.js +7 -0
- package/dist/access/index.js.map +1 -0
- package/dist/access/publicReadAuthenticatedAccess.d.ts +13 -0
- package/dist/access/publicReadAuthenticatedAccess.d.ts.map +1 -0
- package/dist/access/publicReadAuthenticatedAccess.js +12 -0
- package/dist/access/publicReadAuthenticatedAccess.js.map +1 -0
- package/dist/collections/ContactMessages/hooks/sendEmailNotification.d.ts +31 -0
- package/dist/collections/ContactMessages/hooks/sendEmailNotification.d.ts.map +1 -0
- package/dist/collections/ContactMessages/hooks/sendEmailNotification.js +29 -0
- package/dist/collections/ContactMessages/hooks/sendEmailNotification.js.map +1 -0
- package/dist/collections/ContactMessages/index.d.ts +27 -0
- package/dist/collections/ContactMessages/index.d.ts.map +1 -0
- package/dist/collections/ContactMessages/index.js +81 -0
- package/dist/collections/ContactMessages/index.js.map +1 -0
- package/dist/collections/EmailTemplates/index.d.ts +26 -0
- package/dist/collections/EmailTemplates/index.d.ts.map +1 -0
- package/dist/collections/EmailTemplates/index.js +74 -0
- package/dist/collections/EmailTemplates/index.js.map +1 -0
- package/dist/collections/Media/index.d.ts +3 -0
- package/dist/collections/Media/index.d.ts.map +1 -0
- package/dist/collections/Media/index.js +22 -0
- package/dist/collections/Media/index.js.map +1 -0
- package/dist/collections/QueuedEmails/components/HtmlViewer.d.ts +3 -0
- package/dist/collections/QueuedEmails/components/HtmlViewer.d.ts.map +1 -0
- package/dist/collections/QueuedEmails/components/HtmlViewer.js +11 -0
- package/dist/collections/QueuedEmails/components/HtmlViewer.js.map +1 -0
- package/dist/collections/QueuedEmails/components/RetryEmailButtons.d.ts +2 -0
- package/dist/collections/QueuedEmails/components/RetryEmailButtons.d.ts.map +1 -0
- package/dist/collections/QueuedEmails/components/RetryEmailButtons.js +79 -0
- package/dist/collections/QueuedEmails/components/RetryEmailButtons.js.map +1 -0
- package/dist/collections/QueuedEmails/index.d.ts +3 -0
- package/dist/collections/QueuedEmails/index.d.ts.map +1 -0
- package/dist/collections/QueuedEmails/index.js +245 -0
- package/dist/collections/QueuedEmails/index.js.map +1 -0
- package/dist/collections/Users/auth-emails/forgot-password-email.d.ts +51 -0
- package/dist/collections/Users/auth-emails/forgot-password-email.d.ts.map +1 -0
- package/dist/collections/Users/auth-emails/forgot-password-email.js +90 -0
- package/dist/collections/Users/auth-emails/forgot-password-email.js.map +1 -0
- package/dist/collections/Users/auth-emails/verify-email.d.ts +51 -0
- package/dist/collections/Users/auth-emails/verify-email.d.ts.map +1 -0
- package/dist/collections/Users/auth-emails/verify-email.js +80 -0
- package/dist/collections/Users/auth-emails/verify-email.js.map +1 -0
- package/dist/collections/Users/hooks/ensureFirstUserIsAdmin.d.ts +3 -0
- package/dist/collections/Users/hooks/ensureFirstUserIsAdmin.d.ts.map +1 -0
- package/dist/collections/Users/hooks/ensureFirstUserIsAdmin.js +19 -0
- package/dist/collections/Users/hooks/ensureFirstUserIsAdmin.js.map +1 -0
- package/dist/collections/Users/index.d.ts +76 -0
- package/dist/collections/Users/index.d.ts.map +1 -0
- package/dist/collections/Users/index.js +116 -0
- package/dist/collections/Users/index.js.map +1 -0
- package/dist/collections/index.d.ts +10 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +14 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +4 -0
- package/dist/components/index.js.map +1 -0
- package/dist/forms/states.d.ts +8 -0
- package/dist/forms/states.d.ts.map +1 -0
- package/dist/forms/states.js +16 -0
- package/dist/forms/states.js.map +1 -0
- package/dist/forms/translate-errors.d.ts +8 -0
- package/dist/forms/translate-errors.d.ts.map +1 -0
- package/dist/forms/translate-errors.js +11 -0
- package/dist/forms/translate-errors.js.map +1 -0
- package/dist/forms/validators.d.ts +10 -0
- package/dist/forms/validators.d.ts.map +1 -0
- package/dist/forms/validators.js +23 -0
- package/dist/forms/validators.js.map +1 -0
- package/dist/globals/PrivacyPolicy/hooks/revalidate-cache.d.ts +2 -0
- package/dist/globals/PrivacyPolicy/hooks/revalidate-cache.d.ts.map +1 -0
- package/dist/globals/PrivacyPolicy/hooks/revalidate-cache.js +5 -0
- package/dist/globals/PrivacyPolicy/hooks/revalidate-cache.js.map +1 -0
- package/dist/globals/PrivacyPolicy/index.d.ts +3 -0
- package/dist/globals/PrivacyPolicy/index.d.ts.map +1 -0
- package/dist/globals/PrivacyPolicy/index.js +31 -0
- package/dist/globals/PrivacyPolicy/index.js.map +1 -0
- package/dist/globals/TermsOfUse/hooks/revalidate-cache.d.ts +2 -0
- package/dist/globals/TermsOfUse/hooks/revalidate-cache.d.ts.map +1 -0
- package/dist/globals/TermsOfUse/hooks/revalidate-cache.js +5 -0
- package/dist/globals/TermsOfUse/hooks/revalidate-cache.js.map +1 -0
- package/dist/globals/TermsOfUse/index.d.ts +3 -0
- package/dist/globals/TermsOfUse/index.d.ts.map +1 -0
- package/dist/globals/TermsOfUse/index.js +31 -0
- package/dist/globals/TermsOfUse/index.js.map +1 -0
- package/dist/globals/index.d.ts +3 -0
- package/dist/globals/index.d.ts.map +1 -0
- package/dist/globals/index.js +3 -0
- package/dist/globals/index.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/tasks/index.d.ts +2 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +2 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/process-email-queue.d.ts +46 -0
- package/dist/tasks/process-email-queue.d.ts.map +1 -0
- package/dist/tasks/process-email-queue.js +199 -0
- package/dist/tasks/process-email-queue.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/slug.d.ts +2 -0
- package/dist/types/slug.d.ts.map +1 -0
- package/dist/types/slug.js +11 -0
- package/dist/types/slug.js.map +1 -0
- package/dist/utils/database-dates.d.ts +3 -0
- package/dist/utils/database-dates.d.ts.map +1 -0
- package/dist/utils/database-dates.js +6 -0
- package/dist/utils/database-dates.js.map +1 -0
- package/dist/utils/email/generate-email-html.d.ts +23 -0
- package/dist/utils/email/generate-email-html.d.ts.map +1 -0
- package/dist/utils/email/generate-email-html.js +42 -0
- package/dist/utils/email/generate-email-html.js.map +1 -0
- package/dist/utils/email/get-email-template.d.ts +8 -0
- package/dist/utils/email/get-email-template.d.ts.map +1 -0
- package/dist/utils/email/get-email-template.js +14 -0
- package/dist/utils/email/get-email-template.js.map +1 -0
- package/dist/utils/email/index.d.ts +4 -0
- package/dist/utils/email/index.d.ts.map +1 -0
- package/dist/utils/email/index.js +4 -0
- package/dist/utils/email/index.js.map +1 -0
- package/dist/utils/email/queue-email.d.ts +29 -0
- package/dist/utils/email/queue-email.d.ts.map +1 -0
- package/dist/utils/email/queue-email.js +79 -0
- package/dist/utils/email/queue-email.js.map +1 -0
- package/dist/utils/get-global.d.ts +6 -0
- package/dist/utils/get-global.d.ts.map +1 -0
- package/dist/utils/get-global.js +20 -0
- package/dist/utils/get-global.js.map +1 -0
- package/dist/utils/id-from-payload.d.ts +4 -0
- package/dist/utils/id-from-payload.d.ts.map +1 -0
- package/dist/utils/id-from-payload.js +10 -0
- package/dist/utils/id-from-payload.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/migrations.d.ts +2 -0
- package/dist/utils/migrations.d.ts.map +1 -0
- package/dist/utils/migrations.js +18 -0
- package/dist/utils/migrations.js.map +1 -0
- package/dist/utils/payload-client.d.ts +10 -0
- package/dist/utils/payload-client.d.ts.map +1 -0
- package/dist/utils/payload-client.js +14 -0
- package/dist/utils/payload-client.js.map +1 -0
- package/dist/utils/slugify.d.ts +8 -0
- package/dist/utils/slugify.d.ts.map +1 -0
- package/dist/utils/slugify.js +15 -0
- package/dist/utils/slugify.js.map +1 -0
- package/eslint.config.mjs +90 -0
- package/package.json +139 -0
- package/pnpm-workspace.yaml +4 -0
- package/src/access/adminAccessOnly.ts +13 -0
- package/src/access/admins.ts +78 -0
- package/src/access/anyone.ts +35 -0
- package/src/access/authenticated.ts +70 -0
- package/src/access/authenticatedAccessOnly.ts +13 -0
- package/src/access/index.ts +6 -0
- package/src/access/publicReadAuthenticatedAccess.ts +14 -0
- package/src/collections/ContactMessages/hooks/sendEmailNotification.ts +58 -0
- package/src/collections/ContactMessages/index.ts +100 -0
- package/src/collections/EmailTemplates/index.ts +89 -0
- package/src/collections/Media/index.ts +24 -0
- package/src/collections/QueuedEmails/components/HtmlViewer.tsx +16 -0
- package/src/collections/QueuedEmails/components/RetryEmailButtons.tsx +115 -0
- package/src/collections/QueuedEmails/index.ts +246 -0
- package/src/collections/Users/auth-emails/forgot-password-email.ts +135 -0
- package/src/collections/Users/auth-emails/verify-email.ts +123 -0
- package/src/collections/Users/hooks/ensureFirstUserIsAdmin.ts +22 -0
- package/src/collections/Users/index.ts +201 -0
- package/src/collections/index.ts +23 -0
- package/src/components/index.ts +3 -0
- package/src/forms/states.ts +23 -0
- package/src/forms/translate-errors.ts +13 -0
- package/src/forms/validators.ts +33 -0
- package/src/globals/PrivacyPolicy/hooks/revalidate-cache.ts +5 -0
- package/src/globals/PrivacyPolicy/index.ts +33 -0
- package/src/globals/TermsOfUse/hooks/revalidate-cache.ts +5 -0
- package/src/globals/TermsOfUse/index.ts +33 -0
- package/src/globals/index.ts +2 -0
- package/src/index.ts +26 -0
- package/src/tasks/index.ts +7 -0
- package/src/tasks/process-email-queue.ts +261 -0
- package/src/types/index.ts +15 -0
- package/src/types/slug.ts +11 -0
- package/src/utils/database-dates.ts +6 -0
- package/src/utils/email/generate-email-html.ts +63 -0
- package/src/utils/email/get-email-template.ts +18 -0
- package/src/utils/email/index.ts +3 -0
- package/src/utils/email/queue-email.ts +109 -0
- package/src/utils/get-global.ts +25 -0
- package/src/utils/id-from-payload.ts +11 -0
- package/src/utils/index.ts +3 -0
- package/src/utils/migrations.ts +18 -0
- package/src/utils/payload-client.ts +16 -0
- package/src/utils/slugify.ts +21 -0
- package/tests/fixtures/email-template.html +58 -0
- package/tests/fixtures/sample-data.ts +56 -0
- package/tests/helpers/create-test-user.ts +37 -0
- package/tests/helpers/init-payload.ts +59 -0
- package/tests/setup.integration.ts +9 -0
- package/tests/setup.ts +4 -0
- package/tests/unit/access/adminAccessOnly.spec.ts +117 -0
- package/tests/unit/access/admins.spec.ts +68 -0
- package/tests/unit/access/anyone.spec.ts +28 -0
- package/tests/unit/access/authenticated.spec.ts +53 -0
- package/tests/unit/access/authenticatedAccessOnly.spec.ts +112 -0
- package/tests/unit/access/publicReadAuthenticatedAccess.spec.ts +112 -0
- package/tests/unit/forms/validators.spec.ts +348 -0
- package/tests/unit/utils/database-dates.spec.ts +97 -0
- package/tests/unit/utils/id-from-payload.spec.ts +142 -0
- package/tests/unit/utils/slugify.spec.ts +185 -0
- package/tsconfig.json +31 -0
- package/typedoc.json +40 -0
- package/vitest.config.ts +31 -0
- package/vitest.integration.config.ts +27 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { PayloadRequest, TypedUser } from 'payload';
|
|
2
|
+
import type { Locale } from '../../../types';
|
|
3
|
+
export interface ForgotPasswordEmailConfig {
|
|
4
|
+
/**
|
|
5
|
+
* Default locale to use if user has no locale set
|
|
6
|
+
* @default 'en'
|
|
7
|
+
*/
|
|
8
|
+
defaultLocale?: Locale;
|
|
9
|
+
/**
|
|
10
|
+
* Function to generate the password reset URL
|
|
11
|
+
* @param token - The reset token
|
|
12
|
+
* @param user - The user object
|
|
13
|
+
* @returns The full password reset URL
|
|
14
|
+
*/
|
|
15
|
+
generateResetUrl?: (token: string, user: TypedUser) => Promise<string> | string;
|
|
16
|
+
/**
|
|
17
|
+
* Timezone for logging email send time
|
|
18
|
+
* @default 'Europe/Brussels'
|
|
19
|
+
*/
|
|
20
|
+
timezone?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create forgot password email HTML generator with custom configuration
|
|
24
|
+
*/
|
|
25
|
+
export declare function createForgotPasswordEmailGenerator(config?: ForgotPasswordEmailConfig): (args?: {
|
|
26
|
+
req?: PayloadRequest;
|
|
27
|
+
token?: string;
|
|
28
|
+
user?: TypedUser;
|
|
29
|
+
}) => Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Create forgot password email subject generator with custom configuration
|
|
32
|
+
*/
|
|
33
|
+
export declare function createForgotPasswordEmailSubjectGenerator(config?: ForgotPasswordEmailConfig): (args?: {
|
|
34
|
+
req?: PayloadRequest;
|
|
35
|
+
token?: string;
|
|
36
|
+
user?: TypedUser;
|
|
37
|
+
}) => Promise<string>;
|
|
38
|
+
/**
|
|
39
|
+
* Default forgot password email generators
|
|
40
|
+
*/
|
|
41
|
+
export declare const generateForgotPasswordEmailHtmlFromTemplate: (args?: {
|
|
42
|
+
req?: PayloadRequest;
|
|
43
|
+
token?: string;
|
|
44
|
+
user?: TypedUser;
|
|
45
|
+
}) => Promise<string>;
|
|
46
|
+
export declare const generateForgotPasswordEmailSubjectFromTemplate: (args?: {
|
|
47
|
+
req?: PayloadRequest;
|
|
48
|
+
token?: string;
|
|
49
|
+
user?: TypedUser;
|
|
50
|
+
}) => Promise<string>;
|
|
51
|
+
//# sourceMappingURL=forgot-password-email.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forgot-password-email.d.ts","sourceRoot":"","sources":["../../../../src/collections/Users/auth-emails/forgot-password-email.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAKhE,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAEhF;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,CAAC,EAAE,yBAAyB,IAIjB,OAAO;IACvE,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,KAAG,OAAO,CAAC,MAAM,CAAC,CAsDpB;AAED;;GAEG;AACH,wBAAgB,yCAAyC,CAAC,MAAM,CAAC,EAAE,yBAAyB,IAGrB,OAAO;IAC1E,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,KAAG,OAAO,CAAC,MAAM,CAAC,CAqBpB;AAED;;GAEG;AACH,eAAO,MAAM,2CAA2C,UAhGmB;IACvE,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,KAAG,OAAO,CAAC,MAAM,CA4F2E,CAAC;AAChG,eAAO,MAAM,8CAA8C,UA/BmB;IAC1E,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,KAAG,OAAO,CAAC,MAAM,CA2BqF,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { TZDate } from '@date-fns/tz';
|
|
2
|
+
import { headers } from 'next/headers';
|
|
3
|
+
import { generateEmailHtmlFromTemplate, toDatabaseTZDate } from '../../../utils';
|
|
4
|
+
const emailCode = 'password-lost';
|
|
5
|
+
/**
|
|
6
|
+
* Create forgot password email HTML generator with custom configuration
|
|
7
|
+
*/
|
|
8
|
+
export function createForgotPasswordEmailGenerator(config) {
|
|
9
|
+
const defaultLocale = config?.defaultLocale || 'en';
|
|
10
|
+
const timezone = config?.timezone || 'Europe/Brussels';
|
|
11
|
+
return async function generateForgotPasswordEmailHtmlFromTemplate(args) {
|
|
12
|
+
if (!args || !args.req || !args.token || !args.user) {
|
|
13
|
+
throw new Error(`generateForgotPasswordEmailHtmlFromTemplate > Missing required parameters`);
|
|
14
|
+
}
|
|
15
|
+
const payload = args.req.payload;
|
|
16
|
+
// Generate reset URL
|
|
17
|
+
let resetUrl;
|
|
18
|
+
if (config?.generateResetUrl) {
|
|
19
|
+
resetUrl = await config.generateResetUrl(args.token, args.user);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
// Default URL generation
|
|
23
|
+
const headersList = await headers();
|
|
24
|
+
const requestDomain = headersList.get('host') || 'localhost:3000';
|
|
25
|
+
const protocol = requestDomain.includes('localhost') ? 'http' : 'https';
|
|
26
|
+
resetUrl = `${protocol}://${requestDomain}/reset-password?token=${args.token}`;
|
|
27
|
+
}
|
|
28
|
+
const emailContent = await generateEmailHtmlFromTemplate({
|
|
29
|
+
payload: payload,
|
|
30
|
+
emailCode: emailCode,
|
|
31
|
+
locale: args.user.locale || defaultLocale,
|
|
32
|
+
variables: {
|
|
33
|
+
name: args.user.name || '',
|
|
34
|
+
token: args.token,
|
|
35
|
+
url: resetUrl,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
console.log(`Sending email to ${args.user.email} with subject ${emailContent?.subject}`);
|
|
39
|
+
// Log the email in queued-emails as 'sent' for tracking (Payload sends this directly)
|
|
40
|
+
try {
|
|
41
|
+
await payload.create({
|
|
42
|
+
collection: 'queued-emails',
|
|
43
|
+
data: {
|
|
44
|
+
status: 'sent',
|
|
45
|
+
code: emailCode,
|
|
46
|
+
recipient: args.user.email || '',
|
|
47
|
+
subject: emailContent?.subject || '',
|
|
48
|
+
htmlBody: emailContent?.body || '',
|
|
49
|
+
attemptCount: 1,
|
|
50
|
+
maxAttempts: 1,
|
|
51
|
+
sentAt: toDatabaseTZDate(TZDate.tz(timezone)),
|
|
52
|
+
// No idempotencyKey to allow multiple password reset emails
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
payload.logger.error(`Error logging sent email in queued-emails: ${error}`);
|
|
58
|
+
}
|
|
59
|
+
return emailContent?.body || `Template ${emailCode} not found`;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Create forgot password email subject generator with custom configuration
|
|
64
|
+
*/
|
|
65
|
+
export function createForgotPasswordEmailSubjectGenerator(config) {
|
|
66
|
+
const defaultLocale = config?.defaultLocale || 'en';
|
|
67
|
+
return async function generateForgotPasswordEmailSubjectFromTemplate(args) {
|
|
68
|
+
if (!args || !args.req || !args.user) {
|
|
69
|
+
throw new Error(`generateForgotPasswordEmailSubjectFromTemplate > Missing required parameters`);
|
|
70
|
+
}
|
|
71
|
+
const payload = args.req.payload;
|
|
72
|
+
const emailContentTemplateDocs = await payload.find({
|
|
73
|
+
collection: 'email-templates',
|
|
74
|
+
where: { code: { equals: emailCode } },
|
|
75
|
+
limit: 1,
|
|
76
|
+
locale: args.user.locale || defaultLocale,
|
|
77
|
+
});
|
|
78
|
+
if (!emailContentTemplateDocs || emailContentTemplateDocs.totalDocs === 0) {
|
|
79
|
+
payload.logger.error(`Email template with code ${emailCode} not found`);
|
|
80
|
+
return `Template "${emailCode}" not found`;
|
|
81
|
+
}
|
|
82
|
+
return emailContentTemplateDocs.docs[0]?.subject || `Template "${emailCode}" not found`;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Default forgot password email generators
|
|
87
|
+
*/
|
|
88
|
+
export const generateForgotPasswordEmailHtmlFromTemplate = createForgotPasswordEmailGenerator();
|
|
89
|
+
export const generateForgotPasswordEmailSubjectFromTemplate = createForgotPasswordEmailSubjectGenerator();
|
|
90
|
+
//# sourceMappingURL=forgot-password-email.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forgot-password-email.js","sourceRoot":"","sources":["../../../../src/collections/Users/auth-emails/forgot-password-email.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { PayloadRequest, TypedUser } from 'payload';
|
|
2
|
+
import type { Locale } from '../../../types';
|
|
3
|
+
export interface VerifyEmailConfig {
|
|
4
|
+
/**
|
|
5
|
+
* Default locale to use if user has no locale set
|
|
6
|
+
* @default 'en'
|
|
7
|
+
*/
|
|
8
|
+
defaultLocale?: Locale;
|
|
9
|
+
/**
|
|
10
|
+
* Function to generate the verification URL
|
|
11
|
+
* @param token - The verification token
|
|
12
|
+
* @param user - The user object
|
|
13
|
+
* @returns The full verification URL
|
|
14
|
+
*/
|
|
15
|
+
generateVerifyUrl?: (token: string, user: any) => Promise<string> | string;
|
|
16
|
+
/**
|
|
17
|
+
* Timezone for logging email send time
|
|
18
|
+
* @default 'Europe/Brussels'
|
|
19
|
+
*/
|
|
20
|
+
timezone?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create verify email HTML generator with custom configuration
|
|
24
|
+
*/
|
|
25
|
+
export declare function createVerifyEmailGenerator(config?: VerifyEmailConfig): ({ req, token, user, }: {
|
|
26
|
+
req: PayloadRequest;
|
|
27
|
+
token: string;
|
|
28
|
+
user: TypedUser;
|
|
29
|
+
}) => Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Create verify email subject generator with custom configuration
|
|
32
|
+
*/
|
|
33
|
+
export declare function createVerifyEmailSubjectGenerator(config?: VerifyEmailConfig): ({ req, user }: {
|
|
34
|
+
req: PayloadRequest;
|
|
35
|
+
token: string;
|
|
36
|
+
user: any;
|
|
37
|
+
}) => Promise<string>;
|
|
38
|
+
/**
|
|
39
|
+
* Default verify email generators
|
|
40
|
+
*/
|
|
41
|
+
export declare const generateVerifyEmailHtmlFromTemplate: ({ req, token, user, }: {
|
|
42
|
+
req: PayloadRequest;
|
|
43
|
+
token: string;
|
|
44
|
+
user: TypedUser;
|
|
45
|
+
}) => Promise<string>;
|
|
46
|
+
export declare const generateVerifyEmailSubjectFromTemplate: ({ req, user }: {
|
|
47
|
+
req: PayloadRequest;
|
|
48
|
+
token: string;
|
|
49
|
+
user: any;
|
|
50
|
+
}) => Promise<string>;
|
|
51
|
+
//# sourceMappingURL=verify-email.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-email.d.ts","sourceRoot":"","sources":["../../../../src/collections/Users/auth-emails/verify-email.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAKhE,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IAEH,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAE3E;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,CAAC,EAAE,iBAAiB,IAIT,uBAIvD;IACD,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;CACjB,KAAG,OAAO,CAAC,MAAM,CAAC,CAkDpB;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,CAAC,EAAE,iBAAiB,IAIb,eAAe;IAAE,GAAG,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,KAAG,OAAO,CAAC,MAAM,CAAC,CAWhJ;AAED;;GAEG;AACH,eAAO,MAAM,mCAAmC,0BA/E3C;IACD,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;CACjB,KAAG,OAAO,CAAC,MAAM,CA2E2D,CAAC;AAChF,eAAO,MAAM,sCAAsC,kBAjB2B;IAAE,GAAG,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,KAAG,OAAO,CAAC,MAAM,CAiBvD,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { TZDate } from '@date-fns/tz';
|
|
2
|
+
import { headers } from 'next/headers';
|
|
3
|
+
import { generateEmailHtmlFromTemplate, getEmailTemplateByCode, toDatabaseTZDate } from '../../../utils';
|
|
4
|
+
const emailCode = 'verify-email';
|
|
5
|
+
/**
|
|
6
|
+
* Create verify email HTML generator with custom configuration
|
|
7
|
+
*/
|
|
8
|
+
export function createVerifyEmailGenerator(config) {
|
|
9
|
+
const defaultLocale = config?.defaultLocale || 'en';
|
|
10
|
+
const timezone = config?.timezone || 'Europe/Brussels';
|
|
11
|
+
return async function generateVerifyEmailHtmlFromTemplate({ req, token, user, }) {
|
|
12
|
+
const payload = req.payload;
|
|
13
|
+
// Generate verification URL
|
|
14
|
+
let verifyUrl;
|
|
15
|
+
if (config?.generateVerifyUrl) {
|
|
16
|
+
verifyUrl = await config.generateVerifyUrl(token, user);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
// Default URL generation
|
|
20
|
+
const headersList = await headers();
|
|
21
|
+
const requestDomain = headersList.get('host') || 'localhost:3000';
|
|
22
|
+
const protocol = requestDomain.includes('localhost') ? 'http' : 'https';
|
|
23
|
+
verifyUrl = `${protocol}://${requestDomain}/verify-email?token=${token}`;
|
|
24
|
+
}
|
|
25
|
+
const emailContent = await generateEmailHtmlFromTemplate({
|
|
26
|
+
payload: payload,
|
|
27
|
+
emailCode: emailCode,
|
|
28
|
+
locale: user.locale || defaultLocale,
|
|
29
|
+
variables: {
|
|
30
|
+
name: user.name || '',
|
|
31
|
+
token: token,
|
|
32
|
+
url: verifyUrl,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
payload.logger.debug(`Sending email to ${user.email} with subject ${emailContent?.subject}`);
|
|
36
|
+
// Log the email in queued-emails as 'sent' for tracking (Payload sends this directly)
|
|
37
|
+
try {
|
|
38
|
+
await payload.create({
|
|
39
|
+
collection: 'queued-emails',
|
|
40
|
+
data: {
|
|
41
|
+
idempotencyKey: `${emailCode}-${user.id}`,
|
|
42
|
+
status: 'sent',
|
|
43
|
+
code: emailCode,
|
|
44
|
+
recipient: user.email || '',
|
|
45
|
+
subject: emailContent?.subject || '',
|
|
46
|
+
htmlBody: emailContent?.body || '',
|
|
47
|
+
attemptCount: 1,
|
|
48
|
+
maxAttempts: 1,
|
|
49
|
+
sentAt: toDatabaseTZDate(TZDate.tz(timezone)),
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
payload.logger.error(`Error logging sent email in queued-emails: ${error}`);
|
|
55
|
+
}
|
|
56
|
+
return emailContent?.body || 'Template "verify-email" not found';
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create verify email subject generator with custom configuration
|
|
61
|
+
*/
|
|
62
|
+
export function createVerifyEmailSubjectGenerator(config) {
|
|
63
|
+
const defaultLocale = config?.defaultLocale || 'en';
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
65
|
+
return async function generateVerifyEmailSubjectFromTemplate({ req, user }) {
|
|
66
|
+
const payload = req.payload;
|
|
67
|
+
const template = await getEmailTemplateByCode({
|
|
68
|
+
locale: user.locale || defaultLocale,
|
|
69
|
+
code: emailCode,
|
|
70
|
+
payload,
|
|
71
|
+
});
|
|
72
|
+
return template?.subject || `Template "${emailCode}" not found`;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Default verify email generators
|
|
77
|
+
*/
|
|
78
|
+
export const generateVerifyEmailHtmlFromTemplate = createVerifyEmailGenerator();
|
|
79
|
+
export const generateVerifyEmailSubjectFromTemplate = createVerifyEmailSubjectGenerator();
|
|
80
|
+
//# sourceMappingURL=verify-email.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-email.js","sourceRoot":"","sources":["../../../../src/collections/Users/auth-emails/verify-email.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensureFirstUserIsAdmin.d.ts","sourceRoot":"","sources":["../../../../src/collections/Users/hooks/ensureFirstUserIsAdmin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AASzC,eAAO,MAAM,sBAAsB,EAAE,SAAS,CAAC,GAAG,CAYjD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// ensure the first user created is an admin
|
|
2
|
+
// 1. lookup a single user on create as succinctly as possible
|
|
3
|
+
// 2. if there are no users found, append `admin` to the roles array
|
|
4
|
+
// access control is already handled by this fields `access` property
|
|
5
|
+
// it ensures that only admins can create and update the `roles` field
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
7
|
+
export const ensureFirstUserIsAdmin = async ({ req, operation, value }) => {
|
|
8
|
+
if (operation === 'create') {
|
|
9
|
+
const users = await req.payload.find({ collection: 'users', limit: 0, depth: 0 });
|
|
10
|
+
if (users.totalDocs === 0) {
|
|
11
|
+
// if `admin` not in array of values, add it
|
|
12
|
+
if (!(value || []).includes('admin')) {
|
|
13
|
+
return [...(value || []), 'admin'];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=ensureFirstUserIsAdmin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensureFirstUserIsAdmin.js","sourceRoot":"","sources":["../../../../src/collections/Users/hooks/ensureFirstUserIsAdmin.ts"],"names":[],"mappings":"AAEA,4CAA4C;AAC5C,8DAA8D;AAC9D,oEAAoE;AACpE,qEAAqE;AACrE,sEAAsE;AAEtE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAAmB,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;IACxF,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAClF,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;YAC1B,4CAA4C;YAC5C,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { CollectionConfig } from 'payload';
|
|
2
|
+
import { createForgotPasswordEmailGenerator, createForgotPasswordEmailSubjectGenerator, type ForgotPasswordEmailConfig } from './auth-emails/forgot-password-email';
|
|
3
|
+
import { createVerifyEmailGenerator, createVerifyEmailSubjectGenerator, type VerifyEmailConfig } from './auth-emails/verify-email';
|
|
4
|
+
import type { Locale } from '../../types';
|
|
5
|
+
export interface UsersCollectionConfig {
|
|
6
|
+
/**
|
|
7
|
+
* User roles
|
|
8
|
+
* @default ['admin', 'user']
|
|
9
|
+
*/
|
|
10
|
+
roles?: Array<{
|
|
11
|
+
label: {
|
|
12
|
+
fr: string;
|
|
13
|
+
nl: string;
|
|
14
|
+
en: string;
|
|
15
|
+
};
|
|
16
|
+
value: string;
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* Available locales for users
|
|
20
|
+
* @default [{ label: { fr: 'Anglais', nl: 'Engels', en: 'English' }, value: 'en' }, ...]
|
|
21
|
+
*/
|
|
22
|
+
locales?: Array<{
|
|
23
|
+
label: {
|
|
24
|
+
fr: string;
|
|
25
|
+
nl: string;
|
|
26
|
+
en: string;
|
|
27
|
+
};
|
|
28
|
+
value: Locale;
|
|
29
|
+
}>;
|
|
30
|
+
/**
|
|
31
|
+
* Default locale
|
|
32
|
+
* @default 'en'
|
|
33
|
+
*/
|
|
34
|
+
defaultLocale?: Locale;
|
|
35
|
+
/**
|
|
36
|
+
* Token expiration in seconds
|
|
37
|
+
* @default 60 * 60 * 24 * 365 (1 year)
|
|
38
|
+
*/
|
|
39
|
+
tokenExpiration?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Maximum login attempts before lockout
|
|
42
|
+
* @default 10
|
|
43
|
+
*/
|
|
44
|
+
maxLoginAttempts?: number;
|
|
45
|
+
/**
|
|
46
|
+
* Lockout time in milliseconds
|
|
47
|
+
* @default 1000 * 60 * 10 (10 minutes)
|
|
48
|
+
*/
|
|
49
|
+
lockTime?: number;
|
|
50
|
+
/**
|
|
51
|
+
* Forgot password expiration in milliseconds
|
|
52
|
+
* @default 1000 * 60 * 60 * 24 * 10 (10 days)
|
|
53
|
+
*/
|
|
54
|
+
forgotPasswordExpiration?: number;
|
|
55
|
+
/**
|
|
56
|
+
* Configuration for verify email
|
|
57
|
+
*/
|
|
58
|
+
verifyEmailConfig?: VerifyEmailConfig;
|
|
59
|
+
/**
|
|
60
|
+
* Configuration for forgot password email
|
|
61
|
+
*/
|
|
62
|
+
forgotPasswordEmailConfig?: ForgotPasswordEmailConfig;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create Users collection with optional configuration
|
|
66
|
+
*
|
|
67
|
+
* @param config - Optional configuration for the Users collection
|
|
68
|
+
* @returns CollectionConfig for Users
|
|
69
|
+
*/
|
|
70
|
+
export declare function createUsersCollection(config?: UsersCollectionConfig): CollectionConfig;
|
|
71
|
+
/**
|
|
72
|
+
* Default Users collection
|
|
73
|
+
*/
|
|
74
|
+
export declare const Users: CollectionConfig;
|
|
75
|
+
export { createVerifyEmailGenerator, createVerifyEmailSubjectGenerator, createForgotPasswordEmailGenerator, createForgotPasswordEmailSubjectGenerator, type VerifyEmailConfig, type ForgotPasswordEmailConfig, };
|
|
76
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collections/Users/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,EACL,kCAAkC,EAClC,yCAAyC,EACzC,KAAK,yBAAyB,EAG/B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EAGjC,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEhF;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAElF;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC;;OAEG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAEtC;;OAEG;IACH,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;CACvD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,gBAAgB,CAwGtF;AAED;;GAEG;AACH,eAAO,MAAM,KAAK,kBAA0B,CAAC;AAG7C,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EACjC,kCAAkC,EAClC,yCAAyC,EACzC,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,GAC/B,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { createForgotPasswordEmailGenerator, createForgotPasswordEmailSubjectGenerator, generateForgotPasswordEmailHtmlFromTemplate, generateForgotPasswordEmailSubjectFromTemplate, } from './auth-emails/forgot-password-email';
|
|
2
|
+
import { createVerifyEmailGenerator, createVerifyEmailSubjectGenerator, generateVerifyEmailHtmlFromTemplate, generateVerifyEmailSubjectFromTemplate, } from './auth-emails/verify-email';
|
|
3
|
+
import { ensureFirstUserIsAdmin } from './hooks/ensureFirstUserIsAdmin';
|
|
4
|
+
import { adminsFieldLevel } from '../../access/admins';
|
|
5
|
+
import { authenticatedAccessOnly } from '../../access/authenticatedAccessOnly';
|
|
6
|
+
/**
|
|
7
|
+
* Create Users collection with optional configuration
|
|
8
|
+
*
|
|
9
|
+
* @param config - Optional configuration for the Users collection
|
|
10
|
+
* @returns CollectionConfig for Users
|
|
11
|
+
*/
|
|
12
|
+
export function createUsersCollection(config) {
|
|
13
|
+
const roles = config?.roles || [
|
|
14
|
+
{
|
|
15
|
+
label: { fr: 'Administrateur', nl: 'Beheerder', en: 'Admin' },
|
|
16
|
+
value: 'admin',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
label: { fr: 'User', nl: 'Gebruiker', en: 'User' },
|
|
20
|
+
value: 'user',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
const locales = config?.locales || [
|
|
24
|
+
{
|
|
25
|
+
label: { fr: 'Anglais', nl: 'Engels', en: 'English' },
|
|
26
|
+
value: 'en',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
label: { fr: 'Français', nl: 'Frans', en: 'French' },
|
|
30
|
+
value: 'fr',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
label: { fr: 'Néerlandais', nl: 'Nederlands', en: 'Dutch' },
|
|
34
|
+
value: 'nl',
|
|
35
|
+
},
|
|
36
|
+
];
|
|
37
|
+
return {
|
|
38
|
+
slug: 'users',
|
|
39
|
+
labels: {
|
|
40
|
+
singular: { fr: 'Utilisateur', en: 'User', nl: 'Gebruiker' },
|
|
41
|
+
plural: { fr: 'Utilisateurs', en: 'Users', nl: 'Gebruikers' },
|
|
42
|
+
},
|
|
43
|
+
admin: {
|
|
44
|
+
useAsTitle: 'email',
|
|
45
|
+
hideAPIURL: true,
|
|
46
|
+
group: { fr: 'Utilisateurs', nl: 'Gebruikers', en: 'Users' },
|
|
47
|
+
},
|
|
48
|
+
access: authenticatedAccessOnly,
|
|
49
|
+
auth: {
|
|
50
|
+
tokenExpiration: config?.tokenExpiration ?? 60 * 60 * 24 * 365, // In seconds, 1 year
|
|
51
|
+
maxLoginAttempts: config?.maxLoginAttempts ?? 10,
|
|
52
|
+
lockTime: config?.lockTime ?? 1000 * 60 * 10, // In milliseconds, 10 minutes
|
|
53
|
+
verify: {
|
|
54
|
+
generateEmailHTML: config?.verifyEmailConfig ? createVerifyEmailGenerator(config.verifyEmailConfig) : generateVerifyEmailHtmlFromTemplate,
|
|
55
|
+
generateEmailSubject: config?.verifyEmailConfig
|
|
56
|
+
? createVerifyEmailSubjectGenerator(config.verifyEmailConfig)
|
|
57
|
+
: generateVerifyEmailSubjectFromTemplate,
|
|
58
|
+
},
|
|
59
|
+
forgotPassword: {
|
|
60
|
+
expiration: config?.forgotPasswordExpiration ?? 1000 * 60 * 60 * 24 * 10, // In milliseconds, 10 days
|
|
61
|
+
generateEmailHTML: config?.forgotPasswordEmailConfig
|
|
62
|
+
? createForgotPasswordEmailGenerator(config.forgotPasswordEmailConfig)
|
|
63
|
+
: generateForgotPasswordEmailHtmlFromTemplate,
|
|
64
|
+
generateEmailSubject: config?.forgotPasswordEmailConfig
|
|
65
|
+
? createForgotPasswordEmailSubjectGenerator(config.forgotPasswordEmailConfig)
|
|
66
|
+
: generateForgotPasswordEmailSubjectFromTemplate,
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
fields: [
|
|
70
|
+
// Email added by default
|
|
71
|
+
// Add more fields as needed
|
|
72
|
+
{
|
|
73
|
+
type: 'row',
|
|
74
|
+
fields: [
|
|
75
|
+
{
|
|
76
|
+
name: 'name',
|
|
77
|
+
label: { fr: 'Nom', nl: 'Naam', en: 'Name' },
|
|
78
|
+
type: 'text',
|
|
79
|
+
required: false,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'locale',
|
|
83
|
+
label: { fr: 'Langue', nl: 'Taal', en: 'Language' },
|
|
84
|
+
type: 'select',
|
|
85
|
+
hasMany: false,
|
|
86
|
+
defaultValue: config?.defaultLocale || 'en',
|
|
87
|
+
options: locales,
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'roles',
|
|
93
|
+
label: { fr: 'Rôles', nl: 'Rollen', en: 'Roles' },
|
|
94
|
+
type: 'select',
|
|
95
|
+
hasMany: true,
|
|
96
|
+
defaultValue: ['user'],
|
|
97
|
+
options: roles,
|
|
98
|
+
hooks: {
|
|
99
|
+
beforeChange: [ensureFirstUserIsAdmin],
|
|
100
|
+
},
|
|
101
|
+
access: {
|
|
102
|
+
read: adminsFieldLevel,
|
|
103
|
+
create: adminsFieldLevel,
|
|
104
|
+
update: adminsFieldLevel,
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Default Users collection
|
|
112
|
+
*/
|
|
113
|
+
export const Users = createUsersCollection();
|
|
114
|
+
// Re-export auth email generators for customization
|
|
115
|
+
export { createVerifyEmailGenerator, createVerifyEmailSubjectGenerator, createForgotPasswordEmailGenerator, createForgotPasswordEmailSubjectGenerator, };
|
|
116
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/collections/Users/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { Users, createUsersCollection, type UsersCollectionConfig } from './Users';
|
|
2
|
+
export { Media } from './Media';
|
|
3
|
+
export { ContactMessages, createContactMessagesCollection, type ContactMessagesConfig } from './ContactMessages';
|
|
4
|
+
export { EmailTemplates, createEmailTemplatesCollection, type EmailTemplatesConfig } from './EmailTemplates';
|
|
5
|
+
export { QueuedEmails } from './QueuedEmails';
|
|
6
|
+
export { createVerifyEmailGenerator, createVerifyEmailSubjectGenerator, createForgotPasswordEmailGenerator, createForgotPasswordEmailSubjectGenerator, type VerifyEmailConfig, type ForgotPasswordEmailConfig, } from './Users';
|
|
7
|
+
export { createSendEmailNotificationHook, type SendEmailNotificationConfig } from './ContactMessages';
|
|
8
|
+
export { HTMLViewer } from './QueuedEmails/components/HtmlViewer';
|
|
9
|
+
export { RetryEmailButtons } from './QueuedEmails/components/RetryEmailButtons';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,+BAA+B,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACjH,OAAO,EAAE,cAAc,EAAE,8BAA8B,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7G,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EACjC,kCAAkC,EAClC,yCAAyC,EACzC,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,GAC/B,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,+BAA+B,EAAE,KAAK,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAGtG,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Collections
|
|
2
|
+
export { Users, createUsersCollection } from './Users';
|
|
3
|
+
export { Media } from './Media';
|
|
4
|
+
export { ContactMessages, createContactMessagesCollection } from './ContactMessages';
|
|
5
|
+
export { EmailTemplates, createEmailTemplatesCollection } from './EmailTemplates';
|
|
6
|
+
export { QueuedEmails } from './QueuedEmails';
|
|
7
|
+
// Users auth emails
|
|
8
|
+
export { createVerifyEmailGenerator, createVerifyEmailSubjectGenerator, createForgotPasswordEmailGenerator, createForgotPasswordEmailSubjectGenerator, } from './Users';
|
|
9
|
+
// ContactMessages hooks
|
|
10
|
+
export { createSendEmailNotificationHook } from './ContactMessages';
|
|
11
|
+
// QueuedEmails components
|
|
12
|
+
export { HTMLViewer } from './QueuedEmails/components/HtmlViewer';
|
|
13
|
+
export { RetryEmailButtons } from './QueuedEmails/components/RetryEmailButtons';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAA8B,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,+BAA+B,EAA8B,MAAM,mBAAmB,CAAC;AACjH,OAAO,EAAE,cAAc,EAAE,8BAA8B,EAA6B,MAAM,kBAAkB,CAAC;AAC7G,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,oBAAoB;AACpB,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EACjC,kCAAkC,EAClC,yCAAyC,GAG1C,MAAM,SAAS,CAAC;AAEjB,wBAAwB;AACxB,OAAO,EAAE,+BAA+B,EAAoC,MAAM,mBAAmB,CAAC;AAEtG,0BAA0B;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mDAAmD,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0DAA0D,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// Re-export components from collections for backward compatibility
|
|
2
|
+
export { HTMLViewer } from '../collections/QueuedEmails/components/HtmlViewer';
|
|
3
|
+
export { RetryEmailButtons } from '../collections/QueuedEmails/components/RetryEmailButtons';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,mDAAmD,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0DAA0D,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function createSuccessFormState<T>(previousState: T): {
|
|
2
|
+
success: true;
|
|
3
|
+
} & T;
|
|
4
|
+
export declare function extractFormDataToReturn<T extends Record<string, unknown>>({ formData, excludes, }: {
|
|
5
|
+
formData: FormData;
|
|
6
|
+
excludes?: (keyof T)[];
|
|
7
|
+
}): T;
|
|
8
|
+
//# sourceMappingURL=states.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../src/forms/states.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GAAG,CAAC,CAKjF;AAID,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACzE,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;CACxB,GAAG,CAAC,CAOJ"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function createSuccessFormState(previousState) {
|
|
2
|
+
return {
|
|
3
|
+
...previousState,
|
|
4
|
+
success: true,
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
// TODO createErrorFormState
|
|
8
|
+
export function extractFormDataToReturn({ formData, excludes, }) {
|
|
9
|
+
const data = Object.fromEntries(formData.entries());
|
|
10
|
+
excludes?.forEach((field) => {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
data[field] = '';
|
|
13
|
+
});
|
|
14
|
+
return data;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=states.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"states.js","sourceRoot":"","sources":["../../src/forms/states.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,sBAAsB,CAAI,aAAgB;IACxD,OAAO;QACL,GAAG,aAAa;QAChB,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,4BAA4B;AAE5B,MAAM,UAAU,uBAAuB,CAAoC,EACzE,QAAQ,EACR,QAAQ,GAIT;IACC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAM,CAAC;IACzD,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,8DAA8D;QAC7D,IAAY,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare function translateFormErrors<T extends z.ZodTypeAny>(errors: z.inferFlattenedErrors<T>): Promise<{
|
|
3
|
+
fieldErrors: {
|
|
4
|
+
[k: string]: string[];
|
|
5
|
+
};
|
|
6
|
+
formErrors: string[];
|
|
7
|
+
}>;
|
|
8
|
+
//# sourceMappingURL=translate-errors.d.ts.map
|