mirror of
https://github.com/spacebarchat/server.git
synced 2024-11-10 12:42:44 +01:00
✨ automatically run db migrations
This commit is contained in:
parent
9e2553c3a1
commit
34e2392b48
18
util/src/entities/Migration.ts
Normal file
18
util/src/entities/Migration.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { Column, Entity, ObjectIdColumn, PrimaryGeneratedColumn } from "typeorm";
|
||||||
|
import { BaseClassWithoutId } from ".";
|
||||||
|
|
||||||
|
export const PrimaryIdAutoGenerated = process.env.DATABASE?.startsWith("mongodb")
|
||||||
|
? ObjectIdColumn
|
||||||
|
: PrimaryGeneratedColumn;
|
||||||
|
|
||||||
|
@Entity("migrations")
|
||||||
|
export class Migration extends BaseClassWithoutId {
|
||||||
|
@PrimaryIdAutoGenerated()
|
||||||
|
id: number;
|
||||||
|
|
||||||
|
@Column()
|
||||||
|
timestamp: number;
|
||||||
|
|
||||||
|
@Column()
|
||||||
|
name: string;
|
||||||
|
}
|
@ -11,6 +11,7 @@ export * from "./Guild";
|
|||||||
export * from "./Invite";
|
export * from "./Invite";
|
||||||
export * from "./Member";
|
export * from "./Member";
|
||||||
export * from "./Message";
|
export * from "./Message";
|
||||||
|
export * from "./Migration";
|
||||||
export * from "./RateLimit";
|
export * from "./RateLimit";
|
||||||
export * from "./ReadState";
|
export * from "./ReadState";
|
||||||
export * from "./Recipient";
|
export * from "./Recipient";
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import { MigrationInterface, QueryRunner } from "typeorm";
|
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||||
|
|
||||||
export class VanityInvite1633881705509 implements MigrationInterface {
|
export class VanityInvite1633881705509 implements MigrationInterface {
|
||||||
|
name = "VanityInvite1633881705509";
|
||||||
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
try {
|
try {
|
||||||
await queryRunner.query(`ALTER TABLE "emojis" DROP COLUMN vanity_url_code`);
|
await queryRunner.query(`ALTER TABLE "emojis" DROP COLUMN vanity_url_code`);
|
||||||
|
66
util/src/migrations/1634308884591-Stickers.ts
Normal file
66
util/src/migrations/1634308884591-Stickers.ts
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
import { MigrationInterface, QueryRunner, Table, TableColumn, TableForeignKey } from "typeorm";
|
||||||
|
|
||||||
|
export class Stickers1634308884591 implements MigrationInterface {
|
||||||
|
name = "Stickers1634308884591";
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.dropForeignKey("read_states", "FK_6f255d873cfbfd7a93849b7ff74");
|
||||||
|
await queryRunner.changeColumn(
|
||||||
|
"stickers",
|
||||||
|
"tags",
|
||||||
|
new TableColumn({ name: "tags", type: "varchar", isNullable: true })
|
||||||
|
);
|
||||||
|
await queryRunner.changeColumn(
|
||||||
|
"stickers",
|
||||||
|
"pack_id",
|
||||||
|
new TableColumn({ name: "pack_id", type: "varchar", isNullable: true })
|
||||||
|
);
|
||||||
|
await queryRunner.changeColumn("stickers", "type", new TableColumn({ name: "type", type: "integer" }));
|
||||||
|
await queryRunner.changeColumn(
|
||||||
|
"stickers",
|
||||||
|
"format_type",
|
||||||
|
new TableColumn({ name: "format_type", type: "integer" })
|
||||||
|
);
|
||||||
|
await queryRunner.changeColumn(
|
||||||
|
"stickers",
|
||||||
|
"available",
|
||||||
|
new TableColumn({ name: "available", type: "boolean", isNullable: true })
|
||||||
|
);
|
||||||
|
await queryRunner.changeColumn(
|
||||||
|
"stickers",
|
||||||
|
"user_id",
|
||||||
|
new TableColumn({ name: "user_id", type: "boolean", isNullable: true })
|
||||||
|
);
|
||||||
|
await queryRunner.createForeignKey(
|
||||||
|
"stickers",
|
||||||
|
new TableForeignKey({
|
||||||
|
name: "FK_8f4ee73f2bb2325ff980502e158",
|
||||||
|
columnNames: ["user_id"],
|
||||||
|
referencedColumnNames: ["id"],
|
||||||
|
referencedTableName: "users",
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
|
);
|
||||||
|
await queryRunner.createTable(
|
||||||
|
new Table({
|
||||||
|
name: "sticker_packs",
|
||||||
|
columns: [
|
||||||
|
new TableColumn({ name: "id", type: "varchar", isPrimary: true }),
|
||||||
|
new TableColumn({ name: "name", type: "varchar" }),
|
||||||
|
new TableColumn({ name: "description", type: "varchar", isNullable: true }),
|
||||||
|
new TableColumn({ name: "banner_asset_id", type: "varchar", isNullable: true }),
|
||||||
|
new TableColumn({ name: "cover_sticker_id", type: "varchar", isNullable: true }),
|
||||||
|
],
|
||||||
|
foreignKeys: [
|
||||||
|
new TableForeignKey({
|
||||||
|
columnNames: ["cover_sticker_id"],
|
||||||
|
referencedColumnNames: ["id"],
|
||||||
|
referencedTableName: "stickers",
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {}
|
||||||
|
}
|
@ -2,6 +2,7 @@ import path from "path";
|
|||||||
import "reflect-metadata";
|
import "reflect-metadata";
|
||||||
import { Connection, createConnection } from "typeorm";
|
import { Connection, createConnection } from "typeorm";
|
||||||
import * as Models from "../entities";
|
import * as Models from "../entities";
|
||||||
|
import { Migration } from "../entities/Migration";
|
||||||
import { yellow, green } from "nanocolors";
|
import { yellow, green } from "nanocolors";
|
||||||
|
|
||||||
// UUID extension option is only supported with postgres
|
// UUID extension option is only supported with postgres
|
||||||
@ -33,10 +34,27 @@ export function initDatabase(): Promise<Connection> {
|
|||||||
bigNumberStrings: false,
|
bigNumberStrings: false,
|
||||||
supportBigNumbers: true,
|
supportBigNumbers: true,
|
||||||
name: "default",
|
name: "default",
|
||||||
|
migrations: [path.join(__dirname, "..", "migrations", "*.js")],
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then((connection) => {
|
promise.then(async (connection: Connection) => {
|
||||||
dbConnection = connection;
|
dbConnection = connection;
|
||||||
|
|
||||||
|
// run migrations, and if it is a new fresh database, set it to the last migration
|
||||||
|
if (connection.migrations.length) {
|
||||||
|
if (!(await Migration.findOne({}))) {
|
||||||
|
let i = 0;
|
||||||
|
|
||||||
|
await Migration.insert(
|
||||||
|
connection.migrations.map((x) => ({
|
||||||
|
id: i++,
|
||||||
|
name: x.name,
|
||||||
|
timestamp: Date.now(),
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await connection.runMigrations();
|
||||||
console.log(`[Database] ${green("connected")}`);
|
console.log(`[Database] ${green("connected")}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user