klip/server/models/visit.ts

87 lines
2.1 KiB
TypeScript

import * as Knex from "knex";
export async function createVisitTable(knex: Knex) {
const hasTable = await knex.schema.hasTable("visits");
if (!hasTable) {
await knex.schema.createTable("visits", table => {
table.increments("id").primary();
table.jsonb("countries").defaultTo("{}");
table
.dateTime("created_at")
.notNullable()
.defaultTo(knex.fn.now());
table.dateTime("updated_at").defaultTo(knex.fn.now());
table
.integer("link_id")
.references("id")
.inTable("links")
.notNullable()
.onDelete("CASCADE");
table.jsonb("referrers").defaultTo("{}");
table
.integer("total")
.notNullable()
.defaultTo(0);
table
.integer("br_chrome")
.notNullable()
.defaultTo(0);
table
.integer("br_edge")
.notNullable()
.defaultTo(0);
table
.integer("br_firefox")
.notNullable()
.defaultTo(0);
table
.integer("br_ie")
.notNullable()
.defaultTo(0);
table
.integer("br_opera")
.notNullable()
.defaultTo(0);
table
.integer("br_other")
.notNullable()
.defaultTo(0);
table
.integer("br_safari")
.notNullable()
.defaultTo(0);
table
.integer("os_android")
.notNullable()
.defaultTo(0);
table
.integer("os_ios")
.notNullable()
.defaultTo(0);
table
.integer("os_linux")
.notNullable()
.defaultTo(0);
table
.integer("os_macos")
.notNullable()
.defaultTo(0);
table
.integer("os_other")
.notNullable()
.defaultTo(0);
table
.integer("os_windows")
.notNullable()
.defaultTo(0);
});
}
const hasUpdatedAt = await knex.schema.hasColumn("visits", "updated_at");
if (!hasUpdatedAt) {
await knex.schema.alterTable("visits", table => {
table.dateTime("updated_at").defaultTo(knex.fn.now());
});
}
}