chore: commit current workspace changes
This commit is contained in:
42
app/Services/Auth/AuthAuditLogger.php
Normal file
42
app/Services/Auth/AuthAuditLogger.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Auth;
|
||||
|
||||
use App\Models\AuthAuditLog;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class AuthAuditLogger
|
||||
{
|
||||
public function log(
|
||||
string $eventType,
|
||||
?Request $request,
|
||||
string $status,
|
||||
?string $reason = null,
|
||||
?string $identifier = null,
|
||||
User|int|null $user = null,
|
||||
array $metadata = [],
|
||||
): AuthAuditLog {
|
||||
$userId = $user instanceof User ? $user->getKey() : $user;
|
||||
$cleanMetadata = array_filter($metadata, static fn (mixed $value): bool => $value !== null && $value !== '');
|
||||
|
||||
return AuthAuditLog::query()->create([
|
||||
'event_type' => $eventType,
|
||||
'identifier' => $this->normalizeIdentifier($identifier),
|
||||
'user_id' => $userId,
|
||||
'ip' => $request?->ip(),
|
||||
'user_agent' => $request?->userAgent(),
|
||||
'status' => $status,
|
||||
'reason' => $reason,
|
||||
'metadata' => $cleanMetadata === [] ? null : $cleanMetadata,
|
||||
'created_at' => now(),
|
||||
]);
|
||||
}
|
||||
|
||||
private function normalizeIdentifier(?string $identifier): ?string
|
||||
{
|
||||
$identifier = trim((string) $identifier);
|
||||
|
||||
return $identifier === '' ? null : mb_strtolower($identifier);
|
||||
}
|
||||
}
|
||||
@@ -142,7 +142,24 @@ class HomepageAnnouncementService
|
||||
return $backgroundImage;
|
||||
}
|
||||
|
||||
return Storage::disk('public')->url($backgroundImage);
|
||||
$disk = $this->backgroundImageDisk();
|
||||
$configuredBaseUrl = trim((string) config('filesystems.disks.' . $disk . '.url', ''), '/');
|
||||
|
||||
if ($configuredBaseUrl !== '') {
|
||||
return $configuredBaseUrl . '/' . ltrim($backgroundImage, '/');
|
||||
}
|
||||
|
||||
return Storage::disk($disk)->url($backgroundImage);
|
||||
}
|
||||
|
||||
public function backgroundImageDisk(): string
|
||||
{
|
||||
return (string) config('homepage.announcements.background_image.disk', config('uploads.object_storage.disk', 's3'));
|
||||
}
|
||||
|
||||
public function backgroundImagePrefix(): string
|
||||
{
|
||||
return trim((string) config('homepage.announcements.background_image.prefix', 'homepage-announcements'), '/');
|
||||
}
|
||||
|
||||
private function artworkUrl(int $artworkId): ?string
|
||||
|
||||
@@ -92,7 +92,7 @@ final class SitemapCacheService
|
||||
{
|
||||
$prefix = trim((string) config('sitemaps.pre_generated.path', 'generated-sitemaps'), '/');
|
||||
$segments = $name === self::INDEX_DOCUMENT
|
||||
? [$prefix, 'sitemap.xml']
|
||||
? [$prefix, 'sitemaps', 'sitemap.xml']
|
||||
: [$prefix, 'sitemaps', $name . '.xml'];
|
||||
|
||||
return implode('/', array_values(array_filter($segments, static fn (string $segment): bool => $segment !== '')));
|
||||
|
||||
@@ -127,7 +127,7 @@ final class SitemapReleaseManager
|
||||
public function documentRelativePath(string $documentName): string
|
||||
{
|
||||
return $documentName === SitemapCacheService::INDEX_DOCUMENT
|
||||
? 'sitemap.xml'
|
||||
? 'sitemaps/sitemap.xml'
|
||||
: 'sitemaps/' . $documentName . '.xml';
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ final class StudioAiCategoryMapper
|
||||
$tokens = $this->tokenize($signals);
|
||||
$haystack = ' ' . implode(' ', $tokens) . ' ';
|
||||
|
||||
$contentTypes = ContentType::query()->with(['rootCategories.children'])->ordered()->get();
|
||||
$contentTypes = ContentType::query()->with(['rootCategories.children.parent'])->ordered()->get();
|
||||
$contentTypeScores = $contentTypes
|
||||
->map(fn (ContentType $contentType): array => $this->scoreContentType($contentType, $tokens, $haystack))
|
||||
->filter(fn (array $row): bool => $row['score'] > 0)
|
||||
|
||||
@@ -343,12 +343,22 @@ final class WorldRewardService
|
||||
|
||||
public function artworkRewardBadges(Artwork $artwork): array
|
||||
{
|
||||
return WorldRewardGrant::query()
|
||||
$grants = WorldRewardGrant::query()
|
||||
->with('world')
|
||||
->where('artwork_id', (int) $artwork->id)
|
||||
->orderByRaw($this->sortCaseSql())
|
||||
->orderByDesc('granted_at')
|
||||
->get()
|
||||
->values();
|
||||
|
||||
World::primeCanonicalEditionIds(
|
||||
$grants->pluck('world')
|
||||
->filter()
|
||||
->pluck('recurrence_key')
|
||||
->all()
|
||||
);
|
||||
|
||||
return $grants
|
||||
->map(function (WorldRewardGrant $grant): array {
|
||||
$world = $grant->world;
|
||||
$rewardType = $grant->reward_type;
|
||||
|
||||
@@ -1019,7 +1019,7 @@ final class WorldService
|
||||
'title' => (string) $world->title,
|
||||
'campaign_label' => (string) ($world->campaign_label ?: 'Live now'),
|
||||
'status_label' => $this->campaignStateLabel($world),
|
||||
'url' => $world->publicUrl(),
|
||||
'url' => $this->publicPathForWorld($world),
|
||||
];
|
||||
});
|
||||
}
|
||||
@@ -2532,6 +2532,25 @@ final class WorldService
|
||||
return route('worlds.show', ['world' => $recurrenceKey]);
|
||||
}
|
||||
|
||||
private function publicPathForWorld(World $world): string
|
||||
{
|
||||
$recurrenceKey = trim((string) ($world->recurrence_key ?? ''));
|
||||
|
||||
if (! $world->is_recurring || $recurrenceKey === '') {
|
||||
return route('worlds.show', ['world' => $world->slug], false);
|
||||
}
|
||||
|
||||
if ($this->isCanonicalSurfaceWorld($world)) {
|
||||
return route('worlds.show', ['world' => $recurrenceKey], false);
|
||||
}
|
||||
|
||||
if ($world->edition_year !== null) {
|
||||
return route('worlds.editions.show', ['world' => $recurrenceKey, 'year' => $world->edition_year], false);
|
||||
}
|
||||
|
||||
return route('worlds.show', ['world' => $recurrenceKey], false);
|
||||
}
|
||||
|
||||
private function familyUrlForWorld(World $world): ?string
|
||||
{
|
||||
$recurrenceKey = trim((string) ($world->recurrence_key ?? ''));
|
||||
|
||||
Reference in New Issue
Block a user