{"id":46278519,"url":"https://github.com/ddthien-coder/infra-app","last_synced_at":"2026-05-09T08:04:08.018Z","repository":{"id":311856088,"uuid":"1044952853","full_name":"ddthien-coder/infra-app","owner":"ddthien-coder","description":"Repo Management ITAMS for Infra admin","archived":false,"fork":false,"pushed_at":"2026-05-06T04:07:45.000Z","size":2751,"stargazers_count":8,"open_issues_count":0,"forks_count":4,"subscribers_count":0,"default_branch":"deploy","last_synced_at":"2026-05-06T05:21:29.770Z","etag":null,"topics":["ai","assets-management","docker","documentation","infra","infra-admin","it","itams","nextjs","nextjs15","nodejs","pm2","postgresql","prisma-orm","rbac","react","redis","tailwindcss-v4"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ddthien-coder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"docs/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["infra-app"],"ko_fi":"ddthien"}},"created_at":"2025-08-26T12:49:18.000Z","updated_at":"2026-05-06T04:07:49.000Z","dependencies_parsed_at":"2025-08-27T10:58:27.030Z","dependency_job_id":"825a159a-94be-416e-8772-166c4e41f6e2","html_url":"https://github.com/ddthien-coder/infra-app","commit_stats":null,"previous_names":["ddthien-coder/infra-app"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/ddthien-coder/infra-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddthien-coder%2Finfra-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddthien-coder%2Finfra-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddthien-coder%2Finfra-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddthien-coder%2Finfra-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ddthien-coder","download_url":"https://codeload.github.com/ddthien-coder/infra-app/tar.gz/refs/heads/deploy","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddthien-coder%2Finfra-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32811662,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T08:22:46.396Z","status":"online","status_checked_at":"2026-05-09T02:00:06.633Z","response_time":123,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","assets-management","docker","documentation","infra","infra-admin","it","itams","nextjs","nextjs15","nodejs","pm2","postgresql","prisma-orm","rbac","react","redis","tailwindcss-v4"],"created_at":"2026-03-04T05:08:25.052Z","updated_at":"2026-05-09T08:04:08.003Z","avatar_url":"https://github.com/ddthien-coder.png","language":"TypeScript","funding_links":["https://github.com/sponsors/infra-app","https://ko-fi.com/ddthien","https://ko-fi.com/N4N41Q0RRZ"],"categories":[],"sub_categories":[],"readme":"# IT Asset Management System (ITAMS) | [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/N4N41Q0RRZ)\nA comprehensive IT asset management solution built with modern web technologies.\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Key Features](#key-features)\n- [Tech Stack](#tech-stack)\n- [Architecture](#architecture)\n- [Installation](#installation)\n- [Database Schema](#database-schema)\n- [API Documentation](#api-documentation)\n- [Agent API](#agent-api)\n- [Excel Import/Export](#excel-importexport)\n- [Role-Based Access Control](#role-based-access-control)\n- [Caching with Redis](#caching-with-redis)\n- [Internationalization](#internationalization)\n- [Deployment](#deployment)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Overview\n\nThe IT Asset Management System (ITAMS) is a comprehensive solution for organizations to track, manage, and optimize their IT assets. The system provides multi-tenant support, allowing different organizations to use the same instance while maintaining data isolation.\n\nBuilt with modern technologies like Next.js 15, TypeScript, and Prisma ORM, ITAMS offers a responsive, performant interface with real-time data visualization and comprehensive asset tracking capabilities.\n\n## Key Features\n\n### Core Modules\n\n1. **User \u0026 Tenant Management**\n   - Multi-tenant architecture with data isolation\n   - Role-based access control (RBAC)\n   - User authentication and authorization\n   - Profile management\n\n2. **IT Asset Management**\n   - **PC Assets**: Track desktop computers with detailed specifications (CPU, RAM, storage, etc.)\n   - **Laptop Assets**: Manage portable devices with warranty and purchase information\n   - **Printer Assets**: Monitor printers and multifunction devices with network details\n   - **License Assets**: Track software licenses and compliance with expiration dates\n   - **Warehouse IT**: Manage inventory in storage with barcode tracking\n   - **Internet \u0026 Wifi Assets**: Track internet connections, Wifi networks, and access permissions\n\n3. **Excel Import/Export**\n   - Template-based data import for all asset types\n   - Bulk export functionality with department filtering\n   - Data validation during import\n   - Support for custom fields in exports\n\n4. **Custom Fields**\n   - Tenant-specific custom fields\n   - Support for various data types (text, textarea, number, date, boolean, select)\n   - JSON storage for flexibility\n   - Inline editing in asset lists\n   - Automatic integration in asset forms\n   - Required field validation\n   - CRUD management interface\n\n5. **Dashboard \u0026 Analytics**\n   - Real-time asset overview with key metrics\n   - Interactive charts for asset distribution by type, status, department\n   - Custom field statistics visualization\n   - Asset growth trends over time\n   - Component breakdown for PCs (CPUs, monitors, UPS devices)\n\n6. **Audit Trail \u0026 History**\n   - Complete audit trail for all changes\n   - Change tracking for all assets with before/after values\n   - User activity monitoring\n   - Configurable retention policies\n\n7. **Agent Integration**\n   - Automated computer configuration data submission\n   - MAC address-based duplicate detection\n   - Real-time synchronization with client agents\n\n### Technical Features\n\n- Full internationalization support (English \u0026 Traditional Chinese)\n- Responsive design for all device sizes\n- Server-side rendering (SSR) with client-side enhancements\n- RESTful API architecture with comprehensive endpoints\n- Comprehensive error handling and validation\n- Performance optimization with Redis caching\n- Security headers and best practices implementation\n- Dark/light theme support\n\n## Tech Stack\n\n### Frontend\n- **Next.js 15** (App Router) - React framework with SSR/CSR capabilities\n- **TypeScript** - Type-safe JavaScript development\n- **Tailwind CSS** - Utility-first CSS framework\n- **Shadcn/UI** - Reusable component library built on Radix UI\n- **React Query** - Server state management with automatic caching\n- **Recharts** - Declarative charting library for data visualization\n- **Zod** - Schema validation for form and API data\n\n### Backend\n- **Next.js API Routes** - Serverless API endpoints\n- **Prisma ORM** - Type-safe database toolkit and ORM\n- **PostgreSQL 17** - Relational database with full-text search\n- **Redis** - Caching layer for improved performance\n- **JSON Web Tokens (JWT)** - Secure authentication\n\n### Development \u0026 Deployment\n- **Node.js 18+** - JavaScript runtime\n- **npm** - Package manager\n- **Docker** - Containerization support\n- **PM2** - Process manager for production deployment\n- **Nginx** - Reverse proxy and load balancing (optional)\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                        Client Layer                         │\n├─────────────────────────────────────────────────────────────┤\n│  ┌─────────────┐  ┌──────────────┐  ┌────────────────────┐ │\n│  │   Browser   │  │   Mobile     │  │   Desktop Apps     │ │\n│  └─────────────┘  └──────────────┘  └────────────────────┘ │\n├─────────────────────────────────────────────────────────────┤\n│                      Application Layer                      │\n├─────────────────────────────────────────────────────────────┤\n│  ┌─────────────┐  ┌──────────────┐  ┌────────────────────┐ │\n│  │   Next.js   │  │  API Routes  │  │  React Components  │ │\n│  │  (Frontend) │  │  (Backend)   │  │     (UI Layer)     │ │\n│  └─────────────┘  └──────────────┘  └────────────────────┘ │\n├─────────────────────────────────────────────────────────────┤\n│                       Service Layer                         │\n├─────────────────────────────────────────────────────────────┤\n│  ┌─────────────┐  ┌──────────────┐  ┌────────────────────┐ │\n│  │   Prisma    │  │   Utility    │  │     Business       │ │\n│  │     ORM     │  │   Helpers    │  │    Logic           │ │\n│  └─────────────┘  └──────────────┘  └────────────────────┘ │\n├─────────────────────────────────────────────────────────────┤\n│                    Data \u0026 Cache Layer                       │\n├─────────────────────────────────────────────────────────────┤\n│  ┌─────────────┐  ┌──────────────┐  ┌────────────────────┐ │\n│  │ PostgreSQL  │  │    Redis     │  │   File Storage     │ │\n│  │     17      │  │   Cache      │  │   (Templates)      │ │\n│  └─────────────┘  └──────────────┘  └────────────────────┘ │\n└─────────────────────────────────────────────────────────────┘\n```\n\n## Installation\n\n### Prerequisites\n\n- Node.js 18+ installed\n- PostgreSQL 17 installed\n- Redis server installed\n- npm or yarn package manager\n\n### Steps\n\n1. **Clone the repository**\n   ```bash\n   git clone \u003crepository-url\u003e\n   cd itams\n   ```\n\n2. **Set up environment variables**\n   Create a `.env` file in the root directory:\n   ```env\n   DATABASE_URL=\"postgresql://postgres:Abcd_2025@localhost:5432/infrasys_db?schema=public\"\n   JWT_SECRET=\"your-secret-key\"\n   REDIS_URL=\"redis://localhost:6379\"\n   ```\n\n3. **Set up the database**\n   ```bash\n   npx prisma migrate dev --name init\n   npx prisma generate\n   ```\n4. **Install dependencies**\n   ```bash\n   npm install\n   ```\n\n5. **Seed the database (optional)**\n   ```bash\n   npm run seed\n   ```\n\n6. **Start Redis server**\n   ```bash\n   redis-server\n   ```\n\n7. **Start the development server**\n   ```bash\n   npm run dev\n   ```\n\n8. **Access the application**\n   Open your browser and navigate to `http://localhost:3001`\n\n## Database Schema\n\nThe database schema is designed with multi-tenancy in mind, featuring the following main entities:\n\n- **Tenant** - Organization/container for all data with complete isolation\n- **User** - System users with role-based access and authentication\n- **Role** - User roles with configurable permissions\n- **PC** - Desktop computer assets with component tracking\n- **Laptop** - Portable computer assets with warranty information\n- **Printer** - Printing device assets with network details\n- **License** - Software license assets with expiration tracking\n- **WarehouseIT** - Storage inventory assets with barcode management\n- **Internet** - Internet connection assets with access control\n- **CustomField** - Tenant-specific custom fields for extensibility\n- **History** - Audit trail for all changes with detailed logging\n\nEach asset type supports custom fields stored as JSON, allowing tenants to extend the data model without schema changes.\n\nFor detailed schema information, refer to `prisma/schema.prisma`.\n\n## API Documentation\n\nAll API endpoints follow RESTful conventions and are organized by resource:\n\n### Authentication\n- `POST /api/auth/login` - User login with email and password\n- `DELETE /api/auth/logout` - User logout and session cleanup\n\n### Tenants\n- `GET /api/tenants` - List all tenants (admin only)\n- `POST /api/tenants` - Create a new tenant (admin only)\n- `GET /api/tenants/:id` - Get a specific tenant\n- `PUT /api/tenants/:id` - Update a tenant (admin only)\n- `DELETE /api/tenants/:id` - Delete a tenant (admin only)\n\n### Users\n- `GET /api/users` - List users in the current tenant\n- `POST /api/users` - Create a new user\n- `GET /api/users/:id` - Get a specific user\n- `PUT /api/users/:id` - Update a user\n- `DELETE /api/users/:id` - Delete a user\n\n### Assets\nEach asset type has a complete CRUD API:\n- `GET /api/assets/pc` - List PC assets with pagination and search\n- `POST /api/assets/pc` - Create a new PC asset\n- `GET /api/assets/pc/:id` - Get a specific PC asset\n- `PUT /api/assets/pc/:id` - Update a PC asset\n- `DELETE /api/assets/pc/:id` - Delete a PC asset\n\nSimilar endpoints exist for `laptop`, `printer`, `license`, `warehouse`, and `internet` asset types.\n\n### Agent API\n- `POST /api/agent` - Submit computer configuration data from agent software\n- `GET /api/agent` - Health check endpoint\n\n### Custom Fields\n- `GET /api/custom-fields` - List custom fields for the current tenant\n- `POST /api/custom-fields` - Create a new custom field\n- `PUT /api/custom-fields/:id` - Update a custom field\n- `DELETE /api/custom-fields/:id` - Delete a custom field\n\n### Dashboard\n- `GET /api/dashboard/summary` - Get dashboard summary data\n\n## Agent API\n\nThe Agent API allows computer agent software to automatically submit computer configuration data to the ITAMS system. The agent software should send updated information every 5-10 minutes to keep the system synchronized with actual computer configurations.\n\n### Endpoint\n`POST /api/agent`\n\n### Request Body\nThe request body should be a JSON object containing computer configuration data:\n\n```json\n{\n  \"pcName\": \"SGDH-IT-DTHIEN\",\n  \"userName\": \"thien.dinh\",\n  \"ipAddress\": \"10.1.1.10\",\n  \"cpu\": \"Intel Core i5-10400\",\n  \"ram\": \"32GB DDR4\",\n  \"os\": \"Windows 10 Pro 21H2\",\n  \"harddisk\": \"1TB NVMe SSD\",\n  \"motherboard\": \"ASUS Prime B460M-A\",\n  \"graphics\": \"Intel UHD Graphics 630\",\n  \"macAddress\": \"00:1A:2B:3C:4D:5E\",\n  \"office\": \"Microsoft Office 2021\"\n}\n```\n\n### MAC Address Identification\n\nThe system supports identifying existing computers by MAC address to prevent duplicate entries when a computer's name or other details change. To enable this functionality:\n\n1. Create a custom field named \"MAC\" for the PC asset type\n2. Include the `macAddress` field in agent data submissions\n3. The system will automatically check for existing PCs with the same MAC address and update them instead of creating new records\n\n### Field Mapping\nThe agent fields are mapped to database custom fields as follows:\n- `cpu` → `CPU`\n- `ram` → `RAM`\n- `os` → `OS`\n- `ipAddress` → `IP`\n- `harddisk` → `HARDISK`\n- `motherboard` → `MOTHERBOARD`\n- `graphics` → `GRAPHICS`\n- `macAddress` → `MAC`\n- `office` → `OFFICE`\n\n### Response\n- `201 Created` - Data successfully processed\n- `400 Bad Request` - Missing required fields or invalid data\n- `500 Internal Server Error` - Server error\n\n### Example Usage\n```javascript\nconst agentData = {\n  pcName: 'SGDH-IT-DTHIEN',\n  userName: 'thien.dinh',\n  ipAddress: '10.1.1.10',\n  cpu: 'Intel Core i5-10400',\n  ram: '32GB DDR4',\n  os: 'Windows 10 Pro 21H2',\n  harddisk: '1TB NVMe SSD',\n  motherboard: 'ASUS Prime B460M-A',\n  graphics: 'Intel UHD Graphics 630',\n  macAddress: '00:1A:2B:3C:4D:5E',\n  office: 'Microsoft Office 2021'\n};\n\nfetch('/api/agent', {\n  method: 'POST',\n  headers: {\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify(agentData)\n})\n.then(response =\u003e response.json())\n.then(data =\u003e console.log('Success:', data))\n.catch(error =\u003e console.error('Error:', error));\n```\n\n## Excel Import/Export\n\nThe ITAMS provides comprehensive Excel import/export capabilities for all asset types with template-based workflows.\n\n### Export Features\n\n1. **Individual Asset Type Export**\n   - Export any single asset type (PC, Laptop, Printer, License, Warehouse, Internet, IT Purchasing) to a dedicated Excel template\n   - Available from each asset list page with \"Export\" button\n   - Options to export all items, items by department, or only selected items\n\n2. **Department-Based Export**\n   - Export assets filtered by department (IT, HR, Finance, Operations)\n   - Available for all asset types\n   - Provides targeted data exports for specific organizational units\n\n3. **Custom Fields Support**\n   - All custom fields are automatically included in exports\n   - Template columns are dynamically generated based on configured custom fields\n\n### Import Features\n\n1. **Template-Based Import**\n   - Download pre-formatted templates for each asset type\n   - Column mapping interface for flexible data import\n   - Automatic field type validation\n\n2. **Data Validation**\n   - Real-time validation during import process\n   - Detailed error reporting with row-by-row feedback\n   - Support for partial imports with error skipping\n\n3. **Batch Processing \u0026 Architecture**\n   - Handle large datasets with progress tracking\n   - Estimated time remaining calculations\n   - Support for partial imports with error skipping\n   - Strategy-based pattern for generic, type-safe exports\n   - O(1) database batching to resolve N+1 query patterns\n\n### Technical Implementation\n\n- Uses `xlsx-populate` library for robust Excel template handling\n- Backend API routes handle data fetching, validation, and Excel generation\n- Frontend dialogs provide user interface for export/import options\n- Supports filtering by selection and department for targeted operations\n\n## Role-Based Access Control\n\nThe system implements role-based access control (RBAC) to restrict access to certain features based on the user's role. There are two default roles in the system with configurable permissions:\n\n### Roles\n\n1. **Admin** - Has full access to all features:\n   - View, create, edit, delete, and bulk delete all resources\n   - Manage tenant settings and configurations\n   - View and edit audit logs\n   - Full access to agent API\n\n2. **User** - Has limited access to features:\n   - View and manage their own profile\n   - View tenants (read-only)\n   - View, create, edit, and delete assets\n   - Limited access to settings (read-only)\n\n### Implementation\n\nThe RBAC system is implemented through:\n\n- **Permissions Library** (`src/lib/permissions.ts`): Core permission checking functions with caching\n- **Navigation Filtering** (`src/components/layout/navigation.tsx`): Filters sidebar menu items based on user role\n- **Permission Hook** (`src/hooks/use-permissions.ts`): Provides easy access to permission checks in components\n- **Component-Level Access Control**: Pages and components conditionally render actions based on permissions\n- **API-Level Authorization**: All API endpoints check permissions before processing requests\n\nPermissions are cached in Redis for improved performance and automatically invalidated when roles are updated.\n\n## Caching with Redis\n\nThe ITAMS uses Redis as a caching layer to improve performance and reduce database load.\n\n### Cache Implementation\n\n- **Tag-based Invalidation System**: High-performance, O(1) complexity cache invalidation ensuring immediate data consistency without blocking operations.\n\n- **Asset Lists**: Cached with 2-minute TTL for frequently accessed asset lists\n- **Individual Assets**: Cached with 5-minute TTL for detailed asset views\n- **Permissions**: Cached with 5-minute TTL for role-based access control\n- **Custom Fields**: Cached with 10-minute TTL for tenant-specific configurations\n- **Dashboard Data**: Cached with 2-minute TTL for real-time metrics\n\n### Cache Invalidation\n\nThe system automatically invalidates cache entries when:\n- Assets are created, updated, or deleted\n- Permissions are modified\n- Custom fields are updated\n- User roles change\n\n### Redis Setup\n\n1. Install Redis server:\n   ```bash\n   # Ubuntu/Debian\n   sudo apt-get install redis-server\n   \n   # macOS\n   brew install redis\n   ```\n\n2. Start Redis server:\n   ```bash\n   redis-server\n   ```\n\n3. Configure Redis URL in `.env`:\n   ```env\n   REDIS_URL=\"redis://localhost:6379\"\n   ```\n\n### Testing Redis Connectivity\n\nYou can test Redis connectivity with the provided test script:\n\n```bash\nnpm run test:redis-connection\n```\n\n## Internationalization\n\nThe application supports full internationalization with English (default) and Traditional Chinese language packs.\n\n### Implementation\n\n- **Language Detection**: Automatic detection based on browser settings with manual override\n- **Translation Files**: JSON-based translation files in `src/locales/`\n- **Dynamic Loading**: Language files loaded on-demand for optimal performance\n- **Component Integration**: `useTranslation` hook for easy translation in components\n- **Server/Client Support**: Works in both server-side rendering and client-side contexts\n\n### Adding New Languages\n\n1. Create a new translation file in `src/locales/` (e.g., `fr.json`)\n2. Add the language to `supportedLanguages` in `src/lib/i18n.ts`\n3. Update the language switcher in the UI\n\n### Translation Usage\n\n```typescript\nimport { useTranslation } from '@/hooks/use-translation';\n\nexport default function MyComponent() {\n  const { t } = useTranslation();\n  \n  return \u003ch1\u003e{t('dashboard.title')}\u003c/h1\u003e;\n}\n```\n\n## Deployment\n\n### Production Build\n\nTo create a production build:\n\n```bash\nnpm run build:production\n```\n\nThis command builds both the Next.js frontend and compiles the server-side TypeScript files.\n\n### Running in Production\n\n```bash\nnpm start\n```\n\nThis starts the application using the custom server implementation in `server.js`.\n\n### Environment Variables for Production\n\nEnsure the following environment variables are set in production:\n\n```env\nDATABASE_URL=\"your-production-database-url\"\nJWT_SECRET=\"your-production-secret\"\nREDIS_URL=\"redis://your-redis-host:6379\"\nNODE_ENV=\"production\"\nPORT=3000\n```\n\n### PM2 Deployment\n\nFor production deployments, you can use PM2 as a process manager:\n\n1. Install PM2 globally:\n   ```bash\n   npm install -g pm2\n   ```\n\n2. Start the application with PM2:\n   ```bash\n   pm2 start ecosystem.config.js\n   ```\n\n3. Save the PM2 configuration:\n   ```bash\n   pm2 save\n   ```\n\n### Docker Deployment\n\nA Dockerfile is included for containerized deployment:\n\n```bash\n# Build the Docker image\ndocker build -t itams .\n\n# Run the container\ndocker run -p 3000:3000 itams\n```\n\n### Nginx Reverse Proxy\n\nFor production deployments with Nginx, configure a reverse proxy:\n\n```nginx\nserver {\n    listen 80;\n    server_name your-domain.com;\n\n    location / {\n        proxy_pass http://localhost:3000;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection 'upgrade';\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        proxy_cache_bypass $http_upgrade;\n    }\n}\n```\n\n## Contributing\n\nContributions are welcome! Please follow these steps:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/AmazingFeature`)\n3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)\n4. Push to the branch (`git push origin feature/AmazingFeature`)\n5. Open a pull request\n\nPlease ensure your code follows the existing style and includes appropriate tests.\n\n### Development Guidelines\n\n1. **TypeScript**: All code should be written in TypeScript with strict type checking\n2. **Testing**: Add unit tests for new functionality\n3. **Documentation**: Update README.md and code comments as needed\n4. **Commit Messages**: Use clear, descriptive commit messages\n5. **Code Style**: Follow the existing code style and conventions\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Useful Prisma Commands\n\n```bash\n# Create and apply migration\nnpx prisma migrate dev --name \u003cmigration_name\u003e\n\n# Apply pending migrations\nnpx prisma migrate deploy\n\n# Generate Prisma Client\nnpx prisma generate\n\n# Push schema state to database (prototype only)\nnpx prisma db push\n\n# Reset database\nnpx prisma migrate reset --force\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fddthien-coder%2Finfra-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fddthien-coder%2Finfra-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fddthien-coder%2Finfra-app/lists"}