108 lines
3.7 KiB
C#
108 lines
3.7 KiB
C#
using System.ComponentModel.DataAnnotations;
|
|
using DysonNetwork.Develop.Identity;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using DysonNetwork.Shared.Proto;
|
|
|
|
namespace DysonNetwork.Develop.Project;
|
|
|
|
[ApiController]
|
|
[Route("/api/developers/{pubName}/projects")]
|
|
public class DevProjectController(DevProjectService projectService, DeveloperService developerService) : ControllerBase
|
|
{
|
|
public record DevProjectRequest(
|
|
[MaxLength(1024)] string? Slug,
|
|
[MaxLength(1024)] string? Name,
|
|
[MaxLength(4096)] string? Description
|
|
);
|
|
|
|
[HttpGet]
|
|
public async Task<IActionResult> ListProjects([FromRoute] string pubName)
|
|
{
|
|
var developer = await developerService.GetDeveloperByName(pubName);
|
|
if (developer is null) return NotFound();
|
|
|
|
var projects = await projectService.GetProjectsByDeveloperAsync(developer.Id);
|
|
return Ok(projects);
|
|
}
|
|
|
|
[HttpGet("{id:guid}")]
|
|
public async Task<IActionResult> GetProject([FromRoute] string pubName, Guid id)
|
|
{
|
|
var developer = await developerService.GetDeveloperByName(pubName);
|
|
if (developer is null) return NotFound();
|
|
|
|
var project = await projectService.GetProjectAsync(id, developer.Id);
|
|
if (project is null) return NotFound();
|
|
|
|
return Ok(project);
|
|
}
|
|
|
|
[HttpPost]
|
|
[Authorize]
|
|
public async Task<IActionResult> CreateProject([FromRoute] string pubName, [FromBody] DevProjectRequest request)
|
|
{
|
|
if (HttpContext.Items["CurrentUser"] is not Account currentUser)
|
|
return Unauthorized();
|
|
|
|
var developer = await developerService.GetDeveloperByName(pubName);
|
|
if (developer is null)
|
|
return NotFound("Developer not found");
|
|
|
|
if (!await developerService.IsMemberWithRole(developer.PublisherId, Guid.Parse(currentUser.Id), PublisherMemberRole.Editor))
|
|
return StatusCode(403, "You must be an editor of the developer to create a project");
|
|
|
|
if (string.IsNullOrWhiteSpace(request.Slug) || string.IsNullOrWhiteSpace(request.Name))
|
|
return BadRequest("Slug and Name are required");
|
|
|
|
var project = await projectService.CreateProjectAsync(developer, request);
|
|
return CreatedAtAction(
|
|
nameof(GetProject),
|
|
new { pubName, id = project.Id },
|
|
project
|
|
);
|
|
}
|
|
|
|
[HttpPut("{id:guid}")]
|
|
[Authorize]
|
|
public async Task<IActionResult> UpdateProject(
|
|
[FromRoute] string pubName,
|
|
[FromRoute] Guid id,
|
|
[FromBody] DevProjectRequest request
|
|
)
|
|
{
|
|
if (HttpContext.Items["CurrentUser"] is not Account currentUser)
|
|
return Unauthorized();
|
|
|
|
var developer = await developerService.GetDeveloperByName(pubName);
|
|
var accountId = Guid.Parse(currentUser.Id);
|
|
if (developer is null || developer.Id != accountId)
|
|
return Forbid();
|
|
|
|
var project = await projectService.UpdateProjectAsync(id, developer.Id, request);
|
|
if (project is null)
|
|
return NotFound();
|
|
|
|
return Ok(project);
|
|
}
|
|
|
|
[HttpDelete("{id:guid}")]
|
|
[Authorize]
|
|
public async Task<IActionResult> DeleteProject([FromRoute] string pubName, [FromRoute] Guid id)
|
|
{
|
|
if (HttpContext.Items["CurrentUser"] is not Account currentUser)
|
|
return Unauthorized();
|
|
|
|
var developer = await developerService.GetDeveloperByName(pubName);
|
|
var accountId = Guid.Parse(currentUser.Id);
|
|
if (developer is null || developer.Id != accountId)
|
|
return Forbid();
|
|
|
|
var success = await projectService.DeleteProjectAsync(id, developer.Id);
|
|
if (!success)
|
|
return NotFound();
|
|
|
|
return NoContent();
|
|
}
|
|
}
|