using Nexus.Api.Data; using Nexus.Api.DTOs; using Nexus.Api.Repositories; namespace Nexus.Api.Services; public sealed class ProjectService( IProjectRepository projectRepo, IActivityRepository activityRepo) : IProjectService { public async Task> GetAllAsync(CancellationToken ct = default) => await projectRepo.GetAllAsync(ct); public async Task GetByIdAsync(Guid id, CancellationToken ct = default) => await projectRepo.GetByIdAsync(id, ct); public async Task CreateAsync(CreateProjectRequest request, CancellationToken ct = default) { var project = new Project { Name = request.Name.Trim(), Description = request.Description?.Trim() ?? string.Empty, Status = OperationalStatus.Online }; await projectRepo.AddAsync(project, ct); await activityRepo.AddAsync(new ActivityEvent { Type = "project", Message = $"Project {project.Name} created" }, ct); return project; } public async Task UpdateAsync(Guid id, UpdateProjectRequest request, CancellationToken ct = default) { var project = await projectRepo.GetByIdAsync(id, ct); if (project is null) return null; if (!string.IsNullOrWhiteSpace(request.Name)) project.Name = request.Name.Trim(); if (request.Description is not null) project.Description = request.Description.Trim(); if (!string.IsNullOrWhiteSpace(request.Status) && Enum.TryParse(request.Status, true, out var parsedStatus)) project.Status = parsedStatus; await projectRepo.UpdateAsync(project, ct); await activityRepo.AddAsync(new ActivityEvent { Type = "project", Message = $"Project {project.Name} updated" }, ct); return project; } public async Task DeleteAsync(Guid id, CancellationToken ct = default) { var project = await projectRepo.GetByIdAsync(id, ct); if (project is null) return new ProjectDeleteResult(ProjectDeleteOutcome.NotFound); if (await projectRepo.HasTasksAsync(id, ct)) { project.Status = OperationalStatus.Offline; await projectRepo.UpdateAsync(project, ct); await activityRepo.AddAsync(new ActivityEvent { Type = "project", Message = $"Project {project.Name} archived" }, ct); return new ProjectDeleteResult(ProjectDeleteOutcome.Archived, project); } await activityRepo.AddAsync(new ActivityEvent { Type = "project", Message = $"Project {project.Name} deleted" }, ct); await projectRepo.DeleteAsync(project, ct); return new ProjectDeleteResult(ProjectDeleteOutcome.Deleted); } }