Files
social-app/docs/protocols/calendar/schedule-items.md
T

330 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Schedule Items 协议
本文档定义 `/api/v1/schedule-items` 的日历日程管理协议。
Base URL: `/api/v1/schedule-items`
---
## 端点
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | `` | 创建日程 |
| GET | `` | 按日期范围查询日程 |
| GET | `/{item_id}` | 获取指定日程详情 |
| PATCH | `/{item_id}` | 更新日程 |
| DELETE | `/{item_id}` | 删除日程 |
| POST | `/{item_id}/share` | 分享日程给其他用户 |
| POST | `/{item_id}/accept` | 接受日程订阅 |
| POST | `/{item_id}/reject` | 拒绝日程订阅 |
---
## 枚举类型
### ScheduleItemStatus
| 值 | 说明 |
|---|---|
| `active` | 进行中 |
| `archived` | 已归档 |
兼容策略:历史数据中若存在 `completed` 或 `canceled`,服务端统一按 `archived` 语义处理;新写入仅允许 `active` 或 `archived`。
### ScheduleItemSourceType
| 值 | 说明 |
|---|---|
| `manual` | 手动创建 |
| `imported` | 导入 |
| `agent_generated` | Agent 生成 |
### AttachmentType
| 值 | 说明 |
|---|---|
| `document` | 文档 |
| `reminder` | 提醒 |
---
## 数据结构
### ScheduleItemMetadata
```json
{
"color": "#FF5733 | null",
"location": "string | null",
"notes": "string | null",
"attachments": [
{
"name": "string",
"type": "document | reminder",
"visible_to": ["uuid"],
"url": "string | null",
"note": "string | null",
"content": "string | null"
}
],
"reminder_minutes": "int (0-10080) | null",
"version": 1
}
```
### ScheduleItemCreateRequest
```json
{
"title": "string (1-255)",
"description": "string | null (max 2000)",
"start_at": "datetime (必须包含时区)",
"end_at": "datetime | null (必须包含时区)",
"timezone": "string (IANA 时区)",
"metadata": "ScheduleItemMetadata | null"
}
```
### ScheduleItemUpdateRequest
```json
{
"title": "string | null (1-255)",
"description": "string | null (max 2000)",
"start_at": "datetime | null (必须包含时区)",
"end_at": "datetime | null (必须包含时区)",
"timezone": "string | null (IANA 时区)",
"metadata": "ScheduleItemMetadata | null",
"status": "ScheduleItemStatus | null (active | archived)"
}
```
### ScheduleItemResponse
```json
{
"id": "uuid",
"owner_id": "uuid",
"title": "string",
"description": "string | null",
"start_at": "datetime",
"end_at": "datetime | null",
"timezone": "string",
"metadata": "ScheduleItemMetadata | null",
"status": "ScheduleItemStatus",
"source_type": "ScheduleItemSourceType",
"created_at": "datetime",
"updated_at": "datetime",
"permission": "int (位掩码: 1=view, 2=invite, 4=edit, 8=delete, 15=owner)",
"is_owner": "boolean (当前用户是否为日程所有者)",
"subscribers": ["SubscriberInfo"]
}
```
### SubscriberInfo
```json
{
"user_id": "uuid",
"username": "string | null",
"avatar_url": "string | null",
"phone": "string | null",
"permission": "int (位掩码: 1=view, 2=invite, 4=edit, 8=delete, 15=owner)",
"status": "string (active | pending | unsubscribed)",
"subscribed_at": "datetime"
}
```
说明:
- `subscribers` 列表仅包含状态为 `active` 的订阅者
- `phone` 字段来自 Supabase Auth,用于显示订阅者手机号
- 前端显示优先级:`phone ?? username ?? user_id`
### ScheduleItemShareRequest
```json
{
"phone": "+8613812345678",
"permission_view": "boolean (default: true)",
"permission_edit": "boolean (default: false)",
"permission_invite": "boolean (default: false)"
}
```
说明:
- 分享目标仅支持 `phone`E.164 中国手机号,如 `+8613812345678`),不接受 `user_id` 作为分享入参。
- `permission_view`、`permission_edit`、`permission_invite` 为布尔值,内部会转换为位掩码整数:
- `permission_view = 1`
- `permission_invite = 2`
- `permission_edit = 4`
- `permission_delete = 8`
- `permission_owner = 15`
### ScheduleItemShareResponse
```json
{
"message": "string"
}
```
---
## 1) POST `/`
创建日程。
### Request
`ScheduleItemCreateRequest` 对象。
### Response
`ScheduleItemResponse` 对象,状态码 201。
---
## 2) GET `/`
按日期范围查询日程。
### Query Parameters
- `start_at`: 开始时间(必须包含时区)
- `end_at`: 结束时间(必须包含时区)
### Response
`ScheduleItemResponse` 对象数组。
---
## 3) GET `/{item_id}`
获取指定日程详情。
### Path Parameters
- `item_id`: 日程 UUID
### Response
`ScheduleItemResponse` 对象。
---
## 4) PATCH `/{item_id}`
更新日程(部分更新)。
### Authorization
- **Owner**: 可更新所有字段
- **Subscriber (EDIT permission)**: 可更新所有字段(权限位掩码包含 `4`
### Path Parameters
- `item_id`: 日程 UUID
### Request
`ScheduleItemUpdateRequest` 对象。
### Response
`ScheduleItemResponse` 对象。
### Error Responses
| Status | Code | 说明 |
|--------|------|------|
| 403 | `SCHEDULE_ITEM_FORBIDDEN` | 当前用户无权编辑此日程 |
| 404 | `SCHEDULE_ITEM_NOT_FOUND` | 日程不存在或用户既不是 owner 也没有订阅 |
---
## 5) DELETE `/{item_id}`
删除日程。
### Authorization
- **Owner**: 可删除日程(权限位掩码包含 `8`
- **Subscriber (DELETE permission)**: 可删除日程(权限位掩码包含 `8`
### Path Parameters
- `item_id`: 日程 UUID
### Response
204 No Content。
### Error Responses
| Status | Code | 说明 |
|--------|------|------|
| 403 | `SCHEDULE_ITEM_FORBIDDEN` | 当前用户无权删除此日程 |
| 404 | `SCHEDULE_ITEM_NOT_FOUND` | 日程不存在或用户既不是 owner 也没有订阅 |
---
## 6) POST `/{item_id}/share`
按手机号分享日程给已接受好友。
### Path Parameters
- `item_id`: 日程 UUID
### Request
`ScheduleItemShareRequest` 对象。
- `phone`: 分享目标手机号(E.164,中国号段,如 `+8613xxxxxxxxx`
- `permission_view`: 是否授予查看权限
- `permission_edit`: 是否授予编辑权限
- `permission_invite`: 是否授予继续邀请权限
### Response
`ScheduleItemShareResponse` 对象。
### Error Responses
| Status | Code | 说明 |
|--------|------|------|
| 403 | `SCHEDULE_ITEM_SHARE_FORBIDDEN` | 当前用户无分享权限 |
| 403 | `SCHEDULE_ITEM_SHARE_PERMISSION_EXCEEDED` | 授权位超过当前用户可授予上限 |
| 403 | `SCHEDULE_ITEM_SHARE_TARGET_NOT_FRIEND` | 仅允许分享给已接受好友 |
| 404 | `SCHEDULE_ITEM_NOT_FOUND` | 日程不存在 |
---
## 7) POST `/{item_id}/accept`
接受日程订阅邀请。
### Path Parameters
- `item_id`: 日程 UUID
### Response
字典对象。
---
## 8) POST `/{item_id}/reject`
拒绝日程订阅邀请。
### Path Parameters
- `item_id`: 日程 UUID
### Response
字典对象。