1
0
mirror of https://github.com/spacebarchat/server.git synced 2024-11-25 19:52:36 +01:00

automatically run db migrations

This commit is contained in:
Flam3rboy 2021-10-15 18:39:19 +02:00
parent 9e2553c3a1
commit 34e2392b48
6 changed files with 106 additions and 1 deletions

View 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;
}

View File

@ -11,6 +11,7 @@ export * from "./Guild";
export * from "./Invite";
export * from "./Member";
export * from "./Message";
export * from "./Migration";
export * from "./RateLimit";
export * from "./ReadState";
export * from "./Recipient";

View File

@ -1,6 +1,8 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class VanityInvite1633881705509 implements MigrationInterface {
name = "VanityInvite1633881705509";
public async up(queryRunner: QueryRunner): Promise<void> {
try {
await queryRunner.query(`ALTER TABLE "emojis" DROP COLUMN vanity_url_code`);

View 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> {}
}

View File

@ -2,6 +2,7 @@ import path from "path";
import "reflect-metadata";
import { Connection, createConnection } from "typeorm";
import * as Models from "../entities";
import { Migration } from "../entities/Migration";
import { yellow, green } from "nanocolors";
// UUID extension option is only supported with postgres
@ -33,10 +34,27 @@ export function initDatabase(): Promise<Connection> {
bigNumberStrings: false,
supportBigNumbers: true,
name: "default",
migrations: [path.join(__dirname, "..", "migrations", "*.js")],
});
promise.then((connection) => {
promise.then(async (connection: 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")}`);
});