# Architecture

## 1. High-Level Architecture

The application follows a fullstack SPA architecture:

- Nuxt 3 frontend
- Nitro backend (Node.js)
- REST API
- MySQL database
- Prisma ORM

Frontend and backend live in a single repository.

---

## 2. Architectural Principles

- Clear separation of concerns:
  - UI
  - State
  - Domain logic
  - Persistence
- Backend is the source of truth
- Frontend does not calculate time-based progression
- No real-time connections (WebSockets not required)

---

## 3. Frontend Structure

- Pages:
  - Habits
  - Quests
  - Village
  - Leaderboard
- Components:
  - HabitCard
  - QuestItem
  - VillageGrid
  - VillageObject
  - BuildModeOverlay
- State:
  - userStore
  - habitsStore
  - questsStore
  - villageStore
  - leaderboardStore

---

## 4. Backend Structure

- API routes grouped by domain:
  - /auth
  - /user
  - /habits
  - /quests
  - /village
  - /leaderboard
- Domain services:
  - HabitService
  - QuestService
  - VillageService
  - CropGrowthService
- All time-based logic is calculated on request

---

## 5. Village Logic

- Village grid is logical (cell-based)
- Isometric view is purely visual
- Build mode:
  - shows grid overlay
  - allows placing, moving and removing objects
- View mode:
  - allows planting and harvesting
- Obstacles must be cleared before building

---

## 6. Time & Progression

- Server calculates:
  - whether a quest is available today
  - whether a crop is grown
  - streak progression
- Time is based on user local date stored on server
- No background jobs required for MVP

---

## 7. Data Flow

1. Frontend requests current state
2. Backend recalculates progression if needed
3. Backend returns updated state
4. Frontend updates Pinia stores
5. UI reflects the new state

---

## 8. Non-Goals

- No SSR optimization
- No WebSocket connections
- No offline mode
- No push notifications
