9 925168e0 2022-04-14 o type Alias struct {
10 925168e0 2022-04-14 o Recipient string
11 925168e0 2022-04-14 o Destination string
12 925168e0 2022-04-14 o Expiry time.Time
16 925168e0 2022-04-14 o type AliasStore interface {
17 925168e0 2022-04-14 o Create(dest string) (Alias, error)
18 925168e0 2022-04-14 o Aliases(dest string) ([]Alias, error)
19 925168e0 2022-04-14 o Delete(rcpt string) error
22 925168e0 2022-04-14 o type AliasDB struct {
24 925168e0 2022-04-14 o dictpath string
27 925168e0 2022-04-14 o func OpenAliasDB(name, dictpath string) (*AliasDB, error) {
28 925168e0 2022-04-14 o db, err := sql.Open("sqlite3", name)
29 925168e0 2022-04-14 o if err != nil {
30 925168e0 2022-04-14 o return nil, err
33 925168e0 2022-04-14 o CREATE TABLE IF NOT EXISTS aliases (
34 925168e0 2022-04-14 o recipient TEXT PRIMARY KEY,
35 925168e0 2022-04-14 o destination TEXT NOT NULL,
36 925168e0 2022-04-14 o expiry INTEGER,
39 925168e0 2022-04-14 o _, err = db.Exec(stmt)
40 925168e0 2022-04-14 o return &AliasDB{db, dictpath}, err
43 925168e0 2022-04-14 o func (db *AliasDB) Create(dest string) (Alias, error) {
44 925168e0 2022-04-14 o rcpt, err := RandomUsername(db.dictpath)
45 925168e0 2022-04-14 o if err != nil {
46 925168e0 2022-04-14 o return Alias{}, fmt.Errorf("create alias: %w", err)
48 925168e0 2022-04-14 o _, err = db.Exec("INSERT INTO aliases (recipient, destination) VALUES (?, ?)", rcpt, dest)
49 925168e0 2022-04-14 o if err != nil {
50 925168e0 2022-04-14 o return Alias{}, fmt.Errorf("create alias: %w", err)
52 925168e0 2022-04-14 o return Alias{Recipient: rcpt, Destination: dest}, nil
55 925168e0 2022-04-14 o func (db *AliasDB) Aliases(dest string) ([]Alias, error) {
56 925168e0 2022-04-14 o rows, err := db.Query("SELECT recipient, destination, expiry, note FROM aliases WHERE destination = ?", dest)
57 925168e0 2022-04-14 o if err != nil {
58 925168e0 2022-04-14 o return nil, fmt.Errorf("aliases for %s: %w", dest, err)
60 925168e0 2022-04-14 o defer rows.Close()
61 925168e0 2022-04-14 o var aliases []Alias
62 925168e0 2022-04-14 o for rows.Next() {
64 925168e0 2022-04-14 o var t sql.NullTime
65 925168e0 2022-04-14 o var note sql.NullString
66 925168e0 2022-04-14 o err := rows.Scan(&a.Recipient, &a.Destination, &t, ¬e)
67 925168e0 2022-04-14 o if err != nil {
68 925168e0 2022-04-14 o return aliases, err
71 925168e0 2022-04-14 o a.Expiry = t.Time
73 925168e0 2022-04-14 o if note.Valid {
74 925168e0 2022-04-14 o a.Note = note.String
76 925168e0 2022-04-14 o aliases = append(aliases, a)
78 925168e0 2022-04-14 o return aliases, rows.Err()
81 925168e0 2022-04-14 o func (db *AliasDB) Delete(rcpt string) error {
82 925168e0 2022-04-14 o _, err := db.Exec("DELETE FROM aliases WHERE recipient = ?", rcpt)
83 925168e0 2022-04-14 o if err != nil {
84 925168e0 2022-04-14 o return fmt.Errorf("delete %s: %w", rcpt, err)