Skip to content

Commit 9bf30ef

Browse files
committed
feat: Add user register
1 parent 5d9ca60 commit 9bf30ef

File tree

5 files changed

+129
-0
lines changed

5 files changed

+129
-0
lines changed

cmd/api/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"github.com/foss-opensolace/api.opensolace.com/internal/api/service"
45
"github.com/foss-opensolace/api.opensolace.com/internal/app"
56
"github.com/foss-opensolace/api.opensolace.com/internal/config"
67
"github.com/foss-opensolace/api.opensolace.com/internal/db"
@@ -9,5 +10,6 @@ import (
910
func main() {
1011
config.New()
1112
db.New()
13+
service.New()
1214
app.New()
1315
}

internal/api/controller/router.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ func (c *controller) v1() {
2121
group := c.instance.Group("/v1")
2222

2323
v1.NewMetricRouter(group)
24+
v1.NewAuthRouter(group)
2425
}

internal/api/controller/v1/auth.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package v1
2+
3+
import (
4+
"errors"
5+
6+
"github.com/foss-opensolace/api.opensolace.com/internal/api/model/dto"
7+
"github.com/foss-opensolace/api.opensolace.com/internal/api/service"
8+
"github.com/foss-opensolace/api.opensolace.com/pkg/jwt"
9+
"github.com/foss-opensolace/api.opensolace.com/pkg/validate"
10+
"github.com/gofiber/fiber/v2"
11+
"github.com/hashicorp/go-multierror"
12+
"gorm.io/gorm"
13+
)
14+
15+
func NewAuthRouter(router fiber.Router) {
16+
group := router.Group("/auth")
17+
18+
group.Post("/register", authRegisterHandler())
19+
}
20+
21+
func authRegisterHandler() fiber.Handler {
22+
return func(c *fiber.Ctx) error {
23+
var body dto.UserRegister
24+
25+
if err := c.BodyParser(&body); err != nil {
26+
return err
27+
}
28+
29+
if err := validate.Struct(&body); err != nil {
30+
if errs, ok := err.(*multierror.Error); ok {
31+
return c.Status(fiber.StatusBadRequest).JSON(errs.Errors)
32+
}
33+
34+
return fiber.ErrInternalServerError
35+
}
36+
37+
user, err := service.User.Create(&body)
38+
if err != nil {
39+
if errors.Is(err, gorm.ErrDuplicatedKey) {
40+
return c.Status(fiber.StatusConflict).SendString("A user with that username or email already exists")
41+
}
42+
43+
return err
44+
}
45+
46+
token, err := jwt.GenerateJWT(user.ID)
47+
if err != nil {
48+
return err
49+
}
50+
51+
return c.Status(fiber.StatusCreated).JSON(fiber.Map{"token": token})
52+
}
53+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package repository
2+
3+
import (
4+
"github.com/foss-opensolace/api.opensolace.com/internal/api/model"
5+
"github.com/foss-opensolace/api.opensolace.com/internal/api/model/dto"
6+
"golang.org/x/crypto/bcrypt"
7+
"gorm.io/gorm"
8+
)
9+
10+
type userRepository struct {
11+
db *gorm.DB
12+
}
13+
14+
type UserRepository interface {
15+
Create(obj *dto.UserRegister) (*model.User, error)
16+
}
17+
18+
func NewUserRepository(postgres *gorm.DB) UserRepository {
19+
return userRepository{db: postgres}
20+
}
21+
22+
func (u userRepository) Create(obj *dto.UserRegister) (*model.User, error) {
23+
var displayName *string
24+
25+
if obj.DisplayName != "" {
26+
displayName = &obj.DisplayName
27+
}
28+
29+
newUser := model.User{
30+
DisplayName: displayName,
31+
Username: obj.Username,
32+
Email: obj.Email,
33+
}
34+
35+
var user *model.User
36+
if err := u.db.First(&user, "username = ? OR email = ?", newUser.Username, newUser.Email).Error; err == nil {
37+
return nil, gorm.ErrDuplicatedKey
38+
}
39+
40+
if hashed, err := bcrypt.GenerateFromPassword([]byte(obj.Password), bcrypt.DefaultCost); err != nil {
41+
return nil, err
42+
} else {
43+
newUser.Password = string(hashed)
44+
}
45+
46+
transaction := u.db.Begin()
47+
48+
if err := transaction.Create(&newUser).Error; err != nil {
49+
transaction.Rollback()
50+
return nil, err
51+
}
52+
53+
if err := transaction.Commit().Error; err != nil {
54+
transaction.Rollback()
55+
return nil, err
56+
}
57+
58+
return &newUser, nil
59+
}

internal/api/service/service.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package service
2+
3+
import (
4+
"github.com/foss-opensolace/api.opensolace.com/internal/api/service/repository"
5+
"github.com/foss-opensolace/api.opensolace.com/internal/db"
6+
)
7+
8+
var (
9+
User repository.UserRepository
10+
)
11+
12+
func New() {
13+
User = repository.NewUserRepository(db.Postgres)
14+
}

0 commit comments

Comments
 (0)