Skip to main content

Black Friday 2025! Only until December 1st: coupon FRIDAY25 for 40% off Yearly/Lifetime membership!

Read more here

theihasan/geezap

97 stars
2 code files
View theihasan/geezap on GitHub

app/Jobs/GenerateCoverLetterJob.php

Open in GitHub
use App\Events\CoverLetterGenerated;
use App\Models\User;
use App\Models\UserApiUsage;
use App\Services\AIService;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
 
class GenerateCoverLetterJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
 
private const DAILY_LIMIT = 50;
 
public function __construct(private readonly User $user, private readonly array $requestData){}
 
public function handle(AIService $aiService): array
{
try {
if (!$this->checkUsageLimit()) {
return [
'message' => 'Daily limit exceeded. Please try again after 24 hours.',
'status' => 429,
'data' => [
'daily_requests' => $this->getDailyUsageCount(),
'limit' => self::DAILY_LIMIT
]
];
}
 
$response = $this->alternateAIProviders($aiService);
logger("AI response received", $response);
 
if ($response['status'] === 200 && !empty($response['data']['response'])) {
logger("Broadcasting event for user: {$this->user->id}", [
'data' => $response['data']
]);
 
CoverLetterGenerated::dispatch($this->user, $response['data'], $this->requestData['id']);
}
 
return $response;
} catch (\Exception $e) {
$this->recordUsage(false);
 
return [
'message' => 'Failed to generate cover letter: ' . $e->getMessage(),
'status' => 500,
'error' => $e->getMessage()
];
}
}
 
private function alternateAIProviders(AIService $aiService): array
{
$dailyCount = $this->getDailyUsageCount();
return $aiService->getChatGPTResponse($this->user, $this->requestData);
}
 
private function checkUsageLimit(): bool
{
return $this->getDailyUsageCount() < self::DAILY_LIMIT;
}
 
private function getDailyUsageCount(): int
{
return UserApiUsage::query()->where('user_id', $this->user->id)
->where('created_at', '>=', now()->subDay())
->count();
}
 
private function recordUsage(bool $wasSuccessful): void
{
UserApiUsage::query()->create([
'user_id' => $this->user->id,
'api_type' => 'cover_letter',
'was_successful' => $wasSuccessful
]);
}
}

app/Http/Controllers/CoverLetterController.php

Open in GitHub
use App\Jobs\GenerateCoverLetterJob;
use Illuminate\Http\Request;
 
class CoverLetterController extends Controller
{
public function coverLetter(Request $request): void
{
GenerateCoverLetterJob::dispatch(auth()->user(), $request->all());
}
}

We'd Love Your Feedback

Tell us what you like or what we can improve

Feel free to share anything you like or dislike about this page or the platform in general.