145 Commits

Author SHA1 Message Date
Aaron Po
be3c324b38 logging updates 2026-05-18 00:31:13 -04:00
Aaron Po
5d80b53351 Update main.cc 2026-05-17 01:29:32 -04:00
Aaron Po
c58e4c1986 updates 2026-05-15 14:11:34 -04:00
Aaron Po
e6a20324e4 update logging to use logger channel 2026-05-15 01:13:53 -04:00
Aaron Po
a4968eb043 update doxygen comments for concurrent logger 2026-05-14 21:21:28 -04:00
Aaron Po
74f11b57e2 Implement pipeline logging with bounded channels and orchestrator integration 2026-05-14 21:16:29 -04:00
Aaron Po
f93b14897b Add bounded channels 2026-05-14 19:50:08 -04:00
Aaron Po
688c28f85d update class diagram 2026-05-14 19:49:14 -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
Aaron Po
581863d69b Website updates: add new app scaffold, archive legacy site, and refresh docs/tooling (#173) 2026-03-15 22:56:14 -04:00
Aaron Po
9238036042 Add resend confirmation email feature (#166) 2026-03-07 23:03:31 -05:00
Aaron Po
431e11e052 Add WEBSITE_BASE_URL environment variable and update email confirmation link (#165) 2026-03-07 20:11:50 -05:00
Aaron Po
f1194d3da8 Feature: Add token validation, basic confirmation workflow (#164) 2026-03-06 23:23:43 -05:00
Aaron Po
17eb04e20c Update diagrams 2026-02-21 05:04:04 -05:00
Aaron Po
50c2f5dfda Update documentation (#156) 2026-02-21 05:02:22 -05:00
Aaron Po
c5683df4b6 add IEmailService to the DI container (#154) 2026-02-19 22:04:30 -05:00
Aaron Po
2cad88e3f6 Service refactor (#153)
* remove email out of register service

* Update auth service, move JWT handling out of controller

* add docker config for service auth test

* Update mock email system

* Format: ./src/Core/Service

* Refactor authentication payloads and services for registration and login processes

* Format: src/Core/API, src/Core/Service
2026-02-16 15:12:59 -05:00
Aaron Po
0d52c937ce Adding service layer testing (#151) 2026-02-14 21:17:39 -05:00
Aaron Po
6b66f5680f Add user registration emails + email infrastructure (#150)
* Add email functionality

* Add email template project and rendering service

* Update email template dir structure

* Add email header and footer components for user registration template

* update example env

* Refactor email templates namespace and components

* Format email dir
2026-02-13 21:46:19 -05:00
Aaron Po
82f0d26200 Fix ISO country code references in database scripts and seeder (#148) 2026-02-12 23:29:42 -05:00
Aaron Po
7129e5679e Update exception handling (#146) 2026-02-12 21:06:07 -05:00
Aaron Po
584fe6282f Merge pull request #145 from aaronpo97/fix-test-config
fix config
2026-02-12 19:37:59 -05:00
Aaron Po
8c61069b7d fix config 2026-02-12 19:37:20 -05:00
Aaron Po
674f91cbdf Merge pull request #144 from aaronpo97/fix-test-config
Refactor auth/user services
2026-02-12 19:30:40 -05:00
Aaron Po
a54d2a6da0 Merge pull request #143 from aaronpo97/service-refactor
Refactor auth/user services
2026-02-12 19:29:56 -05:00
Aaron Po
954c9c389c Refactor auth/user services 2026-02-12 19:28:48 -05:00
Aaron Po
d942d92db5 Refactor auth/user services 2026-02-12 19:28:40 -05:00
Aaron Po
c80eae694f Merge pull request #142 from aaronpo97/fix-test-config
Fix test namespaces and Dockerfile project paths
2026-02-12 18:39:58 -05:00
Aaron Po
94061c6d84 Fix test namespaces and Dockerfile project paths 2026-02-12 18:37:28 -05:00
Aaron Po
caf13de36e Merge pull request #141 from aaronpo97/refactor/add-infrastructure-project-dir
Refactor/add infrastructure project dir
2026-02-12 18:26:17 -05:00
Aaron Po
2cb8f1d918 Update ISeeder.cs 2026-02-12 18:05:44 -05:00
Aaron Po
f728514a7c Update namespaces 2026-02-12 18:05:35 -05:00
Aaron Po
4f92741b4f Refactor repository structure 2026-02-12 17:14:32 -05:00
Aaron Po
a038a12fca Update root namespaces 2026-02-12 09:54:39 -05:00
Aaron Po
74c5528ea2 Format infrastructure dir 2026-02-12 01:13:59 -05:00
Aaron Po
f48b8452d3 Update tests 2026-02-12 01:13:59 -05:00
Aaron Po
2411841bdc create Infrastructure directory 2026-02-12 00:56:52 -05:00
Aaron Po
215824d4b6 Merge pull request #140 from aaronpo97/remove-domain.validation-project
Refactor domain project structure and remove Domain.Validation project
2026-02-11 21:02:44 -05:00
Aaron Po
99b13e2742 Refactor domain project structure and remove Domain.Validation project 2026-02-11 21:02:16 -05:00
Aaron Po
3a32f326bf Merge pull request #139 from aaronpo97/request-validation
Add request validation and DTOs
2026-02-11 20:01:50 -05:00
Aaron Po
b2cf21399b Update request validation 2026-02-11 19:59:54 -05:00
Aaron Po
109ade474c Add validation and dtos 2026-02-11 17:36:27 -05:00
Aaron Po
07a62a0c99 Merge pull request #138 from aaronpo97/add-domain-project
Add domain project
2026-02-11 13:31:49 -05:00
Aaron Po
31e67ebad8 Update namespace from WebAPI to API.Core 2026-02-11 13:25:22 -05:00
Aaron Po
c74b20079b Add domain project and update references 2026-02-11 00:23:13 -05:00
Aaron Po
2b0f9876bc Merge pull request #136 from aaronpo97/user-registration
User registration
2026-02-10 23:29:19 -05:00
Aaron Po
8a4b833943 Add user registration bdd tests 2026-02-10 23:09:00 -05:00
Aaron Po
656981003b Update service namespace/directory structure 2026-02-09 23:23:41 -05:00
Aaron Po
ff1ce15419 Consolidate auth logic, update password service, and update namespaces 2026-02-08 23:25:31 -05:00
Aaron Po
881a94893f add registration steps 2026-02-08 21:38:27 -05:00
Aaron Po
8abacb5572 Merge pull request #134 from aaronpo97/133-update-env-handling
refactor/update docker compose env configuration
2026-02-08 21:03:13 -05:00
Aaron Po
027e130fcd Add example env 2026-02-08 21:02:07 -05:00
Aaron Po
243931eb6a Refactor database connection handling and update environment variable usage across Docker configurations 2026-02-08 14:57:45 -05:00
Aaron Po
b22e1e5702 Merge branch 'main-2.0' of https://github.com/aaronpo97/the-biergarten-app into main-2.0 2026-02-08 00:07:43 -05:00
Aaron Po
b07cec8c7e Update README.md 2026-02-08 00:07:17 -05:00
Aaron Po
92628290da Merge pull request #132 from aaronpo97/feat/add-database-container-compose
Add database only docker compose file
2026-02-08 00:05:58 -05:00
Aaron Po
ca2d7c453f Add database only docker compose file 2026-02-08 00:04:31 -05:00
Aaron Po
2076935ee2 Merge pull request #131 from aaronpo97/130-feature-docker-configuration-for-testing
130 - Add docker configuration for testing
2026-02-07 23:06:05 -05:00
Aaron Po
5c49611bff Remove unused publish step 2026-02-07 23:03:23 -05:00
Aaron Po
ae6002bbe0 Implement retry logic for database connection in seeding process 2026-02-07 20:21:40 -05:00
Aaron Po
a1ea6391bc Add JWT_SECRET environment variable to Docker configurations and update JwtService to use it 2026-02-07 20:04:19 -05:00
Aaron Po
6d812638ba Add docker run of repository tests 2026-02-07 19:07:55 -05:00
Aaron Po
17bf29700a Add database seeding to dev env 2026-02-07 18:32:50 -05:00
Aaron Po
393e57af7f Merge pull request #128 from aaronpo97/127-api-container-production-db
127: Add docker configuration for a production/development database and an API container
2026-02-07 17:26:24 -05:00
Aaron Po
e0af25f17c Change dir name for migrations, update docker config to seed db 2026-02-07 17:11:39 -05:00
Aaron Po
9bfbed9b92 add docker config 2026-02-03 23:02:16 -05:00
Aaron Po
2ae99d5224 Merge pull request #123 from aaronpo97/116-add-loginauth-token-feature-to-net-api
116: Add login/auth token feature to API
2026-02-01 12:53:32 -05:00
Aaron Po
b994201a18 Merge branch '2.0' into 116-add-loginauth-token-feature-to-net-api 2026-02-01 12:46:15 -05:00
Aaron Po
e4560f8d80 Merge pull request #124 from aaronpo97/delete-workflows
Delete .github/workflows/github-actions-demo.ymlw
2026-02-01 12:42:51 -05:00
Aaron Po
dbd3b6ce0a Delete .github/workflows/github-actions-demo.ymlw 2026-02-01 12:40:40 -05:00
Aaron Po
ee53cc60d8 Edit auth bdd tests 2026-02-01 12:33:24 -05:00
Aaron Po
954e224c34 update tests 2026-01-31 15:41:00 -05:00
Aaron Po
9474fb7811 add tests for login behaviour 2026-01-31 13:54:02 -05:00
Aaron Po
77bb1f6733 auth updates 2026-01-31 11:34:55 -05:00
Aaron Po
1af3d6f987 Merge branch '2.0' into 116-add-loginauth-token-feature-to-net-api 2026-01-29 23:07:53 -05:00
Aaron Po
2332f9f9b5 Merge pull request #122 from aaronpo97/121-database-seed-enhancement
Initiate db drop/recreation in seed application, update broken procs
2026-01-29 23:06:47 -05:00
Aaron Po
0053d84de8 Initiate db drop/recreation in seed application, update broken procs 2026-01-29 23:05:08 -05:00
Aaron Po
754578c84c Merge branch '2.0' into 116-add-loginauth-token-feature-to-net-api 2026-01-29 22:57:39 -05:00
Aaron Po
ca49d19bf7 Merge pull request #120 from aaronpo97/117-feature-reqnroll-setup-for-bdd-testing
Add TestApiFactory for BDD testing setup and include API.Specs project
2026-01-29 22:55:10 -05:00
Aaron Po
cf9f048daa Add TestApiFactory for BDD testing setup and include API.Specs project in solution 2026-01-29 22:48:35 -05:00
Aaron Po
a8c0ae6358 Merge branch '2.0' into 116-add-loginauth-token-feature-to-net-api 2026-01-29 20:34:04 -05:00
Aaron Po
52643c1173 Merge pull request #118 from aaronpo97/117-feature-reqnroll-setup-for-bdd-testing
Set up Reqnroll for BDD testing
2026-01-29 20:30:22 -05:00
Aaron Po
24b059ea3d Set up Reqnroll for BDD testing 2026-01-29 20:28:50 -05:00
Aaron Po
97c093c4bc Update namespace organization in service layer 2026-01-29 18:13:34 -05:00
Aaron Po
45f64f613d Repo restructuring 2026-01-26 19:52:27 -05:00
Aaron Po
084f68da7a update documentation 2026-01-26 19:13:18 -05:00
Aaron Po
ea92735146 Merge remote-tracking branch 'dotnet/auth-updates' into integrate-dotnet-backend-repo 2026-01-26 18:59:30 -05:00
Aaron Po
54788b1a6d Merge remote-tracking branch 'dotnet/main' into integrate-dotnet-backend-repo 2026-01-26 18:58:40 -05:00
Aaron Po
7dc7ef4b1a Begin integration of dotnet backend with biergarten nextjs code 2026-01-26 18:52:16 -05:00
Aaron Po
a6702c89fd add issue template 2026-01-26 18:29:00 -05:00
Aaron Po
68ff549635 Refactor repository and SQL procedures; add repo tests 2026-01-25 23:26:40 -05:00
Aaron Po
a56ea77861 Add auth service 2026-01-25 21:58:40 -05:00
Aaron Po
14cb05e992 Update user credential stored procs 2026-01-24 19:11:49 -05:00
Aaron Po
53a7569ed5 Remove architecture overview from README
Removed the architecture overview and related details from the README.
2026-01-22 22:37:44 -05:00
Aaron Po
82db763951 Refactor repository methods to async and update credential logic 2026-01-22 11:14:23 -05:00
Aaron Po
fd544dbd34 Start stored procs for user credentials 2026-01-19 22:57:24 -05:00
Aaron Po
89da531c48 Restructure project 2026-01-15 21:48:20 -05:00
Aaron Po
c5aaf8cd05 Update repository, seed and service layers 2026-01-15 20:53:27 -05:00
Aaron Po
b8cd855916 Refactor user entities and repositories, update seeders
Standardized property naming in user-related entities to use 'Id' suffix (e.g., UserAccountId). Moved and updated repository interfaces and implementations to the DataAccessLayer.Repositories namespace. Refactored DBSeed seeders to use repository classes and improved structure. Updated .gitignore and project references
2026-01-15 13:23:41 -05:00
Aaron Po
60ef65ec52 Update AddUserCredential script 2026-01-13 23:44:48 -05:00
Aaron Po
da84492aa4 Update seeds 2026-01-13 23:18:03 -05:00
Aaron Po
b5ab6f6893 restructure seed 2026-01-13 20:10:39 -05:00
Aaron Po
7fbdfbf542 Add dbup for sql script handling 2026-01-13 00:25:30 -05:00
Aaron Po
43dcf0844d Refactor data layer, add business layer 2026-01-13 00:13:39 -05:00
Aaron Po
c928ddecb5 update seed application 2026-01-12 00:14:42 -05:00
Aaron Po
372aac897a Restructure data access layer/data layer 2026-01-11 23:36:26 -05:00
Aaron Po
8d6b903aa7 Refactor UserAccount repository methods and add stored procedures for user account management 2025-12-06 23:06:13 -05:00
Aaron Po
00a0f6c4ef update projects to dotnet 10 2025-12-06 22:59:22 -05:00
Aaron Po
afefdb9e3d Add WebAPI controllers for beers, breweries, and users; update Docker configuration and .gitignore 2025-12-06 22:15:00 -05:00
Aaron Po
fc2e8c9b6d Update data access layer, begin acquiring raw data 2025-11-17 02:39:40 -05:00
Aaron Po
b86607e37a Update stored procs/udf and update docker config 2025-11-13 10:18:03 +00:00
Aaron Po
a200164609 Initialize solution structure and add WebAPI project 2025-11-12 18:36:51 -05:00
Aaron Po
4e2c9836c9 update docker compose 2025-11-12 01:38:34 -05:00
Aaron Po
b7f22fcc66 Add seed db c# project 2025-11-12 00:41:27 -05:00
Aaron Po
f0c9cff8be update data testing 2025-11-11 06:02:45 -05:00
Aaron Po
33db1368ec Refactor schema and test data; remove DAL code
Removed all DataAccessLayer C# code and related test project files. Updated schema.sql to add Country, StateProvince, and City tables, refactored brewery and beer post tables to include location and concurrency columns, and replaced the old comment/rating system with BeerPostComment. Updated test-data.sql to seed new location tables and refactored brewery data to use city and coordinates.
2025-11-11 03:45:01 -05:00
Aaron Po
8975044034 add test data 2025-10-28 18:30:48 -04:00
Aaron Po
738c055bf7 begin scaffolding data access layer 2025-10-28 18:28:30 -04:00
Aaron Po
2f0bfd90b2 first commit 2025-10-23 02:27:20 -04:00
654 changed files with 34346 additions and 584 deletions

1
.gitattributes vendored Normal file
View File

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

View File

@@ -0,0 +1,33 @@
---
name: Feature Request (BDD)
about: Create a new feature using user story + BDD acceptance criteria
title: "[Feature] "
labels: ["feature", "BDD"]
assignees: []
---
## User Story
**As a** (who wants to accomplish something)
**I want to** (what they want to accomplish)
**So that** (why they want to accomplish that thing)
## Acceptance Criteria (BDD)
### Scenario 1
Given ... When ... Then ...
### Scenario 2
Given ... When ... Then ...
### Scenario 3
Given ... When ... Then ...
## Subtasks
- [ ] Task 1
- [ ] Task 2
- [ ] Task 3

View File

@@ -1,19 +0,0 @@
name: Node.js CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install dependencies
run: npm ci

457
.gitignore vendored
View File

@@ -15,6 +15,14 @@
# production
/build
# project-specific build artifacts
/src/Website/build/
/src/Website/storybook-static/
/src/Website/.react-router/
/src/Website/playwright-report/
/src/Website/test-results/
/test-results/
# misc
.DS_Store
*.pem
@@ -42,7 +50,454 @@ next-env.d.ts
# vscode
.vscode
.idea/
*.swp
*.swo
/cloudinary-images
.obsidian
.obsidian
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
*.env
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
[Dd]ebug/x64/
[Dd]ebugPublic/x64/
[Rr]elease/x64/
[Rr]eleases/x64/
bin/x64/
obj/x64/
[Dd]ebug/x86/
[Dd]ebugPublic/x86/
[Rr]elease/x86/
[Rr]eleases/x86/
bin/x86/
obj/x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
[Aa][Rr][Mm]64[Ee][Cc]/
bld/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Build results on 'Bin' directories
**/[Bb]in/*
# Uncomment if you have tasks that rely on *.refresh files to move binaries
# (https://github.com/github/gitignore/pull/3736)
#!**/[Bb]in/*.refresh
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
*.trx
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Approval Tests result files
*.received.*
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.idb
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
# but not Directory.Build.rsp, as it configures directory-level build defaults
!Directory.Build.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
**/.paket/paket.exe
paket-files/
# FAKE - F# Make
**/.fake/
# CodeRush personal settings
**/.cr/personal
# Python Tools for Visual Studio (PTVS)
**/__pycache__/
*.pyc
# Cake - Uncomment if you are using it
#tools/**
#!tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
MSBuild_Logs/
# AWS SAM Build and Temporary Artifacts folder
.aws-sam
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
**/.mfractor/
# Local History for Visual Studio
**/.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
**/.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
.DS_Store
*/data_source/other
.fake
.idea
*.feature.cs
.env
.env.dev
.env.test
.env.prod
*storybook.log
storybook-static

File diff suppressed because it is too large Load Diff

271
README.md
View File

@@ -1,219 +1,150 @@
# The Biergarten App
## About
The Biergarten App is a full-stack directory and discovery platform for
breweries. It features a robust user authentication system, a searchable
database of brewery locations, and a custom offline data-generation pipeline
that uses LLMs (Llama.cpp) and Wikipedia to synthesize realistic seed data.
The Biergarten App is a web application designed for beer lovers to share their favorite
brews and breweries with like-minded people online.
It features:
This application's stack consists of Next.js, Prisma and Neon Postgres. I'm motivated to
learn more about these technologies while exploring my passion for beer.
- A .NET backend (Web API + database migrations/seed) under `web/backend/`
- A server-rendered React website (React Router + Vite) under `web/frontend/`
- A C++20 “pipeline” CLI for generating seed data under `tooling/pipeline/`
I've also incorporated different APIs into the application, such as the Cloudinary API for
image uploading, the SparkPost API for email services as well as Mapbox for geolocation
and map data.
Specialized documentation (setup, architecture, docker, testing, diagrams, and
pipeline notes) lives under `docs/`.
To handle serverless functions (API routes), I use the next-connect package.
## Documentation (Start Here)
On the client-side, I use Tailwind CSS, Headless UI and Daisy UI for styling to create a
visually appealing and user-friendly interface.
Website + backend (active stack):
I'm sharing my code publicly so that others can learn from it and use it as a reference
for their own projects.
- [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)
### Some beer terminology
Data generation pipeline (C++):
In this app you will encounter various beer related terms. Here is a list of terms used in
this app and their definitions.
- [Pipeline README](docs/pipeline/README.md)
- [Ethics & Known Issues](docs/pipeline/ETHICS-AND-KNOWN-ISSUES.md)
#### ABV
## Diagrams
[Alcohol by volume](https://en.wikipedia.org/wiki/Alcohol_by_volume) (abbreviated as ABV)
is a standard measure of how much alcohol (ethanol) is contained in a given volume of an
alcoholic beverage (expressed as a volume percent).
- [Architecture](docs/website/diagrams-out/architecture.svg)
- [Deployment](docs/website/diagrams-out/deployment.svg)
- [Authentication Flow](docs/website/diagrams-out/authentication-flow.svg)
- [Database Schema](docs/website/diagrams-out/database-schema.svg)
#### IBU
## Current Status
The
[International Bitterness Units](https://en.wikipedia.org/wiki/Beer_measurement#Bitterness)
scale, or IBU, is used to approximately quantify the bitterness of beer. This scale is not
measured on the perceived bitterness of the beer, but rather the amount of a component of
beer known as iso-alpha acids.
Active areas in the repository:
## Database Schema
- .NET 10 backend (layered architecture) + SQL Server
- React 19 website (React Router 7 + Vite)
- Shared Biergarten theme system + Storybook coverage
- Auth flows and account/email integration (local Mailpit in dev compose)
- Data generation pipeline with C++ and Llama.cpp
![Schema](./schema.svg)
Archived/reference areas:
## Technologies
- `archive/next-js-web-app/` contains an older Next.js frontend retained for
reference
### General
## Tech Stack
- [Next.js](https://nextjs.org/)
- A React based framework for building web applications offering several features such
as server side rendering, static site generation and API routes.
- **Backend**: .NET 10, ASP.NET Core, SQL Server 2022, DbUp
- **Frontend**: React 19, React Router 7, Vite 7, Tailwind CSS 4, DaisyUI 5
- **UI Documentation**: Storybook 10, Vitest browser mode, Playwright
- **Testing**: xUnit, Reqnroll (BDD), FluentAssertions, Moq
- **Infrastructure**: Docker, Docker Compose
- **Security**: Argon2id password hashing, JWT access/refresh/confirmation
tokens
- **Data Pipeline**: C++20, CMake, Boost, libcurl, SQLite, llama.cpp
### Client
## Quick Start
- [SWR](https://swr.vercel.app/)
- A React Hooks library for fetching data with support for caching, revalidation and
error handling.
- [Tailwind CSS](https://tailwindcss.com/)
- A popular open-source utility-first CSS framework that provides pre-defined classes to
style HTML elements.
- [Headless UI](https://headlessui.dev/)
- A set of completely unstyled, fully accessible UI components, designed to integrate
beautifully with Tailwind CSS.
- [Daisy UI](https://daisyui.com/)
- A component library for Tailwind CSS that provides ready-to-use components for
building user interfaces.
For full setup details, use [Getting Started](docs/website/getting-started.md).
This section is the shortest path to a working dev environment.
### Server
- [Prisma](https://www.prisma.io/)
- An open-source ORM for Node.js and TypeScript applications.
- [Neon Postgres](https://neon.tech/)
- A managed PostgreSQL database service powered by Neon.
- [Cloudinary](https://cloudinary.com/)
- A cloud-based image and video management service that provides developers with an easy
way to upload, store, and manipulate media assets.
- [SparkPost](https://www.sparkpost.com/)
- A cloud-based email delivery service that provides developers with an easy way to send
transactional and marketing emails.
- [Mapbox](https://www.mapbox.com/)
- A suite of open-source mapping tools that allows developers to add custom maps,
search, and navigation into their applications.
- [next-connect](https://github.com/hoangvvo/next-connect#readme)
- A promise-based method routing and middleware layer for Next.js.
## How to run locally
### Prerequisites
Before you can run this application locally, you will need to have the following installed
on your machine:
- [Node.js](https://nodejs.org/en/)
- [npm (version 8 or higher)](https://www.npmjs.com/get-npm)
You will also need to create a free account with the following services:
- [Cloudinary](https://cloudinary.com/users/register/free)
- [SparkPost](https://www.sparkpost.com/)
- [Neon Postgres](https://neon.tech/)
- [Mapbox](https://account.mapbox.com/auth/signup/)
### Setup
1. Clone this repository and navigate to the project directory.
### Backend (Docker)
```bash
git clone https://github.com/aaronpo97/the-biergarten-app
cd the-biergarten-app
cp web/.env.example web/.env.dev
docker compose --env-file web/.env.dev -f web/docker-compose.dev.yaml up --build -d
```
2. Run the following command to install the dependencies.
Backend access:
- API Swagger: http://localhost:8080/swagger
- Health Check: http://localhost:8080/health
- Mailpit UI (dev SMTP): http://localhost:8025
### Frontend (Node)
```bash
cd web/frontend
npm install
API_BASE_URL=http://localhost:8080 SESSION_SECRET=dev-secret-change-me npm run dev
```
3. Run the following script to create a `.env` file in the root directory of the project
and add the following environment variables. Update these variables with your own
values.
Optional frontend tools:
```bash
echo "BASE_URL=
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=
CLOUDINARY_KEY=
CLOUDINARY_SECRET=
CONFIRMATION_TOKEN_SECRET=
RESET_PASSWORD_TOKEN_SECRET=
SESSION_SECRET=
SESSION_TOKEN_NAME=
SESSION_MAX_AGE=
NODE_ENV=
POSTGRES_PRISMA_URL=
POSTGRES_URL_NON_POOLING=
SHADOW_DATABASE_URL=
ADMIN_PASSWORD=
MAPBOX_ACCESS_TOKEN=
SPARKPOST_API_KEY=
SPARKPOST_SENDER_ADDRESS=" > .env
cd web/frontend
npm run storybook
npm run test:storybook
npm run test:storybook:playwright
```
### Explanation of environment variables
## Repository Structure
- `BASE_URL` is the base URL of the application.
- For example, if you are running the application locally, you can set this to
`http://localhost:3000`.
- `NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME`, `CLOUDINARY_KEY`, and `CLOUDINARY_SECRET` are the
credentials for your Cloudinary account.
- You can create a free account [here](https://cloudinary.com/users/register/free).
- `CONFIRMATION_TOKEN_SECRET` is the secret used to sign the confirmation token used for
email confirmation.
- You can generate a random string using the`openssl rand -base64 127` command.
- `RESET_PASSWORD_TOKEN_SECRET` is the secret used to sign the reset password token.
- You can generate a random string using the `openssl rand -base64 127` command.
- `SESSION_SECRET` is the secret used to sign the session cookie.
- Use the same command as above to generate a random string.
- `SESSION_TOKEN_NAME` is the name of the session cookie.
- You can set this to `biergarten`.
- `SESSION_MAX_AGE` is the maximum age of the session cookie in seconds.
- You can set this to `604800` (1 week).
- `POSTGRES_PRISMA_URL`is a pooled connection string for your Neon Postgres database.
- `POSTGRES_URL_NON_POOLING` is a non-pooled connection string for your Neon Postgres
database used for migrations.
- `SHADOW_DATABASE_URL` is a connection string for a secondary database used for
migrations to detect schema drift.
- You can create a free account [here](https://neon.tech).
- Consult the [docs](https://neon.tech/docs/guides/prisma) for more information.
- `MAPBOX_ACCESS_TOKEN` is the access token for your Mapbox account.
- You can create a free account [here](https://account.mapbox.com/auth/signup/).
- `NODE_ENV` is the environment in which the application is running.
- You can set this to `development` or `production`.
- `SPARKPOST_API_KEY` is the API key for your SparkPost account.
- You can create a free account [here](https://www.sparkpost.com/).
- `SPARKPOST_SENDER_ADDRESS` is the email address that will be used to send emails.
- `ADMIN_PASSWORD` is the password for the admin account created when seeding the
database.
```text
web/
backend/ .NET API + domain/service/infrastructure + DB projects
frontend/ React Router website + Storybook + Playwright/Vitest
1. Initialize the database and run the migrations.
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)
```
## Testing
Run the backend test stack with Docker:
```bash
npx prisma generate
npx prisma migrate dev
docker compose --env-file web/.env.test -f web/docker-compose.test.yaml up --abort-on-container-exit
```
5. Seed the database with some initial data.
See [Testing](docs/website/testing.md) for the full command list.
```bash
npm run seed
```
## Configuration
6. Start the application.
Common active variables:
```bash
npm run dev
```
- Backend/Docker: `DB_SERVER`, `DB_NAME`, `DB_USER`, `DB_PASSWORD`,
`ACCESS_TOKEN_SECRET`, `REFRESH_TOKEN_SECRET`, `CONFIRMATION_TOKEN_SECRET`,
`WEBSITE_BASE_URL`
- Frontend runtime: `API_BASE_URL`, `SESSION_SECRET`, `NODE_ENV`
## License
See [Environment Variables](docs/website/environment-variables.md) for details.
The Biergarten App is licensed under the GNU General Public License v3.0. This means that
anyone is free to use, modify, and distribute the code as long as they also distribute
their modifications under the same license.
## Contributing
I encourage anyone who uses this code for educational purposes to attribute me as the
original author, and to provide a link to this repository.
By contributing to this repository, you agree to license your contributions under the same
license as the project.
If you have any questions or concerns about the license, please feel free to submit an
issue to this repository.
I hope that this project will be useful to other developers and beer enthusiasts who are
interested in learning about web development with Next.js, Prisma, Postgres, and other
technologies.
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

219
archive/next-js-web-app/README.old.md vendored Normal file
View File

@@ -0,0 +1,219 @@
# The Biergarten App
## About
The Biergarten App is a web application designed for beer lovers to share their favorite
brews and breweries with like-minded people online.
This application's stack consists of Next.js, Prisma and Neon Postgres. I'm motivated to
learn more about these technologies while exploring my passion for beer.
I've also incorporated different APIs into the application, such as the Cloudinary API for
image uploading, the SparkPost API for email services as well as Mapbox for geolocation
and map data.
To handle serverless functions (API routes), I use the next-connect package.
On the client-side, I use Tailwind CSS, Headless UI and Daisy UI for styling to create a
visually appealing and user-friendly interface.
I'm sharing my code publicly so that others can learn from it and use it as a reference
for their own projects.
### Some beer terminology
In this app you will encounter various beer related terms. Here is a list of terms used in
this app and their definitions.
#### ABV
[Alcohol by volume](https://en.wikipedia.org/wiki/Alcohol_by_volume) (abbreviated as ABV)
is a standard measure of how much alcohol (ethanol) is contained in a given volume of an
alcoholic beverage (expressed as a volume percent).
#### IBU
The
[International Bitterness Units](https://en.wikipedia.org/wiki/Beer_measurement#Bitterness)
scale, or IBU, is used to approximately quantify the bitterness of beer. This scale is not
measured on the perceived bitterness of the beer, but rather the amount of a component of
beer known as iso-alpha acids.
## Database Schema
![Schema](./schema.svg)
## Technologies
### General
- [Next.js](https://nextjs.org/)
- A React based framework for building web applications offering several features such
as server side rendering, static site generation and API routes.
### Client
- [SWR](https://swr.vercel.app/)
- A React Hooks library for fetching data with support for caching, revalidation and
error handling.
- [Tailwind CSS](https://tailwindcss.com/)
- A popular open-source utility-first CSS framework that provides pre-defined classes to
style HTML elements.
- [Headless UI](https://headlessui.dev/)
- A set of completely unstyled, fully accessible UI components, designed to integrate
beautifully with Tailwind CSS.
- [Daisy UI](https://daisyui.com/)
- A component library for Tailwind CSS that provides ready-to-use components for
building user interfaces.
### Server
- [Prisma](https://www.prisma.io/)
- An open-source ORM for Node.js and TypeScript applications.
- [Neon Postgres](https://neon.tech/)
- A managed PostgreSQL database service powered by Neon.
- [Cloudinary](https://cloudinary.com/)
- A cloud-based image and video management service that provides developers with an easy
way to upload, store, and manipulate media assets.
- [SparkPost](https://www.sparkpost.com/)
- A cloud-based email delivery service that provides developers with an easy way to send
transactional and marketing emails.
- [Mapbox](https://www.mapbox.com/)
- A suite of open-source mapping tools that allows developers to add custom maps,
search, and navigation into their applications.
- [next-connect](https://github.com/hoangvvo/next-connect#readme)
- A promise-based method routing and middleware layer for Next.js.
## How to run locally
### Prerequisites
Before you can run this application locally, you will need to have the following installed
on your machine:
- [Node.js](https://nodejs.org/en/)
- [npm (version 8 or higher)](https://www.npmjs.com/get-npm)
You will also need to create a free account with the following services:
- [Cloudinary](https://cloudinary.com/users/register/free)
- [SparkPost](https://www.sparkpost.com/)
- [Neon Postgres](https://neon.tech/)
- [Mapbox](https://account.mapbox.com/auth/signup/)
### Setup
1. Clone this repository and navigate to the project directory.
```bash
git clone https://github.com/aaronpo97/the-biergarten-app
cd the-biergarten-app
```
2. Run the following command to install the dependencies.
```bash
npm install
```
3. Run the following script to create a `.env` file in the root directory of the project
and add the following environment variables. Update these variables with your own
values.
```bash
echo "BASE_URL=
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=
CLOUDINARY_KEY=
CLOUDINARY_SECRET=
CONFIRMATION_TOKEN_SECRET=
RESET_PASSWORD_TOKEN_SECRET=
SESSION_SECRET=
SESSION_TOKEN_NAME=
SESSION_MAX_AGE=
NODE_ENV=
POSTGRES_PRISMA_URL=
POSTGRES_URL_NON_POOLING=
SHADOW_DATABASE_URL=
ADMIN_PASSWORD=
MAPBOX_ACCESS_TOKEN=
SPARKPOST_API_KEY=
SPARKPOST_SENDER_ADDRESS=" > .env
```
### Explanation of environment variables
- `BASE_URL` is the base URL of the application.
- For example, if you are running the application locally, you can set this to
`http://localhost:3000`.
- `NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME`, `CLOUDINARY_KEY`, and `CLOUDINARY_SECRET` are the
credentials for your Cloudinary account.
- You can create a free account [here](https://cloudinary.com/users/register/free).
- `CONFIRMATION_TOKEN_SECRET` is the secret used to sign the confirmation token used for
email confirmation.
- You can generate a random string using the`openssl rand -base64 127` command.
- `RESET_PASSWORD_TOKEN_SECRET` is the secret used to sign the reset password token.
- You can generate a random string using the `openssl rand -base64 127` command.
- `SESSION_SECRET` is the secret used to sign the session cookie.
- Use the same command as above to generate a random string.
- `SESSION_TOKEN_NAME` is the name of the session cookie.
- You can set this to `biergarten`.
- `SESSION_MAX_AGE` is the maximum age of the session cookie in seconds.
- You can set this to `604800` (1 week).
- `POSTGRES_PRISMA_URL`is a pooled connection string for your Neon Postgres database.
- `POSTGRES_URL_NON_POOLING` is a non-pooled connection string for your Neon Postgres
database used for migrations.
- `SHADOW_DATABASE_URL` is a connection string for a secondary database used for
migrations to detect schema drift.
- You can create a free account [here](https://neon.tech).
- Consult the [docs](https://neon.tech/docs/guides/prisma) for more information.
- `MAPBOX_ACCESS_TOKEN` is the access token for your Mapbox account.
- You can create a free account [here](https://account.mapbox.com/auth/signup/).
- `NODE_ENV` is the environment in which the application is running.
- You can set this to `development` or `production`.
- `SPARKPOST_API_KEY` is the API key for your SparkPost account.
- You can create a free account [here](https://www.sparkpost.com/).
- `SPARKPOST_SENDER_ADDRESS` is the email address that will be used to send emails.
- `ADMIN_PASSWORD` is the password for the admin account created when seeding the
database.
1. Initialize the database and run the migrations.
```bash
npx prisma generate
npx prisma migrate dev
```
5. Seed the database with some initial data.
```bash
npm run seed
```
6. Start the application.
```bash
npm run dev
```
## License
The Biergarten App is licensed under the GNU General Public License v3.0. This means that
anyone is free to use, modify, and distribute the code as long as they also distribute
their modifications under the same license.
I encourage anyone who uses this code for educational purposes to attribute me as the
original author, and to provide a link to this repository.
By contributing to this repository, you agree to license your contributions under the same
license as the project.
If you have any questions or concerns about the license, please feel free to submit an
issue to this repository.
I hope that this project will be useful to other developers and beer enthusiasts who are
interested in learning about web development with Next.js, Prisma, Postgres, and other
technologies.

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