From 061f287e8c5b026962782690551af115bda826a0 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 17 Sep 2025 11:01:34 +0530 Subject: [PATCH] Added the API to get global services --- .../Controllers/MasterController.cs | 35 ++++ Marco.Pms.Services/Service/MasterService.cs | 167 ++++++++++++++++++ .../ServiceInterfaces/IMasterService.cs | 7 + 3 files changed, 209 insertions(+) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 7a6a48d..56f83a4 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -38,6 +38,41 @@ namespace Marco.Pms.Services.Controllers tenantId = userHelper.GetTenantId(); } + #region =================================================================== Global Services APIs =================================================================== + + [HttpGet("global-service/list")] + public async Task GetGlobalServices() + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.GetGlobalServicesAsync(loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + + [HttpPost("global-service/create")] + public async Task CreateGlobalService([FromBody] ServiceMasterDto serviceMasterDto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.CreateServiceAsync(serviceMasterDto, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + + [HttpPut("global-service/edit/{id}")] + public async Task UpdateGlobalService(Guid id, [FromBody] ServiceMasterDto serviceMasterDto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.UpdateServiceAsync(id, serviceMasterDto, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + + [HttpDelete("global-service/delete/{id}")] + public async Task DeleteGlobalService(Guid id, [FromQuery] bool active = false) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.DeleteServiceAsync(id, active, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + + #endregion #region =================================================================== Services APIs =================================================================== [HttpGet("service/list")] diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 538cb6d..0a5ed51 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -51,6 +51,173 @@ namespace Marco.Pms.Services.Service _cache = cache; } + #region =================================================================== Global Services APIs =================================================================== + public async Task> GetGlobalServicesAsync(Employee loggedInEmployee, Guid tenantId) + { + _logger.LogInfo("GetServices called"); + + try + { + // Step 1: Fetch global services + var services = await _context.GlobalServiceMasters.ToListAsync(); + + _logger.LogInfo("Fetched {Count} global service records for tenantId: {TenantId}", services.Count, tenantId); + + return ApiResponse.SuccessResponse(services, $"{services.Count} record(s) of services fetched successfully", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error fetching services"); + return ApiResponse.ErrorResponse("An error occurred while fetching services", ex.Message, 500); + } + } + + //public async Task> CreateGlobalServiceAsync(ServiceMasterDto serviceMasterDto, Employee loggedInEmployee, Guid tenantId) + //{ + // _logger.LogInfo("CreateService called with Name: {ServiceName}", serviceMasterDto.Name); + + // try + // { + // // Step 1: Permission check + // var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + // if (!hasManagePermission) + // { + // _logger.LogWarning("Access denied for employeeId: {EmployeeId}", loggedInEmployee.Id); + // return ApiResponse.ErrorResponse("You don't have access", "You don't have permission to take this action", 403); + // } + + // // Step 2: Check for duplicate name + // bool isExist = await _context.ServiceMasters + // .AnyAsync(s => s.TenantId == tenantId && s.Name == serviceMasterDto.Name); + + // if (isExist) + // { + // _logger.LogWarning("Duplicate service name '{ServiceName}' attempted by employeeId: {EmployeeId}", serviceMasterDto.Name, loggedInEmployee.Id); + // return ApiResponse.ErrorResponse( + // $"Service with name '{serviceMasterDto.Name}' already exists", + // $"Service with name '{serviceMasterDto.Name}' already exists", 400); + // } + + // // Step 3: Save new service + // ServiceMaster service = _mapper.Map(serviceMasterDto); + // service.TenantId = tenantId; + // service.IsActive = true; + // service.IsSystem = false; + // _context.ServiceMasters.Add(service); + // await _context.SaveChangesAsync(); + + // var response = _mapper.Map(service); + + // _logger.LogInfo("New service '{ServiceName}' created successfully by employeeId: {EmployeeId}", service.Name, loggedInEmployee.Id); + + // return ApiResponse.SuccessResponse(response, "New service created successfully", 201); + // } + // catch (Exception ex) + // { + // _logger.LogError(ex, "Error creating service"); + // return ApiResponse.ErrorResponse("Failed to create service", ex.Message, 500); + // } + //} + + //public async Task> UpdateGlobalServiceAsync(Guid id, ServiceMasterDto serviceMasterDto, Employee loggedInEmployee, Guid tenantId) + //{ + // _logger.LogInfo("UpdateService called for Id: {Id}", id); + + // try + // { + + // // Step 1: Permission check + // var hasPermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + // if (!hasPermission) + // { + // _logger.LogWarning("Access denied. EmployeeId: {EmployeeId} lacks Manage_Master permission.", loggedInEmployee.Id); + // return ApiResponse.ErrorResponse("Access denied", "You don't have permission to take this action", 403); + // } + + // // Step 2: Input validation + // if (serviceMasterDto.Id != id) + // { + // _logger.LogWarning("Invalid input data provided for UpdateService. Id: {Id}", id); + // return ApiResponse.ErrorResponse("Invalid input", "Please provide valid service data", 400); + // } + + // // Step 3: Retrieve service + // var service = await _context.ServiceMasters + // .FirstOrDefaultAsync(s => s.Id == id && s.TenantId == tenantId && s.IsActive); + + // if (service == null) + // { + // _logger.LogWarning("Service not found for Id: {Id}, Tenant: {TenantId}", id, tenantId); + // return ApiResponse.ErrorResponse("Service not found", "The requested service does not exist", 404); + // } + + // // Step 4: Update and save + // service.Name = serviceMasterDto.Name.Trim(); + // service.Description = serviceMasterDto.Description.Trim(); + + // await _context.SaveChangesAsync(); + + // var response = _mapper.Map(service); + + // _logger.LogInfo("Service updated successfully. Id: {Id}, TenantId: {TenantId}", service.Id, tenantId); + // return ApiResponse.SuccessResponse(response, "Service updated successfully", 200); + // } + // catch (Exception ex) + // { + // _logger.LogError(ex, "Error while updating service Id: {Id}.", id); + // return ApiResponse.ErrorResponse("An error occurred while updating the service", ex.Message, 500); + // } + //} + + //public async Task> DeleteGlobalServiceAsync(Guid id, bool active, Employee loggedInEmployee, Guid tenantId) + //{ + // _logger.LogInfo("DeleteService called with ServiceId: {ServiceId}, IsActive: {IsActive}", id, active); + + // try + // { + // // Step 1: Get validate permission + // var hasPermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + + // if (!hasPermission) + // { + // _logger.LogWarning("Access denied. EmployeeId: {EmployeeId} does not have Manage_Master permission.", loggedInEmployee.Id); + // return ApiResponse.ErrorResponse("Access denied", "You don't have permission to delete services", 403); + // } + + // // Step 2: Check if the service exists + // var service = await _context.ServiceMasters + // .FirstOrDefaultAsync(s => s.Id == id && s.TenantId == tenantId); + + // if (service == null) + // { + // _logger.LogWarning("Service not found. ServiceId: {ServiceId}", id); + // return ApiResponse.ErrorResponse("Service not found", "Service not found or already deleted", 404); + // } + + // // Protect system-defined service + // if (service.IsSystem) + // { + // _logger.LogWarning("Attempt to delete system-defined service. ServiceId: {ServiceId}", id); + // return ApiResponse.ErrorResponse("Cannot delete system-defined service", "This service is system-defined and cannot be deleted", 400); + // } + + // // Step 3: Soft delete or restore + // service.IsActive = active; + // await _context.SaveChangesAsync(); + + // var status = active ? "restored" : "deactivated"; + // _logger.LogInfo("Service {ServiceId} has been {Status} successfully by EmployeeId: {EmployeeId}", id, status, loggedInEmployee.Id); + + // return ApiResponse.SuccessResponse(new { }, $"Service {status} successfully", 200); + // } + // catch (Exception ex) + // { + // _logger.LogError(ex, "Unexpected error occurred while deleting service {ServiceId}", id); + // return ApiResponse.ErrorResponse("Error deleting service", ex.Message, 500); + // } + //} + + #endregion #region =================================================================== Services APIs =================================================================== public async Task> GetServicesAsync(Employee loggedInEmployee, Guid tenantId) { diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index bc3db69..6ec9ca8 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -7,6 +7,13 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { public interface IMasterService { + #region =================================================================== Service Master APIs =================================================================== + Task> GetGlobalServicesAsync(Employee loggedInEmployee, Guid tenantId); + //Task> CreateGlobalServiceAsync(ServiceMasterDto serviceMasterDto, Employee loggedInEmployee, Guid tenantId); + //Task> UpdateGlobalServiceAsync(Guid id, ServiceMasterDto serviceMasterDto, Employee loggedInEmployee, Guid tenantId); + //Task> DeleteGlobalServiceAsync(Guid id, bool active, Employee loggedInEmployee, Guid tenantId); + + #endregion #region =================================================================== Service Master APIs =================================================================== Task> GetServicesAsync(Employee loggedInEmployee, Guid tenantId); Task> CreateServiceAsync(ServiceMasterDto serviceMasterDto, Employee loggedInEmployee, Guid tenantId);