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,24 @@
|
||||
# 媒体本地适配器
|
||||
|
||||
本地适配器使用受控 data/upload 路径保存上传内容。
|
||||
|
||||
- 包:`media.asset.adapter`
|
||||
- 公开类型:无
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## 本地存储
|
||||
|
||||
适配器实现媒体存储端口。
|
||||
|
||||
- 函数:`port.store`
|
||||
- 输入:
|
||||
- `file: Upload`:上传文件
|
||||
- 输出:
|
||||
- `key: Uuid`:存储键
|
||||
|
||||
```dever
|
||||
port.store(file: Upload) (key: Uuid) {
|
||||
key = dever.storage.put(file)
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,18 @@
|
||||
# 后台媒体接口
|
||||
|
||||
后台媒体接口只开放上传动作。
|
||||
|
||||
- 包:`media.asset.api.admin.manage`
|
||||
- 公开类型:无
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## 上传媒体
|
||||
|
||||
上传请求委托给媒体应用。
|
||||
|
||||
- 声明:`post upload`
|
||||
|
||||
```dever
|
||||
post upload = app.store
|
||||
```
|
||||
@@ -0,0 +1,107 @@
|
||||
# 媒体资源应用
|
||||
|
||||
媒体应用通过 Storage Port 接收上传并保存元数据。
|
||||
|
||||
- 包:`media.asset.app`
|
||||
- 公开类型:
|
||||
- `StoreResult`
|
||||
- 公开方法:
|
||||
- `store`
|
||||
- `require_ready`
|
||||
- `ready`
|
||||
- 使用:
|
||||
- `media.asset.store(file)`
|
||||
- `media.asset.require_ready(id)`
|
||||
- `media.asset.ready(available)`
|
||||
|
||||
## 保存结果
|
||||
|
||||
返回资源公开元数据。
|
||||
|
||||
- 类型:`StoreResult`
|
||||
- 字段:
|
||||
- `id: model.id`:记录标识
|
||||
- `storage_key: Uuid`:该声明的业务值
|
||||
- `filename: Text`:该声明的业务值
|
||||
- `content_type: Text`:该声明的业务值
|
||||
- `size: Int`:受限页大小
|
||||
|
||||
```dever
|
||||
type StoreResult {
|
||||
id: model.id
|
||||
storage_key: Uuid
|
||||
filename: Text
|
||||
content_type: Text
|
||||
size: Int
|
||||
}
|
||||
```
|
||||
|
||||
## 保存上传
|
||||
|
||||
文件内容只能通过 Port 交给 Adapter。
|
||||
|
||||
- 函数:`store`
|
||||
- 输入:
|
||||
- `file: Upload`:该声明的业务值
|
||||
- 输出:
|
||||
- `result: StoreResult`:该声明的业务值
|
||||
|
||||
```dever
|
||||
store(file: Upload) (result: StoreResult) {
|
||||
filename = dever.api.upload_filename(file)
|
||||
content_type = dever.api.upload_content_type(file)
|
||||
size = dever.api.upload_size(file)
|
||||
key = port.store(file)
|
||||
asset = model.create(
|
||||
{
|
||||
storage_key = key
|
||||
filename = filename
|
||||
content_type = content_type
|
||||
size = size
|
||||
}
|
||||
)
|
||||
audit.operation.record(audit.operation.model.OperationKind.Upload, "asset", filename)
|
||||
result = StoreResult {
|
||||
id = asset.id
|
||||
storage_key = asset.storage_key
|
||||
filename = asset.filename
|
||||
content_type = asset.content_type
|
||||
size = asset.size
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## require_ready
|
||||
|
||||
媒体应用通过 Storage Port 接收上传并保存元数据。
|
||||
|
||||
- 函数:`require_ready`
|
||||
- 输入:
|
||||
- `id: media.asset.model.id?`:记录标识
|
||||
- 输出:无
|
||||
|
||||
```dever
|
||||
require_ready(id: model.id) () {
|
||||
stored = model.get(id)
|
||||
ready(stored.status == model.AssetStatus.Ready)
|
||||
}
|
||||
|
||||
require_ready(id: null) () {}
|
||||
```
|
||||
|
||||
## ready
|
||||
|
||||
媒体应用通过 Storage Port 接收上传并保存元数据。
|
||||
|
||||
- 函数:`ready`
|
||||
- 输入:
|
||||
- `available: Bool`:该声明的业务值
|
||||
- 输出:无
|
||||
|
||||
```dever
|
||||
ready(available: true) () {}
|
||||
|
||||
ready(available: false) () {
|
||||
fail(dever.api.Error.Conflict)
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,48 @@
|
||||
# 媒体资源模型
|
||||
|
||||
媒体模型只保存受控存储键和文件元数据。
|
||||
|
||||
- 包:`media.asset.model`
|
||||
- 公开类型:
|
||||
- `AssetStatus`
|
||||
- `Asset`
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## 资源状态
|
||||
|
||||
资源生命周期状态。
|
||||
|
||||
- 类型:`AssetStatus`
|
||||
- 分支:
|
||||
- `Ready`:就绪
|
||||
- `Removed`:已删除
|
||||
|
||||
```dever
|
||||
type AssetStatus {
|
||||
Ready = "就绪"
|
||||
Removed = "已删除"
|
||||
}
|
||||
```
|
||||
|
||||
## 资源记录
|
||||
|
||||
资源元数据不包含上传内容本身。
|
||||
|
||||
- 类型:`Asset`
|
||||
- 字段:
|
||||
- `storage_key: Uuid`:存储键
|
||||
- `filename: Text(1, 255)`:文件名
|
||||
- `content_type: Text(1, 160)`:内容类型
|
||||
- `size: Int`:大小
|
||||
- `status: AssetStatus`:状态
|
||||
|
||||
```dever
|
||||
type Asset {
|
||||
storage_key: Uuid unique
|
||||
filename: Text(1, 255)
|
||||
content_type: Text(1, 160)
|
||||
size: Int
|
||||
status: AssetStatus default AssetStatus.Ready index
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,23 @@
|
||||
# 媒体存储端口
|
||||
|
||||
媒体应用通过端口隔离存储实现。
|
||||
|
||||
- 包:`media.asset.port`
|
||||
- 公开类型:无
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## 保存上传
|
||||
|
||||
端口只声明上传内容到存储的契约。
|
||||
|
||||
- 函数:`store`
|
||||
- 输入:
|
||||
- `file: Upload`:上传文件
|
||||
- 输出:
|
||||
- `key: Uuid`:存储键
|
||||
- 允许失败:`dever.storage.PutResult`
|
||||
|
||||
```dever
|
||||
store(file: Upload) (key: Uuid) fails dever.storage.PutResult
|
||||
```
|
||||
Reference in new issue
Block a user