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 }