You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
5.5 KiB
229 lines
5.5 KiB
<?php
|
|
|
|
use Illuminate\Support\Str;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Route;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Illuminate\Support\Facades\File;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Illuminate\Support\Facades\Http;
|
|
use Illuminate\Support\Carbon;
|
|
|
|
/**
|
|
* Format a number into currency format.
|
|
*/
|
|
if (!function_exists('format_currency')) {
|
|
function format_currency(float|int $amount, string $currency = 'VND'): string
|
|
{
|
|
return number_format($amount, 0, ',', '.') . ' ' . strtoupper($currency);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get a human-readable difference between the current time and a given time.
|
|
*/
|
|
if (!function_exists('human_time_diff')) {
|
|
function human_time_diff($datetime): string
|
|
{
|
|
return Carbon::parse($datetime)->diffForHumans();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if the authenticated user is an admin.
|
|
*/
|
|
if (!function_exists('is_admin')) {
|
|
function is_admin(): bool
|
|
{
|
|
return Auth::check() && Auth::user()->role === 'admin';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Generate a versioned asset URL to prevent browser caching.
|
|
*/
|
|
if (!function_exists('asset_versioned')) {
|
|
function asset_versioned($path): string
|
|
{
|
|
$version = config('app.asset_version', time());
|
|
return asset($path) . '?v=' . $version;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get a limited string excerpt with optional length.
|
|
*/
|
|
if (!function_exists('str_excerpt')) {
|
|
function str_excerpt(string $string, int $length = 100): string
|
|
{
|
|
return Str::limit(strip_tags($string), $length);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Format a date using a given format (default: d/m/Y).
|
|
*/
|
|
if (!function_exists('format_date')) {
|
|
function format_date($date, string $format = 'd/m/Y'): string
|
|
{
|
|
return Carbon::parse($date)->format($format);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Send a generic notification to a user.
|
|
*/
|
|
if (!function_exists('send_notification')) {
|
|
function send_notification(\App\Models\User $user, $message, $type = 'info')
|
|
{
|
|
$user->notify(new \App\Notifications\GenericNotification($message, $type));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get an environment variable as a boolean.
|
|
*/
|
|
if (!function_exists('env_bool')) {
|
|
function env_bool(string $key, bool $default = false): bool
|
|
{
|
|
return filter_var(env($key, $default), FILTER_VALIDATE_BOOLEAN);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if the current route matches one or more given route names.
|
|
*/
|
|
if (!function_exists('route_is')) {
|
|
function route_is(string|array $names): bool
|
|
{
|
|
return request()->routeIs($names);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Abort the request if the app is running in a specific environment.
|
|
*/
|
|
if (!function_exists('abort_if_env')) {
|
|
function abort_if_env(string $env, int $code = 403)
|
|
{
|
|
if (app()->environment($env)) {
|
|
abort($code, "Action not allowed in $env environment.");
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return a CSS class if the current route matches one or more route names.
|
|
*/
|
|
if (!function_exists('active_class')) {
|
|
function active_class(string|array $routes, string $class = 'active'): string
|
|
{
|
|
return request()->routeIs($routes) ? $class : '';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return a standard JSON response.
|
|
*/
|
|
if (!function_exists('json_response')) {
|
|
function json_response($data = [], string $message = '', int $code = 200)
|
|
{
|
|
return response()->json([
|
|
'message' => $message,
|
|
'data' => $data,
|
|
], $code);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Generate a UUID (Universally Unique Identifier).
|
|
*/
|
|
if (!function_exists('uuid')) {
|
|
function uuid(): string
|
|
{
|
|
return (string) Str::uuid();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Convert bytes into a human-readable file size format.
|
|
*/
|
|
if (!function_exists('file_size_human')) {
|
|
function file_size_human(int $bytes, int $precision = 2): string
|
|
{
|
|
$units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
$bytes = max($bytes, 0);
|
|
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
|
|
$pow = min($pow, count($units) - 1);
|
|
$bytes /= (1 << (10 * $pow));
|
|
return round($bytes, $precision) . ' ' . $units[$pow];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get a full URL for a file stored in Laravel's storage.
|
|
*/
|
|
if (!function_exists('storage_url')) {
|
|
function storage_url(string $path): string
|
|
{
|
|
return Storage::url($path);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Log a debug message to the Laravel log.
|
|
*/
|
|
if (!function_exists('log_debug')) {
|
|
function log_debug(string $message, array $context = [])
|
|
{
|
|
Log::debug($message, $context);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if a string is valid JSON.
|
|
*/
|
|
if (!function_exists('is_json')) {
|
|
function is_json(string $string): bool
|
|
{
|
|
json_decode($string);
|
|
return json_last_error() === JSON_ERROR_NONE;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remember cache for a given key and duration.
|
|
*/
|
|
if (!function_exists('cache_remember')) {
|
|
function cache_remember(string $key, int $minutes, Closure $callback)
|
|
{
|
|
return Cache::remember($key, now()->addMinutes($minutes), $callback);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Perform a GET HTTP request and return the JSON response as array.
|
|
*/
|
|
if (!function_exists('http_get_json')) {
|
|
function http_get_json(string $url, array $headers = []): array
|
|
{
|
|
try {
|
|
$response = Http::withHeaders($headers)->get($url);
|
|
return $response->json();
|
|
} catch (Exception $e) {
|
|
Log::error("HTTP GET failed: " . $e->getMessage());
|
|
return [];
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the authenticated user from a specific guard.
|
|
*/
|
|
if (!function_exists('user_guard')) {
|
|
function user_guard(string $guard = 'web')
|
|
{
|
|
return Auth::guard($guard);
|
|
}
|
|
}
|
|
|