Configuration:
- API Base URL:
/api(hardcoded inadmin/src/lib/api.ts) - Built Location:
admin/dist/assets/api-BEBTEtNV.js - Authentication: JWT Bearer tokens + CSRF tokens
- CORS: Configured in
api/index.php
Connection Flow:
- Admin loads from
/admin/→ servesadmin/dist/index.html - Vue.js app loads → imports API module
- API calls go to
/api/*endpoints - Backend processes requests with middleware stack
Fixed Issues:
- ✅ Admin
index.phpnow properly serves built files fromdist/ - ✅ API base URL correctly set to
/api - ✅ Authentication headers properly configured
Configuration:
- API Base URL:
/api(default, configurable viawindow.CodevChatConfig) - Built Location:
widget/widget.js - Authentication: Session-based (no JWT required for visitors)
- Endpoints Used:
/api/widget/session,/api/widget/chat/send,/api/updates
Connection Flow:
- Widget loads via
<script src="/widget/widget.js"></script> - Configures API URL from
window.CodevChatConfig.apiUrlor defaults to/api - Makes API calls to widget-specific endpoints
- Backend processes with rate limiting and session management
Widget Configuration Example:
<script>
window.CodevChatConfig = {
apiUrl: '/api',
position: 'bottom-right',
autoOpen: false
};
</script>
<script src="/widget/widget.js"></script>Main Entry Point: api/index.php
- ✅ Fixed middleware TypeError (simplified rate limiting middleware)
- ✅ Proper CORS configuration
- ✅ CSRF protection for admin routes
- ✅ Rate limiting for public endpoints
API Endpoints:
/api/healthz- Health check/api/csrf/token- CSRF token generation/api/auth/*- Authentication/api/users/*- User management/api/chat/*- Chat functionality/api/widget/*- Widget-specific endpoints/api/updates- Real-time updates/api/settings/*- Settings management/api/files/*- File uploads/api/canned-responses/*- Canned responses/api/conversation-tags/*- Tag management/api/conversation-transfers/*- Transfer management
# Uses admin.vite.config.mjs
# Input: admin/src/
# Output: admin/dist/
# Base URL: /admin/Generated Files:
admin/dist/index.html- Main HTML with correct asset pathsadmin/dist/assets/index-UGK1aC64.js- Main Vue.js bundleadmin/dist/assets/api-BEBTEtNV.js- API client with/apibase URLadmin/dist/assets/index-oQLmXdor.css- Styles- Component chunks for code splitting
# Uses vite.widget.config.mjs
# Input: widget-src/
# Output: widget/
# Format: IIFE (Immediately Invoked Function Expression)Generated Files:
widget/widget.js- Self-contained widget bundlewidget/widget.js.map- Source mapwidget/assets/css/widget.css- Widget styleswidget/assets/sounds/- Notification sounds
- Admin:
/api(hardcoded in built JS) - Widget:
/api(configurable, defaults to/api) - Backend: Serves from
api/index.php
- Admin CSS:
/admin/assets/index-oQLmXdor.css - Admin JS:
/admin/assets/index-UGK1aC64.js - Widget CSS:
/widget/assets/css/widget.css - Widget JS:
/widget/widget.js
- Admin: JWT Bearer tokens + CSRF tokens
- Widget: Session-based (no authentication required for visitors)
- CSRF: Generated via
/api/csrf/tokenendpoint
-
Build both frontends:
npm run build:admin npm run build:widget
-
Serve admin from
/admin/:admin/index.phpautomatically serves built files- Assets served from
/admin/assets/
-
Serve widget from
/widget/:- Static files:
widget/widget.js,widget/assets/ - Embed via script tag
- Static files:
-
API served from
/api/:- All API endpoints under
/api/* - CORS configured for cross-origin requests
- All API endpoints under
Apache (.htaccess):
RewriteEngine On
# API routes
RewriteRule ^api/(.*)$ api/index.php [QSA,L]
# Admin routes
RewriteRule ^admin/(.*)$ admin/index.php [QSA,L]
# Widget assets
RewriteRule ^widget/(.*)$ widget/$1 [L]
# Fallback to main index
RewriteRule ^(.*)$ index.php [QSA,L]Nginx:
location /api/ {
try_files $uri $uri/ /api/index.php?$query_string;
}
location /admin/ {
try_files $uri $uri/ /admin/index.php?$query_string;
}
location /widget/ {
try_files $uri $uri/ =404;
}- Admin Interface: Visit
/admin/→ should load Vue.js app - API Health: Visit
/api/healthz→ should return JSON - Widget: Include widget script → should show chat bubble
- CSRF Token: Visit
/api/csrf/token→ should return token
# Run the test suite
php vendor/bin/pest --testsuite=unit
php vendor/bin/pest --testsuite=integration
# Run E2E tests
npm run e2e- ✅ Admin index.php: Now properly serves built files from
dist/ - ✅ API Middleware: Fixed TypeError in rate limiting middleware
- ✅ Asset Paths: Correct paths in built HTML files
- ✅ API Base URLs: Consistent
/apibase URL across all components
- Environment Configuration: Use environment variables for API base URL in production
- Asset Versioning: Consider adding version hashes to asset URLs for cache busting
- Error Handling: Add proper error boundaries in Vue.js components
- Monitoring: Add logging for API connection failures
- Security: Ensure CORS is properly configured for production domains