Replace all uses of `forceFill`, `forceCreate`, and `forceFill` with their non-force equivalents across models, actions, controllers, and Livewire components. Add explicit `$fillable` arrays to all affected Eloquent models to enforce mass assignment protection. Add ModelFillableCreationTest and ModelFillableRegressionTest to verify that model creation respects fillable constraints and prevent regressions.
103 lines
2.9 KiB
PHP
103 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Illuminate\Database\Eloquent\Relations\HasOne;
|
|
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
|
|
|
class ScheduledDatabaseBackup extends BaseModel
|
|
{
|
|
protected $fillable = [
|
|
'uuid',
|
|
'team_id',
|
|
'description',
|
|
'enabled',
|
|
'save_s3',
|
|
'frequency',
|
|
'database_backup_retention_amount_locally',
|
|
'database_type',
|
|
'database_id',
|
|
's3_storage_id',
|
|
'databases_to_backup',
|
|
'dump_all',
|
|
'database_backup_retention_days_locally',
|
|
'database_backup_retention_max_storage_locally',
|
|
'database_backup_retention_amount_s3',
|
|
'database_backup_retention_days_s3',
|
|
'database_backup_retention_max_storage_s3',
|
|
'timeout',
|
|
'disable_local_backup',
|
|
];
|
|
|
|
public static function ownedByCurrentTeam()
|
|
{
|
|
return ScheduledDatabaseBackup::whereRelation('team', 'id', currentTeam()->id)->orderBy('created_at', 'desc');
|
|
}
|
|
|
|
public static function ownedByCurrentTeamAPI(int $teamId)
|
|
{
|
|
return ScheduledDatabaseBackup::whereRelation('team', 'id', $teamId)->orderBy('created_at', 'desc');
|
|
}
|
|
|
|
public function team()
|
|
{
|
|
return $this->belongsTo(Team::class);
|
|
}
|
|
|
|
public function database(): MorphTo
|
|
{
|
|
return $this->morphTo();
|
|
}
|
|
|
|
public function latest_log(): HasOne
|
|
{
|
|
return $this->hasOne(ScheduledDatabaseBackupExecution::class)->latest();
|
|
}
|
|
|
|
public function executions(): HasMany
|
|
{
|
|
// Last execution first
|
|
return $this->hasMany(ScheduledDatabaseBackupExecution::class)->orderBy('created_at', 'desc');
|
|
}
|
|
|
|
public function s3()
|
|
{
|
|
return $this->belongsTo(S3Storage::class, 's3_storage_id');
|
|
}
|
|
|
|
public function get_last_days_backup_status($days = 7)
|
|
{
|
|
return $this->hasMany(ScheduledDatabaseBackupExecution::class)->where('created_at', '>=', now()->subDays($days))->get();
|
|
}
|
|
|
|
public function executionsPaginated(int $skip = 0, int $take = 10)
|
|
{
|
|
$executions = $this->hasMany(ScheduledDatabaseBackupExecution::class)->orderBy('created_at', 'desc');
|
|
$count = $executions->count();
|
|
$executions = $executions->skip($skip)->take($take)->get();
|
|
|
|
return [
|
|
'count' => $count,
|
|
'executions' => $executions,
|
|
];
|
|
}
|
|
|
|
public function server()
|
|
{
|
|
if ($this->database) {
|
|
if ($this->database instanceof ServiceDatabase) {
|
|
$destination = data_get($this->database->service, 'destination');
|
|
$server = data_get($destination, 'server');
|
|
} else {
|
|
$destination = data_get($this->database, 'destination');
|
|
$server = data_get($destination, 'server');
|
|
}
|
|
if ($server) {
|
|
return $server;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|