1import { DataTypes } from 'sequelize';
2
3const PK_INT = { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true };
4
5const SCHEMA = {
6 speedtests: {
7 id: PK_INT,
8 serverId: { type: DataTypes.INTEGER, defaultValue: 0 },
9 ping: { type: DataTypes.INTEGER, allowNull: false },
10 download: { type: DataTypes.DOUBLE, allowNull: false },
11 upload: { type: DataTypes.DOUBLE, allowNull: false },
12 error: { type: DataTypes.STRING, allowNull: true },
13 type: { type: DataTypes.STRING, defaultValue: 'auto' },
14 resultId: { type: DataTypes.STRING, allowNull: true },
15 time: { type: DataTypes.INTEGER, defaultValue: 0 },
16 created: {
17 type: process.env.DB_TYPE === 'mysql' ? DataTypes.STRING : DataTypes.TIME,
18 defaultValue: DataTypes.NOW
19 }
20 },
21 config: {
22 key: { type: DataTypes.STRING, primaryKey: true, allowNull: false },
23 value: { type: DataTypes.STRING, allowNull: false }
24 },
25 nodes: {
26 id: PK_INT,
27 name: { type: DataTypes.STRING, defaultValue: 'Pixies Server' },
28 url: { type: DataTypes.STRING, allowNull: false },
29 password: { type: DataTypes.STRING, allowNull: true }
30 },
31 recommendations: {
32 id: PK_INT,
33 ping: { type: DataTypes.INTEGER, allowNull: false },
34 download: { type: DataTypes.DOUBLE, allowNull: false },
35 upload: { type: DataTypes.DOUBLE, allowNull: false }
36 },
37 integration_data: {
38 id: { type: DataTypes.STRING, primaryKey: true, allowNull: false },
39 displayName: { type: DataTypes.STRING, defaultValue: 'Untitled' },
40 name: { type: DataTypes.STRING, allowNull: false },
41 data: { type: DataTypes.JSON, defaultValue: {} },
42 lastActivity: { type: DataTypes.DATE, allowNull: true },
43 activityFailed: { type: DataTypes.BOOLEAN, defaultValue: false }
44 }
45};
46
47export async function up(queryInterface) {
48 const existing = new Set(await queryInterface.showAllTables());
49 for (const [name, columns] of Object.entries(SCHEMA)) {
50 if (!existing.has(name)) await queryInterface.createTable(name, columns);
51 }
52}
53