diff --git a/server/cmd/main.go b/server/cmd/main.go index 5be35b8..cde32a3 100644 --- a/server/cmd/main.go +++ b/server/cmd/main.go @@ -2,6 +2,7 @@ package main import ( "database/sql" + _ "embed" "encoding/json" "flag" "fmt" @@ -12,6 +13,9 @@ import ( _ "github.com/mattn/go-sqlite3" ) +//go:embed schema.sql +var schemaSQL string + type Config struct { Admins []string Port int @@ -88,6 +92,11 @@ func _main(opts *Opts) error { } defer teardown() + err = ensureSchema(*opts, "1.0.0") + if err != nil { + return err + } + setupAPI(*opts) // TODO TLS or SSL or something @@ -99,6 +108,17 @@ func _main(opts *Opts) error { return nil } +func ensureSchema(opts Opts, version string) error { + // TODO make idempotent + // TODO actually respect version + _, err := opts.DB.Exec(schemaSQL) + if err != nil { + return fmt.Errorf("failed to initialize database schema: %w", err) + } + + return nil +} + func handler(opts Opts, f http.HandlerFunc) http.HandlerFunc { // TODO make this more real return func(w http.ResponseWriter, req *http.Request) { diff --git a/server/cmd/schema.sql b/server/cmd/schema.sql new file mode 100644 index 0000000..43474d8 --- /dev/null +++ b/server/cmd/schema.sql @@ -0,0 +1,37 @@ +create table meta ( + version text -- schema version +); + +create table users ( + user_id text, -- string (uuid1) + user_name text, -- string + auth_hash text, -- string (sha256 hash) + quip text, -- string (possibly empty) + bio text, -- string (possibly empty) + color int, -- int (from 0 to 6) + is_admin int, -- bool + created real -- floating point unix timestamp (when this user registered) +); + + +create table threads ( + thread_id text, -- uuid string + author text, -- string (uuid1, user.user_id) + title text, -- string + last_mod real, -- floating point unix timestamp (of last post or post edit) + created real, -- floating point unix timestamp (when thread was made) + reply_count int, -- integer (incremental, starting with 0) + pinned int, -- boolean + last_author text -- uuid string +); + + +create table messages ( + thread_id text, -- string (uuid1 of parent thread) + post_id int, -- integer (incrementing from 1) + author text, -- string (uuid1, user.user_id) + created real, -- floating point unix timestamp (when reply was posted) + edited int, -- bool + body text, -- string + send_raw int -- bool (1/true == never apply formatting) +);