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() { var u = (await userManager.GetUserAsync(HttpContext.User))!; var query = 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) || rp.Owner == u) .Select(rp => new RepositoryInfoResponse { RepositoryName = rp.Name, OwnerUsername = rp.Owner.UserName!, Description = rp.Description, IsArchived = rp.IsArchived, Role = rp.Owner == u ? RepositoryRole.Owner : rp.Members.First(m => m.User == u).Role }) .ToArray(); return Ok(new ListingResponse(query)); } [HttpPost("repo_create")] public async Task> CreateRepositoryAsync([FromQuery] string repositoryName, [FromQuery] string description) { repositoryName = repositoryName.Trim().Replace(' ', '_'); if (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!")); var repo = new Repository() { Name = repositoryName, Description = description, Owner = u, }; await dbContext.Repositories.AddAsync(repo); await dbContext.SaveChangesAsync(); return Ok(new RepositoryInfoResponse() { RepositoryName = repositoryName, OwnerUsername = u.UserName!, Description = description, IsArchived = false, Role = RepositoryRole.Owner }); } }