Adrià Vilanova MartÃnez | 25e1211 | 2021-08-25 13:48:06 +0200 | [diff] [blame^] | 1 | package db |
| 2 | |
| 3 | import ( |
| 4 | "context" |
| 5 | "database/sql" |
| 6 | "fmt" |
| 7 | |
| 8 | pb "gomodules.avm99963.com/twpt-server/api_proto" |
| 9 | ) |
| 10 | |
| 11 | func 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 | |
| 23 | func 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 | |
| 58 | func 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 | |
| 97 | func 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 | |
| 131 | func 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 | } |