117 lines
2.7 KiB
Go
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
|
|
}
|