/* This software is licensed by the MIT License, see LICENSE file */ /* Copyright © 2024-2025 Gregory Lirent */ using Microsoft.AspNetCore.Mvc; using WebmrAPI.Models; using WebmrAPI.Services; namespace WebmrAPI.Controllers { [ApiController] [Route("api/v1/[controller]")] [System.Runtime.Versioning.SupportedOSPlatform("windows")] public class WindowsController : ControllerBase { private readonly ProcessMonitor _monitor; private readonly ILogger _logger; public WindowsController(ProcessMonitor monitor, ILogger logger) { _monitor = monitor; _logger = logger; } [HttpGet] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public IActionResult GetWindows( [FromQuery] bool pretty = false, [FromQuery] string sortBy = "", [FromQuery] bool desc = false, [FromQuery] int limit = 0, [FromQuery] int offset = 0, [FromQuery] string search = "" ) { try { var data = _monitor.GetBufferedWindows(); if (data != null && !String.IsNullOrEmpty(search)) { data = data.Where(p => p.Title != null && p.Title.ToLowerInvariant().Contains(search.ToLowerInvariant())); } if (data != null && !String.IsNullOrEmpty(sortBy)) { sortBy = sortBy.ToLowerInvariant(); switch (sortBy) { case "pid": data = ProcessController.Sort(data, p => p.PID, desc); break; case "title": data = ProcessController.Sort(data, p => p.Title, desc); break; case "threadid": data = ProcessController.Sort(data, p => p.ThreadId, desc); break; case "id": data = ProcessController.Sort(data, p => p.Id, desc); break; default: return StatusCode(StatusCodes.Status400BadRequest, $"Unexpected search filter {sortBy}."); } } return Content(ProcessController.GetFormattedJson(ProcessController.Paginate(data, limit, offset), pretty), "application/json"); } catch (Exception ex) { _logger.LogError(ex, "An error occurred when getting the list of windows"); return StatusCode(StatusCodes.Status500InternalServerError, "An internal server error occurred when receiving windows."); } } } }