using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using RobotNet.Script.Shares; using RobotNet.ScriptManager.Data; using RobotNet.ScriptManager.Services; using RobotNet.Shares; using System.Security.Claims; namespace RobotNet.ScriptManager.Controllers; [Route("api/[controller]")] [ApiController] [Authorize] public class ScriptMissionsController(ScriptMissionManager missionManager, ScriptManagerDbContext scriptManagerDb, ScriptMissionCreator missionCreator) : ControllerBase { [HttpGet] [Route("")] public IEnumerable GetAlls() => missionManager.GetMissionDatas(); [HttpGet] [Route("Runner")] public async Task> Search( [FromQuery(Name = "txtSearch")] string? txtSearch, [FromQuery(Name = "page")] int page, [FromQuery(Name = "size")] int size) { IOrderedQueryable query; if (string.IsNullOrWhiteSpace(txtSearch)) { query = scriptManagerDb.InstanceMissions.AsQueryable().OrderByDescending(x => x.CreatedAt); } else { query = scriptManagerDb.InstanceMissions.AsQueryable().Where(x => x.MissionName.Contains(txtSearch)).OrderByDescending(x => x.CreatedAt); } var total = await query.CountAsync(); // Đảm bảo size hợp lệ if (size <= 0) size = 10; // Tính tổng số trang var totalPages = (int)Math.Ceiling(total / (double)size); // Đảm bảo page hợp lệ if (page <= 0) page = 1; if (page > totalPages && totalPages > 0) page = totalPages; // Nếu không có dữ liệu, trả về rỗng var items = Enumerable.Empty(); if (total > 0) { items = [.. await query .OrderByDescending(x => x.CreatedAt) .Skip((page - 1) * size) .Take(size) .Select(x => new InstanceMissionDto { Id = x.Id, MissionName = x.MissionName, Parameters = x.Parameters, CreatedAt = x.CreatedAt, Status = x.Status, Log = x.Log }) .ToListAsync()]; } return new SearchResult { Total = total, Page = page, Size = size, Items = items }; } [HttpPost] [Route("Runner")] public async Task> Create(InstanceMissionCreateModel model) { try { var id = await missionCreator.CreateMissionAsync(model.Name, model.Parameters); return new(true, "Tạo nhiệm vụ thành công") { Data = id }; } catch (Exception ex) { return new MessageResult(false, $"Lỗi khi tạo nhiệm vụ: {ex.Message}"); } } [HttpDelete] [Route("Runner/{id:guid}")] public async Task Cancel(Guid id, [FromQuery] string? reason) { if (missionManager.Cancel(id, $"Cancel by user '{HttpContext.User.FindFirst(ClaimTypes.Name)?.Value??HttpContext.User.Identity?.Name}' with reason '{reason}'")) { var mission = await scriptManagerDb.InstanceMissions.FindAsync(id); if (mission != null) { mission.Status = MissionStatus.Canceling; await scriptManagerDb.SaveChangesAsync(); } return new MessageResult(true, "Gửi yêu cầu hủy nhiệm vụ thành công"); } else { return new MessageResult(false, "Không thể hủy nhiệm vụ này hoặc nhiệm vụ không tồn tại"); } } [HttpPut] [Route("Runner/{id:guid}/pause")] public async Task Pause(Guid id) { if (missionManager.Pause(id)) { var mission = await scriptManagerDb.InstanceMissions.FindAsync(id); if (mission != null) { mission.Status = MissionStatus.Pausing; await scriptManagerDb.SaveChangesAsync(); } return new MessageResult(true, "Gửi yêu cầu tạm dừng nhiệm vụ thành công"); } else { return new MessageResult(false, "Không thể tạm dừng nhiệm vụ này hoặc nhiệm vụ không tồn tại"); } } [HttpPut] [Route("Runner/{id:guid}/resume")] public async Task Resume(Guid id) { if (missionManager.Resume(id)) { var mission = await scriptManagerDb.InstanceMissions.FindAsync(id); if (mission != null) { mission.Status = MissionStatus.Resuming; await scriptManagerDb.SaveChangesAsync(); } return new MessageResult(true, "Gửi yêu cầu tiếp tục nhiệm vụ thành công"); } else { return new MessageResult(false, "Không thể tiếp tục nhiệm vụ này hoặc nhiệm vụ không tồn tại"); } } }