| 1 | using AgentForge.Abstractions; |
| 2 | using AgentForge.Plugin.Sdk; |
| 3 | using AgentForge.Contracts; |
| 4 | using AgentForge.Data; |
| 5 | using AgentForge.Services; |
| 6 | |
| 7 | namespace AgentForge.Endpoints; |
| 8 | |
| 9 | internal static class ForgeProvenanceEndpoints |
| 10 | { |
| 11 | internal static RouteGroupBuilder MapProvenanceEndpoints(this RouteGroupBuilder api) |
| 12 | { |
| 13 | api.MapPost($"/repos/{ForgeRepoRouting.Pattern}/commits/provenance", RecordCommitProvenance); |
| 14 | api.MapGet($"/repos/{ForgeRepoRouting.Pattern}/commits/{{sha}}/provenance", GetCommitProvenance); |
| 15 | return api; |
| 16 | } |
| 17 | |
| 18 | private static IResult RecordCommitProvenance( |
| 19 | string name, |
| 20 | RecordCommitProvenanceRequest request, |
| 21 | HttpContext http, |
| 22 | ForgeRepository repository) |
| 23 | { |
| 24 | var repo = ForgePluginEndpoints.RequireRepo(repository, name, http); |
| 25 | var sha = ForgeCommitProvenanceHelper.NormalizeSha(request.Sha); |
| 26 | var entity = repository.UpsertCommitProvenance( |
| 27 | repo, |
| 28 | sha, |
| 29 | request.Provenance ?? throw new ForgeApiException(400, "provenance is required.")); |
| 30 | return Results.Ok(ForgeCommitProvenanceHelper.ToResponse(entity, repo.Name)); |
| 31 | } |
| 32 | |
| 33 | private static IResult GetCommitProvenance(string name, string sha, HttpContext http, ForgeRepository repository) |
| 34 | { |
| 35 | var repo = ForgePluginEndpoints.RequireRepo(repository, name, http); |
| 36 | var normalized = ForgeCommitProvenanceHelper.NormalizeSha(sha); |
| 37 | var entity = repository.GetCommitProvenance(repo.Id, normalized) |
| 38 | ?? throw new ForgeApiException(404, $"No provenance for commit '{normalized}'."); |
| 39 | return Results.Ok(ForgeCommitProvenanceHelper.ToResponse(entity, repo.Name)); |
| 40 | } |
| 41 | } |
| 42 | |