dootask/app/Observers/ProjectObserver.php
kuaifan fe7a2a0e73 feat: 扩展 SeekDB 支持联系人、项目、任务的 AI 搜索
- 合并 SeekDBFileSyncTask 到 SeekDBSyncTask
- 统一 AI 搜索 API 入口
2025-12-30 07:48:00 +00:00

103 lines
2.8 KiB
PHP

<?php
namespace App\Observers;
use App\Models\Deleted;
use App\Models\Project;
use App\Models\ProjectUser;
use App\Tasks\SeekDBSyncTask;
class ProjectObserver extends AbstractObserver
{
/**
* Handle the Project "created" event.
*
* @param \App\Models\Project $project
* @return void
*/
public function created(Project $project)
{
self::taskDeliver(new SeekDBSyncTask('project_sync', $project->toArray()));
}
/**
* Handle the Project "updated" event.
*
* @param \App\Models\Project $project
* @return void
*/
public function updated(Project $project)
{
if ($project->isDirty('archived_at')) {
$userids = $this->userids($project);
if ($project->archived_at) {
Deleted::record('project', $project->id, $userids);
} else {
Deleted::forget('project', $project->id, $userids);
}
}
// 检查是否有搜索相关字段变化
$searchableFields = ['name', 'desc', 'archived_at'];
$isDirty = false;
foreach ($searchableFields as $field) {
if ($project->isDirty($field)) {
$isDirty = true;
break;
}
}
if ($isDirty) {
if ($project->archived_at) {
self::taskDeliver(new SeekDBSyncTask('project_delete', ['project_id' => $project->id]));
} else {
self::taskDeliver(new SeekDBSyncTask('project_sync', $project->toArray()));
}
}
}
/**
* Handle the Project "deleted" event.
*
* @param \App\Models\Project $project
* @return void
*/
public function deleted(Project $project)
{
Deleted::record('project', $project->id, $this->userids($project));
self::taskDeliver(new SeekDBSyncTask('project_delete', ['project_id' => $project->id]));
}
/**
* Handle the Project "restored" event.
*
* @param \App\Models\Project $project
* @return void
*/
public function restored(Project $project)
{
Deleted::forget('project', $project->id, $this->userids($project));
self::taskDeliver(new SeekDBSyncTask('project_sync', $project->toArray()));
}
/**
* Handle the Project "force deleted" event.
*
* @param \App\Models\Project $project
* @return void
*/
public function forceDeleted(Project $project)
{
self::taskDeliver(new SeekDBSyncTask('project_delete', ['project_id' => $project->id]));
}
/**
* @param Project $project
* @return array
*/
private function userids(Project $project)
{
return ProjectUser::whereProjectId($project->id)->pluck('userid')->toArray();
}
}