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