aboutsummaryrefslogtreecommitdiff
path: root/repository/user.go
diff options
context:
space:
mode:
Diffstat (limited to 'repository/user.go')
-rw-r--r--repository/user.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/repository/user.go b/repository/user.go
new file mode 100644
index 0000000..ec3b702
--- /dev/null
+++ b/repository/user.go
@@ -0,0 +1,54 @@
+package repository
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/uptrace/bun"
+ "gitrepo.ru/neonxp/gorum/models"
+ "golang.org/x/crypto/bcrypt"
+)
+
+type User struct {
+ db *bun.DB
+}
+
+func NewUser(db *bun.DB) *User {
+ return &User{
+ db: db,
+ }
+}
+
+func (u *User) Create(ctx context.Context, email, password, username string) (int, error) {
+
+ hpassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
+ if err != nil {
+ return 0, models.ErrInvalidPassword
+ }
+
+ user := &models.User{
+ Email: email,
+ Password: string(hpassword),
+ Username: username,
+ }
+
+ if _, err := u.db.NewInsert().Model(user).Returning("id").Exec(ctx); err != nil {
+ return 0, models.ErrUserAlreadyExists
+ }
+
+ return user.ID, nil
+}
+
+func (u *User) Login(ctx context.Context, email, password string) (*models.User, error) {
+ user := new(models.User)
+
+ if err := u.db.NewSelect().Model(user).Where("email = ?", email).Scan(ctx); err != nil {
+ return nil, fmt.Errorf("user not found: %w", models.ErrInvalidUserOrPassword)
+ }
+
+ if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil {
+ return nil, fmt.Errorf("invalid password: %w", models.ErrInvalidUserOrPassword)
+ }
+
+ return user, nil
+}