- Replace 8 duplicate formatCurrency functions with shared utility - Add comprehensive formatter utilities (currency, date, number, etc.) - Set up Vitest for unit testing with 38 passing tests - Set up Playwright for E2E testing - Consolidate database connection to single source (src/utils/db.ts) - Add auth middleware helpers to reduce code duplication - Fix display bug: remove spurious minus sign in recent activity amounts - Add path aliases for cleaner imports ($utils, $models) - Add project documentation (CODEMAP.md, REFACTORING_PLAN.md) Test coverage: 38 unit tests passing Build: successful with no breaking changes
14 KiB
14 KiB
Homepage Codebase Map
Generated: 2025-11-18
Table of Contents
Backend Architecture
Database Configuration
⚠️ CRITICAL DUPLICATION:
src/lib/db/db.ts- Legacy DB connection usingMONGODB_URIsrc/utils/db.ts- Current DB connection usingMONGO_URL(better pooling) ✅ Preferred
Recommendation: Consolidate all usage to src/utils/db.ts
Models (10 Total)
Cospend (Expense Tracking)
src/models/Payment.ts- Payment records with currency conversionsrc/models/PaymentSplit.ts- Individual user splits per paymentsrc/models/RecurringPayment.ts- Scheduled recurring payments with cronsrc/models/ExchangeRate.ts- Cached currency exchange rates
Recipes
src/models/Recipe.ts- Full recipe schema with ingredients, instructions, imagessrc/models/UserFavorites.ts- User favorite recipes
Fitness
src/models/Exercise.ts- Exercise database (body parts, equipment, instructions)src/models/WorkoutTemplate.ts- Workout templates with exercises/setssrc/models/WorkoutSession.ts- Completed workout sessions
Gaming
src/models/MarioKartTournament.ts- Tournament management with groups/brackets
API Routes (47 Total Endpoints)
Bible/Misc (1 endpoint)
GET /api/bible-quote/+server.ts- Random Bible verse for error pages
Cospend API (13 endpoints)
GET /api/cospend/balance/+server.ts- Calculate user balancesGET /api/cospend/debts/+server.ts- Calculate who owes whomGET /api/cospend/exchange-rates/+server.ts- Manage exchange ratesGET /api/cospend/monthly-expenses/+server.ts- Monthly expense analyticsGET|POST /api/cospend/payments/+server.ts- CRUD for paymentsGET|PUT|DELETE /api/cospend/payments/[id]/+server.ts- Single payment opsGET|POST /api/cospend/recurring-payments/+server.ts- CRUD recurring paymentsGET|PUT|DELETE /api/cospend/recurring-payments/[id]/+server.ts- Single recurringPOST /api/cospend/recurring-payments/execute/+server.ts- Manual executionPOST /api/cospend/recurring-payments/cron-execute/+server.ts- Cron executionGET /api/cospend/recurring-payments/scheduler/+server.ts- Scheduler statusPOST /api/cospend/upload/+server.ts- Receipt image upload
Fitness API (8 endpoints)
GET|POST /api/fitness/exercises/+server.ts- List/search/create exercisesGET|PUT|DELETE /api/fitness/exercises/[id]/+server.ts- Single exercise opsGET /api/fitness/exercises/filters/+server.ts- Get filter optionsGET|POST /api/fitness/sessions/+server.ts- List/create workout sessionsGET|PUT|DELETE /api/fitness/sessions/[id]/+server.ts- Single session opsGET|POST /api/fitness/templates/+server.ts- List/create templatesGET|PUT|DELETE /api/fitness/templates/[id]/+server.ts- Single template opsPOST /api/fitness/seed-example/+server.ts- Seed example data
Mario Kart API (8 endpoints)
GET|POST /api/mario-kart/tournaments/+server.ts- List/create tournamentsGET|PUT|DELETE /api/mario-kart/tournaments/[id]/+server.ts- Single tournamentGET|PUT /api/mario-kart/tournaments/[id]/bracket/+server.ts- Bracket managementPUT /api/mario-kart/tournaments/[id]/bracket/matches/[matchId]/scores/+server.ts- Match scoresPOST|DELETE /api/mario-kart/tournaments/[id]/contestants/+server.ts- Manage contestantsPUT /api/mario-kart/tournaments/[id]/contestants/[contestantId]/dnf/+server.ts- Mark DNFPOST /api/mario-kart/tournaments/[id]/groups/+server.ts- Group managementPUT /api/mario-kart/tournaments/[id]/groups/[groupId]/scores/+server.ts- Group scores
Recipes (Rezepte) API (17 endpoints)
POST /api/rezepte/add/+server.ts- Add new recipeDELETE /api/rezepte/delete/+server.ts- Delete recipePUT /api/rezepte/edit/+server.ts- Edit recipeGET /api/rezepte/search/+server.ts- Search recipesGET|POST|DELETE /api/rezepte/favorites/+server.ts- User favoritesGET /api/rezepte/favorites/check/[shortName]/+server.ts- Check if favoriteGET /api/rezepte/favorites/recipes/+server.ts- Get favorite recipesPOST /api/rezepte/img/add/+server.ts- Add recipe imageDELETE /api/rezepte/img/delete/+server.ts- Delete recipe imagePUT /api/rezepte/img/mv/+server.ts- Move/reorder recipe imageGET /api/rezepte/items/all_brief/+server.ts- Get all recipes (brief)GET /api/rezepte/items/[name]/+server.ts- Get single recipeGET /api/rezepte/items/category/+server.ts- Get categoriesGET /api/rezepte/items/category/[category]/+server.ts- Recipes by categoryGET /api/rezepte/items/icon/+server.ts- Get iconsGET /api/rezepte/items/icon/[icon]/+server.ts- Recipes by iconGET /api/rezepte/items/in_season/[month]/+server.ts- Seasonal recipesGET /api/rezepte/items/tag/+server.ts- Get tagsGET /api/rezepte/items/tag/[tag]/+server.ts- Recipes by tagGET /api/rezepte/json-ld/[name]/+server.ts- Recipe JSON-LD for SEO
Server-Side Utilities
Core Utils
src/utils/db.ts- MongoDB connection with pooling ✅ Preferredsrc/lib/db/db.ts- Legacy DB connection ⚠️ Deprecated
Server Libraries
src/lib/server/favorites.ts- User favorites helper functionssrc/lib/server/scheduler.ts- Recurring payment scheduler (node-cron)
Business Logic
src/lib/utils/categories.ts- Payment category definitionssrc/lib/utils/currency.ts- Currency conversion (Frankfurter API)src/lib/utils/recurring.ts- Cron expression parsing & schedulingsrc/lib/utils/settlements.ts- Settlement payment helpers
Authentication
src/auth.ts- Auth.js configuration (Authentik provider)src/hooks.server.ts- Server hooks (auth, routing, DB init, scheduler)
Frontend JavaScript
Svelte Stores (src/lib/js/)
img_store.js- Image state storeportions_store.js- Recipe portions stateseason_store.js- Seasonal filtering state
Utility Functions
Recipe Utils (src/lib/js/)
randomize.js- Seeded randomization for daily recipe orderrecipeJsonLd.ts- Recipe JSON-LD schema generationstripHtmlTags.ts- HTML tag removal utility
General Utils
src/utils/cookie.js- Cookie utilities
Type Definitions
src/types/types.ts- Recipe TypeScript types (RecipeModelType, BriefRecipeType)src/app.d.ts- SvelteKit app type definitions
Configuration
src/lib/config/users.ts- Predefined users for Cospend (alexander, anna)
Frontend Design
Global CSS (src/lib/css/) - 8 Files, 544 Lines
nordtheme.css(54 lines) - Nord color scheme, CSS variables, global stylesform.css(51 lines) - Form stylingaction_button.css(58 lines) - Action button with shake animationicon.css(52 lines) - Icon stylingshake.css(28 lines) - Shake animationchrist.css(32 lines) - Faith section stylingpredigten.css(65 lines) - Sermon section stylingrosenkranz.css(204 lines) - Rosary prayer styling
Reusable Components (src/lib/components/) - 48 Files
Icon Components (src/lib/assets/icons/)
Check.svelte,Cross.svelte,Heart.svelte,Pen.svelte,Plus.svelte,Upload.svelte
UI Components
ActionButton.svelte- Animated action buttonAddButton.svelte- Add buttonEditButton.svelte- Edit button (floating)FavoriteButton.svelte- Toggle favoriteCard.svelte(259 lines) ⚠️ Large - Recipe card with hover effects, tags, categoryCardAdd.svelte- Add recipe card placeholderFormSection.svelte- Styled form section wrapperHeader.svelte- Page headerUserHeader.svelte- User-specific headerIcon.svelte- Icon wrapperIconLayout.svelte- Icon grid layoutSymbol.svelte- Symbol displayProfilePicture.svelte- User avatar
Layout Components
LinksGrid.svelte- Navigation links gridMediaScroller.svelte- Horizontal scrolling mediaSeasonLayout.svelte- Seasonal recipe layoutTitleImgParallax.svelte- Parallax title image
Recipe-Specific Components
Recipes.svelte- Recipe list displayRecipeEditor.svelte- Recipe editing formRecipeNote.svelte- Recipe notes displayEditRecipe.svelte- Edit recipe modalEditRecipeNote.svelte- Edit recipe notesCreateIngredientList.svelte- Ingredient list editorCreateStepList.svelte- Instruction steps editorIngredientListList.svelte- Multiple ingredient listsIngredientsPage.svelte- Ingredients tab viewInstructionsPage.svelte- Instructions tab viewImageUpload.svelte- Recipe image uploaderHefeSwapper.svelte- Yeast type converterSeasonSelect.svelte- Season selectorTagBall.svelte- Tag bubbleTagCloud.svelte- Tag cloud displaySearch.svelte- Recipe search
Cospend (Expense) Components
PaymentModal.svelte(716 lines) ⚠️ Very Large - Detailed payment view modalSplitMethodSelector.svelte- Payment split method chooserUsersList.svelte- User selection listEnhancedBalance.svelte- Balance display with chartsDebtBreakdown.svelte- Debt summaryBarChart.svelte- Bar chart visualization
Layouts (6 Total)
src/routes/+layout.svelte- Root layout (minimal)src/routes/(main)/+layout.svelte- Main section layoutsrc/routes/rezepte/+layout.svelte- Recipe section layoutsrc/routes/cospend/+layout.svelte- Cospend section layoutsrc/routes/glaube/+layout.svelte- Faith section layoutsrc/routes/fitness/+layout.svelte- Fitness section layout
Pages (36 Total)
Main Pages (4)
(main)/+page.svelte- Homepage(main)/register/+page.svelte- Registration(main)/settings/+page.svelte- Settings+error.svelte- Error page (with Bible verse)
Recipe Pages (15)
rezepte/+page.svelte- Recipe listrezepte/[name]/+page.svelte- Recipe detailrezepte/add/+page.svelte- Add reciperezepte/edit/[name]/+page.svelte- Edit reciperezepte/search/+page.svelte- Search recipesrezepte/favorites/+page.svelte- Favorite recipesrezepte/category/+page.svelte- Category listrezepte/category/[category]/+page.svelte- Category recipesrezepte/icon/+page.svelte- Icon listrezepte/icon/[icon]/+page.svelte- Icon recipesrezepte/season/+page.svelte- Season selectorrezepte/season/[month]/+page.svelte- Seasonal recipesrezepte/tag/+page.svelte- Tag listrezepte/tag/[tag]/+page.svelte- Tag recipesrezepte/tips-and-tricks/+page.svelte- Tips page with converter
Cospend Pages (8)
cospend/+page.svelte(20KB!) ⚠️ Very Large - Dashboardcospend/payments/+page.svelte- Payment listcospend/payments/add/+page.svelte- Add paymentcospend/payments/edit/[id]/+page.svelte- Edit paymentcospend/payments/view/[id]/+page.svelte- View paymentcospend/recurring/+page.svelte- Recurring paymentscospend/recurring/edit/[id]/+page.svelte- Edit recurringcospend/settle/+page.svelte- Settlement calculator
Fitness Pages (4)
fitness/+page.svelte- Fitness dashboardfitness/sessions/+page.svelte- Workout sessionsfitness/templates/+page.svelte- Workout templatesfitness/workout/+page.svelte- Active workout
Mario Kart Pages (2)
mario-kart/+page.svelte- Tournament listmario-kart/[id]/+page.svelte- Tournament detail
Faith Pages (4)
glaube/+page.svelte- Faith section homeglaube/gebete/+page.svelte- Prayersglaube/predigten/+page.svelte- Sermonsglaube/rosenkranz/+page.svelte- Rosary
Duplication Analysis
🔴 Critical Issues
1. Database Connection Duplication
- Files:
src/lib/db/db.tsvssrc/utils/db.ts - Impact: 43 API routes, inconsistent env var usage
- Action: Consolidate to
src/utils/db.ts
2. Authorization Pattern (47 occurrences)
const session = await locals.auth();
if (!session || !session.user?.nickname) {
return json({ error: 'Unauthorized' }, { status: 401 });
}
- Action: Extract to middleware helper
🟡 Moderate Issues
3. Formatting Functions (65 occurrences)
- Currency formatting in 12+ files (inline)
- Date formatting scattered across components
- Action: Create
src/lib/utils/formatters.ts
4. Button Styling (121 definitions across 20 files)
- Repeated
.btn-primary,.btn-secondary,.btn-dangerclasses - Action: Create unified
Button.sveltecomponent
5. Recipe Filtering Logic
- Similar patterns in category/icon/tag/season pages
- Action: Extract to shared filter component
🟢 Minor Issues
6. Border Radius (22 files)
- Consistent
0.5remor8pxusage - Action: Add CSS variable for design token
7. Large Component Files
src/routes/cospend/+page.svelte(20KB)src/lib/components/PaymentModal.svelte(716 lines)src/lib/components/Card.svelte(259 lines)- Action: Consider decomposition
✅ Strengths
- Excellent Nord Theme Consistency - 525 occurrences, well-defined CSS variables
- Good Architecture - Clear separation: models, API, components, pages
- Type Safety - Comprehensive TypeScript usage
- Scoped Styles - All component styles properly scoped
Architecture Summary
Framework: SvelteKit + TypeScript
Database: MongoDB + Mongoose ODM
Authentication: Auth.js + Authentik provider
Styling: CSS (Nord theme) + Scoped component styles
State Management: Svelte stores (minimal - 3 stores)
API Architecture: RESTful endpoints in /routes/api/
Module Breakdown:
- Recipes (Rezepte): 17 API endpoints, 15 pages
- Expense Tracking (Cospend): 13 API endpoints, 8 pages
- Fitness Tracking: 8 API endpoints, 4 pages
- Mario Kart Tournaments: 8 API endpoints, 2 pages
- Faith/Religious Content: 1 API endpoint, 4 pages