Files
backend_fiesta/services/userService.go
2026-05-25 11:52:26 +05:30

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",
}
}