232 lines
7.8 KiB
Markdown
232 lines
7.8 KiB
Markdown
# Desa Darmasaba - Village Management System
|
|
|
|
## Project Overview
|
|
|
|
Desa Darmasaba is a comprehensive Next.js 15 application designed for village management services in Darmasaba, Badung, Bali. The application serves as a digital platform for government services, public information, and community engagement. It features multiple sections including PPID (Public Information Disclosure), health services, security, education, environment, economy, innovation, and more.
|
|
|
|
### Key Technologies
|
|
- **Framework**: Next.js 15 with App Router
|
|
- **Language**: TypeScript with strict mode
|
|
- **Styling**: Mantine UI components with custom CSS
|
|
- **Backend**: Elysia.js API server integrated with Next.js
|
|
- **Database**: PostgreSQL with Prisma ORM
|
|
- **State Management**: Valtio for global state
|
|
- **Authentication**: JWT with iron-session
|
|
|
|
### Architecture
|
|
The application follows a modular architecture with:
|
|
- A main frontend built with Next.js and Mantine UI
|
|
- An integrated Elysia.js API server for backend operations
|
|
- Prisma ORM for database interactions
|
|
- File storage integration with Seafile
|
|
- Multiple domain-specific modules (PPID, health, security, education, etc.)
|
|
|
|
## Building and Running
|
|
|
|
### Prerequisites
|
|
- Node.js (with Bun runtime)
|
|
- PostgreSQL database
|
|
- Seafile server for file storage
|
|
|
|
### Setup Instructions
|
|
1. Install dependencies:
|
|
```bash
|
|
bun install
|
|
```
|
|
|
|
2. Set up environment variables in `.env.local`:
|
|
```
|
|
DATABASE_URL=your_postgresql_connection_string
|
|
SEAFILE_TOKEN=your_seafile_token
|
|
SEAFILE_REPO_ID=your_seafile_repo_id
|
|
SEAFILE_BASE_URL=your_seafile_base_url
|
|
SEAFILE_PUBLIC_SHARE_TOKEN=your_seafile_public_share_token
|
|
SEAFILE_URL=your_seafile_api_url
|
|
WIBU_UPLOAD_DIR=your_upload_directory
|
|
```
|
|
|
|
3. Generate Prisma client:
|
|
```bash
|
|
bunx prisma generate
|
|
```
|
|
|
|
4. Push database schema:
|
|
```bash
|
|
bunx prisma db push
|
|
```
|
|
|
|
5. Seed the database:
|
|
```bash
|
|
bun run prisma/seed.ts
|
|
```
|
|
|
|
6. Run the development server:
|
|
```bash
|
|
bun run dev
|
|
```
|
|
|
|
### Available Scripts
|
|
- `bun run dev` - Start development server
|
|
- `bun run build` - Build for production
|
|
- `bun run start` - Start production server
|
|
- `bun run prisma/seed.ts` - Run database seeding
|
|
- `bunx prisma generate` - Generate Prisma client
|
|
- `bunx prisma db push` - Push schema changes to database
|
|
- `bunx prisma studio` - Open Prisma Studio GUI
|
|
|
|
## Development Conventions
|
|
|
|
### Code Structure
|
|
```
|
|
src/
|
|
├── app/ # Next.js app router pages
|
|
│ ├── admin/ # Admin dashboard pages
|
|
│ ├── api/ # API routes with Elysia.js
|
|
│ ├── darmasaba/ # Public-facing village pages
|
|
│ └── ...
|
|
├── con/ # Constants and configuration
|
|
├── hooks/ # React hooks
|
|
├── lib/ # Utility functions and configurations
|
|
├── middlewares/ # Next.js middleware
|
|
├── state/ # Global state management
|
|
├── store/ # Additional state management
|
|
├── types/ # TypeScript type definitions
|
|
└── utils/ # Utility functions
|
|
```
|
|
|
|
### Import Conventions
|
|
- Use absolute imports with `@/` alias (configured in tsconfig.json)
|
|
- Group imports: external libraries first, then internal modules
|
|
- Keep import statements organized and remove unused imports
|
|
|
|
```typescript
|
|
// External libraries
|
|
import { useState } from 'react'
|
|
import { Button, Stack } from '@mantine/core'
|
|
|
|
// Internal modules
|
|
import ApiFetch from '@/lib/api-fetch'
|
|
import { MyComponent } from '@/components/my-component'
|
|
```
|
|
|
|
### TypeScript Configuration
|
|
- Strict mode enabled (`"strict": true`)
|
|
- Target: ES2017
|
|
- Module resolution: bundler
|
|
- Path alias: `@/*` maps to `./src/*`
|
|
|
|
### Naming Conventions
|
|
- **Components**: PascalCase (e.g., `UploadImage.tsx`)
|
|
- **Files**: kebab-case for utilities (e.g., `api-fetch.ts`)
|
|
- **Variables/Functions**: camelCase
|
|
- **Constants**: UPPER_SNAKE_CASE
|
|
- **Database Models**: PascalCase (Prisma convention)
|
|
|
|
### Error Handling
|
|
- Use try-catch blocks for async operations
|
|
- Implement proper error boundaries in React components
|
|
- Log errors appropriately without exposing sensitive data
|
|
- Use Zod for runtime validation and type safety
|
|
|
|
### API Structure
|
|
- Backend uses Elysia.js with TypeScript
|
|
- API routes are in `src/app/api/[[...slugs]]/` directory
|
|
- Use treaty client for type-safe API calls
|
|
- Follow RESTful conventions for endpoints
|
|
- Include proper HTTP status codes and error responses
|
|
|
|
### Database Operations
|
|
- Use Prisma client from `@/lib/prisma.ts`
|
|
- Database connection includes graceful shutdown handling
|
|
- Use transactions for complex operations
|
|
- Implement proper error handling for database queries
|
|
|
|
### Component Guidelines
|
|
- Use functional components with hooks
|
|
- Implement proper prop types with TypeScript interfaces
|
|
- Use Mantine components for UI consistency
|
|
- Follow atomic design principles when possible
|
|
- Add loading states and error states for async operations
|
|
|
|
### State Management
|
|
- Use Valtio proxies for global state
|
|
- Keep local state in components when possible
|
|
- Use SWR for server state caching
|
|
- Implement optimistic updates for better UX
|
|
|
|
### Styling
|
|
- Primary: Mantine UI components
|
|
- Use Mantine theme system for customization
|
|
- Custom CSS should be minimal and scoped
|
|
- Follow responsive design principles
|
|
- Use semantic HTML5 elements
|
|
|
|
### Security Practices
|
|
- Validate all user inputs with Zod schemas
|
|
- Use JWT tokens for authentication
|
|
- Implement proper CORS configuration
|
|
- Never expose database credentials or API keys
|
|
- Use HTTPS in production
|
|
- Implement rate limiting for sensitive endpoints
|
|
|
|
### Performance Considerations
|
|
- Use Next.js Image optimization
|
|
- Implement proper caching strategies
|
|
- Use React.memo for expensive components
|
|
- Optimize bundle size with dynamic imports
|
|
- Use Prisma query optimization
|
|
|
|
## Domain Modules
|
|
|
|
The application is organized into several domain modules:
|
|
|
|
1. **PPID (Public Information Disclosure)**: Profile, structure, information requests, legal basis
|
|
2. **Health**: Health facilities, programs, emergency response, disease information
|
|
3. **Security**: Community security, emergency contacts, crime prevention
|
|
4. **Education**: Schools, scholarships, educational programs
|
|
5. **Economy**: Local markets, BUMDes, employment data
|
|
6. **Environment**: Environmental data, conservation, waste management
|
|
7. **Innovation**: Digital services, innovation programs
|
|
8. **Culture**: Village traditions, music, cultural preservation
|
|
|
|
Each module has its own section in both the admin panel and public-facing areas.
|
|
|
|
## File Storage Integration
|
|
|
|
The application integrates with Seafile for file storage, with specific handling for:
|
|
- Images and documents
|
|
- Public sharing capabilities
|
|
- CDN URL generation
|
|
- Batch processing of assets
|
|
|
|
## Testing
|
|
|
|
Currently no formal test framework is configured. When adding tests:
|
|
- Consider Jest or Vitest for unit testing
|
|
- Use Playwright for E2E testing
|
|
- Update this section with specific test commands
|
|
|
|
## Deployment
|
|
|
|
The application includes deployment scripts in the `NOTE.md` file that outline:
|
|
- Automated deployment with GitHub API integration
|
|
- Environment-specific configurations
|
|
- PM2 process management
|
|
- Release management with versioning
|
|
|
|
## Troubleshooting
|
|
|
|
Common issues and solutions:
|
|
- **API endpoints returning 404**: Check that environment variables are properly configured
|
|
- **Database connection errors**: Verify DATABASE_URL in environment variables
|
|
- **File upload issues**: Ensure Seafile integration is properly configured
|
|
- **Build failures**: Run `bunx prisma generate` before building
|
|
|
|
## Development Workflow
|
|
|
|
1. Always run type checking before committing: `bunx tsc --noEmit`
|
|
2. Run linting to catch style issues: `bun run eslint .`
|
|
3. Test database changes with `bunx prisma db push`
|
|
4. Use the integrated Swagger docs at `/api/docs` for API testing
|
|
5. Check environment variables are properly configured
|
|
6. Verify responsive design on different screen sizes |