From 8d531936a1b0b6fbedf186038f43f3fda8d78a78 Mon Sep 17 00:00:00 2001 From: vilmibm Date: Mon, 6 Mar 2023 03:04:27 +0000 Subject: [PATCH] WIP inserting users --- sql/{create_user_db.sql => create_towndb.sql} | 5 +- towndb/towndb.go | 56 +++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) rename sql/{create_user_db.sql => create_towndb.sql} (82%) diff --git a/sql/create_user_db.sql b/sql/create_towndb.sql similarity index 82% rename from sql/create_user_db.sql rename to sql/create_towndb.sql index 38854e2..de0a2ee 100644 --- a/sql/create_user_db.sql +++ b/sql/create_towndb.sql @@ -9,16 +9,17 @@ CREATE TABLE IF NOT EXISTS users ( FOREIGN KEY (signupid) REFERENCES signups(signupid) ); +-- TODO address /should/ be unique but leaving it duplicable for now since i can think of some cases where there might be >1 account for the same human CREATE TABLE IF NOT EXISTS emails ( id INTEGER PRIMARY KEY, - address TEXT UNIQUE, + address TEXT, userid INTEGER, FOREIGN KEY (userid) REFERENCES users(userid) ); CREATE TABLE IF NOT EXISTS user_notes ( - noteid INTEGER, + noteid INTEGER, userid INTEGER, PRIMARY KEY (noteid, userid), diff --git a/towndb/towndb.go b/towndb/towndb.go index f009e41..f57ab42 100644 --- a/towndb/towndb.go +++ b/towndb/towndb.go @@ -59,6 +59,7 @@ func (n *AdminNote) Insert(db *sql.DB) error { type TownUser struct { ID int64 + Created time.Time Emails []string Username string Notes []AdminNote @@ -66,6 +67,61 @@ type TownUser struct { IsAdmin bool } +func (u *TownUser) Insert(db *sql.DB) (err error) { + var tx *sql.Tx + var stmt *sql.Stmt + var result sql.Result + var liid int64 + + if tx, err = db.Begin(); err != nil { + return err + } + + defer func() { + if err != nil { + tx.Rollback() + } + }() + + u.Created = time.Now() + if stmt, err = tx.Prepare(` + INSERT INTO notes (created, username, state, admin) + VALUES ( ?, ?, ?, ?)`); err != nil { + return err + } + + if result, err = stmt.Exec( + u.Created.Unix(), + u.Username, + u.State, + u.IsAdmin); err != nil { + return err + } + + if liid, err = result.LastInsertId(); err != nil { + return err + } + + u.ID = liid + + if len(u.Emails) > 0 { + for _, e := range u.Emails { + if stmt, err = tx.Prepare(` + INSERT INTO emails (address, userid) + VALUES (?, ?)`); err != nil { + return err + } + if result, err = stmt.Exec(e, u.ID); err != nil { + return err + } + } + } + + tx.Commit() + + return nil +} + func ConnectDB() (*sql.DB, error) { db, err := sql.Open("sqlite3", dsn) if err != nil {