69 lines
2.8 KiB
C#
69 lines
2.8 KiB
C#
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<AppUser> userManager) : ControllerBase
|
|
{
|
|
|
|
[HttpGet("repo_list")]
|
|
public async Task<ActionResult<ListingResponse<RepositoryInfoResponse>>> 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<RepositoryInfoResponse>(query));
|
|
}
|
|
|
|
[HttpPost("repo_create")]
|
|
public async Task<ActionResult<RepositoryInfoResponse>> CreateRepositoryAsync([FromQuery] string repositoryName,[FromQuery] string description)
|
|
{
|
|
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!"));
|
|
|
|
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 = string.Empty,
|
|
IsArchived = false,
|
|
Role = RepositoryRole.Owner
|
|
});
|
|
}
|
|
} |