268 lines
6.5 KiB
Go
268 lines
6.5 KiB
Go
package services
|
|
|
|
import (
|
|
"errors"
|
|
"nearle/models"
|
|
"nearle/repositories"
|
|
"strings"
|
|
|
|
"github.com/gofiber/fiber"
|
|
)
|
|
|
|
type UserService interface {
|
|
GetAllUsers(roleID, tenantID, pageno, pagesize int, keyword string) ([]models.UserInfo, error)
|
|
GetUserByID(uid int) (models.UserInfo, error)
|
|
Login(user models.User) (models.UserInfo, error)
|
|
TenantLogin(user models.User) (models.TenantUserInfo, error)
|
|
UpdateStaff(user models.User) error
|
|
AppLogin(user models.User) (models.TenantUserInfo, fiber.Map, error)
|
|
CreateUser(user models.User) (models.UserInfo, error)
|
|
TenantWebLogin(user models.User) (models.TenantUserInfo, map[string]interface{})
|
|
}
|
|
|
|
type userService struct {
|
|
repo repositories.UserRepository
|
|
}
|
|
|
|
func NewUserService(repo repositories.UserRepository) UserService {
|
|
return &userService{repo: repo}
|
|
}
|
|
|
|
func (s *userService) GetAllUsers(roleID, tenantID, pageno, pagesize int, keyword string) ([]models.UserInfo, error) {
|
|
return s.repo.GetAllUsers(roleID, tenantID, pageno, pagesize, keyword)
|
|
}
|
|
|
|
func (s *userService) GetUserByID(uid int) (models.UserInfo, error) {
|
|
return s.repo.GetUserByID(uid)
|
|
}
|
|
|
|
func (s *userService) Login(user models.User) (models.UserInfo, error) {
|
|
return s.repo.Login(user)
|
|
}
|
|
|
|
func (s *userService) TenantLogin(user models.User) (models.TenantUserInfo, error) {
|
|
uid, err := s.repo.FindUserID(user.Authname, user.Contactno, user.Configid)
|
|
if err != nil {
|
|
return models.TenantUserInfo{}, err
|
|
}
|
|
|
|
if uid == 0 {
|
|
return models.TenantUserInfo{}, errors.New("user not found")
|
|
}
|
|
|
|
return s.repo.GetTenantUserByID(uid)
|
|
}
|
|
|
|
func (s *userService) UpdateStaff(user models.User) error {
|
|
return s.repo.UpdateStaff(user)
|
|
}
|
|
|
|
func (s *userService) AppLogin(user models.User) (models.TenantUserInfo, fiber.Map, error) {
|
|
var uid int
|
|
var status, dbPassword string
|
|
|
|
// Get user by authname or contactno
|
|
if user.Authname != "" {
|
|
uid, dbPassword, status = s.repo.GetUserByAuthname(user.Authname, user.Configid)
|
|
} else if user.Contactno != "" {
|
|
uid, dbPassword, status = s.repo.GetUserByContactNo(user.Contactno, user.Configid)
|
|
} else {
|
|
resp := fiber.Map{
|
|
"code": 400,
|
|
"status": false,
|
|
"message": "authname or contactno required",
|
|
}
|
|
return models.TenantUserInfo{}, resp, errors.New("missing authname or contactno")
|
|
}
|
|
|
|
// Invalid user
|
|
if uid == 0 {
|
|
resp := fiber.Map{
|
|
"status": false,
|
|
"code": 409,
|
|
"message": "Invalid Email",
|
|
"tenantform": true,
|
|
}
|
|
return models.TenantUserInfo{}, resp, errors.New("invalid user")
|
|
}
|
|
|
|
// Inactive account
|
|
if status == "InActive" {
|
|
resp := fiber.Map{
|
|
"status": false,
|
|
"code": 403,
|
|
"message": "Inactive Account. Contact admin.",
|
|
}
|
|
return models.TenantUserInfo{}, resp, errors.New("inactive account")
|
|
}
|
|
|
|
// No password set
|
|
if strings.TrimSpace(dbPassword) == "" {
|
|
resp := fiber.Map{
|
|
"status": true,
|
|
"code": 409,
|
|
"message": "Please setup a password.",
|
|
"tenantform": true,
|
|
"details": fiber.Map{
|
|
"userid": uid,
|
|
"setup": true,
|
|
},
|
|
}
|
|
return models.TenantUserInfo{}, resp, nil
|
|
}
|
|
|
|
// Empty request password
|
|
if strings.TrimSpace(user.Password) == "" {
|
|
resp := fiber.Map{
|
|
"status": true,
|
|
"code": 401,
|
|
"message": "Password is required",
|
|
"tenantform": true,
|
|
}
|
|
return models.TenantUserInfo{}, resp, nil
|
|
}
|
|
|
|
// Incorrect password
|
|
if user.Password != dbPassword {
|
|
resp := fiber.Map{
|
|
"status": false,
|
|
"code": 401,
|
|
"message": "Incorrect password",
|
|
"tenantform": true,
|
|
}
|
|
return models.TenantUserInfo{}, resp, errors.New("incorrect password")
|
|
}
|
|
|
|
// Update FCM token
|
|
if user.Userfcmtoken != "" {
|
|
_ = s.repo.UpdateFCMToken(uid, user.Userfcmtoken)
|
|
}
|
|
|
|
|
|
|
|
// ✅ Fetch tenant user info
|
|
info := s.repo.GetTenantUserById(uid)
|
|
|
|
// ✅ Return success response
|
|
resp := fiber.Map{
|
|
"status": true,
|
|
"code": 200,
|
|
"message": "Login successful",
|
|
"details": info,
|
|
}
|
|
|
|
return info, resp, nil
|
|
}
|
|
|
|
func (s *userService) CreateUser(user models.User) (models.UserInfo, error) {
|
|
// Call repository to create user
|
|
userid, err := s.repo.CreateUser(user)
|
|
if err != nil {
|
|
return models.UserInfo{}, err
|
|
}
|
|
|
|
// Get user info by id
|
|
info, err := s.repo.GetUserById(userid)
|
|
if err != nil {
|
|
return models.UserInfo{}, err
|
|
}
|
|
|
|
return info, nil
|
|
}
|
|
|
|
|
|
func (s *userService) TenantWebLogin(user models.User) (models.TenantUserInfo, map[string]interface{}) {
|
|
tenantFormExists := true
|
|
|
|
uid, dbPassword, status, roleid := 0, "", "", 0
|
|
|
|
// Step 1: Login by authname or contactno
|
|
if user.Authname != "" {
|
|
uid, dbPassword, status, roleid = s.repo.GetUserLogin("authname", user.Authname, user.Configid)
|
|
} else if user.Contactno != "" {
|
|
uid, dbPassword, status, roleid = s.repo.GetUserLogin("contactno", user.Contactno, user.Configid)
|
|
} else {
|
|
return models.TenantUserInfo{}, map[string]interface{}{
|
|
"status": true,
|
|
"code": 400,
|
|
"message": "authname or contactno required",
|
|
}
|
|
}
|
|
|
|
// Step 2: Validate user
|
|
if uid == 0 {
|
|
return models.TenantUserInfo{}, map[string]interface{}{
|
|
"status": false,
|
|
"code": 409,
|
|
"message": "Invalid Email",
|
|
"tenantform": tenantFormExists,
|
|
}
|
|
}
|
|
|
|
if status == "InActive" {
|
|
return models.TenantUserInfo{}, map[string]interface{}{
|
|
"status": false,
|
|
"code": 403,
|
|
"message": "Inactive Account. Contact admin.",
|
|
}
|
|
}
|
|
|
|
if user.Roleid != roleid {
|
|
return models.TenantUserInfo{}, map[string]interface{}{
|
|
"status": false,
|
|
"code": 403,
|
|
"message": "Unauthorized email.",
|
|
}
|
|
}
|
|
|
|
// Step 3: Password checks
|
|
if strings.TrimSpace(dbPassword) == "" {
|
|
return models.TenantUserInfo{}, map[string]interface{}{
|
|
"status": true,
|
|
"code": 409,
|
|
"message": "Please setup a password.",
|
|
"tenantform": tenantFormExists,
|
|
"details": map[string]interface{}{
|
|
"userid": uid,
|
|
"setup": true,
|
|
},
|
|
}
|
|
}
|
|
|
|
if strings.TrimSpace(user.Password) == "" {
|
|
return models.TenantUserInfo{}, map[string]interface{}{
|
|
"status": true,
|
|
"code": 401,
|
|
"message": "Password is required",
|
|
"tenantform": tenantFormExists,
|
|
}
|
|
}
|
|
|
|
if user.Password != dbPassword {
|
|
return models.TenantUserInfo{}, map[string]interface{}{
|
|
"status": false,
|
|
"code": 401,
|
|
"message": "Incorrect password",
|
|
"tenantform": tenantFormExists,
|
|
}
|
|
}
|
|
|
|
user.Userid = uid
|
|
|
|
// Step 4: Update FCM if provided
|
|
if user.Userfcmtoken != "" {
|
|
_ = s.repo.UpdateUserFcmToken(uid, user.Userfcmtoken)
|
|
}
|
|
|
|
// Step 5: Get full tenant info
|
|
info := s.repo.GetTenantUserById(uid)
|
|
|
|
return info, map[string]interface{}{
|
|
"status": true,
|
|
"code": 200,
|
|
"message": "Login successful",
|
|
}
|
|
}
|
|
|
|
|