Removed all Warnings from Services project

This commit is contained in:
ashutosh.nehete 2025-04-09 09:18:15 +05:30
parent ec5fba0637
commit 58bb684c4b
11 changed files with 128 additions and 105 deletions

View File

@ -1,8 +1,8 @@
using Marco.Pms.Model.Employees;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Entitlements;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
namespace Marco.Pms.Model.Projects
{

View File

@ -10,7 +10,6 @@ using MarcoBMS.Services.Helpers;
using Microsoft.AspNetCore.Mvc;
using Microsoft.CodeAnalysis;
using Microsoft.EntityFrameworkCore;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace MarcoBMS.Services.Controllers
{
@ -48,7 +47,7 @@ namespace MarcoBMS.Services.Controllers
List<AttendanceLog> lstAttendance = await _context.AttendanceLogs.Where(c => c.AttendanceId == attendanceid && c.TenantId == TenantId).ToListAsync();
return Ok(ApiResponse<object>.SuccessResponse(lstAttendance, String.Format("{0} Attendance records fetched successfully", lstAttendance.Count), 200));
return Ok(ApiResponse<object>.SuccessResponse(lstAttendance, System.String.Format("{0} Attendance records fetched successfully", lstAttendance.Count), 200));
}
[HttpGet("log/employee/{employeeid}")]

View File

@ -43,30 +43,29 @@ namespace MarcoBMS.Services.Controllers
{
var user = await _context.ApplicationUsers.FirstOrDefaultAsync(u => u.Email == loginDto.Username || u.PhoneNumber == loginDto.Username);
if (user == null || !await _userManager.CheckPasswordAsync(user, loginDto.Password))
if (user != null && await _userManager.CheckPasswordAsync(user, loginDto.Password))
{
return Unauthorized(ApiResponse<object>.ErrorResponse("Invalid username or password.", "Invalid username or password.", 401));
//return Unauthorized("Invalid username or password.");
if (!user.IsActive)
{
return BadRequest(ApiResponse<object>.ErrorResponse("User is In Active", "User is In Active", 400));
}
if (!user.EmailConfirmed)
{
return BadRequest(ApiResponse<object>.ErrorResponse("Your email is not verified, Please verify your email", "Your email is not verified, Please verify your email", 400));
}
Employee emp = await _employeeHelper.GetEmployeeByApplicationUserID(user.Id);
//var refreshToken = GenerateRefreshToken();
if (user.UserName == null) return NotFound(ApiResponse<object>.ErrorResponse("UserName Not found", "UserName Not found", 404)); ;
var token = _refreshTokenService.GenerateJwtToken(user.UserName, emp.TenantId.ToString(), _jwtSettings);
var refreshToken = await _refreshTokenService.CreateRefreshToken(user.Id, emp.TenantId.ToString(), _jwtSettings);
return Ok(ApiResponse<object>.SuccessResponse(new { token = token, refreshToken = refreshToken }, "User logged in successfully.", 200));
}
if (!user.IsActive)
{
return BadRequest(ApiResponse<object>.ErrorResponse("User is In Active", "User is In Active", 400));
//return BadRequest("User is In Active");
}
if (!user.EmailConfirmed)
{
return BadRequest(ApiResponse<object>.ErrorResponse("Your email is not verified, Please verify your email", "Your email is not verified, Please verify your email", 400));
//return BadRequest("Your email is not verified, Please verify your email");
}
Employee emp = await _employeeHelper.GetEmployeeByApplicationUserID(user.Id);
//var refreshToken = GenerateRefreshToken();
var token = _refreshTokenService.GenerateJwtToken(user.UserName, emp.TenantId.ToString(), _jwtSettings);
var refreshToken = await _refreshTokenService.CreateRefreshToken(user.Id, emp.TenantId.ToString(), _jwtSettings);
return Ok(ApiResponse<object>.SuccessResponse(new { token = token, refreshToken = refreshToken }, "User logged in successfully.", 200));
return Unauthorized(ApiResponse<object>.ErrorResponse("Invalid username or password.", "Invalid username or password.", 401));
}
[HttpPost("logout")]
@ -98,7 +97,7 @@ namespace MarcoBMS.Services.Controllers
catch (Exception ex)
{
// _logger.LogError(ex, "Error during logout");
return BadRequest(ApiResponse<object>.ErrorResponse("Internal server error", "Internal server error", 500));
return BadRequest(ApiResponse<object>.ErrorResponse("Internal server error", ex.Message, 500));
}
}
@ -121,6 +120,8 @@ namespace MarcoBMS.Services.Controllers
Employee emp = await _employeeHelper.GetEmployeeByApplicationUserID(user.Id);
if (user.UserName == null) return NotFound(ApiResponse<object>.ErrorResponse("UserName Not found", "UserName Not found", 404));
var newJwtToken = _refreshTokenService.GenerateJwtToken(user.UserName, emp.TenantId.ToString(), _jwtSettings);
var newRefreshToken = await _refreshTokenService.CreateRefreshToken(user.Id, emp.TenantId.ToString(), _jwtSettings);
@ -137,6 +138,9 @@ namespace MarcoBMS.Services.Controllers
/* SEND USER REGISTRATION MAIL*/
var token = await _userManager.GeneratePasswordResetTokenAsync(user);
var resetLink = $"{_configuration["AppSettings:WebFrontendUrl"]}/reset-password?token={WebUtility.UrlEncode(token)}";
if (user.Email == null) return NotFound(ApiResponse<object>.ErrorResponse("Email Not found", "Email Not found", 404));
await _emailSender.SendResetPasswordEmail(user.Email, "", resetLink);
@ -199,7 +203,7 @@ namespace MarcoBMS.Services.Controllers
var user = await _userManager.FindByEmailAsync(emailDot.ToEmail);
if (user == null)
{
return BadRequest(ApiResponse<object>.ErrorResponse("User not found.", "User not found.", 400));
return NotFound(ApiResponse<object>.ErrorResponse("User not found.", "User not found.", 404));
}
/* New User*/
@ -217,6 +221,9 @@ namespace MarcoBMS.Services.Controllers
var isTokenValid = await _userManager.VerifyUserTokenAsync(user, TokenOptions.DefaultProvider, "ResetPassword", token);
var resetLink = $"{_configuration["AppSettings:WebFrontendUrl"]}/reset-password?token={WebUtility.UrlEncode(token)}";
if (user.Email == null) return NotFound(ApiResponse<object>.ErrorResponse("Email Not found", "Email Not found", 404));
await _emailSender.SendResetPasswordEmail(user.Email, "", resetLink);
return Ok(ApiResponse<object>.SuccessResponse(new {}, "Password reset link sent.", 200));

View File

@ -57,7 +57,7 @@ namespace MarcoBMS.Services.Controllers
}
int tenantId = GetTenantId();
var empRoles = _context.EmployeeRoleMappings.Where(c => c.EmployeeId == employeeId).Include(c => c.Role).Include(c => c.Employee).ToList();
var empRoles = await _context.EmployeeRoleMappings.Where(c => c.EmployeeId == employeeId).Include(c => c.Role).Include(c => c.Employee).ToListAsync();
if (empRoles.Any())
{
List<EmployeeRolesVM> roles = new List<EmployeeRolesVM>();
@ -220,7 +220,7 @@ namespace MarcoBMS.Services.Controllers
// Create Employee record if missing
//Employee newEmployee = GetNewEmployeeModel(model, TenantId, existingUser.Id);
//_context.Employees.Add(newEmployee);
return BadRequest(ApiResponse<object>.ErrorResponse("You cannot use this email", "You cannot use this email", 400));
return BadRequest(ApiResponse<object>.ErrorResponse("Email already exist", "Email already exist", 400));
}
@ -276,8 +276,8 @@ namespace MarcoBMS.Services.Controllers
}
return Ok(ApiResponse<object>.SuccessResponse("Success.",responsemessage, 200));
}
private static Employee GetNewEmployeeModel(CreateUserDto model, int TenantId, string? ApplicationUserId)
#nullable disable
private static Employee GetNewEmployeeModel(CreateUserDto model, int TenantId, string ApplicationUserId)
{
var newEmployee = new Employee
{
@ -304,7 +304,7 @@ namespace MarcoBMS.Services.Controllers
return newEmployee;
}
private static Employee GetUpdateEmployeeModel(CreateUserDto model, Employee existingEmployee, IdentityUser? existingIdentityUser = null)
private static Employee GetUpdateEmployeeModel(CreateUserDto model, Employee existingEmployee, IdentityUser existingIdentityUser = null)
{
if (existingEmployee.ApplicationUserId == null && existingIdentityUser != null)
{

View File

@ -1,4 +1,6 @@
using Marco.Pms.DataAccess.Data;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel;
using Marco.Pms.DataAccess.Data;
using Marco.Pms.Model.Dtos.Project;
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Entitlements;
@ -9,8 +11,8 @@ using Marco.Pms.Model.ViewModels;
using Marco.Pms.Model.ViewModels.Employee;
using MarcoBMS.Services.Helpers;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using Microsoft.EntityFrameworkCore;
namespace MarcoBMS.Services.Controllers
@ -22,18 +24,18 @@ namespace MarcoBMS.Services.Controllers
{
//private readonly IUnitOfWork _unitOfWork;
private readonly ApplicationDbContext _context;
private ApplicationUser _applicationUser;
//private ApplicationUser _applicationUser;
// private readonly IProjectRepository _projectrepo;
private readonly UserManager<IdentityUser> _userManager;
//private readonly UserManager<IdentityUser> _userManager;
private readonly UserHelper _userHelper;
public ProjectController(UserManager<IdentityUser> userManager, ApplicationDbContext context, UserHelper userHelper)
public ProjectController(ApplicationDbContext context, UserHelper userHelper)
{
//_unitOfWork = unitOfWork;
_context = context;
//_projectrepo = projectrepo;
_userManager = userManager;
//_userManager = userManager;
_userHelper = userHelper;
}
[HttpGet("list")]
@ -67,7 +69,7 @@ namespace MarcoBMS.Services.Controllers
}
var project = await _context.Projects.Where(c => c.TenantId == _userHelper.GetTenantId() && c.Id == id).SingleOrDefaultAsync();
if (project == null) return NotFound(ApiResponse<object>.ErrorResponse("Project not found", "Project not found", 404));
return Ok(ApiResponse<object>.SuccessResponse(project, "Success.", 200));
}
@ -123,9 +125,12 @@ namespace MarcoBMS.Services.Controllers
foreach (WorkItem workItemDto in vm.workItems.Where(c => c.WorkAreaId == workAreaDto.Id).ToList())
{
WorkItemVM workItemVM = new WorkItemVM() { WorkItemId = workItemDto.Id, WorkItem = workItemDto };
workItemVM.WorkItem.WorkArea = null;
workItemVM.WorkItem.ActivityMaster.Tenant = null;
workItemVM.WorkItem.Tenant = null;
//workItemVM.WorkItem.WorkArea = null
workItemVM.WorkItem.WorkArea = new WorkArea ();
//workItemVM.WorkItem.ActivityMaster.Tenant = null;
workItemVM.WorkItem.ActivityMaster.Tenant = new Tenant();
//workItemVM.WorkItem.Tenant = null;
workItemVM.WorkItem.Tenant = new Tenant();
@ -282,7 +287,7 @@ namespace MarcoBMS.Services.Controllers
[HttpGet]
[Route("employees/get/{projectid?}/{includeInactive?}")]
public async Task<IActionResult> GetEmployeeByProjectID(int? projectid, bool? includeInactive = false)
public async Task<IActionResult> GetEmployeeByProjectID(int? projectid, bool includeInactive = false)
{
if (!ModelState.IsValid)
{
@ -371,13 +376,14 @@ namespace MarcoBMS.Services.Controllers
if (projectAllocationDot != null)
{
int TenentID = GetTenantId();
List<object>? result = new List<object>();
foreach (var item in projectAllocationDot)
{
try
{
ProjectAllocation projectAllocation = item.ToProjectAllocationFromProjectAllocationDto(TenentID);
ProjectAllocation projectAllocationFromDb = await _context.ProjectAllocations.Where(c => c.EmployeeId == projectAllocation.EmployeeId
ProjectAllocation? projectAllocationFromDb = await _context.ProjectAllocations.Where(c => c.EmployeeId == projectAllocation.EmployeeId
&& c.ProjectId == projectAllocation.ProjectId
&& c.ReAllocationDate == null
&& c.TenantId == TenentID).SingleOrDefaultAsync();
@ -401,7 +407,18 @@ namespace MarcoBMS.Services.Controllers
_context.Entry(projectAllocationFromDb).Property(e => e.IsActive).IsModified = true;
}
await _context.SaveChangesAsync();
var result1 = new
{
Id = projectAllocationFromDb.Id,
EmployeeId = projectAllocation.EmployeeId,
JobRoleId = projectAllocation.JobRoleId,
IsActive = projectAllocation.IsActive,
ProjectId = projectAllocation.ProjectId,
AllocationDate = projectAllocation.AllocationDate,
ReAllocationDate = projectAllocation.ReAllocationDate,
TenantId = projectAllocation.TenantId
};
result.Add(result1);
}
else
{
@ -416,7 +433,8 @@ namespace MarcoBMS.Services.Controllers
return Ok(ApiResponse<object>.ErrorResponse(ex.Message,ex, 400));
}
}
return Ok(ApiResponse<object>.SuccessResponse(null, "Data saved successfully.", 200));
return Ok(ApiResponse<object>.SuccessResponse(result, "Data saved successfully", 200));
}
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid details.", "Work Item Details are not valid." , 400));

View File

@ -67,14 +67,18 @@ namespace MarcoBMS.Services.Controllers
var response = taskAllocation.ToAssignTaskVMFromTaskAllocation();
var teamMembers = new List<TaskMembers> { };
foreach (var teamMember in assignTask.TaskTeam) {
var result = new TaskMembers
if (assignTask.TaskTeam != null)
{
foreach (var teamMember in assignTask.TaskTeam)
{
TaskAllocationId = taskAllocation.Id,
EmployeeId = teamMember,
TenantId = tenantId,
};
teamMembers.Add(result);
var result = new TaskMembers
{
TaskAllocationId = taskAllocation.Id,
EmployeeId = teamMember,
TenantId = tenantId,
};
teamMembers.Add(result);
}
}
_context.TaskMembers.AddRange(teamMembers);
await _context.SaveChangesAsync();

View File

@ -3,22 +3,23 @@ using Marco.Pms.DataAccess.Data;
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Mapper;
using Marco.Pms.Model.ViewModels.Employee;
using MarcoBMS.Services.Service;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Runtime.Intrinsics.Arm;
namespace MarcoBMS.Services.Helpers
{
public class EmployeeHelper
{
private readonly ApplicationDbContext _context;
public EmployeeHelper(ApplicationDbContext context)
private readonly ILoggingService _logger;
public EmployeeHelper(ApplicationDbContext context, ILoggingService logger)
{
_context = context;
_logger = logger;
}
public async Task<Employee> GetEmployeeByID(int EmployeeID)
{
return await _context.Employees.FindAsync(EmployeeID);
return await _context.Employees.FindAsync(EmployeeID) ?? new Employee { };
}
public async Task<Employee> GetEmployeeByApplicationUserID(string ApplicationUserID)
@ -27,11 +28,12 @@ namespace MarcoBMS.Services.Helpers
{
var result = await _context.Employees.Where(c => c.ApplicationUserId == ApplicationUserID).ToListAsync();
return await _context.Employees.Where(c => c.ApplicationUserId == ApplicationUserID).SingleOrDefaultAsync();
return await _context.Employees.Where(c => c.ApplicationUserId == ApplicationUserID).SingleOrDefaultAsync() ?? new Employee { };
}
catch (Exception ex)
{
return null;
_logger.LogError("{Error}", ex.Message);
return new Employee();
}
}
@ -63,6 +65,7 @@ namespace MarcoBMS.Services.Helpers
}
catch (Exception ex)
{
_logger.LogError("{Error}", ex.Message);
return new List<EmployeeVM>();
}
}
@ -93,6 +96,7 @@ namespace MarcoBMS.Services.Helpers
}
catch (Exception ex)
{
_logger.LogError("{Error}", ex.Message);
return new List<EmployeeVM>();
}
}

View File

@ -1,10 +1,8 @@
using Marco.Pms.DataAccess.Data;
using Marco.Pms.Model.Dtos.Employees;
using System.Security.Claims;
using Marco.Pms.DataAccess.Data;
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Entitlements;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using System.Security.Claims;
namespace MarcoBMS.Services.Helpers
{
@ -39,8 +37,9 @@ namespace MarcoBMS.Services.Helpers
public async Task<Employee> GetCurrentEmployeeAsync()
{
var user = await GetCurrentUserAsync();
if (user == null) return new Employee { };
var Employee = await _context.Employees.FirstOrDefaultAsync(e => e.ApplicationUserId == user.Id);
return Employee;
return Employee ?? new Employee { };
}
public async Task<object?> GetCurrentUserProfileAsync()
@ -58,16 +57,7 @@ namespace MarcoBMS.Services.Helpers
public async Task<IdentityUser?> GetRegisteredUser(string email)
{
//IdentityUser? user = await _userManager.Users
// .FirstOrDefaultAsync(u => u.Email == model.Email || u.PhoneNumber == model.PhoneNumber);
IdentityUser? user = await _userManager.FindByEmailAsync(email);
//if (user == null)
//{
// user = await _userManager.Find(model.Email);
//}
return user;
}
}

View File

@ -44,7 +44,7 @@ builder.Services.AddCors(options =>
{
options.AddPolicy("Policy", policy =>
{
if (allowedOrigins != null)
if (allowedOrigins != null && allowedMethods != null && allowedHeaders != null)
{
policy.WithOrigins(allowedOrigins)
.WithMethods(allowedMethods)
@ -93,7 +93,7 @@ builder.Services.AddTransient<IEmailSender, EmailSender>();
builder.Services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
string connString = builder.Configuration.GetConnectionString("DefaultConnectionString");
string? connString = builder.Configuration.GetConnectionString("DefaultConnectionString");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
{
@ -122,24 +122,27 @@ builder.Services.AddSingleton<ILoggingService, LoggingService>();
builder.Services.AddHttpContextAccessor();
var jwtSettings = builder.Configuration.GetSection("Jwt").Get<JwtSettings>();
builder.Services.AddAuthentication(options =>
if(jwtSettings != null)
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
builder.Services.AddAuthentication(options =>
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtSettings.Issuer,
ValidAudience = jwtSettings.Audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.Key))
};
});
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtSettings.Issuer,
ValidAudience = jwtSettings.Audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.Key))
};
});
}
builder.Services.AddSingleton(jwtSettings);

View File

@ -1,16 +1,11 @@
using Marco.Pms.DataAccess.Data;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Marco.Pms.DataAccess.Data;
using Marco.Pms.Model.Authentication;
using Marco.Pms.Model.Entitlements;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json.Linq;
using SharpCompress.Common;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Security.Cryptography;
using System.Text;
namespace MarcoBMS.Services.Service
@ -19,12 +14,14 @@ namespace MarcoBMS.Services.Service
{
private readonly ApplicationDbContext _context;
private readonly IMemoryCache _cache; // For optional JWT blacklisting
private readonly ILoggingService _logger;
public RefreshTokenService(ApplicationDbContext context, IMemoryCache cache)
public RefreshTokenService(ApplicationDbContext context, IMemoryCache cache, ILoggingService logger)
{
_context = context;
_cache = cache;
_logger = logger;
}
public string GenerateJwtToken(string username, string tenantId, JwtSettings _jwtSettings)
@ -94,13 +91,14 @@ namespace MarcoBMS.Services.Service
return strToken;
}catch(Exception ex)
{
_logger.LogError("{Error}", ex.Message);
throw;
}
}
public async Task<RefreshToken> GetRefreshToken(string token)
{
return await _context.RefreshTokens.FirstOrDefaultAsync(rt => rt.Token == token && !rt.IsRevoked && !rt.IsUsed);
return await _context.RefreshTokens.FirstOrDefaultAsync(rt => rt.Token == token && !rt.IsRevoked && !rt.IsUsed) ?? new RefreshToken();
}
public async Task MarkRefreshTokenAsUsed(RefreshToken refreshToken)

View File

@ -10,7 +10,7 @@
"Override": {
"Microsoft": "Warning",
"Microsoft.EntityFrameworkCore.Database.Command": "Warning",
"Microsoft.AspNetCore.Mvc.Infrastructure": "Warning",
"Microsoft.AspNetCore.Mvc.Infrastructure": "Warning"
//"Serilog.AspNetCore.RequestLoggingMiddleware": "Warning"
}
},
@ -64,7 +64,7 @@
"ConnectionStrings": {
// "DefaultConnectionString": "Server=103.50.160.45;User ID=marcowvh_admin;Password=Marcoemp@123;Database=marcowvh_empattendanceci",
"DefaultConnectionString": "Server=localhost;port=3306;User ID=root;Password=root;Database=MarcoBMS2",
"DefaultConnectionString": "Server=localhost;port=3306;User ID=root;Password=root;Database=MarcoBMS2"
//"DefaultConnectionString": "Server=147.93.98.152;User ID=devuser;Password=AppUser@123$;Database=MarcoBMS1"
},
"AppSettings": {