From 3925258bc7defefec327ca32ebc54a98ec85dd74 Mon Sep 17 00:00:00 2001 From: Beorn Facchini Date: Sat, 20 Mar 2021 23:01:10 +1100 Subject: [PATCH] Prisma Migrate with database seeding fixes #559 --- package.json | 4 +- .../20210320112658_init/migration.sql | 99 ++++++++++++++ prisma/mysql/migrations/migration_lock.toml | 3 + prisma/mysql/schema.mysql.prisma | 1 + prisma/mysql/seed.js | 1 + .../20210320112717_init/migration.sql | 129 ++++++++++++++++++ .../postgresql/migrations/migration_lock.toml | 3 + prisma/postgresql/schema.postgresql.prisma | 1 + prisma/postgresql/seed.js | 1 + prisma/schema.mysql.prisma | 74 +++++----- prisma/schema.postgresql.prisma | 62 +++++---- prisma/seed.js | 30 ++++ 12 files changed, 340 insertions(+), 68 deletions(-) create mode 100644 prisma/mysql/migrations/20210320112658_init/migration.sql create mode 100644 prisma/mysql/migrations/migration_lock.toml create mode 120000 prisma/mysql/schema.mysql.prisma create mode 120000 prisma/mysql/seed.js create mode 100644 prisma/postgresql/migrations/20210320112717_init/migration.sql create mode 100644 prisma/postgresql/migrations/migration_lock.toml create mode 120000 prisma/postgresql/schema.postgresql.prisma create mode 120000 prisma/postgresql/seed.js create mode 100644 prisma/seed.js diff --git a/package.json b/package.json index dc936137..dc7ce5a3 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ } }, "dependencies": { - "@prisma/client": "2.18.0", + "@prisma/client": "2.19.0", "@reduxjs/toolkit": "^1.5.0", "bcrypt": "^5.0.0", "chalk": "^4.1.0", @@ -98,7 +98,6 @@ }, "devDependencies": { "@formatjs/cli": "^2.13.16", - "@prisma/cli": "2.18.0", "@rollup/plugin-buble": "^0.21.3", "@rollup/plugin-node-resolve": "^11.1.1", "@rollup/plugin-replace": "^2.3.4", @@ -121,6 +120,7 @@ "postcss-preset-env": "^6.7.0", "prettier": "^2.2.1", "prettier-eslint": "^12.0.0", + "prisma": "2.19.0", "rollup": "^2.38.3", "rollup-plugin-hashbang": "^2.2.2", "rollup-plugin-terser": "^7.0.2", diff --git a/prisma/mysql/migrations/20210320112658_init/migration.sql b/prisma/mysql/migrations/20210320112658_init/migration.sql new file mode 100644 index 00000000..0bb75d64 --- /dev/null +++ b/prisma/mysql/migrations/20210320112658_init/migration.sql @@ -0,0 +1,99 @@ +-- CreateTable +CREATE TABLE `account` ( + `user_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `username` VARCHAR(255) NOT NULL, + `password` VARCHAR(60) NOT NULL, + `is_admin` BOOLEAN NOT NULL DEFAULT false, + `created_at` TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP(0), +UNIQUE INDEX `account.username_unique`(`username`), + + PRIMARY KEY (`user_id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `event` ( + `event_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `website_id` INTEGER UNSIGNED NOT NULL, + `session_id` INTEGER UNSIGNED NOT NULL, + `created_at` TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP(0), + `url` VARCHAR(500) NOT NULL, + `event_type` VARCHAR(50) NOT NULL, + `event_value` VARCHAR(50) NOT NULL, +INDEX `event_created_at_idx`(`created_at`), +INDEX `event_session_id_idx`(`session_id`), +INDEX `event_website_id_idx`(`website_id`), + + PRIMARY KEY (`event_id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `pageview` ( + `view_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `website_id` INTEGER UNSIGNED NOT NULL, + `session_id` INTEGER UNSIGNED NOT NULL, + `created_at` TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP(0), + `url` VARCHAR(500) NOT NULL, + `referrer` VARCHAR(500), +INDEX `pageview_created_at_idx`(`created_at`), +INDEX `pageview_session_id_idx`(`session_id`), +INDEX `pageview_website_id_created_at_idx`(`website_id`, `created_at`), +INDEX `pageview_website_id_idx`(`website_id`), +INDEX `pageview_website_id_session_id_created_at_idx`(`website_id`, `session_id`, `created_at`), + + PRIMARY KEY (`view_id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `session` ( + `session_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `session_uuid` VARCHAR(36) NOT NULL, + `website_id` INTEGER UNSIGNED NOT NULL, + `created_at` TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP(0), + `hostname` VARCHAR(100), + `browser` VARCHAR(20), + `os` VARCHAR(20), + `device` VARCHAR(20), + `screen` VARCHAR(11), + `language` VARCHAR(35), + `country` CHAR(2), +UNIQUE INDEX `session.session_uuid_unique`(`session_uuid`), +INDEX `session_created_at_idx`(`created_at`), +INDEX `session_website_id_idx`(`website_id`), + + PRIMARY KEY (`session_id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `website` ( + `website_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `website_uuid` VARCHAR(36) NOT NULL, + `user_id` INTEGER UNSIGNED NOT NULL, + `name` VARCHAR(100) NOT NULL, + `domain` VARCHAR(500), + `share_id` VARCHAR(64), + `created_at` TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP(0), +UNIQUE INDEX `website.website_uuid_unique`(`website_uuid`), +UNIQUE INDEX `website.share_id_unique`(`share_id`), +INDEX `website_user_id_idx`(`user_id`), + + PRIMARY KEY (`website_id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `event` ADD FOREIGN KEY (`session_id`) REFERENCES `session`(`session_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `event` ADD FOREIGN KEY (`website_id`) REFERENCES `website`(`website_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `pageview` ADD FOREIGN KEY (`session_id`) REFERENCES `session`(`session_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `pageview` ADD FOREIGN KEY (`website_id`) REFERENCES `website`(`website_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `session` ADD FOREIGN KEY (`website_id`) REFERENCES `website`(`website_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `website` ADD FOREIGN KEY (`user_id`) REFERENCES `account`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/mysql/migrations/migration_lock.toml b/prisma/mysql/migrations/migration_lock.toml new file mode 100644 index 00000000..e5a788a7 --- /dev/null +++ b/prisma/mysql/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "mysql" \ No newline at end of file diff --git a/prisma/mysql/schema.mysql.prisma b/prisma/mysql/schema.mysql.prisma new file mode 120000 index 00000000..fec72c83 --- /dev/null +++ b/prisma/mysql/schema.mysql.prisma @@ -0,0 +1 @@ +../schema.mysql.prisma \ No newline at end of file diff --git a/prisma/mysql/seed.js b/prisma/mysql/seed.js new file mode 120000 index 00000000..fc84d113 --- /dev/null +++ b/prisma/mysql/seed.js @@ -0,0 +1 @@ +../seed.js \ No newline at end of file diff --git a/prisma/postgresql/migrations/20210320112717_init/migration.sql b/prisma/postgresql/migrations/20210320112717_init/migration.sql new file mode 100644 index 00000000..1567119d --- /dev/null +++ b/prisma/postgresql/migrations/20210320112717_init/migration.sql @@ -0,0 +1,129 @@ +-- CreateTable +CREATE TABLE "account" ( + "user_id" SERIAL NOT NULL, + "username" VARCHAR(255) NOT NULL, + "password" VARCHAR(60) NOT NULL, + "is_admin" BOOLEAN NOT NULL DEFAULT false, + "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + + PRIMARY KEY ("user_id") +); + +-- CreateTable +CREATE TABLE "event" ( + "event_id" SERIAL NOT NULL, + "website_id" INTEGER NOT NULL, + "session_id" INTEGER NOT NULL, + "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + "url" VARCHAR(500) NOT NULL, + "event_type" VARCHAR(50) NOT NULL, + "event_value" VARCHAR(50) NOT NULL, + + PRIMARY KEY ("event_id") +); + +-- CreateTable +CREATE TABLE "pageview" ( + "view_id" SERIAL NOT NULL, + "website_id" INTEGER NOT NULL, + "session_id" INTEGER NOT NULL, + "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + "url" VARCHAR(500) NOT NULL, + "referrer" VARCHAR(500), + + PRIMARY KEY ("view_id") +); + +-- CreateTable +CREATE TABLE "session" ( + "session_id" SERIAL NOT NULL, + "session_uuid" UUID NOT NULL, + "website_id" INTEGER NOT NULL, + "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + "hostname" VARCHAR(100), + "browser" VARCHAR(20), + "os" VARCHAR(20), + "device" VARCHAR(20), + "screen" VARCHAR(11), + "language" VARCHAR(35), + "country" CHAR(2), + + PRIMARY KEY ("session_id") +); + +-- CreateTable +CREATE TABLE "website" ( + "website_id" SERIAL NOT NULL, + "website_uuid" UUID NOT NULL, + "user_id" INTEGER NOT NULL, + "name" VARCHAR(100) NOT NULL, + "domain" VARCHAR(500), + "share_id" VARCHAR(64), + "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + + PRIMARY KEY ("website_id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "account.username_unique" ON "account"("username"); + +-- CreateIndex +CREATE INDEX "event_created_at_idx" ON "event"("created_at"); + +-- CreateIndex +CREATE INDEX "event_session_id_idx" ON "event"("session_id"); + +-- CreateIndex +CREATE INDEX "event_website_id_idx" ON "event"("website_id"); + +-- CreateIndex +CREATE INDEX "pageview_created_at_idx" ON "pageview"("created_at"); + +-- CreateIndex +CREATE INDEX "pageview_session_id_idx" ON "pageview"("session_id"); + +-- CreateIndex +CREATE INDEX "pageview_website_id_created_at_idx" ON "pageview"("website_id", "created_at"); + +-- CreateIndex +CREATE INDEX "pageview_website_id_idx" ON "pageview"("website_id"); + +-- CreateIndex +CREATE INDEX "pageview_website_id_session_id_created_at_idx" ON "pageview"("website_id", "session_id", "created_at"); + +-- CreateIndex +CREATE UNIQUE INDEX "session.session_uuid_unique" ON "session"("session_uuid"); + +-- CreateIndex +CREATE INDEX "session_created_at_idx" ON "session"("created_at"); + +-- CreateIndex +CREATE INDEX "session_website_id_idx" ON "session"("website_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "website.website_uuid_unique" ON "website"("website_uuid"); + +-- CreateIndex +CREATE UNIQUE INDEX "website.share_id_unique" ON "website"("share_id"); + +-- CreateIndex +CREATE INDEX "website_user_id_idx" ON "website"("user_id"); + +-- AddForeignKey +ALTER TABLE "event" ADD FOREIGN KEY ("session_id") REFERENCES "session"("session_id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "event" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "pageview" ADD FOREIGN KEY ("session_id") REFERENCES "session"("session_id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "pageview" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "session" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "website" ADD FOREIGN KEY ("user_id") REFERENCES "account"("user_id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/postgresql/migrations/migration_lock.toml b/prisma/postgresql/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/prisma/postgresql/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/prisma/postgresql/schema.postgresql.prisma b/prisma/postgresql/schema.postgresql.prisma new file mode 120000 index 00000000..6c19dc77 --- /dev/null +++ b/prisma/postgresql/schema.postgresql.prisma @@ -0,0 +1 @@ +../schema.postgresql.prisma \ No newline at end of file diff --git a/prisma/postgresql/seed.js b/prisma/postgresql/seed.js new file mode 120000 index 00000000..fc84d113 --- /dev/null +++ b/prisma/postgresql/seed.js @@ -0,0 +1 @@ +../seed.js \ No newline at end of file diff --git a/prisma/schema.mysql.prisma b/prisma/schema.mysql.prisma index bf8afeab..40969d66 100644 --- a/prisma/schema.mysql.prisma +++ b/prisma/schema.mysql.prisma @@ -8,23 +8,23 @@ datasource db { } model account { - user_id Int @default(autoincrement()) @id - username String @unique - password String + user_id Int @id @default(autoincrement()) @db.UnsignedInt + username String @unique @db.VarChar(255) + password String @db.VarChar(60) is_admin Boolean @default(false) - created_at DateTime? @default(now()) - updated_at DateTime? @default(now()) + created_at DateTime? @default(now()) @db.Timestamp(0) + updated_at DateTime? @default(now()) @db.Timestamp(0) website website[] } model event { - event_id Int @default(autoincrement()) @id - website_id Int - session_id Int - created_at DateTime? @default(now()) - url String - event_type String - event_value String + event_id Int @id @default(autoincrement()) @db.UnsignedInt + website_id Int @db.UnsignedInt + session_id Int @db.UnsignedInt + created_at DateTime? @default(now()) @db.Timestamp(0) + url String @db.VarChar(500) + event_type String @db.VarChar(50) + event_value String @db.VarChar(50) session session @relation(fields: [session_id], references: [session_id]) website website @relation(fields: [website_id], references: [website_id]) @@ -34,32 +34,34 @@ model event { } model pageview { - view_id Int @default(autoincrement()) @id - website_id Int - session_id Int - created_at DateTime? @default(now()) - url String - referrer String? + view_id Int @id @default(autoincrement()) @db.UnsignedInt + website_id Int @db.UnsignedInt + session_id Int @db.UnsignedInt + created_at DateTime? @default(now()) @db.Timestamp(0) + url String @db.VarChar(500) + referrer String? @db.VarChar(500) session session @relation(fields: [session_id], references: [session_id]) website website @relation(fields: [website_id], references: [website_id]) @@index([created_at], name: "pageview_created_at_idx") @@index([session_id], name: "pageview_session_id_idx") + @@index([website_id, created_at], name: "pageview_website_id_created_at_idx") @@index([website_id], name: "pageview_website_id_idx") + @@index([website_id, session_id, created_at], name: "pageview_website_id_session_id_created_at_idx") } model session { - session_id Int @default(autoincrement()) @id - session_uuid String @unique - website_id Int - created_at DateTime? @default(now()) - hostname String? - browser String? - os String? - device String? - screen String? - language String? - country String? + session_id Int @id @default(autoincrement()) @db.UnsignedInt + session_uuid String @unique @db.VarChar(36) + website_id Int @db.UnsignedInt + created_at DateTime? @default(now()) @db.Timestamp(0) + hostname String? @db.VarChar(100) + browser String? @db.VarChar(20) + os String? @db.VarChar(20) + device String? @db.VarChar(20) + screen String? @db.VarChar(11) + language String? @db.VarChar(35) + country String? @db.Char(2) website website @relation(fields: [website_id], references: [website_id]) event event[] pageview pageview[] @@ -69,13 +71,13 @@ model session { } model website { - website_id Int @default(autoincrement()) @id - website_uuid String @unique - user_id Int - name String - domain String? - created_at DateTime? @default(now()) - share_id String? @unique + website_id Int @id @default(autoincrement()) @db.UnsignedInt + website_uuid String @unique @db.VarChar(36) + user_id Int @db.UnsignedInt + name String @db.VarChar(100) + domain String? @db.VarChar(500) + share_id String? @unique @db.VarChar(64) + created_at DateTime? @default(now()) @db.Timestamp(0) account account @relation(fields: [user_id], references: [user_id]) event event[] pageview pageview[] diff --git a/prisma/schema.postgresql.prisma b/prisma/schema.postgresql.prisma index e03bc087..d46e7dc1 100644 --- a/prisma/schema.postgresql.prisma +++ b/prisma/schema.postgresql.prisma @@ -8,23 +8,23 @@ datasource db { } model account { - user_id Int @default(autoincrement()) @id - username String @unique - password String + user_id Int @id @default(autoincrement()) + username String @unique @db.VarChar(255) + password String @db.VarChar(60) is_admin Boolean @default(false) - created_at DateTime? @default(now()) - updated_at DateTime? @default(now()) + created_at DateTime? @default(now()) @db.Timestamptz(6) + updated_at DateTime? @default(now()) @db.Timestamptz(6) website website[] } model event { - event_id Int @default(autoincrement()) @id + event_id Int @id @default(autoincrement()) website_id Int session_id Int - created_at DateTime? @default(now()) - url String - event_type String - event_value String + created_at DateTime? @default(now()) @db.Timestamptz(6) + url String @db.VarChar(500) + event_type String @db.VarChar(50) + event_value String @db.VarChar(50) session session @relation(fields: [session_id], references: [session_id]) website website @relation(fields: [website_id], references: [website_id]) @@ -34,32 +34,34 @@ model event { } model pageview { - view_id Int @default(autoincrement()) @id + view_id Int @id @default(autoincrement()) website_id Int session_id Int - created_at DateTime? @default(now()) - url String - referrer String? + created_at DateTime? @default(now()) @db.Timestamptz(6) + url String @db.VarChar(500) + referrer String? @db.VarChar(500) session session @relation(fields: [session_id], references: [session_id]) website website @relation(fields: [website_id], references: [website_id]) @@index([created_at], name: "pageview_created_at_idx") @@index([session_id], name: "pageview_session_id_idx") + @@index([website_id, created_at], name: "pageview_website_id_created_at_idx") @@index([website_id], name: "pageview_website_id_idx") + @@index([website_id, session_id, created_at], name: "pageview_website_id_session_id_created_at_idx") } model session { - session_id Int @default(autoincrement()) @id - session_uuid String @unique + session_id Int @id @default(autoincrement()) + session_uuid String @unique @db.Uuid website_id Int - created_at DateTime? @default(now()) - hostname String? - browser String? - os String? - screen String? - language String? - country String? - device String? + created_at DateTime? @default(now()) @db.Timestamptz(6) + hostname String? @db.VarChar(100) + browser String? @db.VarChar(20) + os String? @db.VarChar(20) + device String? @db.VarChar(20) + screen String? @db.VarChar(11) + language String? @db.VarChar(35) + country String? @db.Char(2) website website @relation(fields: [website_id], references: [website_id]) event event[] pageview pageview[] @@ -69,13 +71,13 @@ model session { } model website { - website_id Int @default(autoincrement()) @id - website_uuid String @unique - name String - created_at DateTime? @default(now()) + website_id Int @id @default(autoincrement()) + website_uuid String @unique @db.Uuid user_id Int - domain String? - share_id String? @unique + name String @db.VarChar(100) + domain String? @db.VarChar(500) + share_id String? @unique @db.VarChar(64) + created_at DateTime? @default(now()) @db.Timestamptz(6) account account @relation(fields: [user_id], references: [user_id]) event event[] pageview pageview[] diff --git a/prisma/seed.js b/prisma/seed.js new file mode 100644 index 00000000..45932d4d --- /dev/null +++ b/prisma/seed.js @@ -0,0 +1,30 @@ +const bcrypt = require('bcrypt'); +const { PrismaClient } = require('@prisma/client'); +const prisma = new PrismaClient(); +const SALT_ROUNDS = 10; + +const hashPassword = password => { + return bcrypt.hash(password, SALT_ROUNDS); +}; + +async function main() { + const password = await hashPassword(process.env.ADMIN_PASSWORD || 'umami'); + await prisma.account.upsert({ + where: { username: 'admin' }, + update: {}, + create: { + username: 'admin', + password: password, + is_admin: true, + }, + }); +} + +main() + .catch(e => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + });