refactor: completely remove payload cms and convert to static/mdx approaches
This commit is contained in:
@@ -1,17 +0,0 @@
|
|||||||
import configPromise from "@payload-config";
|
|
||||||
import { RootPage } from "@payloadcms/next/views";
|
|
||||||
import { importMap } from "../importMap";
|
|
||||||
|
|
||||||
type Args = {
|
|
||||||
params: Promise<{
|
|
||||||
segments: string[];
|
|
||||||
}>;
|
|
||||||
searchParams: Promise<{
|
|
||||||
[key: string]: string | string[];
|
|
||||||
}>;
|
|
||||||
};
|
|
||||||
|
|
||||||
const Page = ({ params, searchParams }: Args) =>
|
|
||||||
RootPage({ config: configPromise, importMap, params, searchParams });
|
|
||||||
|
|
||||||
export default Page;
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
import { RscEntryLexicalCell as RscEntryLexicalCell_44fe37237e0ebf4470c9990d8cb7b07e } from "@payloadcms/richtext-lexical/rsc";
|
|
||||||
import { RscEntryLexicalField as RscEntryLexicalField_44fe37237e0ebf4470c9990d8cb7b07e } from "@payloadcms/richtext-lexical/rsc";
|
|
||||||
import { LexicalDiffComponent as LexicalDiffComponent_44fe37237e0ebf4470c9990d8cb7b07e } from "@payloadcms/richtext-lexical/rsc";
|
|
||||||
import { BlocksFeatureClient as BlocksFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { InlineToolbarFeatureClient as InlineToolbarFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { HorizontalRuleFeatureClient as HorizontalRuleFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { UploadFeatureClient as UploadFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { BlockquoteFeatureClient as BlockquoteFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { RelationshipFeatureClient as RelationshipFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { LinkFeatureClient as LinkFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { ChecklistFeatureClient as ChecklistFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { OrderedListFeatureClient as OrderedListFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { UnorderedListFeatureClient as UnorderedListFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { IndentFeatureClient as IndentFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { AlignFeatureClient as AlignFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { HeadingFeatureClient as HeadingFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { ParagraphFeatureClient as ParagraphFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { InlineCodeFeatureClient as InlineCodeFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { SuperscriptFeatureClient as SuperscriptFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { SubscriptFeatureClient as SubscriptFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { StrikethroughFeatureClient as StrikethroughFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { UnderlineFeatureClient as UnderlineFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { BoldFeatureClient as BoldFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { ItalicFeatureClient as ItalicFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from "@payloadcms/richtext-lexical/client";
|
|
||||||
import { CollectionCards as CollectionCards_f9c02e79a4aed9a3924487c0cd4cafb1 } from "@payloadcms/next/rsc";
|
|
||||||
|
|
||||||
export const importMap = {
|
|
||||||
"@payloadcms/richtext-lexical/rsc#RscEntryLexicalCell":
|
|
||||||
RscEntryLexicalCell_44fe37237e0ebf4470c9990d8cb7b07e,
|
|
||||||
"@payloadcms/richtext-lexical/rsc#RscEntryLexicalField":
|
|
||||||
RscEntryLexicalField_44fe37237e0ebf4470c9990d8cb7b07e,
|
|
||||||
"@payloadcms/richtext-lexical/rsc#LexicalDiffComponent":
|
|
||||||
LexicalDiffComponent_44fe37237e0ebf4470c9990d8cb7b07e,
|
|
||||||
"@payloadcms/richtext-lexical/client#BlocksFeatureClient":
|
|
||||||
BlocksFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#InlineToolbarFeatureClient":
|
|
||||||
InlineToolbarFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#HorizontalRuleFeatureClient":
|
|
||||||
HorizontalRuleFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#UploadFeatureClient":
|
|
||||||
UploadFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#BlockquoteFeatureClient":
|
|
||||||
BlockquoteFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#RelationshipFeatureClient":
|
|
||||||
RelationshipFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#LinkFeatureClient":
|
|
||||||
LinkFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#ChecklistFeatureClient":
|
|
||||||
ChecklistFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#OrderedListFeatureClient":
|
|
||||||
OrderedListFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#UnorderedListFeatureClient":
|
|
||||||
UnorderedListFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#IndentFeatureClient":
|
|
||||||
IndentFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#AlignFeatureClient":
|
|
||||||
AlignFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#HeadingFeatureClient":
|
|
||||||
HeadingFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#ParagraphFeatureClient":
|
|
||||||
ParagraphFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#InlineCodeFeatureClient":
|
|
||||||
InlineCodeFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#SuperscriptFeatureClient":
|
|
||||||
SuperscriptFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#SubscriptFeatureClient":
|
|
||||||
SubscriptFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#StrikethroughFeatureClient":
|
|
||||||
StrikethroughFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#UnderlineFeatureClient":
|
|
||||||
UnderlineFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#BoldFeatureClient":
|
|
||||||
BoldFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/richtext-lexical/client#ItalicFeatureClient":
|
|
||||||
ItalicFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
|
|
||||||
"@payloadcms/next/rsc#CollectionCards":
|
|
||||||
CollectionCards_f9c02e79a4aed9a3924487c0cd4cafb1,
|
|
||||||
};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export const importMap = {};
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
import config from "@payload-config";
|
|
||||||
import {
|
|
||||||
REST_GET,
|
|
||||||
REST_OPTIONS,
|
|
||||||
REST_PATCH,
|
|
||||||
REST_POST,
|
|
||||||
REST_DELETE,
|
|
||||||
} from "@payloadcms/next/routes";
|
|
||||||
|
|
||||||
export const GET = REST_GET(config);
|
|
||||||
export const POST = REST_POST(config);
|
|
||||||
export const DELETE = REST_DELETE(config);
|
|
||||||
export const PATCH = REST_PATCH(config);
|
|
||||||
export const OPTIONS = REST_OPTIONS(config);
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/* Custom SCSS for Payload Admin Panel */
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
import configPromise from "@payload-config";
|
|
||||||
import { RootLayout } from "@payloadcms/next/layouts";
|
|
||||||
import React from "react";
|
|
||||||
|
|
||||||
import "@payloadcms/next/css";
|
|
||||||
import "./custom.scss";
|
|
||||||
import { handleServerFunctions } from "@payloadcms/next/layouts";
|
|
||||||
import { importMap } from "./admin/importMap";
|
|
||||||
|
|
||||||
type Args = {
|
|
||||||
children: React.ReactNode;
|
|
||||||
};
|
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
||||||
const serverFunction: any = async function (args: any) {
|
|
||||||
"use server";
|
|
||||||
return handleServerFunctions({
|
|
||||||
...args,
|
|
||||||
config: configPromise,
|
|
||||||
importMap,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const Layout = ({ children }: Args) => {
|
|
||||||
return (
|
|
||||||
<RootLayout
|
|
||||||
config={configPromise}
|
|
||||||
importMap={importMap}
|
|
||||||
serverFunction={serverFunction}
|
|
||||||
>
|
|
||||||
{children}
|
|
||||||
</RootLayout>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Layout;
|
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { getPayload } from "payload";
|
|
||||||
import configPromise from "@payload-config";
|
|
||||||
import { getServerAppServices } from "@/lib/services/create-services.server";
|
import { getServerAppServices } from "@/lib/services/create-services.server";
|
||||||
import {
|
import {
|
||||||
render,
|
render,
|
||||||
@@ -50,34 +48,6 @@ export async function POST(req: Request) {
|
|||||||
return NextResponse.json({ error: "message_too_long" }, { status: 400 });
|
return NextResponse.json({ error: "message_too_long" }, { status: 400 });
|
||||||
}
|
}
|
||||||
|
|
||||||
const payload = await getPayload({ config: configPromise });
|
|
||||||
|
|
||||||
// 1. Payload save
|
|
||||||
let payloadSaved = false;
|
|
||||||
try {
|
|
||||||
await payload.create({
|
|
||||||
collection: "form-submissions",
|
|
||||||
data: {
|
|
||||||
name,
|
|
||||||
email,
|
|
||||||
company: company || "Nicht angegeben",
|
|
||||||
message,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
logger.info("Contact submission saved to PayloadCMS");
|
|
||||||
payloadSaved = true;
|
|
||||||
} catch (payloadError) {
|
|
||||||
const errorMessage =
|
|
||||||
payloadError instanceof Error
|
|
||||||
? payloadError.message
|
|
||||||
: String(payloadError);
|
|
||||||
logger.error("Failed to save to Payload", {
|
|
||||||
error: errorMessage,
|
|
||||||
details: payloadError,
|
|
||||||
});
|
|
||||||
services.errors.captureException(payloadError, { phase: "payload_save" });
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Email sending via standalone Nodemailer (bypassing Payload adapter)
|
// 2. Email sending via standalone Nodemailer (bypassing Payload adapter)
|
||||||
try {
|
try {
|
||||||
const { config } = await import("@/lib/config");
|
const { config } = await import("@/lib/config");
|
||||||
@@ -103,7 +73,10 @@ export async function POST(req: Request) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
logger.info("Preparing to send notification email", { to, host: config.mail.host });
|
logger.info("Preparing to send notification email", {
|
||||||
|
to,
|
||||||
|
host: config.mail.host,
|
||||||
|
});
|
||||||
|
|
||||||
// 2a. Notification to MB Grid
|
// 2a. Notification to MB Grid
|
||||||
const notificationHtml = await render(
|
const notificationHtml = await render(
|
||||||
@@ -123,9 +96,13 @@ export async function POST(req: Request) {
|
|||||||
subject: `Kontaktanfrage von ${name}`,
|
subject: `Kontaktanfrage von ${name}`,
|
||||||
html: notificationHtml,
|
html: notificationHtml,
|
||||||
});
|
});
|
||||||
logger.info("Notification email sent successfully", { messageId: info?.messageId });
|
logger.info("Notification email sent successfully", {
|
||||||
|
messageId: info?.messageId,
|
||||||
|
});
|
||||||
} catch (notifyError) {
|
} catch (notifyError) {
|
||||||
logger.error("Failed to send notification email", { error: notifyError });
|
logger.error("Failed to send notification email", {
|
||||||
|
error: notifyError,
|
||||||
|
});
|
||||||
throw notifyError; // Re-throw to be caught by the outer SMTP catch
|
throw notifyError; // Re-throw to be caught by the outer SMTP catch
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,11 +122,18 @@ export async function POST(req: Request) {
|
|||||||
subject: `Ihre Kontaktanfrage bei ${clientName}`,
|
subject: `Ihre Kontaktanfrage bei ${clientName}`,
|
||||||
html: confirmationHtml,
|
html: confirmationHtml,
|
||||||
});
|
});
|
||||||
logger.info("Confirmation email sent successfully", { messageId: info?.messageId });
|
logger.info("Confirmation email sent successfully", {
|
||||||
|
messageId: info?.messageId,
|
||||||
|
});
|
||||||
} catch (confirmError) {
|
} catch (confirmError) {
|
||||||
logger.warn(
|
logger.warn(
|
||||||
"Failed to send confirmation email, but notification was sent",
|
"Failed to send confirmation email, but notification was sent",
|
||||||
{ error: confirmError instanceof Error ? confirmError.message : String(confirmError) },
|
{
|
||||||
|
error:
|
||||||
|
confirmError instanceof Error
|
||||||
|
? confirmError.message
|
||||||
|
: String(confirmError),
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,18 +149,10 @@ export async function POST(req: Request) {
|
|||||||
logger.error("SMTP Error", { error: smtpError });
|
logger.error("SMTP Error", { error: smtpError });
|
||||||
services.errors.captureException(smtpError, { phase: "smtp_send" });
|
services.errors.captureException(smtpError, { phase: "smtp_send" });
|
||||||
|
|
||||||
if (!payloadSaved) {
|
return NextResponse.json(
|
||||||
return NextResponse.json(
|
{ error: "Systemfehler (E-Mail-Versand fehlgeschlagen)" },
|
||||||
{ error: "Systemfehler (Speicherung und Versand fehlgeschlagen)" },
|
{ status: 500 },
|
||||||
{ status: 500 },
|
);
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
await services.notifications.notify({
|
|
||||||
title: "🚨 SMTP Fehler (Kontaktformular)",
|
|
||||||
message: `Anfrage von ${name} (${email}) in Payload gespeichert, aber E-Mail-Versand fehlgeschlagen: ${smtpError instanceof Error ? smtpError.message : String(smtpError)}`,
|
|
||||||
priority: 8,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Track success
|
// Track success
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
import { NextResponse } from "next/server";
|
|
||||||
import { getPayload } from "payload";
|
|
||||||
import configPromise from "@payload-config";
|
|
||||||
import { getServerAppServices } from "@/lib/services/create-services.server";
|
|
||||||
|
|
||||||
export async function POST(req: Request) {
|
|
||||||
const authHeader = req.headers.get("authorization");
|
|
||||||
if (authHeader !== `Bearer ${process.env.PAYLOAD_SECRET}`) {
|
|
||||||
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
||||||
}
|
|
||||||
|
|
||||||
const { logger } = getServerAppServices();
|
|
||||||
|
|
||||||
try {
|
|
||||||
logger.info("Starting programmatic Payload migrations...");
|
|
||||||
const payload = await getPayload({ config: configPromise });
|
|
||||||
|
|
||||||
await payload.db.migrate();
|
|
||||||
|
|
||||||
logger.info("Successfully executed Payload migrations.");
|
|
||||||
return NextResponse.json({
|
|
||||||
success: true,
|
|
||||||
message: "Migrations executed successfully.",
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
logger.error("Failed to run migrations remotely", { error });
|
|
||||||
return NextResponse.json(
|
|
||||||
{
|
|
||||||
error:
|
|
||||||
error instanceof Error ? error.message : "Unknown error occurred",
|
|
||||||
},
|
|
||||||
{ status: 500 },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,183 +0,0 @@
|
|||||||
import { MigrateUpArgs, MigrateDownArgs, sql } from "@payloadcms/db-postgres";
|
|
||||||
|
|
||||||
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
|
|
||||||
await db.execute(sql`
|
|
||||||
CREATE TABLE "users_sessions" (
|
|
||||||
"_order" integer NOT NULL,
|
|
||||||
"_parent_id" integer NOT NULL,
|
|
||||||
"id" varchar PRIMARY KEY NOT NULL,
|
|
||||||
"created_at" timestamp(3) with time zone,
|
|
||||||
"expires_at" timestamp(3) with time zone NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "users" (
|
|
||||||
"id" serial PRIMARY KEY NOT NULL,
|
|
||||||
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
||||||
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
||||||
"email" varchar NOT NULL,
|
|
||||||
"reset_password_token" varchar,
|
|
||||||
"reset_password_expiration" timestamp(3) with time zone,
|
|
||||||
"salt" varchar,
|
|
||||||
"hash" varchar,
|
|
||||||
"login_attempts" numeric DEFAULT 0,
|
|
||||||
"lock_until" timestamp(3) with time zone
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "media" (
|
|
||||||
"id" serial PRIMARY KEY NOT NULL,
|
|
||||||
"alt" varchar NOT NULL,
|
|
||||||
"prefix" varchar DEFAULT 'mb-grid-solutions/media',
|
|
||||||
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
||||||
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
||||||
"url" varchar,
|
|
||||||
"thumbnail_u_r_l" varchar,
|
|
||||||
"filename" varchar,
|
|
||||||
"mime_type" varchar,
|
|
||||||
"filesize" numeric,
|
|
||||||
"width" numeric,
|
|
||||||
"height" numeric,
|
|
||||||
"focal_x" numeric,
|
|
||||||
"focal_y" numeric,
|
|
||||||
"sizes_thumbnail_url" varchar,
|
|
||||||
"sizes_thumbnail_width" numeric,
|
|
||||||
"sizes_thumbnail_height" numeric,
|
|
||||||
"sizes_thumbnail_mime_type" varchar,
|
|
||||||
"sizes_thumbnail_filesize" numeric,
|
|
||||||
"sizes_thumbnail_filename" varchar,
|
|
||||||
"sizes_card_url" varchar,
|
|
||||||
"sizes_card_width" numeric,
|
|
||||||
"sizes_card_height" numeric,
|
|
||||||
"sizes_card_mime_type" varchar,
|
|
||||||
"sizes_card_filesize" numeric,
|
|
||||||
"sizes_card_filename" varchar
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "form_submissions" (
|
|
||||||
"id" serial PRIMARY KEY NOT NULL,
|
|
||||||
"name" varchar NOT NULL,
|
|
||||||
"email" varchar NOT NULL,
|
|
||||||
"company" varchar,
|
|
||||||
"message" varchar NOT NULL,
|
|
||||||
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
||||||
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "pages" (
|
|
||||||
"id" serial PRIMARY KEY NOT NULL,
|
|
||||||
"title" varchar NOT NULL,
|
|
||||||
"slug" varchar NOT NULL,
|
|
||||||
"content" jsonb NOT NULL,
|
|
||||||
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
||||||
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "payload_kv" (
|
|
||||||
"id" serial PRIMARY KEY NOT NULL,
|
|
||||||
"key" varchar NOT NULL,
|
|
||||||
"data" jsonb NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "payload_locked_documents" (
|
|
||||||
"id" serial PRIMARY KEY NOT NULL,
|
|
||||||
"global_slug" varchar,
|
|
||||||
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
||||||
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "payload_locked_documents_rels" (
|
|
||||||
"id" serial PRIMARY KEY NOT NULL,
|
|
||||||
"order" integer,
|
|
||||||
"parent_id" integer NOT NULL,
|
|
||||||
"path" varchar NOT NULL,
|
|
||||||
"users_id" integer,
|
|
||||||
"media_id" integer,
|
|
||||||
"form_submissions_id" integer,
|
|
||||||
"pages_id" integer
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "payload_preferences" (
|
|
||||||
"id" serial PRIMARY KEY NOT NULL,
|
|
||||||
"key" varchar,
|
|
||||||
"value" jsonb,
|
|
||||||
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
||||||
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "payload_preferences_rels" (
|
|
||||||
"id" serial PRIMARY KEY NOT NULL,
|
|
||||||
"order" integer,
|
|
||||||
"parent_id" integer NOT NULL,
|
|
||||||
"path" varchar NOT NULL,
|
|
||||||
"users_id" integer
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "payload_migrations" (
|
|
||||||
"id" serial PRIMARY KEY NOT NULL,
|
|
||||||
"name" varchar,
|
|
||||||
"batch" numeric,
|
|
||||||
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
||||||
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
ALTER TABLE "users_sessions" ADD CONSTRAINT "users_sessions_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
|
|
||||||
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."payload_locked_documents"("id") ON DELETE cascade ON UPDATE no action;
|
|
||||||
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_users_fk" FOREIGN KEY ("users_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
|
|
||||||
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_media_fk" FOREIGN KEY ("media_id") REFERENCES "public"."media"("id") ON DELETE cascade ON UPDATE no action;
|
|
||||||
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_form_submissions_fk" FOREIGN KEY ("form_submissions_id") REFERENCES "public"."form_submissions"("id") ON DELETE cascade ON UPDATE no action;
|
|
||||||
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_pages_fk" FOREIGN KEY ("pages_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
|
|
||||||
ALTER TABLE "payload_preferences_rels" ADD CONSTRAINT "payload_preferences_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."payload_preferences"("id") ON DELETE cascade ON UPDATE no action;
|
|
||||||
ALTER TABLE "payload_preferences_rels" ADD CONSTRAINT "payload_preferences_rels_users_fk" FOREIGN KEY ("users_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
|
|
||||||
CREATE INDEX "users_sessions_order_idx" ON "users_sessions" USING btree ("_order");
|
|
||||||
CREATE INDEX "users_sessions_parent_id_idx" ON "users_sessions" USING btree ("_parent_id");
|
|
||||||
CREATE INDEX "users_updated_at_idx" ON "users" USING btree ("updated_at");
|
|
||||||
CREATE INDEX "users_created_at_idx" ON "users" USING btree ("created_at");
|
|
||||||
CREATE UNIQUE INDEX "users_email_idx" ON "users" USING btree ("email");
|
|
||||||
CREATE INDEX "media_updated_at_idx" ON "media" USING btree ("updated_at");
|
|
||||||
CREATE INDEX "media_created_at_idx" ON "media" USING btree ("created_at");
|
|
||||||
CREATE UNIQUE INDEX "media_filename_idx" ON "media" USING btree ("filename");
|
|
||||||
CREATE INDEX "media_sizes_thumbnail_sizes_thumbnail_filename_idx" ON "media" USING btree ("sizes_thumbnail_filename");
|
|
||||||
CREATE INDEX "media_sizes_card_sizes_card_filename_idx" ON "media" USING btree ("sizes_card_filename");
|
|
||||||
CREATE INDEX "form_submissions_updated_at_idx" ON "form_submissions" USING btree ("updated_at");
|
|
||||||
CREATE INDEX "form_submissions_created_at_idx" ON "form_submissions" USING btree ("created_at");
|
|
||||||
CREATE INDEX "pages_updated_at_idx" ON "pages" USING btree ("updated_at");
|
|
||||||
CREATE INDEX "pages_created_at_idx" ON "pages" USING btree ("created_at");
|
|
||||||
CREATE UNIQUE INDEX "payload_kv_key_idx" ON "payload_kv" USING btree ("key");
|
|
||||||
CREATE INDEX "payload_locked_documents_global_slug_idx" ON "payload_locked_documents" USING btree ("global_slug");
|
|
||||||
CREATE INDEX "payload_locked_documents_updated_at_idx" ON "payload_locked_documents" USING btree ("updated_at");
|
|
||||||
CREATE INDEX "payload_locked_documents_created_at_idx" ON "payload_locked_documents" USING btree ("created_at");
|
|
||||||
CREATE INDEX "payload_locked_documents_rels_order_idx" ON "payload_locked_documents_rels" USING btree ("order");
|
|
||||||
CREATE INDEX "payload_locked_documents_rels_parent_idx" ON "payload_locked_documents_rels" USING btree ("parent_id");
|
|
||||||
CREATE INDEX "payload_locked_documents_rels_path_idx" ON "payload_locked_documents_rels" USING btree ("path");
|
|
||||||
CREATE INDEX "payload_locked_documents_rels_users_id_idx" ON "payload_locked_documents_rels" USING btree ("users_id");
|
|
||||||
CREATE INDEX "payload_locked_documents_rels_media_id_idx" ON "payload_locked_documents_rels" USING btree ("media_id");
|
|
||||||
CREATE INDEX "payload_locked_documents_rels_form_submissions_id_idx" ON "payload_locked_documents_rels" USING btree ("form_submissions_id");
|
|
||||||
CREATE INDEX "payload_locked_documents_rels_pages_id_idx" ON "payload_locked_documents_rels" USING btree ("pages_id");
|
|
||||||
CREATE INDEX "payload_preferences_key_idx" ON "payload_preferences" USING btree ("key");
|
|
||||||
CREATE INDEX "payload_preferences_updated_at_idx" ON "payload_preferences" USING btree ("updated_at");
|
|
||||||
CREATE INDEX "payload_preferences_created_at_idx" ON "payload_preferences" USING btree ("created_at");
|
|
||||||
CREATE INDEX "payload_preferences_rels_order_idx" ON "payload_preferences_rels" USING btree ("order");
|
|
||||||
CREATE INDEX "payload_preferences_rels_parent_idx" ON "payload_preferences_rels" USING btree ("parent_id");
|
|
||||||
CREATE INDEX "payload_preferences_rels_path_idx" ON "payload_preferences_rels" USING btree ("path");
|
|
||||||
CREATE INDEX "payload_preferences_rels_users_id_idx" ON "payload_preferences_rels" USING btree ("users_id");
|
|
||||||
CREATE INDEX "payload_migrations_updated_at_idx" ON "payload_migrations" USING btree ("updated_at");
|
|
||||||
CREATE INDEX "payload_migrations_created_at_idx" ON "payload_migrations" USING btree ("created_at");`);
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function down({
|
|
||||||
db,
|
|
||||||
payload,
|
|
||||||
req,
|
|
||||||
}: MigrateDownArgs): Promise<void> {
|
|
||||||
await db.execute(sql`
|
|
||||||
DROP TABLE "users_sessions" CASCADE;
|
|
||||||
DROP TABLE "users" CASCADE;
|
|
||||||
DROP TABLE "media" CASCADE;
|
|
||||||
DROP TABLE "form_submissions" CASCADE;
|
|
||||||
DROP TABLE "pages" CASCADE;
|
|
||||||
DROP TABLE "payload_kv" CASCADE;
|
|
||||||
DROP TABLE "payload_locked_documents" CASCADE;
|
|
||||||
DROP TABLE "payload_locked_documents_rels" CASCADE;
|
|
||||||
DROP TABLE "payload_preferences" CASCADE;
|
|
||||||
DROP TABLE "payload_preferences_rels" CASCADE;
|
|
||||||
DROP TABLE "payload_migrations" CASCADE;`);
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import * as migration_20260227_113637_v1_initial from "./20260227_113637_v1_initial";
|
|
||||||
|
|
||||||
export const migrations = [
|
|
||||||
{
|
|
||||||
up: migration_20260227_113637_v1_initial.up,
|
|
||||||
down: migration_20260227_113637_v1_initial.down,
|
|
||||||
name: "20260227_113637_v1_initial",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
import { withPayload } from "@payloadcms/next/withPayload";
|
|
||||||
import withMintelConfig from "@mintel/next-config";
|
import withMintelConfig from "@mintel/next-config";
|
||||||
|
|
||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
@@ -34,4 +33,4 @@ const nextConfig = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default withPayload(withMintelConfig(nextConfig));
|
export default withMintelConfig(nextConfig);
|
||||||
|
|||||||
10
package.json
10
package.json
@@ -11,8 +11,6 @@
|
|||||||
"lint": "eslint app components lib scripts",
|
"lint": "eslint app components lib scripts",
|
||||||
"test": "vitest",
|
"test": "vitest",
|
||||||
"prepare": "husky",
|
"prepare": "husky",
|
||||||
"generate:types": "payload generate:types",
|
|
||||||
"generate:importmap": "payload generate:importmap",
|
|
||||||
"pagespeed:test": "mintel pagespeed test",
|
"pagespeed:test": "mintel pagespeed test",
|
||||||
"check:http": "tsx ./scripts/check-http.ts",
|
"check:http": "tsx ./scripts/check-http.ts",
|
||||||
"check:apis": "tsx ./scripts/check-apis.ts",
|
"check:apis": "tsx ./scripts/check-apis.ts",
|
||||||
@@ -31,20 +29,12 @@
|
|||||||
"@mintel/mail": "^1.8.21",
|
"@mintel/mail": "^1.8.21",
|
||||||
"@mintel/next-config": "^1.8.21",
|
"@mintel/next-config": "^1.8.21",
|
||||||
"@mintel/next-utils": "^1.8.21",
|
"@mintel/next-utils": "^1.8.21",
|
||||||
"@payloadcms/db-postgres": "^3.77.0",
|
|
||||||
"@payloadcms/email-nodemailer": "^3.77.0",
|
|
||||||
"@payloadcms/next": "^3.77.0",
|
|
||||||
"@payloadcms/richtext-lexical": "^3.77.0",
|
|
||||||
"@payloadcms/storage-s3": "^3.77.0",
|
|
||||||
"@payloadcms/ui": "^3.77.0",
|
|
||||||
"@sentry/nextjs": "^10.38.0",
|
"@sentry/nextjs": "^10.38.0",
|
||||||
"framer-motion": "^12.29.2",
|
"framer-motion": "^12.29.2",
|
||||||
"graphql": "^16.13.0",
|
|
||||||
"lucide-react": "^0.562.0",
|
"lucide-react": "^0.562.0",
|
||||||
"next": "^16.1.6",
|
"next": "^16.1.6",
|
||||||
"next-intl": "^4.8.2",
|
"next-intl": "^4.8.2",
|
||||||
"nodemailer": "^7.0.12",
|
"nodemailer": "^7.0.12",
|
||||||
"payload": "^3.77.0",
|
|
||||||
"pino": "^10.3.0",
|
"pino": "^10.3.0",
|
||||||
"react": "^19.2.4",
|
"react": "^19.2.4",
|
||||||
"react-dom": "^19.2.4",
|
"react-dom": "^19.2.4",
|
||||||
|
|||||||
3117
pnpm-lock.yaml
generated
3117
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1,4 +0,0 @@
|
|||||||
import { Block } from "payload";
|
|
||||||
|
|
||||||
// Define any custom blocks you want here. Leaving empty for now.
|
|
||||||
export const payloadBlocks: Block[] = [];
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
import type { CollectionConfig } from "payload";
|
|
||||||
|
|
||||||
export const FormSubmissions: CollectionConfig = {
|
|
||||||
slug: "form-submissions",
|
|
||||||
admin: {
|
|
||||||
useAsTitle: "name",
|
|
||||||
defaultColumns: ["name", "email", "company", "createdAt"],
|
|
||||||
description: "Captured leads from Contact Form.",
|
|
||||||
},
|
|
||||||
access: {
|
|
||||||
read: ({ req: { user } }) =>
|
|
||||||
Boolean(user) || process.env.NODE_ENV === "development",
|
|
||||||
update: ({ req: { user } }) =>
|
|
||||||
Boolean(user) || process.env.NODE_ENV === "development",
|
|
||||||
delete: ({ req: { user } }) =>
|
|
||||||
Boolean(user) || process.env.NODE_ENV === "development",
|
|
||||||
create: () => false, // Only system creates submissions
|
|
||||||
},
|
|
||||||
fields: [
|
|
||||||
{
|
|
||||||
name: "name",
|
|
||||||
type: "text",
|
|
||||||
required: true,
|
|
||||||
admin: { readOnly: true },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "email",
|
|
||||||
type: "email",
|
|
||||||
required: true,
|
|
||||||
admin: { readOnly: true },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "company",
|
|
||||||
type: "text",
|
|
||||||
admin: { readOnly: true },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "message",
|
|
||||||
type: "textarea",
|
|
||||||
required: true,
|
|
||||||
admin: { readOnly: true },
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
import type { CollectionConfig } from "payload";
|
|
||||||
import path from "path";
|
|
||||||
import { fileURLToPath } from "url";
|
|
||||||
|
|
||||||
const filename = fileURLToPath(import.meta.url);
|
|
||||||
const dirname = path.dirname(filename);
|
|
||||||
|
|
||||||
export const Media: CollectionConfig = {
|
|
||||||
slug: "media",
|
|
||||||
admin: {
|
|
||||||
useAsTitle: "filename",
|
|
||||||
defaultColumns: ["filename", "alt", "updatedAt"],
|
|
||||||
},
|
|
||||||
access: {
|
|
||||||
read: () => true, // Publicly readable
|
|
||||||
},
|
|
||||||
upload: {
|
|
||||||
staticDir: path.resolve(dirname, "../../../public/media"),
|
|
||||||
adminThumbnail: "thumbnail",
|
|
||||||
imageSizes: [
|
|
||||||
{
|
|
||||||
name: "thumbnail",
|
|
||||||
width: 400,
|
|
||||||
height: 300,
|
|
||||||
position: "centre",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "card",
|
|
||||||
width: 768,
|
|
||||||
height: undefined,
|
|
||||||
position: "centre",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
fields: [
|
|
||||||
{
|
|
||||||
name: "alt",
|
|
||||||
type: "text",
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
import { CollectionConfig } from "payload";
|
|
||||||
import { lexicalEditor, BlocksFeature } from "@payloadcms/richtext-lexical";
|
|
||||||
import { payloadBlocks } from "../blocks/allBlocks";
|
|
||||||
|
|
||||||
export const Pages: CollectionConfig = {
|
|
||||||
slug: "pages",
|
|
||||||
admin: {
|
|
||||||
useAsTitle: "title",
|
|
||||||
defaultColumns: ["title", "slug", "updatedAt"],
|
|
||||||
},
|
|
||||||
access: {
|
|
||||||
read: () => true, // Publicly readable
|
|
||||||
},
|
|
||||||
fields: [
|
|
||||||
{
|
|
||||||
name: "title",
|
|
||||||
type: "text",
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "slug",
|
|
||||||
type: "text",
|
|
||||||
required: true,
|
|
||||||
admin: {
|
|
||||||
position: "sidebar",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "content",
|
|
||||||
type: "richText",
|
|
||||||
editor: lexicalEditor({
|
|
||||||
features: ({ defaultFeatures }) => [
|
|
||||||
...defaultFeatures,
|
|
||||||
BlocksFeature({
|
|
||||||
blocks: payloadBlocks,
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
import type { CollectionConfig } from "payload";
|
|
||||||
|
|
||||||
export const Users: CollectionConfig = {
|
|
||||||
slug: "users",
|
|
||||||
admin: {
|
|
||||||
useAsTitle: "email",
|
|
||||||
},
|
|
||||||
auth: true,
|
|
||||||
fields: [
|
|
||||||
// Email added by default
|
|
||||||
],
|
|
||||||
};
|
|
||||||
@@ -1,453 +0,0 @@
|
|||||||
/* tslint:disable */
|
|
||||||
/* eslint-disable */
|
|
||||||
/**
|
|
||||||
* This file was automatically generated by Payload.
|
|
||||||
* DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config,
|
|
||||||
* and re-run `payload generate:types` to regenerate this file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Supported timezones in IANA format.
|
|
||||||
*
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "supportedTimezones".
|
|
||||||
*/
|
|
||||||
export type SupportedTimezones =
|
|
||||||
| "Pacific/Midway"
|
|
||||||
| "Pacific/Niue"
|
|
||||||
| "Pacific/Honolulu"
|
|
||||||
| "Pacific/Rarotonga"
|
|
||||||
| "America/Anchorage"
|
|
||||||
| "Pacific/Gambier"
|
|
||||||
| "America/Los_Angeles"
|
|
||||||
| "America/Tijuana"
|
|
||||||
| "America/Denver"
|
|
||||||
| "America/Phoenix"
|
|
||||||
| "America/Chicago"
|
|
||||||
| "America/Guatemala"
|
|
||||||
| "America/New_York"
|
|
||||||
| "America/Bogota"
|
|
||||||
| "America/Caracas"
|
|
||||||
| "America/Santiago"
|
|
||||||
| "America/Buenos_Aires"
|
|
||||||
| "America/Sao_Paulo"
|
|
||||||
| "Atlantic/South_Georgia"
|
|
||||||
| "Atlantic/Azores"
|
|
||||||
| "Atlantic/Cape_Verde"
|
|
||||||
| "Europe/London"
|
|
||||||
| "Europe/Berlin"
|
|
||||||
| "Africa/Lagos"
|
|
||||||
| "Europe/Athens"
|
|
||||||
| "Africa/Cairo"
|
|
||||||
| "Europe/Moscow"
|
|
||||||
| "Asia/Riyadh"
|
|
||||||
| "Asia/Dubai"
|
|
||||||
| "Asia/Baku"
|
|
||||||
| "Asia/Karachi"
|
|
||||||
| "Asia/Tashkent"
|
|
||||||
| "Asia/Calcutta"
|
|
||||||
| "Asia/Dhaka"
|
|
||||||
| "Asia/Almaty"
|
|
||||||
| "Asia/Jakarta"
|
|
||||||
| "Asia/Bangkok"
|
|
||||||
| "Asia/Shanghai"
|
|
||||||
| "Asia/Singapore"
|
|
||||||
| "Asia/Tokyo"
|
|
||||||
| "Asia/Seoul"
|
|
||||||
| "Australia/Brisbane"
|
|
||||||
| "Australia/Sydney"
|
|
||||||
| "Pacific/Guam"
|
|
||||||
| "Pacific/Noumea"
|
|
||||||
| "Pacific/Auckland"
|
|
||||||
| "Pacific/Fiji";
|
|
||||||
|
|
||||||
export interface Config {
|
|
||||||
auth: {
|
|
||||||
users: UserAuthOperations;
|
|
||||||
};
|
|
||||||
blocks: {};
|
|
||||||
collections: {
|
|
||||||
users: User;
|
|
||||||
media: Media;
|
|
||||||
"form-submissions": FormSubmission;
|
|
||||||
pages: Page;
|
|
||||||
"payload-kv": PayloadKv;
|
|
||||||
"payload-locked-documents": PayloadLockedDocument;
|
|
||||||
"payload-preferences": PayloadPreference;
|
|
||||||
"payload-migrations": PayloadMigration;
|
|
||||||
};
|
|
||||||
collectionsJoins: {};
|
|
||||||
collectionsSelect: {
|
|
||||||
users: UsersSelect<false> | UsersSelect<true>;
|
|
||||||
media: MediaSelect<false> | MediaSelect<true>;
|
|
||||||
"form-submissions":
|
|
||||||
| FormSubmissionsSelect<false>
|
|
||||||
| FormSubmissionsSelect<true>;
|
|
||||||
pages: PagesSelect<false> | PagesSelect<true>;
|
|
||||||
"payload-kv": PayloadKvSelect<false> | PayloadKvSelect<true>;
|
|
||||||
"payload-locked-documents":
|
|
||||||
| PayloadLockedDocumentsSelect<false>
|
|
||||||
| PayloadLockedDocumentsSelect<true>;
|
|
||||||
"payload-preferences":
|
|
||||||
| PayloadPreferencesSelect<false>
|
|
||||||
| PayloadPreferencesSelect<true>;
|
|
||||||
"payload-migrations":
|
|
||||||
| PayloadMigrationsSelect<false>
|
|
||||||
| PayloadMigrationsSelect<true>;
|
|
||||||
};
|
|
||||||
db: {
|
|
||||||
defaultIDType: number;
|
|
||||||
};
|
|
||||||
fallbackLocale: null;
|
|
||||||
globals: {};
|
|
||||||
globalsSelect: {};
|
|
||||||
locale: null;
|
|
||||||
user: User;
|
|
||||||
jobs: {
|
|
||||||
tasks: unknown;
|
|
||||||
workflows: unknown;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
export interface UserAuthOperations {
|
|
||||||
forgotPassword: {
|
|
||||||
email: string;
|
|
||||||
password: string;
|
|
||||||
};
|
|
||||||
login: {
|
|
||||||
email: string;
|
|
||||||
password: string;
|
|
||||||
};
|
|
||||||
registerFirstUser: {
|
|
||||||
email: string;
|
|
||||||
password: string;
|
|
||||||
};
|
|
||||||
unlock: {
|
|
||||||
email: string;
|
|
||||||
password: string;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "users".
|
|
||||||
*/
|
|
||||||
export interface User {
|
|
||||||
id: number;
|
|
||||||
updatedAt: string;
|
|
||||||
createdAt: string;
|
|
||||||
email: string;
|
|
||||||
resetPasswordToken?: string | null;
|
|
||||||
resetPasswordExpiration?: string | null;
|
|
||||||
salt?: string | null;
|
|
||||||
hash?: string | null;
|
|
||||||
loginAttempts?: number | null;
|
|
||||||
lockUntil?: string | null;
|
|
||||||
sessions?:
|
|
||||||
| {
|
|
||||||
id: string;
|
|
||||||
createdAt?: string | null;
|
|
||||||
expiresAt: string;
|
|
||||||
}[]
|
|
||||||
| null;
|
|
||||||
password?: string | null;
|
|
||||||
collection: "users";
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "media".
|
|
||||||
*/
|
|
||||||
export interface Media {
|
|
||||||
id: number;
|
|
||||||
alt: string;
|
|
||||||
prefix?: string | null;
|
|
||||||
updatedAt: string;
|
|
||||||
createdAt: string;
|
|
||||||
url?: string | null;
|
|
||||||
thumbnailURL?: string | null;
|
|
||||||
filename?: string | null;
|
|
||||||
mimeType?: string | null;
|
|
||||||
filesize?: number | null;
|
|
||||||
width?: number | null;
|
|
||||||
height?: number | null;
|
|
||||||
focalX?: number | null;
|
|
||||||
focalY?: number | null;
|
|
||||||
sizes?: {
|
|
||||||
thumbnail?: {
|
|
||||||
url?: string | null;
|
|
||||||
width?: number | null;
|
|
||||||
height?: number | null;
|
|
||||||
mimeType?: string | null;
|
|
||||||
filesize?: number | null;
|
|
||||||
filename?: string | null;
|
|
||||||
};
|
|
||||||
card?: {
|
|
||||||
url?: string | null;
|
|
||||||
width?: number | null;
|
|
||||||
height?: number | null;
|
|
||||||
mimeType?: string | null;
|
|
||||||
filesize?: number | null;
|
|
||||||
filename?: string | null;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Captured leads from Contact Form.
|
|
||||||
*
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "form-submissions".
|
|
||||||
*/
|
|
||||||
export interface FormSubmission {
|
|
||||||
id: number;
|
|
||||||
name: string;
|
|
||||||
email: string;
|
|
||||||
company?: string | null;
|
|
||||||
message: string;
|
|
||||||
updatedAt: string;
|
|
||||||
createdAt: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "pages".
|
|
||||||
*/
|
|
||||||
export interface Page {
|
|
||||||
id: number;
|
|
||||||
title: string;
|
|
||||||
slug: string;
|
|
||||||
content: {
|
|
||||||
root: {
|
|
||||||
type: string;
|
|
||||||
children: {
|
|
||||||
type: any;
|
|
||||||
version: number;
|
|
||||||
[k: string]: unknown;
|
|
||||||
}[];
|
|
||||||
direction: ("ltr" | "rtl") | null;
|
|
||||||
format: "left" | "start" | "center" | "right" | "end" | "justify" | "";
|
|
||||||
indent: number;
|
|
||||||
version: number;
|
|
||||||
};
|
|
||||||
[k: string]: unknown;
|
|
||||||
};
|
|
||||||
updatedAt: string;
|
|
||||||
createdAt: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "payload-kv".
|
|
||||||
*/
|
|
||||||
export interface PayloadKv {
|
|
||||||
id: number;
|
|
||||||
key: string;
|
|
||||||
data:
|
|
||||||
| {
|
|
||||||
[k: string]: unknown;
|
|
||||||
}
|
|
||||||
| unknown[]
|
|
||||||
| string
|
|
||||||
| number
|
|
||||||
| boolean
|
|
||||||
| null;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "payload-locked-documents".
|
|
||||||
*/
|
|
||||||
export interface PayloadLockedDocument {
|
|
||||||
id: number;
|
|
||||||
document?:
|
|
||||||
| ({
|
|
||||||
relationTo: "users";
|
|
||||||
value: number | User;
|
|
||||||
} | null)
|
|
||||||
| ({
|
|
||||||
relationTo: "media";
|
|
||||||
value: number | Media;
|
|
||||||
} | null)
|
|
||||||
| ({
|
|
||||||
relationTo: "form-submissions";
|
|
||||||
value: number | FormSubmission;
|
|
||||||
} | null)
|
|
||||||
| ({
|
|
||||||
relationTo: "pages";
|
|
||||||
value: number | Page;
|
|
||||||
} | null);
|
|
||||||
globalSlug?: string | null;
|
|
||||||
user: {
|
|
||||||
relationTo: "users";
|
|
||||||
value: number | User;
|
|
||||||
};
|
|
||||||
updatedAt: string;
|
|
||||||
createdAt: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "payload-preferences".
|
|
||||||
*/
|
|
||||||
export interface PayloadPreference {
|
|
||||||
id: number;
|
|
||||||
user: {
|
|
||||||
relationTo: "users";
|
|
||||||
value: number | User;
|
|
||||||
};
|
|
||||||
key?: string | null;
|
|
||||||
value?:
|
|
||||||
| {
|
|
||||||
[k: string]: unknown;
|
|
||||||
}
|
|
||||||
| unknown[]
|
|
||||||
| string
|
|
||||||
| number
|
|
||||||
| boolean
|
|
||||||
| null;
|
|
||||||
updatedAt: string;
|
|
||||||
createdAt: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "payload-migrations".
|
|
||||||
*/
|
|
||||||
export interface PayloadMigration {
|
|
||||||
id: number;
|
|
||||||
name?: string | null;
|
|
||||||
batch?: number | null;
|
|
||||||
updatedAt: string;
|
|
||||||
createdAt: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "users_select".
|
|
||||||
*/
|
|
||||||
export interface UsersSelect<T extends boolean = true> {
|
|
||||||
updatedAt?: T;
|
|
||||||
createdAt?: T;
|
|
||||||
email?: T;
|
|
||||||
resetPasswordToken?: T;
|
|
||||||
resetPasswordExpiration?: T;
|
|
||||||
salt?: T;
|
|
||||||
hash?: T;
|
|
||||||
loginAttempts?: T;
|
|
||||||
lockUntil?: T;
|
|
||||||
sessions?:
|
|
||||||
| T
|
|
||||||
| {
|
|
||||||
id?: T;
|
|
||||||
createdAt?: T;
|
|
||||||
expiresAt?: T;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "media_select".
|
|
||||||
*/
|
|
||||||
export interface MediaSelect<T extends boolean = true> {
|
|
||||||
alt?: T;
|
|
||||||
prefix?: T;
|
|
||||||
updatedAt?: T;
|
|
||||||
createdAt?: T;
|
|
||||||
url?: T;
|
|
||||||
thumbnailURL?: T;
|
|
||||||
filename?: T;
|
|
||||||
mimeType?: T;
|
|
||||||
filesize?: T;
|
|
||||||
width?: T;
|
|
||||||
height?: T;
|
|
||||||
focalX?: T;
|
|
||||||
focalY?: T;
|
|
||||||
sizes?:
|
|
||||||
| T
|
|
||||||
| {
|
|
||||||
thumbnail?:
|
|
||||||
| T
|
|
||||||
| {
|
|
||||||
url?: T;
|
|
||||||
width?: T;
|
|
||||||
height?: T;
|
|
||||||
mimeType?: T;
|
|
||||||
filesize?: T;
|
|
||||||
filename?: T;
|
|
||||||
};
|
|
||||||
card?:
|
|
||||||
| T
|
|
||||||
| {
|
|
||||||
url?: T;
|
|
||||||
width?: T;
|
|
||||||
height?: T;
|
|
||||||
mimeType?: T;
|
|
||||||
filesize?: T;
|
|
||||||
filename?: T;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "form-submissions_select".
|
|
||||||
*/
|
|
||||||
export interface FormSubmissionsSelect<T extends boolean = true> {
|
|
||||||
name?: T;
|
|
||||||
email?: T;
|
|
||||||
company?: T;
|
|
||||||
message?: T;
|
|
||||||
updatedAt?: T;
|
|
||||||
createdAt?: T;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "pages_select".
|
|
||||||
*/
|
|
||||||
export interface PagesSelect<T extends boolean = true> {
|
|
||||||
title?: T;
|
|
||||||
slug?: T;
|
|
||||||
content?: T;
|
|
||||||
updatedAt?: T;
|
|
||||||
createdAt?: T;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "payload-kv_select".
|
|
||||||
*/
|
|
||||||
export interface PayloadKvSelect<T extends boolean = true> {
|
|
||||||
key?: T;
|
|
||||||
data?: T;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "payload-locked-documents_select".
|
|
||||||
*/
|
|
||||||
export interface PayloadLockedDocumentsSelect<T extends boolean = true> {
|
|
||||||
document?: T;
|
|
||||||
globalSlug?: T;
|
|
||||||
user?: T;
|
|
||||||
updatedAt?: T;
|
|
||||||
createdAt?: T;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "payload-preferences_select".
|
|
||||||
*/
|
|
||||||
export interface PayloadPreferencesSelect<T extends boolean = true> {
|
|
||||||
user?: T;
|
|
||||||
key?: T;
|
|
||||||
value?: T;
|
|
||||||
updatedAt?: T;
|
|
||||||
createdAt?: T;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "payload-migrations_select".
|
|
||||||
*/
|
|
||||||
export interface PayloadMigrationsSelect<T extends boolean = true> {
|
|
||||||
name?: T;
|
|
||||||
batch?: T;
|
|
||||||
updatedAt?: T;
|
|
||||||
createdAt?: T;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
|
||||||
* via the `definition` "auth".
|
|
||||||
*/
|
|
||||||
export interface Auth {
|
|
||||||
[k: string]: unknown;
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module "payload" {
|
|
||||||
export interface GeneratedTypes extends Config {}
|
|
||||||
}
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
import { buildConfig } from "payload";
|
|
||||||
import { postgresAdapter } from "@payloadcms/db-postgres";
|
|
||||||
import { lexicalEditor, BlocksFeature } from "@payloadcms/richtext-lexical";
|
|
||||||
import { nodemailerAdapter } from "@payloadcms/email-nodemailer";
|
|
||||||
import { s3Storage } from "@payloadcms/storage-s3";
|
|
||||||
import sharp from "sharp";
|
|
||||||
import path from "path";
|
|
||||||
import { fileURLToPath } from "url";
|
|
||||||
import { payloadBlocks } from "./blocks/allBlocks";
|
|
||||||
|
|
||||||
import { Users } from "./collections/Users";
|
|
||||||
import { Media } from "./collections/Media";
|
|
||||||
import { FormSubmissions } from "./collections/FormSubmissions";
|
|
||||||
import { Pages } from "./collections/Pages";
|
|
||||||
|
|
||||||
import { migrations } from "../../migrations/index";
|
|
||||||
|
|
||||||
const filename = fileURLToPath(import.meta.url);
|
|
||||||
const dirname = path.dirname(filename);
|
|
||||||
|
|
||||||
export default buildConfig({
|
|
||||||
admin: {
|
|
||||||
user: Users.slug,
|
|
||||||
importMap: {
|
|
||||||
baseDir: path.resolve(dirname),
|
|
||||||
},
|
|
||||||
meta: {
|
|
||||||
titleSuffix: " – MB Grid Solutions",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
collections: [Users, Media, FormSubmissions, Pages],
|
|
||||||
editor: lexicalEditor({
|
|
||||||
features: ({ defaultFeatures }) => [
|
|
||||||
...defaultFeatures,
|
|
||||||
BlocksFeature({
|
|
||||||
blocks: payloadBlocks,
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
secret: process.env.PAYLOAD_SECRET || "fallback-secret-for-dev",
|
|
||||||
typescript: {
|
|
||||||
outputFile: path.resolve(dirname, "payload-types.ts"),
|
|
||||||
},
|
|
||||||
db: postgresAdapter({
|
|
||||||
pool: {
|
|
||||||
connectionString:
|
|
||||||
process.env.DATABASE_URI ||
|
|
||||||
process.env.POSTGRES_URI ||
|
|
||||||
`postgresql://${process.env.POSTGRES_USER || "postgres"}:${process.env.POSTGRES_PASSWORD || "postgres"}@127.0.0.1:5432/${process.env.POSTGRES_DB || "payload"}`,
|
|
||||||
},
|
|
||||||
prodMigrations: migrations,
|
|
||||||
}),
|
|
||||||
email: nodemailerAdapter({
|
|
||||||
defaultFromAddress:
|
|
||||||
process.env.MAIL_FROM ||
|
|
||||||
process.env.SMTP_FROM ||
|
|
||||||
"info@mb-grid-solutions.com",
|
|
||||||
defaultFromName: "MB Grid Solutions CMS",
|
|
||||||
transportOptions: {
|
|
||||||
host: process.env.MAIL_HOST || process.env.SMTP_HOST || "localhost",
|
|
||||||
port: parseInt(
|
|
||||||
process.env.MAIL_PORT || process.env.SMTP_PORT || "587",
|
|
||||||
),
|
|
||||||
auth: {
|
|
||||||
user:
|
|
||||||
process.env.MAIL_USERNAME ||
|
|
||||||
process.env.MAIL_USER ||
|
|
||||||
process.env.SMTP_USER,
|
|
||||||
pass: process.env.MAIL_PASSWORD || process.env.SMTP_PASS,
|
|
||||||
},
|
|
||||||
secure:
|
|
||||||
process.env.MAIL_SECURE === "true" ||
|
|
||||||
process.env.SMTP_SECURE === "true",
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
sharp,
|
|
||||||
plugins: [
|
|
||||||
...(process.env.S3_ENDPOINT
|
|
||||||
? [
|
|
||||||
s3Storage({
|
|
||||||
collections: {
|
|
||||||
media: {
|
|
||||||
prefix: `${process.env.S3_PREFIX || "mb-grid-solutions"}/media`,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
bucket: process.env.S3_BUCKET || "",
|
|
||||||
config: {
|
|
||||||
credentials: {
|
|
||||||
accessKeyId: process.env.S3_ACCESS_KEY || "",
|
|
||||||
secretAccessKey: process.env.S3_SECRET_KEY || "",
|
|
||||||
},
|
|
||||||
region: process.env.S3_REGION || "fsn1",
|
|
||||||
endpoint: process.env.S3_ENDPOINT,
|
|
||||||
forcePathStyle: true,
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
]
|
|
||||||
: []),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user