home to your local SPACEGIRL 馃挮
arimelody.space
1package controller
2
3import (
4 "arimelody-web/model"
5 "strings"
6
7 "github.com/jmoiron/sqlx"
8)
9
10func GetAllAccounts(db *sqlx.DB) ([]model.Account, error) {
11 var accounts = []model.Account{}
12
13 err := db.Select(&accounts, "SELECT * FROM account ORDER BY created_at ASC")
14 if err != nil {
15 return nil, err
16 }
17
18 return accounts, nil
19}
20
21func GetAccountByID(db *sqlx.DB, id string) (*model.Account, error) {
22 var account = model.Account{}
23
24 err := db.Get(&account, "SELECT * FROM account WHERE id=$1", id)
25 if err != nil {
26 if strings.Contains(err.Error(), "no rows") {
27 return nil, nil
28 }
29 return nil, err
30 }
31
32 return &account, nil
33}
34
35func GetAccountByUsername(db *sqlx.DB, username string) (*model.Account, error) {
36 var account = model.Account{}
37
38 err := db.Get(&account, "SELECT * FROM account WHERE username=$1", username)
39 if err != nil {
40 if strings.Contains(err.Error(), "no rows") {
41 return nil, nil
42 }
43 return nil, err
44 }
45
46 return &account, nil
47}
48
49func GetAccountByEmail(db *sqlx.DB, email string) (*model.Account, error) {
50 var account = model.Account{}
51
52 err := db.Get(&account, "SELECT * FROM account WHERE email=$1", email)
53 if err != nil {
54 if strings.Contains(err.Error(), "no rows") {
55 return nil, nil
56 }
57 return nil, err
58 }
59
60 return &account, nil
61}
62
63func GetAccountBySession(db *sqlx.DB, sessionToken string) (*model.Account, error) {
64 if sessionToken == "" { return nil, nil }
65
66 account := model.Account{}
67
68 err := db.Get(&account, "SELECT account.* FROM account JOIN token ON id=account WHERE token=$1", sessionToken)
69 if err != nil {
70 if strings.Contains(err.Error(), "no rows") {
71 return nil, nil
72 }
73 return nil, err
74 }
75
76 return &account, nil
77}
78
79func CreateAccount(db *sqlx.DB, account *model.Account) error {
80 err := db.Get(
81 &account.ID,
82 "INSERT INTO account (username, password, email, avatar_url) " +
83 "VALUES ($1, $2, $3, $4) " +
84 "RETURNING id",
85 account.Username,
86 account.Password,
87 account.Email,
88 account.AvatarURL,
89 )
90
91 return err
92}
93
94func UpdateAccount(db *sqlx.DB, account *model.Account) error {
95 _, err := db.Exec(
96 "UPDATE account " +
97 "SET username=$2,password=$3,email=$4,avatar_url=$5 " +
98 "WHERE id=$1",
99 account.ID,
100 account.Username,
101 account.Password,
102 account.Email,
103 account.AvatarURL,
104 )
105
106 return err
107}
108
109func DeleteAccount(db *sqlx.DB, accountID string) error {
110 _, err := db.Exec("DELETE FROM account WHERE id=$1", accountID)
111 return err
112}
113
114func IncrementAccountFails(db *sqlx.DB, accountID string) (bool, error) {
115 failAttempts := 0
116 err := db.Get(&failAttempts, "UPDATE account SET fail_attempts = fail_attempts + 1 WHERE id=$1 RETURNING fail_attempts", accountID)
117 if err != nil { return false, err }
118 locked := false
119 if failAttempts >= model.MAX_LOGIN_FAIL_ATTEMPTS {
120 err = LockAccount(db, accountID)
121 if err != nil { return false, err }
122 locked = true
123 }
124 return locked, err
125}
126
127func LockAccount(db *sqlx.DB, accountID string) error {
128 _, err := db.Exec("UPDATE account SET locked = true WHERE id=$1", accountID)
129 return err
130}
131
132func UnlockAccount(db *sqlx.DB, accountID string) error {
133 _, err := db.Exec("UPDATE account SET locked = false, fail_attempts = 0 WHERE id=$1", accountID)
134 return err
135}