src/utils files conversion
This commit is contained in:
parent
6db9461437
commit
8cce215ce4
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
if (!function_exists('fnQueryParams')) {
|
||||
function fnQueryParams(array $params): string
|
||||
{
|
||||
$query = '';
|
||||
foreach ($params as $key => $value) {
|
||||
if ($value) {
|
||||
if (is_array($value)) {
|
||||
foreach ($value as $item) {
|
||||
$query .= http_build_query([$key => $item]) . '&';
|
||||
}
|
||||
} else {
|
||||
$query .= http_build_query([$key => $value]) . '&';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $query ? '?' . rtrim($query, '&') : '';
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('isEmpty')) {
|
||||
function isEmpty(array $obj): bool
|
||||
{
|
||||
return empty(array_filter($obj));
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('apiFormValidation')) {
|
||||
function apiFormValidation(array $data, callable $setErrors): void
|
||||
{
|
||||
$errors = [];
|
||||
foreach ($data as $key => $value) {
|
||||
if (is_array($value) && isset($value[0])) {
|
||||
$errors[$key] = $value[0];
|
||||
}
|
||||
}
|
||||
$setErrors($errors);
|
||||
}
|
||||
}
|
|
@ -12,6 +12,10 @@ class AppServiceProvider extends ServiceProvider
|
|||
$this->app->singleton(ApiService::class, function () {
|
||||
return new ApiService();
|
||||
});
|
||||
$this->app->singleton(ApiService::class, fn () => new ApiService());
|
||||
$this->app->singleton(NotificationApiService::class, fn () => new NotificationApiService());
|
||||
$this->app->singleton(StationApiService::class, fn () => new StationApiService());
|
||||
$this->app->singleton(CookieService::class, fn () => new CookieService());
|
||||
}
|
||||
|
||||
public function boot()
|
||||
|
|
|
@ -70,4 +70,26 @@ class ApiService
|
|||
throw new \Exception('API error: ' . ($response->body() ?: 'Unknown error'));
|
||||
}
|
||||
}
|
||||
|
||||
public function get($url, $params = [])
|
||||
{
|
||||
$token = $this->cookieService->getCookie()['token'] ?? null;
|
||||
$this->defaultHeaders['Authorization'] = 'Bearer ' . $token;
|
||||
return $this->makeRequest('get', $url, $params);
|
||||
}
|
||||
|
||||
public function post($url, $params = [])
|
||||
{
|
||||
return $this->makeRequest('post', $url, $params);
|
||||
}
|
||||
|
||||
public function put($url, $params = [])
|
||||
{
|
||||
return $this->makeRequest('put', $url, $params);
|
||||
}
|
||||
|
||||
public function delete($url, $params = [])
|
||||
{
|
||||
return $this->makeRequest('delete', $url, ['params' => $params]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use App\Livewire\ErrorHandler;
|
||||
|
||||
class BaseApiService
|
||||
{
|
||||
protected $baseUrl;
|
||||
protected $defaultHeaders = [];
|
||||
|
||||
public function __construct(string $baseUrl)
|
||||
{
|
||||
$this->baseUrl = $baseUrl;
|
||||
}
|
||||
|
||||
protected function makeRequest($method, $url, $params = [], $headers = [])
|
||||
{
|
||||
try {
|
||||
$fullHeaders = array_merge($this->defaultHeaders, $headers, [
|
||||
'Authorization' => 'Bearer ' . Session::get('token', ''),
|
||||
]);
|
||||
|
||||
$response = Http::withHeaders($fullHeaders)->{$method}($this->baseUrl . $url, $params);
|
||||
|
||||
if ($response->successful()) {
|
||||
return $response->json();
|
||||
} else {
|
||||
$this->handleError($response);
|
||||
return null;
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
Log::error('API Request Error: ' . $e->getMessage());
|
||||
Session::flash('error', 'API request failed: ' . $e->getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
protected function handleError($response)
|
||||
{
|
||||
$status = $response->status();
|
||||
|
||||
if ($status === 401) {
|
||||
Session::forget('token');
|
||||
throw new \Exception('Session expired. Please login again.');
|
||||
} elseif ($status === 422) {
|
||||
throw new \Exception('Validation error: ' . ($response->body() ?: 'Unknown validation error'));
|
||||
} elseif ($status === 404) {
|
||||
throw new \Exception('API resource not found.');
|
||||
} else {
|
||||
throw new \Exception('API error: ' . ($response->body() ?: 'Unknown error'));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use Illuminate\Support\Facades\Cookie;
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class CookieService
|
||||
{
|
||||
const COOKIE_NAME = 'FRONT_END_REST';
|
||||
const PUBLIC_KEY = 'PUBLIC_00001';
|
||||
const TIME_OUT_HOURS = 1; // 60 minutes
|
||||
|
||||
public function setCookie(array $params, string $name = self::COOKIE_NAME): bool
|
||||
{
|
||||
try {
|
||||
if (!is_array($params)) {
|
||||
throw new \TypeError('setCookie params should be an array.', 'CookieService.php', 20);
|
||||
}
|
||||
|
||||
$expiration = now()->addHours(self::TIME_OUT_HOURS);
|
||||
$encryptedValue = Crypt::encryptString(json_encode($params));
|
||||
|
||||
Cookie::queue($name, $encryptedValue, $expiration->diffInMinutes(), '/', null, false, true);
|
||||
|
||||
return true;
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Cookie Set Error: ' . $e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function getCookie(string $name = self::COOKIE_NAME)
|
||||
{
|
||||
$cookie = Cookie::get($name);
|
||||
|
||||
if (!$cookie) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return json_decode(Crypt::decryptString($cookie), true);
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Cookie Get Error: ' . $e->getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public function removeCookie(string $name = self::COOKIE_NAME): bool
|
||||
{
|
||||
Cookie::queue(Cookie::forget($name));
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use Illuminate\Support\Facades\Session;
|
||||
|
||||
class EncryptionService
|
||||
{
|
||||
const ALGORITHM = 'aes-256-ctr';
|
||||
private $password;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->password = $this->getPasswordFromCookie();
|
||||
}
|
||||
|
||||
private function getPasswordFromCookie()
|
||||
{
|
||||
$cookieService = app(CookieService::class);
|
||||
$cookie = $cookieService->getCookie(process.env.REACT_APP_TOKEN ?? 'token');
|
||||
return $cookie['token'] ?? 'default_password'; // Fallback if token not found
|
||||
}
|
||||
|
||||
public function encrypt(string $text): string
|
||||
{
|
||||
$iv = random_bytes(16); // Initialization vector
|
||||
$encrypted = openssl_encrypt($text, self::ALGORITHM, $this->password, 0, $iv);
|
||||
return base64_encode($iv . $encrypted); // Combine IV and encrypted data
|
||||
}
|
||||
|
||||
public function decrypt(string $text): string|bool
|
||||
{
|
||||
$data = base64_decode($text);
|
||||
$iv = substr($data, 0, 16);
|
||||
$encrypted = substr($data, 16);
|
||||
|
||||
$decrypted = openssl_decrypt($encrypted, self::ALGORITHM, $this->password, 0, $iv);
|
||||
|
||||
if ($decrypted === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if the result is hexadecimal (simulating your JS check)
|
||||
if (preg_match('/^[0-9a-fA-F]+$/', $decrypted)) {
|
||||
return $decrypted;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
class NotificationApiService extends BaseApiService
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(config('app.notif_api_base_url'));
|
||||
}
|
||||
|
||||
public function getNotification($url, $params = [])
|
||||
{
|
||||
return $this->makeRequest('get', $url, $params);
|
||||
}
|
||||
|
||||
public function postNotification($url, $params = [])
|
||||
{
|
||||
return $this->makeRequest('post', $url, $params);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
class StationApiService extends BaseApiService
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(config('app.station_api_base_url'));
|
||||
$this->defaultHeaders = array_merge($this->defaultHeaders, [
|
||||
'X-Requested-With' => 'station-locator-api',
|
||||
]);
|
||||
}
|
||||
|
||||
public function getBranch($url, $params = [])
|
||||
{
|
||||
return $this->makeRequest('get', $url, $params);
|
||||
}
|
||||
|
||||
public function postBranch($url, $params = [])
|
||||
{
|
||||
return $this->makeRequest('post', $url, $params);
|
||||
}
|
||||
|
||||
public function putBranch($url, $params = [])
|
||||
{
|
||||
return $this->makeRequest('put', $url, $params);
|
||||
}
|
||||
|
||||
public function deleteBranch($url, $params = [])
|
||||
{
|
||||
return $this->makeRequest('delete', $url, ['params' => $params]);
|
||||
}
|
||||
|
||||
public function postFuel($url, $params = [])
|
||||
{
|
||||
return $this->makeRequest('post', $url, $params);
|
||||
}
|
||||
|
||||
public function putFuel($url, $params = [])
|
||||
{
|
||||
return $this->makeRequest('put', $url, $params);
|
||||
}
|
||||
|
||||
public function getFuels($url, $params = [])
|
||||
{
|
||||
return $this->makeRequest('get', $url, $params);
|
||||
}
|
||||
|
||||
public function getCsv($url, $params = [])
|
||||
{
|
||||
return Http::withHeaders(array_merge($this->defaultHeaders, [
|
||||
'Authorization' => 'Bearer ' . Session::get('token', ''),
|
||||
]))->get($this->baseUrl . $url, $params)->body(); // Return raw text for CSV
|
||||
}
|
||||
}
|
|
@ -11,7 +11,8 @@
|
|||
"laravel/framework": "^11.31",
|
||||
"laravel/tinker": "^2.9",
|
||||
"laravel/ui": "^4.6",
|
||||
"livewire/livewire": "^3.6"
|
||||
"livewire/livewire": "^3.6",
|
||||
"paragonie/sodium_compat": "^2.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"fakerphp/faker": "^1.23",
|
||||
|
@ -24,6 +25,9 @@
|
|||
"phpunit/phpunit": "^11.0.1"
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"app/Helpers/Helper.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"App\\": "app/",
|
||||
"Database\\Factories\\": "database/factories/",
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "285c8ee44334e3e198f19e9bd78c85e5",
|
||||
"content-hash": "76604e550276fef9afccacf4143ff3aa",
|
||||
"packages": [
|
||||
{
|
||||
"name": "brick/math",
|
||||
|
@ -2647,6 +2647,97 @@
|
|||
],
|
||||
"time": "2024-11-21T10:39:51+00:00"
|
||||
},
|
||||
{
|
||||
"name": "paragonie/sodium_compat",
|
||||
"version": "v2.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/paragonie/sodium_compat.git",
|
||||
"reference": "a673d5f310477027cead2e2f2b6db5d8368157cb"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/a673d5f310477027cead2e2f2b6db5d8368157cb",
|
||||
"reference": "a673d5f310477027cead2e2f2b6db5d8368157cb",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^8.1",
|
||||
"php-64bit": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^7|^8|^9",
|
||||
"vimeo/psalm": "^4|^5"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-sodium": "Better performance, password hashing (Argon2i), secure memory management (memzero), and better security."
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"autoload.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"ISC"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Paragon Initiative Enterprises",
|
||||
"email": "security@paragonie.com"
|
||||
},
|
||||
{
|
||||
"name": "Frank Denis",
|
||||
"email": "jedisct1@pureftpd.org"
|
||||
}
|
||||
],
|
||||
"description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists",
|
||||
"keywords": [
|
||||
"Authentication",
|
||||
"BLAKE2b",
|
||||
"ChaCha20",
|
||||
"ChaCha20-Poly1305",
|
||||
"Chapoly",
|
||||
"Curve25519",
|
||||
"Ed25519",
|
||||
"EdDSA",
|
||||
"Edwards-curve Digital Signature Algorithm",
|
||||
"Elliptic Curve Diffie-Hellman",
|
||||
"Poly1305",
|
||||
"Pure-PHP cryptography",
|
||||
"RFC 7748",
|
||||
"RFC 8032",
|
||||
"Salpoly",
|
||||
"Salsa20",
|
||||
"X25519",
|
||||
"XChaCha20-Poly1305",
|
||||
"XSalsa20-Poly1305",
|
||||
"Xchacha20",
|
||||
"Xsalsa20",
|
||||
"aead",
|
||||
"cryptography",
|
||||
"ecdh",
|
||||
"elliptic curve",
|
||||
"elliptic curve cryptography",
|
||||
"encryption",
|
||||
"libsodium",
|
||||
"php",
|
||||
"public-key cryptography",
|
||||
"secret-key cryptography",
|
||||
"side-channel resistant"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/paragonie/sodium_compat/issues",
|
||||
"source": "https://github.com/paragonie/sodium_compat/tree/v2.1.0"
|
||||
},
|
||||
"time": "2024-09-04T12:51:01+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpoption/phpoption",
|
||||
"version": "1.9.3",
|
||||
|
|
|
@ -14,6 +14,9 @@ return [
|
|||
*/
|
||||
|
||||
'name' => env('APP_NAME', 'Laravel'),
|
||||
'api_base_url' => env('API_BASE_URL', 'https://your-backend-api.com/api'),
|
||||
'notif_api_base_url' => env('NOTIF_API_BASE_URL', 'https://your-backend-api.com/notif'),
|
||||
'station_api_base_url' => env('STATION_API_BASE_URL', 'https://your-backend-api.com/station'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue