diff --git a/packages/db/migrations/mysql/0004_noisy_giant_girl.sql b/packages/db/migrations/mysql/0004_noisy_giant_girl.sql index dd1732222..d6c3d4d36 100644 --- a/packages/db/migrations/mysql/0004_noisy_giant_girl.sql +++ b/packages/db/migrations/mysql/0004_noisy_giant_girl.sql @@ -1,14 +1,14 @@ CREATE TABLE `integrationGroupPermissions` ( `integration_id` varchar(64) NOT NULL, `group_id` varchar(64) NOT NULL, - `permission` text NOT NULL, - CONSTRAINT `integrationGroupPermissions_integration_id_group_id_permission_pk` PRIMARY KEY(`integration_id`,`group_id`,`permission`) + `permission` varchar(128) NOT NULL, + CONSTRAINT `integration_group_permission__pk` PRIMARY KEY(`integration_id`,`group_id`,`permission`) ); --> statement-breakpoint CREATE TABLE `integrationUserPermission` ( `integration_id` varchar(64) NOT NULL, `user_id` varchar(64) NOT NULL, - `permission` text NOT NULL, + `permission` varchar(128) NOT NULL, CONSTRAINT `integrationUserPermission_integration_id_user_id_permission_pk` PRIMARY KEY(`integration_id`,`user_id`,`permission`) ); --> statement-breakpoint diff --git a/packages/db/migrations/mysql/0006_young_micromax.sql b/packages/db/migrations/mysql/0006_young_micromax.sql index 9cf760f08..46550bf1a 100644 --- a/packages/db/migrations/mysql/0006_young_micromax.sql +++ b/packages/db/migrations/mysql/0006_young_micromax.sql @@ -2,5 +2,5 @@ ALTER TABLE `section` RENAME COLUMN `position` TO `y_offset`;--> statement-break ALTER TABLE `section` ADD `x_offset` int NOT NULL;--> statement-breakpoint ALTER TABLE `section` ADD `width` int;--> statement-breakpoint ALTER TABLE `section` ADD `height` int;--> statement-breakpoint -ALTER TABLE `section` ADD `parent_section_id` text;--> statement-breakpoint +ALTER TABLE `section` ADD `parent_section_id` varchar(64);--> statement-breakpoint ALTER TABLE `section` ADD CONSTRAINT `section_parent_section_id_section_id_fk` FOREIGN KEY (`parent_section_id`) REFERENCES `section`(`id`) ON DELETE cascade ON UPDATE no action; \ No newline at end of file diff --git a/packages/db/migrations/mysql/meta/0004_snapshot.json b/packages/db/migrations/mysql/meta/0004_snapshot.json index 5f8bfaecf..24a1de0cc 100644 --- a/packages/db/migrations/mysql/meta/0004_snapshot.json +++ b/packages/db/migrations/mysql/meta/0004_snapshot.json @@ -655,7 +655,7 @@ }, "permission": { "name": "permission", - "type": "text", + "type": "varchar(128)", "primaryKey": false, "notNull": true, "autoincrement": false @@ -683,8 +683,8 @@ } }, "compositePrimaryKeys": { - "integrationGroupPermissions_integration_id_group_id_permission_pk": { - "name": "integrationGroupPermissions_integration_id_group_id_permission_pk", + "integration_group_permission__pk": { + "name": "integration_group_permission__pk", "columns": ["integration_id", "group_id", "permission"] } }, @@ -819,7 +819,7 @@ }, "permission": { "name": "permission", - "type": "text", + "type": "varchar(128)", "primaryKey": false, "notNull": true, "autoincrement": false diff --git a/packages/db/migrations/mysql/meta/0005_snapshot.json b/packages/db/migrations/mysql/meta/0005_snapshot.json index 123e68089..59a34b677 100644 --- a/packages/db/migrations/mysql/meta/0005_snapshot.json +++ b/packages/db/migrations/mysql/meta/0005_snapshot.json @@ -655,7 +655,7 @@ }, "permission": { "name": "permission", - "type": "text", + "type": "varchar(128)", "primaryKey": false, "notNull": true, "autoincrement": false @@ -683,8 +683,8 @@ } }, "compositePrimaryKeys": { - "integrationGroupPermissions_integration_id_group_id_permission_pk": { - "name": "integrationGroupPermissions_integration_id_group_id_permission_pk", + "integration_group_permission__pk": { + "name": "integration_group_permission__pk", "columns": ["integration_id", "group_id", "permission"] } }, @@ -819,7 +819,7 @@ }, "permission": { "name": "permission", - "type": "text", + "type": "varchar(128)", "primaryKey": false, "notNull": true, "autoincrement": false diff --git a/packages/db/migrations/mysql/meta/0006_snapshot.json b/packages/db/migrations/mysql/meta/0006_snapshot.json index 784cb4ef2..2e1dd71a4 100644 --- a/packages/db/migrations/mysql/meta/0006_snapshot.json +++ b/packages/db/migrations/mysql/meta/0006_snapshot.json @@ -655,7 +655,7 @@ }, "permission": { "name": "permission", - "type": "text", + "type": "varchar(128)", "primaryKey": false, "notNull": true, "autoincrement": false @@ -683,8 +683,8 @@ } }, "compositePrimaryKeys": { - "integrationGroupPermissions_integration_id_group_id_permission_pk": { - "name": "integrationGroupPermissions_integration_id_group_id_permission_pk", + "integration_group_permission__pk": { + "name": "integration_group_permission__pk", "columns": ["integration_id", "group_id", "permission"] } }, @@ -819,7 +819,7 @@ }, "permission": { "name": "permission", - "type": "text", + "type": "varchar(128)", "primaryKey": false, "notNull": true, "autoincrement": false @@ -1109,7 +1109,7 @@ }, "parent_section_id": { "name": "parent_section_id", - "type": "text", + "type": "varchar(64)", "primaryKey": false, "notNull": false, "autoincrement": false diff --git a/packages/db/migrations/mysql/meta/0007_snapshot.json b/packages/db/migrations/mysql/meta/0007_snapshot.json index b1b162698..bba63722f 100644 --- a/packages/db/migrations/mysql/meta/0007_snapshot.json +++ b/packages/db/migrations/mysql/meta/0007_snapshot.json @@ -655,7 +655,7 @@ }, "permission": { "name": "permission", - "type": "text", + "type": "varchar(128)", "primaryKey": false, "notNull": true, "autoincrement": false @@ -683,8 +683,8 @@ } }, "compositePrimaryKeys": { - "integrationGroupPermissions_integration_id_group_id_permission_pk": { - "name": "integrationGroupPermissions_integration_id_group_id_permission_pk", + "integration_group_permission__pk": { + "name": "integration_group_permission__pk", "columns": ["integration_id", "group_id", "permission"] } }, @@ -819,7 +819,7 @@ }, "permission": { "name": "permission", - "type": "text", + "type": "varchar(128)", "primaryKey": false, "notNull": true, "autoincrement": false @@ -1109,7 +1109,7 @@ }, "parent_section_id": { "name": "parent_section_id", - "type": "text", + "type": "varchar(64)", "primaryKey": false, "notNull": false, "autoincrement": false diff --git a/packages/db/migrations/sqlite/meta/0004_snapshot.json b/packages/db/migrations/sqlite/meta/0004_snapshot.json index 2d0f12df4..b5cc11ab0 100644 --- a/packages/db/migrations/sqlite/meta/0004_snapshot.json +++ b/packages/db/migrations/sqlite/meta/0004_snapshot.json @@ -659,9 +659,9 @@ } }, "compositePrimaryKeys": { - "integrationGroupPermissions_integration_id_group_id_permission_pk": { + "integration_group_permission__pk": { "columns": ["group_id", "integration_id", "permission"], - "name": "integrationGroupPermissions_integration_id_group_id_permission_pk" + "name": "integration_group_permission__pk" } }, "uniqueConstraints": {} diff --git a/packages/db/migrations/sqlite/meta/0005_snapshot.json b/packages/db/migrations/sqlite/meta/0005_snapshot.json index 90a6c7d32..99770a1c7 100644 --- a/packages/db/migrations/sqlite/meta/0005_snapshot.json +++ b/packages/db/migrations/sqlite/meta/0005_snapshot.json @@ -659,9 +659,9 @@ } }, "compositePrimaryKeys": { - "integrationGroupPermissions_integration_id_group_id_permission_pk": { + "integration_group_permission__pk": { "columns": ["group_id", "integration_id", "permission"], - "name": "integrationGroupPermissions_integration_id_group_id_permission_pk" + "name": "integration_group_permission__pk" } }, "uniqueConstraints": {} diff --git a/packages/db/migrations/sqlite/meta/0006_snapshot.json b/packages/db/migrations/sqlite/meta/0006_snapshot.json index 899500eb8..aa727f8dc 100644 --- a/packages/db/migrations/sqlite/meta/0006_snapshot.json +++ b/packages/db/migrations/sqlite/meta/0006_snapshot.json @@ -659,9 +659,9 @@ } }, "compositePrimaryKeys": { - "integrationGroupPermissions_integration_id_group_id_permission_pk": { + "integration_group_permission__pk": { "columns": ["group_id", "integration_id", "permission"], - "name": "integrationGroupPermissions_integration_id_group_id_permission_pk" + "name": "integration_group_permission__pk" } }, "uniqueConstraints": {} diff --git a/packages/db/migrations/sqlite/meta/0007_snapshot.json b/packages/db/migrations/sqlite/meta/0007_snapshot.json index 85bccfaea..9d256da25 100644 --- a/packages/db/migrations/sqlite/meta/0007_snapshot.json +++ b/packages/db/migrations/sqlite/meta/0007_snapshot.json @@ -659,9 +659,9 @@ } }, "compositePrimaryKeys": { - "integrationGroupPermissions_integration_id_group_id_permission_pk": { + "integration_group_permission__pk": { "columns": ["integration_id", "group_id", "permission"], - "name": "integrationGroupPermissions_integration_id_group_id_permission_pk" + "name": "integration_group_permission__pk" } }, "uniqueConstraints": {} diff --git a/packages/db/package.json b/packages/db/package.json index a01da92ad..29589d74b 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -36,6 +36,7 @@ "@homarr/definitions": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0", "@paralleldrive/cuid2": "^2.2.2", + "@testcontainers/mysql": "^10.13.1", "better-sqlite3": "^11.3.0", "dotenv": "^16.4.5", "drizzle-kit": "^0.24.2", diff --git a/packages/db/schema/mysql.ts b/packages/db/schema/mysql.ts index 32cabdbe5..e89942d43 100644 --- a/packages/db/schema/mysql.ts +++ b/packages/db/schema/mysql.ts @@ -171,7 +171,7 @@ export const integrationUserPermissions = mysqlTable( userId: varchar("user_id", { length: 64 }) .notNull() .references(() => users.id, { onDelete: "cascade" }), - permission: text("permission").$type().notNull(), + permission: varchar("permission", { length: 128 }).$type().notNull(), }, (table) => ({ compoundKey: primaryKey({ @@ -189,11 +189,12 @@ export const integrationGroupPermissions = mysqlTable( groupId: varchar("group_id", { length: 64 }) .notNull() .references(() => groups.id, { onDelete: "cascade" }), - permission: text("permission").$type().notNull(), + permission: varchar("permission", { length: 128 }).$type().notNull(), }, (table) => ({ compoundKey: primaryKey({ columns: [table.integrationId, table.groupId, table.permission], + name: "integration_group_permission__pk", }), }), ); @@ -276,7 +277,7 @@ export const sections = mysqlTable("section", { width: int("width"), height: int("height"), name: text("name"), - parentSectionId: text("parent_section_id").references((): AnyMySqlColumn => sections.id, { + parentSectionId: varchar("parent_section_id", { length: 64 }).references((): AnyMySqlColumn => sections.id, { onDelete: "cascade", }), }); diff --git a/packages/db/test/mysql-migration.spec.ts b/packages/db/test/mysql-migration.spec.ts new file mode 100644 index 000000000..d7dad22d0 --- /dev/null +++ b/packages/db/test/mysql-migration.spec.ts @@ -0,0 +1,38 @@ +import path from "path"; +import { MySqlContainer } from "@testcontainers/mysql"; +import { drizzle } from "drizzle-orm/mysql2"; +import { migrate } from "drizzle-orm/mysql2/migrator"; +import mysql from "mysql2"; +import { describe, test } from "vitest"; + +import * as mysqlSchema from "../schema/mysql"; + +describe("Mysql Migration", () => { + test("should add all tables and keys specified in migration files", async () => { + const mysqlContainer = await new MySqlContainer().start(); + + const connection = mysql.createConnection({ + host: mysqlContainer.getHost(), + database: mysqlContainer.getDatabase(), + port: mysqlContainer.getPort(), + user: mysqlContainer.getUsername(), + password: mysqlContainer.getUserPassword(), + }); + + const database = drizzle(connection, { + schema: mysqlSchema, + mode: "default", + }); + + // Run migrations and check if it works + await migrate(database, { + migrationsFolder: path.join(__dirname, "..", "migrations", "mysql"), + }); + + // Check if users table exists + await database.query.users.findMany(); + + connection.end(); + await mysqlContainer.stop(); + }, 40_000); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a39ff76f..27bf05743 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -841,6 +841,9 @@ importers: '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 + '@testcontainers/mysql': + specifier: ^10.13.1 + version: 10.13.1 better-sqlite3: specifier: ^11.3.0 version: 11.3.0 @@ -2986,6 +2989,9 @@ packages: '@tanstack/virtual-core@3.8.3': resolution: {integrity: sha512-vd2A2TnM5lbnWZnHi9B+L2gPtkSeOtJOAw358JqokIH1+v2J7vUAzFVPwB/wrye12RFOurffXu33plm4uQ+JBQ==} + '@testcontainers/mysql@10.13.1': + resolution: {integrity: sha512-G4I59inEQ37yxeMgXyNgLbGf+aUNGoQDdgrfNWpWC/s0z5fiFSROEngcp8ueGA4UgH9Jte8iXo0WrMgmBfwJEQ==} + '@tiptap/core@2.7.1': resolution: {integrity: sha512-/sOJ3J2OWxQrho6MWgE9xaRBln5MC4BEuevTYIGia4zrc523lX9s+h/lUeLtCPhI0+J6z9Vz+v3G/uoEqWCL+A==} peerDependencies: @@ -9152,6 +9158,12 @@ snapshots: '@tanstack/virtual-core@3.8.3': {} + '@testcontainers/mysql@10.13.1': + dependencies: + testcontainers: 10.13.1 + transitivePeerDependencies: + - supports-color + '@tiptap/core@2.7.1(@tiptap/pm@2.7.1)': dependencies: '@tiptap/pm': 2.7.1