1 | exports.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 |
|
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 |
|
147 | exports.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 | };
|