56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
|
package bundb
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
|
||
|
"gitea.dwysokinski.me/twhelp/sessions/internal/bundb/internal/model"
|
||
|
"gitea.dwysokinski.me/twhelp/sessions/internal/domain"
|
||
|
"github.com/jackc/pgerrcode"
|
||
|
"github.com/uptrace/bun"
|
||
|
"github.com/uptrace/bun/driver/pgdriver"
|
||
|
)
|
||
|
|
||
|
type User struct {
|
||
|
db *bun.DB
|
||
|
}
|
||
|
|
||
|
func NewUser(db *bun.DB) *User {
|
||
|
return &User{db: db}
|
||
|
}
|
||
|
|
||
|
func (u *User) Create(ctx context.Context, params domain.CreateUserParams) (domain.User, error) {
|
||
|
user := model.NewUser(params)
|
||
|
|
||
|
if _, err := u.db.NewInsert().
|
||
|
Model(&user).
|
||
|
Returning("*").
|
||
|
Exec(ctx); err != nil {
|
||
|
return domain.User{}, fmt.Errorf(
|
||
|
"something went wrong while inserting user into the db: %w",
|
||
|
mapCreateUserError(err, params),
|
||
|
)
|
||
|
}
|
||
|
|
||
|
return user.ToDomain(), nil
|
||
|
}
|
||
|
|
||
|
func mapCreateUserError(err error, params domain.CreateUserParams) error {
|
||
|
var pgError pgdriver.Error
|
||
|
if !errors.As(err, &pgError) {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
code := pgError.Field('C')
|
||
|
constraint := pgError.Field('n')
|
||
|
switch {
|
||
|
case code == pgerrcode.UniqueViolation && constraint == "users_name_lower_key":
|
||
|
return domain.UsernameAlreadyTakenError{
|
||
|
Name: params.Name(),
|
||
|
}
|
||
|
default:
|
||
|
return err
|
||
|
}
|
||
|
}
|