# project-studying-dotnet/streetcode-server-august-2026 architecture

> Architecture diagram of the GitHub repository project-studying-dotnet/streetcode-server-august-2026, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/project-studying-dotnet/streetcode-server-august-2026
- Repository: https://github.com/project-studying-dotnet/streetcode-server-august-2026

## Overview

Streetcode is an ASP.NET Core backend for a platform presenting Ukrainian history through place-based articles (“Streetcodes”), with APIs for browsing and maintaining content. The main web workflow is an HTTP request routed through a controller and MediatR to a feature handler, which reads or changes domain data and returns a result. Separate Identity and Email services provide authentication and asynchronous email delivery. The sampled handlers establish some repository and blob-storage calls; other feature branches are represented from the tree, so their internal wiring is not asserted.

Main entry points: [`Streetcode/Streetcode.BLL/MediatR/Streetcode`](https://github.com/project-studying-dotnet/streetcode-server-august-2026/tree/dev/Streetcode/Streetcode.BLL/MediatR/Streetcode) (Streetcode handlers), [`Streetcode/Streetcode.WebApi/Controllers/Streetcode/StreetcodeController.cs`](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.WebApi/Controllers/Streetcode/StreetcodeController.cs) (Streetcode endpoints), [`Streetcode.Identity/src/Streetcode.Identity.Application/Features`](https://github.com/project-studying-dotnet/streetcode-server-august-2026/tree/dev/Streetcode.Identity/src/Streetcode.Identity.Application/Features) (Auth and registration), [`Streetcode.Email/src/Streetcode.Email.Application/EmailRequests/RequestEmailDeliveryCommandHandler.cs`](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Application/EmailRequests/RequestEmailDeliveryCommandHandler.cs) (Request delivery)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_content["History content"]
  node_contenthandlers["Streetcode handlers<br/>[Streetcode]"]
  node_contentdto["Content DTOs<br/>[Streetcode]"]
  node_sources["Sources and citations<br/>[Sources]"]
  node_media["Media features<br/>[Media]"]
  node_text["Text parsing"]
  node_team["Team listings"]
end

subgraph group_core["Streetcode API"]
  node_webapi["Web API<br/>[Program.cs]"]
  node_streetcodecontroller["Streetcode endpoints"]
  node_basecontroller["Result mapping"]
  node_feedback["Feedback email request"]
end

subgraph group_identity["Identity service"]
  node_authapi["Identity API<br/>[AuthController.cs]"]
  node_authfeatures["Auth and registration<br/>[Features]"]
  node_identityservice["Identity operations<br/>[IdentityService.cs]"]
  node_tokens["Refresh tokens"]
  node_outbox["Event outbox<br/>[OutboxPublisher.cs]"]
end

subgraph group_email["Email delivery"]
  node_emailconsumer["Email request consumer"]
  node_emailrequest["Request delivery"]
  node_delivery["Delivery domain<br/>[EmailDelivery.cs]"]
  node_emaildb[("Email database<br/>[EmailDbContext.cs]")]
  node_scheduler["Job scheduler"]
  node_sendjob["Send delivery job"]
  node_sender["SMTP sender"]
end

subgraph group_storage["Persistence and integrations"]
  node_repository["Content repositories"]
  node_sql[("SQL Server")]
  node_blob["Blob storage<br/>[IBlobService.cs]"]
  node_identitydb[("Identity database")]
  node_kafka["Kafka"]
  node_smtp["SMTP service"]
end

node_visitor(("API caller"))
node_authcaller(("Authentication client"))

node_visitor -->|"sends HTTP"| node_webapi
node_webapi -->|"routes requests"| node_streetcodecontroller
node_streetcodecontroller -->|"sends queries"| node_contenthandlers
node_streetcodecontroller -->|"maps results"| node_basecontroller
node_contenthandlers -->|"reads or writes"| node_repository
node_repository -->|"queries data"| node_sql
node_contenthandlers -->|"returns content"| node_contentdto
node_contenthandlers -.->|"loads media"| node_blob
node_contenthandlers -->|"serves sources"| node_sources
node_contenthandlers -->|"serves media"| node_media
node_contenthandlers -->|"parses text"| node_text
node_contenthandlers -->|"lists team"| node_team
node_authcaller -->|"sends requests"| node_authapi
node_authapi -->|"dispatches commands"| node_authfeatures
node_authfeatures -->|"uses identity"| node_identityservice
node_authfeatures -->|"manages sessions"| node_tokens
node_identityservice -->|"persists identity"| node_identitydb
node_tokens -->|"stores tokens"| node_identitydb
node_outbox -->|"publishes events"| node_kafka
node_feedback -.->|"publishes request"| node_kafka
node_kafka -->|"delivers event"| node_emailconsumer
node_emailconsumer -->|"requests delivery"| node_emailrequest
node_emailrequest -->|"stores delivery"| node_emaildb
node_emailrequest -->|"schedules job"| node_scheduler
node_scheduler -->|"dispatches job"| node_sendjob
node_sendjob -->|"sends email"| node_sender
node_sender -->|"submits message"| node_smtp

click node_webapi "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.WebApi/Program.cs"
click node_streetcodecontroller "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.WebApi/Controllers/Streetcode/StreetcodeController.cs"
click node_basecontroller "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.WebApi/Controllers/BaseApiController.cs"
click node_contenthandlers "https://github.com/project-studying-dotnet/streetcode-server-august-2026/tree/dev/Streetcode/Streetcode.BLL/MediatR/Streetcode"
click node_contentdto "https://github.com/project-studying-dotnet/streetcode-server-august-2026/tree/dev/Streetcode/Streetcode.BLL/DTO/Streetcode"
click node_sources "https://github.com/project-studying-dotnet/streetcode-server-august-2026/tree/dev/Streetcode/Streetcode.BLL/MediatR/Sources"
click node_media "https://github.com/project-studying-dotnet/streetcode-server-august-2026/tree/dev/Streetcode/Streetcode.BLL/MediatR/Media"
click node_text "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.BLL/MediatR/Streetcode/Text/GetParsed/GetParsedTextAdminPreviewHandler.cs"
click node_team "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.BLL/MediatR/Team/GetAllMain/GetAllMainTeamHandler.cs"
click node_feedback "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.BLL/MediatR/Email/SendEmailHandler.cs"
click node_blob "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.BLL/Interfaces/BlobStorage/IBlobService.cs"
click node_authapi "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Identity/src/Streetcode.Identity.WebApi/Controllers/AuthController.cs"
click node_authfeatures "https://github.com/project-studying-dotnet/streetcode-server-august-2026/tree/dev/Streetcode.Identity/src/Streetcode.Identity.Application/Features"
click node_identityservice "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Identity/src/Streetcode.Identity.Infrastructure/Identity/IdentityService.cs"
click node_tokens "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Identity/src/Streetcode.Identity.Infrastructure/Security/RefreshTokenService.cs"
click node_identitydb "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Identity/src/Streetcode.Identity.Infrastructure/Persistence/StreetcodeIdentityDbContext.cs"
click node_outbox "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Identity/src/Streetcode.Identity.Infrastructure/Persistence/Outbox/OutboxPublisher.cs"
click node_emailconsumer "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Infrastructure/Kafka/EmailRequestedConsumer.cs"
click node_emailrequest "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Application/EmailRequests/RequestEmailDeliveryCommandHandler.cs"
click node_delivery "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Domain/EmailDeliveries/EmailDelivery.cs"
click node_emaildb "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Infrastructure/Persistence/EmailDbContext.cs"
click node_scheduler "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Infrastructure/BackgroundJobs/HangfireEmailJobScheduler.cs"
click node_sendjob "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Infrastructure/BackgroundJobs/SendEmailDeliveryJob.cs"
click node_sender "https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Infrastructure/EmailSending/MailKitEmailDeliverySender.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_contenthandlers,node_contentdto,node_sources,node_media,node_text,node_team,node_authcaller toneBlue
class node_webapi,node_streetcodecontroller,node_basecontroller,node_feedback toneAmber
class node_authapi,node_authfeatures,node_identityservice,node_tokens,node_outbox,node_visitor toneMint
class node_emailconsumer,node_emailrequest,node_delivery,node_emaildb,node_scheduler,node_sendjob,node_sender toneRose
class node_repository,node_sql,node_blob,node_identitydb,node_kafka,node_smtp toneIndigo
```

## Components

### History content

- [Streetcode handlers](https://github.com/project-studying-dotnet/streetcode-server-august-2026/tree/dev/Streetcode/Streetcode.BLL/MediatR/Streetcode): `Streetcode/Streetcode.BLL/MediatR/Streetcode`
- [Content DTOs](https://github.com/project-studying-dotnet/streetcode-server-august-2026/tree/dev/Streetcode/Streetcode.BLL/DTO/Streetcode): `Streetcode/Streetcode.BLL/DTO/Streetcode`
- [Sources and citations](https://github.com/project-studying-dotnet/streetcode-server-august-2026/tree/dev/Streetcode/Streetcode.BLL/MediatR/Sources): `Streetcode/Streetcode.BLL/MediatR/Sources`
- [Media features](https://github.com/project-studying-dotnet/streetcode-server-august-2026/tree/dev/Streetcode/Streetcode.BLL/MediatR/Media): `Streetcode/Streetcode.BLL/MediatR/Media`
- [Text parsing](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.BLL/MediatR/Streetcode/Text/GetParsed/GetParsedTextAdminPreviewHandler.cs): `Streetcode/Streetcode.BLL/MediatR/Streetcode/Text/GetParsed/GetParsedTextAdminPreviewHandler.cs`
- [Team listings](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.BLL/MediatR/Team/GetAllMain/GetAllMainTeamHandler.cs): `Streetcode/Streetcode.BLL/MediatR/Team/GetAllMain/GetAllMainTeamHandler.cs`

### Streetcode API

- [Web API](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.WebApi/Program.cs): `Streetcode/Streetcode.WebApi/Program.cs`
- [Streetcode endpoints](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.WebApi/Controllers/Streetcode/StreetcodeController.cs): `Streetcode/Streetcode.WebApi/Controllers/Streetcode/StreetcodeController.cs`
- [Result mapping](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.WebApi/Controllers/BaseApiController.cs): `Streetcode/Streetcode.WebApi/Controllers/BaseApiController.cs`
- [Feedback email request](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.BLL/MediatR/Email/SendEmailHandler.cs): `Streetcode/Streetcode.BLL/MediatR/Email/SendEmailHandler.cs`

### Identity service

- [Identity API](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Identity/src/Streetcode.Identity.WebApi/Controllers/AuthController.cs): `Streetcode.Identity/src/Streetcode.Identity.WebApi/Controllers/AuthController.cs`
- [Auth and registration](https://github.com/project-studying-dotnet/streetcode-server-august-2026/tree/dev/Streetcode.Identity/src/Streetcode.Identity.Application/Features): `Streetcode.Identity/src/Streetcode.Identity.Application/Features`
- [Identity operations](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Identity/src/Streetcode.Identity.Infrastructure/Identity/IdentityService.cs): `Streetcode.Identity/src/Streetcode.Identity.Infrastructure/Identity/IdentityService.cs`
- [Refresh tokens](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Identity/src/Streetcode.Identity.Infrastructure/Security/RefreshTokenService.cs): `Streetcode.Identity/src/Streetcode.Identity.Infrastructure/Security/RefreshTokenService.cs`
- [Event outbox](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Identity/src/Streetcode.Identity.Infrastructure/Persistence/Outbox/OutboxPublisher.cs): `Streetcode.Identity/src/Streetcode.Identity.Infrastructure/Persistence/Outbox/OutboxPublisher.cs`

### Email delivery

- [Email request consumer](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Infrastructure/Kafka/EmailRequestedConsumer.cs): `Streetcode.Email/src/Streetcode.Email.Infrastructure/Kafka/EmailRequestedConsumer.cs`
- [Request delivery](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Application/EmailRequests/RequestEmailDeliveryCommandHandler.cs): `Streetcode.Email/src/Streetcode.Email.Application/EmailRequests/RequestEmailDeliveryCommandHandler.cs`
- [Delivery domain](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Domain/EmailDeliveries/EmailDelivery.cs): `Streetcode.Email/src/Streetcode.Email.Domain/EmailDeliveries/EmailDelivery.cs`
- [Email database](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Infrastructure/Persistence/EmailDbContext.cs): `Streetcode.Email/src/Streetcode.Email.Infrastructure/Persistence/EmailDbContext.cs`
- [Job scheduler](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Infrastructure/BackgroundJobs/HangfireEmailJobScheduler.cs): `Streetcode.Email/src/Streetcode.Email.Infrastructure/BackgroundJobs/HangfireEmailJobScheduler.cs`
- [Send delivery job](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Infrastructure/BackgroundJobs/SendEmailDeliveryJob.cs): `Streetcode.Email/src/Streetcode.Email.Infrastructure/BackgroundJobs/SendEmailDeliveryJob.cs`
- [SMTP sender](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Email/src/Streetcode.Email.Infrastructure/EmailSending/MailKitEmailDeliverySender.cs): `Streetcode.Email/src/Streetcode.Email.Infrastructure/EmailSending/MailKitEmailDeliverySender.cs`

### Persistence and integrations

- **Content repositories**
- **SQL Server**
- [Blob storage](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode/Streetcode.BLL/Interfaces/BlobStorage/IBlobService.cs): `Streetcode/Streetcode.BLL/Interfaces/BlobStorage/IBlobService.cs`
- [Identity database](https://github.com/project-studying-dotnet/streetcode-server-august-2026/blob/dev/Streetcode.Identity/src/Streetcode.Identity.Infrastructure/Persistence/StreetcodeIdentityDbContext.cs): `Streetcode.Identity/src/Streetcode.Identity.Infrastructure/Persistence/StreetcodeIdentityDbContext.cs`
- **Kafka**
- **SMTP service**

### Other components

- **API caller**
- **Authentication client**

## Connections

- API caller → Web API: sends HTTP
- Web API → Streetcode endpoints: routes requests
- Streetcode endpoints → Streetcode handlers: sends queries
- Streetcode endpoints → Result mapping: maps results
- Streetcode handlers → Content repositories: reads or writes
- Content repositories → SQL Server: queries data
- Streetcode handlers → Content DTOs: returns content
- Streetcode handlers → Blob storage: loads media
- Streetcode handlers → Sources and citations: serves sources
- Streetcode handlers → Media features: serves media
- Streetcode handlers → Text parsing: parses text
- Streetcode handlers → Team listings: lists team
- Authentication client → Identity API: sends requests
- Identity API → Auth and registration: dispatches commands
- Auth and registration → Identity operations: uses identity
- Auth and registration → Refresh tokens: manages sessions
- Identity operations → Identity database: persists identity
- Refresh tokens → Identity database: stores tokens
- Event outbox → Kafka: publishes events
- Feedback email request → Kafka: publishes request
- Kafka → Email request consumer: delivers event
- Email request consumer → Request delivery: requests delivery
- Request delivery → Email database: stores delivery
- Request delivery → Job scheduler: schedules job
- Job scheduler → Send delivery job: dispatches job
- Send delivery job → SMTP sender: sends email
- SMTP sender → SMTP service: submits message
