Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e7cf7f8946 | |||
| 1a1196b740 | |||
| 7915afea2c | |||
| 16916654c0 | |||
| 6daf5c66a8 | |||
| 95b594d8cd | |||
| cd6651cc43 | |||
| 855390a27b | |||
| ea8bd46973 | |||
| ff269b1f84 |
@@ -225,9 +225,9 @@ jobs:
|
|||||||
# Secrets mapping (Database & CMS)
|
# Secrets mapping (Database & CMS)
|
||||||
PAYLOAD_SECRET: ${{ (needs.prepare.outputs.target == 'testing' && secrets.TESTING_PAYLOAD_SECRET) || (needs.prepare.outputs.target == 'staging' && secrets.STAGING_PAYLOAD_SECRET) || secrets.PAYLOAD_SECRET || secrets.DIRECTUS_SECRET || vars.PAYLOAD_SECRET || 'you-need-to-set-a-payload-secret' }}
|
PAYLOAD_SECRET: ${{ (needs.prepare.outputs.target == 'testing' && secrets.TESTING_PAYLOAD_SECRET) || (needs.prepare.outputs.target == 'staging' && secrets.STAGING_PAYLOAD_SECRET) || secrets.PAYLOAD_SECRET || secrets.DIRECTUS_SECRET || vars.PAYLOAD_SECRET || 'you-need-to-set-a-payload-secret' }}
|
||||||
DATABASE_URI: ${{ (needs.prepare.outputs.target == 'testing' && secrets.TESTING_DATABASE_URI) || (needs.prepare.outputs.target == 'staging' && secrets.STAGING_DATABASE_URI) || secrets.DATABASE_URI || vars.DATABASE_URI }}
|
DATABASE_URI: ${{ (needs.prepare.outputs.target == 'testing' && secrets.TESTING_DATABASE_URI) || (needs.prepare.outputs.target == 'staging' && secrets.STAGING_DATABASE_URI) || secrets.DATABASE_URI || vars.DATABASE_URI }}
|
||||||
DIRECTUS_DB_NAME: ${{ secrets.DIRECTUS_DB_NAME || vars.DIRECTUS_DB_NAME || 'directus' }}
|
POSTGRES_DB: ${{ secrets.POSTGRES_DB || vars.POSTGRES_DB || 'payload' }}
|
||||||
DIRECTUS_DB_USER: ${{ secrets.DIRECTUS_DB_USER || vars.DIRECTUS_DB_USER || 'directus' }}
|
POSTGRES_USER: ${{ secrets.POSTGRES_USER || vars.POSTGRES_USER || 'directus' }}
|
||||||
DIRECTUS_DB_PASSWORD: ${{ (needs.prepare.outputs.target == 'testing' && secrets.TESTING_DIRECTUS_DB_PASSWORD) || (needs.prepare.outputs.target == 'staging' && secrets.STAGING_DIRECTUS_DB_PASSWORD) || secrets.DIRECTUS_DB_PASSWORD || vars.DIRECTUS_DB_PASSWORD || 'directus' }}
|
POSTGRES_PASSWORD: ${{ (needs.prepare.outputs.target == 'testing' && secrets.TESTING_POSTGRES_PASSWORD) || (needs.prepare.outputs.target == 'staging' && secrets.STAGING_POSTGRES_PASSWORD) || secrets.POSTGRES_PASSWORD || vars.POSTGRES_PASSWORD || 'directus' }}
|
||||||
|
|
||||||
|
|
||||||
# Secrets mapping (Mail)
|
# Secrets mapping (Mail)
|
||||||
@@ -285,11 +285,11 @@ jobs:
|
|||||||
LOG_LEVEL=$LOG_LEVEL
|
LOG_LEVEL=$LOG_LEVEL
|
||||||
|
|
||||||
# Database & Payload
|
# Database & Payload
|
||||||
DATABASE_URI=\${DATABASE_URI:-postgresql://$DIRECTUS_DB_USER:$DIRECTUS_DB_PASSWORD@mb-grid-db:5432/$DIRECTUS_DB_NAME}
|
DATABASE_URI=\${DATABASE_URI:-postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@mb-grid-db:5432/$POSTGRES_DB}
|
||||||
PAYLOAD_SECRET=${PAYLOAD_SECRET:-you-need-to-set-a-payload-secret}
|
PAYLOAD_SECRET=${PAYLOAD_SECRET:-you-need-to-set-a-payload-secret}
|
||||||
DIRECTUS_DB_NAME=$DIRECTUS_DB_NAME
|
POSTGRES_DB=$POSTGRES_DB
|
||||||
DIRECTUS_DB_USER=$DIRECTUS_DB_USER
|
POSTGRES_USER=$POSTGRES_USER
|
||||||
DIRECTUS_DB_PASSWORD=$DIRECTUS_DB_PASSWORD
|
POSTGRES_PASSWORD=$POSTGRES_PASSWORD
|
||||||
|
|
||||||
# Mail
|
# Mail
|
||||||
MAIL_HOST=$MAIL_HOST
|
MAIL_HOST=$MAIL_HOST
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ services:
|
|||||||
- .:/app
|
- .:/app
|
||||||
environment:
|
environment:
|
||||||
NODE_ENV: development
|
NODE_ENV: development
|
||||||
DATABASE_URI: postgresql://directus:directus@mb-grid-db:5432/directus
|
DATABASE_URI: postgresql://postgres:postgres@mb-grid-db:5432/payload
|
||||||
# Build / dependency installation
|
# Build / dependency installation
|
||||||
NPM_TOKEN: ${NPM_TOKEN}
|
NPM_TOKEN: ${NPM_TOKEN}
|
||||||
CI: 'true'
|
CI: 'true'
|
||||||
|
|||||||
@@ -89,15 +89,15 @@ services:
|
|||||||
env_file:
|
env_file:
|
||||||
- ${ENV_FILE:-.env}
|
- ${ENV_FILE:-.env}
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: ${DIRECTUS_DB_NAME:-directus}
|
POSTGRES_DB: ${POSTGRES_DB:-payload}
|
||||||
POSTGRES_USER: ${DIRECTUS_DB_USER:-directus}
|
POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
||||||
POSTGRES_PASSWORD: ${DIRECTUS_DB_PASSWORD:-directus}
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
|
||||||
volumes:
|
volumes:
|
||||||
- mb-grid-db-data:/var/lib/postgresql/data
|
- mb-grid-db-data:/var/lib/postgresql/data
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
default:
|
default:
|
||||||
name: mb-grid-solutions-internal
|
name: ${PROJECT_NAME:-mb-grid-solutions}-internal
|
||||||
infra:
|
infra:
|
||||||
external: true
|
external: true
|
||||||
|
|
||||||
|
|||||||
@@ -17,9 +17,6 @@ import {
|
|||||||
const envExtension = {
|
const envExtension = {
|
||||||
// Project specific overrides or additions
|
// Project specific overrides or additions
|
||||||
AUTH_COOKIE_NAME: z.string().default("mb_gatekeeper_session"),
|
AUTH_COOKIE_NAME: z.string().default("mb_gatekeeper_session"),
|
||||||
|
|
||||||
INFRA_DIRECTUS_URL: z.string().url().optional(),
|
|
||||||
INFRA_DIRECTUS_TOKEN: z.string().optional(),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -16,7 +16,8 @@
|
|||||||
"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",
|
||||||
"check:locale": "tsx ./scripts/check-locale.ts"
|
"check:locale": "tsx ./scripts/check-locale.ts",
|
||||||
|
"backup:db": "bash ./scripts/backup-db.sh"
|
||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
@@ -35,6 +36,8 @@
|
|||||||
"@payloadcms/ui": "^3.77.0",
|
"@payloadcms/ui": "^3.77.0",
|
||||||
"@react-email/components": "^1.0.8",
|
"@react-email/components": "^1.0.8",
|
||||||
"@sentry/nextjs": "^10.38.0",
|
"@sentry/nextjs": "^10.38.0",
|
||||||
|
"bcrypt": "^6.0.0",
|
||||||
|
"bcryptjs": "^3.0.3",
|
||||||
"framer-motion": "^12.29.2",
|
"framer-motion": "^12.29.2",
|
||||||
"graphql": "^16.13.0",
|
"graphql": "^16.13.0",
|
||||||
"lucide-react": "^0.562.0",
|
"lucide-react": "^0.562.0",
|
||||||
|
|||||||
33
pnpm-lock.yaml
generated
33
pnpm-lock.yaml
generated
@@ -44,6 +44,12 @@ importers:
|
|||||||
'@sentry/nextjs':
|
'@sentry/nextjs':
|
||||||
specifier: ^10.38.0
|
specifier: ^10.38.0
|
||||||
version: 10.38.0(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.77.4))(react@19.2.4)(webpack@5.104.1(esbuild@0.25.12))
|
version: 10.38.0(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.77.4))(react@19.2.4)(webpack@5.104.1(esbuild@0.25.12))
|
||||||
|
bcrypt:
|
||||||
|
specifier: ^6.0.0
|
||||||
|
version: 6.0.0
|
||||||
|
bcryptjs:
|
||||||
|
specifier: ^3.0.3
|
||||||
|
version: 3.0.3
|
||||||
framer-motion:
|
framer-motion:
|
||||||
specifier: ^12.29.2
|
specifier: ^12.29.2
|
||||||
version: 12.30.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
version: 12.30.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||||
@@ -3482,6 +3488,14 @@ packages:
|
|||||||
resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==}
|
resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
bcrypt@6.0.0:
|
||||||
|
resolution: {integrity: sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==}
|
||||||
|
engines: {node: '>= 18'}
|
||||||
|
|
||||||
|
bcryptjs@3.0.3:
|
||||||
|
resolution: {integrity: sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
bidi-js@1.0.3:
|
bidi-js@1.0.3:
|
||||||
resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
|
resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
|
||||||
|
|
||||||
@@ -5453,6 +5467,10 @@ packages:
|
|||||||
node-addon-api@7.1.1:
|
node-addon-api@7.1.1:
|
||||||
resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
|
resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
|
||||||
|
|
||||||
|
node-addon-api@8.6.0:
|
||||||
|
resolution: {integrity: sha512-gBVjCaqDlRUk0EwoPNKzIr9KkS9041G/q31IBShPs1Xz6UTA+EXdZADbzqAJQrpDRq71CIMnOP5VMut3SL0z5Q==}
|
||||||
|
engines: {node: ^18 || ^20 || >= 21}
|
||||||
|
|
||||||
node-fetch@2.7.0:
|
node-fetch@2.7.0:
|
||||||
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
|
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
|
||||||
engines: {node: 4.x || >=6.0.0}
|
engines: {node: 4.x || >=6.0.0}
|
||||||
@@ -5462,6 +5480,10 @@ packages:
|
|||||||
encoding:
|
encoding:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
node-gyp-build@4.8.4:
|
||||||
|
resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
node-releases@2.0.27:
|
node-releases@2.0.27:
|
||||||
resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
|
resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
|
||||||
|
|
||||||
@@ -10757,6 +10779,13 @@ snapshots:
|
|||||||
|
|
||||||
baseline-browser-mapping@2.9.19: {}
|
baseline-browser-mapping@2.9.19: {}
|
||||||
|
|
||||||
|
bcrypt@6.0.0:
|
||||||
|
dependencies:
|
||||||
|
node-addon-api: 8.6.0
|
||||||
|
node-gyp-build: 4.8.4
|
||||||
|
|
||||||
|
bcryptjs@3.0.3: {}
|
||||||
|
|
||||||
bidi-js@1.0.3:
|
bidi-js@1.0.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
require-from-string: 2.0.2
|
require-from-string: 2.0.2
|
||||||
@@ -12986,10 +13015,14 @@ snapshots:
|
|||||||
|
|
||||||
node-addon-api@7.1.1: {}
|
node-addon-api@7.1.1: {}
|
||||||
|
|
||||||
|
node-addon-api@8.6.0: {}
|
||||||
|
|
||||||
node-fetch@2.7.0:
|
node-fetch@2.7.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
whatwg-url: 5.0.0
|
whatwg-url: 5.0.0
|
||||||
|
|
||||||
|
node-gyp-build@4.8.4: {}
|
||||||
|
|
||||||
node-releases@2.0.27: {}
|
node-releases@2.0.27: {}
|
||||||
|
|
||||||
nodemailer@7.0.12: {}
|
nodemailer@7.0.12: {}
|
||||||
|
|||||||
BIN
public/assets/AGB MB Grid 3-2026.pdf
Normal file
BIN
public/assets/AGB MB Grid 3-2026.pdf
Normal file
Binary file not shown.
53
scripts/backup-db.sh
Normal file
53
scripts/backup-db.sh
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# ────────────────────────────────────────────────────────────────────────────
|
||||||
|
# Payload CMS Database Backup
|
||||||
|
# Creates a timestamped pg_dump of the Payload Postgres database.
|
||||||
|
# Usage: npm run backup:db
|
||||||
|
# ────────────────────────────────────────────────────────────────────────────
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Load environment variables
|
||||||
|
if [ -f .env ]; then
|
||||||
|
set -a; source .env; set +a
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fallback for local development if not in .env
|
||||||
|
DB_NAME="${POSTGRES_DB:-payload}"
|
||||||
|
DB_USER="${POSTGRES_USER:-postgres}"
|
||||||
|
# For production, we need the container name.
|
||||||
|
# We'll use the PROJECT_NAME to find it if possible, otherwise use a default.
|
||||||
|
PROJECT_NAME="${PROJECT_NAME:-mb-grid-solutions-production}"
|
||||||
|
DB_CONTAINER="${DB_CONTAINER:-${PROJECT_NAME}-mb-grid-db-1}"
|
||||||
|
BACKUP_DIR="./backups"
|
||||||
|
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
||||||
|
BACKUP_FILE="${BACKUP_DIR}/payload_${TIMESTAMP}.sql.gz"
|
||||||
|
|
||||||
|
# Ensure backup directory exists
|
||||||
|
mkdir -p "$BACKUP_DIR"
|
||||||
|
|
||||||
|
# Check if container is running
|
||||||
|
if ! docker ps --format '{{.Names}}' | grep -q "$DB_CONTAINER"; then
|
||||||
|
echo "❌ Database container '$DB_CONTAINER' is not running."
|
||||||
|
echo " Check your docker-compose status."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "📦 Backing up Payload database..."
|
||||||
|
echo " Container: $DB_CONTAINER"
|
||||||
|
echo " Database: $DB_NAME"
|
||||||
|
echo " Output: $BACKUP_FILE"
|
||||||
|
|
||||||
|
# Run pg_dump inside the container and compress
|
||||||
|
# We use directus as user for now if we haven't fully switched to postgres user in all environments
|
||||||
|
# But the script should be consistent with the environment.
|
||||||
|
docker exec "$DB_CONTAINER" pg_dump -U "$DB_USER" -d "$DB_NAME" --clean --if-exists | gzip > "$BACKUP_FILE"
|
||||||
|
|
||||||
|
# Show result
|
||||||
|
SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
|
||||||
|
echo ""
|
||||||
|
echo "✅ Backup complete: $BACKUP_FILE ($SIZE)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Show existing backups
|
||||||
|
echo "📋 Available backups:"
|
||||||
|
ls -lh "$BACKUP_DIR"/*.sql.gz 2>/dev/null | awk '{print " " $NF " (" $5 ")"}'
|
||||||
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",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
@@ -7,13 +7,14 @@ import sharp from "sharp";
|
|||||||
import path from "path";
|
import path from "path";
|
||||||
import { fileURLToPath } from "url";
|
import { fileURLToPath } from "url";
|
||||||
import { payloadBlocks } from "./blocks/allBlocks";
|
import { payloadBlocks } from "./blocks/allBlocks";
|
||||||
import { migrations } from "../../migrations/index";
|
|
||||||
|
|
||||||
import { Users } from "./collections/Users";
|
import { Users } from "./collections/Users";
|
||||||
import { Media } from "./collections/Media";
|
import { Media } from "./collections/Media";
|
||||||
import { FormSubmissions } from "./collections/FormSubmissions";
|
import { FormSubmissions } from "./collections/FormSubmissions";
|
||||||
import { Pages } from "./collections/Pages";
|
import { Pages } from "./collections/Pages";
|
||||||
|
|
||||||
|
import { migrations } from "../../migrations/index";
|
||||||
|
|
||||||
const filename = fileURLToPath(import.meta.url);
|
const filename = fileURLToPath(import.meta.url);
|
||||||
const dirname = path.dirname(filename);
|
const dirname = path.dirname(filename);
|
||||||
|
|
||||||
@@ -41,13 +42,13 @@ export default buildConfig({
|
|||||||
outputFile: path.resolve(dirname, "payload-types.ts"),
|
outputFile: path.resolve(dirname, "payload-types.ts"),
|
||||||
},
|
},
|
||||||
db: postgresAdapter({
|
db: postgresAdapter({
|
||||||
migrations,
|
|
||||||
pool: {
|
pool: {
|
||||||
connectionString:
|
connectionString:
|
||||||
process.env.DATABASE_URI ||
|
process.env.DATABASE_URI ||
|
||||||
process.env.POSTGRES_URI ||
|
process.env.POSTGRES_URI ||
|
||||||
`postgresql://${process.env.DIRECTUS_DB_USER || "directus"}:${process.env.DIRECTUS_DB_PASSWORD || "directus"}@127.0.0.1:5432/${process.env.DIRECTUS_DB_NAME || "directus"}`,
|
`postgresql://${process.env.POSTGRES_USER || "postgres"}:${process.env.POSTGRES_PASSWORD || "postgres"}@127.0.0.1:5432/${process.env.POSTGRES_DB || "payload"}`,
|
||||||
},
|
},
|
||||||
|
prodMigrations: migrations,
|
||||||
}),
|
}),
|
||||||
...(process.env.SMTP_HOST
|
...(process.env.SMTP_HOST
|
||||||
? {
|
? {
|
||||||
|
|||||||
Reference in New Issue
Block a user