120 lines
2.0 KiB
Go
120 lines
2.0 KiB
Go
|
// shared database related code
|
||
|
package models
|
||
|
|
||
|
import (
|
||
|
"database/sql"
|
||
|
"time"
|
||
|
|
||
|
_ "github.com/mattn/go-sqlite3"
|
||
|
)
|
||
|
|
||
|
// TODO this is in flux; might want SignupNote and UserNote structs separately
|
||
|
type AdminNote struct {
|
||
|
ID int64
|
||
|
Admin string
|
||
|
Note string
|
||
|
When time.Time
|
||
|
}
|
||
|
|
||
|
type SignupDecision string
|
||
|
|
||
|
const (
|
||
|
SignupAccepted SignupDecision = "accepted"
|
||
|
SignupRejected SignupDecision = "rejected"
|
||
|
)
|
||
|
|
||
|
// TODO add DecisionTime column to DB
|
||
|
// TODO add DecisionBy column to DB
|
||
|
// TODO add CleanEmail column to DB
|
||
|
type TownSignup struct {
|
||
|
ID int64
|
||
|
Created time.Time
|
||
|
Email string
|
||
|
How string
|
||
|
Why string
|
||
|
Links string
|
||
|
|
||
|
Notes []AdminNote
|
||
|
Decision SignupDecision
|
||
|
DecisionTime time.Time
|
||
|
DecidedBy string
|
||
|
CleanEmail string
|
||
|
}
|
||
|
|
||
|
func (s *TownSignup) Insert(db *sql.DB) error {
|
||
|
stmt, err := db.Prepare(`
|
||
|
INSERT INTO signups (created, email, how, why, links) VALUES(
|
||
|
?, ?, ?, ?, ?
|
||
|
) RETURNING id
|
||
|
`)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
result, err := stmt.Exec(s.Created.Unix(), s.Email, s.How, s.Why, s.Links)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
defer stmt.Close()
|
||
|
|
||
|
liid, err := result.LastInsertId()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
s.ID = liid
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (s *TownSignup) All(db *sql.DB) ([]*TownSignup, error) {
|
||
|
// TODO notes; circle back once can author them
|
||
|
rows, err := db.Query(`
|
||
|
SELECT
|
||
|
id, created, email, how, why, links
|
||
|
FROM signups WHERE decision = ""`)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
defer rows.Close()
|
||
|
out := []*TownSignup{}
|
||
|
for rows.Next() {
|
||
|
su := &TownSignup{}
|
||
|
if err = rows.Scan(
|
||
|
&su.ID,
|
||
|
&su.Created,
|
||
|
&su.Email,
|
||
|
&su.How,
|
||
|
&su.Why,
|
||
|
&su.Links,
|
||
|
); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
// TODO fetch notes
|
||
|
out = append(out, su)
|
||
|
}
|
||
|
|
||
|
return out, nil
|
||
|
}
|
||
|
|
||
|
// below is all TODO and unused rn
|
||
|
type UserState string
|
||
|
|
||
|
const (
|
||
|
StateActive = "active"
|
||
|
StateTempBan = "temp_banned"
|
||
|
StateBan = "banned"
|
||
|
)
|
||
|
|
||
|
type TownAccount struct {
|
||
|
ID int64
|
||
|
Emails []string
|
||
|
Username string
|
||
|
Signup int
|
||
|
Notes []AdminNote
|
||
|
State UserState
|
||
|
Admin bool
|
||
|
}
|