UNPKG

4.22 kBJavaScriptView Raw
1exports.up = async function(knex) {
2 const { client } = knex.client.config;
3
4 await knex.schema.createTable("media", table => {
5 table.string("id").primary();
6 table.integer("size");
7 table.string("originalname");
8 table.string("mimetype");
9 table.string("imagetype");
10 table.integer("width");
11 table.integer("height");
12 table.integer("focusX");
13 table.integer("focusY");
14 table.text("tags");
15 if (client === "pg") {
16 table.specificType("search", "tsvector");
17 table.index("search", null, "gin");
18 } else {
19 table.text("search");
20 }
21 table.timestamp("created_at").defaultTo(knex.fn.now());
22 });
23
24 if (client === "mysql") {
25 await knex.schema.raw("alter table `media` add fulltext (`search`)");
26 }
27
28 await knex.schema.createTable("roles", table => {
29 table.increments("id").primary();
30 table.string("name");
31 table.text("permissions");
32 });
33
34 await knex.schema.createTable("users", table => {
35 table.increments("id").primary();
36 table.string("name").unique();
37 table.string("email").unique();
38 table.string("password");
39 table
40 .string("picture")
41 .references("id")
42 .inTable("media");
43 table
44 .integer("role")
45 .unsigned()
46 .references("id")
47 .inTable("roles");
48 table.timestamp("created_at").defaultTo(knex.fn.now());
49 });
50
51 await knex.schema.createTable("contents", table => {
52 table.increments("id").primary();
53 table.string("type").notNullable();
54 table.integer("latest_rev");
55 table.integer("published_rev");
56 table
57 .boolean("deleted")
58 .notNullable()
59 .defaultTo(false);
60 });
61
62 await knex.schema.createTable("content_revisions", table => {
63 table
64 .integer("id")
65 .unsigned()
66 .notNullable()
67 .references("id")
68 .inTable("contents")
69 .onDelete("CASCADE");
70
71 table.integer("rev");
72 table.timestamp("date").defaultTo(knex.fn.now());
73 table.text("data").notNullable();
74 table
75 .integer("author")
76 .unsigned()
77 .references("id")
78 .inTable("users");
79
80 table.primary(["id", "rev"]);
81 });
82
83 knex.schema.alterTable("contents", table => {
84 table
85 .foreign(["id", "latest_rev"])
86 .references(["id", "rev"])
87 .inTable("content_revisions");
88 table
89 .foreign(["id", "published_rev"])
90 .references(["id", "rev"])
91 .inTable("content_revisions");
92 });
93
94 await knex.schema.createTable("content_values", table => {
95 table.integer("id").unsigned();
96 table.integer("rev");
97 table.boolean("published");
98 table.string("field");
99 table.string("literal");
100 //table.bigInteger("numeric");
101 table.string("numeric");
102 table
103 .foreign(["id", "rev"])
104 .references(["id", "rev"])
105 .inTable("content_revisions")
106 .onDelete("CASCADE");
107 table.index(["field", "literal"]);
108 table.index(["field", "numeric"]);
109 });
110
111 await knex.schema.createTable("content_search", table => {
112 table.integer("id").unsigned();
113 table.integer("rev");
114 table.boolean("published");
115 if (client === "pg") {
116 table.specificType("text", "tsvector");
117 table.index("text", null, "gin");
118 } else {
119 table.text("text");
120 }
121 });
122
123 if (client === "mysql") {
124 await knex.schema.raw("alter table `content_search` add fulltext (`text`)");
125 }
126
127 await knex.schema.createTable("content_references", table => {
128 table.integer("id").unsigned();
129 table.integer("rev");
130 table
131 .string("media")
132 .references("id")
133 .inTable("media");
134 table
135 .integer("content")
136 .unsigned()
137 .references("id")
138 .inTable("contents");
139 table
140 .foreign(["id", "rev"])
141 .references(["id", "rev"])
142 .inTable("content_revisions")
143 .onDelete("CASCADE");
144 });
145};
146
147exports.down = async function(knex) {
148 await knex.schema.dropTable("content_references");
149 await knex.schema.dropTable("content_search");
150 await knex.schema.dropTable("content_values");
151 await knex.schema.dropTable("contents");
152 await knex.schema.dropTable("content_revisions");
153 await knex.schema.dropTable("users");
154 await knex.schema.dropTable("roles");
155 await knex.schema.dropTable("media");
156};