Files
go-tracker/internal/storage/user.go
2025-11-12 09:41:52 +03:00

109 lines
2.9 KiB
Go

package storage
import (
"context"
"fmt"
"github.com/jackc/pgx/v5"
"madsky.ru/go-tracker/internal/database"
"madsky.ru/go-tracker/internal/model/user"
)
type UserRepository interface {
FindByEmail(ctx context.Context, email string) (*user.User, error)
FindById(ctx context.Context, id uint32) (*user.User, error)
Create(ctx context.Context, user *user.User) (*user.User, error)
IsEmpty(ctx context.Context) (bool, error)
Update(ctx context.Context, id uint32, dto *user.UpdateUserDTO) (*user.User, error)
//Find(ctx context.Context) ([]*user.User, error)
//FindOne(ctx context.Context, id uint64) (*user.User, error)
//Create(ctx context.Context, dto *user.CreateUserDTO) (*user.User, error)
//Remove(ctx context.Context, id uint64) (uint64, error)
}
type UserStore struct {
client database.Client
}
func (us *UserStore) FindById(ctx context.Context, id uint32) (*user.User, error) {
query := `select id, email, name, password_hash, role
from users
where id = $1`
rows, _ := us.client.Query(ctx, query, id)
defer rows.Close()
u, err := pgx.CollectOneRow(rows, pgx.RowToStructByName[user.User])
if err != nil {
fmt.Println("CollectOneRow FindById User", err)
return nil, err
}
return &u, nil
}
func (us *UserStore) FindByEmail(ctx context.Context, email string) (*user.User, error) {
query := `select id, email, name, password_hash, role
from users
where email = $1`
rows, _ := us.client.Query(ctx, query, email)
defer rows.Close()
u, err := pgx.CollectOneRow(rows, pgx.RowToStructByName[user.User])
if err != nil {
fmt.Println("CollectOneRow FindByEmail User", err)
return nil, err
}
return &u, nil
}
func (us *UserStore) IsEmpty(ctx context.Context) (bool, error) {
query := "select count(id) from users limit 1"
rows, _ := us.client.Query(ctx, query)
defer rows.Close()
count, err := pgx.CollectOneRow(rows, pgx.RowTo[int])
if err != nil {
fmt.Println("CollectOneRow IsEmpty User", err)
return false, err
}
return count == 0, nil
}
func (us *UserStore) Create(ctx context.Context, dto *user.User) (*user.User, error) {
query := `insert into users (email, name, password_hash, role)
values ($1, $2, $3, $4)
returning id, name, email, password_hash, role`
rows, _ := us.client.Query(ctx, query, dto.Email, dto.Name, dto.PasswordHash, dto.Role)
defer rows.Close()
u, err := pgx.CollectOneRow(rows, pgx.RowToStructByName[user.User])
if err != nil {
fmt.Println("CollectOneRow Create User", err)
return nil, err
}
return &u, nil
}
func (us *UserStore) Update(ctx context.Context, id uint32, dto *user.UpdateUserDTO) (*user.User, error) {
query := `update users
set name = $1
where id = $2
returning id, email, name, password_hash, role`
rows, _ := us.client.Query(ctx, query, dto.Name, id)
defer rows.Close()
u, err := pgx.CollectOneRow(rows, pgx.RowToStructByName[user.User])
if err != nil {
fmt.Println("CollectOneRow Update User", err)
return nil, err
}
return &u, nil
}