using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using RobotNet.RobotManager.Data; using RobotNet.RobotManager.Services; using RobotNet.RobotShares.Dtos; using RobotNet.Shares; namespace RobotNet.RobotManager.Controllers; [Route("api/[controller]")] [ApiController] [Authorize] public class RobotModelsController(RobotEditorDbContext RobotDb, RobotEditorStorageRepository RobotStorage, IHttpClientFactory HttpClientFactory, LoggerController Logger) : ControllerBase { [HttpGet] public async Task> GetRobotModels([FromQuery(Name = "txtSearch")] string? txtSearch) { try { if (string.IsNullOrWhiteSpace(txtSearch)) { return await (from robotmodel in RobotDb.RobotModels select new RobotModelDto() { Id = robotmodel.Id, ModelName = robotmodel.ModelName, OriginX = robotmodel.OriginX, OriginY = robotmodel.OriginY, ImageWidth = robotmodel.ImageWidth, ImageHeight = robotmodel.ImageHeight, Width = Math.Round(robotmodel.Width, 2), Length = Math.Round(robotmodel.Length, 2), NavigationType = robotmodel.NavigationType, }).ToListAsync(); } else { return await (from robotmodel in RobotDb.RobotModels where !string.IsNullOrEmpty(robotmodel.ModelName) && robotmodel.ModelName.Contains(txtSearch) select new RobotModelDto() { Id = robotmodel.Id, ModelName = robotmodel.ModelName, OriginX = robotmodel.OriginX, OriginY = robotmodel.OriginY, ImageWidth = robotmodel.ImageWidth, ImageHeight = robotmodel.ImageHeight, Width = Math.Round(robotmodel.Width, 2), Length = Math.Round(robotmodel.Length, 2), NavigationType = robotmodel.NavigationType, }).ToListAsync(); } } catch (Exception ex) { Logger.Warning($"GetRobotModels: Hệ thống có lỗi xảy ra - {ex.Message}"); return []; } } [HttpGet] [Route("{robotModelId}")] public async Task> GetRobotModel(Guid robotModelId) { try { var robotmodel = await RobotDb.RobotModels.FirstOrDefaultAsync(model => model.Id == robotModelId); var robotmodelDto = robotmodel is null ? null : new RobotModelDto() { Id = robotmodel.Id, ModelName = robotmodel.ModelName, OriginX = robotmodel.OriginX, OriginY = robotmodel.OriginY, ImageWidth = robotmodel.ImageWidth, ImageHeight = robotmodel.ImageHeight, Width = Math.Round(robotmodel.Width, 2), Length = Math.Round(robotmodel.Length, 2), NavigationType = robotmodel.NavigationType, }; return new(true) { Data = robotmodelDto }; } catch (Exception ex) { Logger.Warning($"GetRobotModel {robotModelId}: Hệ thống có lỗi xảy ra - {ex.Message}"); return new(false, $"Hệ thống có lỗi xảy ra"); } } [HttpGet] [AllowAnonymous] [Route("image/{robotmodelId}")] public async Task GetImage(Guid robotmodelId) { try { var (usingLocal, url) = RobotStorage.GetUrl("RobotModels", robotmodelId.ToString()); if (!usingLocal) { var http = HttpClientFactory.CreateClient(); var imageBytes = await http.GetByteArrayAsync(url); if (imageBytes != null && imageBytes.Length > 0) return File(imageBytes, "image/png"); else return NotFound("Không thể lấy được ảnh map."); } if (System.IO.File.Exists(url)) return PhysicalFile(url, "image/png"); else return NotFound(); } catch (Exception ex) { Logger.Warning($"GetImage {robotmodelId}: Hệ thống có lỗi xảy ra - {ex.Message}"); return NotFound(); } } [HttpPost] public async Task> CreateRobotModel([FromForm] RobotModelCreateModel robotmodel, [FromForm(Name = "Image")] IFormFile imageUpload) { try { if (imageUpload.ContentType != "image/png") return new(false, "Robot image format chỉ hỗ trợ định dạng image/png"); if (await RobotDb.RobotModels.AnyAsync(model => model.ModelName == robotmodel.ModelName)) return new(false, "Tên của robot model đã tồn tại, Hãy đặt tên khác!"); var image = SixLabors.ImageSharp.Image.Load(imageUpload.OpenReadStream()); var entityRobotModel = await RobotDb.RobotModels.AddAsync(new RobotModel() { ModelName = robotmodel.ModelName, OriginX = robotmodel.OriginX, OriginY = robotmodel.OriginY, ImageHeight = image.Height, ImageWidth = image.Width, Length = robotmodel.Length, Width = robotmodel.Width, NavigationType = robotmodel.NavigationType, }); await RobotDb.SaveChangesAsync(); var (isSuccess, message) = await RobotStorage.UploadAsync("RobotModels", $"{entityRobotModel.Entity.Id}", imageUpload.OpenReadStream(), imageUpload.Length, imageUpload.ContentType, CancellationToken.None); if (!isSuccess) { RobotDb.RobotModels.Remove(entityRobotModel.Entity); await RobotDb.SaveChangesAsync(); return new(false, message); } return new(true) { Data = new() { Id = entityRobotModel.Entity.Id, ModelName = entityRobotModel.Entity.ModelName, OriginX = entityRobotModel.Entity.OriginX, OriginY = entityRobotModel.Entity.OriginY, ImageWidth = entityRobotModel.Entity.ImageWidth, ImageHeight = entityRobotModel.Entity.ImageHeight, Width = Math.Round(entityRobotModel.Entity.Width, 2), Length = Math.Round(entityRobotModel.Entity.Length, 2), NavigationType = entityRobotModel.Entity.NavigationType, } }; } catch (Exception ex) { Logger.Warning($"CreateRobotModel : Hệ thống có lỗi xảy ra - {ex.Message}"); return new(false, "Hệ thống có lỗi xảy ra"); } } [HttpPut] public async Task> UpdateRobotModel([FromBody] RobotModelUpdateModel robotmodel) { try { var robotModelDb = await RobotDb.RobotModels.FindAsync(robotmodel.Id); if (robotModelDb == null) return new(false, $"Không tồn tại robot model id = {robotmodel.Id}"); if (robotmodel.ModelName != robotModelDb.ModelName && await RobotDb.RobotModels.AnyAsync(m => m.ModelName == robotmodel.ModelName)) { return new(false, "Tên của robot model đã tồn tại, Hãy đặt tên khác!"); } robotModelDb.ModelName = robotmodel.ModelName; robotModelDb.OriginX = robotmodel.OriginX; robotModelDb.OriginY = robotmodel.OriginY; robotModelDb.Length = robotmodel.Length; robotModelDb.Width = robotmodel.Width; await RobotDb.SaveChangesAsync(); return new(true) { Data = new() { ModelName = robotModelDb.ModelName, OriginX = robotModelDb.OriginX, OriginY = robotModelDb.OriginY, NavigationType = robotModelDb.NavigationType, ImageWidth = robotModelDb.ImageWidth, ImageHeight = robotModelDb.ImageHeight, Width = Math.Round(robotModelDb.Width, 2), Length = Math.Round(robotModelDb.Length, 2), } }; } catch (Exception ex) { Logger.Warning($"UpdateRobotModel : Hệ thống có lỗi xảy ra - {ex.Message}"); return new(false, $"Hệ thống có lỗi xảy ra"); } } [HttpDelete] [Route("{robotModelId}")] public async Task DeleteRobotModel(Guid robotModelId) { try { var robotModelDb = await RobotDb.RobotModels.FindAsync(robotModelId); if (robotModelDb == null) return new(false, $"Không tồn tại robot model id = {robotModelId}"); if (RobotDb.Robots.Any(r => r.ModelId == robotModelId)) return new(false, "Tồn tại robot đang sử dụng model này"); await RobotStorage.DeleteAsync("RobotModels", robotModelId.ToString(), CancellationToken.None); RobotDb.RobotModels.Remove(robotModelDb); await RobotDb.SaveChangesAsync(); return new(true, ""); } catch (Exception ex) { Logger.Warning($"DeleteRobotModel {robotModelId} : Hệ thống có lỗi xảy ra - {ex.Message}"); return new(false, $"Hệ thống có lỗi xảy ra"); } } [HttpPut] [Route("image/{robotModelId}")] public async Task UpdateImage(Guid robotModelId, [FromForm(Name = "image")] IFormFile image) { try { var robotModel = await RobotDb.RobotModels.FindAsync(robotModelId); if (robotModel == null) return new(false, $"Không tồn tại robot model id = {robotModelId}"); var imageStream = image.OpenReadStream(); var imageUpdate = SixLabors.ImageSharp.Image.Load(imageStream); robotModel.ImageWidth = imageUpdate.Width; robotModel.ImageHeight = imageUpdate.Height; await RobotDb.SaveChangesAsync(); var (isSuccess, message) = await RobotStorage.UploadAsync("RobotModels", robotModelId.ToString(), image.OpenReadStream(), image.Length, image.ContentType, CancellationToken.None); return new(true, ""); } catch (Exception ex) { Logger.Warning($"UpdateImage: Hệ thống có lỗi xảy ra - {ex.Message}"); return new(false, $"Hệ thống có lỗi xảy ra"); } } }