initial commit
This commit is contained in:
267
services/userService.go
Normal file
267
services/userService.go
Normal file
@@ -0,0 +1,267 @@
|
||||
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",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user