Files
finance/app/Http/Controllers/CurrencyController.php
T
Ümit Tunç 30dd0c5b8d Enhance currency and gold rates API with custom throttling and improved responses
- Implemented a custom throttle middleware to limit requests to 2 per 30 seconds, enhancing API stability.
- Updated API responses to include Turkish messages for successful updates and error handling.
- Refactored the CurrencyController to integrate the new throttling logic and improve response clarity.
- Enhanced the Scribe documentation to reflect changes in API behavior and response formats.
- Updated views to improve branding and user experience, including dynamic content adjustments.

These changes collectively improve the API's performance, usability, and branding for the Truncgil Finance application.
2025-01-21 18:28:39 +03:00

189 lines
6.6 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Http\Controllers;
use App\Jobs\FetchCurrencyRates;
use App\Jobs\FetchGoldRates;
use App\Jobs\MergeCurrencyAndGoldRates;
use Illuminate\Support\Facades\Storage;
use App\Http\Controllers\Controller;
/**
* Class CurrencyController
*
* This controller handles the fetching and returning of currency and gold rates.
*/
class CurrencyController extends Controller
{
/**
* ⚙️ Dispatches all jobs to fetch currency and gold rates synchronously.
* Rate limited to 2 requests per 30 seconds.
*
* @return \Illuminate\Http\JsonResponse
*/
public function runAllFetchs()
{
try {
FetchCurrencyRates::dispatchSync();
FetchGoldRates::dispatchSync();
MergeCurrencyAndGoldRates::dispatchSync();
return response()->json([
'status' => 'success',
'message' => 'Tüm döviz ve altın kurları başarıyla güncellendi'
]);
} catch (\Exception $e) {
return response()->json([
'status' => 'error',
'message' => 'Kurlar güncellenirken bir hata oluştu: ' . $e->getMessage()
], 429);
}
}
/**
* 🪙 💵 Retrieves all gold and currency rates
*
* @return \Illuminate\Http\JsonResponse
*/
public function getAllRates()
{
// JSON dosyasından oku
$jsonFile = 'merged/rates.json';
if (Storage::exists($jsonFile)) {
$data = json_decode(Storage::get($jsonFile), true);
$currentDate = now(); // Şu anki tarih
$updateDate = isset($data['Update_Date']) ? \Carbon\Carbon::parse($data['Update_Date']) : null;
if ($updateDate) {
$minutesAgo = round($currentDate->diffInMinutes($updateDate), 2); // Kaç dakika önce alındığı
$metaData = [ // Tarih bilgileri için alt dizi
'Minutes_Ago' => $minutesAgo,
'Current_Date' => $currentDate->toDateTimeString(),
'Update_Date' => $updateDate->toDateTimeString(), // Update_Date burada kalacak
];
unset($data['Update_Date']); // Rates içerisindeki Update_Date elemanını kaldır
$data = [
'Meta_Data' => $metaData, // Tarih bilgileri alt dizisi
'Rates' => $data, // Kur bilgileri alt dizisi
];
}
return response()->json($data);
}
return response()->json(['error' => 'Veri bulunamadı'], 404);
}
/**
* 💵 Retrieves the current currency rates
*
* @return \Illuminate\Http\JsonResponse
*/
public function getCurrentRates()
{
// JSON dosyasından oku
$jsonFile = 'currency/today.json';
if (Storage::exists($jsonFile)) {
$data = json_decode(Storage::get($jsonFile), true);
$currentDate = now(); // Şu anki tarih
$updateDate = isset($data['Update_Date']) ? \Carbon\Carbon::parse($data['Update_Date']) : null;
if ($updateDate) {
$minutesAgo = round($currentDate->diffInMinutes($updateDate), 2); // Kaç dakika önce alındığı
$metaData = [ // Tarih bilgileri için alt dizi
'Minutes_Ago' => $minutesAgo,
'Current_Date' => $currentDate->toDateTimeString(),
'Update_Date' => $updateDate->toDateTimeString(), // Update_Date burada kalacak
];
unset($data['Update_Date']); // Rates içerisindeki Update_Date elemanını kaldır
$data = [
'Meta_Data' => $metaData, // Tarih bilgileri alt dizisi
'Rates' => $data, // Kur bilgileri alt dizisi
];
}
return response()->json($data);
}
return response()->json(['error' => 'Veri bulunamadı'], 404);
}
/**
* 🪙 Retrieves the current gold rates
*
* @return \Illuminate\Http\JsonResponse
*/
public function getGoldRates()
{
// JSON dosyasından oku
$jsonFile = 'gold/today.json';
if (Storage::exists($jsonFile)) {
$data = json_decode(Storage::get($jsonFile), true);
$currentDate = now(); // Şu anki tarih
$updateDate = isset($data['Update_Date']) ? \Carbon\Carbon::parse($data['Update_Date']) : null;
if ($updateDate) {
$minutesAgo = round($currentDate->diffInMinutes($updateDate), 2); // Kaç dakika önce alındığı
$metaData = [ // Tarih bilgileri için alt dizi
'Minutes_Ago' => $minutesAgo,
'Current_Date' => $currentDate->toDateTimeString(),
'Update_Date' => $updateDate->toDateTimeString(), // Update_Date burada kalacak
];
unset($data['Update_Date']); // Rates içerisindeki Update_Date elemanını kaldır
$data = [
'Meta_Data' => $metaData, // Tarih bilgileri alt dizisi
'Rates' => $data, // Kur bilgileri alt dizisi
];
}
return response()->json($data);
}
return response()->json(['error' => 'Veri bulunamadı'], 404);
}
/**
* 🟰 💵 Retrieves the currency rate by its name
*
* @param string $currencyName
* @return \Illuminate\Http\JsonResponse
*/
public function getCurrencyRateByName($currencyName)
{
// JSON dosyasından oku
$jsonFile = 'currency/today.json';
if (Storage::exists($jsonFile)) {
$data = json_decode(Storage::get($jsonFile), true);
if (isset($data[$currencyName])) {
return response()->json([$currencyName => $data[$currencyName]]);
}
return response()->json(['error' => 'Currency not found'], 404);
}
return response()->json(['error' => 'Data not found'], 404);
}
/**
* 🟰 🪙 Retrieves the gold rate by its name
*
* @param string $goldName
* @return \Illuminate\Http\JsonResponse
*/
public function getGoldRateByName($goldName)
{
// JSON dosyasından oku
$jsonFile = 'gold/today.json';
if (Storage::exists($jsonFile)) {
$data = json_decode(Storage::get($jsonFile), true);
if (isset($data[$goldName])) {
return response()->json([$goldName => $data[$goldName]]);
}
return response()->json(['error' => 'Currency not found'], 404);
}
return response()->json(['error' => 'Data not found'], 404);
}
}