'array', 'options' => 'array', 'generated_at' => 'datetime', 'expires_at' => 'datetime', 'file_size' => 'integer', ]; } /** * @return BelongsTo */ public function workspace(): BelongsTo { return $this->belongsTo(Workspace::class); } /** * @return BelongsTo */ public function tenant(): BelongsTo { return $this->belongsTo(Tenant::class); } /** * @return BelongsTo */ public function operationRun(): BelongsTo { return $this->belongsTo(OperationRun::class); } /** * @return BelongsTo */ public function initiator(): BelongsTo { return $this->belongsTo(User::class, 'initiated_by_user_id'); } /** * @param Builder $query * @return Builder */ public function scopeReady(Builder $query): Builder { return $query->where('status', self::STATUS_READY); } /** * @param Builder $query * @return Builder */ public function scopeExpired(Builder $query): Builder { return $query->where('status', self::STATUS_EXPIRED); } /** * @param Builder $query * @return Builder */ public function scopePastRetention(Builder $query): Builder { return $query->where('expires_at', '<', now()); } /** * @param Builder $query * @return Builder */ public function scopeForTenant(Builder $query, int $tenantId): Builder { return $query->where('tenant_id', $tenantId); } /** * @param Builder $query * @return Builder */ public function scopeLatestReady(Builder $query): Builder { return $query->ready()->latest('generated_at'); } public function isReady(): bool { return $this->status === self::STATUS_READY; } public function isExpired(): bool { return $this->status === self::STATUS_EXPIRED; } public function getStatusEnum(): ReviewPackStatus { return ReviewPackStatus::from($this->status); } }