wpw-final/internal/biz/core/handler_auth.go
2022-12-02 20:40:23 +07:00

117 lines
2.7 KiB
Go

package coresvc
import (
"context"
"wpw-common/pkg/gen/biz/core"
"wpw-common/pkg/gen/biz/core/structs"
"github.com/gofiber/fiber/v2/middleware/session"
)
var _ core.CoreService = (*CoreService)(nil)
func (c *CoreService) Login(ctx context.Context, request *structs.LoginRequest) (r *structs.LoginResponse, err error) {
c.logger.Infow("login request", "req", request)
// alert := &structs.AlertInfo{}
// get session
var sess *session.Session
if sess, err = c.getSession(ctx); err != nil {
return
}
var userSession *structs.User
if userSession, err = c.checkSession(sess); err == ErrNotAuthenticated {
// login method don't need to be authenticated.
goto enter
} else if userSession != nil {
err = c.wrapServiceError(ErrInvalidState)
return
} else if err != nil {
err = c.wrapServiceError(err)
return
}
enter:
// validate the request
if err = c.checkRequest(ctx, request); err != nil {
return
}
// hash user psw input
var cipPsw = c.passwordHasher(request.Password)
var user structs.User
user.Username = request.Username
user.Password = cipPsw
// lookup for username and hashed psw input
tx := c.db.Where(&user).Preload("Roles").First(&user)
if err = tx.Error; err != nil {
err = c.wrapServiceError(err, "Login Error", "Username or password is incorrect")
return
}
r = structs.NewLoginResponse()
r.TrkToken = sess.ID()
// generate jwt token
if r.Token, err = c.generateJwtTokenForUser(&user, sess.ID()); err != nil {
err = c.wrapServiceError(err)
return
}
// strip confidental user data
c.stripConfidentialUserData(&user)
r.Profile = &user
// send track session token
sess.Set("user", &user)
if err = sess.Save(); err != nil {
err = c.wrapServiceError(err)
return
}
return
}
func (c *CoreService) Logout(ctx context.Context, request *structs.LogoutRequest) (r *structs.LogoutResponse, err error) {
c.logger.Infow("logout request", "req", request)
// get session
var sess *session.Session
if sess, err = c.getSession(ctx); err != nil {
return
}
// check session
var user *structs.User
if user, err = c.checkSession(sess); err != nil {
err = c.wrapServiceError(err)
return
}
c.logger.Infow("user logout", "user", user)
if err = sess.Destroy(); err != nil {
err = c.wrapServiceError(err)
return
}
r = structs.NewLogoutResponse()
return
}
func (c *CoreService) GetProfile(ctx context.Context, request *structs.GetProfileRequest) (r *structs.GetProfileResponse, err error) {
c.logger.Infow("get profile request", "req", request)
var sess *session.Session
if sess, err = c.getSession(ctx); err != nil {
return
}
var user *structs.User
if user, err = c.checkSession(sess); err != nil {
err = c.wrapServiceError(err)
return
}
r = structs.NewGetProfileResponse()
r.Profile = user
return
}