101 lines
3.1 KiB
PHP
101 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use CodeIgniter\Model;
|
|
|
|
class WorkspaceModel extends Model
|
|
{
|
|
protected $table = 'workspaces';
|
|
protected $primaryKey = 'id';
|
|
protected $useAutoIncrement = true;
|
|
protected $returnType = 'array';
|
|
protected $useSoftDeletes = true;
|
|
protected $protectFields = true;
|
|
protected $allowedFields = [
|
|
'name',
|
|
'slug',
|
|
'description',
|
|
'logo',
|
|
'timezone',
|
|
'default_refresh',
|
|
'owner_id',
|
|
'is_active',
|
|
];
|
|
|
|
protected bool $allowEmptyInserts = false;
|
|
protected bool $updateOnlyChanged = true;
|
|
|
|
protected array $casts = [];
|
|
protected array $castHandlers = [];
|
|
|
|
// Dates
|
|
protected $useTimestamps = true;
|
|
protected $dateFormat = 'datetime';
|
|
protected $createdField = 'created_at';
|
|
protected $updatedField = 'updated_at';
|
|
protected $deletedField = 'deleted_at';
|
|
|
|
// Validation
|
|
protected $validationRules = [
|
|
'name' => 'required|min_length[3]|max_length[150]',
|
|
'slug' => 'permit_empty|min_length[3]|max_length[160]',
|
|
'timezone' => 'required|max_length[80]',
|
|
'default_refresh' => 'required|integer',
|
|
'owner_id' => 'required|integer',
|
|
];
|
|
protected $validationMessages = [];
|
|
protected $skipValidation = false;
|
|
protected $cleanValidationRules = true;
|
|
|
|
// Callbacks
|
|
protected $allowCallbacks = true;
|
|
protected $beforeInsert = ['ensureSlug'];
|
|
protected $afterInsert = [];
|
|
protected $beforeUpdate = ['ensureSlug'];
|
|
protected $afterUpdate = [];
|
|
protected $beforeFind = [];
|
|
protected $afterFind = [];
|
|
protected $beforeDelete = [];
|
|
protected $afterDelete = [];
|
|
|
|
public function forUser(int $userId): array
|
|
{
|
|
return $this->select('workspaces.*, workspace_members.role as member_role')
|
|
->join('workspace_members', 'workspace_members.workspace_id = workspaces.id')
|
|
->where('workspace_members.user_id', $userId)
|
|
->where('workspaces.deleted_at', null)
|
|
->orderBy('workspaces.name', 'ASC')
|
|
->findAll();
|
|
}
|
|
|
|
protected function ensureSlug(array $data): array
|
|
{
|
|
if (! isset($data['data']['slug']) || trim((string) $data['data']['slug']) === '') {
|
|
$name = (string) ($data['data']['name'] ?? '');
|
|
$data['data']['slug'] = strtolower(trim(preg_replace('/[^a-z0-9]+/i', '-', $name), '-'));
|
|
}
|
|
|
|
$base = (string) $data['data']['slug'];
|
|
$slug = $base;
|
|
$i = 1;
|
|
|
|
$currentId = $data['data']['id'] ?? ($data['id'][0] ?? null);
|
|
$builder = $this->builder();
|
|
if ($currentId !== null) {
|
|
$builder->where('id !=', (int) $currentId);
|
|
}
|
|
|
|
while ($builder->where('slug', $slug)->countAllResults() > 0) {
|
|
$slug = $base . '-' . $i++;
|
|
$builder = $this->builder();
|
|
if ($currentId !== null) {
|
|
$builder->where('id !=', (int) $currentId);
|
|
}
|
|
}
|
|
|
|
$data['data']['slug'] = $slug;
|
|
return $data;
|
|
}
|
|
}
|