using Flawless.Communication.Request; using Flawless.Communication.Response; using Flawless.Communication.Shared; using Flawless.Server.Models; using Flawless.Server.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace Flawless.Server.Controllers; //todo Merging RepositoryManageController and RepositoryController [ApiController, Authorize, Route("api")] public class RepositoryOutieController(AppDbContext dbContext, UserManager userManager) : ControllerBase { [HttpGet("repo_list")] public async Task ListAllAvailableRepositoriesAsync([FromQuery] QueryPagesRequest r) { var u = (await userManager.GetUserAsync(HttpContext.User))!; var query = await dbContext.Repositories .Include(repository => repository.Owner) .Include(repository => repository.Commits) .Include(repository => repository.Members) .ThenInclude(repositoryMember => repositoryMember.User) .Where(rp => rp.Members.Any(m => m.User == u)) .Skip(r.Offset) .Take(r.Length) .ToArrayAsync(); return Ok(new PagedResponse { Length = r.Length, Offset = r.Offset, Data = query.Select(rp => new RepositoryInfoResponse { RepositoryName = rp.Name, OwnerUsername = rp.Owner.UserName!, LatestCommitId = rp.Commits.OrderByDescending(cm => cm.CommittedOn).FirstOrDefault()?.Id ?? Guid.Empty, Description = rp.Description, IsArchived = rp.IsArchived, Role = rp.Members.First(m => m.User == u).Role }), }); } [HttpPost("repo_create")] public async Task CreateRepositoryAsync([FromQuery] string repositoryName) { if (string.IsNullOrWhiteSpace(repositoryName) || repositoryName.Length <= 3) return BadRequest(new FailedResponse("Repository name is empty or too short!")); var u = (await userManager.GetUserAsync(HttpContext.User))!; if (await dbContext.Repositories.AnyAsync(rp => rp.Name == repositoryName && u == rp.Owner)) return BadRequest(new FailedResponse("Repository name has already created!")); await dbContext.Repositories.AddAsync(new Repository() { Name = repositoryName, Owner = u, }); await dbContext.SaveChangesAsync(); return Ok(); } }