NewDocV1
This commit is contained in:
+108
@@ -0,0 +1,108 @@
|
||||
# VerifyGroundednessCommand
|
||||
|
||||
- File ID: file:2eckht:verifygroundednesscommand-cs
|
||||
- Path: NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs
|
||||
- Role: handler
|
||||
- Layer: application
|
||||
|
||||
## Purpose
|
||||
|
||||
Defines a MediatR command and its handler that delegates verification of an answer's groundedness to the application's IKnowledgeService.
|
||||
|
||||
## Key Details
|
||||
|
||||
This file is a thin MediatR command handler that forwards the request to IKnowledgeService.VerifyGroundednessAsync without additional logic or validation. GroundednessResult is returned inside a FluentResults.Result wrapper.
|
||||
|
||||
## Symbols
|
||||
|
||||
- VerifyGroundednessCommandHandler: Defines a MediatR command and its handler that delegates verification of an answer's groundedness to the application's IKnowledgeService.
|
||||
- VerifyGroundednessCommandHandler(): Constructor that receives and stores the IKnowledgeService dependency via DI.
|
||||
- Handle(): Handles the VerifyGroundednessCommand by calling the knowledge service to verify groundedness and returning the service result.
|
||||
- VerifyGroundednessCommand: Command DTO carrying an answer, context, and tenant id to be verified for groundedness.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services (IKnowledgeService)
|
||||
- dependency-target: FluentResults (Result<>)
|
||||
- dependency-target: MediatR (IRequestHandler/IRequest)
|
||||
- call-target: unknown
|
||||
- interaction-target: await _knowledgeService.VerifyGroundednessAsync(...) and return its Result<GroundednessResult>
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 4
|
||||
- Executable symbols: 2
|
||||
- Executable symbols with control flow: 2
|
||||
- Grounded edges: 4
|
||||
- Unresolved references: 5
|
||||
- Control-flow fragments: 2
|
||||
- Unresolved jumps: 1
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- VerifyGroundednessCommandHandler: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- Handle: 7 nodes, 6 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### VerifyGroundednessCommand Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_109ebx2_verifygroundednesscommandhandler("VerifyGroundednessCommandHandler")
|
||||
file_2eckht_verifygroundednesscommand_cs("VerifyGroundednessCommand")
|
||||
method_10jkor8_verifygroundednesscommandhandler[["VerifyGroundednessCommandHandler()"]]
|
||||
method_1fl6nt2_handle[["Handle()"]]
|
||||
type_6i8iop_verifygroundednesscommand[/"VerifyGroundednessCommand"/]
|
||||
```
|
||||
|
||||
### VerifyGroundednessCommand Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_109ebx2_verifygroundednesscommandhandler("VerifyGroundednessCommandHandler")
|
||||
method_10jkor8_verifygroundednesscommandhandler[["VerifyGroundednessCommandHandler()"]]
|
||||
method_1fl6nt2_handle[["Handle()"]]
|
||||
unresolved_unresolved_1d98nmq_interaction_target{"Unresolved: await _knowledgeService.VerifyGroundednessAsync(...) and return its Result<GroundednessResult>"}
|
||||
unresolved_unresolved_1x6qoip_call_target{"Unresolved: VerifyGroundednessAsync"}
|
||||
class_109ebx2_verifygroundednesscommandhandler -->|contains| method_10jkor8_verifygroundednesscommandhandler
|
||||
class_109ebx2_verifygroundednesscommandhandler -->|contains| method_1fl6nt2_handle
|
||||
class_109ebx2_verifygroundednesscommandhandler -->|unresolved interaction| unresolved_unresolved_1d98nmq_interaction_target
|
||||
method_1fl6nt2_handle -->|unresolved call| unresolved_unresolved_1x6qoip_call_target
|
||||
```
|
||||
|
||||
### Handle() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_1fl6nt2_handle__call_20_VerifyGroundednessAsync[["VerifyGroundednessAsync"]]
|
||||
method_1fl6nt2_handle__action_20_async_return_20__linear("Return result from external service")
|
||||
method_1fl6nt2_handle__action_20_handle_await_20_0__await[["Waits for async work"]]
|
||||
method_1fl6nt2_handle__entry(["Handle entry"])
|
||||
method_1fl6nt2_handle__action_20_external_call_20__linear("Delegate groundedness verification to knowledge service")
|
||||
method_1fl6nt2_handle__action_20_handle_return_20_1__return(["Returns result"])
|
||||
method_1fl6nt2_handle__implicit_return(["return"])
|
||||
method_1fl6nt2_handle__action_20_async_return_20__linear -->|next| method_1fl6nt2_handle__action_20_external_call_20__linear
|
||||
method_1fl6nt2_handle__action_20_external_call_20__linear -->|request.Answer, request.Context, request.TenantId, cancellationToken| method_1fl6nt2_handle__call_20_VerifyGroundednessAsync
|
||||
method_1fl6nt2_handle__action_20_handle_await_20_0__await -->|return| method_1fl6nt2_handle__action_20_handle_return_20_1__return
|
||||
method_1fl6nt2_handle__action_20_handle_return_20_1__return -->|next| method_1fl6nt2_handle__action_20_async_return_20__linear
|
||||
method_1fl6nt2_handle__call_20_VerifyGroundednessAsync -->|return| method_1fl6nt2_handle__implicit_return
|
||||
method_1fl6nt2_handle__entry -->|next| method_1fl6nt2_handle__action_20_handle_await_20_0__await
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 1 unresolved jumps.
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
# IngestEbookCommand
|
||||
|
||||
- File ID: file:1tk8lz4:ingestebookcommand-cs
|
||||
- Path: NexusReader.Application/Commands/Library/IngestEbookCommand.cs
|
||||
- Role: handler
|
||||
- Layer: application
|
||||
|
||||
## Purpose
|
||||
|
||||
Defines a CQRS command DTO used to ingest a new ebook into the library, carrying ebook metadata and binary payloads (cover and EPUB) across the application boundary.
|
||||
|
||||
## Key Details
|
||||
|
||||
Record implements ICommand<Guid>; TenantId defaults to "global" enabling single-tenant default behavior; carries binary payloads (CoverImage and EpubData) so consumers will perform IO/persistence when handling this command.
|
||||
|
||||
## Symbols
|
||||
|
||||
- IngestEbookCommand: Defines a CQRS command DTO used to ingest a new ebook into the library, carrying ebook metadata and binary payloads (cover and EPUB) across the application boundary.
|
||||
- IngestEbookCommand: Represents the data required to ingest an ebook (metadata + binary payloads) and is dispatched as a command returning a Guid identifier.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 2
|
||||
- Executable symbols: 0
|
||||
- Executable symbols with control flow: 0
|
||||
- Grounded edges: 2
|
||||
- Unresolved references: 0
|
||||
- Control-flow fragments: 0
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 1
|
||||
- Generated diagrams: 1
|
||||
|
||||
## Diagrams
|
||||
|
||||
### IngestEbookCommand Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_byhisx_ingestebookcommand("IngestEbookCommand")
|
||||
file_1tk8lz4_ingestebookcommand_cs("IngestEbookCommand")
|
||||
type_dgxlfz_ingestebookcommand[/"IngestEbookCommand"/]
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
+202
@@ -0,0 +1,202 @@
|
||||
# IngestEbookCommandHandler
|
||||
|
||||
- File ID: file:lqr4h8:ingestebookcommandhandler-cs
|
||||
- Path: NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs
|
||||
- Role: handler
|
||||
- Layer: application
|
||||
|
||||
## Purpose
|
||||
|
||||
Handles ingestion of an uploaded ebook: saves files to storage, resolves/creates author, creates Ebook entity and persists it to the repository, returning the new Ebook Id or a failure result.
|
||||
|
||||
## Key Details
|
||||
|
||||
Two-phase ingestion: first persist files to storage (with I/O error mapping), then create/resolve author and persist Ebook in DB (with DB error mapping). Uses MediatR IRequestHandler and repository/service abstractions to keep side effects encapsulated.
|
||||
|
||||
## Symbols
|
||||
|
||||
- IngestEbookCommandHandler: Handles ingestion of an uploaded ebook: saves files to storage, resolves/creates author, creates Ebook entity and persists it to the repository, returning the new Ebook Id or a failure result.
|
||||
- IngestEbookCommandHandler(): Constructor; receives repository and storage service via DI and assigns to fields.
|
||||
- Handle(): Orchestrates ebook ingestion: saves epub/cover to storage, resolves or creates author, constructs Ebook entity, persists it and returns the created Ebook Id or failure.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services/IBookStorageService.cs
|
||||
- dependency-target: NexusReader.Domain.Entities/Ebook.cs
|
||||
- dependency-target: NexusReader.Domain.Entities/Author.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Services/IBookStorageService.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Services/IBookStorageService.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Persistence/IEbookRepository.cs
|
||||
- interaction-target: var author = await _ebookRepository.FindAuthorByNameAsync(authorName, cancellationToken);
|
||||
- interaction-target: Calls AddEbook and SaveChangesAsync to persist the new entity
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 3
|
||||
- Executable symbols: 2
|
||||
- Executable symbols with control flow: 2
|
||||
- Grounded edges: 3
|
||||
- Unresolved references: 12
|
||||
- Control-flow fragments: 2
|
||||
- Unresolved jumps: 6
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- IngestEbookCommandHandler: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- Handle: 40 nodes, 42 edges, 6 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### IngestEbookCommandHandler Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1kfw737_ingestebookcommandhandler("IngestEbookCommandHandler")
|
||||
file_lqr4h8_ingestebookcommandhandler_cs("IngestEbookCommandHandler")
|
||||
method_gy7qh_handle[["Handle()"]]
|
||||
method_jlw375_ingestebookcommandhandler[["IngestEbookCommandHandler()"]]
|
||||
```
|
||||
|
||||
### IngestEbookCommandHandler Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_1kfw737_ingestebookcommandhandler("IngestEbookCommandHandler")
|
||||
method_gy7qh_handle[["Handle()"]]
|
||||
method_jlw375_ingestebookcommandhandler[["IngestEbookCommandHandler()"]]
|
||||
unresolved_unresolved_100nowa_interaction_target{"Unresolved: var author = await _ebookRepository.FindAuthorByNameAsync(authorName, cancellationToken);"}
|
||||
unresolved_unresolved_1foxj00_call_target{"Unresolved: FindAuthorByNameAsync"}
|
||||
unresolved_unresolved_1hkxnh3_call_target{"Unresolved: SaveEbookAsync"}
|
||||
unresolved_unresolved_1jnlalo_call_target{"Unresolved: SaveCoverAsync"}
|
||||
unresolved_unresolved_1o7j1ya_call_target{"Unresolved: AddAuthor"}
|
||||
unresolved_unresolved_6ikjt_call_target{"Unresolved: AddEbook"}
|
||||
unresolved_unresolved_syqfv0_call_target{"Unresolved: SaveChangesAsync"}
|
||||
unresolved_unresolved_yctv9m_interaction_target{"Unresolved: Calls AddEbook and SaveChangesAsync to persist the new entity"}
|
||||
class_1kfw737_ingestebookcommandhandler -->|contains| method_gy7qh_handle
|
||||
class_1kfw737_ingestebookcommandhandler -->|contains| method_jlw375_ingestebookcommandhandler
|
||||
class_1kfw737_ingestebookcommandhandler -->|unresolved interaction| unresolved_unresolved_100nowa_interaction_target
|
||||
class_1kfw737_ingestebookcommandhandler -->|unresolved interaction| unresolved_unresolved_yctv9m_interaction_target
|
||||
method_gy7qh_handle -->|unresolved call| unresolved_unresolved_1foxj00_call_target
|
||||
method_gy7qh_handle -->|unresolved call| unresolved_unresolved_1hkxnh3_call_target
|
||||
method_gy7qh_handle -->|unresolved call| unresolved_unresolved_1jnlalo_call_target
|
||||
method_gy7qh_handle -->|unresolved call| unresolved_unresolved_1o7j1ya_call_target
|
||||
method_gy7qh_handle -->|unresolved call| unresolved_unresolved_6ikjt_call_target
|
||||
method_gy7qh_handle -->|unresolved call| unresolved_unresolved_syqfv0_call_target
|
||||
```
|
||||
|
||||
### Handle() Control Flow
|
||||
|
||||
_Warnings: diagram method_gy7qh_handle__fragment_diagram exceeds preferred complexity thresholds (40 nodes, 42 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_gy7qh_handle__call_31_SaveEbookAsync[["SaveEbookAsync"]]
|
||||
method_gy7qh_handle__call_33_SaveCoverAsync[["SaveCoverAsync"]]
|
||||
method_gy7qh_handle__call_52_FindAuthorByNameAsync[["FindAuthorByNameAsync"]]
|
||||
method_gy7qh_handle__call_56_AddAuthor[["AddAuthor"]]
|
||||
method_gy7qh_handle__call_72_AddEbook[["AddEbook"]]
|
||||
method_gy7qh_handle__call_73_SaveChangesAsync[["SaveChangesAsync"]]
|
||||
method_gy7qh_handle__action_28_handle_try_28_0__try("Begins protected execution")
|
||||
method_gy7qh_handle__action_28_try_catch_28__linear("Storage save with I/O and generic exception handling")
|
||||
method_gy7qh_handle__action_31_handle_await_31_1__await[["Waits for async work"]]
|
||||
method_gy7qh_handle__action_32_branch_32__condition{"request.CoverImage != null && request.CoverImage.Length > 0"}
|
||||
method_gy7qh_handle__action_32_branch_32__false("no cover (coverUrl = null)")
|
||||
method_gy7qh_handle__action_32_branch_32__merge("merge")
|
||||
method_gy7qh_handle__action_32_branch_32__true("save cover and set coverUrl")
|
||||
method_gy7qh_handle__action_33_handle_await_33_2__await[["Waits for async work"]]
|
||||
method_gy7qh_handle__action_36_handle_catch_36_3__catch("catch IOException ex")
|
||||
method_gy7qh_handle__action_40_handle_catch_40_5__catch("catch Exception ex")
|
||||
method_gy7qh_handle__action_45_handle_try_45_7__try("Begins protected execution")
|
||||
method_gy7qh_handle__action_48_guard_clause_48__condition{"string.IsNullOrWhiteSpace(request.AuthorName)"}
|
||||
method_gy7qh_handle__action_48_guard_clause_48__false("use trimmed request.AuthorName")
|
||||
method_gy7qh_handle__action_48_guard_clause_48__merge("merge")
|
||||
method_gy7qh_handle__action_48_guard_clause_48__true("use 'Unknown Author'")
|
||||
method_gy7qh_handle__action_52_external_repository_read_52__linear("Find author case-insensitively (via repository)")
|
||||
method_gy7qh_handle__action_52_handle_await_52_9__await[["Waits for async work"]]
|
||||
method_gy7qh_handle__action_53_branch_fallback_53__linear("Create missing author")
|
||||
method_gy7qh_handle__action_53_handle_branch_53_10__condition{"author == null"}
|
||||
method_gy7qh_handle__action_53_handle_branch_53_10__false("false")
|
||||
method_gy7qh_handle__action_53_handle_branch_53_10__merge("merge")
|
||||
method_gy7qh_handle__action_53_handle_branch_53_10__true("true")
|
||||
method_gy7qh_handle__action_60_entity_construction_60__linear("Construct Ebook entity")
|
||||
method_gy7qh_handle__action_73_handle_await_73_11__await[["Waits for async work"]]
|
||||
method_gy7qh_handle__action_77_handle_catch_77_13__catch("catch Exception ex")
|
||||
method_gy7qh_handle__action_77_try_catch_77__linear("Database error handling during persistence")
|
||||
method_gy7qh_handle__entry(["Handle entry"])
|
||||
method_gy7qh_handle__action_52_handle_repository_read_52_8__linear[("Reads repository or persistence state")]
|
||||
method_gy7qh_handle__action_72_repository_write_72__linear[("Add ebook and persist")]
|
||||
method_gy7qh_handle__action_38_handle_return_38_4__return(["Returns result"])
|
||||
method_gy7qh_handle__action_42_handle_return_42_6__return(["Returns result"])
|
||||
method_gy7qh_handle__action_75_handle_return_75_12__return(["Returns result"])
|
||||
method_gy7qh_handle__action_75_return_75__return(["Return success with Ebook Id"])
|
||||
method_gy7qh_handle__action_79_handle_return_79_14__return(["Returns result"])
|
||||
method_gy7qh_handle__action_28_handle_try_28_0__try -->|next| method_gy7qh_handle__action_31_handle_await_31_1__await
|
||||
method_gy7qh_handle__action_28_try_catch_28__linear -->|next| method_gy7qh_handle__action_28_handle_try_28_0__try
|
||||
method_gy7qh_handle__action_31_handle_await_31_1__await -->|request.EpubData, filename = request.Title .epub| method_gy7qh_handle__call_31_SaveEbookAsync
|
||||
method_gy7qh_handle__action_32_branch_32__condition -->|no cover coverUrl = null| method_gy7qh_handle__action_32_branch_32__false
|
||||
method_gy7qh_handle__action_32_branch_32__condition -->|save cover and set coverUrl| method_gy7qh_handle__action_32_branch_32__true
|
||||
method_gy7qh_handle__action_32_branch_32__false -->|next| method_gy7qh_handle__action_32_branch_32__merge
|
||||
method_gy7qh_handle__action_32_branch_32__merge -->|next| method_gy7qh_handle__action_33_handle_await_33_2__await
|
||||
method_gy7qh_handle__action_32_branch_32__true -->|next| method_gy7qh_handle__action_32_branch_32__merge
|
||||
method_gy7qh_handle__action_33_handle_await_33_2__await -->|request.CoverImage, filename = request.Title _cover.jpg called only if CoverImage present| method_gy7qh_handle__call_33_SaveCoverAsync
|
||||
method_gy7qh_handle__action_36_handle_catch_36_3__catch -->|return| method_gy7qh_handle__action_38_handle_return_38_4__return
|
||||
method_gy7qh_handle__action_38_handle_return_38_4__return -->|exception| method_gy7qh_handle__action_40_handle_catch_40_5__catch
|
||||
method_gy7qh_handle__action_40_handle_catch_40_5__catch -->|return| method_gy7qh_handle__action_42_handle_return_42_6__return
|
||||
method_gy7qh_handle__action_42_handle_return_42_6__return -->|next| method_gy7qh_handle__action_45_handle_try_45_7__try
|
||||
method_gy7qh_handle__action_45_handle_try_45_7__try -->|next| method_gy7qh_handle__action_48_guard_clause_48__condition
|
||||
method_gy7qh_handle__action_48_guard_clause_48__condition -->|use trimmed request.AuthorName| method_gy7qh_handle__action_48_guard_clause_48__false
|
||||
method_gy7qh_handle__action_48_guard_clause_48__condition -->|transforms input| method_gy7qh_handle__action_48_guard_clause_48__true
|
||||
method_gy7qh_handle__action_48_guard_clause_48__false -->|next| method_gy7qh_handle__action_48_guard_clause_48__merge
|
||||
method_gy7qh_handle__action_48_guard_clause_48__merge -->|next| method_gy7qh_handle__action_52_handle_await_52_9__await
|
||||
method_gy7qh_handle__action_48_guard_clause_48__true -->|next| method_gy7qh_handle__action_48_guard_clause_48__merge
|
||||
method_gy7qh_handle__action_52_external_repository_read_52__linear -->|calls| method_gy7qh_handle__call_52_FindAuthorByNameAsync
|
||||
method_gy7qh_handle__action_52_handle_await_52_9__await -->|next| method_gy7qh_handle__action_52_handle_repository_read_52_8__linear
|
||||
method_gy7qh_handle__action_52_handle_repository_read_52_8__linear -->|next| method_gy7qh_handle__action_52_external_repository_read_52__linear
|
||||
method_gy7qh_handle__action_53_branch_fallback_53__linear -->|new Author Name = authorName when author not found| method_gy7qh_handle__call_56_AddAuthor
|
||||
method_gy7qh_handle__action_53_handle_branch_53_10__condition -->|false| method_gy7qh_handle__action_53_handle_branch_53_10__false
|
||||
method_gy7qh_handle__action_53_handle_branch_53_10__condition -->|true| method_gy7qh_handle__action_53_handle_branch_53_10__true
|
||||
method_gy7qh_handle__action_53_handle_branch_53_10__false -->|next| method_gy7qh_handle__action_53_handle_branch_53_10__merge
|
||||
method_gy7qh_handle__action_53_handle_branch_53_10__merge -->|next| method_gy7qh_handle__action_53_branch_fallback_53__linear
|
||||
method_gy7qh_handle__action_53_handle_branch_53_10__true -->|next| method_gy7qh_handle__action_53_handle_branch_53_10__merge
|
||||
method_gy7qh_handle__action_60_entity_construction_60__linear -->|next| method_gy7qh_handle__action_72_repository_write_72__linear
|
||||
method_gy7qh_handle__action_72_repository_write_72__linear -->|ebook Ebook entity constructed from request + paths + metadata| method_gy7qh_handle__call_72_AddEbook
|
||||
method_gy7qh_handle__action_73_handle_await_73_11__await -->|cancellationToken| method_gy7qh_handle__call_73_SaveChangesAsync
|
||||
method_gy7qh_handle__action_75_handle_return_75_12__return -->|return| method_gy7qh_handle__action_75_return_75__return
|
||||
method_gy7qh_handle__action_75_return_75__return -->|exception| method_gy7qh_handle__action_77_handle_catch_77_13__catch
|
||||
method_gy7qh_handle__action_77_handle_catch_77_13__catch -->|next| method_gy7qh_handle__action_77_try_catch_77__linear
|
||||
method_gy7qh_handle__action_77_try_catch_77__linear -->|return| method_gy7qh_handle__action_79_handle_return_79_14__return
|
||||
method_gy7qh_handle__call_31_SaveEbookAsync -->|next| method_gy7qh_handle__action_32_branch_32__condition
|
||||
method_gy7qh_handle__call_33_SaveCoverAsync -->|exception| method_gy7qh_handle__action_36_handle_catch_36_3__catch
|
||||
method_gy7qh_handle__call_52_FindAuthorByNameAsync -->|next| method_gy7qh_handle__action_53_handle_branch_53_10__condition
|
||||
method_gy7qh_handle__call_56_AddAuthor -->|next| method_gy7qh_handle__action_60_entity_construction_60__linear
|
||||
method_gy7qh_handle__call_72_AddEbook -->|next| method_gy7qh_handle__action_73_handle_await_73_11__await
|
||||
method_gy7qh_handle__call_73_SaveChangesAsync -->|return| method_gy7qh_handle__action_75_handle_return_75_12__return
|
||||
method_gy7qh_handle__entry -->|next| method_gy7qh_handle__action_28_try_catch_28__linear
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 6 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_gy7qh_handle__fragment_diagram exceeds preferred complexity thresholds (40 nodes, 42 edges).
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
# IngestEbookRequest
|
||||
|
||||
- File ID: file:1qcpa0s:ingestebookrequest-cs
|
||||
- Path: NexusReader.Application/Commands/Library/IngestEbookRequest.cs
|
||||
- Role: handler
|
||||
- Layer: application
|
||||
|
||||
## Purpose
|
||||
|
||||
Defines a command/DTO that carries data needed to ingest an EPUB ebook into the application (title, author, cover image, base64 epub payload, and optional description).
|
||||
|
||||
## Key Details
|
||||
|
||||
Simple immutable record used as an application-layer command/DTO; no methods or behavior in this file.
|
||||
|
||||
## Symbols
|
||||
|
||||
- IngestEbookRequest: Payload/DTO for requesting ingestion of an ebook into the library.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 1
|
||||
- Executable symbols: 0
|
||||
- Executable symbols with control flow: 0
|
||||
- Grounded edges: 1
|
||||
- Unresolved references: 0
|
||||
- Control-flow fragments: 0
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 1
|
||||
- Generated diagrams: 1
|
||||
|
||||
## Diagrams
|
||||
|
||||
### IngestEbookRequest Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file_1qcpa0s_ingestebookrequest_cs("IngestEbookRequest")
|
||||
type_1eqmnca_ingestebookrequest[/"IngestEbookRequest"/]
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
# SubmitAnswerCommand
|
||||
|
||||
- File ID: file:dskay:submitanswercommand-cs
|
||||
- Path: NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs
|
||||
- Role: handler
|
||||
- Layer: application
|
||||
|
||||
## Purpose
|
||||
|
||||
Defines a simple application command that carries a quiz answer selection (selected index and correct index) to be handled by the application's command pipeline.
|
||||
|
||||
## Key Details
|
||||
|
||||
Minimal DTO/command type used to submit a quiz answer; no methods or behavior in this file beyond the record declaration.
|
||||
|
||||
## Symbols
|
||||
|
||||
- SubmitAnswerCommand: Defines a simple application command that carries a quiz answer selection (selected index and correct index) to be handled by the application's command pipeline.
|
||||
- SubmitAnswerCommand: Represents a CQRS command carrying the user's selected answer index and the correct answer index for a quiz question.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions.Messaging
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 2
|
||||
- Executable symbols: 0
|
||||
- Executable symbols with control flow: 0
|
||||
- Grounded edges: 2
|
||||
- Unresolved references: 1
|
||||
- Control-flow fragments: 0
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 1
|
||||
- Generated diagrams: 1
|
||||
|
||||
## Diagrams
|
||||
|
||||
### SubmitAnswerCommand Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_cmiilf_submitanswercommand("SubmitAnswerCommand")
|
||||
file_dskay_submitanswercommand_cs("SubmitAnswerCommand")
|
||||
type_dvy3sa_submitanswercommand[/"SubmitAnswerCommand"/]
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
# SubmitAnswerCommandHandler
|
||||
|
||||
- File ID: file:hc4koi:submitanswercommandhandler-cs
|
||||
- Path: NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs
|
||||
- Role: handler
|
||||
- Layer: application
|
||||
|
||||
## Purpose
|
||||
|
||||
Handles quiz answer submission: verifies the selected answer against the correct index, triggers a platform vibration on correct answers, and returns a success/failure Result.
|
||||
|
||||
## Key Details
|
||||
|
||||
Uses FluentResults.Result for success/failure; relies on IPlatformService for haptic feedback; trivial constructor injects dependency (_platformService at line 9).
|
||||
|
||||
## Symbols
|
||||
|
||||
- SubmitAnswerCommandHandler: Handles quiz answer submission: verifies the selected answer against the correct index, triggers a platform vibration on correct answers, and returns a success/failure Result.
|
||||
- Handle(): Checks the submitted answer; vibrates the device and returns success if correct, otherwise returns a failure Result.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Application.Abstractions.Services/IPlatformService.cs
|
||||
- dependency-target: NexusReader.Application.Commands.Quiz/SubmitAnswerCommand.cs
|
||||
- call-target: NexusReader.Application.Abstractions.Services/IPlatformService.cs
|
||||
- interaction-target: _platformService.VibrateAsync(50) invoked to provide haptic feedback on correct answer
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 2
|
||||
- Executable symbols: 1
|
||||
- Executable symbols with control flow: 1
|
||||
- Grounded edges: 2
|
||||
- Unresolved references: 4
|
||||
- Control-flow fragments: 1
|
||||
- Unresolved jumps: 1
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- Handle: 16 nodes, 17 edges, 1 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### SubmitAnswerCommandHandler Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_andjgd_submitanswercommandhandler("SubmitAnswerCommandHandler")
|
||||
file_hc4koi_submitanswercommandhandler_cs("SubmitAnswerCommandHandler")
|
||||
method_e8akyb_handle[["Handle()"]]
|
||||
```
|
||||
|
||||
### SubmitAnswerCommandHandler Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_andjgd_submitanswercommandhandler("SubmitAnswerCommandHandler")
|
||||
method_e8akyb_handle[["Handle()"]]
|
||||
unresolved_unresolved_gdtbd6_call_target{"Unresolved: VibrateAsync"}
|
||||
unresolved_unresolved_h9q2v9_interaction_target{"Unresolved: _platformService.VibrateAsync(50) invoked to provide haptic feedback on correct answer"}
|
||||
class_andjgd_submitanswercommandhandler -->|contains| method_e8akyb_handle
|
||||
class_andjgd_submitanswercommandhandler -->|unresolved interaction| unresolved_unresolved_h9q2v9_interaction_target
|
||||
method_e8akyb_handle -->|unresolved call| unresolved_unresolved_gdtbd6_call_target
|
||||
```
|
||||
|
||||
### Handle() Control Flow
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
method_e8akyb_handle__call_20_VibrateAsync[["VibrateAsync"]]
|
||||
method_e8akyb_handle__action_18_guard_clause_18__condition{"request.SelectedIndex == request.CorrectIndex"}
|
||||
method_e8akyb_handle__action_18_guard_clause_18__false("incorrect -> return failure")
|
||||
method_e8akyb_handle__action_18_guard_clause_18__merge("merge")
|
||||
method_e8akyb_handle__action_18_guard_clause_18__true("correct -> vibrate and return success")
|
||||
method_e8akyb_handle__action_18_handle_branch_18_0__condition{"request.SelectedIndex == request.CorrectIndex"}
|
||||
method_e8akyb_handle__action_18_handle_branch_18_0__false("false")
|
||||
method_e8akyb_handle__action_18_handle_branch_18_0__merge("merge")
|
||||
method_e8akyb_handle__action_18_handle_branch_18_0__true("true")
|
||||
method_e8akyb_handle__action_20_handle_await_20_1__await[["Waits for async work"]]
|
||||
method_e8akyb_handle__entry(["Handle entry"])
|
||||
method_e8akyb_handle__action_20_external_call_20__linear("platform vibrate")
|
||||
method_e8akyb_handle__action_21_handle_return_21_2__return(["Returns result"])
|
||||
method_e8akyb_handle__action_21_return_21__return(["success-return"])
|
||||
method_e8akyb_handle__action_24_handle_return_24_3__return(["Returns result"])
|
||||
method_e8akyb_handle__action_24_return_24__return(["failure-return"])
|
||||
method_e8akyb_handle__action_18_guard_clause_18__condition -->|incorrect -> return failure| method_e8akyb_handle__action_18_guard_clause_18__false
|
||||
method_e8akyb_handle__action_18_guard_clause_18__condition -->|correct -> vibrate and return success| method_e8akyb_handle__action_18_guard_clause_18__true
|
||||
method_e8akyb_handle__action_18_guard_clause_18__false -->|next| method_e8akyb_handle__action_18_guard_clause_18__merge
|
||||
method_e8akyb_handle__action_18_guard_clause_18__merge -->|next| method_e8akyb_handle__action_20_handle_await_20_1__await
|
||||
method_e8akyb_handle__action_18_guard_clause_18__true -->|next| method_e8akyb_handle__action_18_guard_clause_18__merge
|
||||
method_e8akyb_handle__action_18_handle_branch_18_0__condition -->|false| method_e8akyb_handle__action_18_handle_branch_18_0__false
|
||||
method_e8akyb_handle__action_18_handle_branch_18_0__condition -->|true| method_e8akyb_handle__action_18_handle_branch_18_0__true
|
||||
method_e8akyb_handle__action_18_handle_branch_18_0__false -->|next| method_e8akyb_handle__action_18_handle_branch_18_0__merge
|
||||
method_e8akyb_handle__action_18_handle_branch_18_0__merge -->|next| method_e8akyb_handle__action_18_guard_clause_18__condition
|
||||
method_e8akyb_handle__action_18_handle_branch_18_0__true -->|next| method_e8akyb_handle__action_18_handle_branch_18_0__merge
|
||||
method_e8akyb_handle__action_20_external_call_20__linear -->|50 int milliseconds| method_e8akyb_handle__call_20_VibrateAsync
|
||||
method_e8akyb_handle__action_20_handle_await_20_1__await -->|next| method_e8akyb_handle__action_20_external_call_20__linear
|
||||
method_e8akyb_handle__action_21_handle_return_21_2__return -->|return| method_e8akyb_handle__action_24_handle_return_24_3__return
|
||||
method_e8akyb_handle__action_21_return_21__return -->|return| method_e8akyb_handle__action_21_handle_return_21_2__return
|
||||
method_e8akyb_handle__action_24_handle_return_24_3__return -->|return| method_e8akyb_handle__action_24_return_24__return
|
||||
method_e8akyb_handle__call_20_VibrateAsync -->|return| method_e8akyb_handle__action_21_return_21__return
|
||||
method_e8akyb_handle__entry -->|next| method_e8akyb_handle__action_18_handle_branch_18_0__condition
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 1 unresolved jumps.
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
# UpdateReadingProgressCommand
|
||||
|
||||
- File ID: file:xocicc:updatereadingprogresscommand-cs
|
||||
- Path: NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs
|
||||
- Role: handler
|
||||
- Layer: application
|
||||
|
||||
## Purpose
|
||||
|
||||
Defines a MediatR command record that carries data for updating a user's reading progress for an ebook (used in sync operations).
|
||||
|
||||
## Key Details
|
||||
|
||||
Simple immutable record used as a MediatR IRequest<Result> to trigger update logic elsewhere; contains nullable fields for optional metadata and an excluded connection id to avoid echoing updates.
|
||||
|
||||
## Symbols
|
||||
|
||||
- UpdateReadingProgressCommand: Defines a MediatR command record that carries data for updating a user's reading progress for an ebook (used in sync operations).
|
||||
- UpdateReadingProgressCommand: Carries parameters required to update a user's reading progress for an ebook in synchronization workflows.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 2
|
||||
- Executable symbols: 0
|
||||
- Executable symbols with control flow: 0
|
||||
- Grounded edges: 2
|
||||
- Unresolved references: 0
|
||||
- Control-flow fragments: 0
|
||||
- Unresolved jumps: 0
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 1
|
||||
- Generated diagrams: 1
|
||||
|
||||
## Diagrams
|
||||
|
||||
### UpdateReadingProgressCommand Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_1onwz_updatereadingprogresscommand("UpdateReadingProgressCommand")
|
||||
file_xocicc_updatereadingprogresscommand_cs("UpdateReadingProgressCommand")
|
||||
type_lwz5af_updatereadingprogresscommand[/"UpdateReadingProgressCommand"/]
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: pass
|
||||
+200
@@ -0,0 +1,200 @@
|
||||
# UpdateReadingProgressCommandHandler
|
||||
|
||||
- File ID: file:13c5eb4:updatereadingprogresscommandhandler-cs
|
||||
- Path: NexusReader.Application/Commands/Sync/UpdateReadingProgressCommandHandler.cs
|
||||
- Role: handler
|
||||
- Layer: application
|
||||
|
||||
## Purpose
|
||||
|
||||
MediatR handler that persists a user's reading position (User and Ebook entities) and broadcasts the progress update to other connected devices.
|
||||
|
||||
## Key Details
|
||||
|
||||
Checks for user presence and returns failure if missing; updates user and optionally ebook, saves changes and broadcasts update to other devices while honoring an excluded connection id; cancellationToken is propagated to async DB and broadcaster calls.
|
||||
|
||||
## Symbols
|
||||
|
||||
- UpdateReadingProgressCommandHandler: MediatR handler that persists a user's reading position (User and Ebook entities) and broadcasts the progress update to other connected devices.
|
||||
- UpdateReadingProgressCommandHandler(): Constructor: injects the AppDbContext factory and an ISyncBroadcaster.
|
||||
- Handle(): Load user and ebook, update reading progress and timestamps, persist changes, then broadcast the progress to other devices; returns success or failure if user missing.
|
||||
- UpdateReadingProgressCommandHandler: MediatR request handler that orchestrates persistence of reading progress and broadcasting updates.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- No resolved dependencies.
|
||||
|
||||
## Calls
|
||||
|
||||
- No resolved calls.
|
||||
|
||||
## Unresolved References
|
||||
|
||||
- dependency-target: NexusReader.Data.Persistence
|
||||
- dependency-target: NexusReader.Application.Abstractions.Messaging
|
||||
- call-target: unknown
|
||||
- call-target: NexusReader.Data.Persistence
|
||||
- call-target: NexusReader.Data.Persistence
|
||||
- call-target: NexusReader.Data.Persistence
|
||||
- call-target: unknown
|
||||
- interaction-target: var user = await context.Users.FirstOrDefaultAsync(u => u.Id == request.UserId, cancellationToken);
|
||||
- interaction-target: var ebook = await context.Ebooks.FirstOrDefaultAsync(e => e.Id == request.EbookId, cancellationToken);
|
||||
- interaction-target: await context.SaveChangesAsync(cancellationToken);
|
||||
- interaction-target: await _broadcaster.BroadcastProgressAsync(request.UserId, request.PageId, now, request.ExcludedConnectionId, cancellationToken);
|
||||
|
||||
## Coverage
|
||||
|
||||
- Symbols: 4
|
||||
- Executable symbols: 2
|
||||
- Executable symbols with control flow: 2
|
||||
- Grounded edges: 4
|
||||
- Unresolved references: 11
|
||||
- Control-flow fragments: 2
|
||||
- Unresolved jumps: 5
|
||||
- Unsupported constructs: 0
|
||||
- Control-flow coverage: 100%
|
||||
- Required diagrams: 2
|
||||
- Generated diagrams: 3
|
||||
|
||||
## Control Flow Fragments
|
||||
|
||||
- UpdateReadingProgressCommandHandler: 3 nodes, 2 edges, 0 jumps, 0 unsupported constructs
|
||||
- Handle: 37 nodes, 40 edges, 5 jumps, 0 unsupported constructs
|
||||
|
||||
## Diagrams
|
||||
|
||||
### UpdateReadingProgressCommandHandler Neighborhood
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
class_2zm0w9_updatereadingprogresscommandhandler("UpdateReadingProgressCommandHandler")
|
||||
file_13c5eb4_updatereadingprogresscommandhandler_cs("UpdateReadingProgressCommandHandler")
|
||||
method_1ed5bhs_updatereadingprogresscommandhandler[["UpdateReadingProgressCommandHandler()"]]
|
||||
method_1jqlijy_handle[["Handle()"]]
|
||||
type_1hf0y4h_updatereadingprogresscommandhandler[/"UpdateReadingProgressCommandHandler"/]
|
||||
```
|
||||
|
||||
### UpdateReadingProgressCommandHandler Execution Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
class_2zm0w9_updatereadingprogresscommandhandler("UpdateReadingProgressCommandHandler")
|
||||
method_1ed5bhs_updatereadingprogresscommandhandler[["UpdateReadingProgressCommandHandler()"]]
|
||||
method_1jqlijy_handle[["Handle()"]]
|
||||
unresolved_unresolved_167ab0v_call_target{"Unresolved: AppDbContext.Users.FirstOrDefaultAsync"}
|
||||
unresolved_unresolved_197jdm1_call_target{"Unresolved: IDbContextFactory<AppDbContext>.CreateDbContextAsync"}
|
||||
unresolved_unresolved_1mfbj3f_interaction_target{"Unresolved: var ebook = await context.Ebooks.FirstOrDefaultAsync(e => e.Id == request.EbookId, cancellationToken);"}
|
||||
unresolved_unresolved_1n2eft4_interaction_target{"Unresolved: await _broadcaster.BroadcastProgressAsync(request.UserId, request.PageId, now, request.ExcludedConnectionId, cancellationToken);"}
|
||||
unresolved_unresolved_1rw33m5_call_target{"Unresolved: AppDbContext.SaveChangesAsync"}
|
||||
unresolved_unresolved_35czhy_interaction_target{"Unresolved: var user = await context.Users.FirstOrDefaultAsync(u => u.Id == request.UserId, cancellationToken);"}
|
||||
unresolved_unresolved_eld0cu_call_target{"Unresolved: AppDbContext.Ebooks.FirstOrDefaultAsync"}
|
||||
unresolved_unresolved_jg0l72_call_target{"Unresolved: ISyncBroadcaster.BroadcastProgressAsync"}
|
||||
unresolved_unresolved_k7dskm_interaction_target{"Unresolved: await context.SaveChangesAsync(cancellationToken);"}
|
||||
class_2zm0w9_updatereadingprogresscommandhandler -->|contains| method_1ed5bhs_updatereadingprogresscommandhandler
|
||||
class_2zm0w9_updatereadingprogresscommandhandler -->|contains| method_1jqlijy_handle
|
||||
class_2zm0w9_updatereadingprogresscommandhandler -->|unresolved interaction| unresolved_unresolved_1mfbj3f_interaction_target
|
||||
class_2zm0w9_updatereadingprogresscommandhandler -->|unresolved interaction| unresolved_unresolved_1n2eft4_interaction_target
|
||||
class_2zm0w9_updatereadingprogresscommandhandler -->|unresolved interaction| unresolved_unresolved_35czhy_interaction_target
|
||||
class_2zm0w9_updatereadingprogresscommandhandler -->|unresolved interaction| unresolved_unresolved_k7dskm_interaction_target
|
||||
method_1jqlijy_handle -->|unresolved call| unresolved_unresolved_167ab0v_call_target
|
||||
method_1jqlijy_handle -->|unresolved call| unresolved_unresolved_197jdm1_call_target
|
||||
method_1jqlijy_handle -->|unresolved call| unresolved_unresolved_1rw33m5_call_target
|
||||
method_1jqlijy_handle -->|unresolved call| unresolved_unresolved_eld0cu_call_target
|
||||
method_1jqlijy_handle -->|unresolved call| unresolved_unresolved_jg0l72_call_target
|
||||
```
|
||||
|
||||
### Handle() Control Flow
|
||||
|
||||
_Warnings: diagram method_1jqlijy_handle__fragment_diagram exceeds preferred complexity thresholds (37 nodes, 40 edges)._
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
flowchart:
|
||||
defaultRenderer: "elk"
|
||||
---
|
||||
flowchart TD
|
||||
method_1jqlijy_handle__call_28_IDbContextFactory_AppDbContext_CreateDbContextAsync[["IDbContextFactory<AppDbContext>.CreateDbContextAsync"]]
|
||||
method_1jqlijy_handle__call_30_AppDbContext_Users_FirstOrDefaultAsync[["AppDbContext.Users.FirstOrDefaultAsync"]]
|
||||
method_1jqlijy_handle__call_40_AppDbContext_Ebooks_FirstOrDefaultAsync[["AppDbContext.Ebooks.FirstOrDefaultAsync"]]
|
||||
method_1jqlijy_handle__call_49_AppDbContext_SaveChangesAsync[["AppDbContext.SaveChangesAsync"]]
|
||||
method_1jqlijy_handle__call_52_ISyncBroadcaster_BroadcastProgressAsync[["ISyncBroadcaster.BroadcastProgressAsync"]]
|
||||
method_1jqlijy_handle__action_28_handle_await_28_0__await[["Waits for async work"]]
|
||||
method_1jqlijy_handle__action_28_resource_acquire_28__linear("Create DbContext scope")
|
||||
method_1jqlijy_handle__action_30_handle_await_30_2__await[["Waits for async work"]]
|
||||
method_1jqlijy_handle__action_31_guard_clause_31__condition{"user == null"}
|
||||
method_1jqlijy_handle__action_31_guard_clause_31__false("continue")
|
||||
method_1jqlijy_handle__action_31_guard_clause_31__merge("merge")
|
||||
method_1jqlijy_handle__action_31_guard_clause_31__true("return Fail")
|
||||
method_1jqlijy_handle__action_31_handle_branch_31_3__condition{"user == null"}
|
||||
method_1jqlijy_handle__action_31_handle_branch_31_3__false("false")
|
||||
method_1jqlijy_handle__action_31_handle_branch_31_3__merge("merge")
|
||||
method_1jqlijy_handle__action_31_handle_branch_31_3__true("true")
|
||||
method_1jqlijy_handle__action_37_field_update_37__linear("Update user reading pointers/timestamps")
|
||||
method_1jqlijy_handle__action_40_handle_await_40_6__await[["Waits for async work"]]
|
||||
method_1jqlijy_handle__action_41_branch_41__condition{"ebook != null"}
|
||||
method_1jqlijy_handle__action_41_branch_41__false("skip")
|
||||
method_1jqlijy_handle__action_41_branch_41__merge("merge")
|
||||
method_1jqlijy_handle__action_41_branch_41__true("update ebook fields")
|
||||
method_1jqlijy_handle__action_41_handle_branch_41_7__condition{"ebook != null"}
|
||||
method_1jqlijy_handle__action_41_handle_branch_41_7__false("false")
|
||||
method_1jqlijy_handle__action_41_handle_branch_41_7__merge("merge")
|
||||
method_1jqlijy_handle__action_41_handle_branch_41_7__true("true")
|
||||
method_1jqlijy_handle__action_49_handle_await_49_9__await[["Waits for async work"]]
|
||||
method_1jqlijy_handle__action_49_persist_49__linear("Persist entity changes")
|
||||
method_1jqlijy_handle__action_52_handle_await_52_10__await[["Waits for async work"]]
|
||||
method_1jqlijy_handle__entry(["Handle entry"])
|
||||
method_1jqlijy_handle__action_30_handle_repository_read_30_1__linear[("Reads repository or persistence state")]
|
||||
method_1jqlijy_handle__action_40_handle_repository_read_40_5__linear[("Reads repository or persistence state")]
|
||||
method_1jqlijy_handle__action_49_handle_repository_read_49_8__linear[("Reads repository or persistence state")]
|
||||
method_1jqlijy_handle__action_52_external_call_52__linear("Broadcast progress to other devices")
|
||||
method_1jqlijy_handle__action_33_handle_return_33_4__return(["Returns result"])
|
||||
method_1jqlijy_handle__action_59_handle_return_59_11__return(["Returns result"])
|
||||
method_1jqlijy_handle__action_59_return_59__return(["Return success result"])
|
||||
method_1jqlijy_handle__action_28_handle_await_28_0__await -->|next| method_1jqlijy_handle__action_28_resource_acquire_28__linear
|
||||
method_1jqlijy_handle__action_28_resource_acquire_28__linear -->|cancellationToken| method_1jqlijy_handle__call_28_IDbContextFactory_AppDbContext_CreateDbContextAsync
|
||||
method_1jqlijy_handle__action_30_handle_await_30_2__await -->|next| method_1jqlijy_handle__action_30_handle_repository_read_30_1__linear
|
||||
method_1jqlijy_handle__action_30_handle_repository_read_30_1__linear -->|predicate u => u.Id == request.UserId, cancellationToken| method_1jqlijy_handle__call_30_AppDbContext_Users_FirstOrDefaultAsync
|
||||
method_1jqlijy_handle__action_31_guard_clause_31__condition -->|continue| method_1jqlijy_handle__action_31_guard_clause_31__false
|
||||
method_1jqlijy_handle__action_31_guard_clause_31__condition -->|return Fail| method_1jqlijy_handle__action_31_guard_clause_31__true
|
||||
method_1jqlijy_handle__action_31_guard_clause_31__false -->|next| method_1jqlijy_handle__action_31_guard_clause_31__merge
|
||||
method_1jqlijy_handle__action_31_guard_clause_31__merge -->|next| method_1jqlijy_handle__action_31_handle_branch_31_3__condition
|
||||
method_1jqlijy_handle__action_31_guard_clause_31__true -->|next| method_1jqlijy_handle__action_31_guard_clause_31__merge
|
||||
method_1jqlijy_handle__action_31_handle_branch_31_3__condition -->|false| method_1jqlijy_handle__action_31_handle_branch_31_3__false
|
||||
method_1jqlijy_handle__action_31_handle_branch_31_3__condition -->|true| method_1jqlijy_handle__action_31_handle_branch_31_3__true
|
||||
method_1jqlijy_handle__action_31_handle_branch_31_3__false -->|next| method_1jqlijy_handle__action_31_handle_branch_31_3__merge
|
||||
method_1jqlijy_handle__action_31_handle_branch_31_3__merge -->|return| method_1jqlijy_handle__action_33_handle_return_33_4__return
|
||||
method_1jqlijy_handle__action_31_handle_branch_31_3__true -->|next| method_1jqlijy_handle__action_31_handle_branch_31_3__merge
|
||||
method_1jqlijy_handle__action_33_handle_return_33_4__return -->|next| method_1jqlijy_handle__action_37_field_update_37__linear
|
||||
method_1jqlijy_handle__action_37_field_update_37__linear -->|next| method_1jqlijy_handle__action_40_handle_await_40_6__await
|
||||
method_1jqlijy_handle__action_40_handle_await_40_6__await -->|next| method_1jqlijy_handle__action_40_handle_repository_read_40_5__linear
|
||||
method_1jqlijy_handle__action_40_handle_repository_read_40_5__linear -->|predicate e => e.Id == request.EbookId, cancellationToken| method_1jqlijy_handle__call_40_AppDbContext_Ebooks_FirstOrDefaultAsync
|
||||
method_1jqlijy_handle__action_41_branch_41__condition -->|skip| method_1jqlijy_handle__action_41_branch_41__false
|
||||
method_1jqlijy_handle__action_41_branch_41__condition -->|update ebook fields| method_1jqlijy_handle__action_41_branch_41__true
|
||||
method_1jqlijy_handle__action_41_branch_41__false -->|next| method_1jqlijy_handle__action_41_branch_41__merge
|
||||
method_1jqlijy_handle__action_41_branch_41__merge -->|next| method_1jqlijy_handle__action_41_handle_branch_41_7__condition
|
||||
method_1jqlijy_handle__action_41_branch_41__true -->|next| method_1jqlijy_handle__action_41_branch_41__merge
|
||||
method_1jqlijy_handle__action_41_handle_branch_41_7__condition -->|false| method_1jqlijy_handle__action_41_handle_branch_41_7__false
|
||||
method_1jqlijy_handle__action_41_handle_branch_41_7__condition -->|true| method_1jqlijy_handle__action_41_handle_branch_41_7__true
|
||||
method_1jqlijy_handle__action_41_handle_branch_41_7__false -->|next| method_1jqlijy_handle__action_41_handle_branch_41_7__merge
|
||||
method_1jqlijy_handle__action_41_handle_branch_41_7__merge -->|next| method_1jqlijy_handle__action_49_handle_await_49_9__await
|
||||
method_1jqlijy_handle__action_41_handle_branch_41_7__true -->|next| method_1jqlijy_handle__action_41_handle_branch_41_7__merge
|
||||
method_1jqlijy_handle__action_49_handle_await_49_9__await -->|next| method_1jqlijy_handle__action_49_handle_repository_read_49_8__linear
|
||||
method_1jqlijy_handle__action_49_handle_repository_read_49_8__linear -->|next| method_1jqlijy_handle__action_49_persist_49__linear
|
||||
method_1jqlijy_handle__action_49_persist_49__linear -->|cancellationToken| method_1jqlijy_handle__call_49_AppDbContext_SaveChangesAsync
|
||||
method_1jqlijy_handle__action_52_external_call_52__linear -->|request.UserId, request.PageId, now DateTime.UtcNow , request.ExcludedConnectionId, cancellationToken| method_1jqlijy_handle__call_52_ISyncBroadcaster_BroadcastProgressAsync
|
||||
method_1jqlijy_handle__action_52_handle_await_52_10__await -->|next| method_1jqlijy_handle__action_52_external_call_52__linear
|
||||
method_1jqlijy_handle__action_59_handle_return_59_11__return -->|return| method_1jqlijy_handle__action_59_return_59__return
|
||||
method_1jqlijy_handle__call_28_IDbContextFactory_AppDbContext_CreateDbContextAsync -->|next| method_1jqlijy_handle__action_30_handle_await_30_2__await
|
||||
method_1jqlijy_handle__call_30_AppDbContext_Users_FirstOrDefaultAsync -->|next| method_1jqlijy_handle__action_31_guard_clause_31__condition
|
||||
method_1jqlijy_handle__call_40_AppDbContext_Ebooks_FirstOrDefaultAsync -->|next| method_1jqlijy_handle__action_41_branch_41__condition
|
||||
method_1jqlijy_handle__call_49_AppDbContext_SaveChangesAsync -->|next| method_1jqlijy_handle__action_52_handle_await_52_10__await
|
||||
method_1jqlijy_handle__call_52_ISyncBroadcaster_BroadcastProgressAsync -->|return| method_1jqlijy_handle__action_59_handle_return_59_11__return
|
||||
method_1jqlijy_handle__entry -->|next| method_1jqlijy_handle__action_28_handle_await_28_0__await
|
||||
```
|
||||
|
||||
## Diagram Validation
|
||||
|
||||
- Status: warn
|
||||
- Warning: Control-flow extraction left 5 unresolved jumps.
|
||||
- Warning: control-flow: diagram method_1jqlijy_handle__fragment_diagram exceeds preferred complexity thresholds (37 nodes, 40 edges).
|
||||
Reference in New Issue
Block a user