From cfa4151cff0bf1d5118921e77bbcb49b0680cab5 Mon Sep 17 00:00:00 2001 From: boojack Date: Mon, 25 Jul 2022 21:17:46 +0800 Subject: [PATCH] chore: update migration folder --- store/db/db.go | 6 +- .../db/migration/{ => dev}/LATEST__SCHEMA.sql | 0 .../{ => prod}/0.2/00__user_role.sql | 0 .../{ => prod}/0.2/01__memo_visibility.sql | 0 .../0.3/00__memo_visibility_protected.sql | 0 store/db/migration/prod/LATEST__SCHEMA.sql | 141 ++++++++++++++++++ 6 files changed, 144 insertions(+), 3 deletions(-) rename store/db/migration/{ => dev}/LATEST__SCHEMA.sql (100%) rename store/db/migration/{ => prod}/0.2/00__user_role.sql (100%) rename store/db/migration/{ => prod}/0.2/01__memo_visibility.sql (100%) rename store/db/migration/{ => prod}/0.3/00__memo_visibility_protected.sql (100%) create mode 100644 store/db/migration/prod/LATEST__SCHEMA.sql diff --git a/store/db/db.go b/store/db/db.go index d2621eae..e068fab4 100644 --- a/store/db/db.go +++ b/store/db/db.go @@ -128,7 +128,7 @@ const ( ) func (db *DB) applyLatestSchema() error { - latestSchemaPath := fmt.Sprintf("%s/%s", "migration", latestSchemaFileName) + latestSchemaPath := fmt.Sprintf("%s/%s/%s", "migration", db.profile.Mode, latestSchemaFileName) buf, err := migrationFS.ReadFile(latestSchemaPath) if err != nil { return fmt.Errorf("failed to read latest schema %q, error %w", latestSchemaPath, err) @@ -141,7 +141,7 @@ func (db *DB) applyLatestSchema() error { } func (db *DB) applyMigrationForMinorVersion(minorVersion string) error { - filenames, err := fs.Glob(migrationFS, fmt.Sprintf("%s/%s/*.sql", "migration", minorVersion)) + filenames, err := fs.Glob(migrationFS, fmt.Sprintf("%s/%s/*.sql", "migration/prod", minorVersion)) if err != nil { return err } @@ -210,7 +210,7 @@ func (db *DB) execute(stmt string) error { } // minorDirRegexp is a regular expression for minor version directory. -var minorDirRegexp = regexp.MustCompile(`^migration/[0-9]+\.[0-9]+$`) +var minorDirRegexp = regexp.MustCompile(`^migration/prod/[0-9]+\.[0-9]+$`) func getMinorVersionList() []string { minorVersionList := []string{} diff --git a/store/db/migration/LATEST__SCHEMA.sql b/store/db/migration/dev/LATEST__SCHEMA.sql similarity index 100% rename from store/db/migration/LATEST__SCHEMA.sql rename to store/db/migration/dev/LATEST__SCHEMA.sql diff --git a/store/db/migration/0.2/00__user_role.sql b/store/db/migration/prod/0.2/00__user_role.sql similarity index 100% rename from store/db/migration/0.2/00__user_role.sql rename to store/db/migration/prod/0.2/00__user_role.sql diff --git a/store/db/migration/0.2/01__memo_visibility.sql b/store/db/migration/prod/0.2/01__memo_visibility.sql similarity index 100% rename from store/db/migration/0.2/01__memo_visibility.sql rename to store/db/migration/prod/0.2/01__memo_visibility.sql diff --git a/store/db/migration/0.3/00__memo_visibility_protected.sql b/store/db/migration/prod/0.3/00__memo_visibility_protected.sql similarity index 100% rename from store/db/migration/0.3/00__memo_visibility_protected.sql rename to store/db/migration/prod/0.3/00__memo_visibility_protected.sql diff --git a/store/db/migration/prod/LATEST__SCHEMA.sql b/store/db/migration/prod/LATEST__SCHEMA.sql new file mode 100644 index 00000000..ca0bb148 --- /dev/null +++ b/store/db/migration/prod/LATEST__SCHEMA.sql @@ -0,0 +1,141 @@ +-- drop all tables +DROP TABLE IF EXISTS `memo_organizer`; +DROP TABLE IF EXISTS `memo`; +DROP TABLE IF EXISTS `shortcut`; +DROP TABLE IF EXISTS `resource`; +DROP TABLE IF EXISTS `user`; + +-- user +CREATE TABLE user ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')), + updated_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')), + -- allowed row status are 'NORMAL', 'ARCHIVED'. + row_status TEXT NOT NULL CHECK (row_status IN ('NORMAL', 'ARCHIVED')) DEFAULT 'NORMAL', + email TEXT NOT NULL UNIQUE, + role TEXT NOT NULL CHECK (role IN ('HOST', 'USER')) DEFAULT 'USER', + name TEXT NOT NULL, + password_hash TEXT NOT NULL, + open_id TEXT NOT NULL UNIQUE +); + +INSERT INTO + sqlite_sequence (name, seq) +VALUES + ('user', 100); + +CREATE TRIGGER IF NOT EXISTS `trigger_update_user_modification_time` +AFTER +UPDATE + ON `user` FOR EACH ROW BEGIN +UPDATE + `user` +SET + updated_ts = (strftime('%s', 'now')) +WHERE + rowid = old.rowid; +END; + +-- memo +CREATE TABLE memo ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + creator_id INTEGER NOT NULL, + created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')), + updated_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')), + row_status TEXT NOT NULL CHECK (row_status IN ('NORMAL', 'ARCHIVED')) DEFAULT 'NORMAL', + content TEXT NOT NULL DEFAULT '', + visibility TEXT NOT NULL CHECK (visibility IN ('PUBLIC', 'PROTECTED', 'PRIVATE')) DEFAULT 'PRIVATE', + FOREIGN KEY(creator_id) REFERENCES user(id) ON DELETE CASCADE +); + +INSERT INTO + sqlite_sequence (name, seq) +VALUES + ('memo', 1000); + +CREATE TRIGGER IF NOT EXISTS `trigger_update_memo_modification_time` +AFTER +UPDATE + ON `memo` FOR EACH ROW BEGIN +UPDATE + `memo` +SET + updated_ts = (strftime('%s', 'now')) +WHERE + rowid = old.rowid; +END; + +-- memo_organizer +CREATE TABLE memo_organizer ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + memo_id INTEGER NOT NULL, + user_id INTEGER NOT NULL, + pinned INTEGER NOT NULL CHECK (pinned IN (0, 1)) DEFAULT 0, + FOREIGN KEY(memo_id) REFERENCES memo(id) ON DELETE CASCADE, + FOREIGN KEY(user_id) REFERENCES user(id) ON DELETE CASCADE, + UNIQUE(memo_id, user_id) +); + +INSERT INTO + sqlite_sequence (name, seq) +VALUES + ('memo_organizer', 1000); + +-- shortcut +CREATE TABLE shortcut ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + creator_id INTEGER NOT NULL, + created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')), + updated_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')), + row_status TEXT NOT NULL CHECK (row_status IN ('NORMAL', 'ARCHIVED')) DEFAULT 'NORMAL', + title TEXT NOT NULL DEFAULT '', + payload TEXT NOT NULL DEFAULT '{}', + FOREIGN KEY(creator_id) REFERENCES user(id) ON DELETE CASCADE +); + +INSERT INTO + sqlite_sequence (name, seq) +VALUES + ('shortcut', 10000); + +CREATE TRIGGER IF NOT EXISTS `trigger_update_shortcut_modification_time` +AFTER +UPDATE + ON `shortcut` FOR EACH ROW BEGIN +UPDATE + `shortcut` +SET + updated_ts = (strftime('%s', 'now')) +WHERE + rowid = old.rowid; +END; + +-- resource +CREATE TABLE resource ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + creator_id INTEGER NOT NULL, + created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')), + updated_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')), + filename TEXT NOT NULL DEFAULT '', + blob BLOB NOT NULL, + type TEXT NOT NULL DEFAULT '', + size INTEGER NOT NULL DEFAULT 0, + FOREIGN KEY(creator_id) REFERENCES user(id) ON DELETE CASCADE +); + +INSERT INTO + sqlite_sequence (name, seq) +VALUES + ('resource', 10000); + +CREATE TRIGGER IF NOT EXISTS `trigger_update_resource_modification_time` +AFTER +UPDATE + ON `resource` FOR EACH ROW BEGIN +UPDATE + `resource` +SET + updated_ts = (strftime('%s', 'now')) +WHERE + rowid = old.rowid; +END;