Skip to content

Commit c1359de

Browse files
author
VuXfi
committed
feat: create initial database migration for Adminizer system models
1 parent 4d40f02 commit c1359de

1 file changed

Lines changed: 129 additions & 0 deletions

File tree

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
import { Knex } from "knex";
2+
3+
/**
4+
* Creates all system model tables for Adminizer
5+
* Tables: userap, groupap, mediamanagerap, mediamanagermetaap, mediamanagerassociationsap,
6+
* notificationap, usernotificationap, navigationap, groupapuserap
7+
*/
8+
export async function up(knex: Knex): Promise<void> {
9+
// userap
10+
await knex.schema.createTable("userap", (table) => {
11+
table.increments("id").primary().notNullable();
12+
table.string("login").unique();
13+
table.string("fullName");
14+
table.string("email");
15+
table.string("avatar");
16+
table.string("passwordHashed");
17+
table.string("timezone");
18+
table.string("expires");
19+
table.string("locale");
20+
table.boolean("isDeleted");
21+
table.boolean("isActive");
22+
table.boolean("isAdministrator");
23+
table.json("widgets");
24+
table.boolean("isConfirmed");
25+
table.timestamp("createdAt").notNullable().defaultTo(knex.fn.now());
26+
table.timestamp("updatedAt").notNullable().defaultTo(knex.fn.now());
27+
});
28+
29+
// groupap
30+
await knex.schema.createTable("groupap", (table) => {
31+
table.increments("id").primary().notNullable();
32+
table.string("name").unique();
33+
table.string("description");
34+
table.json("tokens");
35+
table.timestamp("createdAt").notNullable().defaultTo(knex.fn.now());
36+
table.timestamp("updatedAt").notNullable().defaultTo(knex.fn.now());
37+
});
38+
39+
// mediamanagerap (self-ref via parentId)
40+
await knex.schema.createTable("mediamanagerap", (table) => {
41+
table.uuid("id").primary().notNullable().defaultTo(knex.raw("gen_random_uuid()"));
42+
table.uuid("parentId").nullable().references("id").inTable("mediamanagerap").onDelete("SET NULL");
43+
table.string("mimeType");
44+
table.string("path");
45+
table.integer("size");
46+
table.string("group");
47+
table.string("tag");
48+
table.string("url");
49+
table.string("filename");
50+
table.timestamp("createdAt").notNullable().defaultTo(knex.fn.now());
51+
table.timestamp("updatedAt").notNullable().defaultTo(knex.fn.now());
52+
});
53+
54+
// mediamanagermetaap (belongsTo mediamanagerap via parentId)
55+
await knex.schema.createTable("mediamanagermetaap", (table) => {
56+
table.uuid("id").primary().notNullable().defaultTo(knex.raw("gen_random_uuid()"));
57+
table.string("key");
58+
table.json("value");
59+
table.boolean("isPublic");
60+
table.uuid("parentId").nullable().references("id").inTable("mediamanagerap").onDelete("SET NULL");
61+
table.timestamp("createdAt").notNullable().defaultTo(knex.fn.now());
62+
table.timestamp("updatedAt").notNullable().defaultTo(knex.fn.now());
63+
});
64+
65+
// mediamanagerassociationsap (belongsTo mediamanagerap via fileId)
66+
await knex.schema.createTable("mediamanagerassociationsap", (table) => {
67+
table.uuid("id").primary().notNullable().defaultTo(knex.raw("gen_random_uuid()"));
68+
table.string("mediaManagerId");
69+
table.json("model");
70+
table.json("modelId");
71+
table.string("widgetName");
72+
table.integer("sortOrder");
73+
table.uuid("fileId").nullable().references("id").inTable("mediamanagerap").onDelete("SET NULL");
74+
table.timestamp("createdAt").notNullable().defaultTo(knex.fn.now());
75+
table.timestamp("updatedAt").notNullable().defaultTo(knex.fn.now());
76+
});
77+
78+
// notificationap
79+
await knex.schema.createTable("notificationap", (table) => {
80+
table.increments("id").primary().notNullable();
81+
table.string("title");
82+
table.string("message");
83+
table.string("notificationClass");
84+
table.string("channel");
85+
table.json("metadata");
86+
table.timestamp("createdAt").notNullable().defaultTo(knex.fn.now());
87+
table.timestamp("updatedAt").notNullable().defaultTo(knex.fn.now());
88+
});
89+
90+
// usernotificationap (FK to notificationap via column notificationIdId)
91+
await knex.schema.createTable("usernotificationap", (table) => {
92+
table.increments("id").primary().notNullable();
93+
table.integer("userId");
94+
table.integer("notificationIdId").nullable().references("id").inTable("notificationap").onDelete("SET NULL");
95+
table.boolean("read");
96+
table.timestamp("createdAt").notNullable().defaultTo(knex.fn.now());
97+
table.timestamp("updatedAt").notNullable().defaultTo(knex.fn.now());
98+
});
99+
100+
// navigationap
101+
await knex.schema.createTable("navigationap", (table) => {
102+
table.increments("id").primary().notNullable();
103+
table.string("label").unique();
104+
table.json("tree");
105+
table.timestamp("createdAt").notNullable().defaultTo(knex.fn.now());
106+
table.timestamp("updatedAt").notNullable().defaultTo(knex.fn.now());
107+
});
108+
109+
// M:N join: GroupAP <-> UserAP via "groupapuserap"
110+
await knex.schema.createTable("groupapuserap", (table) => {
111+
table.integer("UserAPId").notNullable().references("id").inTable("userap").onDelete("CASCADE");
112+
table.integer("GroupAPId").notNullable().references("id").inTable("groupap").onDelete("CASCADE");
113+
table.timestamp("createdAt").notNullable().defaultTo(knex.fn.now());
114+
table.timestamp("updatedAt").notNullable().defaultTo(knex.fn.now());
115+
table.primary(["UserAPId", "GroupAPId"]);
116+
});
117+
}
118+
119+
export async function down(knex: Knex): Promise<void> {
120+
await knex.schema.dropTableIfExists("groupapuserap");
121+
await knex.schema.dropTableIfExists("usernotificationap");
122+
await knex.schema.dropTableIfExists("mediamanagermetaap");
123+
await knex.schema.dropTableIfExists("mediamanagerassociationsap");
124+
await knex.schema.dropTableIfExists("mediamanagerap");
125+
await knex.schema.dropTableIfExists("navigationap");
126+
await knex.schema.dropTableIfExists("notificationap");
127+
await knex.schema.dropTableIfExists("groupap");
128+
await knex.schema.dropTableIfExists("userap");
129+
}

0 commit comments

Comments
 (0)