'boolean', 'file_meta_json' => 'array', ]; public function group(): BelongsTo { return $this->belongsTo(Group::class); } public function linkedProject(): BelongsTo { return $this->belongsTo(GroupProject::class, 'linked_project_id'); } public function uploader(): BelongsTo { return $this->belongsTo(User::class, 'uploaded_by_user_id'); } public function approver(): BelongsTo { return $this->belongsTo(User::class, 'approved_by_user_id'); } public function canBeViewedBy(?User $viewer): bool { if ($this->status !== self::STATUS_ACTIVE) { return false; } return match ($this->visibility) { self::VISIBILITY_PUBLIC_DOWNLOAD => $this->group->canBeViewedBy($viewer), self::VISIBILITY_MEMBERS_ONLY => $viewer !== null && $this->group->hasActiveMember($viewer), default => $viewer !== null && $this->group->canViewInternalAssets($viewer), }; } }