home to your local SPACEGIRL 馃挮
arimelody.space
1package controller
2
3import (
4 "arimelody-web/model"
5 "math/rand"
6 "strings"
7 "time"
8
9 "github.com/jmoiron/sqlx"
10)
11
12var inviteChars = []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
13
14func GetInvite(db *sqlx.DB, code string) (*model.Invite, error) {
15 invite := model.Invite{}
16
17 err := db.Get(&invite, "SELECT * FROM invite WHERE code=$1", code)
18 if err != nil {
19 if strings.Contains(err.Error(), "no rows") {
20 return nil, nil
21 }
22 return nil, err
23 }
24
25 return &invite, nil
26}
27
28func CreateInvite(db *sqlx.DB, length int, lifetime time.Duration) (*model.Invite, error) {
29 invite := model.Invite{
30 CreatedAt: time.Now(),
31 ExpiresAt: time.Now().Add(lifetime),
32 }
33
34 code := []byte{}
35 for i := 0; i < length; i++ {
36 code = append(code, inviteChars[rand.Intn(len(inviteChars) - 1)])
37 }
38 invite.Code = string(code)
39
40 _, err := db.Exec(
41 "INSERT INTO invite (code, created_at, expires_at) " +
42 "VALUES ($1, $2, $3)",
43 invite.Code,
44 invite.CreatedAt,
45 invite.ExpiresAt,
46 )
47 if err != nil {
48 return nil, err
49 }
50
51 return &invite, nil
52}
53
54func DeleteInvite(db *sqlx.DB, code string) error {
55 _, err := db.Exec("DELETE FROM invite WHERE code=$1", code)
56 return err
57}
58
59func DeleteAllInvites(db *sqlx.DB) error {
60 _, err := db.Exec("DELETE FROM invite")
61 return err
62}
63
64func DeleteExpiredInvites(db *sqlx.DB) error {
65 _, err := db.Exec("DELETE FROM invite WHERE expires_at<current_timestamp")
66 return err
67}