using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using OnProfNext.Server.Data; using OnProfNext.Shared.Models; using OnProfNext.Shared.Models.DTOs; namespace OnProfNext.Server.Controllers { [ApiController] [Route("api/[controller]")] public class ProjectsController : ControllerBase { private readonly AppDbContext _context; public ProjectsController(AppDbContext context) { _context = context; } //GET api/project [HttpGet] public async Task>> GetProjects() { var projects = await _context.Set().Include(p => p.ProjectUsers).ThenInclude(pu => pu.User).ToListAsync(); var result = projects.Select(p => new ProjectDto { Id = p.Id, ProjectName = p.ProjectName, Description = p.Description, Status = p.Status, StartDate = p.StartDate, EndDate = p.EndDate, MandantId = p.MandantId, CreatedAt = p.CreatedAt, UpdatedAt = p.UpdatedAt, ProjectManagers = p.ProjectUsers .Select(pu => new UserShortDto { Id = pu.User.Id, Username = pu.User.Username, FirstName = pu.User.FirstName, LastName = pu.User.LastName }).ToList() }).ToList(); return Ok(result); } //GET: api/project/5 [HttpGet("{id}")] public async Task> GetProject(int id) { var project = await _context.Set().FindAsync(id); if (project == null) { return NotFound(); } return project; } //POST : api/project [HttpPost] public async Task> CreateProject(ProjectCreateDto dto) { var project = new Project { ProjectName = dto.ProjectName, Description = dto.Description, Status = dto.Status, StartDate = dto.StartDate, EndDate = dto.EndDate, MandantId = dto.MandantId, CreatedAt = DateTime.UtcNow, UpdatedAt = DateTime.UtcNow }; _context.Projects.Add(project); await _context.SaveChangesAsync(); // Relationseinträge hinzufügen foreach (var userId in dto.ProjectManagerIds) { _context.ProjectUsers.Add(new ProjectUser { ProjectId = project.Id, UserId = userId }); } await _context.SaveChangesAsync(); return CreatedAtAction(nameof(GetProjects), new { id = project.Id }, dto); } //PUT: api/project/5 [HttpPut("{id}")] public async Task UpdateProject(int id, ProjectCreateDto dto) { var project = await _context.Projects .Include(p => p.ProjectUsers) .FirstOrDefaultAsync(p => p.Id == id); if (project == null) return NotFound(); // Grunddaten aktualisieren project.ProjectName = dto.ProjectName; project.Description = dto.Description; project.Status = dto.Status; project.StartDate = dto.StartDate; project.EndDate = dto.EndDate; project.UpdatedAt = DateTime.UtcNow; // Projektleiter aktualisieren project.ProjectUsers.Clear(); foreach (var userId in dto.ProjectManagerIds) { project.ProjectUsers.Add(new ProjectUser { ProjectId = project.Id, UserId = userId }); } await _context.SaveChangesAsync(); return NoContent(); } //DELETE: api/project/5 [HttpDelete("{id}")] public async Task DeleteProject(int id) { var project = await _context.Projects.FindAsync(id); if (project == null) return NotFound(); _context.Projects.Remove(project); await _context.SaveChangesAsync(); return NoContent(); } } }