Files
Servers/MoonlightServers.Api/Admin/Templates/DockerImagesController.cs

144 lines
4.6 KiB
C#

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Moonlight.Shared.Shared;
using MoonlightServers.Api.Infrastructure.Database;
using MoonlightServers.Api.Infrastructure.Database.Entities;
using MoonlightServers.Shared;
using MoonlightServers.Shared.Admin.Templates;
namespace MoonlightServers.Api.Admin.Templates;
[ApiController]
[Route("api/admin/servers/templates/{templateId:int}/dockerImages")]
public class DockerImagesController : Controller
{
private readonly DatabaseRepository<TemplateDockerImage> DockerImageRepository;
private readonly DatabaseRepository<Template> TemplateRepository;
public DockerImagesController(
DatabaseRepository<TemplateDockerImage> dockerImageRepository,
DatabaseRepository<Template> templateRepository
)
{
DockerImageRepository = dockerImageRepository;
TemplateRepository = templateRepository;
}
[HttpGet]
[Authorize(Policy = Permissions.Templates.View)]
public async Task<ActionResult<PagedData<DockerImageDto>>> GetAsync(
[FromRoute] int templateId,
[FromQuery] int startIndex,
[FromQuery] int length
)
{
// Validation
if (startIndex < 0)
return Problem("Invalid start index specified", statusCode: 400);
if (length is < 1 or > 100)
return Problem("Invalid length specified");
if (!await TemplateRepository.Query().AnyAsync(x => x.Id == templateId))
return Problem("No template with that id found", statusCode: 404);
// Query building
var query = DockerImageRepository
.Query()
.Where(x => x.Template.Id == templateId);
// Pagination
var data = await query
.OrderBy(x => x.Id)
.ProjectToDto()
.Skip(startIndex)
.Take(length)
.ToArrayAsync();
var total = await query.CountAsync();
return new PagedData<DockerImageDto>(data, total);
}
[HttpGet("{id:int}")]
[Authorize(Policy = Permissions.Templates.View)]
public async Task<ActionResult<DockerImageDto>> GetAsync(
[FromRoute] int templateId,
[FromRoute] int id
)
{
var templateDockerImage = await DockerImageRepository
.Query()
.FirstOrDefaultAsync(x => x.Id == id && x.Template.Id == templateId);
if (templateDockerImage == null)
return Problem("No template or template dockerImage found with that id");
return TemplateMapper.ToDto(templateDockerImage);
}
[HttpPost]
[Authorize(Policy = Permissions.Templates.Create)]
public async Task<ActionResult<DockerImageDto>> CreateAsync(
[FromRoute] int templateId,
[FromBody] CreateDockerImageDto dto
)
{
var template = await TemplateRepository
.Query()
.FirstOrDefaultAsync(x => x.Id == templateId);
if (template == null)
return Problem("No template with that id found", statusCode: 404);
var dockerImage = TemplateMapper.ToEntity(dto);
dockerImage.Template = template;
var finalDockerImage = await DockerImageRepository.AddAsync(dockerImage);
return TemplateMapper.ToDto(finalDockerImage);
}
[HttpPut("{id:int}")]
[Authorize(Policy = Permissions.Templates.Edit)]
public async Task<ActionResult<DockerImageDto>> UpdateAsync(
[FromRoute] int templateId,
[FromRoute] int id,
[FromBody] UpdateDockerImageDto dto
)
{
var templateDockerImage = await DockerImageRepository
.Query()
.FirstOrDefaultAsync(x => x.Id == id && x.Template.Id == templateId);
if (templateDockerImage == null)
return Problem("No template or template dockerImage found with that id");
TemplateMapper.Merge(templateDockerImage, dto);
await DockerImageRepository.UpdateAsync(templateDockerImage);
return TemplateMapper.ToDto(templateDockerImage);
}
[HttpDelete("{id:int}")]
[Authorize(Policy = Permissions.Templates.Delete)]
public async Task<ActionResult> DeleteAsync(
[FromRoute] int templateId,
[FromRoute] int id
)
{
var templateDockerImage = await DockerImageRepository
.Query()
.FirstOrDefaultAsync(x => x.Id == id && x.Template.Id == templateId);
if (templateDockerImage == null)
return Problem("No template or template dockerImage found with that id");
await DockerImageRepository.RemoveAsync(templateDockerImage);
return NoContent();
}
}