66 lines
2.6 KiB
C#
66 lines
2.6 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<IActionResult> 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<RepositoryInfoResponse>
|
|
{
|
|
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<IActionResult> 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();
|
|
}
|
|
} |