blob: 13a272fc4286da5d8c991d3599a80cbaa3e9b980 [file] [log] [blame]
Adrià Vilanova Martínez25e12112021-08-25 13:48:06 +02001package db
2
3import (
4 "context"
5 "database/sql"
6 "fmt"
7
8 pb "gomodules.avm99963.com/twpt-server/api_proto"
9)
10
11func GetAuthorizedUserById(db *sql.DB, ctx context.Context, id int32) (*pb.KillSwitchAuthorizedUser, error) {
12 query := db.QueryRowContext(ctx, "SELECT user_id, google_uid, email, access_level FROM KillSwitchAuthorizedUser WHERE user_id = ?", id)
13 var u pb.KillSwitchAuthorizedUser
14 if err := query.Scan(&u.Id, &u.GoogleUid, &u.Email, &u.AccessLevel); err != nil {
15 if err == sql.ErrNoRows {
16 return nil, nil
17 }
18 return nil, fmt.Errorf("GetAuthorizedUserById: %v.", err)
19 }
20 return &u, nil
21}
22
23func AddAuthorizedUser(db *sql.DB, ctx context.Context, u *pb.KillSwitchAuthorizedUser) error {
24 tx, err := db.BeginTx(ctx, nil)
25 if err != nil {
26 return err
27 }
28
29 result, err := db.ExecContext(ctx, "INSERT INTO KillSwitchAuthorizedUser (google_uid, email, access_level) VALUES (?, ?, ?)", u.GoogleUid, u.Email, u.AccessLevel)
30 if err != nil {
31 tx.Rollback()
32 return err
33 }
34
35 id, err := result.LastInsertId()
36 if err != nil {
37 tx.Rollback()
38 return err
39 }
40
41 u.Id = int32(id)
42
43 logEntry := &pb.KillSwitchAuditLogEntry{
44 Description: &pb.KillSwitchAuditLogEntry_AuthorizedUserAdded_{
45 &pb.KillSwitchAuditLogEntry_AuthorizedUserAdded{
46 User: u,
47 },
48 },
49 }
50 if err := AddKillSwitchAuditLogEntry(tx, ctx, logEntry); err != nil {
51 tx.Rollback()
52 return err
53 }
54
55 return tx.Commit()
56}
57
58func UpdateAuthorizedUser(db *sql.DB, ctx context.Context, id int32, newUser *pb.KillSwitchAuthorizedUser) error {
59 oldUser, err := GetAuthorizedUserById(db, ctx, id)
60 if err != nil {
61 return err
62 }
63 if oldUser == nil {
64 return fmt.Errorf("Such user doesn't exist")
65 }
66
67 tx, err := db.BeginTx(ctx, nil)
68 if err != nil {
69 return err
70 }
71
72 if _, err := tx.ExecContext(ctx, "UPDATE KillSwitchAuthorizedUser SET google_uid = ?, email = ?, access_level = ? WHERE user_id = ?", newUser.GoogleUid, newUser.Email, newUser.AccessLevel, id); err != nil {
73 tx.Rollback()
74 return err
75 }
76
77 newUser.Id = id
78
79 logEntry := &pb.KillSwitchAuditLogEntry{
80 Description: &pb.KillSwitchAuditLogEntry_AuthorizedUserUpdated_{
81 &pb.KillSwitchAuditLogEntry_AuthorizedUserUpdated{
82 Transformation: &pb.AuthorizedUserTransformation{
83 Old: oldUser,
84 New: newUser,
85 },
86 },
87 },
88 }
89 if err := AddKillSwitchAuditLogEntry(tx, ctx, logEntry); err != nil {
90 tx.Rollback()
91 return err
92 }
93
94 return tx.Commit()
95}
96
97func DeleteAuthorizedUser(db *sql.DB, ctx context.Context, id int32) error {
98 u, err := GetAuthorizedUserById(db, ctx, id)
99 if err != nil {
100 return err
101 }
102 if u == nil {
103 return fmt.Errorf("Such user doesn't exist")
104 }
105
106 tx, err := db.BeginTx(ctx, nil)
107 if err != nil {
108 return err
109 }
110
111 if _, err := tx.ExecContext(ctx, "DELETE FROM KillSwitchAuthorizedUser WHERE user_id = ?", id); err != nil {
112 tx.Rollback()
113 return err
114 }
115
116 logEntry := &pb.KillSwitchAuditLogEntry{
117 Description: &pb.KillSwitchAuditLogEntry_AuthorizedUserDeleted_{
118 &pb.KillSwitchAuditLogEntry_AuthorizedUserDeleted{
119 OldUser: u,
120 },
121 },
122 }
123 if err := AddKillSwitchAuditLogEntry(tx, ctx, logEntry); err != nil {
124 tx.Rollback()
125 return err
126 }
127
128 return tx.Commit()
129}
130
131func ListAuthorizedUsers(db *sql.DB, ctx context.Context) ([]*pb.KillSwitchAuthorizedUser, error) {
132 var rows *sql.Rows
133 var err error
134 rows, err = db.QueryContext(ctx, "SELECT user_id, google_uid, email, access_level FROM KillSwitchAuthorizedUser")
135 if err != nil {
136 return nil, fmt.Errorf("ListAuthorizedUsers: %v", err)
137 }
138 defer rows.Close()
139
140 var users []*pb.KillSwitchAuthorizedUser
141 for rows.Next() {
142 var u pb.KillSwitchAuthorizedUser
143 if err := rows.Scan(&u.Id, &u.GoogleUid, &u.Email, &u.AccessLevel); err != nil {
144 return nil, fmt.Errorf("ListAuthorizedUsers: %v", err)
145 }
146 users = append(users, &u)
147 }
148 if err := rows.Err(); err != nil {
149 return nil, fmt.Errorf("ListAuthorizedUsers: %v", err)
150 }
151 return users, nil
152}