OnProfNext/OnProfNext.Server/Controllers/ProjectController.cs
2025-10-15 13:29:50 +02:00

148 lines
4.6 KiB
C#

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 ProjectController : ControllerBase
{
private readonly AppDbContext _context;
public ProjectController(AppDbContext context)
{
_context = context;
}
//GET api/project
[HttpGet]
public async Task<ActionResult<IEnumerable<ProjectDto>>> GetProjects()
{
var projects = await _context.Set<Project>().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<ActionResult<Project>> GetProject(int id)
{
var project = await _context.Set<Project>().FindAsync(id);
if (project == null)
{
return NotFound();
}
return project;
}
//POST : api/project
[HttpPost]
public async Task<ActionResult<ProjectDto>> 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<IActionResult> 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<IActionResult> DeleteProject(int id)
{
var project = await _context.Projects.FindAsync(id);
if (project == null)
return NotFound();
_context.Projects.Remove(project);
await _context.SaveChangesAsync();
return NoContent();
}
}
}