using System.Diagnostics; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using watcher_monitoring.Models; using watcher_monitoring.Data; using watcher_monitoring.Attributes; using watcher_monitoring.Payloads; namespace watcher_monitoring.Controllers; [ApiController] [Route("[controller]")] [ApiKeyAuth] public class APIController : Controller { private readonly WatcherDbContext _context; private readonly ILogger _logger; public APIController(WatcherDbContext context, ILogger logger) { _context = context; _logger = logger; } // Server Calls [HttpGet("get-server")] public async Task Servers() { List servers = await _context.Servers.ToListAsync(); return Ok(); } [HttpPost("add-server")] public async Task AddServer() { return Ok(); } [HttpDelete("delete-server/{id}")] public async Task DeleteServer(int id) { var server = await _context.Servers.FindAsync(id); if (server == null) { _logger.LogError("Server nicht gefunden"); return BadRequest(); } _context.Servers.Remove(server); await _context.SaveChangesAsync(); _logger.LogInformation("Server '{server}' erfolgreich gelöscht", server.Name); return Ok(); } [HttpPut("edit-server")] public async Task EditServer() { return Ok(); } // Container Calls [HttpGet("get-container")] public async Task Containers() { List containers = await _context.Containers.ToListAsync(); return Ok(); } [HttpDelete("delete-container")] public async Task DeleteContainer(int id) { var container = await _context.Containers.FindAsync(id); if (container == null) { _logger.LogError("Server nicht gefunden"); return BadRequest(); } try { _context.Containers.Remove(container); await _context.SaveChangesAsync(); _logger.LogInformation("Container '{container}' erfolgreich gelöscht", container.Id); return Ok(); } catch (Exception ex) { _logger.LogError(ex.Message); return BadRequest(); } } // Agent Calls // Registration Endpoint for watcher-agent [HttpPost("agent-register")] public async Task Register([FromBody] RegistrationDto dto) { // payload check if (!ModelState.IsValid) { var errors = ModelState.Values .SelectMany(v => v.Errors) .Select(e => e.ErrorMessage) .ToList(); _logger.LogError("Invalid registration payload"); return BadRequest(new { error = "Invalid registration payload", details = errors }); } try { Server server = new Server { Name = "test", IPAddress = dto.IpAddress }; _context.Servers.Add(server); await _context.SaveChangesAsync(); return Ok(); } catch (Exception ex) { Console.WriteLine(ex.Message); _logger.LogError(ex.Message); return BadRequest(); } } // Hardware Configuration Endpoint for watcher-agent [HttpPost("agent-hardware")] public async Task HardwareConfiguration ([FromBody] HardwareDto dto) { // payload check if (!ModelState.IsValid) { var errors = ModelState.Values .SelectMany(v => v.Errors) .Select(e => e.ErrorMessage) .ToList(); _logger.LogError("Invalid hardware configuration"); return BadRequest(new { error = "Invalid Hardware Configuration Payload", details = errors }); } try { // Find Server in Database var server = await _context.Servers.FindAsync(dto.Id); if (server == null) { _logger.LogError("Server nicht gefunden"); return BadRequest("Server not found"); } // Add Hardware Configuration server.CpuType = dto.CpuType; server.CpuCores = dto.CpuCores; server.GpuType = dto.GpuType; server.RamSize = dto.RamSize; // Diskspace fehlt await _context.SaveChangesAsync(); _logger.LogInformation("Harware configuration successfull for server {server}", server.Name); } catch (Exception ex) { _logger.LogError(ex.Message); return BadRequest(ex.Message); } return Ok(); } // Server-Metrics endpoint for watcher-agent [HttpPost("agent-server-metrics/{id}")] public async Task ServerMetrics ([FromBody] HardwareDto dto) { return Ok(); } // Service-Detection endpoint for watcher-agent [HttpPost("agent-container-detection")] public async Task ContainerDetection ([FromBody] HardwareDto dto) { return Ok(); } // Container-Metrics endpoint for watcher-agent [HttpPost("agent-container-metrics/{id}")] public async Task ContainerMetrics ([FromBody] HardwareDto dto) { return Ok(); } }