Initial Dever 0.0.1
This commit is contained in:
commit
81233d098c
1479 files changed
+163782
No files matched your search
@@ -0,0 +1,8 @@
|
||||
# 会话认证
|
||||
|
||||
验证站点会话、用户、租户和成员关系。
|
||||
|
||||
- [业务操作](doc/app.md)
|
||||
- [成员关系](doc/model-membership.md)
|
||||
- [数据结构](doc/model.md)
|
||||
- [调用流程](link.md)
|
||||
@@ -0,0 +1,60 @@
|
||||
type Identity {
|
||||
id: Text
|
||||
user_id: access.user.model.id?
|
||||
tenant_id: access.tenant.model.id?
|
||||
}
|
||||
|
||||
verify(claims: dever.auth.Claims) (identity: Identity) {
|
||||
identity = findSession(uuid.parse(claims.session), claims.tenant, claims)
|
||||
}
|
||||
|
||||
findSession(session_id: Uuid, selected_key: Text, claims: dever.auth.Claims) (
|
||||
identity: Identity
|
||||
) {
|
||||
stored = model.first(
|
||||
{
|
||||
where = uuid == session_id and subject == claims.subject and site == claims.site and tenant_key == selected_key and revoked == false and expires_at > dever.time.now(
|
||||
)
|
||||
}
|
||||
)
|
||||
identity = verified(stored)
|
||||
}
|
||||
|
||||
findSession(session_id: null, selected_key: Text?, claims: dever.auth.Claims) (
|
||||
identity: Identity
|
||||
) {
|
||||
fail(dever.api.Error.Unauthorized)
|
||||
}
|
||||
|
||||
findSession(session_id: Uuid, selected_key: null, claims: dever.auth.Claims) (
|
||||
identity: Identity
|
||||
) {
|
||||
fail(dever.api.Error.Unauthorized)
|
||||
}
|
||||
|
||||
verified(stored: model.Session) (identity: Identity) {
|
||||
access.user.requireActive(stored.user_id)
|
||||
access.tenant.requireActive(stored.tenant_id, stored.tenant_key)
|
||||
requireMembership(
|
||||
model.membership.exists(
|
||||
{
|
||||
where = user_id == stored.user_id and tenant_id == stored.tenant_id and active == true
|
||||
}
|
||||
)
|
||||
)
|
||||
identity = Identity {
|
||||
id = stored.subject
|
||||
user_id = stored.user_id
|
||||
tenant_id = stored.tenant_id
|
||||
}
|
||||
}
|
||||
|
||||
verified(stored: null) (identity: Identity) {
|
||||
fail(dever.api.Error.Unauthorized)
|
||||
}
|
||||
|
||||
requireMembership(active: true) () {}
|
||||
|
||||
requireMembership(active: false) () {
|
||||
fail(dever.api.Error.Unauthorized)
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
# 业务操作
|
||||
|
||||
## access.session.Identity
|
||||
|
||||
认证后的主体、用户编号和租户编号。
|
||||
|
||||
## access.session.verify
|
||||
|
||||
检查会话声明以及用户、租户和成员状态,返回可信身份。
|
||||
|
||||
## access.session.findSession
|
||||
|
||||
按 UUID、主体、站点和租户查找未撤销且未过期的会话;缺失或无效时返回未授权。
|
||||
|
||||
## access.session.verified
|
||||
|
||||
验证已找到会话的用户、租户和成员状态;空记录返回未授权。
|
||||
|
||||
## access.session.requireMembership
|
||||
|
||||
成员关系启用时通过,否则返回未授权。
|
||||
@@ -0,0 +1,5 @@
|
||||
# 成员关系
|
||||
|
||||
## access.session.model.membership.Membership
|
||||
|
||||
平台库中的用户与租户成员关系,每对用户和租户唯一。
|
||||
@@ -0,0 +1,5 @@
|
||||
# 数据结构
|
||||
|
||||
## access.session.model.Session
|
||||
|
||||
平台库中的站点会话,保存用户、租户、有效期和撤销状态。
|
||||
@@ -0,0 +1,231 @@
|
||||
<!-- Generated by dever inspect --links. Do not edit. -->
|
||||
<!-- source-sha256: 1e9b28fb1ca00f29b41bebdf0b358f4e1a1b787fb2a524aea6377dd8b98ab87b -->
|
||||
|
||||
# access.session
|
||||
|
||||
按求值顺序展示调用、分支和任务调度,包含 API 与自动 REST 入口。点击节点打开源码;双框为调用,虚线为调度或错误路径。外部库和驱动不展开。
|
||||
|
||||
图不是某次运行的日志,分句和 Adapter 按输入或配置选择。修改源码后运行 `dever inspect . --links`。
|
||||
|
||||
## 入口
|
||||
|
||||
没有已收录的入口。
|
||||
|
||||
## 外部调用方
|
||||
|
||||
| 能力 | 调用方 | 方式 | 调用位置 |
|
||||
| --- | --- | --- | --- |
|
||||
| [access.session.verify](app.dever#L7) | [content.article.api.admin.entries.rest](../../content/article/api/admin/entries.dever#L1) | 身份验证 | [../../content/article/api/admin/entries.dever:1:1](../../content/article/api/admin/entries.dever#L1,1) |
|
||||
| [access.session.verify](app.dever#L7) | [system.health.api.admin.status.ready](../../system/health/api/admin/status.dever#L1) | 身份验证 | [../../system/health/api/admin/status.dever:1:20](../../system/health/api/admin/status.dever#L1,20) |
|
||||
|
||||
## 能力与内部调用
|
||||
|
||||
### access.session.Identity
|
||||
|
||||
定义:[app.dever:1:1](app.dever#L1,1)
|
||||
|
||||
没有已收录的下游调用。
|
||||
|
||||
### access.session.findSession
|
||||
|
||||
定义:[app.dever:11:1](app.dever#L11,1)、[app.dever:23:1](app.dever#L23,1)、[app.dever:29:1](app.dever#L29,1)
|
||||
|
||||
<a id="flow-390194c3c1297291-1"></a>
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
n0(["findSession"])
|
||||
click n0 href "app.dever#L11,1" "打开源码"
|
||||
n1(["返回"])
|
||||
n2(["传播错误"])
|
||||
n3{"按实参匹配分句(互斥)"}
|
||||
n4["session_id: Uuid 且 selected_key: Text"]
|
||||
click n4 href "app.dever#L11,1" "打开源码"
|
||||
n5[["dever.time.now"]]
|
||||
click n5 href "app.dever#L16,157" "打开源码"
|
||||
n6["access.session.model.first"]
|
||||
click n6 href "app.dever#L14,12" "打开源码"
|
||||
n7["赋值 stored"]
|
||||
click n7 href "app.dever#L14,12" "打开源码"
|
||||
n8[["access.session.verified"]]
|
||||
click n8 href "app.dever#L20,14" "打开源码"
|
||||
n9["赋值 identity"]
|
||||
click n9 href "app.dever#L20,14" "打开源码"
|
||||
n10["session_id: null"]
|
||||
click n10 href "app.dever#L23,1" "打开源码"
|
||||
n11["fail dever.api.Error.Unauthorized"]
|
||||
click n11 href "app.dever#L26,8" "打开源码"
|
||||
n12["session_id: Uuid 且 selected_key: null"]
|
||||
click n12 href "app.dever#L29,1" "打开源码"
|
||||
n13["fail dever.api.Error.Unauthorized"]
|
||||
click n13 href "app.dever#L32,8" "打开源码"
|
||||
n0 --> n3
|
||||
n3 -->|"session_id: Uuid 且 selected_key: Text"| n4
|
||||
n4 --> n5
|
||||
n5 --> n6
|
||||
n6 --> n7
|
||||
n7 --> n8
|
||||
n8 --> n9
|
||||
n9 --> n1
|
||||
n3 -->|"session_id: null"| n10
|
||||
n10 --> n11
|
||||
n11 --> n2
|
||||
n3 -->|"session_id: Uuid 且 selected_key: null"| n12
|
||||
n12 --> n13
|
||||
n13 --> n2
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>源码与子流程</summary>
|
||||
|
||||
| 节点 | 源码 | 子流程 |
|
||||
| --- | --- | --- |
|
||||
| dever.time.now | [app.dever:16:157](app.dever#L16,157) | 依赖或生成的分派(本页不展开) |
|
||||
| access.session.verified | [app.dever:20:14](app.dever#L20,14) | [access.session.verified](link.md#flow-d703972fda2ee383-1) |
|
||||
|
||||
</details>
|
||||
|
||||
| 目标 | 归属 | 方式 | 调用位置 |
|
||||
| --- | --- | --- | --- |
|
||||
| [access.session.model.first](model.dever#L1) | 领域内 | 内建操作 | [app.dever:14:12](app.dever#L14,12) |
|
||||
| `dever.time.now` | 依赖 | 调用 | [app.dever:16:157](app.dever#L16,157) |
|
||||
| [access.session.verified](app.dever#L35) | 领域内 | 调用 | [app.dever:20:14](app.dever#L20,14) |
|
||||
|
||||
### access.session.model.Session
|
||||
|
||||
定义:[model.dever:1:1](model.dever#L1,1)
|
||||
|
||||
没有已收录的下游调用。
|
||||
|
||||
### access.session.model.membership.Membership
|
||||
|
||||
定义:[model/membership.dever:1:1](model/membership.dever#L1,1)
|
||||
|
||||
没有已收录的下游调用。
|
||||
|
||||
### access.session.requireMembership
|
||||
|
||||
定义:[app.dever:56:1](app.dever#L56,1)、[app.dever:58:1](app.dever#L58,1)
|
||||
|
||||
<a id="flow-322031245e905aab-1"></a>
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
n0(["requireMembership"])
|
||||
click n0 href "app.dever#L56,1" "打开源码"
|
||||
n1(["返回"])
|
||||
n2(["传播错误"])
|
||||
n3{"按实参匹配分句(互斥)"}
|
||||
n4["active: true"]
|
||||
click n4 href "app.dever#L56,1" "打开源码"
|
||||
n5["active: false"]
|
||||
click n5 href "app.dever#L58,1" "打开源码"
|
||||
n6["fail dever.api.Error.Unauthorized"]
|
||||
click n6 href "app.dever#L59,8" "打开源码"
|
||||
n0 --> n3
|
||||
n3 -->|"active: true"| n4
|
||||
n4 --> n1
|
||||
n3 -->|"active: false"| n5
|
||||
n5 --> n6
|
||||
n6 --> n2
|
||||
```
|
||||
|
||||
没有已收录的下游调用。
|
||||
|
||||
### access.session.verified
|
||||
|
||||
定义:[app.dever:35:1](app.dever#L35,1)、[app.dever:52:1](app.dever#L52,1)
|
||||
|
||||
<a id="flow-d703972fda2ee383-1"></a>
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
n0(["verified"])
|
||||
click n0 href "app.dever#L35,1" "打开源码"
|
||||
n1(["返回"])
|
||||
n2(["传播错误"])
|
||||
n3{"按实参匹配分句(互斥)"}
|
||||
n4["stored: model.Session"]
|
||||
click n4 href "app.dever#L35,1" "打开源码"
|
||||
n5[["access.user.requireActive"]]
|
||||
click n5 href "app.dever#L36,3" "打开源码"
|
||||
n6[["access.tenant.requireActive"]]
|
||||
click n6 href "app.dever#L37,3" "打开源码"
|
||||
n7["access.session.model.membership.exists"]
|
||||
click n7 href "app.dever#L39,5" "打开源码"
|
||||
n8[["access.session.requireMembership"]]
|
||||
click n8 href "app.dever#L38,3" "打开源码"
|
||||
n9["赋值 identity"]
|
||||
click n9 href "app.dever#L45,14" "打开源码"
|
||||
n10["stored: null"]
|
||||
click n10 href "app.dever#L52,1" "打开源码"
|
||||
n11["fail dever.api.Error.Unauthorized"]
|
||||
click n11 href "app.dever#L53,8" "打开源码"
|
||||
n0 --> n3
|
||||
n3 -->|"stored: model.Session"| n4
|
||||
n4 --> n5
|
||||
n5 --> n6
|
||||
n6 --> n7
|
||||
n7 --> n8
|
||||
n8 --> n9
|
||||
n9 --> n1
|
||||
n3 -->|"stored: null"| n10
|
||||
n10 --> n11
|
||||
n11 --> n2
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>源码与子流程</summary>
|
||||
|
||||
| 节点 | 源码 | 子流程 |
|
||||
| --- | --- | --- |
|
||||
| access.user.requireActive | [app.dever:36:3](app.dever#L36,3) | [access.user.requireActive](../user/link.md#flow-f368d51d0e19702c-1) |
|
||||
| access.tenant.requireActive | [app.dever:37:3](app.dever#L37,3) | [access.tenant.requireActive](../tenant/link.md#flow-8fb2bcc151c4208d-1) |
|
||||
| access.session.requireMembership | [app.dever:38:3](app.dever#L38,3) | [access.session.requireMembership](link.md#flow-322031245e905aab-1) |
|
||||
|
||||
</details>
|
||||
|
||||
| 目标 | 归属 | 方式 | 调用位置 |
|
||||
| --- | --- | --- | --- |
|
||||
| [access.user.requireActive](../user/app.dever#L1) | 跨领域 [access.user](../user/link.md) | 调用 | [app.dever:36:3](app.dever#L36,3) |
|
||||
| [access.tenant.requireActive](../tenant/app.dever#L1) | 跨领域 [access.tenant](../tenant/link.md) | 调用 | [app.dever:37:3](app.dever#L37,3) |
|
||||
| [access.session.requireMembership](app.dever#L56) | 领域内 | 调用 | [app.dever:38:3](app.dever#L38,3) |
|
||||
| [access.session.model.membership.exists](model/membership.dever#L1) | 领域内 | 内建操作 | [app.dever:39:5](app.dever#L39,5) |
|
||||
|
||||
### access.session.verify
|
||||
|
||||
定义:[app.dever:7:1](app.dever#L7,1)
|
||||
|
||||
<a id="flow-01943b8d6356f307-1"></a>
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
n0(["verify"])
|
||||
click n0 href "app.dever#L7,1" "打开源码"
|
||||
n1(["返回"])
|
||||
n3[["uuid.parse"]]
|
||||
click n3 href "app.dever#L8,26" "打开源码"
|
||||
n4[["access.session.findSession"]]
|
||||
click n4 href "app.dever#L8,14" "打开源码"
|
||||
n5["赋值 identity"]
|
||||
click n5 href "app.dever#L8,14" "打开源码"
|
||||
n0 --> n3
|
||||
n3 --> n4
|
||||
n4 --> n5
|
||||
n5 --> n1
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>源码与子流程</summary>
|
||||
|
||||
| 节点 | 源码 | 子流程 |
|
||||
| --- | --- | --- |
|
||||
| uuid.parse | [app.dever:8:26](app.dever#L8,26) | 依赖或生成的分派(本页不展开) |
|
||||
| access.session.findSession | [app.dever:8:14](app.dever#L8,14) | [access.session.findSession](link.md#flow-390194c3c1297291-1) |
|
||||
|
||||
</details>
|
||||
|
||||
| 目标 | 归属 | 方式 | 调用位置 |
|
||||
| --- | --- | --- | --- |
|
||||
| [access.session.findSession](app.dever#L11) | 领域内 | 调用 | [app.dever:8:14](app.dever#L8,14) |
|
||||
| `uuid.parse` | 依赖 | 调用 | [app.dever:8:26](app.dever#L8,26) |
|
||||
@@ -0,0 +1,10 @@
|
||||
global type Session {
|
||||
uuid: Uuid generated unique
|
||||
subject: Text
|
||||
user_id: access.user.model.id
|
||||
tenant_id: access.tenant.model.id
|
||||
tenant_key: Text
|
||||
site: Text
|
||||
expires_at: DateTime
|
||||
revoked: Bool default false
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
global type Membership {
|
||||
user_id: access.user.model.id
|
||||
tenant_id: access.tenant.model.id
|
||||
active: Bool default true
|
||||
}
|
||||
|
||||
unique(user_id, tenant_id)
|
||||
@@ -0,0 +1,8 @@
|
||||
# 租户状态
|
||||
|
||||
检查租户编号、唯一键和启用状态。
|
||||
|
||||
- [业务操作](doc/app.md)
|
||||
- [内部规则](doc/domain.md)
|
||||
- [数据结构](doc/model.md)
|
||||
- [调用流程](link.md)
|
||||
@@ -0,0 +1,9 @@
|
||||
requireActive(tenant_id: model.id, tenant_key: Text) () {
|
||||
domain.requireActive(
|
||||
model.exists(
|
||||
{
|
||||
where = id == tenant_id and key == tenant_key and active == true
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
# 业务操作
|
||||
|
||||
## access.tenant.requireActive
|
||||
|
||||
要求租户编号、键和启用状态同时匹配。
|
||||
@@ -0,0 +1,5 @@
|
||||
# 内部规则
|
||||
|
||||
## access.tenant.domain.requireActive
|
||||
|
||||
租户已启用时通过,否则返回未授权。
|
||||
@@ -0,0 +1,5 @@
|
||||
# 数据结构
|
||||
|
||||
## access.tenant.model.Tenant
|
||||
|
||||
平台租户的唯一键和启用状态。
|
||||
@@ -0,0 +1,5 @@
|
||||
requireActive(active: true) () {}
|
||||
|
||||
requireActive(active: false) () {
|
||||
fail(dever.api.Error.Unauthorized)
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
<!-- Generated by dever inspect --links. Do not edit. -->
|
||||
<!-- source-sha256: 6ab5ca6ad85fdbfe6452f6aaf1909ecf5a0ea5b89b5e50d80d0325d23097bd03 -->
|
||||
|
||||
# access.tenant
|
||||
|
||||
按求值顺序展示调用、分支和任务调度,包含 API 与自动 REST 入口。点击节点打开源码;双框为调用,虚线为调度或错误路径。外部库和驱动不展开。
|
||||
|
||||
图不是某次运行的日志,分句和 Adapter 按输入或配置选择。修改源码后运行 `dever inspect . --links`。
|
||||
|
||||
## 入口
|
||||
|
||||
没有已收录的入口。
|
||||
|
||||
## 外部调用方
|
||||
|
||||
| 能力 | 调用方 | 方式 | 调用位置 |
|
||||
| --- | --- | --- | --- |
|
||||
| [access.tenant.requireActive](app.dever#L1) | [access.session.verified](../session/app.dever#L35) | 调用 | [../session/app.dever:37:3](../session/app.dever#L37,3) |
|
||||
|
||||
## 能力与内部调用
|
||||
|
||||
### access.tenant.domain.requireActive
|
||||
|
||||
定义:[domain.dever:1:1](domain.dever#L1,1)、[domain.dever:3:1](domain.dever#L3,1)
|
||||
|
||||
<a id="flow-4bf621ec21992ef9-1"></a>
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
n0(["requireActive"])
|
||||
click n0 href "domain.dever#L1,1" "打开源码"
|
||||
n1(["返回"])
|
||||
n2(["传播错误"])
|
||||
n3{"按实参匹配分句(互斥)"}
|
||||
n4["active: true"]
|
||||
click n4 href "domain.dever#L1,1" "打开源码"
|
||||
n5["active: false"]
|
||||
click n5 href "domain.dever#L3,1" "打开源码"
|
||||
n6["fail dever.api.Error.Unauthorized"]
|
||||
click n6 href "domain.dever#L4,8" "打开源码"
|
||||
n0 --> n3
|
||||
n3 -->|"active: true"| n4
|
||||
n4 --> n1
|
||||
n3 -->|"active: false"| n5
|
||||
n5 --> n6
|
||||
n6 --> n2
|
||||
```
|
||||
|
||||
没有已收录的下游调用。
|
||||
|
||||
### access.tenant.model.Tenant
|
||||
|
||||
定义:[model.dever:1:1](model.dever#L1,1)
|
||||
|
||||
没有已收录的下游调用。
|
||||
|
||||
### access.tenant.requireActive
|
||||
|
||||
定义:[app.dever:1:1](app.dever#L1,1)
|
||||
|
||||
<a id="flow-8fb2bcc151c4208d-1"></a>
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
n0(["requireActive"])
|
||||
click n0 href "app.dever#L1,1" "打开源码"
|
||||
n1(["返回"])
|
||||
n3["access.tenant.model.exists"]
|
||||
click n3 href "app.dever#L3,5" "打开源码"
|
||||
n4[["access.tenant.domain.requireActive"]]
|
||||
click n4 href "app.dever#L2,3" "打开源码"
|
||||
n0 --> n3
|
||||
n3 --> n4
|
||||
n4 --> n1
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>源码与子流程</summary>
|
||||
|
||||
| 节点 | 源码 | 子流程 |
|
||||
| --- | --- | --- |
|
||||
| access.tenant.domain.requireActive | [app.dever:2:3](app.dever#L2,3) | [access.tenant.domain.requireActive](link.md#flow-4bf621ec21992ef9-1) |
|
||||
|
||||
</details>
|
||||
|
||||
| 目标 | 归属 | 方式 | 调用位置 |
|
||||
| --- | --- | --- | --- |
|
||||
| [access.tenant.domain.requireActive](domain.dever#L1) | 领域内 | 调用 | [app.dever:2:3](app.dever#L2,3) |
|
||||
| [access.tenant.model.exists](model.dever#L1) | 领域内 | 内建操作 | [app.dever:3:5](app.dever#L3,5) |
|
||||
@@ -0,0 +1,4 @@
|
||||
global type Tenant {
|
||||
key: Text unique
|
||||
active: Bool default true
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
# 用户状态
|
||||
|
||||
检查用户是否存在且已启用。
|
||||
|
||||
- [业务操作](doc/app.md)
|
||||
- [内部规则](doc/domain.md)
|
||||
- [数据结构](doc/model.md)
|
||||
- [调用流程](link.md)
|
||||
@@ -0,0 +1,9 @@
|
||||
requireActive(user_id: model.id) () {
|
||||
domain.requireActive(
|
||||
model.exists(
|
||||
{
|
||||
where = id == user_id and active == true
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
# 业务操作
|
||||
|
||||
## access.user.requireActive
|
||||
|
||||
要求指定用户存在且已启用。
|
||||
@@ -0,0 +1,5 @@
|
||||
# 内部规则
|
||||
|
||||
## access.user.domain.requireActive
|
||||
|
||||
用户已启用时通过,否则返回未授权。
|
||||
@@ -0,0 +1,5 @@
|
||||
# 数据结构
|
||||
|
||||
## access.user.model.User
|
||||
|
||||
平台用户的 UUID 和启用状态。
|
||||
@@ -0,0 +1,5 @@
|
||||
requireActive(active: true) () {}
|
||||
|
||||
requireActive(active: false) () {
|
||||
fail(dever.api.Error.Unauthorized)
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
<!-- Generated by dever inspect --links. Do not edit. -->
|
||||
<!-- source-sha256: 8c879374d859fd5ed0f03587252b2d7be479f6a1198251f23907f88f8d0c2b39 -->
|
||||
|
||||
# access.user
|
||||
|
||||
按求值顺序展示调用、分支和任务调度,包含 API 与自动 REST 入口。点击节点打开源码;双框为调用,虚线为调度或错误路径。外部库和驱动不展开。
|
||||
|
||||
图不是某次运行的日志,分句和 Adapter 按输入或配置选择。修改源码后运行 `dever inspect . --links`。
|
||||
|
||||
## 入口
|
||||
|
||||
没有已收录的入口。
|
||||
|
||||
## 外部调用方
|
||||
|
||||
| 能力 | 调用方 | 方式 | 调用位置 |
|
||||
| --- | --- | --- | --- |
|
||||
| [access.user.requireActive](app.dever#L1) | [access.session.verified](../session/app.dever#L35) | 调用 | [../session/app.dever:36:3](../session/app.dever#L36,3) |
|
||||
|
||||
## 能力与内部调用
|
||||
|
||||
### access.user.domain.requireActive
|
||||
|
||||
定义:[domain.dever:1:1](domain.dever#L1,1)、[domain.dever:3:1](domain.dever#L3,1)
|
||||
|
||||
<a id="flow-fa5889ca969e0acf-1"></a>
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
n0(["requireActive"])
|
||||
click n0 href "domain.dever#L1,1" "打开源码"
|
||||
n1(["返回"])
|
||||
n2(["传播错误"])
|
||||
n3{"按实参匹配分句(互斥)"}
|
||||
n4["active: true"]
|
||||
click n4 href "domain.dever#L1,1" "打开源码"
|
||||
n5["active: false"]
|
||||
click n5 href "domain.dever#L3,1" "打开源码"
|
||||
n6["fail dever.api.Error.Unauthorized"]
|
||||
click n6 href "domain.dever#L4,8" "打开源码"
|
||||
n0 --> n3
|
||||
n3 -->|"active: true"| n4
|
||||
n4 --> n1
|
||||
n3 -->|"active: false"| n5
|
||||
n5 --> n6
|
||||
n6 --> n2
|
||||
```
|
||||
|
||||
没有已收录的下游调用。
|
||||
|
||||
### access.user.model.User
|
||||
|
||||
定义:[model.dever:1:1](model.dever#L1,1)
|
||||
|
||||
没有已收录的下游调用。
|
||||
|
||||
### access.user.requireActive
|
||||
|
||||
定义:[app.dever:1:1](app.dever#L1,1)
|
||||
|
||||
<a id="flow-f368d51d0e19702c-1"></a>
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
n0(["requireActive"])
|
||||
click n0 href "app.dever#L1,1" "打开源码"
|
||||
n1(["返回"])
|
||||
n3["access.user.model.exists"]
|
||||
click n3 href "app.dever#L3,5" "打开源码"
|
||||
n4[["access.user.domain.requireActive"]]
|
||||
click n4 href "app.dever#L2,3" "打开源码"
|
||||
n0 --> n3
|
||||
n3 --> n4
|
||||
n4 --> n1
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>源码与子流程</summary>
|
||||
|
||||
| 节点 | 源码 | 子流程 |
|
||||
| --- | --- | --- |
|
||||
| access.user.domain.requireActive | [app.dever:2:3](app.dever#L2,3) | [access.user.domain.requireActive](link.md#flow-fa5889ca969e0acf-1) |
|
||||
|
||||
</details>
|
||||
|
||||
| 目标 | 归属 | 方式 | 调用位置 |
|
||||
| --- | --- | --- | --- |
|
||||
| [access.user.domain.requireActive](domain.dever#L1) | 领域内 | 调用 | [app.dever:2:3](app.dever#L2,3) |
|
||||
| [access.user.model.exists](model.dever#L1) | 领域内 | 内建操作 | [app.dever:3:5](app.dever#L3,5) |
|
||||
@@ -0,0 +1,4 @@
|
||||
global type User {
|
||||
uuid: Uuid generated unique
|
||||
active: Bool default true
|
||||
}
|
||||
Reference in new issue
Block a user