167 lines
6.6 KiB
PHP
167 lines
6.6 KiB
PHP
<?php
|
|
|
|
/**
|
|
* API Routes
|
|
* Professional Resume Builder - Laravel Application
|
|
*
|
|
* @author David Valera Melendez <david@valera-melendez.de>
|
|
* @created 2025-08-08
|
|
* @location Made in Germany 🇩🇪
|
|
*/
|
|
|
|
use App\Http\Controllers\Api\AuthController;
|
|
use App\Http\Controllers\Api\ResumeController;
|
|
use App\Http\Controllers\Api\TemplateController;
|
|
use App\Http\Controllers\Api\UserController;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Route;
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| API Routes
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Here is where you can register API routes for your application. These
|
|
| routes are loaded by the RouteServiceProvider and all of them will
|
|
| be assigned to the "api" middleware group. Make something great!
|
|
|
|
|
*/
|
|
|
|
// Public API Routes
|
|
Route::prefix('v1')->group(function () {
|
|
// Authentication
|
|
Route::prefix('auth')->group(function () {
|
|
Route::post('login', [AuthController::class, 'login']);
|
|
Route::post('register', [AuthController::class, 'register']);
|
|
Route::post('forgot-password', [AuthController::class, 'forgotPassword']);
|
|
Route::post('reset-password', [AuthController::class, 'resetPassword']);
|
|
Route::post('refresh', [AuthController::class, 'refresh']);
|
|
});
|
|
|
|
// Public Templates
|
|
Route::get('templates', [TemplateController::class, 'index']);
|
|
Route::get('templates/{template}', [TemplateController::class, 'show']);
|
|
|
|
// Public Resume Views
|
|
Route::get('resumes/public/{publicUrl}', [ResumeController::class, 'showPublic']);
|
|
});
|
|
|
|
// Protected API Routes
|
|
Route::middleware(['auth:sanctum', 'throttle:60,1'])->prefix('v1')->group(function () {
|
|
// Authentication
|
|
Route::prefix('auth')->group(function () {
|
|
Route::post('logout', [AuthController::class, 'logout']);
|
|
Route::get('me', [AuthController::class, 'me']);
|
|
Route::put('profile', [AuthController::class, 'updateProfile']);
|
|
Route::put('password', [AuthController::class, 'updatePassword']);
|
|
});
|
|
|
|
// User Management
|
|
Route::prefix('user')->group(function () {
|
|
Route::get('profile', [UserController::class, 'profile']);
|
|
Route::put('profile', [UserController::class, 'updateProfile']);
|
|
Route::post('avatar', [UserController::class, 'uploadAvatar']);
|
|
Route::delete('avatar', [UserController::class, 'deleteAvatar']);
|
|
Route::get('stats', [UserController::class, 'stats']);
|
|
Route::delete('account', [UserController::class, 'deleteAccount']);
|
|
});
|
|
|
|
// Resume Management
|
|
Route::apiResource('resumes', ResumeController::class);
|
|
Route::prefix('resumes')->group(function () {
|
|
Route::post('{resume}/duplicate', [ResumeController::class, 'duplicate']);
|
|
Route::post('{resume}/make-public', [ResumeController::class, 'makePublic']);
|
|
Route::post('{resume}/make-private', [ResumeController::class, 'makePrivate']);
|
|
Route::post('{resume}/autosave', [ResumeController::class, 'autosave']);
|
|
Route::get('{resume}/download-pdf', [ResumeController::class, 'downloadPdf']);
|
|
Route::get('{resume}/analytics', [ResumeController::class, 'analytics']);
|
|
Route::post('{resume}/sections/{section}', [ResumeController::class, 'updateSection']);
|
|
});
|
|
|
|
// Templates
|
|
Route::get('templates', [TemplateController::class, 'index']);
|
|
Route::get('templates/{template}', [TemplateController::class, 'show']);
|
|
Route::get('templates/{template}/preview', [TemplateController::class, 'preview']);
|
|
});
|
|
|
|
// Admin API Routes
|
|
Route::middleware(['auth:sanctum', 'admin', 'throttle:100,1'])->prefix('v1/admin')->group(function () {
|
|
// User Management
|
|
Route::apiResource('users', AdminUserController::class);
|
|
Route::post('users/{user}/activate', [AdminUserController::class, 'activate']);
|
|
Route::post('users/{user}/deactivate', [AdminUserController::class, 'deactivate']);
|
|
|
|
// Template Management
|
|
Route::apiResource('templates', AdminTemplateController::class);
|
|
|
|
// Analytics
|
|
Route::get('analytics/dashboard', [AdminAnalyticsController::class, 'dashboard']);
|
|
Route::get('analytics/users', [AdminAnalyticsController::class, 'users']);
|
|
Route::get('analytics/resumes', [AdminAnalyticsController::class, 'resumes']);
|
|
|
|
// System
|
|
Route::get('system/health', [AdminSystemController::class, 'health']);
|
|
Route::get('system/logs', [AdminSystemController::class, 'logs']);
|
|
});
|
|
|
|
// Health Check
|
|
Route::get('health', function () {
|
|
return response()->json([
|
|
'status' => 'ok',
|
|
'service' => 'Professional Resume Builder API',
|
|
'version' => 'v1',
|
|
'timestamp' => now()->toISOString(),
|
|
'author' => 'David Valera Melendez',
|
|
'location' => 'Made in Germany 🇩🇪'
|
|
]);
|
|
});
|
|
|
|
// API Documentation
|
|
Route::get('docs', function () {
|
|
return response()->json([
|
|
'name' => 'Professional Resume Builder API',
|
|
'version' => 'v1',
|
|
'description' => 'Enterprise-grade API for resume building and management',
|
|
'author' => 'David Valera Melendez',
|
|
'email' => 'david@valera-melendez.de',
|
|
'location' => 'Made in Germany 🇩🇪',
|
|
'endpoints' => [
|
|
'authentication' => '/api/v1/auth',
|
|
'users' => '/api/v1/user',
|
|
'resumes' => '/api/v1/resumes',
|
|
'templates' => '/api/v1/templates',
|
|
'admin' => '/api/v1/admin'
|
|
],
|
|
'documentation' => 'https://docs.valera-melendez.de/resume-builder-api'
|
|
]);
|
|
});
|
|
|
|
// Rate Limited Public Endpoints
|
|
Route::middleware(['throttle:30,1'])->prefix('v1/public')->group(function () {
|
|
// Contact form
|
|
Route::post('contact', [PublicController::class, 'contact']);
|
|
|
|
// Newsletter subscription
|
|
Route::post('newsletter', [PublicController::class, 'newsletter']);
|
|
|
|
// Template preview requests
|
|
Route::post('template-preview', [PublicController::class, 'templatePreview']);
|
|
});
|
|
|
|
// Webhook Endpoints
|
|
Route::prefix('webhooks')->group(function () {
|
|
Route::post('stripe', [WebhookController::class, 'stripe'])->name('webhooks.stripe');
|
|
Route::post('mailgun', [WebhookController::class, 'mailgun'])->name('webhooks.mailgun');
|
|
Route::post('analytics', [WebhookController::class, 'analytics'])->name('webhooks.analytics');
|
|
});
|
|
|
|
// Fallback for undefined API routes
|
|
Route::fallback(function () {
|
|
return response()->json([
|
|
'error' => 'Endpoint not found',
|
|
'message' => 'The requested API endpoint does not exist.',
|
|
'available_versions' => ['v1'],
|
|
'documentation' => 'https://docs.valera-melendez.de/resume-builder-api'
|
|
], 404);
|
|
});
|