65 Commits

Author SHA1 Message Date
Aaron Po
58e476afdb Add user and brewery address tables 2026-07-13 19:59:18 -04:00
Aaron Po
d52dba904c Pipeline: rename Location to City, wire postal code into breweries 2026-07-13 02:30:09 -04:00
Aaron Po
fbcf438381 Fix mock-only builds (#231) 2026-07-03 02:47:54 -04:00
2b8a900d12 Pipeline: Add LLM and mocked user generation to the pipeline (#230) 2026-07-01 07:47:24 -04:00
Aaron Po
880f73e004 update pipeline docs 2026-06-21 21:58:03 -04:00
Aaron Po
3711591db1 commit csharpier config update 2026-06-20 15:54:53 -04:00
Aaron Po
194509f9c9 update mailkit 2026-06-20 15:54:53 -04:00
Aaron Po
67d6350425 Format ./web/backend/Shared/Shared.Contracts 2026-06-20 15:54:53 -04:00
Aaron Po
cee2917556 Format ./web/backend/Shared/Shared.Application 2026-06-20 15:54:53 -04:00
Aaron Po
6f8e5dc722 Format ./web/backend/API/API.Specs 2026-06-20 15:54:53 -04:00
Aaron Po
db3ed3581d Format ./web/backend/API/API.Core 2026-06-20 15:54:53 -04:00
Aaron Po
b54f70ccbe Format ./web/backend/Domain/Domain.Exceptions 2026-06-20 15:54:53 -04:00
Aaron Po
d4734ae9e7 Format ./web/backend/Domain/Domain.Entities 2026-06-20 15:54:53 -04:00
Aaron Po
27f28d5207 Format ./web/backend/Database/Database.Seed 2026-06-20 15:54:53 -04:00
Aaron Po
bf0d29fa54 Format ./web/backend/Database/Database.Migrations 2026-06-20 15:54:53 -04:00
Aaron Po
4772f59a68 Format ./web/backend/Infrastructure/Infrastructure.Sql 2026-06-20 15:54:53 -04:00
Aaron Po
2e5d4923c0 Format ./web/backend/Infrastructure/Infrastructure.PasswordHashing 2026-06-20 15:54:53 -04:00
Aaron Po
62766b7638 Format ./web/backend/Infrastructure/Infrastructure.Jwt 2026-06-20 15:54:53 -04:00
Aaron Po
744d4c7f8c Format ./web/backend/Infrastructure/Infrastructure.Email.Templates 2026-06-20 15:54:53 -04:00
Aaron Po
2f28ac9350 Format ./web/backend/Infrastructure/Infrastructure.Email 2026-06-20 15:54:53 -04:00
Aaron Po
c8bddae817 Format ./web/backend/Features/Features.UserManagement.Tests 2026-06-20 15:54:53 -04:00
Aaron Po
b298bd02d3 Format ./web/backend/Features/Features.UserManagement 2026-06-20 15:54:53 -04:00
Aaron Po
e2e5eb89e3 Format ./web/backend/Features/Features.Emails.Tests 2026-06-20 15:54:53 -04:00
Aaron Po
3dd44fca5a Format ./web/backend/Features/Features.Emails 2026-06-20 15:54:53 -04:00
Aaron Po
0c55d6c83f Format ./web/backend/Features/Features.Breweries.Tests 2026-06-20 15:54:53 -04:00
Aaron Po
58cbc5b5ba Format ./web/backend/Features/Features.Breweries 2026-06-20 15:54:53 -04:00
Aaron Po
5bef24696b Format ./web/backend/Features/Features.Auth.Tests 2026-06-20 15:54:53 -04:00
Aaron Po
79ae18b3e2 Format ./web/backend/Features/Features.Auth 2026-06-20 15:54:53 -04:00
Aaron Po
254431928f code style cleanup 2026-06-20 15:54:53 -04:00
Aaron Po
07aedcb866 Update documentation to reflect new architecture and previous refactors 2026-06-20 15:54:53 -04:00
Aaron Po
fd341e332c Migrate Auth and Emails to vertical slices (Features.Auth, Features.Emails)
Auth and Emails land together since Auth's registration/resend flows need
Emails to exist first. Service.Auth's four services (Register, Login,
Confirmation, Token) collapse into MediatR commands/queries in
Features.Auth; TokenService stays as a slice-internal service since
multiple handlers call it. Auth no longer references Emails directly —
it sends SendRegistrationEmailCommand/SendResendConfirmationEmailCommand
(defined in Shared.Application) which Features.Emails handles, so neither
slice has a project reference on the other.

Service.Emails' IEmailService becomes Features.Emails' IEmailDispatcher,
simplified to take (firstName, email, token) instead of a full UserAccount
since that's all it ever used. API.Specs' TestApiFactory/MockEmailService
are updated to swap in the relocated interface.

Also deletes Infrastructure.Repository now that Breweries, UserManagement,
and Auth have all moved their repos out of it, and replaces the two
now-dead docker-compose test services (repository.tests, service.auth.tests,
both pointing at deleted Dockerfiles) with a single unit.tests service that
runs every Features.*.Tests project via Dockerfile.tests.
2026-06-20 15:54:53 -04:00
Aaron Po
5cf4df1fd8 Migrate UserManagement to a vertical slice (Features.UserManagement)
Same pattern as the Breweries migration: Service.UserManagement and the
UserAccount repository fold into Features.UserManagement, with MediatR
queries replacing UserService. UpdateUserCommand/Handler carry forward
IUserService.UpdateAsync as-is (it has no HTTP route today, and adding one
is a separate decision from this migration). Adds handler/repository test
coverage that didn't exist before, since Service.UserManagement had no
test project.
2026-06-20 15:54:53 -04:00
Aaron Po
34ba7e8271 Migrate Breweries to a vertical slice (Features.Breweries)
Moves brewery CRUD from the Service.Breweries/Infrastructure.Repository
layered split into a single Features.Breweries project: MediatR
commands/queries replace BreweryService, and the repository moves in
alongside its own controller. Extracts Infrastructure.Sql out of
Infrastructure.Repository (just the generic ADO.NET connection/base-repo
plumbing) since Breweries no longer needs the rest of that project, while
Auth and UserAccount repos still do until their own migration.

Also fixes the API.Core and Infrastructure.Repository.Tests Dockerfiles,
which were restoring against COPY destinations that didn't match the
projects' actual relative paths (silently working only because of the
COPY . . that followed); both now restore against Core.slnx with correctly
nested paths, verified with a real docker build.
2026-06-20 15:54:53 -04:00
Aaron Po
60a7b790d4 Scaffold vertical-slice migration: Shared.Contracts, Shared.Application, MediatR
Begins the move to vertical-slice architecture. ResponseBody moves out of
API.Core into Shared.Contracts so slices won't have to depend on the API
host project for it. Shared.Application adds the MediatR pipeline's
ValidationBehavior plus the cross-slice email commands that Features.Auth
will send and Features.Emails will handle, keeping slices decoupled from
each other.
2026-06-20 15:54:53 -04:00
Aaron Po
4554fff534 add tests 2026-06-20 15:54:53 -04:00
Aaron Po
86a0c50f6e finish brewery feature set 2026-06-20 15:54:53 -04:00
Aaron Po
3034020d56 add xmldoc comments 2026-06-20 15:54:53 -04:00
6a66619c70 Add multithreaded logging infrastructure for preparation for future designs (#225)
* Update class diagrams

* Implement BoundedChannel and multithreaded logging infra

* Integrate logging channel system

* Update string concatenations to use std::format

* Add pretty print log
2026-05-22 22:00:38 -04:00
2ee7b3d2a2 Add timeout to wikipedia enrichment to avoid breaking rate limits, add mock enrichment (#224)
* Add timeout for enrichment, refactor json deserialization

* Add location count to application options and as a cli arg

* Add mock enrichment process
2026-05-14 19:15:51 -04:00
b7c0b1c8d4 Fix mistake in .gitattributes
archive/* is incorrect as it will ignore sub-dirs
2026-05-12 01:05:07 -04:00
b8ebe03921 Pipeline: Add Runpod docker configuration (#222)
* Begin work on Runpod docker config

* Reduce docker image size

* Create .dockerignore
2026-05-12 00:44:09 -04:00
26635ace84 Organize and consolidate header files (#220) 2026-05-03 21:44:37 -04:00
031be8ad5d Pipeline: Remove CURL as a dependency, add new HTTP module (#219)
Rationale: 

HTTP is a supporting concern in the pipeline, used only for Wikipedia enrichment calls. libcurl's C API required significant boilerplate to wrap safely. cpp-httplib is a header-only library that covers the same functionality with far less overhead and no manual resource management.
2026-05-03 13:35:58 -04:00
f316fabcb0 Update CMakeLists.txt (#218) 2026-05-02 19:27:44 -04:00
b1dc8e0b5d refactor(pipeline): restructure config, add PromptDirectory, consolidate SQLite layer (#217)
* Refactor ApplicationOptions to separate config concerns

* add prompt dir app option

* readability updates: remove magic numbers, update comments

* codebase formatting

* Update docs

* Extract argument parsing, timer out of
2026-05-02 18:27:14 -04:00
641a479b6a Refactor SQLite Export Service and ProcessRecord Method Signatures (#216)
* Helper cleanup

update bind to use dto for params
consolidate translation units


* Update planned class diagram
2026-04-30 19:03:45 -04:00
d80e15b55e Add docs symlink to top level docs/pipeline (#214) 2026-04-30 18:35:46 -04:00
Aaron Po
1fcaf6e174 misc deletions 2026-04-27 18:47:39 -04:00
Aaron Po
ef97bf0a75 remove misc directory 2026-04-27 18:47:39 -04:00
Aaron Po
4c8a8e43ed update readmes 2026-04-27 18:47:39 -04:00
Aaron Po
8db6992296 move diagrams and documentation 2026-04-27 18:47:39 -04:00
Aaron Po
7925fc6caf Format all markdown files in active directories 2026-04-27 18:47:39 -04:00
Aaron Po
b1f4ff2641 remove legacy doc 2026-04-27 18:47:39 -04:00
Aaron Po
a852beff21 add git attributes to ignore archive dir 2026-04-27 18:47:39 -04:00
Aaron Po
e17afe909f move docker compose files 2026-04-27 18:47:39 -04:00
Aaron Po
9ed37806dd Move pipeline directory 2026-04-27 18:47:39 -04:00
Aaron Po
5a21589029 Move website directory 2026-04-27 18:47:39 -04:00
Aaron Po
189bce040b Move dotnet api into new directory 2026-04-27 18:47:39 -04:00
e8c5b8a80c Add future plans, new design, and ethics document updates to Pipeline (#212) 2026-04-27 15:41:28 -04:00
Aaron Po
d47e3ed7f0 Move next js project to archive (#207) 2026-04-20 02:30:25 -04:00
Aaron Po
92ec16ce93 Feat/add sqllite to cpp pipeline (#206) 2026-04-20 01:59:52 -04:00
Aaron Po
c2db65d9b1 Add brewery stored procedures, repository and service (#204)
* Add create brewery to brewery repository

* Implement brewery repo, SQL procs and tests

* Implement CRUD operations for Brewery, including service and repository layers

* Test updates

* DTO updates
2026-04-20 00:15:39 -04:00
Aaron Po
1f008f1237 Add formatting script for c++ (#203) 2026-04-19 15:46:30 -04:00
Aaron Po
898cc8971b Create biergarten brewery pipeline project (#199) 2026-04-18 19:19:14 -04:00
Aaron Po
fd3c172e35 Schema updates (#191) 2026-03-28 20:35:50 -04:00
876 changed files with 84433 additions and 185348 deletions

View File

@@ -1,13 +0,0 @@
{
"version": 1,
"isRoot": true,
"tools": {
"csharpier": {
"version": "1.2.1",
"commands": [
"csharpier"
],
"rollForward": false
}
}
}

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
archive/** linguist-vendored

View File

@@ -7,6 +7,7 @@ assignees: []
--- ---
## User Story ## User Story
**As a** (who wants to accomplish something) **As a** (who wants to accomplish something)
**I want to** (what they want to accomplish) **I want to** (what they want to accomplish)
**So that** (why they want to accomplish that thing) **So that** (why they want to accomplish that thing)
@@ -15,29 +16,18 @@ assignees: []
### Scenario 1 ### Scenario 1
Given ... When ... Then ...
Given ...
When ...
Then ...
### Scenario 2 ### Scenario 2
Given ... When ... Then ...
Given ...
When ...
Then ...
### Scenario 3 ### Scenario 3
Given ... When ... Then ...
Given ...
When ...
Then ...
## Subtasks ## Subtasks
- [ ] Task 1 - [ ] Task 1
- [ ] Task 2 - [ ] Task 2
- [ ] Task 3 - [ ] Task 3

File diff suppressed because it is too large Load Diff

162
README.md
View File

@@ -1,40 +1,56 @@
# The Biergarten App # The Biergarten App
The Biergarten App is a multi-project monorepo with a .NET backend and an active React The Biergarten App is a full-stack directory and discovery platform for
Router frontend in `src/Website`. The current website focuses on account flows, theme breweries. It features a robust user authentication system, a searchable
switching, shared UI components, Storybook coverage, and integration with the API. database of brewery locations, and a custom offline data-generation pipeline
that uses LLMs (Llama.cpp) and Wikipedia to synthesize realistic seed data.
## Documentation It features:
- [Getting Started](docs/getting-started.md) - Local setup for backend and active website - A .NET backend (Web API + database migrations/seed) under `web/backend/`
- [Architecture](docs/architecture.md) - Current backend and frontend architecture - A server-rendered React website (React Router + Vite) under `web/frontend/`
- [Docker Guide](docs/docker.md) - Container-based backend development and testing - A C++20 “pipeline” CLI for generating seed data under `tooling/pipeline/`
- [Testing](docs/testing.md) - Backend and frontend test commands
- [Environment Variables](docs/environment-variables.md) - Active configuration reference Specialized documentation (setup, architecture, docker, testing, diagrams, and
- [Token Validation](docs/token-validation.md) - JWT validation architecture pipeline notes) lives under `docs/`.
- [Legacy Website Archive](docs/archive/legacy-website-v1.md) - Archived notes for the old Next.js frontend
## Documentation (Start Here)
Website + backend (active stack):
- [Getting Started](docs/website/getting-started.md)
- [Architecture](docs/architecture.md)
- [Docker Guide](docs/website/docker.md)
- [Testing](docs/website/testing.md)
- [Environment Variables](docs/website/environment-variables.md)
- [Token Validation](docs/website/token-validation.md)
Data generation pipeline (C++):
- [Pipeline README](docs/pipeline/README.md)
- [Ethics & Known Issues](docs/pipeline/ETHICS-AND-KNOWN-ISSUES.md)
## Diagrams ## Diagrams
- [Architecture](docs/diagrams-out/architecture.svg) - Layered architecture - [Architecture](docs/website/diagrams-out/architecture.svg)
- [Deployment](docs/diagrams-out/deployment.svg) - Docker topology - [Deployment](docs/website/diagrams-out/deployment.svg)
- [Authentication Flow](docs/diagrams-out/authentication-flow.svg) - Auth sequence - [Authentication Flow](docs/website/diagrams-out/authentication-flow.svg)
- [Database Schema](docs/diagrams-out/database-schema.svg) - Entity relationships - [Database Schema](docs/website/diagrams-out/database-schema.svg)
## Current Status ## Current Status
Active areas in the repository: Active areas in the repository:
- .NET 10 backend with layered architecture and SQL Server - .NET 10 backend (vertical-slice architecture with MediatR) + SQL Server
- React Router 7 website in `src/Website` - React 19 website (React Router 7 + Vite)
- Shared Biergarten theme system with a theme guide route - Shared Biergarten theme system + Storybook coverage
- Storybook stories and browser-based checks for shared UI - Auth flows and account/email integration (local Mailpit in dev compose)
- Auth demo flows for home, login, register, dashboard, logout, and confirmation - Data generation pipeline with C++ and Llama.cpp
- Toast-based feedback for auth outcomes
Legacy area retained for reference: Archived/reference areas:
- `src/Website-v1` contains the archived Next.js frontend and is no longer the active website - `archive/next-js-web-app/` contains an older Next.js frontend retained for
reference
## Tech Stack ## Tech Stack
@@ -43,36 +59,43 @@ Legacy area retained for reference:
- **UI Documentation**: Storybook 10, Vitest browser mode, Playwright - **UI Documentation**: Storybook 10, Vitest browser mode, Playwright
- **Testing**: xUnit, Reqnroll (BDD), FluentAssertions, Moq - **Testing**: xUnit, Reqnroll (BDD), FluentAssertions, Moq
- **Infrastructure**: Docker, Docker Compose - **Infrastructure**: Docker, Docker Compose
- **Security**: Argon2id password hashing, JWT access/refresh/confirmation tokens - **Security**: Argon2id password hashing, JWT access/refresh/confirmation
tokens
- **Data Pipeline**: C++20, CMake, Boost, libcurl, SQLite, llama.cpp
## Quick Start ## Quick Start
### Backend For full setup details, use [Getting Started](docs/website/getting-started.md).
This section is the shortest path to a working dev environment.
### Backend (Docker)
```bash ```bash
git clone https://github.com/aaronpo97/the-biergarten-app git clone https://github.com/aaronpo97/the-biergarten-app
cd the-biergarten-app cd the-biergarten-app
cp .env.example .env.dev
docker compose -f docker-compose.dev.yaml up -d cp web/.env.example web/.env.dev
docker compose --env-file web/.env.dev -f web/docker-compose.dev.yaml up --build -d
``` ```
Backend access: Backend access:
- API Swagger: http://localhost:8080/swagger - API Swagger: http://localhost:8080/swagger
- Health Check: http://localhost:8080/health - Health Check: http://localhost:8080/health
- Mailpit UI (dev SMTP): http://localhost:8025
### Frontend ### Frontend (Node)
```bash ```bash
cd src/Website cd web/frontend
npm install npm install
API_BASE_URL=http://localhost:8080 SESSION_SECRET=dev-secret npm run dev API_BASE_URL=http://localhost:8080 SESSION_SECRET=dev-secret-change-me npm run dev
``` ```
Optional frontend tools: Optional frontend tools:
```bash ```bash
cd src/Website cd web/frontend
npm run storybook npm run storybook
npm run test:storybook npm run test:storybook
npm run test:storybook:playwright npm run test:storybook:playwright
@@ -81,62 +104,43 @@ npm run test:storybook:playwright
## Repository Structure ## Repository Structure
```text ```text
src/Core/ Backend projects (.NET) web/
src/Website/ Active React Router frontend backend/ .NET API: API.Core (host), Features.* (vertical slices),
src/Website-v1/ Archived legacy Next.js frontend Shared.*, Domain.*, Infrastructure.*, Database.* projects
docs/ Active project documentation frontend/ React Router website + Storybook + Playwright/Vitest
docs/archive/ Archived legacy documentation
tooling/
pipeline/ C++20 seed-data generation CLI (CMake)
docs/
architecture.md High-level architecture overview
website/ Backend/frontend setup, docker, testing, diagrams
pipeline/ Pipeline docs, ethics notes, PlantUML diagrams
archive/
next-js-web-app/ Older Next.js frontend (reference only)
``` ```
## Key Features
Implemented today:
- User registration and login against the API
- JWT-based auth with access, refresh, and confirmation flows
- SQL Server migrations and seed projects
- Shared form components and auth screens
- Theme switching with Lager, Stout, Cassis, and Weizen variants
- Storybook documentation and automated story interaction tests
- Toast feedback for auth-related outcomes
Planned next:
- Brewery discovery and management
- Beer reviews and ratings
- Social follow relationships
- Geospatial brewery experiences
- Additional frontend routes beyond the auth demo
## Testing ## Testing
Backend suites: Run the backend test stack with Docker:
- `API.Specs` - integration tests
- `Infrastructure.Repository.Tests` - repository unit tests
- `Service.Auth.Tests` - service unit tests
Frontend suites:
- Storybook interaction tests via Vitest
- Storybook browser regression checks via Playwright
Run all backend tests with Docker:
```bash ```bash
docker compose -f docker-compose.test.yaml up --abort-on-container-exit docker compose --env-file web/.env.test -f web/docker-compose.test.yaml up --abort-on-container-exit
``` ```
See [Testing](docs/testing.md) for the full command list. See [Testing](docs/website/testing.md) for the full command list.
## Configuration ## Configuration
Common active variables: Common active variables:
- Backend: `DB_SERVER`, `DB_NAME`, `DB_USER`, `DB_PASSWORD`, `ACCESS_TOKEN_SECRET`, `REFRESH_TOKEN_SECRET`, `CONFIRMATION_TOKEN_SECRET` - Backend/Docker: `DB_SERVER`, `DB_NAME`, `DB_USER`, `DB_PASSWORD`,
- Frontend: `API_BASE_URL`, `SESSION_SECRET`, `NODE_ENV` `ACCESS_TOKEN_SECRET`, `REFRESH_TOKEN_SECRET`, `CONFIRMATION_TOKEN_SECRET`,
`WEBSITE_BASE_URL`
- Frontend runtime: `API_BASE_URL`, `SESSION_SECRET`, `NODE_ENV`
See [Environment Variables](docs/environment-variables.md) for details. See [Environment Variables](docs/website/environment-variables.md) for details.
## Contributing ## Contributing
@@ -145,15 +149,3 @@ See [Environment Variables](docs/environment-variables.md) for details.
3. Commit your changes (`git commit -m 'Add amazing feature'`) 3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`) 4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request 5. Open a Pull Request
### Development Workflow
1. Start development environment: `docker compose -f docker-compose.dev.yaml up -d`
2. Make changes to code
3. Run tests: `docker compose -f docker-compose.test.yaml up --abort-on-container-exit`
4. Rebuild if needed: `docker compose -f docker-compose.dev.yaml up -d --build api.core`
## Support
- **Documentation**: [docs/](docs/)
- **Architecture**: See [Architecture Guide](docs/architecture.md)

View File

Before

Width:  |  Height:  |  Size: 203 KiB

After

Width:  |  Height:  |  Size: 203 KiB

View File

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

Before

Width:  |  Height:  |  Size: 515 B

After

Width:  |  Height:  |  Size: 515 B

View File

Before

Width:  |  Height:  |  Size: 961 B

After

Width:  |  Height:  |  Size: 961 B

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 256 KiB

After

Width:  |  Height:  |  Size: 256 KiB

Some files were not shown because too many files have changed in this diff Show More