From 7791fb10d84491294e4b45e6b4bd840784798b0e Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 5 Oct 2023 23:19:52 +0800 Subject: [PATCH] chore: update new db driver --- store/db/db.go | 18 ++- .../sqlite/migration/prod/LATEST__SCHEMA.sql | 135 ++++++++++++++++++ 2 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 store/db/sqlite/migration/prod/LATEST__SCHEMA.sql diff --git a/store/db/db.go b/store/db/db.go index bd636273..4367ccf6 100644 --- a/store/db/db.go +++ b/store/db/db.go @@ -13,13 +13,19 @@ import ( func NewDBDriver(profile *profile.Profile) (store.Driver, error) { var driver store.Driver var err error - switch profile.Driver { - case "sqlite": + + // As mysql driver is not fully implemented, we use sqlite for now in prod mode. + if profile.Mode == "prod" { driver, err = sqlite.NewDB(profile) - case "mysql": - driver, err = mysql.NewDB(profile) - default: - return nil, errors.New("unknown db driver") + } else { + switch profile.Driver { + case "sqlite": + driver, err = sqlite.NewDB(profile) + case "mysql": + driver, err = mysql.NewDB(profile) + default: + return nil, errors.New("unknown db driver") + } } if err != nil { return nil, errors.Wrap(err, "failed to create db driver") diff --git a/store/db/sqlite/migration/prod/LATEST__SCHEMA.sql b/store/db/sqlite/migration/prod/LATEST__SCHEMA.sql new file mode 100644 index 00000000..9b43e16a --- /dev/null +++ b/store/db/sqlite/migration/prod/LATEST__SCHEMA.sql @@ -0,0 +1,135 @@ +-- drop all tables first +DROP TABLE IF EXISTS migration_history; +DROP TABLE IF EXISTS system_setting; +DROP TABLE IF EXISTS user; +DROP TABLE IF EXISTS user_setting; +DROP TABLE IF EXISTS memo; +DROP TABLE IF EXISTS memo_organizer; +DROP TABLE IF EXISTS memo_relation; +DROP TABLE IF EXISTS resource; +DROP TABLE IF EXISTS tag; +DROP TABLE IF EXISTS activity; +DROP TABLE IF EXISTS storage; +DROP TABLE IF EXISTS idp; + +-- migration_history +CREATE TABLE migration_history ( + version TEXT NOT NULL PRIMARY KEY, + created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')) +); + +-- system_setting +CREATE TABLE system_setting ( + name TEXT NOT NULL, + value TEXT NOT NULL, + description TEXT NOT NULL DEFAULT '', + UNIQUE(name) +); + +-- 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')), + row_status TEXT NOT NULL CHECK (row_status IN ('NORMAL', 'ARCHIVED')) DEFAULT 'NORMAL', + username TEXT NOT NULL UNIQUE, + role TEXT NOT NULL CHECK (role IN ('HOST', 'ADMIN', 'USER')) DEFAULT 'USER', + email TEXT NOT NULL DEFAULT '', + nickname TEXT NOT NULL DEFAULT '', + password_hash TEXT NOT NULL, + avatar_url TEXT NOT NULL DEFAULT '' +); + +CREATE INDEX idx_user_username ON user (username); + +-- user_setting +CREATE TABLE user_setting ( + user_id INTEGER NOT NULL, + key TEXT NOT NULL, + value TEXT NOT NULL, + UNIQUE(user_id, key) +); + +-- 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' +); + +CREATE INDEX idx_memo_creator_id ON memo (creator_id); +CREATE INDEX idx_memo_content ON memo (content); +CREATE INDEX idx_memo_visibility ON memo (visibility); + +-- memo_organizer +CREATE TABLE memo_organizer ( + memo_id INTEGER NOT NULL, + user_id INTEGER NOT NULL, + pinned INTEGER NOT NULL CHECK (pinned IN (0, 1)) DEFAULT 0, + UNIQUE(memo_id, user_id) +); + +-- memo_relation +CREATE TABLE memo_relation ( + memo_id INTEGER NOT NULL, + related_memo_id INTEGER NOT NULL, + type TEXT NOT NULL, + UNIQUE(memo_id, related_memo_id, type) +); + +-- 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 DEFAULT NULL, + external_link TEXT NOT NULL DEFAULT '', + type TEXT NOT NULL DEFAULT '', + size INTEGER NOT NULL DEFAULT 0, + internal_path TEXT NOT NULL DEFAULT '', + memo_id INTEGER +); + +CREATE INDEX idx_resource_creator_id ON resource (creator_id); + +CREATE INDEX idx_resource_memo_id ON resource (memo_id); + +-- tag +CREATE TABLE tag ( + name TEXT NOT NULL, + creator_id INTEGER NOT NULL, + UNIQUE(name, creator_id) +); + +-- activity +CREATE TABLE activity ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + creator_id INTEGER NOT NULL, + created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')), + type TEXT NOT NULL DEFAULT '', + level TEXT NOT NULL CHECK (level IN ('INFO', 'WARN', 'ERROR')) DEFAULT 'INFO', + payload TEXT NOT NULL DEFAULT '{}' +); + +-- storage +CREATE TABLE storage ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + type TEXT NOT NULL, + config TEXT NOT NULL DEFAULT '{}' +); + +-- idp +CREATE TABLE idp ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + type TEXT NOT NULL, + identifier_filter TEXT NOT NULL DEFAULT '', + config TEXT NOT NULL DEFAULT '{}' +);