feat(support): add role permissions, translator and helper functions
This commit is contained in:
1 parent
32995b714b
commit
2a1d701846
4 files changed
+165
No files matched your search
@@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Bazaar\Support;
|
||||||
|
|
||||||
|
final class Permissions
|
||||||
|
{
|
||||||
|
public const catalogManage = 'catalog.manage';
|
||||||
|
public const ordersManage = 'orders.manage';
|
||||||
|
public const reviewsModerate = 'reviews.moderate';
|
||||||
|
public const analyticsView = 'analytics.view';
|
||||||
|
public const couponsManage = 'coupons.manage';
|
||||||
|
public const usersManage = 'users.manage';
|
||||||
|
|
||||||
|
private const managerGrants = [
|
||||||
|
self::catalogManage,
|
||||||
|
self::ordersManage,
|
||||||
|
self::reviewsModerate,
|
||||||
|
self::analyticsView,
|
||||||
|
];
|
||||||
|
|
||||||
|
public static function allows(string $role, string $capability): bool
|
||||||
|
{
|
||||||
|
if ($role === Role::admin) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ($role === Role::manager) {
|
||||||
|
return in_array($capability, self::managerGrants, true);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Bazaar\Support;
|
||||||
|
|
||||||
|
final class Role
|
||||||
|
{
|
||||||
|
public const customer = 'customer';
|
||||||
|
public const manager = 'manager';
|
||||||
|
public const admin = 'admin';
|
||||||
|
|
||||||
|
public const staffRoles = [self::manager, self::admin];
|
||||||
|
|
||||||
|
public static function label(string $role): string
|
||||||
|
{
|
||||||
|
return match ($role) {
|
||||||
|
self::admin => 'Administrator',
|
||||||
|
self::manager => 'Manager',
|
||||||
|
default => 'Customer',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function isStaff(string $role): bool
|
||||||
|
{
|
||||||
|
return in_array($role, self::staffRoles, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function all(): array
|
||||||
|
{
|
||||||
|
return [self::customer, self::manager, self::admin];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Bazaar\Support;
|
||||||
|
|
||||||
|
final class Translator
|
||||||
|
{
|
||||||
|
public const supported = ['en', 'pl'];
|
||||||
|
|
||||||
|
private array $catalogs = [];
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
private readonly string $langPath,
|
||||||
|
private string $locale = 'en',
|
||||||
|
private readonly string $fallback = 'en'
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setLocale(string $locale): void
|
||||||
|
{
|
||||||
|
$this->locale = self::isSupported($locale) ? $locale : $this->fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function locale(): string
|
||||||
|
{
|
||||||
|
return $this->locale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function isSupported(string $locale): bool
|
||||||
|
{
|
||||||
|
return in_array($locale, self::supported, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get(string $key, array $replacements = []): string
|
||||||
|
{
|
||||||
|
$line = $this->lookup($this->locale, $key)
|
||||||
|
?? $this->lookup($this->fallback, $key)
|
||||||
|
?? $key;
|
||||||
|
|
||||||
|
foreach ($replacements as $token => $value) {
|
||||||
|
$line = str_replace(':' . $token, (string) $value, $line);
|
||||||
|
}
|
||||||
|
return $line;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function lookup(string $locale, string $key): ?string
|
||||||
|
{
|
||||||
|
$catalog = $this->catalog($locale);
|
||||||
|
$value = $catalog;
|
||||||
|
foreach (explode('.', $key) as $segment) {
|
||||||
|
if (!is_array($value) || !array_key_exists($segment, $value)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$value = $value[$segment];
|
||||||
|
}
|
||||||
|
return is_string($value) ? $value : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function catalog(string $locale): array
|
||||||
|
{
|
||||||
|
if (!isset($this->catalogs[$locale])) {
|
||||||
|
$file = $this->langPath . '/' . $locale . '.php';
|
||||||
|
$this->catalogs[$locale] = is_file($file) ? require $file : [];
|
||||||
|
}
|
||||||
|
return $this->catalogs[$locale];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Bazaar\Core\Config;
|
||||||
|
|
||||||
|
function basePath(string $relative = ''): string
|
||||||
|
{
|
||||||
|
$root = dirname(__DIR__, 2);
|
||||||
|
return $relative === '' ? $root : $root . '/' . ltrim($relative, '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
function e(?string $value): string
|
||||||
|
{
|
||||||
|
return htmlspecialchars($value ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
|
||||||
|
}
|
||||||
|
|
||||||
|
function config(string $key, mixed $default = null): mixed
|
||||||
|
{
|
||||||
|
return Config::get($key, $default);
|
||||||
|
}
|
||||||
|
|
||||||
|
function slugify(string $value): string
|
||||||
|
{
|
||||||
|
$value = strtolower(trim($value));
|
||||||
|
$value = preg_replace('/[^a-z0-9]+/', '-', $value);
|
||||||
|
return trim((string) $value, '-');
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatMoney(int $cents, string $currency = 'USD'): string
|
||||||
|
{
|
||||||
|
$symbol = match (strtoupper($currency)) {
|
||||||
|
'USD' => '$',
|
||||||
|
'EUR' => 'EUR ',
|
||||||
|
'PLN' => 'PLN ',
|
||||||
|
default => strtoupper($currency) . ' ',
|
||||||
|
};
|
||||||
|
return $symbol . number_format($cents / 100, 2);
|
||||||
|
}
|
||||||
Reference in new issue
Block a user