Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions app/Filament/Pages/Dashboard.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,18 @@ class Dashboard extends \Filament\Pages\Dashboard
{
protected Width|string|null $maxContentWidth = 'full';

public function getWidgets(): array
{
return [
AccountInfo::class,
LatestUsers::class,
LatestTorrents::class,
UserTrend::class,
TorrentTrend::class,
UserStat::class,
UserClassStat::class,
TorrentStat::class,
SystemInfo::class,
];
}
// public function getWidgets(): array
// {
// return [
// AccountInfo::class,
// LatestUsers::class,
// LatestTorrents::class,
// UserTrend::class,
// TorrentTrend::class,
// UserStat::class,
// UserClassStat::class,
// TorrentStat::class,
// SystemInfo::class,
// ];
// }
}
22 changes: 19 additions & 3 deletions app/Filament/Widgets/AnnounceMonitor/MaxUploadedUser.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,24 @@

class MaxUploadedUser extends BaseWidget implements HasActions
{

protected static array $list = [];

protected function servicePing(): bool
{
try {
$rep = new AnnounceLogRepository();
self::$list = $rep->listMaxUploadedUser(1);
return true;
} catch (\Throwable) {
return false;
}
}

public static function canView(): bool
{
return (new self())->servicePing();
}
public function table(Table $table): Table
{
return $table
Expand All @@ -37,10 +55,8 @@ public function table(Table $table): Table

public function getTableRecords(): Collection|Paginator|CursorPaginator
{
$rep = new AnnounceLogRepository();
$list = $rep->listMaxUploadedUser(1);
$items = [];
foreach ($list as $index => $item) {
foreach (self::$list as $index => $item) {
$record = new AnnounceLog($item);
$record->request_id = $index;
$items[] = $record;
Expand Down
81 changes: 76 additions & 5 deletions app/Repositories/TokenRepository.php
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
<?php
namespace App\Repositories;

use App\Enums\Permission\RoutePermissionEnum;
use App\Models\Setting;
use App\Enums\Permission\RoutePermissionEnum;

class TokenRepository extends BaseRepository
{
/** 核心系统权限 */
private static array $userTokenPermissions = [
RoutePermissionEnum::TORRENT_LIST->value,
RoutePermissionEnum::TORRENT_VIEW->value,
Expand All @@ -15,25 +16,95 @@ class TokenRepository extends BaseRepository
RoutePermissionEnum::BOOKMARK_DELETE->value,
];

/** 插件命名空间权限 */
private static array $pluginNamespaces = [];

/** 扩展 token 权限 */
public static function extendUserTokenPermissions(array $permissions, ?string $translationNamespace = null): void
{
if ($translationNamespace) {
self::$pluginNamespaces[$translationNamespace] = array_merge(
self::$pluginNamespaces[$translationNamespace] ?? [],
$permissions
);
} else {
self::$pluginNamespaces['__default'] = array_merge(
self::$pluginNamespaces['__default'] ?? [],
$permissions
);
}
}

/** 保存 plugin token 权限到 Setting */
private static function savePluginUserTokenPermissions(): void
{
Setting::query()->upsert([
[
'name' => 'plugin_user_token_permissions',
'value' => json_encode(self::$pluginNamespaces),
'autoload' => 'yes',
]
], ['name'], ['value']);
}

/** 从 Setting 加载 plugin token 权限 */
private static function loadPluginUserTokenPermissions(): void
{
$setting = Setting::query()
->where('name', 'plugin_user_token_permissions')
->first();

if ($setting && $setting->value) {
self::$pluginNamespaces = json_decode($setting->value, true);
}
}

/** 列出用户 token 权限,自动保存 plugin 权限 */
public static function listUserTokenPermissions(bool $format = true): array
{
if (!$format) {
return self::$userTokenPermissions;
// 先加载插件权限
self::loadPluginUserTokenPermissions();

// 合并核心 + 插件权限
$permissions = self::$userTokenPermissions;
foreach (self::$pluginNamespaces as $perms) {
$permissions = array_merge($permissions, $perms);
}
return self::formatPermissions(self::$userTokenPermissions);
$permissions = array_values(array_unique($permissions));

// 自动保存 plugin 权限
self::savePluginUserTokenPermissions();

return $format ? self::formatPermissions($permissions) : $permissions;
}

/** 允许的 token 权限(从 Setting 获取),先加载插件权限 */
public static function listUserTokenPermissionAllowed(): array
{
self::loadPluginUserTokenPermissions();

return self::formatPermissions(Setting::getPermissionUserTokenAllowed());
}

/** 格式化权限文本,自动检测插件命名空间 */
private static function formatPermissions(array $permissions): array
{
$result = [];
foreach ($permissions as $permission) {
$result[$permission] = nexus_trans("route-permission.{$permission}.text");
$found = false;
foreach (self::$pluginNamespaces as $namespace => $perms) {
if (in_array($permission, $perms, true)) {
$result[$permission] = nexus_trans("{$namespace}::route-permission.{$permission}.text");
$found = true;
break;
}
}

if (!$found) {
$result[$permission] = nexus_trans("route-permission.{$permission}.text");
}
}

return $result;
}
}