| package db |
| |
| import ( |
| "context" |
| "database/sql" |
| "fmt" |
| |
| pb "gomodules.avm99963.com/twpt-server/api_proto" |
| ) |
| |
| func GetAuthorizedUserById(db *sql.DB, ctx context.Context, id int32) (*pb.KillSwitchAuthorizedUser, error) { |
| query := db.QueryRowContext(ctx, "SELECT user_id, google_uid, email, access_level FROM KillSwitchAuthorizedUser WHERE user_id = ?", id) |
| var u pb.KillSwitchAuthorizedUser |
| if err := query.Scan(&u.Id, &u.GoogleUid, &u.Email, &u.AccessLevel); err != nil { |
| if err == sql.ErrNoRows { |
| return nil, nil |
| } |
| return nil, fmt.Errorf("GetAuthorizedUserById: %v.", err) |
| } |
| return &u, nil |
| } |
| |
| func AddAuthorizedUser(db *sql.DB, ctx context.Context, u *pb.KillSwitchAuthorizedUser, currentUser *pb.KillSwitchAuthorizedUser) error { |
| tx, err := db.BeginTx(ctx, nil) |
| if err != nil { |
| return err |
| } |
| |
| result, err := db.ExecContext(ctx, "INSERT INTO KillSwitchAuthorizedUser (google_uid, email, access_level) VALUES (?, ?, ?)", u.GoogleUid, u.Email, u.AccessLevel) |
| if err != nil { |
| tx.Rollback() |
| return err |
| } |
| |
| id, err := result.LastInsertId() |
| if err != nil { |
| tx.Rollback() |
| return err |
| } |
| |
| u.Id = int32(id) |
| |
| logEntry := &pb.KillSwitchAuditLogEntry{ |
| User: currentUser, |
| Description: &pb.KillSwitchAuditLogEntry_AuthorizedUserAdded_{ |
| &pb.KillSwitchAuditLogEntry_AuthorizedUserAdded{ |
| User: u, |
| }, |
| }, |
| } |
| if err := AddKillSwitchAuditLogEntry(tx, ctx, logEntry); err != nil { |
| tx.Rollback() |
| return err |
| } |
| |
| return tx.Commit() |
| } |
| |
| func UpdateAuthorizedUser(db *sql.DB, ctx context.Context, id int32, newUser *pb.KillSwitchAuthorizedUser, currentUser *pb.KillSwitchAuthorizedUser) error { |
| oldUser, err := GetAuthorizedUserById(db, ctx, id) |
| if err != nil { |
| return err |
| } |
| if oldUser == nil { |
| return fmt.Errorf("Such user doesn't exist") |
| } |
| |
| tx, err := db.BeginTx(ctx, nil) |
| if err != nil { |
| return err |
| } |
| |
| 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 { |
| tx.Rollback() |
| return err |
| } |
| |
| newUser.Id = id |
| |
| logEntry := &pb.KillSwitchAuditLogEntry{ |
| User: currentUser, |
| Description: &pb.KillSwitchAuditLogEntry_AuthorizedUserUpdated_{ |
| &pb.KillSwitchAuditLogEntry_AuthorizedUserUpdated{ |
| Transformation: &pb.AuthorizedUserTransformation{ |
| Old: oldUser, |
| New: newUser, |
| }, |
| }, |
| }, |
| } |
| if err := AddKillSwitchAuditLogEntry(tx, ctx, logEntry); err != nil { |
| tx.Rollback() |
| return err |
| } |
| |
| return tx.Commit() |
| } |
| |
| func DeleteAuthorizedUser(db *sql.DB, ctx context.Context, id int32, currentUser *pb.KillSwitchAuthorizedUser) error { |
| u, err := GetAuthorizedUserById(db, ctx, id) |
| if err != nil { |
| return err |
| } |
| if u == nil { |
| return fmt.Errorf("Such user doesn't exist") |
| } |
| |
| tx, err := db.BeginTx(ctx, nil) |
| if err != nil { |
| return err |
| } |
| |
| if _, err := tx.ExecContext(ctx, "DELETE FROM KillSwitchAuthorizedUser WHERE user_id = ?", id); err != nil { |
| tx.Rollback() |
| return err |
| } |
| |
| logEntry := &pb.KillSwitchAuditLogEntry{ |
| User: currentUser, |
| Description: &pb.KillSwitchAuditLogEntry_AuthorizedUserDeleted_{ |
| &pb.KillSwitchAuditLogEntry_AuthorizedUserDeleted{ |
| OldUser: u, |
| }, |
| }, |
| } |
| if err := AddKillSwitchAuditLogEntry(tx, ctx, logEntry); err != nil { |
| tx.Rollback() |
| return err |
| } |
| |
| return tx.Commit() |
| } |
| |
| func ListAuthorizedUsers(db *sql.DB, ctx context.Context) ([]*pb.KillSwitchAuthorizedUser, error) { |
| var rows *sql.Rows |
| var err error |
| rows, err = db.QueryContext(ctx, "SELECT user_id, google_uid, email, access_level FROM KillSwitchAuthorizedUser") |
| if err != nil { |
| return nil, fmt.Errorf("ListAuthorizedUsers: %v", err) |
| } |
| defer rows.Close() |
| |
| var users []*pb.KillSwitchAuthorizedUser |
| for rows.Next() { |
| var u pb.KillSwitchAuthorizedUser |
| if err := rows.Scan(&u.Id, &u.GoogleUid, &u.Email, &u.AccessLevel); err != nil { |
| return nil, fmt.Errorf("ListAuthorizedUsers: %v", err) |
| } |
| users = append(users, &u) |
| } |
| if err := rows.Err(); err != nil { |
| return nil, fmt.Errorf("ListAuthorizedUsers: %v", err) |
| } |
| return users, nil |
| } |