44 lines
1.7 KiB
C#
44 lines
1.7 KiB
C#
using ItWorx.KnowledgeHub.Application.Knowledge.UseCases;
|
|
using ItWorx.KnowledgeHub.Domain.Decisions;
|
|
|
|
namespace ItWorx.KnowledgeHub.Application.Decisions.UseCases;
|
|
|
|
public sealed record DecisionDetailResult(
|
|
DecisionRecord Decision,
|
|
PageDetailResult Page,
|
|
string ETag,
|
|
DecisionRecord? Supersedes,
|
|
DecisionRecord? SupersededBy);
|
|
|
|
/// <summary>Assembles one ADR's full lineage view: its own lifecycle metadata, the
|
|
/// linked page's rendered content, and — resolved by one extra lookup each, never a
|
|
/// duplicated copy — the decision it supersedes and/or is superseded by
|
|
/// (docs/16-runbooks-and-adrs.md: "Links are bidirectional").</summary>
|
|
public sealed class GetDecisionUseCase(IDecisionRepository decisions, GetPageUseCase getPage)
|
|
{
|
|
public async Task<DecisionDetailResult?> ExecuteAsync(Guid decisionId, CancellationToken cancellationToken)
|
|
{
|
|
var decision = await decisions.FindAsync(decisionId, cancellationToken);
|
|
if (decision is null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
var page = await getPage.ExecuteAsync(decision.PageId, cancellationToken);
|
|
if (page is null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
var etag = await decisions.GetETagAsync(decisionId, cancellationToken) ?? string.Empty;
|
|
var supersedes = decision.SupersedesDecisionId is { } supersedesId
|
|
? await decisions.FindAsync(supersedesId, cancellationToken)
|
|
: null;
|
|
var supersededBy = decision.SupersededByDecisionId is { } supersededById
|
|
? await decisions.FindAsync(supersededById, cancellationToken)
|
|
: null;
|
|
|
|
return new DecisionDetailResult(decision, page, etag, supersedes, supersededBy);
|
|
}
|
|
}
|