6.0 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Overview
Laravel 10 backend for a VPS/hosting SaaS platform. Provides an admin panel (Livewire), a customer REST API (JWT), and an admin REST API (JWT + Passport), with deep VMware vCenter integration for VM provisioning.
Common Commands
# Dev server
php artisan serve
# Migrations & seeding
php artisan migrate
php artisan db:seed --class=SomeSeeder
# Clear all caches
php artisan cache:clear && php artisan config:clear && php artisan route:clear && php artisan view:clear
# Queue
php artisan queue:work
php artisan horizon
# Tests
php artisan test
php artisan test tests/Feature/SomeTest.php
php artisan test --filter testMethodName
# Swagger docs regeneration
php artisan l5-swagger:generate
Routing
Four route files, each serving a different audience:
| File | Domain/Prefix | Auth | Audience |
|---|---|---|---|
routes/admin.php |
admin.portal.test |
Session (auth + Staff) |
Admin panel web UI |
routes/api.php |
/api/v1/administrator/ |
JWT (admins-api guard) |
Admin REST API |
routes/client.php |
/api/v1/client/ |
JWT (client guard) |
Customer REST API |
routes/web.php |
/ |
None | Public pages |
Middleware aliases:
Staff→StaffCheck— enforces admin session, updateslast_visitedapi.auth→ApiAuthCheck— JWT validation, returns JSON 401 on failureLoginCheck— redirects authenticated users away from login page
Architecture
Controller Layers
app/Http/Controllers/
├── admin/ — Admin panel web controllers (Blade/Livewire views)
├── Api/Admin/ — Admin REST API controllers
├── Api/Client/ — Customer REST API (ClientController)
├── Api/Service/ — Product/order/service endpoints (used by both)
├── Api/Transaction/— Payment and transaction endpoints
└── rest/ — Legacy internal REST endpoints
Repository Pattern
All DB access goes through repositories. Never query models directly in controllers.
app/Repositories/{Domain}/
├── {Domain}Repository.php — Concrete (extends BaseRepository)
├── {Domain}RepositoryInterface.php — Interface
└── {Domain}CachedRepository.php — Redis-cached variant (optional)
BaseRepository provides: create, update, delete, find, getAll, getCount, insert.
Repositories are bound in AppServiceProvider → RepositoryProvider (40+ bindings). Always inject via interface.
Service Layer
Business logic is split across two locations:
app/Services/— Domain services:VMDataService,VMHelperService,WhoisServiceapp/Http/Services/— HTTP-integration services:vCenter.php— VMware vCenter REST API wrapper (Guzzle, SSL disabled for self-signed certs). Key methods:loginServer(),GetConsoleTickets(),getAllVirtualMachine(),checkApiExits(). Token stored in model, refreshed on 'Login_Again' response.WinRMClient.php— Windows Remote Management for VM operationsVNPayService.php— Payment gatewayInvoice/— Invoice generation/processingPusherNotification.php,Telegram.php,Discord.php— Notifications
Dedicated admin service layer: app/Services/Api/Admin/ (ProductService, VCenterService), app/Services/Api/ (ClientAuthService, ServiceService).
Global Helpers
app/Http/Helpers/function_helper.php (auto-loaded via Composer):
setting('group.key')— Read cached settings with dot notationformat_price(amount)— Format as ₫ currencyformat_point(points)— Format loyalty pointsformat_day(date, format)— Date formatting
Enums
Type-safe PHP enums in app/Enums/{Domain}/. Support label() for Vietnamese display text. Key enums: InvoiceStatus, ProductTypeEnums, TransactionStatus, Status, AddonType.
Admin UI
Livewire 3 components in app/Http/Livewire/. Modal pattern uses Alpine.js events:
- Open:
$dispatch('open-{modal-name}')/ listen with@open-{modal-name}.window - Close:
$dispatch('close-{modal-name}')/ listen with@close-{modal-name}.window
Server-side tables use Yajra DataTables.
Auth Guards
| Guard | Driver | Used By |
|---|---|---|
web / admins |
session | Admin panel |
admins-api |
JWT (tymon/jwt-auth) | Admin REST API |
client |
JWT (tymon/jwt-auth) | Customer API (portal-client) |
users-api |
Passport OAuth2 | — |
client-sanctum |
Sanctum | Alternative customer auth |
Key Models
Core business: Customer (UUID PK, JWT subject), Order, Invoice (InvoiceStatus enum), InvoiceItem, Product (slug, cpu/ram/disk/bandwidth/gpu specs), ProductCategories (hierarchical via kalnoy/nestedset).
VMware: vCenter (credentials + token), ModuleVmware (VM instances → orders), ModuleHost, ModuleDatacenter, ModuleNetwork, ModuleIpAddress, ModuleDatastore, ModuleSnapshot.
Finance: Transaction, Payment, Cart, CartAddon.
Support: Ticket, TicketReply, Mail.
Queue Jobs
Async operations in app/Jobs/:
VirtualMachine/ProcessOrderPaymentJob— Payment processing + VM provisioningHosting/,Mail/,Ticket/,Payment/— Domain-specific async tasks
API Response Convention
{ "error": false, "data": {...} }
{ "error": true, "message": "Reason here" }
API Resources in app/Http/Resources/Api/ transform models before response.
Key Integrations
- VMware vCenter —
app/Http/Services/vCenter.php, passwords decrypted viaSignRSAfacade - VNPay —
config/vnpay.php,VNPayService.php - Redis — Caching (cached repositories), sessions, queues
- Pusher — Real-time events
- CKFinder — Admin file browser (custom auth:
CustomCKFinderAuthmiddleware) - L5-Swagger — API docs at
/api/documentation - Spatie Permission — RBAC for admin roles
- Horizon — Queue monitoring at
/horizon