From 6d066c2ba4fe0e70f8a7e703c9ddb7ad26adaafc Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Sat, 27 Jul 2024 22:10:09 -0400 Subject: [PATCH] fix(db-sqlite): migration template errors (#7404) - Fix migration template for sqlite - Add declare for payload.db.drizzle as type LibSQLDatabase - Correct drizzle snapshot version --- .github/workflows/pr-title.yml | 1 + packages/db-sqlite/src/createMigration.ts | 2 +- packages/db-sqlite/src/defaultSnapshot.ts | 2 +- .../db-sqlite/src/getMigrationTemplate.ts | 4 +- packages/db-sqlite/src/types.ts | 3 +- .../migrations/20240513_181104_test.js | 155 ----- .../migrations/20240513_181104_test.json | 551 ------------------ 7 files changed, 6 insertions(+), 712 deletions(-) delete mode 100644 test/_community/migrations/20240513_181104_test.js delete mode 100644 test/_community/migrations/20240513_181104_test.json diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 83fcab334..8aac6f535 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -38,6 +38,7 @@ jobs: db-\* db-mongodb db-postgres + db-sqlite email-nodemailer eslint graphql diff --git a/packages/db-sqlite/src/createMigration.ts b/packages/db-sqlite/src/createMigration.ts index 5daec8828..a3ad8f75f 100644 --- a/packages/db-sqlite/src/createMigration.ts +++ b/packages/db-sqlite/src/createMigration.ts @@ -66,7 +66,7 @@ export const createMigration: CreateMigration = async function createMigration( const sqlStatementsUp = await generateSQLiteMigration(drizzleJsonBefore, drizzleJsonAfter) const sqlStatementsDown = await generateSQLiteMigration(drizzleJsonAfter, drizzleJsonBefore) // need to create tables as separate statements - const sqlExecute = 'await db.run(sql`' + const sqlExecute = 'await payload.db.drizzle.run(sql`' if (sqlStatementsUp?.length) { upSQL = sqlStatementsUp diff --git a/packages/db-sqlite/src/defaultSnapshot.ts b/packages/db-sqlite/src/defaultSnapshot.ts index f229c0534..cfcbb71cb 100644 --- a/packages/db-sqlite/src/defaultSnapshot.ts +++ b/packages/db-sqlite/src/defaultSnapshot.ts @@ -10,5 +10,5 @@ export const defaultDrizzleSnapshot: DrizzleSQLiteSnapshotJSON = { enums: {}, prevId: '00000000-0000-0000-0000-00000000000', tables: {}, - version: '3', + version: '5', } diff --git a/packages/db-sqlite/src/getMigrationTemplate.ts b/packages/db-sqlite/src/getMigrationTemplate.ts index 69ae4c560..10bce44dd 100644 --- a/packages/db-sqlite/src/getMigrationTemplate.ts +++ b/packages/db-sqlite/src/getMigrationTemplate.ts @@ -6,11 +6,11 @@ export const getMigrationTemplate = ({ upSQL, }: MigrationTemplateArgs): string => `import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-sqlite' ${imports ? `${imports}\n` : ''} -export async function up({ db, payload, req }: MigrateUpArgs): Promise { +export async function up({ payload, req }: MigrateUpArgs): Promise { ${upSQL} } -export async function down({ db, payload, req }: MigrateDownArgs): Promise { +export async function down({ payload, req }: MigrateDownArgs): Promise { ${downSQL} } ` diff --git a/packages/db-sqlite/src/types.ts b/packages/db-sqlite/src/types.ts index 0d324ccfd..3c27160b4 100644 --- a/packages/db-sqlite/src/types.ts +++ b/packages/db-sqlite/src/types.ts @@ -132,12 +132,10 @@ export type SQLiteAdapter = { export type IDType = 'integer' | 'numeric' | 'text' export type MigrateUpArgs = { - db: LibSQLDatabase payload: Payload req?: Partial } export type MigrateDownArgs = { - db: LibSQLDatabase payload: Payload req?: Partial } @@ -146,6 +144,7 @@ declare module 'payload' { export interface DatabaseAdapter extends Omit, DrizzleAdapter { + drizzle: LibSQLDatabase /** * An object keyed on each table, with a key value pair where the constraint name is the key, followed by the dot-notation field name * Used for returning properly formed errors from unique fields diff --git a/test/_community/migrations/20240513_181104_test.js b/test/_community/migrations/20240513_181104_test.js deleted file mode 100644 index a8f45d164..000000000 --- a/test/_community/migrations/20240513_181104_test.js +++ /dev/null @@ -1,155 +0,0 @@ -const { sql } = require('@payloadcms/db-postgres') - -// const loadTransformers = async () => { -// // eslint-disable-next-line @typescript-eslint/no-implied-eval -// const api = Function('return import("@payloadcms/db-postgres")')() -// -// ;({ sql } = await api) -// } -// -// loadTransformers() - -async function up({ payload }) { - await payload.db.drizzle.execute(sql` - -DO $$ BEGIN - CREATE TYPE "enum_posts_status" AS ENUM('draft', 'published'); -EXCEPTION - WHEN duplicate_object THEN null; -END $$; - -DO $$ BEGIN - CREATE TYPE "enum__posts_v_version_status" AS ENUM('draft', 'published'); -EXCEPTION - WHEN duplicate_object THEN null; -END $$; - -CREATE TABLE IF NOT EXISTS "posts" ( - "id" serial PRIMARY KEY NOT NULL, - "text" varchar, - "rich_text" jsonb, - "rich_text2" jsonb, - "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, - "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL, - "_status" "enum_posts_status" -); - -CREATE TABLE IF NOT EXISTS "_posts_v" ( - "id" serial PRIMARY KEY NOT NULL, - "version_text" varchar, - "version_rich_text" jsonb, - "version_rich_text2" jsonb, - "version_updated_at" timestamp(3) with time zone, - "version_created_at" timestamp(3) with time zone, - "version__status" "enum__posts_v_version_status", - "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL, - "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, - "latest" boolean -); - -CREATE TABLE IF NOT EXISTS "_posts_v_rels" ( - "id" serial PRIMARY KEY NOT NULL, - "order" integer, - "parent_id" integer NOT NULL, - "path" varchar NOT NULL, - "posts_id" integer -); - -CREATE TABLE IF NOT EXISTS "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, - "lock_until" timestamp(3) with time zone -); - -CREATE TABLE IF NOT EXISTS "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 IF NOT EXISTS "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 IF NOT EXISTS "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 -); - -CREATE TABLE IF NOT EXISTS "menu" ( - "id" serial PRIMARY KEY NOT NULL, - "global_text" varchar, - "updated_at" timestamp(3) with time zone, - "created_at" timestamp(3) with time zone -); - -CREATE INDEX IF NOT EXISTS "posts_created_at_idx" ON "posts" ("created_at"); -CREATE INDEX IF NOT EXISTS "_posts_v_version_version_created_at_idx" ON "_posts_v" ("version_created_at"); -CREATE INDEX IF NOT EXISTS "_posts_v_created_at_idx" ON "_posts_v" ("created_at"); -CREATE INDEX IF NOT EXISTS "_posts_v_updated_at_idx" ON "_posts_v" ("updated_at"); -CREATE INDEX IF NOT EXISTS "_posts_v_latest_idx" ON "_posts_v" ("latest"); -CREATE INDEX IF NOT EXISTS "_posts_v_rels_order_idx" ON "_posts_v_rels" ("order"); -CREATE INDEX IF NOT EXISTS "_posts_v_rels_parent_idx" ON "_posts_v_rels" ("parent_id"); -CREATE INDEX IF NOT EXISTS "_posts_v_rels_path_idx" ON "_posts_v_rels" ("path"); -CREATE INDEX IF NOT EXISTS "users_created_at_idx" ON "users" ("created_at"); -CREATE UNIQUE INDEX IF NOT EXISTS "users_email_idx" ON "users" ("email"); -CREATE INDEX IF NOT EXISTS "payload_preferences_key_idx" ON "payload_preferences" ("key"); -CREATE INDEX IF NOT EXISTS "payload_preferences_created_at_idx" ON "payload_preferences" ("created_at"); -CREATE INDEX IF NOT EXISTS "payload_preferences_rels_order_idx" ON "payload_preferences_rels" ("order"); -CREATE INDEX IF NOT EXISTS "payload_preferences_rels_parent_idx" ON "payload_preferences_rels" ("parent_id"); -CREATE INDEX IF NOT EXISTS "payload_preferences_rels_path_idx" ON "payload_preferences_rels" ("path"); -CREATE INDEX IF NOT EXISTS "payload_migrations_created_at_idx" ON "payload_migrations" ("created_at"); -DO $$ BEGIN - ALTER TABLE "_posts_v_rels" ADD CONSTRAINT "_posts_v_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "_posts_v"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; - -DO $$ BEGIN - ALTER TABLE "_posts_v_rels" ADD CONSTRAINT "_posts_v_rels_posts_fk" FOREIGN KEY ("posts_id") REFERENCES "posts"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; - -DO $$ BEGIN - ALTER TABLE "payload_preferences_rels" ADD CONSTRAINT "payload_preferences_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "payload_preferences"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; - -DO $$ BEGIN - ALTER TABLE "payload_preferences_rels" ADD CONSTRAINT "payload_preferences_rels_users_fk" FOREIGN KEY ("users_id") REFERENCES "users"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; -`) -} - -async function down({ payload }) { - await payload.db.drizzle.execute(sql` - -DROP TABLE "posts"; -DROP TABLE "_posts_v"; -DROP TABLE "_posts_v_rels"; -DROP TABLE "users"; -DROP TABLE "payload_preferences"; -DROP TABLE "payload_preferences_rels"; -DROP TABLE "payload_migrations"; -DROP TABLE "menu";`) -} diff --git a/test/_community/migrations/20240513_181104_test.json b/test/_community/migrations/20240513_181104_test.json deleted file mode 100644 index 647e0bb74..000000000 --- a/test/_community/migrations/20240513_181104_test.json +++ /dev/null @@ -1,551 +0,0 @@ -{ - "id": "07caaebd-1a8a-4549-8962-581962d395ee", - "prevId": "00000000-0000-0000-0000-000000000000", - "version": "5", - "dialect": "pg", - "tables": { - "posts": { - "name": "posts", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "text": { - "name": "text", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "rich_text": { - "name": "rich_text", - "type": "jsonb", - "primaryKey": false, - "notNull": false - }, - "rich_text2": { - "name": "rich_text2", - "type": "jsonb", - "primaryKey": false, - "notNull": false - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "created_at": { - "name": "created_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "_status": { - "name": "_status", - "type": "enum_posts_status", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "posts_created_at_idx": { - "name": "posts_created_at_idx", - "columns": ["created_at"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "_posts_v": { - "name": "_posts_v", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "version_text": { - "name": "version_text", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "version_rich_text": { - "name": "version_rich_text", - "type": "jsonb", - "primaryKey": false, - "notNull": false - }, - "version_rich_text2": { - "name": "version_rich_text2", - "type": "jsonb", - "primaryKey": false, - "notNull": false - }, - "version_updated_at": { - "name": "version_updated_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": false - }, - "version_created_at": { - "name": "version_created_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": false - }, - "version__status": { - "name": "version__status", - "type": "enum__posts_v_version_status", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "latest": { - "name": "latest", - "type": "boolean", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "_posts_v_version_version_created_at_idx": { - "name": "_posts_v_version_version_created_at_idx", - "columns": ["version_created_at"], - "isUnique": false - }, - "_posts_v_created_at_idx": { - "name": "_posts_v_created_at_idx", - "columns": ["created_at"], - "isUnique": false - }, - "_posts_v_updated_at_idx": { - "name": "_posts_v_updated_at_idx", - "columns": ["updated_at"], - "isUnique": false - }, - "_posts_v_latest_idx": { - "name": "_posts_v_latest_idx", - "columns": ["latest"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "_posts_v_rels": { - "name": "_posts_v_rels", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "order": { - "name": "order", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "parent_id": { - "name": "parent_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "path": { - "name": "path", - "type": "varchar", - "primaryKey": false, - "notNull": true - }, - "posts_id": { - "name": "posts_id", - "type": "integer", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "_posts_v_rels_order_idx": { - "name": "_posts_v_rels_order_idx", - "columns": ["order"], - "isUnique": false - }, - "_posts_v_rels_parent_idx": { - "name": "_posts_v_rels_parent_idx", - "columns": ["parent_id"], - "isUnique": false - }, - "_posts_v_rels_path_idx": { - "name": "_posts_v_rels_path_idx", - "columns": ["path"], - "isUnique": false - } - }, - "foreignKeys": { - "_posts_v_rels_parent_fk": { - "name": "_posts_v_rels_parent_fk", - "tableFrom": "_posts_v_rels", - "tableTo": "_posts_v", - "columnsFrom": ["parent_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "_posts_v_rels_posts_fk": { - "name": "_posts_v_rels_posts_fk", - "tableFrom": "_posts_v_rels", - "tableTo": "posts", - "columnsFrom": ["posts_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "users": { - "name": "users", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "created_at": { - "name": "created_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "email": { - "name": "email", - "type": "varchar", - "primaryKey": false, - "notNull": true - }, - "reset_password_token": { - "name": "reset_password_token", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "reset_password_expiration": { - "name": "reset_password_expiration", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": false - }, - "salt": { - "name": "salt", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "hash": { - "name": "hash", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "login_attempts": { - "name": "login_attempts", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "lock_until": { - "name": "lock_until", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "users_created_at_idx": { - "name": "users_created_at_idx", - "columns": ["created_at"], - "isUnique": false - }, - "users_email_idx": { - "name": "users_email_idx", - "columns": ["email"], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "payload_preferences": { - "name": "payload_preferences", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "key": { - "name": "key", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "value": { - "name": "value", - "type": "jsonb", - "primaryKey": false, - "notNull": false - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "created_at": { - "name": "created_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": { - "payload_preferences_key_idx": { - "name": "payload_preferences_key_idx", - "columns": ["key"], - "isUnique": false - }, - "payload_preferences_created_at_idx": { - "name": "payload_preferences_created_at_idx", - "columns": ["created_at"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "payload_preferences_rels": { - "name": "payload_preferences_rels", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "order": { - "name": "order", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "parent_id": { - "name": "parent_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "path": { - "name": "path", - "type": "varchar", - "primaryKey": false, - "notNull": true - }, - "users_id": { - "name": "users_id", - "type": "integer", - "primaryKey": false, - "notNull": false - } - }, - "indexes": { - "payload_preferences_rels_order_idx": { - "name": "payload_preferences_rels_order_idx", - "columns": ["order"], - "isUnique": false - }, - "payload_preferences_rels_parent_idx": { - "name": "payload_preferences_rels_parent_idx", - "columns": ["parent_id"], - "isUnique": false - }, - "payload_preferences_rels_path_idx": { - "name": "payload_preferences_rels_path_idx", - "columns": ["path"], - "isUnique": false - } - }, - "foreignKeys": { - "payload_preferences_rels_parent_fk": { - "name": "payload_preferences_rels_parent_fk", - "tableFrom": "payload_preferences_rels", - "tableTo": "payload_preferences", - "columnsFrom": ["parent_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "payload_preferences_rels_users_fk": { - "name": "payload_preferences_rels_users_fk", - "tableFrom": "payload_preferences_rels", - "tableTo": "users", - "columnsFrom": ["users_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "payload_migrations": { - "name": "payload_migrations", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "batch": { - "name": "batch", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "created_at": { - "name": "created_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": { - "payload_migrations_created_at_idx": { - "name": "payload_migrations_created_at_idx", - "columns": ["created_at"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "menu": { - "name": "menu", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "global_text": { - "name": "global_text", - "type": "varchar", - "primaryKey": false, - "notNull": false - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp(3) with time zone", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": { - "enum_posts_status": { - "name": "enum_posts_status", - "values": { - "draft": "draft", - "published": "published" - } - }, - "enum__posts_v_version_status": { - "name": "enum__posts_v_version_status", - "values": { - "draft": "draft", - "published": "published" - } - } - }, - "schemas": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -}