OnProfNext/OnProfNext.Server/Controllers/OrdersController.cs
2025-10-17 10:41:53 +02:00

230 lines
8.0 KiB
C#

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using OnProfNext.Server.Data;
using OnProfNext.Shared.Models;
using OnProfNext.Shared.Models.DTOs;
namespace OnProfNext.Server.Controllers
{
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class OrdersController : ControllerBase
{
private readonly AppDbContext _context;
public OrdersController(AppDbContext context)
{
_context = context;
}
[HttpGet("byproject/{projectId}")]
public async Task<ActionResult<IEnumerable<OrderDto>>> GetOrdersByProject(int projectId)
{
var orders = await _context.Orders
.Include(o => o.OrderUsers)
.ThenInclude(ou => ou.User)
.Where(o => o.ProjectId == projectId)
.AsNoTracking()
.Select(o => new OrderDto
{
Id = o.Id,
ProjectId = o.ProjectId,
Auftragsnummer = o.Auftragsnummer,
Titel = o.Titel,
Status = o.Status,
Planstunden = o.Planstunden,
Iststunden = o.Iststunden,
MandantId = o.MandantId,
Mitarbeiter = o.OrderUsers
.Select(ou => new UserDto
{
Id = ou.User!.Id,
Username = ou.User.Username,
FirstName = ou.User.FirstName,
LastName = ou.User.LastName,
Email = ou.User.Email
}).ToList()
})
.ToListAsync();
return Ok(orders);
}
// GET: api/orders/5
[HttpGet("{id}")]
public async Task<ActionResult<OrderDto>> GetOrder(int id)
{
var order = await _context.Orders
.Include(o => o.OrderUsers)
.ThenInclude(ou => ou.User)
.AsNoTracking()
.FirstOrDefaultAsync(o => o.Id == id);
if (order == null)
return NotFound();
var dto = new OrderDto
{
Id = order.Id,
ProjectId = order.ProjectId,
Auftragsnummer = order.Auftragsnummer,
Titel = order.Titel,
Status = order.Status,
Planstunden = order.Planstunden,
Iststunden = order.Iststunden,
Projektcode = order.Projektcode,
MandantId = order.MandantId,
CreatedAt = order.CreatedAt,
UpdatedAt = order.UpdatedAt,
Mitarbeiter = order.OrderUsers
.Select(ou => new UserDto
{
Id = ou.User!.Id,
Username = ou.User.Username,
FirstName = ou.User.FirstName,
LastName = ou.User.LastName,
Email = ou.User.Email
}).ToList()
};
return Ok(dto);
}
// POST: api/orders
[HttpPost]
public async Task<ActionResult<OrderDto>> CreateOrder(OrderCreateDto dto)
{
var order = new Order
{
ProjectId = dto.ProjectId,
Auftragsnummer = dto.Auftragsnummer,
Titel = dto.Titel,
Status = dto.Status,
Planstunden = dto.Planstunden,
Iststunden = 0,
MandantId = dto.MandantId,
CreatedAt = DateTime.UtcNow,
UpdatedAt = DateTime.UtcNow
};
_context.Orders.Add(order);
await _context.SaveChangesAsync();
// Mitarbeiter zuordnen
if (dto.UserIds != null && dto.UserIds.Any())
{
var relations = dto.UserIds.Select(uid => new OrderUser
{
OrderId = order.Id,
UserId = uid
});
_context.OrderUsers.AddRange(relations);
await _context.SaveChangesAsync();
}
// Antwort zusammenbauen
var createdDto = new OrderDto
{
Id = order.Id,
ProjectId = order.ProjectId,
Auftragsnummer = order.Auftragsnummer,
Titel = order.Titel,
Status = order.Status,
Planstunden = order.Planstunden,
Iststunden = order.Iststunden,
MandantId = order.MandantId,
CreatedAt = order.CreatedAt,
UpdatedAt = order.UpdatedAt
};
return CreatedAtAction(nameof(GetOrder), new { id = order.Id }, createdDto);
}
//PUT: api/orders/5
[HttpPut("{id}")]
public async Task<IActionResult> UpdateOrder(int id, OrderDto dto)
{
var order = await _context.Orders.FindAsync(id);
if (order == null) return NotFound();
order.Titel = dto.Titel;
order.Status = dto.Status;
order.Planstunden = dto.Planstunden;
order.Iststunden = dto.Iststunden;
order.Projektcode = dto.Projektcode;
order.UpdatedAt = DateTime.UtcNow;
await _context.SaveChangesAsync();
return NoContent();
}
// DELETE: api/orders/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteOrder(int id)
{
var order = await _context.Orders
.Include(o => o.OrderUsers)
.FirstOrDefaultAsync(o => o.Id == id);
if (order == null)
return NotFound();
_context.OrderUsers.RemoveRange(order.OrderUsers);
_context.Orders.Remove(order);
await _context.SaveChangesAsync();
return NoContent();
}
private int GetCurrentUserId()
{
var userIdClaim = User.FindFirst("UserId")?.Value;
if (string.IsNullOrEmpty(userIdClaim))
throw new UnauthorizedAccessException("Kein User-Claim im Token gefunden.");
return int.Parse(userIdClaim);
}
[HttpGet("mine")]
public async Task<ActionResult<IEnumerable<OrderDto>>> GetMyOrders()
{
var userId = GetCurrentUserId();
var orders = await _context.Orders
.Include(o => o.OrderUsers)
.ThenInclude(ou => ou.User)
.Where(o => o.OrderUsers.Any(ou => ou.UserId == userId))
.AsNoTracking()
.Select(o => new OrderDto
{
Id = o.Id,
ProjectId = o.ProjectId,
Auftragsnummer = o.Auftragsnummer,
Titel = o.Titel,
Status = o.Status,
Planstunden = o.Planstunden,
Iststunden = o.Iststunden,
Projektcode = o.Projektcode,
MandantId = o.MandantId,
CreatedAt = o.CreatedAt,
UpdatedAt = o.UpdatedAt,
Mitarbeiter = o.OrderUsers
.Select(ou => new UserDto
{
Id = ou.User!.Id,
Username = ou.User.Username,
FirstName = ou.User.FirstName,
LastName = ou.User.LastName,
Email = ou.User.Email
}).ToList()
})
.ToListAsync();
return Ok(orders);
}
}
}