using Microsoft.AspNetCore.Mvc; using GreenHome.Application; namespace GreenHome.Api.Controllers; [ApiController] [Route("api/[controller]")] public class DeviceMembersController : ControllerBase { private readonly IDeviceMemberService _memberService; private readonly IWebHostEnvironment _environment; private readonly ILogger _logger; public DeviceMembersController( IDeviceMemberService memberService, IWebHostEnvironment environment, ILogger logger) { _memberService = memberService; _environment = environment; _logger = logger; } /// لیست اعضای تیم یک دستگاه [HttpGet] public async Task>> List( [FromQuery] int deviceId, CancellationToken cancellationToken) { var result = await _memberService.ListByDeviceAsync(deviceId, cancellationToken); return Ok(result); } /// افزودن یا ویرایش عضو تیم [HttpPost] public async Task> Upsert( [FromBody] UpsertDeviceMemberRequest request, CancellationToken cancellationToken) { try { var result = await _memberService.UpsertAsync(request, cancellationToken); return Ok(result); } catch (Exception ex) { _logger.LogError(ex, "Error upserting device member"); return BadRequest(new { error = ex.Message }); } } /// حذف عضو تیم [HttpDelete] public async Task Delete( [FromQuery] int deviceId, [FromQuery] int userId, CancellationToken cancellationToken) { try { await _memberService.DeleteAsync(deviceId, userId, cancellationToken); return Ok(new { message = "عضو با موفقیت حذف شد" }); } catch (InvalidOperationException ex) { return NotFound(new { error = ex.Message }); } } /// بررسی مجوز مدیریت تیم [HttpGet("can-manage")] public async Task> CanManage( [FromQuery] int actorUserId, [FromQuery] int deviceId, CancellationToken cancellationToken) { var canManage = await _memberService.CanManageDeviceAsync(actorUserId, deviceId, cancellationToken); return Ok(new { canManage }); } /// آپلود آواتار عضو [HttpPost("avatar")] [Consumes("multipart/form-data")] public async Task> UploadAvatar( [FromForm] IFormFile file, CancellationToken cancellationToken) { try { if (file == null || file.Length == 0) return BadRequest(new { error = "فایل انتخاب نشده است" }); var allowedTypes = new[] { "image/jpeg", "image/jpg", "image/png", "image/webp" }; if (!allowedTypes.Contains(file.ContentType.ToLower())) return BadRequest(new { error = "فقط فایل‌های تصویری مجاز هستند" }); if (file.Length > 2 * 1024 * 1024) return BadRequest(new { error = "حجم آواتار نباید بیشتر از 2 مگابایت باشد" }); var uploadsFolder = Path.Combine(_environment.WebRootPath ?? "wwwroot", "uploads", "avatars"); Directory.CreateDirectory(uploadsFolder); var fileName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}"; var filePath = Path.Combine(uploadsFolder, fileName); await using (var stream = new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(stream, cancellationToken); } var relativePath = $"/uploads/avatars/{fileName}"; return Ok(new { avatarPath = relativePath, message = "آواتار با موفقیت آپلود شد" }); } catch (Exception ex) { _logger.LogError(ex, "Error uploading avatar"); return StatusCode(500, new { error = "خطا در آپلود آواتار" }); } } }