300 lines
8.0 KiB
Markdown
300 lines
8.0 KiB
Markdown
# Nexus 3
|
|
|
|
A modern business management platform built with Django GraphQL and SvelteKit. Nexus 3 represents a significant architectural evolution from its predecessors, featuring a GraphQL API, modular backend architecture, and enhanced frontend state management.
|
|
|
|
## Improvements Over Nexus 1 and Nexus 2
|
|
|
|
### Architectural Improvements Over Nexus 1
|
|
|
|
| Feature | Nexus 1 | Nexus 3 |
|
|
|---------|---------|---------|
|
|
| **API Architecture** | REST API | GraphQL API |
|
|
| **Frontend Framework** | React (JSX) | SvelteKit with TypeScript |
|
|
| **Backend Structure** | Monolithic (single `models.py`, `views.py`) | Modular (separate directories per domain) |
|
|
| **State Management** | Prop drilling | Svelte stores with typed operations |
|
|
| **Authentication** | JWT with DRF | JWT with graphql-jwt |
|
|
| **Type Safety** | None | Full TypeScript support |
|
|
| **Code Organization** | Flat structure | Domain-driven design |
|
|
|
|
### Architectural Improvements Over Nexus 2
|
|
|
|
| Feature | Nexus 2 | Nexus 3 |
|
|
|---------|---------|---------|
|
|
| **API Architecture** | REST API (DRF ViewSets) | GraphQL API (Graphene) |
|
|
| **Data Fetching** | Multiple REST endpoints | Single GraphQL endpoint with precise queries |
|
|
| **Backend Patterns** | MVC with serializers | Repository + Command pattern |
|
|
| **Settings Management** | Single `settings.py` | Split settings (base/dev/prod) |
|
|
| **Frontend Data Layer** | Direct API calls | Typed GraphQL operations with URQL |
|
|
| **Caching** | None | URQL exchange-based caching |
|
|
| **Error Handling** | HTTP status codes | GraphQL error extensions |
|
|
|
|
### Key Improvements in Nexus 3
|
|
|
|
1. **GraphQL API**: Clients request exactly the data they need, reducing over-fetching and under-fetching
|
|
2. **Repository Pattern**: Data access is abstracted through repositories, making testing and maintenance easier
|
|
3. **Command Pattern**: Business logic is encapsulated in commands, promoting single responsibility
|
|
4. **Factory Pattern**: Object creation is standardized through factories
|
|
5. **Split Settings**: Environment-specific configuration (development, production)
|
|
6. **Typed Frontend**: Full TypeScript support with generated types for GraphQL operations
|
|
7. **URQL Client**: Modern GraphQL client with built-in caching and auth exchange
|
|
8. **Modular Structure**: Each domain (accounts, customers, services, etc.) has its own:
|
|
- Models
|
|
- Repositories
|
|
- Commands
|
|
- GraphQL types, inputs, queries, and mutations
|
|
- Frontend stores and components
|
|
|
|
## Tech Stack
|
|
|
|
### Backend
|
|
- Python 3.11+
|
|
- Django 4.2+
|
|
- Graphene-Django (GraphQL)
|
|
- graphql-jwt (Authentication)
|
|
- PostgreSQL
|
|
- Redis (caching)
|
|
|
|
### Frontend
|
|
- SvelteKit
|
|
- TypeScript
|
|
- URQL (GraphQL client)
|
|
- TailwindCSS
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
nexus-3/
|
|
├── backend/
|
|
│ ├── config/
|
|
│ │ └── settings/
|
|
│ │ ├── base.py
|
|
│ │ ├── development.py
|
|
│ │ └── production.py
|
|
│ ├── core/
|
|
│ │ ├── models/ # Domain models
|
|
│ │ ├── repositories/ # Data access layer
|
|
│ │ ├── commands/ # Business logic
|
|
│ │ ├── factories/ # Object creation
|
|
│ │ ├── services/ # Service layer
|
|
│ │ └── utils/ # Utilities
|
|
│ └── graphql_api/
|
|
│ ├── types/ # GraphQL types
|
|
│ ├── inputs/ # GraphQL input types
|
|
│ ├── queries/ # GraphQL queries
|
|
│ └── mutations/ # GraphQL mutations
|
|
├── frontend/
|
|
│ └── src/
|
|
│ ├── lib/
|
|
│ │ ├── components/ # UI components by domain
|
|
│ │ ├── graphql/ # GraphQL client & operations
|
|
│ │ └── stores/ # Svelte stores by domain
|
|
│ └── routes/ # SvelteKit routes
|
|
└── docker-compose.yml
|
|
```
|
|
|
|
## Quick Start
|
|
|
|
### Prerequisites
|
|
- Python 3.11+
|
|
- Node.js 18+
|
|
- PostgreSQL 15+ (or use Docker)
|
|
- Redis (optional, for caching)
|
|
|
|
### Using Docker (Recommended)
|
|
|
|
```bash
|
|
# Clone the repository
|
|
git clone <repository-url>
|
|
cd nexus-3
|
|
|
|
# Copy environment file
|
|
cp backend/.env.example backend/.env
|
|
# Edit backend/.env with your settings
|
|
|
|
# Start all services
|
|
docker-compose up -d
|
|
|
|
# Run migrations
|
|
docker-compose exec backend python manage.py migrate
|
|
|
|
# Create a superuser
|
|
docker-compose exec backend python manage.py createsuperuser
|
|
```
|
|
|
|
### Manual Setup
|
|
|
|
#### Backend
|
|
|
|
```bash
|
|
cd backend
|
|
|
|
# Create virtual environment
|
|
python -m venv .venv
|
|
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
|
|
# Install dependencies
|
|
pip install -r requirements.txt
|
|
|
|
# Copy environment file
|
|
cp .env.example .env
|
|
# Edit .env with your settings
|
|
|
|
# Run migrations
|
|
python manage.py migrate
|
|
|
|
# Create superuser
|
|
python manage.py createsuperuser
|
|
|
|
# Start development server
|
|
python manage.py runserver
|
|
```
|
|
|
|
#### Frontend
|
|
|
|
```bash
|
|
cd frontend
|
|
|
|
# Install dependencies
|
|
npm install
|
|
|
|
# Start development server
|
|
npm run dev
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### Backend Environment Variables
|
|
|
|
| Variable | Description | Default |
|
|
|----------|-------------|---------|
|
|
| `DJANGO_SETTINGS_MODULE` | Settings module to use | `config.settings.development` |
|
|
| `DJANGO_SECRET_KEY` | Django secret key (production) | - |
|
|
| `DEV_SECRET_KEY` | Django secret key (development) | - |
|
|
| `DB_NAME` | Database name | `nexus` |
|
|
| `DB_USER` | Database user | `postgres` |
|
|
| `DB_PASSWORD` | Database password | - |
|
|
| `DB_HOST` | Database host | `localhost` |
|
|
| `DB_PORT` | Database port | `5432` |
|
|
| `REDIS_URL` | Redis connection URL | `redis://localhost:6379/1` |
|
|
| `SENTRY_DSN` | Sentry DSN for error tracking | - |
|
|
|
|
### Frontend Environment Variables
|
|
|
|
| Variable | Description | Default |
|
|
|----------|-------------|---------|
|
|
| `PUBLIC_GRAPHQL_URL` | GraphQL API endpoint | `http://localhost:8000/graphql/` |
|
|
|
|
## GraphQL API
|
|
|
|
The GraphQL API is available at `/graphql/`. In development, you can use the GraphiQL interface to explore the schema.
|
|
|
|
### Example Query
|
|
|
|
```graphql
|
|
query GetAccounts {
|
|
accounts {
|
|
id
|
|
name
|
|
customer {
|
|
id
|
|
name
|
|
}
|
|
services {
|
|
id
|
|
status
|
|
scheduledDate
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Example Mutation
|
|
|
|
```graphql
|
|
mutation CreateAccount($input: AccountCreateInput!) {
|
|
createAccount(input: $input) {
|
|
account {
|
|
id
|
|
name
|
|
}
|
|
errors
|
|
}
|
|
}
|
|
```
|
|
|
|
## Core Entities
|
|
|
|
- **Customers**: Client organizations
|
|
- **Accounts**: Individual locations/sites belonging to customers
|
|
- **Services**: Scheduled service visits
|
|
- **Projects**: Multi-service projects
|
|
- **Invoices**: Billing records
|
|
- **Labor**: Labor tracking records
|
|
- **Revenue**: Revenue tracking
|
|
- **Schedules**: Employee schedules
|
|
- **Reports**: Generated reports
|
|
- **Punchlists**: Customizable service checklists
|
|
|
|
## Customizing the Punchlist Feature
|
|
|
|
The Punchlist model is designed to be customizable for your specific service workflow. The default fields provide a generic structure with sections for:
|
|
|
|
- Front area (customer-facing)
|
|
- Main work area
|
|
- Equipment
|
|
- Back area
|
|
- End of visit checklist
|
|
|
|
To customize:
|
|
|
|
1. Edit `backend/core/models/punchlists/punchlists.py` to add/remove/rename fields
|
|
2. Update `backend/graphql_api/types/punchlists.py` to expose the new fields
|
|
3. Update `backend/graphql_api/inputs/punchlists/punchlists.py` for create/update inputs
|
|
4. Run `python manage.py makemigrations` and `python manage.py migrate`
|
|
5. Update the frontend components accordingly
|
|
|
|
## Development
|
|
|
|
### Running Tests
|
|
|
|
```bash
|
|
# Backend tests
|
|
cd backend
|
|
python manage.py test
|
|
|
|
# Frontend tests
|
|
cd frontend
|
|
npm run test
|
|
```
|
|
|
|
### Code Style
|
|
|
|
```bash
|
|
# Backend (using black and isort)
|
|
cd backend
|
|
black .
|
|
isort .
|
|
|
|
# Frontend (using prettier and eslint)
|
|
cd frontend
|
|
npm run lint
|
|
npm run format
|
|
```
|
|
|
|
## Deployment
|
|
|
|
### Production Checklist
|
|
|
|
1. Set `DJANGO_SETTINGS_MODULE=config.settings.production`
|
|
2. Generate a strong `DJANGO_SECRET_KEY`
|
|
3. Configure PostgreSQL with proper credentials
|
|
4. Set up Redis for caching
|
|
5. Configure ALLOWED_HOSTS and CORS settings
|
|
6. Set up SSL/TLS
|
|
7. Configure email settings
|
|
8. (Optional) Set up Sentry for error tracking
|
|
|
|
## License
|
|
|
|
MIT License - See LICENSE file for details.
|