From 219e64c0f71576e5e5f983c6406162b62fa638ca Mon Sep 17 00:00:00 2001 From: mahan Date: Mon, 29 Dec 2025 09:35:33 +0330 Subject: [PATCH 01/10] add menu --- ServiceHost/Areas/Client/Pages/Shared/_Menu.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 @@ From c09321d89dd11d07cb7a0347ee1df1eb728ce647 Mon Sep 17 00:00:00 2001 From: Mahan Chamani <109232147+mahanch@users.noreply.github.com> Date: Mon, 29 Dec 2025 09:50:40 +0330 Subject: [PATCH 02/10] Update dotnet-developPublish.yml --- .github/workflows/dotnet-developPublish.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/dotnet-developPublish.yml b/.github/workflows/dotnet-developPublish.yml index 934a413f..07ffb835 100644 --- a/.github/workflows/dotnet-developPublish.yml +++ b/.github/workflows/dotnet-developPublish.yml @@ -3,10 +3,8 @@ name: Deploy Development ASP.NET Core App to IIS on: push: branches: - - Main + - Master -env: - DOTNET_ENVIRONMENT: Development jobs: build-and-deploy: @@ -37,12 +35,8 @@ jobs: & "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://185.208.175.186:8172/msdeploy.axd?site=gozareshgir",userName="deployUser",password="As@D3eP%L%oYU$ser",authType="Basic" ` -allowUntrusted ` -enableRule:AppOffline - env: - SERVER_HOST: your-server-ip-or-domain - DEPLOY_USER: ${{ secrets.DEPLOY_USER }} - DEPLOY_PASSWORD: ${{ secrets.DEPLOY_PASSWORD }} From 5c1547dced8ecdafc34166ec91a86f088ec1e384 Mon Sep 17 00:00:00 2001 From: Mahan Chamani <109232147+mahanch@users.noreply.github.com> Date: Mon, 29 Dec 2025 09:51:06 +0330 Subject: [PATCH 03/10] Update dotnet-developPublish.yml --- .github/workflows/dotnet-developPublish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnet-developPublish.yml b/.github/workflows/dotnet-developPublish.yml index 07ffb835..91db0afc 100644 --- a/.github/workflows/dotnet-developPublish.yml +++ b/.github/workflows/dotnet-developPublish.yml @@ -3,7 +3,7 @@ name: Deploy Development ASP.NET Core App to IIS on: push: branches: - - Master + - master jobs: From 8496b520131c18556292a87cae59a0dbe97e3e5b Mon Sep 17 00:00:00 2001 From: Mahan Chamani <109232147+mahanch@users.noreply.github.com> Date: Mon, 29 Dec 2025 11:17:59 +0330 Subject: [PATCH 04/10] Change deployment target from master to Main Updated deployment configuration with new server details. --- .github/workflows/dotnet-developPublish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dotnet-developPublish.yml b/.github/workflows/dotnet-developPublish.yml index 91db0afc..0b285b3d 100644 --- a/.github/workflows/dotnet-developPublish.yml +++ b/.github/workflows/dotnet-developPublish.yml @@ -3,7 +3,7 @@ name: Deploy Development ASP.NET Core App to IIS on: push: branches: - - master + - Main jobs: @@ -35,7 +35,7 @@ jobs: & "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" ` -verb:sync ` -source:contentPath="$publishFolder" ` - -dest:contentPath="dadmehrg",computerName="https://185.208.175.186:8172/msdeploy.axd?site=gozareshgir",userName="deployUser",password="As@D3eP%L%oYU$ser",authType="Basic" ` + -dest:contentPath="dadmehrg",computerName="https://1111:8172/msdeploy.axd?site=gozareshgir",userName="111",password="111",authType="Basic" ` -allowUntrusted ` -enableRule:AppOffline From 9e5e8d8e5d4741d8c3c8aece66b5534c59250916 Mon Sep 17 00:00:00 2001 From: mahan Date: Mon, 29 Dec 2025 11:45:32 +0330 Subject: [PATCH 05/10] refactor: improve code formatting and structure in ProjectController --- .../ProgramManager/ProjectController.cs | 63 +++++++++++-------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/ServiceHost/Areas/Admin/Controllers/ProgramManager/ProjectController.cs b/ServiceHost/Areas/Admin/Controllers/ProgramManager/ProjectController.cs index 31c91ecb..39b40a19 100644 --- a/ServiceHost/Areas/Admin/Controllers/ProgramManager/ProjectController.cs +++ b/ServiceHost/Areas/Admin/Controllers/ProgramManager/ProjectController.cs @@ -23,70 +23,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(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(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 +103,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 +124,16 @@ public class ProjectController : ProgramManagerBaseController [HttpGet("deploy-board")] public async Task>> GetProjectDeployBoard() { + 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 From d855684cd71ac1af9cec270b9bfca0a36c65216f Mon Sep 17 00:00:00 2001 From: mahan Date: Mon, 29 Dec 2025 12:16:51 +0330 Subject: [PATCH 06/10] add: implement AutoUpdateDeployStatusCommand for automatic deployment status updates --- .../AutoUpdateDeployStatusCommand.cs | 52 +++++++++++++++++++ .../ProgramManager/ProjectController.cs | 4 +- 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/AutoUpdateDeployStatus/AutoUpdateDeployStatusCommand.cs 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 39b40a19..a0fe2e7c 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; @@ -124,7 +125,8 @@ 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); } From bd1c1fa8148284b0ec5ccf4fea833199ca3dba3a Mon Sep 17 00:00:00 2001 From: Mahan Chamani <109232147+mahanch@users.noreply.github.com> Date: Mon, 29 Dec 2025 12:22:10 +0330 Subject: [PATCH 07/10] Refactor deployment script to use env variables Updated deployment configuration to use environment variables for server host and credentials. --- .github/workflows/dotnet-developPublish.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dotnet-developPublish.yml b/.github/workflows/dotnet-developPublish.yml index 0b285b3d..4053dc8c 100644 --- a/.github/workflows/dotnet-developPublish.yml +++ b/.github/workflows/dotnet-developPublish.yml @@ -35,8 +35,11 @@ jobs: & "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" ` -verb:sync ` -source:contentPath="$publishFolder" ` - -dest:contentPath="dadmehrg",computerName="https://1111:8172/msdeploy.axd?site=gozareshgir",userName="111",password="111",authType="Basic" ` + -dest:contentPath="dadmehrg",computerName="https://$env:SERVER_HOST:8172/msdeploy.axd?site=gozareshgir",userName="$env:DEPLOY_USER",password="$env:DEPLOY_PASSWORD",authType="Basic" ` -allowUntrusted ` -enableRule:AppOffline - - + + env: + SERVER_HOST: 171.22.24.15 + DEPLOY_USER: ${{ secrets.DEPLOY_USER }} + DEPLOY_PASSWORD: ${{ secrets.DEPLOY_PASSWORD }} From 098233fd1b2c8debe02f49cca81cd2da861b9716 Mon Sep 17 00:00:00 2001 From: Mahan Chamani <109232147+mahanch@users.noreply.github.com> Date: Mon, 29 Dec 2025 12:42:26 +0330 Subject: [PATCH 08/10] Refactor deployment script to use environment variables --- .github/workflows/dotnet-developPublish.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dotnet-developPublish.yml b/.github/workflows/dotnet-developPublish.yml index 4b5a1e48..79c2e5bd 100644 --- a/.github/workflows/dotnet-developPublish.yml +++ b/.github/workflows/dotnet-developPublish.yml @@ -33,14 +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://$env:SERVER_HOST:8172/msdeploy.axd?site=gozareshgir",userName="$env:DEPLOY_USER",password="$env:DEPLOY_PASSWORD",authType="Basic" ` + -dest:contentPath="dadmehrg",computerName="https://${server}:8172/msdeploy.axd?site=gozareshgir",userName="$user",password="$pass",authType="Basic" ` -allowUntrusted ` -enableRule:AppOffline - env: + env: SERVER_HOST: 171.22.24.15 DEPLOY_USER: ${{ secrets.DEPLOY_USER }} DEPLOY_PASSWORD: ${{ secrets.DEPLOY_PASSWORD }} From fe4e81a60ce4ce9ac42d82e470fc54b7b95fb9e1 Mon Sep 17 00:00:00 2001 From: sadegh Farokhi <47900503+syntax24@users.noreply.github.com> Date: Mon, 29 Dec 2025 12:56:16 +0330 Subject: [PATCH 09/10] Update dotnet-developPublish.yml --- .github/workflows/dotnet-developPublish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dotnet-developPublish.yml b/.github/workflows/dotnet-developPublish.yml index 79c2e5bd..2a09e131 100644 --- a/.github/workflows/dotnet-developPublish.yml +++ b/.github/workflows/dotnet-developPublish.yml @@ -45,6 +45,6 @@ jobs: -enableRule:AppOffline env: - SERVER_HOST: 171.22.24.15 - DEPLOY_USER: ${{ secrets.DEPLOY_USER }} - DEPLOY_PASSWORD: ${{ secrets.DEPLOY_PASSWORD }} + SERVER_HOST: ${{ secrets.DEV_HOST }} + DEPLOY_USER: ${{ secrets.DEV_USER }} + DEPLOY_PASSWORD: ${{ secrets.DEV_PASS }} From 8e6defb29eeea22753e78de69616f6163836127e Mon Sep 17 00:00:00 2001 From: sadegh Farokhi <47900503+syntax24@users.noreply.github.com> Date: Mon, 29 Dec 2025 13:00:43 +0330 Subject: [PATCH 10/10] Update dotnet-developPublish.yml --- .github/workflows/dotnet-developPublish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnet-developPublish.yml b/.github/workflows/dotnet-developPublish.yml index 2a09e131..d99d345e 100644 --- a/.github/workflows/dotnet-developPublish.yml +++ b/.github/workflows/dotnet-developPublish.yml @@ -40,7 +40,7 @@ jobs: & "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" ` -verb:sync ` -source:contentPath="$publishFolder" ` - -dest:contentPath="dadmehrg",computerName="https://${server}:8172/msdeploy.axd?site=gozareshgir",userName="$user",password="$pass",authType="Basic" ` + -dest:contentPath="dadmehrg",computerName="https://${server}:8172/msdeploy.axd?site=dadmehrg",userName="$user",password="$pass",authType="Basic" ` -allowUntrusted ` -enableRule:AppOffline