Compare commits
2 Commits
bb21f5858d
...
99d8bd6b80
Author | SHA1 | Date | |
---|---|---|---|
99d8bd6b80 | |||
3f67523ab1 |
@ -68,7 +68,6 @@ func (h *handler) CallbackHandler() gin.HandlerFunc {
|
|||||||
|
|
||||||
// Extract custom claims
|
// Extract custom claims
|
||||||
// TODO: extract role from claims
|
// TODO: extract role from claims
|
||||||
// TODO: currently username = email, add Email in User model
|
|
||||||
var claims struct {
|
var claims struct {
|
||||||
Email string `json:"email"`
|
Email string `json:"email"`
|
||||||
EmailVerified bool `json:"email_verified"`
|
EmailVerified bool `json:"email_verified"`
|
||||||
@ -85,7 +84,7 @@ func (h *handler) CallbackHandler() gin.HandlerFunc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check user existence
|
// Check user existence
|
||||||
u, status := h.user.ProfileOrCreate(&user.CreateData{UserName: claims.Email, NickName: claims.Nickname})
|
u, status := h.user.ProfileOrCreate(&user.CreateData{Email: claims.Email, NickName: claims.Nickname})
|
||||||
if status != e.Success {
|
if status != e.Success {
|
||||||
e.Pong[any](c, status, nil)
|
e.Pong[any](c, status, nil)
|
||||||
return
|
return
|
||||||
|
@ -5,10 +5,11 @@ import (
|
|||||||
"git.0x7f.app/WOJ/woj-server/internal/model"
|
"git.0x7f.app/WOJ/woj-server/internal/model"
|
||||||
"git.0x7f.app/WOJ/woj-server/internal/service/user"
|
"git.0x7f.app/WOJ/woj-server/internal/service/user"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
"net/mail"
|
||||||
)
|
)
|
||||||
|
|
||||||
type createRequest struct {
|
type createRequest struct {
|
||||||
UserName string `form:"username" json:"username" binding:"required"`
|
Email string `form:"email" json:"email" binding:"required"`
|
||||||
NickName string `form:"nickname" json:"nickname" binding:"required"`
|
NickName string `form:"nickname" json:"nickname" binding:"required"`
|
||||||
Password string `form:"password" json:"password" binding:"required"`
|
Password string `form:"password" json:"password" binding:"required"`
|
||||||
}
|
}
|
||||||
@ -19,7 +20,7 @@ type createRequest struct {
|
|||||||
// @Tags user
|
// @Tags user
|
||||||
// @Accept application/x-www-form-urlencoded
|
// @Accept application/x-www-form-urlencoded
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Param username formData string true "username"
|
// @Param email formData string true "email"
|
||||||
// @Param nickname formData string true "nickname"
|
// @Param nickname formData string true "nickname"
|
||||||
// @Param password formData string true "password"
|
// @Param password formData string true "password"
|
||||||
// @Response 200 {object} e.Response[string] "jwt token"
|
// @Response 200 {object} e.Response[string] "jwt token"
|
||||||
@ -31,9 +32,16 @@ func (h *handler) Create(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// verify email is valid
|
||||||
|
_, err := mail.ParseAddress(req.Email)
|
||||||
|
if err != nil {
|
||||||
|
e.Pong[any](c, e.InvalidParameter, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// create user
|
// create user
|
||||||
createData := &user.CreateData{
|
createData := &user.CreateData{
|
||||||
UserName: req.UserName,
|
Email: req.Email,
|
||||||
NickName: req.NickName,
|
NickName: req.NickName,
|
||||||
Password: req.Password,
|
Password: req.Password,
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type loginRequest struct {
|
type loginRequest struct {
|
||||||
UserName string `form:"username" json:"username" binding:"required"`
|
Email string `form:"email" json:"email" binding:"required"`
|
||||||
Password string `form:"password" json:"password" binding:"required"`
|
Password string `form:"password" json:"password" binding:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ type LoginResponse struct {
|
|||||||
// @Tags user
|
// @Tags user
|
||||||
// @Accept application/x-www-form-urlencoded
|
// @Accept application/x-www-form-urlencoded
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Param username formData string true "username"
|
// @Param email formData string true "email"
|
||||||
// @Param password formData string true "password"
|
// @Param password formData string true "password"
|
||||||
// @Response 200 {object} e.Response[LoginResponse] "jwt token and user's nickname"
|
// @Response 200 {object} e.Response[LoginResponse] "jwt token and user's nickname"
|
||||||
// @Router /v1/user/login [post]
|
// @Router /v1/user/login [post]
|
||||||
@ -36,7 +36,7 @@ func (h *handler) Login(c *gin.Context) {
|
|||||||
|
|
||||||
// check password
|
// check password
|
||||||
loginData := &user.LoginData{
|
loginData := &user.LoginData{
|
||||||
UserName: req.UserName,
|
Email: req.Email,
|
||||||
Password: req.Password,
|
Password: req.Password,
|
||||||
}
|
}
|
||||||
u, status := h.userService.Login(loginData)
|
u, status := h.userService.Login(loginData)
|
||||||
|
@ -6,8 +6,8 @@ import (
|
|||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
gorm.Model `json:"meta"`
|
gorm.Model `json:"meta"`
|
||||||
UserName string `json:"user_name" gorm:"not null;uniqueIndex"`
|
Email string `json:"email" gorm:"not null;uniqueIndex"`
|
||||||
NickName string `json:"nick_name" gorm:"not null"`
|
NickName string `json:"nick_name" gorm:"not null;uniqueIndex"`
|
||||||
Role Role `json:"role" gorm:"not null"`
|
Role Role `json:"role" gorm:"not null"`
|
||||||
Password []byte `json:"-"`
|
Password []byte `json:"-"`
|
||||||
IsEnabled bool `json:"is_enabled" gorm:"not null;index"`
|
IsEnabled bool `json:"is_enabled" gorm:"not null;index"`
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type CreateData struct {
|
type CreateData struct {
|
||||||
UserName string
|
Email string
|
||||||
NickName string
|
NickName string
|
||||||
Password string
|
Password string
|
||||||
}
|
}
|
||||||
@ -22,7 +22,7 @@ func (s *service) Create(data *CreateData) (*model.User, e.Status) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
user := &model.User{
|
user := &model.User{
|
||||||
UserName: data.UserName,
|
Email: data.Email,
|
||||||
NickName: data.NickName,
|
NickName: data.NickName,
|
||||||
Password: hashed,
|
Password: hashed,
|
||||||
Role: model.RoleGeneral,
|
Role: model.RoleGeneral,
|
||||||
|
@ -10,12 +10,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type LoginData struct {
|
type LoginData struct {
|
||||||
UserName string
|
Email string
|
||||||
Password string
|
Password string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) Login(data *LoginData) (*model.User, e.Status) {
|
func (s *service) Login(data *LoginData) (*model.User, e.Status) {
|
||||||
user := &model.User{UserName: data.UserName}
|
user := &model.User{Email: data.Email}
|
||||||
|
|
||||||
err := s.db.Get().Where(user).First(&user).Error
|
err := s.db.Get().Where(user).First(&user).Error
|
||||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
@ -25,7 +25,7 @@ func (s *service) Profile(uid uint) (*model.User, e.Status) {
|
|||||||
|
|
||||||
func (s *service) ProfileOrCreate(data *CreateData) (*model.User, e.Status) {
|
func (s *service) ProfileOrCreate(data *CreateData) (*model.User, e.Status) {
|
||||||
user := &model.User{
|
user := &model.User{
|
||||||
UserName: data.UserName,
|
Email: data.Email,
|
||||||
NickName: data.NickName,
|
NickName: data.NickName,
|
||||||
Role: model.RoleGeneral,
|
Role: model.RoleGeneral,
|
||||||
IsEnabled: true,
|
IsEnabled: true,
|
||||||
@ -33,7 +33,7 @@ func (s *service) ProfileOrCreate(data *CreateData) (*model.User, e.Status) {
|
|||||||
|
|
||||||
// Notice: FirstOrCreate will not update the record if it exists, and also we should not update the record
|
// Notice: FirstOrCreate will not update the record if it exists, and also we should not update the record
|
||||||
// Notice: OAuth2 created user will not have password
|
// Notice: OAuth2 created user will not have password
|
||||||
err := s.db.Get().Where(model.User{UserName: data.UserName}).FirstOrCreate(&user, data).Error
|
err := s.db.Get().Where(model.User{Email: data.Email}).FirstOrCreate(&user, data).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.log.Warn("DatabaseError", zap.Error(err), zap.Any("user", user))
|
s.log.Warn("DatabaseError", zap.Error(err), zap.Any("user", user))
|
||||||
return nil, e.DatabaseError
|
return nil, e.DatabaseError
|
||||||
|
Loading…
Reference in New Issue
Block a user