# owlcoder/studium architecture

> Architecture diagram of the GitHub repository owlcoder/studium, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/owlcoder/studium
- Repository: https://github.com/owlcoder/studium

## Overview

STUDIUM is an early-stage teaching-support system scaffold, not a complete implementation of its ST-001–ST-100 specification. Its working user flow is a console or HTTP request to list/search demo courses, through an application handler, to an in-memory reader and back. The repository also contains an unwired course-creation use case and a mock submission-overview capability. Edges reflect the README and shown/indexed source references; unsampled wiring is omitted.

Main entry points: [`src/Infrastructure/MockSubmissionOverviewService.cs`](https://github.com/owlcoder/studium/blob/main/src/Infrastructure/MockSubmissionOverviewService.cs) (Mock overview service), [`src/Api/Program.cs`](https://github.com/owlcoder/studium/blob/main/src/Api/Program.cs) (HTTP API), [`src/Application/Courses/ListCoursesHandler.cs`](https://github.com/owlcoder/studium/blob/main/src/Application/Courses/ListCoursesHandler.cs) (Course listing), [`src/Application/Courses/ICourseReader.cs`](https://github.com/owlcoder/studium/blob/main/src/Application/Courses/ICourseReader.cs) (Course reader port)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["User entry points"]
  node_api["HTTP API<br/>[Program.cs]"]
  node_console["Console UI<br/>[Program.cs]"]
end

subgraph group_courseapp["Course application"]
  node_list["Course listing"]
  node_search["Course search"]
  node_create["Course creation"]
  node_readerport["Course reader port<br/>[ICourseReader.cs]"]
  node_repositoryport["Course repository port"]
  node_listitem["Course list result<br/>[CourseListItem.cs]"]
  node_searchresult["Search result"]
  node_createcommand["Create command"]
  node_overviewport["Overview service port"]
  node_overviewdto["Overview results"]
end

subgraph group_domain["Domain models"]
  node_course["Course entity<br/>[Course.cs]"]
  node_member["Member contract<br/>[MemberContract.cs]"]
  node_task["Task contract<br/>[TaskContract.cs]"]
  node_submission["Submission contract"]
  node_status["Submission status"]
end

subgraph group_adapters["Infrastructure adapters"]
  node_demodata["Demo data factory<br/>[DemoData.cs]"]
  node_memoryreader["In-memory reader"]
  node_mockoverview["Mock overview service"]
end

node_user(("User"))

node_user -->|"sends request"| node_api
node_user -->|"runs demo"| node_console
node_api -->|"calls listing"| node_list
node_api -->|"calls search"| node_search
node_api -->|"configures reader"| node_demodata
node_console -->|"calls listing"| node_list
node_console -->|"creates reader"| node_demodata
node_list -->|"reads courses"| node_readerport
node_search -->|"reads courses"| node_readerport
node_list -->|"projects results"| node_listitem
node_search -->|"projects results"| node_searchresult
node_create -->|"checks and saves"| node_repositoryport
node_create -->|"reads command"| node_createcommand
node_create -->|"creates entity"| node_course
node_readerport -->|"returns courses"| node_course
node_memoryreader -->|"implements"| node_readerport
node_memoryreader -->|"reads entities"| node_course
node_mockoverview -->|"implements"| node_overviewport
node_mockoverview -->|"reads submissions"| node_submission
node_mockoverview -->|"reads members"| node_member
node_mockoverview -->|"reads tasks"| node_task
node_mockoverview -->|"builds overviews"| node_overviewdto
node_overviewport -->|"returns results"| node_overviewdto
node_overviewdto -->|"uses status"| node_status
node_submission -->|"uses status"| node_status

click node_api "https://github.com/owlcoder/studium/blob/main/src/Api/Program.cs"
click node_console "https://github.com/owlcoder/studium/blob/main/src/ConsoleUi/Program.cs"
click node_list "https://github.com/owlcoder/studium/blob/main/src/Application/Courses/ListCoursesHandler.cs"
click node_search "https://github.com/owlcoder/studium/blob/main/src/Application/Courses/SearchCoursesHandler.cs"
click node_create "https://github.com/owlcoder/studium/blob/main/src/Application/Courses/CreateCourseHandler.cs"
click node_readerport "https://github.com/owlcoder/studium/blob/main/src/Application/Courses/ICourseReader.cs"
click node_repositoryport "https://github.com/owlcoder/studium/blob/main/src/Application/Courses/ICourseRepository.cs"
click node_listitem "https://github.com/owlcoder/studium/blob/main/src/Application/Courses/CourseListItem.cs"
click node_searchresult "https://github.com/owlcoder/studium/blob/main/src/Application/Courses/CourseSearchResult.cs"
click node_createcommand "https://github.com/owlcoder/studium/blob/main/src/Application/Courses/CreateCourseCommand.cs"
click node_course "https://github.com/owlcoder/studium/blob/main/src/Domain/Courses/Course.cs"
click node_member "https://github.com/owlcoder/studium/blob/main/src/Domain/MemberContract.cs"
click node_task "https://github.com/owlcoder/studium/blob/main/src/Domain/TaskContract.cs"
click node_submission "https://github.com/owlcoder/studium/blob/main/src/Domain/SubmissionContract.cs"
click node_status "https://github.com/owlcoder/studium/blob/main/src/Domain/SubmissionStatus.cs"
click node_demodata "https://github.com/owlcoder/studium/blob/main/src/Infrastructure/Demo/DemoData.cs"
click node_memoryreader "https://github.com/owlcoder/studium/blob/main/src/Infrastructure/Courses/InMemoryCourseReader.cs"
click node_overviewport "https://github.com/owlcoder/studium/blob/main/src/Application/ISubmissionOverviewService.cs"
click node_overviewdto "https://github.com/owlcoder/studium/blob/main/src/Application/SubmissionOverviewDto.cs"
click node_mockoverview "https://github.com/owlcoder/studium/blob/main/src/Infrastructure/MockSubmissionOverviewService.cs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_api,node_console,node_user toneBlue
class node_list,node_search,node_create,node_readerport,node_repositoryport,node_listitem,node_searchresult,node_createcommand,node_overviewport,node_overviewdto toneAmber
class node_course,node_member,node_task,node_submission,node_status toneMint
class node_demodata,node_memoryreader,node_mockoverview toneRose
```

## Components

### User entry points

- [HTTP API](https://github.com/owlcoder/studium/blob/main/src/Api/Program.cs): `src/Api/Program.cs`
- [Console UI](https://github.com/owlcoder/studium/blob/main/src/ConsoleUi/Program.cs): `src/ConsoleUi/Program.cs`

### Course application

- [Course listing](https://github.com/owlcoder/studium/blob/main/src/Application/Courses/ListCoursesHandler.cs): `src/Application/Courses/ListCoursesHandler.cs`
- [Course search](https://github.com/owlcoder/studium/blob/main/src/Application/Courses/SearchCoursesHandler.cs): `src/Application/Courses/SearchCoursesHandler.cs`
- [Course creation](https://github.com/owlcoder/studium/blob/main/src/Application/Courses/CreateCourseHandler.cs): `src/Application/Courses/CreateCourseHandler.cs`
- [Course reader port](https://github.com/owlcoder/studium/blob/main/src/Application/Courses/ICourseReader.cs): `src/Application/Courses/ICourseReader.cs`
- [Course repository port](https://github.com/owlcoder/studium/blob/main/src/Application/Courses/ICourseRepository.cs): `src/Application/Courses/ICourseRepository.cs`
- [Course list result](https://github.com/owlcoder/studium/blob/main/src/Application/Courses/CourseListItem.cs): `src/Application/Courses/CourseListItem.cs`
- [Search result](https://github.com/owlcoder/studium/blob/main/src/Application/Courses/CourseSearchResult.cs): `src/Application/Courses/CourseSearchResult.cs`
- [Create command](https://github.com/owlcoder/studium/blob/main/src/Application/Courses/CreateCourseCommand.cs): `src/Application/Courses/CreateCourseCommand.cs`
- [Overview service port](https://github.com/owlcoder/studium/blob/main/src/Application/ISubmissionOverviewService.cs): `src/Application/ISubmissionOverviewService.cs`
- [Overview results](https://github.com/owlcoder/studium/blob/main/src/Application/SubmissionOverviewDto.cs): `src/Application/SubmissionOverviewDto.cs`

### Domain models

- [Course entity](https://github.com/owlcoder/studium/blob/main/src/Domain/Courses/Course.cs): `src/Domain/Courses/Course.cs`
- [Member contract](https://github.com/owlcoder/studium/blob/main/src/Domain/MemberContract.cs): `src/Domain/MemberContract.cs`
- [Task contract](https://github.com/owlcoder/studium/blob/main/src/Domain/TaskContract.cs): `src/Domain/TaskContract.cs`
- [Submission contract](https://github.com/owlcoder/studium/blob/main/src/Domain/SubmissionContract.cs): `src/Domain/SubmissionContract.cs`
- [Submission status](https://github.com/owlcoder/studium/blob/main/src/Domain/SubmissionStatus.cs): `src/Domain/SubmissionStatus.cs`

### Infrastructure adapters

- [Demo data factory](https://github.com/owlcoder/studium/blob/main/src/Infrastructure/Demo/DemoData.cs): `src/Infrastructure/Demo/DemoData.cs`
- [In-memory reader](https://github.com/owlcoder/studium/blob/main/src/Infrastructure/Courses/InMemoryCourseReader.cs): `src/Infrastructure/Courses/InMemoryCourseReader.cs`
- [Mock overview service](https://github.com/owlcoder/studium/blob/main/src/Infrastructure/MockSubmissionOverviewService.cs): `src/Infrastructure/MockSubmissionOverviewService.cs`

### Other components

- **User**

## Connections

- User → HTTP API: sends request (evidence: `README.md`)
- User → Console UI: runs demo (evidence: `README.md`)
- HTTP API → Course listing: calls listing (evidence: `src/Api/Program.cs`)
- HTTP API → Course search: calls search (evidence: `src/Api/Program.cs`)
- HTTP API → Demo data factory: configures reader (evidence: `src/Api/Program.cs`)
- Console UI → Course listing: calls listing (evidence: `src/ConsoleUi/Program.cs`)
- Console UI → Demo data factory: creates reader (evidence: `src/ConsoleUi/Program.cs`)
- Course listing → Course reader port: reads courses (evidence: `src/Application/Courses/ListCoursesHandler.cs`)
- Course search → Course reader port: reads courses (evidence: `src/Application/Courses/SearchCoursesHandler.cs`)
- Course listing → Course list result: projects results (evidence: `src/Application/Courses/ListCoursesHandler.cs`)
- Course search → Search result: projects results (evidence: `src/Application/Courses/SearchCoursesHandler.cs`)
- Course creation → Course repository port: checks and saves (evidence: `src/Application/Courses/CreateCourseHandler.cs`)
- Course creation → Create command: reads command (evidence: `src/Application/Courses/CreateCourseHandler.cs`)
- Course creation → Course entity: creates entity (evidence: `src/Application/Courses/CreateCourseHandler.cs`)
- Course reader port → Course entity: returns courses (evidence: `src/Application/Courses/ICourseReader.cs`)
- In-memory reader → Course reader port: implements (evidence: `src/Infrastructure/Courses/InMemoryCourseReader.cs`)
- In-memory reader → Course entity: reads entities (evidence: `src/Infrastructure/Courses/InMemoryCourseReader.cs`)
- Mock overview service → Overview service port: implements (evidence: `src/Infrastructure/MockSubmissionOverviewService.cs`)
- Mock overview service → Submission contract: reads submissions (evidence: `src/Infrastructure/MockSubmissionOverviewService.cs`)
- Mock overview service → Member contract: reads members (evidence: `src/Infrastructure/MockSubmissionOverviewService.cs`)
- Mock overview service → Task contract: reads tasks (evidence: `src/Infrastructure/MockSubmissionOverviewService.cs`)
- Mock overview service → Overview results: builds overviews (evidence: `src/Infrastructure/MockSubmissionOverviewService.cs`)
- Overview service port → Overview results: returns results (evidence: `src/Application/ISubmissionOverviewService.cs`)
- Overview results → Submission status: uses status (evidence: `src/Application/SubmissionOverviewDto.cs`)
- Submission contract → Submission status: uses status (evidence: `src/Domain/SubmissionContract.cs`)
