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:
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 "./Member";
|
||||
export * from "./Message";
|
||||
export * from "./Migration";
|
||||
export * from "./RateLimit";
|
||||
export * from "./ReadState";
|
||||
export * from "./Recipient";
|
||||
|
@ -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`);
|
||||
|
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 { 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")}`);
|
||||
});
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user