summaryrefslogtreecommitdiff
path: root/src/collections
diff options
context:
space:
mode:
authorertopogo <erwin.t.pombett@gmail.com>2026-02-19 11:34:16 +0100
committerertopogo <erwin.t.pombett@gmail.com>2026-02-19 11:34:16 +0100
commita21bd6a6710d123ef3bfc3c9aab37fc0c276f9c5 (patch)
treee2cc828607ea91e5c90ae0ea98c6b7d11324eaf1 /src/collections
feat: initial project setup - Next.js 16, Payload CMS v3, palette Mapuche
Next.js 16 App Router + TypeScript + Tailwind CSS v4. Payload CMS v3 with PostgreSQL adapter. Mapuche Corporate palette. Public pages, Docker Compose + Caddy, security middleware. Co-authored-by: Cursor <cursoragent@cursor.com>
Diffstat (limited to 'src/collections')
-rw-r--r--src/collections/Articles.ts99
-rw-r--r--src/collections/Media.ts34
-rw-r--r--src/collections/Services.ts51
-rw-r--r--src/collections/Testimonials.ts42
-rw-r--r--src/collections/Users.ts40
5 files changed, 266 insertions, 0 deletions
diff --git a/src/collections/Articles.ts b/src/collections/Articles.ts
new file mode 100644
index 0000000..abe03ee
--- /dev/null
+++ b/src/collections/Articles.ts
@@ -0,0 +1,99 @@
+import type { CollectionConfig } from "payload";
+
+export const Articles: CollectionConfig = {
+ slug: "articles",
+ admin: {
+ useAsTitle: "title",
+ defaultColumns: ["title", "category", "status", "publishedAt"],
+ },
+ access: {
+ read: ({ req: { user } }) => {
+ if (user) return true;
+ return { status: { equals: "published" } };
+ },
+ create: ({ req: { user } }) =>
+ user?.role === "admin" || user?.role === "editor",
+ update: ({ req: { user } }) =>
+ user?.role === "admin" || user?.role === "editor",
+ delete: ({ req: { user } }) => user?.role === "admin",
+ },
+ fields: [
+ {
+ name: "title",
+ type: "text",
+ required: true,
+ },
+ {
+ name: "slug",
+ type: "text",
+ required: true,
+ unique: true,
+ admin: {
+ position: "sidebar",
+ },
+ },
+ {
+ name: "excerpt",
+ type: "textarea",
+ required: true,
+ maxLength: 300,
+ },
+ {
+ name: "category",
+ type: "select",
+ required: true,
+ options: [
+ { label: "OIDC / OAuth", value: "oidc-oauth" },
+ { label: "Zero Trust", value: "zero-trust" },
+ { label: "Active Directory", value: "active-directory" },
+ { label: "Entra ID", value: "entra-id" },
+ { label: "Keycloak", value: "keycloak" },
+ { label: "Sécurité Générale", value: "security-general" },
+ { label: "DevSecOps", value: "devsecops" },
+ ],
+ },
+ {
+ name: "content",
+ type: "richText",
+ required: true,
+ },
+ {
+ name: "coverImage",
+ type: "upload",
+ relationTo: "media",
+ },
+ {
+ name: "status",
+ type: "select",
+ required: true,
+ defaultValue: "draft",
+ options: [
+ { label: "Brouillon", value: "draft" },
+ { label: "Publié", value: "published" },
+ ],
+ admin: {
+ position: "sidebar",
+ },
+ },
+ {
+ name: "publishedAt",
+ type: "date",
+ admin: {
+ position: "sidebar",
+ date: {
+ pickerAppearance: "dayAndTime",
+ },
+ },
+ },
+ {
+ name: "tags",
+ type: "array",
+ fields: [
+ {
+ name: "tag",
+ type: "text",
+ },
+ ],
+ },
+ ],
+};
diff --git a/src/collections/Media.ts b/src/collections/Media.ts
new file mode 100644
index 0000000..19cba0c
--- /dev/null
+++ b/src/collections/Media.ts
@@ -0,0 +1,34 @@
+import type { CollectionConfig } from "payload";
+
+export const Media: CollectionConfig = {
+ slug: "media",
+ admin: {
+ useAsTitle: "alt",
+ },
+ access: {
+ read: () => true,
+ create: ({ req: { user } }) => !!user,
+ update: ({ req: { user } }) => !!user,
+ delete: ({ req: { user } }) => user?.role === "admin",
+ },
+ upload: {
+ mimeTypes: ["image/*", "application/pdf"],
+ staticDir: "media",
+ imageSizes: [
+ { name: "thumbnail", width: 300, height: 300, position: "centre" },
+ { name: "card", width: 768, height: 432, position: "centre" },
+ { name: "hero", width: 1920, height: 1080, position: "centre" },
+ ],
+ },
+ fields: [
+ {
+ name: "alt",
+ type: "text",
+ required: true,
+ },
+ {
+ name: "caption",
+ type: "text",
+ },
+ ],
+};
diff --git a/src/collections/Services.ts b/src/collections/Services.ts
new file mode 100644
index 0000000..923e650
--- /dev/null
+++ b/src/collections/Services.ts
@@ -0,0 +1,51 @@
+import type { CollectionConfig } from "payload";
+
+export const Services: CollectionConfig = {
+ slug: "services",
+ admin: {
+ useAsTitle: "title",
+ },
+ access: {
+ read: () => true,
+ create: ({ req: { user } }) => user?.role === "admin",
+ update: ({ req: { user } }) => user?.role === "admin",
+ delete: ({ req: { user } }) => user?.role === "admin",
+ },
+ fields: [
+ {
+ name: "title",
+ type: "text",
+ required: true,
+ },
+ {
+ name: "slug",
+ type: "text",
+ required: true,
+ unique: true,
+ },
+ {
+ name: "description",
+ type: "textarea",
+ required: true,
+ },
+ {
+ name: "icon",
+ type: "text",
+ admin: {
+ description: "Nom de l'icône Lucide (ex: shield, key, lock)",
+ },
+ },
+ {
+ name: "details",
+ type: "richText",
+ },
+ {
+ name: "order",
+ type: "number",
+ defaultValue: 0,
+ admin: {
+ position: "sidebar",
+ },
+ },
+ ],
+};
diff --git a/src/collections/Testimonials.ts b/src/collections/Testimonials.ts
new file mode 100644
index 0000000..3c5d532
--- /dev/null
+++ b/src/collections/Testimonials.ts
@@ -0,0 +1,42 @@
+import type { CollectionConfig } from "payload";
+
+export const Testimonials: CollectionConfig = {
+ slug: "testimonials",
+ admin: {
+ useAsTitle: "clientName",
+ },
+ access: {
+ read: () => true,
+ create: ({ req: { user } }) => user?.role === "admin",
+ update: ({ req: { user } }) => user?.role === "admin",
+ delete: ({ req: { user } }) => user?.role === "admin",
+ },
+ fields: [
+ {
+ name: "clientName",
+ type: "text",
+ required: true,
+ },
+ {
+ name: "company",
+ type: "text",
+ },
+ {
+ name: "role",
+ type: "text",
+ },
+ {
+ name: "quote",
+ type: "textarea",
+ required: true,
+ },
+ {
+ name: "featured",
+ type: "checkbox",
+ defaultValue: false,
+ admin: {
+ position: "sidebar",
+ },
+ },
+ ],
+};
diff --git a/src/collections/Users.ts b/src/collections/Users.ts
new file mode 100644
index 0000000..e7489ac
--- /dev/null
+++ b/src/collections/Users.ts
@@ -0,0 +1,40 @@
+import type { CollectionConfig } from "payload";
+
+export const Users: CollectionConfig = {
+ slug: "users",
+ admin: {
+ useAsTitle: "email",
+ },
+ auth: true,
+ access: {
+ read: ({ req: { user } }) => !!user,
+ create: ({ req: { user } }) => user?.role === "admin",
+ update: ({ req: { user }, id }) =>
+ user?.role === "admin" || user?.id === id,
+ delete: ({ req: { user } }) => user?.role === "admin",
+ },
+ fields: [
+ {
+ name: "role",
+ type: "select",
+ required: true,
+ defaultValue: "viewer",
+ options: [
+ { label: "Admin", value: "admin" },
+ { label: "Editor", value: "editor" },
+ { label: "Viewer", value: "viewer" },
+ ],
+ access: {
+ update: ({ req: { user } }) => user?.role === "admin",
+ },
+ },
+ {
+ name: "firstName",
+ type: "text",
+ },
+ {
+ name: "lastName",
+ type: "text",
+ },
+ ],
+};