113 lines
1.7 KiB
Go
113 lines
1.7 KiB
Go
package invites
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"time"
|
|
|
|
"git.tilde.town/tildetown/town/codes"
|
|
_ "github.com/mattn/go-sqlite3"
|
|
)
|
|
|
|
const (
|
|
dsn = "/town/var/invites/invites.db?mode=rw"
|
|
)
|
|
|
|
type Invite struct {
|
|
ID int64
|
|
Created time.Time
|
|
Code string
|
|
Email string
|
|
Used bool
|
|
}
|
|
|
|
func (i *Invite) Insert(db *sql.DB) error {
|
|
stmt, err := db.Prepare(`
|
|
INSERT INTO invites (code, email) VALUES (?, ?)
|
|
`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
i.Code = codes.NewCode(i.Email)
|
|
|
|
_, err = stmt.Exec(i.Code, i.Email)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
|
|
return nil
|
|
}
|
|
|
|
func ConnectDB() (*sql.DB, error) {
|
|
db, err := sql.Open("sqlite3", dsn)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return db, nil
|
|
}
|
|
|
|
func Get(db *sql.DB, code string) (*Invite, error) {
|
|
inv := &Invite{
|
|
Code: code,
|
|
}
|
|
var created string
|
|
var used int
|
|
stmt, err := db.Prepare(`
|
|
SELECT id, created, email, used
|
|
FROM invites WHERE code = ?`)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
row := stmt.QueryRow(code)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer stmt.Close()
|
|
|
|
err = row.Scan(
|
|
&inv.ID,
|
|
&created,
|
|
&inv.Email,
|
|
&used,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
inv.Created, err = time.Parse("2006-01-02T15:04", created)
|
|
if err != nil {
|
|
return inv, err
|
|
}
|
|
|
|
inv.Used = used > 0
|
|
|
|
return inv, nil
|
|
}
|
|
|
|
func (i *Invite) MarkUsed(db *sql.DB) (err error) {
|
|
var stmt *sql.Stmt
|
|
var result sql.Result
|
|
var rowsAffected int64
|
|
if stmt, err = db.Prepare(`UPDATE invites SET used = 1 WHERE id = ?`); err != nil {
|
|
return
|
|
}
|
|
|
|
if result, err = stmt.Exec(i.ID); err != nil {
|
|
return
|
|
}
|
|
|
|
if rowsAffected, err = result.RowsAffected(); err != nil {
|
|
return
|
|
}
|
|
|
|
if rowsAffected == 0 {
|
|
err = errors.New("no rows affected")
|
|
}
|
|
|
|
return
|
|
}
|