diff --git a/.github/workflows/dotnet-developPublish.yml b/.github/workflows/dotnet-developPublish.yml index 90302b17..d99d345e 100644 --- a/.github/workflows/dotnet-developPublish.yml +++ b/.github/workflows/dotnet-developPublish.yml @@ -19,7 +19,7 @@ jobs: - name: Setup .NET SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.0.x' + dotnet-version: '10.0.x' - name: Restore dependencies run: dotnet restore ServiceHost/ServiceHost.csproj @@ -33,9 +33,18 @@ jobs: shell: powershell run: | $publishFolder = Resolve-Path ./publish + $server = $env:SERVER_HOST + $user = $env:DEPLOY_USER + $pass = $env:DEPLOY_PASSWORD + & "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" ` -verb:sync ` -source:contentPath="$publishFolder" ` - -dest:contentPath="dadmehrg",computerName="https://171.22.24.15:8172/msdeploy.axd?site=dadmehrg",userName="Administrator",password="R",authType="Basic" ` + -dest:contentPath="dadmehrg",computerName="https://${server}:8172/msdeploy.axd?site=dadmehrg",userName="$user",password="$pass",authType="Basic" ` -allowUntrusted ` -enableRule:AppOffline + + env: + SERVER_HOST: ${{ secrets.DEV_HOST }} + DEPLOY_USER: ${{ secrets.DEV_USER }} + DEPLOY_PASSWORD: ${{ secrets.DEV_PASS }} diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/AutoUpdateDeployStatus/AutoUpdateDeployStatusCommand.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/AutoUpdateDeployStatus/AutoUpdateDeployStatusCommand.cs new file mode 100644 index 00000000..5164a0c0 --- /dev/null +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/AutoUpdateDeployStatus/AutoUpdateDeployStatusCommand.cs @@ -0,0 +1,52 @@ +using System.Linq; +using GozareshgirProgramManager.Application._Common.Interfaces; +using GozareshgirProgramManager.Application._Common.Models; +using GozareshgirProgramManager.Domain.ProjectAgg.Entities; +using GozareshgirProgramManager.Domain.ProjectAgg.Enums; +using Microsoft.EntityFrameworkCore; + +namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.AutoUpdateDeployStatus; + +public record AutoUpdateDeployStatusCommand : IBaseCommand; + +public class AutoUpdateDeployStatusCommandHandler : IBaseCommandHandler +{ + private readonly IProgramManagerDbContext _dbContext; + + public AutoUpdateDeployStatusCommandHandler(IProgramManagerDbContext dbContext) + { + _dbContext = dbContext; + } + + public async Task Handle(AutoUpdateDeployStatusCommand request, + CancellationToken cancellationToken) + { + // Fetch all sections whose phase is still marked as not completed + var sections = await _dbContext.TaskSections + .Include(ts => ts.Task) + .ThenInclude(t => t.Phase) + .Where(ts => ts.Task.Phase.DeployStatus == ProjectDeployStatus.NoTCompleted) + .ToListAsync(cancellationToken); + + if (sections.Count == 0) + return OperationResult.Success(); + + var phasesToUpdate = sections + .GroupBy(ts => ts.Task.PhaseId) + .Where(g => g.All(s => s.Status == TaskSectionStatus.Completed)) + .Select(g => g.First().Task.Phase) + .Distinct() + .ToList(); + + if (phasesToUpdate.Count == 0) + return OperationResult.Success(); + + foreach (var phase in phasesToUpdate) + { + phase.UpdateDeployStatus(ProjectDeployStatus.PendingDevDeploy); + } + + await _dbContext.SaveChangesAsync(cancellationToken); + return OperationResult.Success(); + } +} diff --git a/ServiceHost/Areas/Admin/Controllers/ProgramManager/ProjectController.cs b/ServiceHost/Areas/Admin/Controllers/ProgramManager/ProjectController.cs index 3381ce20..82ba9201 100644 --- a/ServiceHost/Areas/Admin/Controllers/ProgramManager/ProjectController.cs +++ b/ServiceHost/Areas/Admin/Controllers/ProgramManager/ProjectController.cs @@ -2,6 +2,7 @@ using GozareshgirProgramManager.Application._Common.Models; using GozareshgirProgramManager.Application.Modules.Projects.Commands.AssignProject; using GozareshgirProgramManager.Application.Modules.Projects.Commands.AutoStopOverTimeTaskSections; +using GozareshgirProgramManager.Application.Modules.Projects.Commands.AutoUpdateDeployStatus; using GozareshgirProgramManager.Application.Modules.Projects.Commands.ChangeStatusSection; using GozareshgirProgramManager.Application.Modules.Projects.Commands.CreateProject; using GozareshgirProgramManager.Application.Modules.Projects.Commands.DeleteProject; @@ -23,70 +24,75 @@ namespace ServiceHost.Areas.Admin.Controllers.ProgramManager; public class ProjectController : ProgramManagerBaseController { private readonly IMediator _mediator; - + public ProjectController(IMediator mediator) { _mediator = mediator; } [HttpGet] - public async Task>> Get([FromQuery]GetProjectsListQuery query) + public async Task>> Get( + [FromQuery] GetProjectsListQuery query) { - var res=await _mediator.Send(query); + var res = await _mediator.Send(query); return res; } - + [HttpPost] public async Task> Create([FromBody] CreateProjectCommand command) { - var res=await _mediator.Send(command); + var res = await _mediator.Send(command); return res; } - + [HttpPut] public async Task> Edit([FromBody] EditProjectCommand command) { - var res=await _mediator.Send(command); + var res = await _mediator.Send(command); return res; } - + [HttpDelete] public async Task> Delete([FromQuery] DeleteProjectCommand command) { - var res=await _mediator.Send(command); + var res = await _mediator.Send(command); return res; } - + [HttpGet("assign")] - public async Task>> GetAssignableProjects(GetProjectAssignDetailsQuery query) + public async Task>> GetAssignableProjects( + GetProjectAssignDetailsQuery query) { - var res=await _mediator.Send(query); + var res = await _mediator.Send(query); return res; } - + [HttpPost("assign")] public async Task> Assign([FromBody] AssignProjectCommand command) { - var res=await _mediator.Send(command); + var res = await _mediator.Send(command); return res; } + [HttpGet("set-time")] - public async Task>> GetSetTimeProjectDetails(ProjectSetTimeDetailsQuery query) + public async Task>> GetSetTimeProjectDetails( + ProjectSetTimeDetailsQuery query) { - var res=await _mediator.Send(query); + var res = await _mediator.Send(query); return res; } + [HttpPost("set-time")] public async Task> SetTimeProject([FromBody] SetTimeProjectCommand command) { - var res=await _mediator.Send(command); + var res = await _mediator.Send(command); return res; } [HttpPost("change-status")] public async Task> ChangeStatus(ChangeStatusSectionCommand command) { - var res = await _mediator.Send(command); + var res = await _mediator.Send(command); return res; } @@ -98,14 +104,16 @@ public class ProjectController : ProgramManagerBaseController } [HttpGet("board")] - public async Task>>> GetProjectBoard([FromQuery] ProjectBoardListQuery query) + public async Task>>> GetProjectBoard( + [FromQuery] ProjectBoardListQuery query) { // اجرای Command برای متوقف کردن تسک‌های overtime قبل از نمایش await _mediator.Send(new AutoStopOverTimeTaskSectionsCommand()); - + var res = await _mediator.Send(query); return res; } + [HttpGet("board/details")] public async Task>> GetProjectBoardDetails(Guid id) { @@ -117,14 +125,17 @@ public class ProjectController : ProgramManagerBaseController [HttpGet("deploy-board")] public async Task>> GetProjectDeployBoard() { + // قبل از دریافت دیتا، وضعیت دیپلوی را بر اساس تکمیل شدن تمام سکشن‌ها به‌روزرسانی می‌کنیم + await _mediator.Send(new AutoUpdateDeployStatusCommand()); var request = new GetProjectDeployBoardListQuery(); return await _mediator.Send(request); } - [HttpGet("deploy-board/details")] - public async Task>> GetProjectDeployBoardDetails(Guid id) - { - var query = new ProjectBoardDetailQuery(id); - var res = await _mediator.Send(query); - return res; - } + + [HttpGet("deploy-board/details")] + public async Task>> GetProjectDeployBoardDetails(Guid id) + { + var query = new ProjectBoardDetailQuery(id); + var res = await _mediator.Send(query); + return res; + } } \ No newline at end of file diff --git a/ServiceHost/Areas/Client/Pages/Shared/_Menu.cshtml b/ServiceHost/Areas/Client/Pages/Shared/_Menu.cshtml index b1e830a2..d5d99f6c 100644 --- a/ServiceHost/Areas/Client/Pages/Shared/_Menu.cshtml +++ b/ServiceHost/Areas/Client/Pages/Shared/_Menu.cshtml @@ -93,7 +93,7 @@