fix: mysql migration not working (#1138)
* fix: mysql migration not working * test: add system integration test for mysql migration * fix: format issues * fix: deepsource issues * chore: address bad name for mysql migration test
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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": {}
|
||||
|
||||
@@ -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": {}
|
||||
|
||||
@@ -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": {}
|
||||
|
||||
@@ -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": {}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -171,7 +171,7 @@ export const integrationUserPermissions = mysqlTable(
|
||||
userId: varchar("user_id", { length: 64 })
|
||||
.notNull()
|
||||
.references(() => users.id, { onDelete: "cascade" }),
|
||||
permission: text("permission").$type<IntegrationPermission>().notNull(),
|
||||
permission: varchar("permission", { length: 128 }).$type<IntegrationPermission>().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<IntegrationPermission>().notNull(),
|
||||
permission: varchar("permission", { length: 128 }).$type<IntegrationPermission>().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",
|
||||
}),
|
||||
});
|
||||
|
||||
38
packages/db/test/mysql-migration.spec.ts
Normal file
38
packages/db/test/mysql-migration.spec.ts
Normal file
@@ -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);
|
||||
});
|
||||
12
pnpm-lock.yaml
generated
12
pnpm-lock.yaml
generated
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user