portal/service/account_service.go

99 lines
2.7 KiB
Go
Raw Normal View History

2023-04-29 17:38:21 +00:00
package service
import (
"errors"
"git.lumeweb.com/LumeWeb/portal/db"
"git.lumeweb.com/LumeWeb/portal/model"
_validator "git.lumeweb.com/LumeWeb/portal/validator"
"github.com/go-playground/validator/v10"
2023-04-29 17:38:21 +00:00
"github.com/kataras/iris/v12"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
"reflect"
2023-04-29 17:38:21 +00:00
)
type AccountService struct {
2023-04-30 07:29:24 +00:00
Ctx iris.Context
2023-04-29 17:38:21 +00:00
}
type RegisterRequest struct {
Email string `json:"email" validate:"required"`
2023-04-29 17:38:21 +00:00
Password string `json:"password"`
Pubkey []byte `json:"pubkey"`
}
func init() {
jsonValidator := _validator.Get()
jsonValidator.RegisterStructValidation(ValidateRegisterRequest, RegisterRequest{})
}
func ValidateRegisterRequest(structLevel validator.StructLevel) {
request := structLevel.Current().Interface().(RegisterRequest)
if len(request.Pubkey) == 0 && len(request.Password) == 0 {
structLevel.ReportError(reflect.ValueOf(request.Email), "Email", "email", "emailorpubkey", "")
structLevel.ReportError(reflect.ValueOf(request.Pubkey), "Pubkey", "pubkey", "emailorpubkey", "")
}
}
2023-04-29 17:38:21 +00:00
func hashPassword(password string) (string, error) {
// Generate a new bcrypt hash from the provided password.
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return "", err
}
// Convert the hashed password to a string and return it.
return string(hashedPassword), nil
}
func (a *AccountService) PostRegister() {
var r RegisterRequest
2023-04-30 07:29:24 +00:00
if err := a.Ctx.ReadJSON(&r); err != nil {
a.Ctx.StopWithError(iris.StatusBadRequest, err)
2023-04-29 17:38:21 +00:00
return
}
// Hash the password before saving it to the database.
hashedPassword, err := hashPassword(r.Password)
if err != nil {
2023-04-30 07:29:24 +00:00
a.Ctx.StopWithError(iris.StatusInternalServerError, err)
2023-04-29 17:38:21 +00:00
return
}
// Check if an account with the same email address already exists.
existingAccount := model.Account{}
err = db.Get().Where("email = ?", r.Email).First(&existingAccount).Error
if err == nil {
// An account with the same email address already exists.
// Return an error response to the client.
2023-04-30 07:29:24 +00:00
a.Ctx.StopWithError(iris.StatusConflict, errors.New("an account with this email address already exists"))
2023-04-29 17:38:21 +00:00
return
} else if !errors.Is(err, gorm.ErrRecordNotFound) {
// An unexpected error occurred while querying the database.
// Return an error response to the client.
2023-04-30 07:29:24 +00:00
a.Ctx.StopWithError(iris.StatusInternalServerError, err)
2023-04-29 17:38:21 +00:00
return
}
// Create a new Account model with the provided email and hashed password.
account := model.Account{
Email: r.Email,
Password: &hashedPassword,
}
// Save the new account to the database.
err = db.Get().Create(&account).Error
if err != nil {
2023-04-30 07:29:24 +00:00
a.Ctx.StopWithError(iris.StatusInternalServerError, err)
2023-04-29 17:38:21 +00:00
return
}
// Return a success response to the client.
2023-04-30 07:29:24 +00:00
a.Ctx.StatusCode(iris.StatusCreated)
2023-04-29 17:38:21 +00:00
}