using API.Contracts.Profiles.Responses; using AutoMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using RecNet.Application.Profiles; using RecNet.Domain.Repositories; using RecNet.Domain.Services.Tokens; using LoginRequest = API.Contracts.Profiles.Requests.LoginRequest; using Profile = RecNet.Domain.Entities.Profiles.Profile; namespace API.Controllers.Profiles.V1; [Route("api/[controller]/v1")] [ApiController] [Authorize] public class ProfilesController( IProfileRepository profileRepository, IMapper mapper, ITokenService tokenService) : ControllerBase { [HttpGet("{id:guid}")] public async Task> GetProfile( Guid id, CancellationToken ct) { var profile = await profileRepository.GetByIdAsync(id, ct); if (profile == null) return NotFound(); return mapper.Map(profile); } [HttpGet("bulk")] public async Task> GetBulkProfiles( [FromQuery(Name = "id")] List ids, CancellationToken ct) { var profiles = await profileRepository.GetByIdsAsync(ids, ct); return mapper.Map>(profiles); } // TODO: Implement [AllowAnonymous] [HttpPost("login")] public async Task> Login( [FromBody] LoginRequest request, CancellationToken ct) { var name = GenerateRandomName(); var profile = await profileRepository.GetByPlatform(request.PlatformType, request.PlatformId, ct); if (profile is null) { profile = Profile.Create(name, request.PlatformType, request.PlatformId); await profileRepository.AddAsync(profile, ct); } profile.AddDeviceId(request.DeviceId); await profileRepository.SaveChangesAsync(ct); if (profile.IsBanned) return BadRequest(); var token = tokenService.GenerateProfileToken(profile); return new LoginResponse { Profile = mapper.Map(profile), AccessToken = token.AccessToken, ExpiresIn = token.ExpiresIn }; } // TODO: REPLACE WITH BETTER GENERATOR, THIS IS TEMP. private static string GenerateRandomName() => string.Concat("rr", Guid.NewGuid().ToString("N").AsSpan(0, 18)); }