diff --git a/DadmehrGostar.sln b/DadmehrGostar.sln index 358d6d87..f31d5bcb 100644 --- a/DadmehrGostar.sln +++ b/DadmehrGostar.sln @@ -104,6 +104,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GozareshgirProgramManager.D EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GozareshgirProgramManager.Infrastructure", "ProgramManager\src\Infrastructure\GozareshgirProgramManager.Infrastructure\GozareshgirProgramManager.Infrastructure.csproj", "{408281FE-615F-4CBE-BD95-2E86F5ACC6C3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared.Contracts", "Shared.Contracts\Shared.Contracts.csproj", "{08B234B6-783B-44E9-9961-4F97EAD16308}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -226,6 +228,10 @@ Global {408281FE-615F-4CBE-BD95-2E86F5ACC6C3}.Debug|Any CPU.Build.0 = Debug|Any CPU {408281FE-615F-4CBE-BD95-2E86F5ACC6C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {408281FE-615F-4CBE-BD95-2E86F5ACC6C3}.Release|Any CPU.Build.0 = Release|Any CPU + {08B234B6-783B-44E9-9961-4F97EAD16308}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {08B234B6-783B-44E9-9961-4F97EAD16308}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08B234B6-783B-44E9-9961-4F97EAD16308}.Release|Any CPU.ActiveCfg = Release|Any CPU + {08B234B6-783B-44E9-9961-4F97EAD16308}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/GozareshgirProgramManager.Application.csproj b/ProgramManager/src/Application/GozareshgirProgramManager.Application/GozareshgirProgramManager.Application.csproj index e20615bf..41ec592d 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/GozareshgirProgramManager.Application.csproj +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/GozareshgirProgramManager.Application.csproj @@ -14,6 +14,7 @@ + diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Checkouts/Commands/CreateCheckout/CreateOrEditCheckoutCommandHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Checkouts/Commands/CreateCheckout/CreateOrEditCheckoutCommandHandler.cs index d7704b1f..3536ad0e 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Checkouts/Commands/CreateCheckout/CreateOrEditCheckoutCommandHandler.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Checkouts/Commands/CreateCheckout/CreateOrEditCheckoutCommandHandler.cs @@ -15,6 +15,7 @@ using MediatR; using PersianTools.Core; using System.Runtime.InteropServices; using Microsoft.EntityFrameworkCore; +using Shared.Contracts.Holidays; namespace GozareshgirProgramManager.Application.Modules.Checkouts.Commands.CreateCheckout; @@ -25,16 +26,18 @@ public class CreateOrEditCheckoutCommandHandler : IBaseCommandHandler Handle(CreateOrEditCheckoutCommand request, CancellationToken cancellationToken) @@ -182,9 +185,7 @@ public class CreateOrEditCheckoutCommandHandler : IBaseCommandHandlerx.Holidaydate >= start && x.Holidaydate <= end).ToListAsync(); - - + var holidays = await _holidayQueryService.GetHolidaysInDates(start, end) ; int mandatoryHours = 0; for (var currentDay = persianStart; currentDay <= persianEnd; currentDay = currentDay.AddDays(1)) { diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/LoginUser/LoginUserCommand.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/LoginUser/LoginUserCommand.cs deleted file mode 100644 index 80d51cb2..00000000 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/LoginUser/LoginUserCommand.cs +++ /dev/null @@ -1,11 +0,0 @@ -using GozareshgirProgramManager.Application._Common.Interfaces; -using GozareshgirProgramManager.Application._Common.Models; -using MediatR; - -namespace GozareshgirProgramManager.Application.Modules.Users.Commands.LoginUser; - -/// -/// دستور ورود کاربر به سیستم -/// -public record LoginUserCommand(long UserId) : IBaseCommand; - diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/LoginUser/LoginUserCommandHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/LoginUser/LoginUserCommandHandler.cs deleted file mode 100644 index cb284fd0..00000000 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/LoginUser/LoginUserCommandHandler.cs +++ /dev/null @@ -1,98 +0,0 @@ -using GozareshgirProgramManager.Application._Common.Interfaces; -using GozareshgirProgramManager.Application._Common.Models; -using GozareshgirProgramManager.Domain._Common; -using GozareshgirProgramManager.Domain.UserAgg.Entities; -using GozareshgirProgramManager.Domain.UserAgg.Repositories; -using MediatR; -using Microsoft.EntityFrameworkCore; - -namespace GozareshgirProgramManager.Application.Modules.Users.Commands.LoginUser; - -/// -/// Handler برای ورود کاربر به سیستم -/// -public class LoginUserCommandHandler : IRequestHandler> -{ - private readonly IUserRepository _userRepository; - private readonly IUserRefreshTokenRepository _refreshTokenRepository; - private readonly IAuthHelper _authHelper; - private readonly IUnitOfWork _unitOfWork; - - public LoginUserCommandHandler( - IUserRepository userRepository, - IAuthHelper authHelper, - IUnitOfWork unitOfWork, IUserRefreshTokenRepository refreshTokenRepository) - { - _userRepository = userRepository; - _authHelper = authHelper; - _unitOfWork = unitOfWork; - _refreshTokenRepository = refreshTokenRepository; - } - - public async Task> Handle(LoginUserCommand request, CancellationToken cancellationToken) - { - // اعتبارسنجی - if (request.UserId <= 0) - { - return OperationResult.Failure("شناسه کاربری معتبر نیست", ErrorType.BadRequest); - } - - // یافتن کاربر - var user = await _userRepository.GetUserWithRolesByIdAsync(request.UserId, cancellationToken); - - if (user == null) - { - return OperationResult.Failure("کاربر یافت نشد", ErrorType.NotFound); - } - - // بررسی فعال بودن کاربر - if (!user.IsActive) - { - return OperationResult.Failure("حساب کاربری غیرفعال است", ErrorType.Unauthorized); - } - - // تولید توکن‌ها با استفاده از AuthHelper - var roles = user.RoleUser - .Select(r => r.RoleId.ToString()).ToList(); - - var session = _authHelper.SignIn( - user.Id, - user.UserName, - user.FullName, - user.AccountId??0, - roles); - // دریافت اطلاعات درخواست با استفاده از AuthHelper - var ipAddress = _authHelper.GetClientIpAddress(); - var userAgent = _authHelper.GetUserAgent(); - - // ذخیره Refresh Token در دیتابیس - //user.AddRefreshToken(refreshToken, refreshTokenExpiration, ipAddress, userAgent); - - var refreshTokenEntity = new UserRefreshToken( - user.Id, - session.RefreshToken, - session.RefreshTokenExpiration, - ipAddress, - userAgent); - - await _refreshTokenRepository.CreateAsync(refreshTokenEntity); - - - await _unitOfWork.SaveChangesAsync(cancellationToken); - - - // ساخت پاسخ (RefreshToken به فرانت داده نمی‌شود) - var response = new LoginResponse - { - AccessToken = session.AccessToken, - ExpiresAt = session.AccessTokenExpiration, - UserId = user.Id, - FullName = user.FullName, - UserName = user.UserName, - Roles = user.RoleUser.Select(r => r.RoleId).ToList() - }; - - return OperationResult.Success(response); - } -} - diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/RefreshUserToken/RefreshUserTokenCommand.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/RefreshUserToken/RefreshUserTokenCommand.cs deleted file mode 100644 index 31cf5838..00000000 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/RefreshUserToken/RefreshUserTokenCommand.cs +++ /dev/null @@ -1,11 +0,0 @@ -using GozareshgirProgramManager.Application._Common.Interfaces; -using GozareshgirProgramManager.Application._Common.Models; -using MediatR; - -namespace GozareshgirProgramManager.Application.Modules.Users.Commands.RefreshUserToken; - -/// -/// دستور تازه‌سازی توکن دسترسی کاربر -/// -public record RefreshUserTokenCommand() : IBaseCommand; - diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/RefreshUserToken/RefreshUserTokenCommandHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/RefreshUserToken/RefreshUserTokenCommandHandler.cs deleted file mode 100644 index 12bfb62b..00000000 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/RefreshUserToken/RefreshUserTokenCommandHandler.cs +++ /dev/null @@ -1,86 +0,0 @@ -using GozareshgirProgramManager.Application._Common.Interfaces; -using GozareshgirProgramManager.Application._Common.Models; -using GozareshgirProgramManager.Domain._Common; -using Microsoft.EntityFrameworkCore; -using MediatR; - -namespace GozareshgirProgramManager.Application.Modules.Users.Commands.RefreshUserToken; - -/// -/// Handler برای تازه‌سازی توکن دسترسی -/// -public class RefreshUserTokenCommandHandler : IBaseCommandHandler -{ - private readonly IAuthHelper _authHelper; - private readonly IProgramManagerDbContext _context; - - public RefreshUserTokenCommandHandler( - IAuthHelper authHelper, - IProgramManagerDbContext context) - { - _authHelper = authHelper; - _context = context; - } - - public async Task Handle(RefreshUserTokenCommand request, CancellationToken cancellationToken) - { - - var refreshToken = _authHelper.GetRefreshTokenFromCookie(); - - // یافتن کاربر و Refresh Token فعال از دیتابیس - var user = await _context.Users - .Include(u => u.RefreshTokens) - .Include(u => u.RoleUser) - .FirstOrDefaultAsync(u => u.RefreshTokens.Any(r=>r.Token ==refreshToken), cancellationToken); - - if (user == null) - { - return OperationResult.Failure("کاربر یافت نشد", ErrorType.NotFound); - } - - // بررسی فعال بودن کاربر - if (!user.IsActive) - { - return OperationResult.Failure("حساب کاربری غیرفعال است", ErrorType.Unauthorized); - } - - // پیدا کردن Refresh Token فعال - var activeRefreshToken = user.RefreshTokens - .FirstOrDefault(rt => rt.Token == refreshToken && rt.IsActive); - - if (activeRefreshToken == null) - { - return OperationResult.Failure( - "نشست شما منقضی شده است. لطفاً دوباره وارد شوید", - ErrorType.Unauthorized); - } - - if (!activeRefreshToken.IsActive|| activeRefreshToken.IsRevoked||activeRefreshToken.IsExpired) - { - return OperationResult.Failure( - "نشست شما منقضی شده است. لطفاً دوباره وارد شوید", - ErrorType.Unauthorized); - } - - // تولید Access Token جدید با استفاده از AuthHelper - var roles = user.RoleUser.Select(r => r.RoleId.ToString()).ToList(); - var newAccessToken = _authHelper.GenerateAccessToken( - user.Id, - user.UserName, - user.FullName, - user.AccountId, - roles); - - var response = new AccessTokenResponse - { - AccessToken = newAccessToken, - ExpiresAt = DateTime.UtcNow.AddMinutes(30), - UserId = user.Id, - FullName = user.FullName, - UserName = user.UserName - }; - - return OperationResult.Success(response); - } -} - diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/SignOutUser/SignOutUserCommand.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/SignOutUser/SignOutUserCommand.cs deleted file mode 100644 index 7c9c6bda..00000000 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/SignOutUser/SignOutUserCommand.cs +++ /dev/null @@ -1,11 +0,0 @@ -using GozareshgirProgramManager.Application._Common.Interfaces; -using GozareshgirProgramManager.Application._Common.Models; -using MediatR; - -namespace GozareshgirProgramManager.Application.Modules.Users.Commands.SignOutUser; - -/// -/// دستور خروج کاربر از سیستم -/// -public record SignOutUserCommand(string RefreshToken) : IBaseCommand; - diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/SignOutUser/SignOutUserCommandHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/SignOutUser/SignOutUserCommandHandler.cs deleted file mode 100644 index 92c69fcf..00000000 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/SignOutUser/SignOutUserCommandHandler.cs +++ /dev/null @@ -1,68 +0,0 @@ -using GozareshgirProgramManager.Application._Common.Interfaces; -using GozareshgirProgramManager.Application._Common.Models; -using GozareshgirProgramManager.Domain._Common; -using MediatR; -using Microsoft.EntityFrameworkCore; - -namespace GozareshgirProgramManager.Application.Modules.Users.Commands.SignOutUser; - -/// -/// Handler برای خروج کاربر از سیستم -/// -public class SignOutUserCommandHandler : IBaseCommandHandler -{ - private readonly IAuthHelper _authHelper; - private readonly IProgramManagerDbContext _context; - private readonly IUnitOfWork _unitOfWork; - - public SignOutUserCommandHandler( - IAuthHelper _authHelper, - IProgramManagerDbContext context, - IUnitOfWork unitOfWork) - { - this._authHelper = _authHelper; - _context = context; - _unitOfWork = unitOfWork; - } - - public async Task Handle(SignOutUserCommand request, CancellationToken cancellationToken) - { - // دریافت UserId از Claims با استفاده از AuthHelper - var userId = _authHelper.GetCurrentUserId(); - - if (!userId.HasValue) - { - return OperationResult.Failure("کاربر احراز هویت نشده است", ErrorType.Unauthorized); - } - - if (string.IsNullOrEmpty(request.RefreshToken)) - { - return OperationResult.Failure("توکن تازه‌سازی یافت نشد", ErrorType.BadRequest); - } - - // یافتن کاربر - var user = await _context.Users - .Include(u => u.RefreshTokens) - .FirstOrDefaultAsync(u => u.Id == userId.Value, cancellationToken); - - if (user == null) - { - return OperationResult.Failure("کاربر یافت نشد", ErrorType.NotFound); - } - - try - { - // لغو Refresh Token - user.RevokeRefreshToken(request.RefreshToken); - await _unitOfWork.SaveChangesAsync(cancellationToken); - _authHelper.SignOut(); - - return OperationResult.Success(); - } - catch (InvalidOperationException ex) - { - return OperationResult.Failure(ex.Message, ErrorType.BadRequest); - } - } -} - diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/SsoLogin/SsoLoginCommand.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/SsoLogin/SsoLoginCommand.cs deleted file mode 100644 index 0c6d5a33..00000000 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/SsoLogin/SsoLoginCommand.cs +++ /dev/null @@ -1,10 +0,0 @@ -using GozareshgirProgramManager.Application._Common.Interfaces; -using GozareshgirProgramManager.Application._Common.Models; - -namespace GozareshgirProgramManager.Application.Modules.Users.Commands.SsoLogin; - -/// -/// دستور ورود از طریق SSO با استفاده از توکن JWT -/// -public record SsoLoginCommand(string Token) : IBaseCommand; - diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/SsoLogin/SsoLoginCommandHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/SsoLogin/SsoLoginCommandHandler.cs deleted file mode 100644 index 3e638729..00000000 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/SsoLogin/SsoLoginCommandHandler.cs +++ /dev/null @@ -1,115 +0,0 @@ -using GozareshgirProgramManager.Application._Common.Interfaces; -using GozareshgirProgramManager.Application._Common.Models; -using GozareshgirProgramManager.Domain._Common; -using GozareshgirProgramManager.Domain.UserAgg.Entities; -using GozareshgirProgramManager.Domain.UserAgg.Repositories; -using MediatR; - -namespace GozareshgirProgramManager.Application.Modules.Users.Commands.SsoLogin; - -/// -/// Handler برای ورود از طریق SSO با استفاده از JWT Token -/// -public class SsoLoginCommandHandler : IRequestHandler> -{ - private readonly IUserRepository _userRepository; - private readonly IUserRefreshTokenRepository _refreshTokenRepository; - private readonly IAuthHelper _authHelper; - private readonly IUnitOfWork _unitOfWork; - - public SsoLoginCommandHandler( - IUserRepository userRepository, - IAuthHelper authHelper, - IUnitOfWork unitOfWork, - IUserRefreshTokenRepository refreshTokenRepository) - { - _userRepository = userRepository; - _authHelper = authHelper; - _unitOfWork = unitOfWork; - _refreshTokenRepository = refreshTokenRepository; - } - - public async Task> Handle(SsoLoginCommand request, CancellationToken cancellationToken) - { - // اعتبارسنجی - if (string.IsNullOrWhiteSpace(request.Token)) - { - return OperationResult.Failure("توکن SSO معتبر نیست", ErrorType.BadRequest); - } - - // اعتبارسنجی توکن و استخراج Claims - var principal = _authHelper.ValidateToken(request.Token); - if (principal == null) - { - return OperationResult.Failure("توکن SSO نامعتبر یا منقضی شده است", ErrorType.Unauthorized); - } - - // استخراج AccountId از Claims - var accountIdClaim = principal.FindFirst("AccountId")?.Value; - if (string.IsNullOrEmpty(accountIdClaim) || !long.TryParse(accountIdClaim, out var accountId)) - { - return OperationResult.Failure("AccountId در توکن یافت نشد", ErrorType.BadRequest); - } - - // یافتن کاربر بر اساس AccountId - var user = await _userRepository.GetByGozareshgirAccountId(accountId); - - if (user == null) - { - return OperationResult.Failure("کاربر با AccountId مشخص شده یافت نشد", ErrorType.NotFound); - } - - // بررسی فعال بودن کاربر - if (!user.IsActive) - { - return OperationResult.Failure("حساب کاربری غیرفعال است", ErrorType.Unauthorized); - } - - // بارگذاری نقش‌های کاربر - user = await _userRepository.GetUserWithRolesByIdAsync(user.Id, cancellationToken); - if (user == null) - { - return OperationResult.Failure("خطا در بارگذاری اطلاعات کاربر", ErrorType.InternalServerError); - } - - // تولید توکن‌های جدید برای کاربر - var roles = user.RoleUser - .Select(r => r.RoleId.ToString()).ToList(); - - var session = _authHelper.SignIn( - user.Id, - user.UserName, - user.FullName, - user.AccountId ?? 0, - roles); - - // دریافت اطلاعات درخواست - var ipAddress = _authHelper.GetClientIpAddress(); - var userAgent = _authHelper.GetUserAgent(); - - // ذخیره Refresh Token در دیتابیس - var refreshTokenEntity = new UserRefreshToken( - user.Id, - session.RefreshToken, - session.RefreshTokenExpiration, - ipAddress, - userAgent); - - await _refreshTokenRepository.CreateAsync(refreshTokenEntity); - await _unitOfWork.SaveChangesAsync(cancellationToken); - - // ساخت پاسخ - var response = new LoginResponse - { - AccessToken = session.AccessToken, - ExpiresAt = session.AccessTokenExpiration, - UserId = user.Id, - FullName = user.FullName, - UserName = user.UserName, - Roles = user.RoleUser.Select(r => r.RoleId).ToList() - }; - - return OperationResult.Success(response); - } -} - diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/_Common/Interfaces/IAuthHelper.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/_Common/Interfaces/IAuthHelper.cs index 7b392d47..a41dad2b 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/_Common/Interfaces/IAuthHelper.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/_Common/Interfaces/IAuthHelper.cs @@ -9,38 +9,38 @@ namespace GozareshgirProgramManager.Application._Common.Interfaces; public interface IAuthHelper { // ==================== Token Generation ==================== - LoginSession SignIn(long userId, string userName, string fullName, long accountId, List roles); - /// - /// تولید Access Token - /// - string GenerateAccessToken(long userId, string userName, string fullName, long? accountId, List roles); + // LoginSession SignIn(long userId, string userName, string fullName, long accountId, List roles); + // /// + // /// تولید Access Token + // /// + // string GenerateAccessToken(long userId, string userName, string fullName, long? accountId, List roles); - /// - /// تولید Refresh Token - /// - string GenerateRefreshToken(); + // /// + // /// تولید Refresh Token + // /// + // string GenerateRefreshToken(); - /// - /// دریافت تاریخ انقضای Refresh Token - /// - DateTime GetRefreshTokenExpiration(); + // /// + // /// دریافت تاریخ انقضای Refresh Token + // /// + // DateTime GetRefreshTokenExpiration(); // ==================== Token Validation ==================== - - /// - /// اعتبارسنجی توکن و استخراج Claims - /// - ClaimsPrincipal? ValidateToken(string token); + // + // /// + // /// اعتبارسنجی توکن و استخراج Claims + // /// + // ClaimsPrincipal? ValidateToken(string token); - /// - /// اعتبارسنجی توکن منقضی شده (بدون چک زمان انقضا) - /// - ClaimsPrincipal? ValidateExpiredToken(string token); + // /// + // /// اعتبارسنجی توکن منقضی شده (بدون چک زمان انقضا) + // /// + // ClaimsPrincipal? ValidateExpiredToken(string token); - /// - /// استخراج UserId از توکن (حتی اگر منقضی شده باشد) - /// - long? GetUserIdFromToken(string token); + // /// + // /// استخراج UserId از توکن (حتی اگر منقضی شده باشد) + // /// + // long? GetUserIdFromToken(string token); // ==================== HttpContext Helpers ==================== @@ -49,15 +49,11 @@ public interface IAuthHelper /// string? GetClientIpAddress(); - /// - /// دریافت User Agent کاربر جاری - /// - string? GetUserAgent(); - - /// - /// دریافت Refresh Token از Cookie - /// - string? GetRefreshTokenFromCookie(); + + // /// + // /// دریافت Refresh Token از Cookie + // /// + // string? GetRefreshTokenFromCookie(); // ==================== Current User Claims ==================== @@ -71,39 +67,12 @@ public interface IAuthHelper /// long? GetCurrentUserId(); - /// - /// دریافت نام کاربری جاری از Claims - /// - string? GetCurrentUserName(); - /// /// دریافت نام کامل کاربر جاری از Claims /// string? GetCurrentFullName(); - /// - /// دریافت AccountId کاربر جاری از Claims - /// - long? GetCurrentAccountId(); - - /// - /// دریافت نقش‌های کاربر جاری از Claims - /// - List GetCurrentUserRoles(); - - // ==================== Role Checking ==================== - /// - /// بررسی دسترسی کاربر به نقش خاص - /// - bool HasRole(string roleName); - - /// - /// بررسی دسترسی کاربر به یکی از نقش‌ها - /// - bool HasAnyRole(params string[] roleNames); - - void SignOut(); } public class LoginSession { diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/_Common/Interfaces/IGozareshgirDbContext.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/_Common/Interfaces/IGozareshgirDbContext.cs deleted file mode 100644 index 8baad5be..00000000 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/_Common/Interfaces/IGozareshgirDbContext.cs +++ /dev/null @@ -1,12 +0,0 @@ -using GozareshgirProgramManager.Domain.HolidayAgg; -using GozareshgirProgramManager.Domain.HolidayItemAgg; -using Microsoft.EntityFrameworkCore; - -namespace GozareshgirProgramManager.Application._Common.Interfaces; - -public interface IGozareshgirDbContext -{ - DbSet HolidayItems { get; set; } - DbSet Holidays { get; set; } - -} \ No newline at end of file diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/DependencyInjection.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/DependencyInjection.cs index a17403b0..5d73a0b3 100644 --- a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/DependencyInjection.cs +++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/DependencyInjection.cs @@ -42,16 +42,7 @@ public static class DependencyInjection // Register IAppDbContext services.AddScoped(provider => provider.GetRequiredService()); - - - #region GozareshgirDbContext - - services.AddDbContext(x => x.UseSqlServer(configuration.GetConnectionString("GozareshgirDb"))); - - services.AddScoped(provider => - provider.GetRequiredService()); - #endregion // Unit of Work services.AddScoped(); diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Context/GozareshgirDbContext.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Context/GozareshgirDbContext.cs deleted file mode 100644 index 181e1779..00000000 --- a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Context/GozareshgirDbContext.cs +++ /dev/null @@ -1,22 +0,0 @@ -using GozareshgirProgramManager.Application._Common.Interfaces; -using GozareshgirProgramManager.Domain.HolidayAgg; -using GozareshgirProgramManager.Domain.HolidayItemAgg; -using Microsoft.EntityFrameworkCore; - -namespace GozareshgirProgramManager.Infrastructure.Persistence.Context; - -public class GozareshgirDbContext : DbContext, IGozareshgirDbContext -{ - public GozareshgirDbContext(DbContextOptions options) : base(options) - { - } - - public DbSet HolidayItems { get; set; } = null!; - public DbSet Holidays { get; set; } = null!; - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.ApplyConfigurationsFromAssembly(typeof(GozareshgirDbContext).Assembly); - base.OnModelCreating(modelBuilder); - } -} \ No newline at end of file diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Services/Authentication/AuthHelper.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Services/Authentication/AuthHelper.cs index ec70492e..9ca8e545 100644 --- a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Services/Authentication/AuthHelper.cs +++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Services/Authentication/AuthHelper.cs @@ -149,7 +149,7 @@ public class AuthHelper : IAuthHelper /// public long? GetCurrentUserId() { - var userIdClaim = _httpContextAccessor.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; + var userIdClaim = _httpContextAccessor.HttpContext?.User?.FindFirst("pm.userId")?.Value; return long.TryParse(userIdClaim, out var userId) ? userId : null; } diff --git a/ServiceHost/Areas/Admin/Controllers/AuthController.cs b/ServiceHost/Areas/Admin/Controllers/AuthController.cs deleted file mode 100644 index cac9318f..00000000 --- a/ServiceHost/Areas/Admin/Controllers/AuthController.cs +++ /dev/null @@ -1,143 +0,0 @@ -using GozareshgirProgramManager.Application._Common.Interfaces; -using GozareshgirProgramManager.Application._Common.Models; -using GozareshgirProgramManager.Application.Modules.Users.Commands.LoginUser; -using GozareshgirProgramManager.Application.Modules.Users.Commands.RefreshUserToken; -using GozareshgirProgramManager.Application.Modules.Users.Commands.SignOutUser; -using GozareshgirProgramManager.Application.Modules.Users.Commands.SsoLogin; -using MediatR; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using ServiceHost.BaseControllers; - -namespace ServiceHost.Areas.Admin.Controllers; - -/// -/// کنترلر احراز هویت -/// -[Route("api/[controller]")] -[ApiController] -public class AuthController :AdminBaseController -{ - private readonly IAuthHelper _authHelper; - private readonly IMediator _mediator; - - public AuthController(IAuthHelper authHelper, IMediator mediator) - { - _authHelper = authHelper; - _mediator = mediator; - } - - /// - /// ورود به سیستم با شناسه کاربری - /// - /// شناسه کاربر - /// فقط Access Token - Refresh Token در سرور ذخیره می‌شود - [HttpPost("login")] - [AllowAnonymous] - public async Task>> Login([FromBody] LoginByIdRequest request) - { - var command = new LoginUserCommand(request.UserId); - var result = await _mediator.Send(command); - - return result; - } - - /// - /// ورود به سیستم از طریق SSO با استفاده از توکن JWT - /// توکن JWT از query string دریافت می‌شود و Claims آن استخراج می‌شود - /// سپس کاربر بر اساس AccountId موجود در Claims لاگین می‌شود - /// - /// JWT Token از سیستم خارجی - /// Access Token و اطلاعات کاربر - [HttpGet("sso-login")] - [AllowAnonymous] - public async Task>> SsoLogin([FromQuery] string token) - { - if (string.IsNullOrWhiteSpace(token)) - { - return BadRequest(OperationResult.Failure("توکن الزامی است", ErrorType.BadRequest)); - } - - var command = new SsoLoginCommand(token); - var result = await _mediator.Send(command); - - return result; - } - - /// - /// خروج از سیستم - /// - [HttpPost("signout")] - [Authorize] - public new async Task> SignOut() - { - // دریافت Refresh Token از Header با استفاده از AuthHelper - var refreshToken = _authHelper.GetRefreshTokenFromCookie(); - - if (string.IsNullOrEmpty(refreshToken)) - { - return OperationResult.Failure("توکن تازه‌سازی یافت نشد"); - } - - var command = new SignOutUserCommand(refreshToken); - var result = await _mediator.Send(command); - - if (result.IsSuccess) - { - return Ok(result); - } - - return StatusCode(result.ErrorType switch - { - ErrorType.Unauthorized => 401, - ErrorType.BadRequest => 400, - ErrorType.NotFound => 404, - _ => 500 - }, result); - } - - /// - /// تازه‌سازی توکن دسترسی - /// توکن منقضی شده را می‌گیرد و Access Token جدید برمی‌گرداند - /// Refresh Token از دیتابیس خوانده می‌شود و به فرانت داده نمی‌شود - /// - [HttpPost("refresh")] - [AllowAnonymous] - public async Task> RefreshAccessToken() - { - - var refreshTokenCommand = new RefreshUserTokenCommand(); - var result = await _mediator.Send(refreshTokenCommand); - - return result; - } - - /// - /// دریافت اطلاعات کاربر جاری - /// - [HttpGet("current")] - public IActionResult GetCurrentUser() - { - if (!_authHelper.IsAuthenticated()) - { - return Unauthorized(new { message = "کاربر احراز هویت نشده است" }); - } - - return Ok(new - { - userId = _authHelper.GetCurrentUserId(), - fullName= _authHelper.GetCurrentFullName(), - roles = _authHelper.GetCurrentUserRoles() - }); - } -} - -/// -/// درخواست ورود با شناسه کاربری -/// -public class LoginByIdRequest -{ - public long UserId { get; set; } -} - - diff --git a/ServiceHost/Areas/Admin/Controllers/CheckoutController.cs b/ServiceHost/Areas/Admin/Controllers/ProgramManager/CheckoutController.cs similarity index 96% rename from ServiceHost/Areas/Admin/Controllers/CheckoutController.cs rename to ServiceHost/Areas/Admin/Controllers/ProgramManager/CheckoutController.cs index 69128d3a..29edd65c 100644 --- a/ServiceHost/Areas/Admin/Controllers/CheckoutController.cs +++ b/ServiceHost/Areas/Admin/Controllers/ProgramManager/CheckoutController.cs @@ -7,9 +7,9 @@ using MediatR; using Microsoft.AspNetCore.Mvc; using ServiceHost.BaseControllers; -namespace ServiceHost.Areas.Admin.Controllers; +namespace ServiceHost.Areas.Admin.Controllers.ProgramManager; -public class CheckoutController : AdminBaseController +public class CheckoutController : ProgramManagerBaseController { private readonly IMediator _mediator; diff --git a/ServiceHost/Areas/Admin/Controllers/ProjectController.cs b/ServiceHost/Areas/Admin/Controllers/ProgramManager/ProjectController.cs similarity index 96% rename from ServiceHost/Areas/Admin/Controllers/ProjectController.cs rename to ServiceHost/Areas/Admin/Controllers/ProgramManager/ProjectController.cs index a52e8ab1..266e72d4 100644 --- a/ServiceHost/Areas/Admin/Controllers/ProjectController.cs +++ b/ServiceHost/Areas/Admin/Controllers/ProgramManager/ProjectController.cs @@ -14,9 +14,9 @@ using MediatR; using Microsoft.AspNetCore.Mvc; using ServiceHost.BaseControllers; -namespace ServiceHost.Areas.Admin.Controllers; +namespace ServiceHost.Areas.Admin.Controllers.ProgramManager; -public class ProjectController : AdminBaseController +public class ProjectController : ProgramManagerBaseController { private readonly IMediator _mediator; diff --git a/ServiceHost/Areas/Admin/Controllers/RoleController.cs b/ServiceHost/Areas/Admin/Controllers/ProgramManager/RoleController.cs similarity index 90% rename from ServiceHost/Areas/Admin/Controllers/RoleController.cs rename to ServiceHost/Areas/Admin/Controllers/ProgramManager/RoleController.cs index b074f105..d7994d7a 100644 --- a/ServiceHost/Areas/Admin/Controllers/RoleController.cs +++ b/ServiceHost/Areas/Admin/Controllers/ProgramManager/RoleController.cs @@ -6,9 +6,9 @@ using MediatR; using Microsoft.AspNetCore.Mvc; using ServiceHost.BaseControllers; -namespace ServiceHost.Areas.Admin.Controllers; +namespace ServiceHost.Areas.Admin.Controllers.ProgramManager; -public class RoleController : AdminBaseController +public class RoleController : ProgramManagerBaseController { private readonly IMediator _mediator; diff --git a/ServiceHost/Areas/Admin/Controllers/SalaryPaymentSettingsController.cs b/ServiceHost/Areas/Admin/Controllers/ProgramManager/SalaryPaymentSettingsController.cs similarity index 93% rename from ServiceHost/Areas/Admin/Controllers/SalaryPaymentSettingsController.cs rename to ServiceHost/Areas/Admin/Controllers/ProgramManager/SalaryPaymentSettingsController.cs index bb09a5a3..bc4784e2 100644 --- a/ServiceHost/Areas/Admin/Controllers/SalaryPaymentSettingsController.cs +++ b/ServiceHost/Areas/Admin/Controllers/ProgramManager/SalaryPaymentSettingsController.cs @@ -8,9 +8,9 @@ using MediatR; using Microsoft.AspNetCore.Mvc; using ServiceHost.BaseControllers; -namespace ServiceHost.Areas.Admin.Controllers; +namespace ServiceHost.Areas.Admin.Controllers.ProgramManager; -public class SalaryPaymentSettingsController : AdminBaseController +public class SalaryPaymentSettingsController : ProgramManagerBaseController { private readonly IMediator _mediator; diff --git a/ServiceHost/Areas/Admin/Controllers/SkillController.cs b/ServiceHost/Areas/Admin/Controllers/ProgramManager/SkillController.cs similarity index 82% rename from ServiceHost/Areas/Admin/Controllers/SkillController.cs rename to ServiceHost/Areas/Admin/Controllers/ProgramManager/SkillController.cs index 4fcc373e..0966a65a 100644 --- a/ServiceHost/Areas/Admin/Controllers/SkillController.cs +++ b/ServiceHost/Areas/Admin/Controllers/ProgramManager/SkillController.cs @@ -4,9 +4,9 @@ using MediatR; using Microsoft.AspNetCore.Mvc; using ServiceHost.BaseControllers; -namespace ServiceHost.Areas.Admin.Controllers; +namespace ServiceHost.Areas.Admin.Controllers.ProgramManager; -public class SkillController:AdminBaseController +public class SkillController:ProgramManagerBaseController { private readonly IMediator _mediator; diff --git a/ServiceHost/Areas/Admin/Controllers/UserController.cs b/ServiceHost/Areas/Admin/Controllers/ProgramManager/UserController.cs similarity index 93% rename from ServiceHost/Areas/Admin/Controllers/UserController.cs rename to ServiceHost/Areas/Admin/Controllers/ProgramManager/UserController.cs index 9fabaf9f..03ef60b8 100644 --- a/ServiceHost/Areas/Admin/Controllers/UserController.cs +++ b/ServiceHost/Areas/Admin/Controllers/ProgramManager/UserController.cs @@ -8,9 +8,9 @@ using MediatR; using Microsoft.AspNetCore.Mvc; using ServiceHost.BaseControllers; -namespace ServiceHost.Areas.Admin.Controllers; +namespace ServiceHost.Areas.Admin.Controllers.ProgramManager; -public class UserController : AdminBaseController +public class UserController : ProgramManagerBaseController { private readonly IMediator _mediator; diff --git a/ServiceHost/Areas/Admin/Pages/Accounts/Account/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Accounts/Account/Index.cshtml index 92dca681..900be1d3 100644 --- a/ServiceHost/Areas/Admin/Pages/Accounts/Account/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Accounts/Account/Index.cshtml @@ -1,6 +1,4 @@ @page -@using CompanyManagment.App.Contracts.PersonalContractingParty -@using Microsoft.EntityFrameworkCore @using _0_Framework.Application @model ServiceHost.Areas.Admin.Pages.Accounts.Account.IndexModel @inject IAuthHelper _AuthHelper; diff --git a/ServiceHost/Areas/Admin/Pages/Company/Checkouts/CreateLoadList.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Checkouts/CreateLoadList.cshtml index e49343e6..318d6972 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Checkouts/CreateLoadList.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Checkouts/CreateLoadList.cshtml @@ -1,5 +1,4 @@ -@using Microsoft.CodeAnalysis.CSharp.Syntax -@model CompanyManagment.App.Contracts.Checkout.CreateCheckoutListViewModel +@model CompanyManagment.App.Contracts.Checkout.CreateCheckoutListViewModel @{ var i = 1; var b = 0; diff --git a/ServiceHost/Areas/Admin/Pages/Company/Checkouts/Details.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Checkouts/Details.cshtml index 95c72111..1a6af7f7 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Checkouts/Details.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Checkouts/Details.cshtml @@ -1,5 +1,4 @@ -@using System.Security.Cryptography.X509Certificates -@model CompanyManagment.App.Contracts.Checkout.CheckoutViewModel +@model CompanyManagment.App.Contracts.Checkout.CheckoutViewModel @{ var totalDays = Model.MonthlyRollCall?.Count ?? 0; var rightSideDays = totalDays / 2; diff --git a/ServiceHost/Areas/Admin/Pages/Company/Checkouts/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Checkouts/Index.cshtml index e416cff2..929dc0c9 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Checkouts/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Checkouts/Index.cshtml @@ -1,5 +1,4 @@ @page -@using CompanyManagment.App.Contracts.PersonalContractingParty @model ServiceHost.Areas.Admin.Pages.Company.Checkouts.IndexModel @{ diff --git a/ServiceHost/Areas/Admin/Pages/Company/ContractingParties/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Company/ContractingParties/Index.cshtml index f2e5c44c..51973794 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/ContractingParties/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/ContractingParties/Index.cshtml @@ -1,5 +1,4 @@ @page -@using CompanyManagment.App.Contracts.PersonalContractingParty @model ServiceHost.Areas.Admin.Pages.Company.ContractingParties.IndexModel @{ diff --git a/ServiceHost/Areas/Admin/Pages/Company/Contracts/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Contracts/Index.cshtml index 4865d1a4..778f0284 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Contracts/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Contracts/Index.cshtml @@ -1,5 +1,4 @@ @page -@using CompanyManagment.App.Contracts.PersonalContractingParty @model ServiceHost.Areas.Admin.Pages.Company.Contracts.IndexModel diff --git a/ServiceHost/Areas/Admin/Pages/Company/Employees/Create.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Employees/Create.cshtml index c0921767..659894e6 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Employees/Create.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Employees/Create.cshtml @@ -1,5 +1,4 @@ -@using _0_Framework.Application -@model CompanyManagment.App.Contracts.Employee.CreateEmployee +@model CompanyManagment.App.Contracts.Employee.CreateEmployee @{ var adminVersion = _0_Framework.Application.Version.AdminVersion; diff --git a/ServiceHost/Areas/Admin/Pages/Company/Employees/CreateEmployee.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Employees/CreateEmployee.cshtml index 28543bbb..e48dfc71 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Employees/CreateEmployee.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Employees/CreateEmployee.cshtml @@ -1,5 +1,4 @@ -@using _0_Framework.Application -@model CompanyManagment.App.Contracts.Employee.CreateEmployee +@model CompanyManagment.App.Contracts.Employee.CreateEmployee @{ var adminVersion = _0_Framework.Application.Version.AdminVersion; diff --git a/ServiceHost/Areas/Admin/Pages/Company/Employees/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Employees/Index.cshtml index dcfb2559..845c6b61 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Employees/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Employees/Index.cshtml @@ -1,5 +1,4 @@ @page -@using CompanyManagment.App.Contracts.PersonalContractingParty @model ServiceHost.Areas.Admin.Pages.Company.Employees.IndexModel @{ diff --git a/ServiceHost/Areas/Admin/Pages/Company/Employers/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Employers/Index.cshtml index 64e33aaf..8ecf3052 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Employers/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Employers/Index.cshtml @@ -1,5 +1,4 @@ @page -@using CompanyManagment.App.Contracts.PersonalContractingParty @model ServiceHost.Areas.Admin.Pages.Company.Employers.IndexModel @{ diff --git a/ServiceHost/Areas/Admin/Pages/Company/Holidays/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Holidays/Index.cshtml index 69c2dad9..75e213a8 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Holidays/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Holidays/Index.cshtml @@ -1,7 +1,4 @@ @page -@using CompanyManagment.App.Contracts.PersonalContractingParty -@using Microsoft.EntityFrameworkCore -@using CompanyManagment.App.Contracts.Holiday @model ServiceHost.Areas.Admin.Pages.Company.Holidays.IndexModel @{ diff --git a/ServiceHost/Areas/Admin/Pages/Company/InsuranceList/_Partials/OperationsModal.cshtml b/ServiceHost/Areas/Admin/Pages/Company/InsuranceList/_Partials/OperationsModal.cshtml index c8d15d51..84bc4fd5 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/InsuranceList/_Partials/OperationsModal.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/InsuranceList/_Partials/OperationsModal.cshtml @@ -1,5 +1,4 @@ @using CompanyManagment.App.Contracts.InsuranceList.Enums -@using Microsoft.AspNetCore.Mvc.TagHelpers @model CompanyManagment.App.Contracts.InsuranceList.InsuranceListConfirmOperation @{ diff --git a/ServiceHost/Areas/Admin/Pages/Company/Jobs/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Jobs/Index.cshtml index 9e035d35..a4e80527 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Jobs/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Jobs/Index.cshtml @@ -1,5 +1,4 @@ @page -@using CompanyManagment.App.Contracts.PersonalContractingParty @model ServiceHost.Areas.Admin.Pages.Company.Jobs.IndexModel @{ diff --git a/ServiceHost/Areas/Admin/Pages/Company/MandatoryHours/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Company/MandatoryHours/Index.cshtml index c1370298..fc059cf3 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/MandatoryHours/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/MandatoryHours/Index.cshtml @@ -1,5 +1,4 @@ @page -@using CompanyManagment.App.Contracts.PersonalContractingParty @model ServiceHost.Areas.Admin.Pages.Company.MandatoryHours.IndexModel @{ diff --git a/ServiceHost/Areas/Admin/Pages/Company/Representative/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Representative/Index.cshtml index 1065f4e7..c9143498 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Representative/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Representative/Index.cshtml @@ -1,5 +1,4 @@ @page -@using CompanyManagment.App.Contracts.Representative @model ServiceHost.Areas.Admin.Pages.Company.Representative.IndexModel @{ diff --git a/ServiceHost/Areas/Admin/Pages/Company/SmsResult/SmsSettings.cshtml b/ServiceHost/Areas/Admin/Pages/Company/SmsResult/SmsSettings.cshtml index ee6275a3..279d822f 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/SmsResult/SmsSettings.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/SmsResult/SmsSettings.cshtml @@ -1,6 +1,4 @@ @page -@using _0_Framework.Application.Enums -@using Microsoft.AspNetCore.Mvc.TagHelpers @model ServiceHost.Areas.Admin.Pages.Company.SmsResult.SmsSettingsModel @Html.AntiForgeryToken() @{ diff --git a/ServiceHost/Areas/Admin/Pages/Company/Workshops/EditWorkshop.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Workshops/EditWorkshop.cshtml index 21ea2cfe..4a24360f 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Workshops/EditWorkshop.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Workshops/EditWorkshop.cshtml @@ -1,6 +1,5 @@ @page @using _0_Framework.Application -@using Microsoft.AspNetCore.Mvc.TagHelpers @model ServiceHost.Areas.Admin.Pages.Company.Workshops.EditWorkshopModel @{ string adminVersion = _0_Framework.Application.Version.AdminVersion; diff --git a/ServiceHost/Areas/Admin/Pages/Company/Workshops/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Workshops/Index.cshtml index 61c89eca..4a82840a 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Workshops/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Workshops/Index.cshtml @@ -1,5 +1,4 @@ @page -@using CompanyManagment.App.Contracts.PersonalContractingParty @model ServiceHost.Areas.Admin.Pages.Company.Workshops.IndexModel @{ diff --git a/ServiceHost/Areas/Admin/Pages/Company/Workshops/_EditForms/FormPermissionAccount.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Workshops/_EditForms/FormPermissionAccount.cshtml index ac030de9..27765263 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Workshops/_EditForms/FormPermissionAccount.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Workshops/_EditForms/FormPermissionAccount.cshtml @@ -1,5 +1,4 @@ @using AccountManagement.Application.Contracts.Account -@using Microsoft.AspNetCore.Mvc.TagHelpers @model CompanyManagment.App.Contracts.Workshop.EditWorkshop @{ diff --git a/ServiceHost/Areas/Admin/Pages/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Index.cshtml index a36a3d4b..3e1a948d 100644 --- a/ServiceHost/Areas/Admin/Pages/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Index.cshtml @@ -2,7 +2,6 @@ @page @using _0_Framework.Application @using AccountManagement.Application.Contracts.TicketAccessAccount -@using Microsoft.AspNetCore.Mvc.TagHelpers @model ServiceHost.Areas.Admin.Pages.IndexModel @inject ITicketAccessAccountApplication TicketAccessAccount; @inject IAuthHelper authHelper; diff --git a/ServiceHost/Areas/Admin/Pages/Shared/_AdminLayout.cshtml b/ServiceHost/Areas/Admin/Pages/Shared/_AdminLayout.cshtml index 2c17b1cf..a6e21401 100644 --- a/ServiceHost/Areas/Admin/Pages/Shared/_AdminLayout.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Shared/_AdminLayout.cshtml @@ -1,6 +1,4 @@ -@using Microsoft.AspNetCore.Razor.Language.Intermediate -@using _0_Framework.Application -@using Version = _0_Framework.Application.Version +@using Version = _0_Framework.Application.Version @inject _0_Framework.Application.IAuthHelper AuthHelper; @{ diff --git a/ServiceHost/Areas/Admin/Pages/Shared/_Menu.cshtml b/ServiceHost/Areas/Admin/Pages/Shared/_Menu.cshtml index 33621097..2734ee67 100644 --- a/ServiceHost/Areas/Admin/Pages/Shared/_Menu.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Shared/_Menu.cshtml @@ -1,6 +1,5 @@ @using _0_Framework.Application @using AccountManagement.Domain.TicketAccessAccountAgg -@using Microsoft.AspNetCore.Mvc.TagHelpers @using Microsoft.Extensions.Options @inject _0_Framework.Application.IAuthHelper AuthHelper; @inject ITicketAccessAccountRepository TicketAccessAccount; diff --git a/ServiceHost/Areas/Admin/Pages/_ViewImports.cshtml b/ServiceHost/Areas/Admin/Pages/_ViewImports.cshtml index 1dd320b1..100a2f8a 100644 --- a/ServiceHost/Areas/Admin/Pages/_ViewImports.cshtml +++ b/ServiceHost/Areas/Admin/Pages/_ViewImports.cshtml @@ -1,4 +1,3 @@ -@using ServiceHost -@namespace ServiceHost.Pages +@namespace ServiceHost.Areas.Admin.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, ServiceHost \ No newline at end of file diff --git a/ServiceHost/BaseControllers/ProgramManagerBaseController.cs b/ServiceHost/BaseControllers/ProgramManagerBaseController.cs new file mode 100644 index 00000000..db83d401 --- /dev/null +++ b/ServiceHost/BaseControllers/ProgramManagerBaseController.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace ServiceHost.BaseControllers; + +[Authorize(Policy = "AdminArea")] +[Area("ProgramManager")] +[ApiExplorerSettings(GroupName = "ProgramManager")] +[Route("api/[area]/[controller]")] +public class ProgramManagerBaseController : ControllerBase +{ + +} + diff --git a/ServiceHost/Program.cs b/ServiceHost/Program.cs index 36431242..40ca19b2 100644 --- a/ServiceHost/Program.cs +++ b/ServiceHost/Program.cs @@ -231,36 +231,37 @@ builder.Services.AddSwaggerGen(options => options.SwaggerDoc("Admin", new OpenApiInfo { Title = "API - Admin", Version = "v1" }); options.SwaggerDoc("Client", new OpenApiInfo { Title = "API - Client", Version = "v1" }); options.SwaggerDoc("Camera", new OpenApiInfo { Title = "API - Camera", Version = "v1" }); + options.SwaggerDoc("ProgramManager", new OpenApiInfo { Title = "API - ProgramManager", Version = "v1" }); options.DocInclusionPredicate((docName, apiDesc) => string.Equals(docName, apiDesc.GroupName, StringComparison.OrdinalIgnoreCase)); // اضافه کردن پشتیبانی از JWT در Swagger - options.AddSecurityDefinition("Bearer", new Microsoft.OpenApi.Models.OpenApiSecurityScheme - { - Name = "Authorization", - Type = Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey, - Scheme = "Bearer", - BearerFormat = "JWT", - In = Microsoft.OpenApi.Models.ParameterLocation.Header, - Description = "لطفاً 'Bearer [space] token' را وارد کنید." - }); - - options.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement - { - { - new Microsoft.OpenApi.Models.OpenApiSecurityScheme - { - Reference = new Microsoft.OpenApi.Models.OpenApiReference - { - Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme, - Id = "Bearer" - } - }, - Array.Empty() - } - }); + // options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme + // { + // Name = "Authorization", + // Type = SecuritySchemeType.ApiKey, + // Scheme = "Bearer", + // BearerFormat = "JWT", + // In = ParameterLocation.Header, + // Description = "لطفاً 'Bearer [space] token' را وارد کنید." + // }); + // + // options.AddSecurityRequirement(new OpenApiSecurityRequirement + // { + // { + // new Microsoft.OpenApi.Models.OpenApiSecurityScheme + // { + // Reference = new Microsoft.OpenApi.Models.OpenApiReference + // { + // Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme, + // Id = "Bearer" + // } + // }, + // Array.Empty() + // } + // }); options.EnableAnnotations(); }); @@ -396,6 +397,8 @@ if (app.Environment.IsDevelopment()) options.SwaggerEndpoint("/swagger/Admin/swagger.json", "API - Admin"); options.SwaggerEndpoint("/swagger/Client/swagger.json", "API - Client"); options.SwaggerEndpoint("/swagger/Camera/swagger.json", "API - Camera"); + options.SwaggerEndpoint("/swagger/ProgramManager/swagger.json", "API - ProgramManager"); + }); } diff --git a/Shared.Contracts/Holidays/HolidayDto.cs b/Shared.Contracts/Holidays/HolidayDto.cs new file mode 100644 index 00000000..7318b83e --- /dev/null +++ b/Shared.Contracts/Holidays/HolidayDto.cs @@ -0,0 +1,8 @@ +namespace Shared.Contracts.Holidays; + +public record HolidayDto +{ + public DateTime Holidaydate { get; private set; } + public long HolidayId { get; private set; } + public string HolidayYear { get; private set; } +} \ No newline at end of file diff --git a/Shared.Contracts/Holidays/IHolidayQueryService.cs b/Shared.Contracts/Holidays/IHolidayQueryService.cs new file mode 100644 index 00000000..8b41c745 --- /dev/null +++ b/Shared.Contracts/Holidays/IHolidayQueryService.cs @@ -0,0 +1,6 @@ +namespace Shared.Contracts.Holidays; + +public interface IHolidayQueryService +{ + Task> GetHolidaysInDates(DateTime startDate, DateTime endDate); +} \ No newline at end of file diff --git a/Shared.Contracts/PmUser/IPmUserCommandService.cs b/Shared.Contracts/PmUser/IPmUserCommandService.cs new file mode 100644 index 00000000..193bcb71 --- /dev/null +++ b/Shared.Contracts/PmUser/IPmUserCommandService.cs @@ -0,0 +1,6 @@ +namespace Shared.Contracts.PmUser; + +public interface IPmUserCommandService +{ + Task<(bool isSuccess, string pmUserDto)> Create(); +} \ No newline at end of file diff --git a/Shared.Contracts/Shared.Contracts.csproj b/Shared.Contracts/Shared.Contracts.csproj new file mode 100644 index 00000000..237d6616 --- /dev/null +++ b/Shared.Contracts/Shared.Contracts.csproj @@ -0,0 +1,9 @@ + + + + net10.0 + enable + enable + + +