1 line
6.5 KiB
JSON
1 line
6.5 KiB
JSON
{"path":"NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs","purpose":"Defines a MediatR query (AskLibraryQuestionQuery) and its handler which validates input and delegates question answering to an IKnowledgeService, returning a GroundedResponseDto result.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace: NexusReader.Application.Queries.Library","Implements MediatR IRequest/IRequestHandler","Delegates to IKnowledgeService (application service abstraction)"]},"className":"AskLibraryQuestionQueryHandler","methods":[{"name":"AskLibraryQuestionQueryHandler","line":18,"endLine":21,"signature":"(knowledgeService: IKnowledgeService) -> AskLibraryQuestionQueryHandler","purpose":"Constructs the handler and captures the injected IKnowledgeService.","calls":[],"actions":[{"id":"assignment_20","kind":"mapping","label":"Store injected dependency","line":20,"detail":"_knowledgeService = knowledgeService","visibility":"detail-only","confidence":0.7}]},{"name":"Handle","line":23,"endLine":36,"signature":"(request: AskLibraryQuestionQuery, cancellationToken: CancellationToken) -> Task<Result<GroundedResponseDto>>","purpose":"Validates the incoming question and forwards it to the knowledge service to obtain a grounded AI response.","calls":[{"targetFile":"unknown","targetMethod":"AskQuestionAsync","callLine":30,"paramSummary":"request.Question, request.TenantId, request.EbookId, request.Limit, cancellationToken"}],"actions":[{"id":"handle_branch_25_0","kind":"branch","label":"Evaluates branch condition","line":25,"detail":"if (string.IsNullOrWhiteSpace(request.Question))","conditionSummary":"string.IsNullOrWhiteSpace(request.Question)","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"guard-clause_25","kind":"guard-clause","label":"Reject empty question","line":25,"detail":"if empty -> return Result.Fail(\"Question cannot be empty.\")","conditionSummary":"string.IsNullOrWhiteSpace(request.Question)","outcomeLabels":["invalid","continue"],"visibility":"detail-only","confidence":0.7},{"id":"handle_return_27_1","kind":"return","label":"Returns result","line":27,"detail":"return Result.Fail(\"Question cannot be empty.\");","visibility":"detail-only","confidence":0.7},{"id":"external-call_30","kind":"external-call","label":"Delegate to knowledge service","line":30,"detail":"Returns result of _knowledgeService.AskQuestionAsync(...)","visibility":"detail-only","confidence":0.7},{"id":"handle_return_30_3","kind":"return","label":"Returns result","line":30,"detail":"return await _knowledgeService.AskQuestionAsync(","visibility":"detail-only","confidence":0.7},{"id":"handle_await_30_2","kind":"await","label":"Waits for async work","line":30,"detail":"return await _knowledgeService.AskQuestionAsync(","visibility":"secondary-visible","confidence":0.81},{"id":"return_35","kind":"return","label":"Return service result","line":35,"detail":"await _knowledgeService.AskQuestionAsync(...) is returned to caller","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AskLibraryQuestionQuery","kind":"query","line":11,"purpose":"Represents a request to ask a question against the tenant's library (optionally scoped to an ebook) with a result limit.","fields":[{"name":"Question","type":"string","required":true,"line":11,"description":"The natural language question to ask"},{"name":"TenantId","type":"string","required":true,"line":11,"description":"Tenant identifier scoping the query"},{"name":"EbookId","type":"Guid?","required":false,"line":11,"description":"Optional ebook identifier to limit the search"},{"name":"Limit","type":"int","required":false,"line":11,"description":"Maximum number of supporting items to return (default 5)"}]},{"name":"AskLibraryQuestionQueryHandler","kind":"model","line":14,"purpose":"MediatR request handler that orchestrates validation and calls the knowledge service.","fields":[{"name":"_knowledgeService","type":"IKnowledgeService","required":true,"line":16,"description":"Injected service used to answer library questions"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Services","NexusReader.Application.DTOs.AI","MediatR","FluentResults"],"patterns":["CQRS Handler","MediatR"],"domainConcepts":["Library question","KnowledgeService","GroundedResponse"],"keyDetails":"Handler enforces non-empty question, otherwise immediately fails; otherwise delegates to IKnowledgeService.AskQuestionAsync and returns that result.","orchestrationMethods":[{"name":"Handle","line":23,"confidence":0.77,"reason":"Contains 2 architectural actions relevant to business execution.","actionKinds":["branch","guard-clause","return","external-call","await"],"evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs","unknown"]}],"typedContracts":[{"name":"AskLibraryQuestionQuery","kind":"query","line":11,"fieldCount":4,"evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs"]},{"name":"AskLibraryQuestionQueryHandler","kind":"model","line":14,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[{"methodName":"Handle","line":30,"kind":"external-call","detail":"Returns result of _knowledgeService.AskQuestionAsync(...)","evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":23,"summary":"Contains 2 architectural actions relevant to business execution.","confidence":0.77,"evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs","unknown"]},{"kind":"typed-contract","label":"AskLibraryQuestionQuery","line":11,"summary":"query with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs"]},{"kind":"typed-contract","label":"AskLibraryQuestionQueryHandler","line":14,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs"]},{"kind":"external-call","label":"Handle","line":30,"summary":"Returns result of _knowledgeService.AskQuestionAsync(...)","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Library/AskLibraryQuestionQuery.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"81f53ced6a106f804fa8874dd5cf66963636f66cb1704c5644eb828728e62dc2","sourceByteSize":1250,"analyzedAt":"2026-05-23T16:17:37.438Z","technology":"dotnet"}} |