Files
drive/apps/backend/internal/user/service.go

77 lines
1.7 KiB
Go
Raw Normal View History

2025-11-26 01:09:42 +00:00
package user
import (
"context"
"database/sql"
"errors"
"github.com/get-drexa/drexa/internal/database"
"github.com/get-drexa/drexa/internal/password"
2025-11-26 01:09:42 +00:00
"github.com/google/uuid"
"github.com/uptrace/bun"
)
type Service struct{}
2025-11-26 01:09:42 +00:00
type UserRegistrationOptions struct {
Email string
DisplayName string
Password password.Hashed
}
func NewService() *Service {
return &Service{}
2025-11-26 01:09:42 +00:00
}
func (s *Service) RegisterUser(ctx context.Context, db bun.IDB, opts UserRegistrationOptions) (*User, error) {
uid, err := newUserID()
if err != nil {
return nil, err
}
u := User{
ID: uid,
Email: opts.Email,
DisplayName: opts.DisplayName,
Password: opts.Password,
}
_, err = db.NewInsert().Model(&u).Returning("*").Exec(ctx)
if err != nil {
if database.IsUniqueViolation(err) {
return nil, newAlreadyExistsError(u.Email)
}
return nil, err
}
return &u, nil
}
func (s *Service) UserByID(ctx context.Context, db bun.IDB, id uuid.UUID) (*User, error) {
2025-11-26 01:09:42 +00:00
var user User
err := db.NewSelect().Model(&user).Where("id = ?", id).Scan(ctx)
2025-11-26 01:09:42 +00:00
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return nil, newNotFoundError(id, "")
2025-11-26 01:09:42 +00:00
}
return nil, err
}
return &user, nil
}
func (s *Service) UserByEmail(ctx context.Context, db bun.IDB, email string) (*User, error) {
var user User
err := db.NewSelect().Model(&user).Where("email = ?", email).Scan(ctx)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return nil, newNotFoundError(uuid.Nil, email)
}
return nil, err
}
return &user, nil
}
func (s *Service) UserExistsByEmail(ctx context.Context, db bun.IDB, email string) (bool, error) {
return db.NewSelect().Model(&User{}).Where("email = ?", email).Exists(ctx)
}