Add control room automations and uploader overrides
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled

This commit is contained in:
Codex Agent
2026-01-20 15:49:04 +01:00
parent e5e74febbd
commit 5e5b69f655
11 changed files with 738 additions and 33 deletions

View File

@@ -2921,6 +2921,12 @@ class EventPublicController extends BaseController
$policy = $this->guestPolicy();
$uploadVisibility = Arr::get($eventModel->settings ?? [], 'guest_upload_visibility', $policy->guest_upload_visibility);
$autoApproveUploads = $uploadVisibility === 'immediate';
$controlRoom = Arr::get($eventModel->settings ?? [], 'control_room', []);
$controlRoom = is_array($controlRoom) ? $controlRoom : [];
$autoAddApprovedToLiveSetting = (bool) Arr::get($controlRoom, 'auto_add_approved_to_live', false);
$trustedUploaders = Arr::get($controlRoom, 'trusted_uploaders', []);
$forceReviewUploaders = Arr::get($controlRoom, 'force_review_uploaders', []);
$autoAddApprovedToLiveDefault = $autoAddApprovedToLiveSetting || $autoApproveUploads;
$tenantModel = $eventModel->tenant;
@@ -2953,6 +2959,34 @@ class EventPublicController extends BaseController
->resolveEventPackageForPhotoUpload($tenantModel, $eventId, $eventModel);
$deviceId = $this->resolveDeviceIdentifier($request);
$deviceHasRule = static function (array $entries, string $deviceId): bool {
foreach ($entries as $entry) {
if (! is_array($entry)) {
continue;
}
$candidate = $entry['device_id'] ?? null;
if (is_string($candidate) && $candidate === $deviceId) {
return true;
}
}
return false;
};
$deviceHasRules = $deviceId !== 'anonymous';
$isForceReviewUploader = $deviceHasRules && is_array($forceReviewUploaders)
? $deviceHasRule($forceReviewUploaders, $deviceId)
: false;
$isTrustedUploader = $deviceHasRules && is_array($trustedUploaders)
? $deviceHasRule($trustedUploaders, $deviceId)
: false;
if ($isForceReviewUploader) {
$autoApproveUploads = false;
} elseif ($isTrustedUploader) {
$autoApproveUploads = true;
}
$autoAddApprovedToLive = $autoAddApprovedToLiveDefault && $autoApproveUploads;
$deviceLimit = max(0, (int) ($policy->per_device_upload_limit ?? 50));
$deviceCount = DB::table('photos')->where('event_id', $eventId)->where('guest_name', $deviceId)->count();
@@ -3037,10 +3071,21 @@ class EventPublicController extends BaseController
$liveApprovedAt = null;
$liveReviewedAt = null;
$liveStatus = PhotoLiveStatus::NONE->value;
$securityMeta = $isForceReviewUploader
? [
'manual_review' => true,
'manual_review_reason' => 'force_review_device',
]
: null;
$securityMetaValue = $securityMeta ? json_encode($securityMeta) : null;
if ($liveOptIn) {
if ($liveOptIn || $autoAddApprovedToLive) {
$liveSubmittedAt = now();
if ($liveModerationMode === 'off') {
if ($autoAddApprovedToLive) {
$liveStatus = PhotoLiveStatus::APPROVED->value;
$liveApprovedAt = $liveSubmittedAt;
$liveReviewedAt = $liveSubmittedAt;
} elseif ($liveModerationMode === 'off') {
$liveStatus = PhotoLiveStatus::APPROVED->value;
$liveApprovedAt = $liveSubmittedAt;
$liveReviewedAt = $liveSubmittedAt;
@@ -3048,6 +3093,12 @@ class EventPublicController extends BaseController
$liveStatus = PhotoLiveStatus::PENDING->value;
}
}
if ($isForceReviewUploader) {
$liveStatus = PhotoLiveStatus::REJECTED->value;
$liveSubmittedAt = null;
$liveApprovedAt = null;
$liveReviewedAt = now();
}
$photoId = DB::table('photos')->insertGetId([
'event_id' => $eventId,
@@ -3071,6 +3122,7 @@ class EventPublicController extends BaseController
'emotion_id' => $this->resolveEmotionId($validated, $eventId),
'is_featured' => 0,
'metadata' => null,
'security_meta' => $securityMetaValue,
'created_at' => now(),
'updated_at' => now(),
]);