add Meteo part

This commit is contained in:
Romulus21
2023-09-24 11:19:58 +02:00
parent bfaf82f264
commit 33b2044859
23 changed files with 429 additions and 31 deletions

View File

@@ -128,7 +128,7 @@ class AuthController extends Controller
public function user(Request $request): JsonResponse
{
$user = $request->user();
$user = $request->user()->load('locations');
return response()->json(new AuthUserResource($user));
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\AuthUserResource;
use Illuminate\Http\Request;
class LocationController extends Controller
{
public function store(Request $request)
{
$data = $request->validate([
'latitude' => ['required', 'decimal:3,5'],
'longitude' => ['required', 'decimal:3,5'],
]);
$user = $request->user();
$user->locations()->create($data);
return response()->json(new AuthUserResource($user->load('locations')));
}
}

View File

@@ -0,0 +1,45 @@
<?php
namespace App\Http\Controllers;
use Exception;
use GuzzleHttp\Client;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
class WeatherController extends Controller
{
public function index(Request $request): JsonResponse
{
abort_if($request->user()->locations->count() === 0, 404, 'Coordonnées non renseignées dans le profile.');
$location = $request->user()->locations->first();
$idCity = 6427013;
$apiKey = config('weather.open_weather_map_api_key');
try {
$response = Cache::remember('weather-'.$location->id, 5 * 60, function () use ($location, $apiKey) {
// $url = 'https://api.openweathermap.org/data/2.5/forecast?id='.$idCity.'&appid='.$apiKey.$params;
$params = '&units=metric&lang=fr';
$url = 'https://api.openweathermap.org/data/2.5/forecast?lat='.$location->latitude.'&lon='.$location->longitude.'&appid='.$apiKey.$params;
$client = new Client();
$promise = $client->requestAsync('GET', $url);
$response = $promise->wait();
return json_decode($response->getBody()->getContents());
});
return response()->json($response);
} catch (Exception $e) {
Log::alert('unable to fetch data', [
'ip' => $request->ip(),
'code' => $e->getCode(),
'message' => $e->getMessage(),
]);
return response()->json('unable to fetch data', 500);
}
}
}

View File

@@ -18,6 +18,7 @@ class AuthUserResource extends JsonResource
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'locations' => LocationResource::collection($this->whenLoaded('locations')),
];
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class LocationResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'user_id' => $this->user_id,
'latitude' => $this->latitude,
'longitude' => $this->longitude,
];
}
}

16
app/Models/Location.php Normal file
View File

@@ -0,0 +1,16 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Location extends Model
{
protected $guarded = [];
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}

View File

@@ -44,6 +44,11 @@ class User extends Authenticatable
'password' => 'hashed',
];
public function locations(): HasMany
{
return $this->hasMany(Location::class);
}
public function rainfalls(): HasMany
{
return $this->hasMany(Rainfall::class);

11
app/Models/Weather.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Weather extends Model
{
use HasFactory;
}