feat: publish Dever core with project scaffolding and versioned AI skills
This commit is contained in:
1 parent
70fa73cdc2
commit
ac458ffa7f
960 files changed
+221319
-1163
No files matched your search
@@ -0,0 +1,18 @@
|
||||
# 后台发布计划接口
|
||||
|
||||
后台接口创建发布计划。
|
||||
|
||||
- 包:`publishing.schedule.api.admin.manage`
|
||||
- 公开类型:无
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## 创建计划
|
||||
|
||||
创建请求委托给计划应用。
|
||||
|
||||
- 声明:`post schedule`
|
||||
|
||||
```dever
|
||||
post schedule = app.create
|
||||
```
|
||||
@@ -0,0 +1,166 @@
|
||||
# 发布计划应用
|
||||
|
||||
发布计划应用在事务中写入计划并提交持久化 Job。
|
||||
|
||||
- 包:`publishing.schedule.app`
|
||||
- 公开类型:
|
||||
- `PublishRequest`
|
||||
- `ScheduleView`
|
||||
- 公开方法:
|
||||
- `create`
|
||||
- `publish`
|
||||
- `complete`
|
||||
- `publish_claimed`
|
||||
- 使用:
|
||||
- `publishing.schedule.create(article_id, publish_at)`
|
||||
- `publishing.schedule.publish(input)`
|
||||
- `publishing.schedule.complete(status, schedule_id)`
|
||||
- `publishing.schedule.publish_claimed(changed, article_id)`
|
||||
|
||||
## 发布请求
|
||||
|
||||
Job 只携带计划 ID。
|
||||
|
||||
- 类型:`PublishRequest`
|
||||
- 字段:
|
||||
- `schedule_id: model.id`:持久计划标识
|
||||
|
||||
```dever
|
||||
type PublishRequest {
|
||||
schedule_id: model.id
|
||||
}
|
||||
```
|
||||
|
||||
## 计划视图
|
||||
|
||||
返回计划的公开字段。
|
||||
|
||||
- 类型:`ScheduleView`
|
||||
- 字段:
|
||||
- `id: model.id`:记录标识
|
||||
- `article_id: news.article.model.id`:文章标识
|
||||
- `publish_at: DateTime`:计划执行时间
|
||||
- `status: Text`:业务状态
|
||||
|
||||
```dever
|
||||
type ScheduleView {
|
||||
id: model.id
|
||||
article_id: news.article.model.id
|
||||
publish_at: DateTime
|
||||
status: Text
|
||||
}
|
||||
```
|
||||
|
||||
## 创建计划
|
||||
|
||||
业务记录、Job 和返回视图在同一事务内完成。
|
||||
|
||||
- 函数:`create`
|
||||
- 输入:
|
||||
- `article_id: news.article.model.id`:文章标识
|
||||
- `publish_at: DateTime`:计划执行时间
|
||||
- 输出:
|
||||
- `schedule: ScheduleView`:该声明的业务值
|
||||
|
||||
```dever
|
||||
transaction create(article_id: news.article.model.id, publish_at: DateTime) (
|
||||
schedule: ScheduleView
|
||||
) {
|
||||
news.article.require_schedulable(article_id)
|
||||
stored = model.create(
|
||||
{
|
||||
article_id = article_id
|
||||
publish_at = publish_at
|
||||
}
|
||||
)
|
||||
queued = dever.job.enqueue_at(
|
||||
job.publish,
|
||||
PublishRequest {
|
||||
schedule_id = stored.id
|
||||
},
|
||||
uuid.to_text(stored.uuid),
|
||||
publish_at
|
||||
)
|
||||
discarded = queued
|
||||
schedule = ScheduleView {
|
||||
id = stored.id
|
||||
article_id = stored.article_id
|
||||
publish_at = stored.publish_at
|
||||
status = "pending"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 执行计划
|
||||
|
||||
Worker 首先检查计划状态,再调用文章领域的定时发布入口。
|
||||
|
||||
- 函数:`publish`
|
||||
- 输入:
|
||||
- `input: PublishRequest`:经过类型检查的输入
|
||||
- 输出:无
|
||||
|
||||
```dever
|
||||
transaction publish(input: PublishRequest) () {
|
||||
scheduled = model.get(input.schedule_id)
|
||||
complete(scheduled.status, scheduled.id)
|
||||
}
|
||||
```
|
||||
|
||||
## complete
|
||||
|
||||
发布计划应用在事务中写入计划并提交持久化 Job。
|
||||
|
||||
- 函数:`complete`
|
||||
- 输入:
|
||||
- `status: publishing.schedule.model.ScheduleStatus`:业务状态
|
||||
- `schedule_id: publishing.schedule.model.id`:持久计划标识
|
||||
- 输出:无
|
||||
|
||||
```dever
|
||||
complete(status: model.ScheduleStatus.Completed, schedule_id: model.id) () {}
|
||||
|
||||
complete(status: model.ScheduleStatus.Cancelled, schedule_id: model.id) () {}
|
||||
|
||||
complete(status: model.ScheduleStatus.Pending, schedule_id: model.id) () {
|
||||
scheduled = model.get(schedule_id)
|
||||
domain.require_due(
|
||||
model.exists(
|
||||
{
|
||||
where = id == schedule_id and publish_at <= dever.time.now()
|
||||
}
|
||||
)
|
||||
)
|
||||
changed = model.update(
|
||||
{
|
||||
where = id == scheduled.id and status == model.ScheduleStatus.Pending
|
||||
},
|
||||
{
|
||||
status = model.ScheduleStatus.Completed
|
||||
}
|
||||
)
|
||||
publish_claimed(changed, scheduled.article_id)
|
||||
}
|
||||
```
|
||||
|
||||
## publish_claimed
|
||||
|
||||
发布计划应用在事务中写入计划并提交持久化 Job。
|
||||
|
||||
- 函数:`publish_claimed`
|
||||
- 输入:
|
||||
- `changed: Int`:条件更新影响行数
|
||||
- `article_id: news.article.model.id`:文章标识
|
||||
- 输出:无
|
||||
|
||||
```dever
|
||||
publish_claimed(changed: 0, article_id: news.article.model.id) () {}
|
||||
|
||||
publish_claimed(changed: 1, article_id: news.article.model.id) () {
|
||||
publication = news.article.publish_scheduled(article_id)
|
||||
}
|
||||
|
||||
publish_claimed(changed: other, article_id: news.article.model.id) () {
|
||||
fail(dever.api.Error.Conflict)
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,25 @@
|
||||
# 发布计划规则
|
||||
|
||||
计划任务只允许待发布记录进入执行流程。
|
||||
|
||||
- 包:`publishing.schedule.domain`
|
||||
- 公开类型:无
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## require_due
|
||||
|
||||
计划任务只允许待发布记录进入执行流程。
|
||||
|
||||
- 函数:`require_due`
|
||||
- 输入:
|
||||
- `valid: Bool`:该声明的业务值
|
||||
- 输出:无
|
||||
|
||||
```dever
|
||||
require_due(valid: true) () pure {}
|
||||
|
||||
require_due(valid: false) () pure {
|
||||
fail(dever.api.Error.Invalid)
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,33 @@
|
||||
# 发布计划任务
|
||||
|
||||
发布计划任务由持久化 Job 执行。
|
||||
|
||||
- 包:`publishing.schedule.job`
|
||||
- 公开类型:无
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## 队列连接
|
||||
|
||||
使用默认数据库连接。
|
||||
|
||||
- 声明:`database default`
|
||||
|
||||
```dever
|
||||
database default
|
||||
```
|
||||
|
||||
## 发布任务
|
||||
|
||||
任务委托给发布计划应用。
|
||||
|
||||
- 函数:`publish`
|
||||
- 输入:
|
||||
- `input: publishing.schedule.PublishRequest`:发布请求
|
||||
- 输出:无
|
||||
|
||||
```dever
|
||||
job publish(input: app.PublishRequest) () retry(3) timeout(30000) {
|
||||
app.publish(input)
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,48 @@
|
||||
# 发布计划模型
|
||||
|
||||
发布计划保存文章的计划时间和幂等状态。
|
||||
|
||||
- 包:`publishing.schedule.model`
|
||||
- 公开类型:
|
||||
- `ScheduleStatus`
|
||||
- `Schedule`
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## 计划状态
|
||||
|
||||
计划状态枚举。
|
||||
|
||||
- 类型:`ScheduleStatus`
|
||||
- 分支:
|
||||
- `Pending`:该声明的业务值
|
||||
- `Completed`:该声明的业务值
|
||||
- `Cancelled`:该声明的业务值
|
||||
|
||||
```dever
|
||||
type ScheduleStatus {
|
||||
Pending = "待发布"
|
||||
Completed = "已完成"
|
||||
Cancelled = "已取消"
|
||||
}
|
||||
```
|
||||
|
||||
## 发布计划
|
||||
|
||||
计划关联文章和执行时间。
|
||||
|
||||
- 类型:`Schedule`
|
||||
- 字段:
|
||||
- `uuid: Uuid`:计划独立去重标识
|
||||
- `article_id: news.article.model.id`:文章标识
|
||||
- `publish_at: DateTime`:计划执行时间
|
||||
- `status: ScheduleStatus`:业务状态
|
||||
|
||||
```dever
|
||||
type Schedule {
|
||||
uuid: Uuid generated unique
|
||||
article_id: news.article.model.id unique
|
||||
publish_at: DateTime index
|
||||
status: ScheduleStatus default ScheduleStatus.Pending index
|
||||
}
|
||||
```
|
||||
Reference in new issue
Block a user