Moved infra/ to internal/ sub-dir
This commit is contained in:
69
src/internal/infra/repository/user_repository.go
Normal file
69
src/internal/infra/repository/user_repository.go
Normal file
@@ -0,0 +1,69 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
entity "git.ego.freeddns.org/egommerce/api-entities/identity/entity"
|
||||
db "git.ego.freeddns.org/egommerce/go-api-pkg/database"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
)
|
||||
|
||||
type UserRepository struct {
|
||||
db *pgxpool.Pool
|
||||
}
|
||||
|
||||
func NewUserRepository(db *pgxpool.Pool) *UserRepository {
|
||||
return &UserRepository{db}
|
||||
}
|
||||
|
||||
func (r *UserRepository) FindByID(id string) (*entity.User, error) {
|
||||
var user entity.User
|
||||
|
||||
sql := `SELECT id, username, password, email, created_at FROM identity.users WHERE id=$1 LIMIT 1`
|
||||
err := r.db.QueryRow(context.Background(), sql, id).
|
||||
Scan(&user.ID, &user.Username, &user.Password, &user.Email, &user.CreatedAt)
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to fetch user from DB: " + err.Error())
|
||||
}
|
||||
|
||||
return &user, nil
|
||||
}
|
||||
|
||||
func (r *UserRepository) Create(user *entity.User) (string, error) {
|
||||
var id string
|
||||
|
||||
sql := `INSERT INTO identity.users(email, username, password) VALUES($1, $2, $3) LIMIT 1 RETURNING id`
|
||||
err := r.db.QueryRow(context.Background(), sql, user.Email, user.Username, user.Password).Scan(&id)
|
||||
if err != nil {
|
||||
if err = db.IsDuplicatedRow(err); err != nil {
|
||||
return "", errors.New("username/email is already taken")
|
||||
}
|
||||
|
||||
return "", errors.New("db error: " + err.Error())
|
||||
}
|
||||
|
||||
return id, nil
|
||||
}
|
||||
|
||||
func (r *UserRepository) Update(user *entity.User) (*entity.User, error) {
|
||||
return &entity.User{}, nil
|
||||
}
|
||||
|
||||
func (r *UserRepository) Delete(id int64) (bool, error) {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func (r *UserRepository) FindByUsername(login string) (*entity.User, error) {
|
||||
var user entity.User
|
||||
|
||||
sql := `SELECT id, username, password, email, created_at FROM identity.users WHERE username=$1 LIMIT 1`
|
||||
err := r.db.QueryRow(context.Background(), sql, login).
|
||||
Scan(&user.ID, &user.Username, &user.Password, &user.Email, &user.CreatedAt)
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to fetch user from DB: " + err.Error())
|
||||
}
|
||||
|
||||
return &user, nil
|
||||
}
|
||||
Reference in New Issue
Block a user