chartboard/app/Models/WorkspaceModel.php
2026-03-30 09:51:33 +05:30

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;
}
}