ciims-modules / api
CiiMS 的 API 模块
README
CiiMS API 模块提供对常用方法和数据的访问。CiiMS API 是一个支持 GET、POST 和 DELETE 的 JSON REST API。为了简单起见,POST 请求应发送为 JSON 编码的表单字段。
API 概述
此文档提供了对 CiiMS API 提供的所有内容的全面概述。此文档对每个 API 端点进行了全面解释,包括示例请求和响应。
在此文档中,将使用以下格式来描述可用的端点。如果没有参数,则该部分将不包括在方法签名中。描述中可能提供其他参数。
[HTTP_VERB] [/uri/path] [params] 方法描述
许可证
请参阅 LICENSE.md
API 目标
API 设计考虑了几个组件
- 性能
- 安全
- 简洁性
访问 API
CiiMS API 可以通过您的 CiiMS 实例的 /api
端点访问。
适当的请求头
在向 API 发送请求时,您有两个交互选项:您可以通过 application/json
发送原始 JSON 作为原始请求 或 您可以发送 application/x-www-form-urlencoded
表单数据,并将参数序列化,就像在 jQuery 中一样。如果收到任何原始请求正文,API 将假设您发送的数据是 application/json
,并将其解释为该格式。
响应
API 的所有响应都将返回为 JSON 对象,并将至少包含与头一起发送的 HTTP 响应代码、适用的错误消息以及一个名为 "response" 的对象,其中包含响应。如果发生错误(取决于资源),则响应将是一个空的 JSON 对象或 NULL。
{
"status" : <http_status_code>,
"message" : null,
"response" : { }
}
身份验证
尽管一些 API 端点是公开可用的,但大多数需要身份验证才能访问。
[POST] [/user/token] 身份验证
当您对 CiiMS API 进行身份验证时,您将获得一个长期有效的令牌,您可以使用它进行未来的请求。此长期有效的令牌应保存在安全位置,因为它授予控制它的人对令牌所有者可以访问的任何可用资源的完全访问权限。
以下所有字段都是必需的
示例请求
{
"email": "email@example.tld",
"password": "<password>",
"name": "<yourApplicationName>"
}
如果您的身份验证凭据有效,但账户受双因素身份验证码保护,您将收到一个 HTTP 412 错误消息,表明缺少双因素代码。
{
"status": 412,
"message": "Unable to authenticate.",
"response": false
}
如果您收到此错误,您需要在 JSON 请求正文中提供以下数据
"2fa": "<twoFactorAuthenticationCode>",
如果您的身份验证请求成功,您将收到以下响应
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": "<long-life-token>"
}
如果身份验证失败,您将看到一个通用的403错误消息。
{
"status": 403,
"message": "Unable to authenticate.",
"response": false
}
一旦完成身份验证,任何需要身份验证的请求都可以通过在请求中包含以下头信息来访问
X-Auth-Email: user@example.tld
X-Auth-Token: <long-life-token>
[POST] [/user/authenticate] 身份验证
作为/user/token的别名
[DELETE] [/user/token] 注销身份验证
如果您认为您的长期令牌已被泄露,建议立即撤销您的令牌。
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": true
}
可用的API方法
以下API端点可供测试。接下来几节将根据控制器/命名空间来划分API端点。
卡片
卡片API被视为私有,不应直接使用。不要尝试直接访问卡片端点。
[GET] [/card/index] 检索仪表板卡片
可以通过访问此端点检索当前用户安装的所有仪表板卡片列表。
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": {
"cards": {
"<id>": "<url>"
},
"cardData": {
"<id>": {}
}
}
}
[POST] [/card/index] 安装新的仪表板卡片
此端点用于为您的用户安装新的仪表板卡片。
示例请求
{
"id": "<generated_uuid>",
"url": "<card_endppint_url_fqdn>",
"details": {}
}
[DELETE] [/card/index] [id] 删除已安装的卡片
可以通过向此端点发送请求来从用户处删除卡片。
[GET] [/card/details] [id] 检索卡片详情
此端点在仪表板中加载卡片详情时自动调用。
示例请求
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": {}
}
[POST] [/card/details] [id] 设置卡片详情
可以通过向此端点发送POST请求来修改卡片详情。此端点在卡片任何详情更改时被调用。
[POST] [/card/rearrange] 重新排列仪表板
此端点允许重新排列仪表板卡片。
分类
分类端点允许用户和管理员查看和管理分类。
[GET] [/category/index] [OPT id] 检索分类
任何用户都可以检索系统中所有分类的公开列表。此端点支持通过page
GET参数进行分页,并支持搜索和筛选。
如果提供了ID参数,此端点将仅返回有关请求的分类/的数据。
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": [
{
"id": "12",
"name": "Name",
"slug": "name",
"created": "1380326400",
"updated": "1386460800",
"parent": {
"id": "1",
"parent_id": "1",
"name": "Uncategorized",
"slug": "uncategorized",
"created": "1417471909",
"updated": "1417471909"
},
"metadata": []
},
{
"id": "10",
"name": "example2",
"slug": "example2",
"created": "1371772800",
"updated": "1371772800",
"parent": {
"id": "1",
"parent_id": "1",
"name": "Uncategorized",
"slug": "uncategorized",
"created": "1417471909",
"updated": "1417471909"
},
"metadata": []
}
]
}
[POST] [/category/index] [OPT id] 创建/更新分类
可以通过向此端点发送POST请求来创建新分类。如果提供了ID,如果分类存在,则将更新分类。
示例请求
{
"name": "name",
"slug": "<uri_slug>",
"parent_id": "<id_of_parent_category>"
}
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": [
{
"id": "12",
"name": "Name",
"slug": "name",
"created": "1380326400",
"updated": "1386460800",
"parent": {
"id": "1",
"parent_id": "1",
"name": "Uncategorized",
"slug": "uncategorized",
"created": "1417471909",
"updated": "1417471909"
},
"metadata": []
}
]
}
[DELETE] [/category/index] [id] 删除分类
可以通过向此端点发送DELETE请求来删除分类。
限制
- 根类别“未分类”不能被删除
- 当删除一个类别时,所有子类别将重新分配到被删除类别的父类别。
评论
以下端点可用于创建、编辑和管理CiiMS的内部评论系统。注意,如果启用了任何其他评论系统,所有这些端点都将返回403错误。
CiiMS的评论系统相对简单。用户可以添加新评论、更新它们并删除它们,管理员可以高级管理这些评论。为了促进有用的讨论,此评论系统还实现了声誉系统。每个用户起始声誉分为100分,随着他们发表评论,声誉将增加或减少(对最终用户完全透明)。某些行为会增加用户的声誉,而其他行为会减少。
如果用户的声誉在任何时候降至某个阈值以下,该用户的全部评论将立即被阴影封禁。用户仍然可以像往常一样发表评论,但其他用户将看不到他们的条目。
CiiMS未来的迭代将提供一种方式来对评论进行点赞和踩,并允许单独的评论被阴影封禁。
[GET] [/comment/comments] [id] 获取指定内容ID的评论
获取指定内容ID的评论
示例响应
{
"status": 200,
"message": null,
"response": [{
"id": <comment_id>,
"content_id": <id>,
"author_id": <user_id>,
"user": {
"email": "",
"firstName": "",
"lastName": "",
"username": ""
},
"content": {
"id": <content_id>,
"slug": <slug>,
"title": <title>
},
"comment": <comment>,
"created": 1237519512,
"updated": 1237519512
}, {
"id": <comment_id>,
"content_id": <id>,
"author_id": <user_id>,
"user": {
"email": "",
"firstName": "",
"lastName": "",
"username": ""
},
"content": {
"id": <content_id>,
"slug": <slug>,
"title": <title>
},
"comment": <comment>,
"created": 1237519512,
"updated": 1237519512
}]
}
[GET] [/comment/user] [id] 获取指定用户的评论
获取指定用户的评论
示例响应
{
"status": 200,
"message": null,
"response": [{
"id": <comment_id>,
"content_id": <id>,
"author_id": <user_id>,
"user": {
"email": "",
"firstName": "",
"lastName": "",
"username": ""
},
"content": {
"id": <content_id>,
"slug": <slug>,
"title": <title>
},
"comment": <comment>,
"created": 1237519512,
"updated": 1237519512
}, {
"id": <comment_id>,
"content_id": <id>,
"author_id": <user_id>,
"user": {
"email": "",
"firstName": "",
"lastName": "",
"username": ""
},
"content": {
"id": <content_id>,
"slug": <slug>,
"title": <title>
},
"comment": <comment>,
"created": 1237519512,
"updated": 1237519512
}]
}
[POST] [/comment/count] 获取一系列条目的评论数
获取请求条目的评论数。
示例请求
{
"ids": []
}
示例响应
{
id: count,
id2: count2,
[...]
}
[POST] [/comment/index] [OPT id] 创建或更新评论
如果提供了ID,允许用户创建或修改评论。
示例请求
{
"id": <comment_id>,
"content_id": <id>,
"author_id": <user_id>,
"comment": <comment>
}
示例响应
{
"status": 200,
"message": null,
"response": [{
"id": <comment_id>,
"content_id": <id>,
"author_id": <user_id>,
"user": {
"email": "",
"firstName": "",
"lastName": "",
"username": ""
},
"content": {
"id": <content_id>,
"slug": <slug>,
"title": <title>
},
"comment": <comment>,
"created": 1237519512,
"updated": 1237519512
}]
}
[DELETE] [/comment/index] [id] 删除评论
当你在公共场合说出不该说的话时。= )
[POST] [/comment/flag] [id] 标记评论
标记评论以供审查/争议。
内容
此端点允许用户和管理员查看和管理内容。
[GET] [/content/index] [OPT id] 查看内容
此API端点允许用户检索系统内所有已发布和可查看的内容。
未经认证的用户将能够看到所有已发布的内容。认证用户将能够看到在其权限级别下可查看的所有内容。例如,一旦管理员认证,他们就可以看到所有内容,而协作者只能查看他们发布的内容以及他们自己是作者的内容(包括草稿)。
此端点支持通过page
GET参数进行分页,并在所有非扩展属性上提供完整的富搜索(例如,如果您想搜索类别,您将指定Content[category_id]
而不是子属性)。
如果指定了id
参数,此端点将仅返回单个对象而不是对象数组。
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": [{
"id": "119",
"title": "Test Entry",
"content": "test",
"excerpt": "test",
"slug": "test-entry",
"type_id": "2",
"commentable": "1",
"status": "1",
"like_count": "0",
"published": "1420215873",
"created": "1420215873",
"updated": "1420215873",
"author": {
"id": "1",
"username": "test"
},
"category": {
"id": "1",
"name": "Uncategorized",
"slug": "uncategorized",
"created": "1417471909",
"updated": "1417471909"
},
"metadata": [{
"key": "autosave",
"value": "{}"
"created": "1420215873",
"updated": "1420215873"
}]
}]
}
[POST] [/content/index] [OPT id] 创建/更新内容条目
向此端点发送一个空的POST请求将为经过身份验证和授权的用户创建一个新的草稿。该对象的响应将是上述描述的基础内容对象。使用此ID,您可以使用从初始创建点收到的基对象按需编辑内容条目。
[DELETE] [/content/index] 删除内容条目
经过身份验证和授权的用户可以通过向此端点发送一个空的DELETE请求来删除内容条目。
[GET] [/content/publish] [OPT id] 发布条目
经过身份验证和授权的用户可以通过向此端点提交请求来发布新内容或草稿。发布将发布文档的当前修订版,并增加内容的VID
(修订ID)属性。新条目将取代任何当前条目。
[GET] [/content/unpublish] [OPT id] 取消发布条目
经过身份验证和授权的用户可以通过向此端点发送请求来取消发布内容。
[GET] [/content/tag] [OPT id] 获取内容标签
可以通过向此端点发送GET请求来检索所有标签的列表。
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": [
"example_tag"
]
}
[POST] [/content/tag] [id] 向条目添加新标签
可以通过向此端点发送POST请求并带有内容的id
作为GET参数来向给定内容条目添加标签。
示例请求
{
"tag": "example_tag"
}
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": [
"example_tag"
]
}
[DELETE] [/content/tag] [id, tag] 从条目中删除标签
可以通过向此端点发送包含id
和tag
参数的DELETE请求来从给定内容中删除标签,其中id
是内容条目的ID,而tag
是标签的字符串名称。
[GET] [/content/like] [id] 喜欢或不喜欢的条目
经过身份验证的用户可以通过向此端点发送GET请求来喜欢或不喜欢的条目。端点将根据内容是否被喜欢、不喜欢或用户没有喜欢状态自动切换。
[GET] [/content/autosave] [id] 获取最后自动保存的数据
此端点将返回给定内容条目的当前自动保存数据。每个内容条目一旦创建,将包含一个自动保存状态。此状态用于在浏览器和平台之间保留进度,并在编辑过程中保留核心内容数据。
[POST] [/content/autosave] [id] 更新/创建自动保存条目
在处理内容时,您应使用自动保存POST端点定期保存任何草稿或更改的状态。此自动保存状态独立于content
表存储,并在每次更改时覆盖,以防止将额外数据写入数据库。此端点接受与主要[POST] /content/index
端点相同的属性。
[GET] [/content/revision] [id] 获取内容修订版
此端点将返回给定内容条目当前可用的所有版本。版本将与主端点 [GET] /content/index
采用相同的格式。
默认
以下端点可在默认端点中使用。
[GET] [/default/index | /index | /] 检索API状态
此端点将返回API的当前状态。目前这检查数据库的连接性。
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": true
}
[POST] [/default/jsonProxy] JSON代理
JavaScript前端在尝试访问不提供适当CORS头或当使用SSL时不可通过HTTPS的数据时存在一些限制。此端点可以用于绕过这些限制,适用于具有角色 >= 5(协作者或任何更高角色)的认证用户
警告
此API端点可能容易受到任何认证用户的滥用。因此,此端点的访问仅限于具有协作能力或更高的认证用户(角色 >= 5)。
限制
由于此端点的性质,其使用存在一些限制。
- 访问限于具有协作能力或更高的认证用户。
- 数据将在服务器端缓存10分钟。
- 此端点只能处理JSON响应
- 此端点将仅从提供的URL请求数据,并将不会传递任何头或其他信息。
示例请求
{
"url": "<url_of_remote_json_resource>"
}
此结果的响应将缓存10分钟以防止滥用,并将cURL请求的结果存储在响应对象的响应参数中。
事件
事件API端点允许CiiMS的内部analytics.js
插件跟踪页面浏览量和其他数据。这些信息用于显示内容的最近页面浏览量。
[GET] [/event/index] 搜索事件
允许用户搜索最近的事件。此方法对具有协作状态或更高的用户可用。
此方法支持基本的Yii搜索GET参数,并通过Event
模型进行分页。
[POST] [/event/index] 记录事件
记录一个事件。此端点是开放的,允许开发者记录自定义事件。
示例请求
{
"event": "event_name",
"uri": "event_uri",
"event_data": "extra_json_data"
}
[POST] [/event/count] 获取事件计数
获取过去24小时期间提供的ID的_pageview
事件计数。此方法对具有协作状态或更高的用户可用。
示例请求
{
"ids": []
}
示例响应
{
"status": 200,
"message": null,
"response": {
"<id>": "<count>"
}
}
设置
设置端点可用于查看和管理CiiMS存储和使用的所有设置。
注意
新设置可能随时添加,此文档可能不反映最新的设置。要获取最新可用设置的列表,请参考CiiMS::protected/models/settings中列出的模型。
以下部分概述了该端点的可用设置。每个部分将列出GET和POST端点的可用设置。每个端点将返回列出的设置(相对于您的实例),以及GET和POST响应。列出的JSON对象用于修改POST正文。
通用设置
以下端点允许管理员管理通用设置
端点
[GET] [/setting/index]
[POST] [/setting/index]
JSON 主体
{
"name": "[Site Name]",
"dateFormat": "F jS, Y",
"timeFormat": "H:i",
"defaultLanguage": "en_US",
"forceSecureSSL": "1",
"offline": "0",
"bcrypt_cost": "13",
"searchPaginationSize": "10",
"categoryPaginationSize": "10",
"contentPaginationSize": "10",
"useDisqusComments": "1",
"disqus_shortname": "disqus_shortname",
"useOpenstackCDN": "0",
"useRackspaceCDN": "0",
"openstack_identity": null,
"openstack_username": null,
"openstack_apikey": null,
"openstack_region": null,
"openstack_container": null
}
分析设置
以下端点允许管理员管理分析设置
端点
[GET] [/setting/analytics]
[POST] [/setting/analytics]
JSON 主体
{
"analyticsjs_Google__Analytics_enabled": 0,
"analyticsjs_Google__Analytics_domain": null,
"analyticsjs_Google__Analytics_trackingId": null,
"analyticsjs_Google__Analytics_universalClient": 1,
"analyticsjs_Pingdom_enabled": false,
"analyticsjs_Pingdom_id": null,
"analyticsjs_Piwik_enabled": 0,
"analyticsjs_Piwik_url": null,
"analyticsjs_Piwik_siteId": null
}
邮箱设置
以下端点允许管理员管理邮箱设置。
如果留空,CiiMS 的 SMTP 适配器将尝试通过 sendmail
方法发送邮件。如果任何 SMTP 属性不为空,则 CiiMS 将尝试使用该驱动程序发送信息。为了测试,CiiMS 提供了
端点
[GET] [/setting/email]
[POST] [/setting/email]
JSON 主体
{
"SMTPHost": null,
"SMTPPort": null,
"SMTPUser": null,
"SMTPPass": null,
"notifyName": null,
"notifyEmail": null,
"useTLS": 0,
"useSSL": 0
}
[GET] [/setting/emailtest] 测试邮箱设置
调整邮箱设置后,强烈建议验证您的设置是否正常工作。您可以通过向此端点发送 GET 请求来测试此操作,这将尝试向当前登录用户发送邮件。
社交设置
以下端点允许管理员管理社交设置。大多数这些设置特别适用于社交身份验证的 HybridAuth 模块,它可以用于在其他模块/主题中使用存储的一般社交设置。
端点
[GET] [/setting/social]
[POST] [/setting/social]
JSON 主体
{
"ha_twitter_enabled": false,
"ha_twitter_key": null,
"ha_twitter_secret": null,
"ha_twitter_accessToken": null,
"ha_twitter_accessTokenSecret": null,
"ha_facebook_enabled": false,
"ha_facebook_id": null,
"ha_facebook_secret": null,
"ha_facebook_scope": null,
"ha_google_enabled": false,
"ha_google_id": null,
"ha_google_secret": null,
"ha_google_scope": null,
"google_plus_public_server_key": null,
"ha_linkedin_enabled": false,
"ha_linkedin_key": null,
"ha_linkedin_secret": null,
"addThisPublisherID": null
}
主题设置
以下端点允许管理员管理主题设置。
端点
[GET] [/setting/theme]
[POST] [/setting/theme]
JSON 主体
此端点的 JSON 主体将根据当前安装的主题而变化。
主题
以下 API 端点可用于管理主题。
回调
对于提供公共回调的主题,可以通过此端点访问这些回调。回调支持 GET 和 POST 回调。数据将原样传递给方法(例如,GET 将传递 $_GET 数据,而 POST 将传递 $_POST 数据到方法)。
[GET] [/theme/callback] [theme, method]
[POST] [/theme/callback] [theme, method]
[GET] [/theme/installed] 列出已安装的主题
此端点返回已安装主题的列表。
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": {
"<theme_name>": {
"path": "<system_path>",
"name": "<composer.json namespace>"
},
"<theme_name>": {
"path": "<system_path>",
"name": "<composer.json namespace>"
},
"<theme_name>": {
"path": "<system_path>",
"name": "<composer.json namespace>"
}
}
}
[GET] [/theme/install] [name] 更改主题
尝试使用给定的 name
安装主题,并在成功安装具有给定 name
的主题时返回 true
或 false
。
[GET] [/theme/changetheme] [name] 更改主题
允许管理员将当前主题更改为已安装的主题。
[GET] [/theme/update] [name] 更新主题
尝试使用给定的 name
更新主题,并在成功更新具有给定 name
的主题时返回 true
或 false
。
[GET] [/theme/updatecheck] [name] 检查主题是否有更新。
如果给定名称的主题有可用的更新,则返回 true
或 false
。此信息基于安装期间编写的 VERSION
文件。因此,具有自定义安装的主题或默认安装的主题将始终显示需要更新,直到它们被更新并通过 CiiMS 的内部主题安装程序安装。
[GET] [/theme/uninstall] [name] 卸载一个主题
尝试卸载给定名称的主题,如果成功卸载给定名称的主题,则返回 true
或 false
。
[GET] [/theme/list] 列出可安装的主题
themes.ciims.io 广播一个主题列表,这些主题可供公共安装。此端点将列出所有这些主题。
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": {
"Default": {
"name": "ciims-themes\/default",
"version": "3.0.11",
"repository": "https:\/\/github.com\/charlesportwoodii\/ciims-themes-default"
},
"Spectre": {
"name": "ciims-themes\/spectre",
"version": "2.0.2",
"repository": "https:\/\/github.com\/charlesportwoodii\/ciims-themes-spectre"
}
}
}
[GET] [/theme/isInstalled] [name] 判断一个主题是否已安装
如果给定名称的主题已安装,则返回 true
或 false
。
[GET] [/theme/details] [name] 列出给定主题的详细信息
返回给定主题的详细信息。这些信息最终是从给定主题的 composer.json/packagist 细节中提取的。
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": {
"name": "ciims-themes\/default",
"description": "The default theme that comes with CiiMS",
"repository": "https:\/\/github.com\/charlesportwoodii\/ciims-themes-default",
"maintainers": [{
"name": "charlesportwoodii",
"email": null,
"homepage": null
}],
"latest-version": "3.0.13",
"sha": "1da64831967ef8f55a03694e2290786118995f4d",
"file": "https:\/\/github.com\/charlesportwoodii\/ciims-themes-default\/archive\/3.0.13.zip",
"downloads": {
"total": 567,
"monthly": 106,
"daily": 1
}
}
}
用户
以下 API 端点用于操作和管理用户数据。
[GET] [/user/index] [OPT: id=user_id] 获取用户信息
认证用户可以通过查询此端点来检索有关自己的信息。此端点将转储用户角色允许的所有可用数据。
注意,此端点只允许用户访问其自身的信息。只有管理员可以访问其他用户的信息。如果未指定 id
参数,则认证管理员将看到系统中所有用户的完整列表。
附加参数
对于管理员,此端点支持基本的 Yii model->search()
参数,允许通过任何 GET 参数进行搜索和筛选。
GET /user/index?User[username]=username
此端点支持通过 page
GET 变量进行分页。
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": [
{
"id": "1",
"email": "email@example.tld",
"username": "username",
"user_role": "9",
"status": "1",
"created": "1420134690",
"updated": "1420134690",
"role": {
"id": "9",
"name": "Administrator",
"created": "1417471909",
"updated": "1417471909"
},
"metadata": []
}
]
}
[POST] [/user/index] [id] 更新用户
认证用户可以通过向此端点发送 POST 请求来更新自己的信息,而管理员可以更新任何用户的信息。
如果未提供 ID 参数,则管理员向此端点发送的 POST 请求将使用提供的信息创建新用户。对于创建新用户,需要所有用户字段。对于更新用户,您只需提供要更新的字段。
示例请求
{
"email": "email@example.tld",
"username": "username",
"user_role": "9",
"status": "1",
"password": "password"
}
示例响应
{
"status": 200,
"message": "Your request was successfully fulfilled",
"response": {
"id": "1",
"email": "email@example.tld",
"username": "username",
"user_role": "9",
"status": "1",
"created": "1420134690",
"updated": "1420134690",
"role": {
"id": "9",
"name": "Administrator",
"created": "1417471909",
"updated": "1417471909"
},
"metadata": []
}
}
[POST] [/user/register] 注册新用户
未经认证的用户可以向网站注册新用户。
示例请求
{
"email": "user@example.tld",
"password": "password",
"password_repeat": "password",
"username": "username"
}
[POST] [/user/invite] 邀请用户
管理员可以通过向此端点发送 POST 请求来邀请新用户到平台。
示例请求
{
"email": "user@example.tld"
}