121 lines
4.3 KiB
C#
121 lines
4.3 KiB
C#
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<DeviceMembersController> _logger;
|
|
|
|
public DeviceMembersController(
|
|
IDeviceMemberService memberService,
|
|
IWebHostEnvironment environment,
|
|
ILogger<DeviceMembersController> logger)
|
|
{
|
|
_memberService = memberService;
|
|
_environment = environment;
|
|
_logger = logger;
|
|
}
|
|
|
|
/// <summary>لیست اعضای تیم یک دستگاه</summary>
|
|
[HttpGet]
|
|
public async Task<ActionResult<IReadOnlyList<DeviceMemberDto>>> List(
|
|
[FromQuery] int deviceId,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
var result = await _memberService.ListByDeviceAsync(deviceId, cancellationToken);
|
|
return Ok(result);
|
|
}
|
|
|
|
/// <summary>افزودن یا ویرایش عضو تیم</summary>
|
|
[HttpPost]
|
|
public async Task<ActionResult<DeviceMemberDto>> 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 });
|
|
}
|
|
}
|
|
|
|
/// <summary>حذف عضو تیم</summary>
|
|
[HttpDelete]
|
|
public async Task<ActionResult> 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 });
|
|
}
|
|
}
|
|
|
|
/// <summary>بررسی مجوز مدیریت تیم</summary>
|
|
[HttpGet("can-manage")]
|
|
public async Task<ActionResult<bool>> CanManage(
|
|
[FromQuery] int actorUserId,
|
|
[FromQuery] int deviceId,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
var canManage = await _memberService.CanManageDeviceAsync(actorUserId, deviceId, cancellationToken);
|
|
return Ok(new { canManage });
|
|
}
|
|
|
|
/// <summary>آپلود آواتار عضو</summary>
|
|
[HttpPost("avatar")]
|
|
[Consumes("multipart/form-data")]
|
|
public async Task<ActionResult<string>> 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 = "خطا در آپلود آواتار" });
|
|
}
|
|
}
|
|
}
|