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}