id, 2)) { return response()->json([ 'error' => [ 'message' => 'You do not have enough credits to generate a meme. Please purchase credits from the Store.', ], ]); } CreditsService::spend($user->id, 2); $jobId = Str::uuid()->toString(); Cache::put("meme_job_status_{$jobId}", 'pending', 300); $job = new GenerateMemeJob($user->id, $request->prompt, $jobId); dispatch($job); return response()->json([ 'success' => [ 'data' => [ 'job_id' => $jobId, 'status' => 'pending', ], ], ]); } public function checkMemeJobStatus(Request $request) { $jobId = $request->job_id; if (!$jobId) { return response()->json([ 'error' => [ 'message' => 'Job ID is required.', ], ], 400); } $status = Cache::get("meme_job_status_{$jobId}"); if (!$status) { return response()->json([ 'error' => [ 'message' => 'Job not found or expired.', ], ], 404); } $response = [ 'success' => [ 'data' => [ 'job_id' => $jobId, 'status' => $status, ], ], ]; if ($status === 'completed') { $result = Cache::get("meme_job_result_{$jobId}"); if ($result) { $response['success']['data']['result'] = $result; } } elseif ($status === 'failed') { $error = Cache::get("meme_job_error_{$jobId}"); if ($error) { $response['success']['data']['error'] = $error; } } return response()->json($response); } public function aiHints() { $categories = Category::whereNotNull('keywords') ->inRandomOrder() ->take(8) ->get(); if ($categories->isEmpty()) { return response()->json([ 'success' => [ 'data' => [ 'keywords' => [] ] ] ]); } $keywords = $categories->map(function ($category) { return collect($category->keywords)->random(); })->toArray(); return response()->json([ 'success' => [ 'data' => [ 'keywords' => $keywords ] ] ]); } }