52 lines
1.9 KiB
Markdown
52 lines
1.9 KiB
Markdown
# AI_CONTEXT.md
|
|
|
|
This repository is a Blazor sample that demonstrates a real-world “browser UI calls server API” architecture with PostgreSQL.
|
|
|
|
## Solution layout
|
|
- `Freman.Sample.Web` (Server / Host)
|
|
- ASP.NET Core host
|
|
- EF Core + PostgreSQL
|
|
- Minimal API endpoints under `/api/*`
|
|
- Applies migrations automatically in Development
|
|
- `Freman.Sample.Web.Client` (Client / Browser)
|
|
- Blazor WebAssembly UI
|
|
- Uses `HttpClient` to call server endpoints
|
|
- `/notes` page is WASM interactive with `prerender: false`
|
|
- Reusable UI components live under `Client/Components` (e.g., `ConfirmModal.razor`)
|
|
- `Freman.Sample.Web.Contracts` (Shared)
|
|
- DTOs + request models shared between server and client
|
|
- Examples: `NoteDto`, `CreateNoteRequest`
|
|
|
|
## Run modes (important)
|
|
This solution uses mixed render modes.
|
|
|
|
- Client pages that inject `HttpClient` should run in the browser:
|
|
- `@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))`
|
|
- Server-only pages can use:
|
|
- `@rendermode InteractiveServer`
|
|
|
|
Why `prerender: false`?
|
|
- Without it, the component may be instantiated on the server during prerender, where client-only DI services (like the WASM `HttpClient`) are not available.
|
|
|
|
## How to run (happy path)
|
|
- Create `.env` next to `compose.yaml`:
|
|
- `POSTGRES_PASSWORD=...`
|
|
- Run:
|
|
- `docker compose up --build`
|
|
- Navigate to:
|
|
- `/notes`
|
|
|
|
## API
|
|
- `GET /api/notes`
|
|
- `POST /api/notes`
|
|
- `DELETE /api/notes/{id}`
|
|
|
|
## Data access
|
|
- EF Core DbContext: `AppDbContext` (server)
|
|
- Entities are server-only (do not share with Client)
|
|
- Contracts are shared via `Freman.Sample.Web.Contracts`
|
|
|
|
## Conventions
|
|
- Server endpoints live in `Freman.Sample.Web/Endpoints/*` and are mapped from `Program.cs`
|
|
- Prefer small, feature-scoped endpoint files (e.g., `NotesEndpoints.cs`)
|
|
- Avoid duplicating DTOs in Client; use `Freman.Sample.Web.Contracts` instead |