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 }