using Govor.Contracts.DTOs; using Govor.Core.Models; using Govor.Core.Repositories.Friendships; using Govor.Data.Repositories.Exceptions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Govor.API.Controllers.AdminStuff; [ApiController] [Route("api/admin/[controller]")] [Authorize(Roles = "Admin")] public class FriendshipsController : Controller { private readonly ILogger _logger; private readonly IFriendshipsRepository _friendshipsRepository; public FriendshipsController(ILogger logger, IFriendshipsRepository friendshipsRepository) { _logger = logger; _friendshipsRepository = friendshipsRepository; } [HttpGet] public async Task Get() { try { _logger.LogInformation("Get all friendships by administrator"); var result = await _friendshipsRepository.GetAllAsync(); return Ok(BuildFriendshipDtos(result)); } catch (NotFoundException ex) { _logger.LogWarning(ex.Message); return NotFound(ex.Message); } catch (Exception e) { _logger.LogError(e, e.Message); return StatusCode(500, new { error = "Internal server error." }); } } [HttpGet("{userId}")] public async Task GetByUserId(Guid userId) { if(userId == Guid.Empty) return BadRequest("User id can't be empty."); try { _logger.LogInformation($"Get user's {userId} all friendships by administrator"); var result = await _friendshipsRepository.FindByUserIdAsync(userId); return Ok(BuildFriendshipDtos(result)); } catch (NotFoundByKeyException ex) { _logger.LogWarning(ex.Message); return NotFound(ex.Message); } catch (Exception e) { _logger.LogError(e, e.Message); return StatusCode(500, new { error = "Internal server error." }); } } [HttpPost] public async Task RemoveFriendship(Guid Id) { if(Id == Guid.Empty) return BadRequest("FS id can't be empty."); try { var result = await _friendshipsRepository.GetByIdAsync(Id); await _friendshipsRepository.RemoveAsync(result); return Ok(); } catch (NotFoundByKeyException ex) { _logger.LogWarning(ex.Message); return NotFound(ex.Message); } catch (Exception ex) { _logger.LogError(ex, ex.Message); return StatusCode(500, new { error = "Internal server error." }); } } private List BuildUserDtos(IEnumerable users) => users.Select(user => new UserDto { Id = user.Id, Username = user.Username, Description = user.Description, WasOnline = user.WasOnline, IconId = user.IconId }).ToList(); private List BuildFriendshipDtos(IEnumerable friendships) => friendships.Select(f => new FriendshipDto { Id = f.Id, Status = f.Status, AddresseeId = f.AddresseeId, RequesterId = f.RequesterId, }).ToList(); }