A community based topic aggregation platform built on atproto
1package postgres 2 3import ( 4 "database/sql" 5 "fmt" 6 7 "Coves/internal/core/users" 8) 9 10type PostgresUserRepo struct { 11 db *sql.DB 12} 13 14func NewUserRepository(db *sql.DB) users.UserRepository { 15 return &PostgresUserRepo{db: db} 16} 17 18func (r *PostgresUserRepo) Create(user *users.User) (*users.User, error) { 19 query := ` 20 INSERT INTO users (email, username) 21 VALUES ($1, $2) 22 RETURNING id, email, username, created_at, updated_at` 23 24 err := r.db.QueryRow(query, user.Email, user.Username). 25 Scan(&user.ID, &user.Email, &user.Username, &user.CreatedAt, &user.UpdatedAt) 26 27 if err != nil { 28 return nil, fmt.Errorf("repository: failed to create user: %w", err) 29 } 30 31 return user, nil 32} 33 34func (r *PostgresUserRepo) GetByID(id int) (*users.User, error) { 35 user := &users.User{} 36 query := `SELECT id, email, username, created_at, updated_at FROM users WHERE id = $1` 37 38 err := r.db.QueryRow(query, id). 39 Scan(&user.ID, &user.Email, &user.Username, &user.CreatedAt, &user.UpdatedAt) 40 41 if err == sql.ErrNoRows { 42 return nil, fmt.Errorf("repository: user not found") 43 } 44 if err != nil { 45 return nil, fmt.Errorf("repository: failed to get user: %w", err) 46 } 47 48 return user, nil 49} 50 51func (r *PostgresUserRepo) GetByEmail(email string) (*users.User, error) { 52 user := &users.User{} 53 query := `SELECT id, email, username, created_at, updated_at FROM users WHERE email = $1` 54 55 err := r.db.QueryRow(query, email). 56 Scan(&user.ID, &user.Email, &user.Username, &user.CreatedAt, &user.UpdatedAt) 57 58 if err == sql.ErrNoRows { 59 return nil, fmt.Errorf("repository: user not found") 60 } 61 if err != nil { 62 return nil, fmt.Errorf("repository: failed to get user by email: %w", err) 63 } 64 65 return user, nil 66} 67 68func (r *PostgresUserRepo) GetByUsername(username string) (*users.User, error) { 69 user := &users.User{} 70 query := `SELECT id, email, username, created_at, updated_at FROM users WHERE username = $1` 71 72 err := r.db.QueryRow(query, username). 73 Scan(&user.ID, &user.Email, &user.Username, &user.CreatedAt, &user.UpdatedAt) 74 75 if err == sql.ErrNoRows { 76 return nil, fmt.Errorf("repository: user not found") 77 } 78 if err != nil { 79 return nil, fmt.Errorf("repository: failed to get user by username: %w", err) 80 } 81 82 return user, nil 83} 84 85func (r *PostgresUserRepo) Update(user *users.User) (*users.User, error) { 86 query := ` 87 UPDATE users 88 SET email = $2, username = $3, updated_at = CURRENT_TIMESTAMP 89 WHERE id = $1 90 RETURNING id, email, username, created_at, updated_at` 91 92 err := r.db.QueryRow(query, user.ID, user.Email, user.Username). 93 Scan(&user.ID, &user.Email, &user.Username, &user.CreatedAt, &user.UpdatedAt) 94 95 if err == sql.ErrNoRows { 96 return nil, fmt.Errorf("repository: user not found") 97 } 98 if err != nil { 99 return nil, fmt.Errorf("repository: failed to update user: %w", err) 100 } 101 102 return user, nil 103} 104 105func (r *PostgresUserRepo) Delete(id int) error { 106 query := `DELETE FROM users WHERE id = $1` 107 108 result, err := r.db.Exec(query, id) 109 if err != nil { 110 return fmt.Errorf("repository: failed to delete user: %w", err) 111 } 112 113 rowsAffected, err := result.RowsAffected() 114 if err != nil { 115 return fmt.Errorf("repository: failed to get rows affected: %w", err) 116 } 117 118 if rowsAffected == 0 { 119 return fmt.Errorf("repository: user not found") 120 } 121 122 return nil 123}