Added proper validation and logs in get expesne status, expenses type and payment mode APIs
This commit is contained in:
parent
809d64e296
commit
c881964ab1
@ -29,6 +29,7 @@ namespace Marco.Pms.Services.Controllers
|
||||
private readonly ILoggingService _logger;
|
||||
private readonly MasterHelper _masterHelper;
|
||||
private readonly IMasterService _masterService;
|
||||
private readonly Guid tenantId;
|
||||
public MasterController(ApplicationDbContext context, UserHelper userHelper, ILoggingService logger, MasterHelper masterHelper, IMasterService masterService)
|
||||
{
|
||||
_context = context;
|
||||
@ -36,9 +37,11 @@ namespace Marco.Pms.Services.Controllers
|
||||
_logger = logger;
|
||||
_masterHelper = masterHelper;
|
||||
_masterService = masterService;
|
||||
tenantId = userHelper.GetTenantId();
|
||||
}
|
||||
|
||||
// -------------------------------- Activity --------------------------------
|
||||
#region =================================================================== Activity APIs ===================================================================
|
||||
|
||||
[HttpGet]
|
||||
[Route("activities")]
|
||||
public async Task<IActionResult> GetActivitiesMaster()
|
||||
@ -189,7 +192,9 @@ namespace Marco.Pms.Services.Controllers
|
||||
return Ok(ApiResponse<object>.SuccessResponse(new { }, "Activity Deleted Successfully", 200));
|
||||
}
|
||||
|
||||
// -------------------------------- Industry --------------------------------
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Industry APIs ===================================================================
|
||||
|
||||
[HttpGet]
|
||||
[Route("industries")]
|
||||
@ -202,7 +207,9 @@ namespace Marco.Pms.Services.Controllers
|
||||
return Ok(ApiResponse<object>.SuccessResponse(industries, System.String.Format("{0} industry records fetched successfully", industries.Count), 200));
|
||||
}
|
||||
|
||||
// -------------------------------- Ticket Status --------------------------------
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Ticket Status APIs ===================================================================
|
||||
|
||||
[HttpGet("ticket-status")]
|
||||
public async Task<IActionResult> GetTicketStatusMaster()
|
||||
@ -289,7 +296,9 @@ namespace Marco.Pms.Services.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------- Ticket Type --------------------------------
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Ticket Type APIs ===================================================================
|
||||
|
||||
[HttpGet("ticket-types")]
|
||||
public async Task<IActionResult> GetTicketTypeMaster()
|
||||
@ -377,7 +386,9 @@ namespace Marco.Pms.Services.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------- Ticket Priority --------------------------------
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Ticket Priority APIs ===================================================================
|
||||
|
||||
[HttpGet("ticket-priorities")]
|
||||
public async Task<IActionResult> GetTicketPriorityMaster()
|
||||
@ -465,7 +476,9 @@ namespace Marco.Pms.Services.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------- Ticket Tag --------------------------------
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Ticket Tag APIs ===================================================================
|
||||
|
||||
[HttpGet("ticket-tags")]
|
||||
public async Task<IActionResult> GetTicketTagMaster()
|
||||
@ -553,7 +566,9 @@ namespace Marco.Pms.Services.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------- Work Category --------------------------------
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Work Category APIs ===================================================================
|
||||
|
||||
[HttpGet("work-categories")]
|
||||
public async Task<IActionResult> GetWorkCategoryMasterList()
|
||||
@ -674,7 +689,9 @@ namespace Marco.Pms.Services.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------- Work Status --------------------------------
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Work Status APIs ===================================================================
|
||||
|
||||
[HttpGet("work-status")]
|
||||
public async Task<IActionResult> GetWorkStatusMasterList()
|
||||
@ -713,7 +730,9 @@ namespace Marco.Pms.Services.Controllers
|
||||
return StatusCode(response.StatusCode, response);
|
||||
}
|
||||
|
||||
// -------------------------------- Contact Category --------------------------------
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Contact Category APIs ===================================================================
|
||||
|
||||
[HttpGet("contact-categories")]
|
||||
public async Task<IActionResult> GetContactCategoryMasterList()
|
||||
@ -782,7 +801,9 @@ namespace Marco.Pms.Services.Controllers
|
||||
return Ok(response);
|
||||
}
|
||||
|
||||
// -------------------------------- Contact Tag --------------------------------
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Contact Tag APIs ===================================================================
|
||||
|
||||
[HttpGet("contact-tags")]
|
||||
public async Task<IActionResult> GetContactTagMasterList()
|
||||
@ -791,12 +812,6 @@ namespace Marco.Pms.Services.Controllers
|
||||
return Ok(response);
|
||||
}
|
||||
|
||||
//[HttpGet("contact-tag/{id}")]
|
||||
//public async Task<IActionResult> GetContactTagMaster(Guid id)
|
||||
//{
|
||||
// return Ok();
|
||||
//}
|
||||
|
||||
[HttpPost("contact-tag")]
|
||||
public async Task<IActionResult> CreateContactTagMaster([FromBody] CreateContactTagDto contactTagDto)
|
||||
{
|
||||
@ -849,27 +864,34 @@ namespace Marco.Pms.Services.Controllers
|
||||
var response = await _masterHelper.DeleteContactTag(id);
|
||||
return Ok(response);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Expenses Type APIs ===================================================================
|
||||
|
||||
[HttpGet("expenses-types")]
|
||||
public async Task<IActionResult> GetExpenseTypeList()
|
||||
{
|
||||
var response = await _masterService.GetExpenseTypeListAsync();
|
||||
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||
var response = await _masterService.GetExpenseTypeListAsync(loggedInEmployee, tenantId);
|
||||
return StatusCode(response.StatusCode, response);
|
||||
}
|
||||
[HttpPost("expenses-type")]
|
||||
public async Task<IActionResult> CreateExpenseType(ExpensesTypeMasterDto dto)
|
||||
{
|
||||
var response = await _masterService.GetExpenseTypeListAsync();
|
||||
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||
var response = await _masterService.GetExpenseTypeListAsync(loggedInEmployee, tenantId);
|
||||
return StatusCode(response.StatusCode, response);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Expenses Status APIs ===================================================================
|
||||
|
||||
[HttpGet("expenses-status")]
|
||||
public async Task<IActionResult> GetExpenseStatusList()
|
||||
{
|
||||
var response = await _masterService.GetExpenseStatusListAsync();
|
||||
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||
var response = await _masterService.GetExpenseStatusListAsync(loggedInEmployee, tenantId);
|
||||
return StatusCode(response.StatusCode, response);
|
||||
}
|
||||
|
||||
@ -877,10 +899,12 @@ namespace Marco.Pms.Services.Controllers
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Payment mode APIs ===================================================================
|
||||
|
||||
[HttpGet("payment-modes")]
|
||||
public async Task<IActionResult> GetPaymentModeList()
|
||||
{
|
||||
var response = await _masterService.GetPaymentModeListAsync();
|
||||
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||
var response = await _masterService.GetPaymentModeListAsync(loggedInEmployee, tenantId);
|
||||
return StatusCode(response.StatusCode, response);
|
||||
}
|
||||
|
||||
|
||||
@ -1,11 +1,12 @@
|
||||
using AutoMapper;
|
||||
using Marco.Pms.DataAccess.Data;
|
||||
using Marco.Pms.Model.Dtos.Master;
|
||||
using Marco.Pms.Model.Employees;
|
||||
using Marco.Pms.Model.Entitlements;
|
||||
using Marco.Pms.Model.Master;
|
||||
using Marco.Pms.Model.Utilities;
|
||||
using Marco.Pms.Model.ViewModels.Master;
|
||||
using Marco.Pms.Services.Service.ServiceInterfaces;
|
||||
using MarcoBMS.Services.Helpers;
|
||||
using MarcoBMS.Services.Service;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
@ -15,36 +16,50 @@ namespace Marco.Pms.Services.Service
|
||||
{
|
||||
private readonly ApplicationDbContext _context;
|
||||
private readonly ILoggingService _logger;
|
||||
private readonly UserHelper _userHelper;
|
||||
private readonly PermissionServices _permission;
|
||||
private readonly IMapper _mapper;
|
||||
private readonly Guid tenantId;
|
||||
|
||||
public MasterService(
|
||||
ApplicationDbContext context,
|
||||
ILoggingService logger,
|
||||
UserHelper userHelper,
|
||||
PermissionServices permission,
|
||||
IMapper mapper)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
_userHelper = userHelper;
|
||||
_permission = permission;
|
||||
_mapper = mapper;
|
||||
tenantId = userHelper.GetTenantId();
|
||||
}
|
||||
|
||||
#region =================================================================== Expenses Type APIs ===================================================================
|
||||
|
||||
public async Task<ApiResponse<object>> GetExpenseTypeListAsync()
|
||||
public async Task<ApiResponse<object>> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId)
|
||||
{
|
||||
var typeList = await _context.ExpensesTypeMaster.Where(et => et.TenantId == tenantId).ToListAsync();
|
||||
return ApiResponse<object>.SuccessResponse(typeList);
|
||||
try
|
||||
{
|
||||
// Validation if employee is taking action in same tenant
|
||||
if (tenantId != loggedInEmployee.TenantId)
|
||||
{
|
||||
_logger.LogWarning("Employee {EmployeeId} attempted to fetch the list of expense type from different tenant", loggedInEmployee.Id);
|
||||
return ApiResponse<object>.ErrorResponse("Access Denied", "User do not have access for this information", 403);
|
||||
}
|
||||
public async Task<ApiResponse<object>> CreateExpenseTypeAsync(ExpensesTypeMasterDto dto)
|
||||
|
||||
// Featching the list of Expenses Type.
|
||||
var typeList = await _context.ExpensesTypeMaster.Where(et => et.TenantId == tenantId).ToListAsync();
|
||||
var response = _mapper.Map<List<ExpensesTypeMasterVM>>(typeList);
|
||||
|
||||
_logger.LogInfo("{Count} records of expense type have been fetched successfully by employee {EmployeeId}", response.Count, loggedInEmployee.Id);
|
||||
return ApiResponse<object>.SuccessResponse(response, $"{response.Count} records of expense type have been fetched successfully.", 200);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error occured while fetching list of expense type list by employee {EmployeeId}", loggedInEmployee.Id);
|
||||
return ApiResponse<object>.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500);
|
||||
}
|
||||
|
||||
}
|
||||
public async Task<ApiResponse<object>> CreateExpenseTypeAsync(ExpensesTypeMasterDto dto, Employee loggedInEmployee, Guid tenantId)
|
||||
{
|
||||
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||
var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id);
|
||||
if (!hasManagePermission)
|
||||
{
|
||||
@ -52,26 +67,105 @@ namespace Marco.Pms.Services.Service
|
||||
return ApiResponse<object>.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403);
|
||||
}
|
||||
var expensesType = _mapper.Map<ExpensesTypeMaster>(dto);
|
||||
return ApiResponse<object>.SuccessResponse(expensesType);
|
||||
_context.ExpensesTypeMaster.Add(expensesType);
|
||||
await _context.SaveChangesAsync();
|
||||
_logger.LogInfo("New Expense Type {ExpensesTypeId} was added by employee {EmployeeId}", expensesType.Id, loggedInEmployee.Id);
|
||||
|
||||
var response = _mapper.Map<ExpensesTypeMasterVM>(expensesType);
|
||||
return ApiResponse<object>.SuccessResponse(response, "Expense type craeted Successfully", 201);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Expenses Status APIs ===================================================================
|
||||
public async Task<ApiResponse<object>> GetExpenseStatusListAsync()
|
||||
public async Task<ApiResponse<object>> GetExpenseStatusListAsync(Employee loggedInEmployee, Guid tenantId)
|
||||
{
|
||||
var typeList = await _context.ExpensesStatusMaster.Where(et => et.TenantId == tenantId).ToListAsync();
|
||||
return ApiResponse<object>.SuccessResponse(typeList);
|
||||
|
||||
try
|
||||
{
|
||||
// Validation if employee is taking action in same tenant
|
||||
if (tenantId != loggedInEmployee.TenantId)
|
||||
{
|
||||
_logger.LogWarning("Employee {EmployeeId} attempted to fetch the list of expense status from different tenant", loggedInEmployee.Id);
|
||||
return ApiResponse<object>.ErrorResponse("Access Denied", "User do not have access for this information", 403);
|
||||
}
|
||||
|
||||
// Featching the list of Expenses Status.
|
||||
var statusList = await _context.ExpensesStatusMaster.Where(es => es.TenantId == tenantId).ToListAsync();
|
||||
var response = _mapper.Map<List<ExpensesStatusMasterVM>>(statusList);
|
||||
|
||||
var statusIds = statusList.Select(s => s.Id).ToList();
|
||||
var permissionStatusMapping = await _context.StatusPermissionMapping
|
||||
.Where(ps => statusIds.Contains(ps.StatusId))
|
||||
.GroupBy(ps => ps.StatusId)
|
||||
.Select(g => new
|
||||
{
|
||||
StatusId = g.Key,
|
||||
PermissionIds = g.Select(ps => ps.PermissionId).ToList()
|
||||
}).ToListAsync();
|
||||
|
||||
foreach (var status in response)
|
||||
{
|
||||
status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault();
|
||||
}
|
||||
|
||||
_logger.LogInfo("{Count} records of expense status have been fetched successfully by employee {EmployeeId}", response.Count, loggedInEmployee.Id);
|
||||
return ApiResponse<object>.SuccessResponse(response, $"{response.Count} records of expense status have been fetched successfully.", 200);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error occured while fetching list of expense sattus list by employee {EmployeeId}", loggedInEmployee.Id);
|
||||
return ApiResponse<object>.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Payment mode APIs ===================================================================
|
||||
public async Task<ApiResponse<object>> GetPaymentModeListAsync()
|
||||
public async Task<ApiResponse<object>> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId)
|
||||
{
|
||||
var typeList = await _context.PaymentModeMatser.Where(et => et.TenantId == tenantId).ToListAsync();
|
||||
return ApiResponse<object>.SuccessResponse(typeList);
|
||||
try
|
||||
{
|
||||
// Validation if employee is taking action in same tenant
|
||||
if (tenantId != loggedInEmployee.TenantId)
|
||||
{
|
||||
_logger.LogWarning("Employee {EmployeeId} attempted to fetch the list of payment modes from different tenant", loggedInEmployee.Id);
|
||||
return ApiResponse<object>.ErrorResponse("Access Denied", "User do not have access for this information", 403);
|
||||
}
|
||||
|
||||
// Featching the list of Payment Modes.
|
||||
var paymentModes = await _context.PaymentModeMatser.Where(pm => pm.TenantId == tenantId).ToListAsync();
|
||||
var response = _mapper.Map<List<PaymentModeMatserVM>>(paymentModes);
|
||||
|
||||
_logger.LogInfo("{Count} records of payment modes have been fetched successfully by employee {EmployeeId}", response.Count, loggedInEmployee.Id);
|
||||
return ApiResponse<object>.SuccessResponse(response, $"{response.Count} records of payment modes have been fetched successfully.", 200);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error occured while featching list of payment modes list by employee {EmployeeId}", loggedInEmployee.Id);
|
||||
return ApiResponse<object>.ErrorResponse("Internal Error occured while featching list of payment modes list", ExceptionMapper(ex), 500);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region =================================================================== Helper Function ===================================================================
|
||||
private static object ExceptionMapper(Exception ex)
|
||||
{
|
||||
return new
|
||||
{
|
||||
Message = ex.Message,
|
||||
StackTrace = ex.StackTrace,
|
||||
Source = ex.Source,
|
||||
InnerException = new
|
||||
{
|
||||
Message = ex.InnerException?.Message,
|
||||
StackTrace = ex.InnerException?.StackTrace,
|
||||
Source = ex.InnerException?.Source,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,11 +1,12 @@
|
||||
using Marco.Pms.Model.Utilities;
|
||||
using Marco.Pms.Model.Employees;
|
||||
using Marco.Pms.Model.Utilities;
|
||||
|
||||
namespace Marco.Pms.Services.Service.ServiceInterfaces
|
||||
{
|
||||
public interface IMasterService
|
||||
{
|
||||
Task<ApiResponse<object>> GetExpenseTypeListAsync();
|
||||
Task<ApiResponse<object>> GetExpenseStatusListAsync();
|
||||
Task<ApiResponse<object>> GetPaymentModeListAsync();
|
||||
Task<ApiResponse<object>> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId);
|
||||
Task<ApiResponse<object>> GetExpenseStatusListAsync(Employee loggedInEmployee, Guid tenantId);
|
||||
Task<ApiResponse<object>> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user