feat(admin): standalone Projects page + per-project asset manager
Build backend images / build content-svc (push) Failing after 1m36s
Build backend images / build file-svc (push) Failing after 1m28s
Build backend images / build gateway (push) Failing after 2m11s
Build backend images / build identity-svc (push) Failing after 2m11s
Build backend images / build notification-svc (push) Failing after 3m46s
Build backend images / build render-svc (push) Failing after 55s
Build backend images / build studio-svc (push) Failing after 1m2s
Build backend images / build content-svc (push) Failing after 1m36s
Build backend images / build file-svc (push) Failing after 1m28s
Build backend images / build gateway (push) Failing after 2m11s
Build backend images / build identity-svc (push) Failing after 2m11s
Build backend images / build notification-svc (push) Failing after 3m46s
Build backend images / build render-svc (push) Failing after 55s
Build backend images / build studio-svc (push) Failing after 1m2s
- content-svc: GET /v1/projects (browse/search all projects across containers,
paginated, admin) returning template name/slug + AE status; project_assets
table (mig 23) + entity; GET/POST/DELETE /v1/projects/{id}/assets
- /admin/projects: searchable, paginated list of every renderable project with
thumbnail, template, aspect/resolution, AE-file + publish status
- ProjectAssets component: list/upload/delete named footage/image/audio/font
files per project (reused in the projects page; AE file upload alongside)
- nav + fa/en "Projects" label
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -57,10 +57,35 @@ public record SetSortRequest(int Sort);
|
||||
[Route("v1/projects")]
|
||||
public class ProjectsController(TemplateService svc) : ControllerBase
|
||||
{
|
||||
// Browse/search all projects across templates (admin).
|
||||
[Authorize(Roles = "Admin")]
|
||||
[HttpGet]
|
||||
public async Task<IActionResult> List([FromQuery] string? q, [FromQuery] Guid? containerId,
|
||||
[FromQuery] int page = 1, [FromQuery] int pageSize = 30) =>
|
||||
Ok(await svc.ListProjectsAsync(q, containerId, page, pageSize));
|
||||
|
||||
[HttpGet("{id:guid}")]
|
||||
public async Task<IActionResult> GetProject(Guid id) =>
|
||||
Ok(await svc.GetProjectDetailAsync(id));
|
||||
|
||||
// ── Per-project assets (footage / images / audio / fonts) ──────────────────
|
||||
[HttpGet("{id:guid}/assets")]
|
||||
public async Task<IActionResult> ListAssets(Guid id) =>
|
||||
Ok(await svc.ListAssetsAsync(id));
|
||||
|
||||
[Authorize(Roles = "Admin")]
|
||||
[HttpPost("{id:guid}/assets")]
|
||||
public async Task<IActionResult> AddAsset(Guid id, [FromBody] CreateAssetRequest req) =>
|
||||
Ok(await svc.AddAssetAsync(id, req));
|
||||
|
||||
[Authorize(Roles = "Admin")]
|
||||
[HttpDelete("{id:guid}/assets/{assetId:guid}")]
|
||||
public async Task<IActionResult> DeleteAsset(Guid id, Guid assetId)
|
||||
{
|
||||
await svc.DeleteAssetAsync(assetId);
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[Authorize(Roles = "Admin")]
|
||||
[HttpPost]
|
||||
public async Task<IActionResult> CreateProject([FromBody] CreateProjectRequest req) =>
|
||||
|
||||
Reference in New Issue
Block a user