v79 服务端:端上任务面板需要的三个口子

配合鸿蒙端 v79(任务面板 / 任务模块功能补齐),服务端只补三处,
其余全部复用既有路由。

① GET /api/v1/tasks?view=boards —— 只回看板 + 分类元数据,**不带任务**。
   端上原来是从已加载任务里反推看板,那样只能看到"有任务的看板":
   用户刚建好、还没放任务的看板在端上永远选不到(表现为"网页能建,
   端上挪不过去")。

② POST /api/v1/tasks/<id>/attach(multipart 字段 file)与
   DELETE /api/v1/tasks/<id>/attach?attachment_id=<aid> —— 都要先
   requireWrite() 再 Task::canWrite(),两者都回整条任务(端上直接重画)。

③ ApiHandler::taskOut() —— Task::find() 只 SELECT t.*,不含看板名/色
   ⇒ 详情与各动作回包统一补 board_name / board_color_calc(7 个返回点)。

🔴 两条踩过的坑写进注释:
   · Api::dispatch() 只解析「资源/id/子动作」三段,附件 id 不能拼进路径;
   · DELETE 带 JSON body 时 Api::param 读不到(实测),id 必须走 query。

另新增 Attachment::removeFrom():删附件前先确认它确实挂在这条任务上,
拿别条任务的附件 id 来删自己的 → 404(已由 _fb_v79_api.py 钉死)。

验证:php -l 全过、e2e 1558/0、_fb_v79_api.py 26/0、已部署并冒烟。
This commit is contained in:
2026-10-22 16:40:52 +08:00
parent 40fd6c501c
commit f927d7fb23
2 changed files with 123 additions and 5 deletions
+23
View File
@@ -128,6 +128,29 @@ final class Attachment
}
}
/**
* 删**某个宿主名下**的一颗附件(v79,App API 用)。
*
* 🔴 为什么不能直接用 `remove($id)`:那个只认附件 id,谁传一个别的任务的
* 附件 id 过来都能删掉(越权)。这里把 owner 一起放进 WHERE,
* 「不是这条任务的」一律返回 false,调用方据此回 404。
*/
public static function removeFrom(string $type, int $targetId, int $id): bool
{
if ($id <= 0) {
return false;
}
$st = Database::get()->prepare(
'SELECT COUNT(*) FROM attachments WHERE id = ? AND target_type = ? AND target_id = ?'
);
$st->execute([$id, $type, $targetId]);
if ((int)$st->fetchColumn() <= 0) {
return false;
}
self::remove($id);
return true;
}
/**
* 这个附件是「哪一类」—— 决定页面上画缩略图还是画图标、点开是预览还是下载。
*