using System.Runtime.CompilerServices; using API.Context; using API.DTO; using AppContext.Entities; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Model; using Services; [assembly: InternalsVisibleTo("UnitTests")] namespace API.Controllers; [ApiController] public class UsersController(IUserService users, ITeamService teams, ITacticService tactics, IContextAccessor accessor) : ControllerBase { public const string DefaultProfilePicture = "https://cdn.pixabay.com/photo/2015/10/05/22/37/blank-profile-picture-973460_960_720.png"; [Authorize] [HttpGet("/user")] public async Task GetUser() { var userId = accessor.CurrentUserId(HttpContext); return (await users.GetUser(userId))!; } public record GetUserDataResponse(Team[] Teams, TacticDto[] Tactics); [Authorize] [HttpGet("/user-data")] public async Task GetUserData() { var userId = accessor.CurrentUserId(HttpContext); var userTeams = await teams.ListTeamsOf(userId); var userTactics = await tactics.ListTacticsOf(userId); return new GetUserDataResponse(userTeams.ToArray(), userTactics.Select(t => t.ToDto()).ToArray()); } public record ShareTacticToUserRequest( int TacticId, int UserId ); [HttpPost("/user/share-tactic")] [Authorize] public async Task ShareTactic([FromBody] ShareTacticToUserRequest sharedTactic) { var currentUserId = accessor.CurrentUserId(HttpContext); var tactic = await tactics.GetTactic(sharedTactic.TacticId); if (tactic == null) { return NotFound(); } if (currentUserId != tactic.OwnerId) { return Unauthorized(); } var result = await tactics.ShareTactic(sharedTactic.TacticId, sharedTactic.UserId, null); return result ? Ok() : NotFound(); } [HttpGet("/tactics/shared/user/{userId:int}")] [Authorize] public async Task GetSharedTacticsToUser(int userId) { var currentUserId = accessor.CurrentUserId(HttpContext); if (currentUserId != userId) { return Unauthorized(); } var sharedTactics = await users.GetSharedTacticsToUser(userId); return sharedTactics != null ? Ok(sharedTactics) : NotFound(); } }