* @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); });