Files
memefast/app/Http/Controllers/UserAIController.php
2025-07-04 12:53:08 +08:00

122 lines
3.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Helpers\FirstParty\Credits\CreditsService;
use App\Jobs\GenerateMemeJob;
use Illuminate\Http\Request;
use App\Models\Category;
use Auth;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
class UserAIController extends Controller
{
public function generateMeme(Request $request)
{
$user = Auth::user();
if (!CreditsService::canSpend($user->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
]
]
]);
}
}