using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using OnProfNext.Server.Data; using OnProfNext.Server.Services; using OnProfNext.Shared.Models; using OnProfNext.Shared.Models.DTOs; namespace OnProfNext.Server.Controllers { [ApiController] [Route("api/[controller]")] public class UsersController : ControllerBase { private readonly AppDbContext _context; public UsersController(AppDbContext context) { _context = context; } //GET: api/users [HttpGet] public async Task>> GetUsers() { var users = await _context.Users.AsNoTracking().Select(u => new UserDto { Id = u.Id, Username = u.Username, Email = u.Email, FirstName = u.FirstName, LastName = u.LastName, MandantId = u.MandantId, IsActive = u.IsActive }).ToListAsync(); return Ok(users); } //GET: api/users/5 [HttpGet("{id}")] public async Task> GetUser(int id) { var user = await _context.Users .AsNoTracking() .Where(u => u.Id == id) .Select(u => new UserDto { Id = u.Id, Username = u.Username, Email = u.Email, FirstName = u.FirstName, LastName = u.LastName, MandantId = u.MandantId, IsActive = u.IsActive }) .FirstOrDefaultAsync(); if (user == null) return NotFound(); return Ok(user); } //POST: api/users [AllowAnonymous] [HttpPost] public async Task> CreateUser(User user) { user.PasswordHash = PasswordHasher.HashPassword(user.PasswordHash); user.CreatedAt = DateTime.UtcNow; user.UpdatedAt = DateTime.UtcNow; _context.Users.Add(user); await _context.SaveChangesAsync(); return CreatedAtAction(nameof(GetUser), new { id = user.Id }, user); } //PUT: api/users/5 [HttpPut("{id}")] public async Task UpdateUser(int id, User user) { if (id != user.Id) { return BadRequest(); } var existingUser = await _context.Users.FindAsync(id); if (existingUser == null) { return NotFound(); } existingUser.Username = user.Username; existingUser.Email = user.Email; if (!string.IsNullOrEmpty(user.PasswordHash)) { existingUser.PasswordHash = PasswordHasher.HashPassword(user.PasswordHash); } existingUser.FirstName = user.FirstName; existingUser.LastName = user.LastName; existingUser.MandantId = user.MandantId; existingUser.IsActive = user.IsActive; existingUser.UpdatedAt = DateTime.UtcNow; _context.Entry(existingUser).State = EntityState.Modified; await _context.SaveChangesAsync(); return NoContent(); } //DELETE: api/users/5 [HttpDelete("{id}")] public async Task DeleteUser(int id) { var user = await _context.Users.FindAsync(id); if(user == null) { return NotFound(); } _context.Users.Remove(user); await _context.SaveChangesAsync(); return NoContent(); } } }