我试着建立一个名为SOULs的API
“SOULs” 是指什么?
这是一个以Ruby为基础的无服务器框架,具备Active Record、Scaffold和CI/CD的标准配置。它可以在GCP(Google Cloud Platform)上运行。它被荷兰政府认定为前沿研究项目,并且由日本人开发,因此文档非常详细。
请详细阅读我写的另一篇文章以获取更多信息。
现在就来试试。
由于SOULs可以创建GraphQL API和Worker,因此我们将尝试创建一个GraphQL API。
必需的套件
我们不会提供这个安装的说明。
-
- Ruby v3
-
- Docker
-
- Google Cloud SDK
-
- PostgreSQL
-
- Redis
- Github CLI
准备好了
我会进行 Github CLI Auth 的登录和 SOULs 的安装。
$ gh auth login
$ gem install souls
$ souls -v #インストール成功の確認
创建应用程序
你可以使用Rails中的”rails new”命令来创建项目。
$ souls new souls-app
接下来,使用SOULs命令来启动PostgreSQL13的Docker容器。
$ cd apps/api
$ souls docker psql
由于准备工作已经完成,我们将进行数据库的创建和迁移。
$ souls db create
$ souls db migrate
请确认到这一步是否可以工作。
请使用souls s命令来启动。
$ souls s
当你访问localhost:4000,并看到以下的画面显示时,表示你已经准备好开始创建应用了。
![動作確認](https://cdn.silicloud.com/blog-img/blog/img/657d83a2913a08637a6b3e08/21-0.png)
创建模型
用souls db create_migration创建迁移文件。
$ souls db create_migration user
db/migrate/20210930154336_create_users.rb
Created file! : sig/api/db/migrate/create_users.rbs
Created file! : ./app/models/user.rb
Created file! : ./spec/models/user_spec.rb
Created file! : sig/api/app/models/user_model.rbs
利用创建的文件进行迁移。
$ souls db migrate
执行Scaffold
souls g scaffold_all命令会基于db/schema.rb的类型,自动生成CRUD所需的文件和相应的测试。
$ souls g scaffold_all
.
.
Created file! : ./app/graphql/types/edges/user_edge.rb
Created file! : ./sig/api/app/graphql/types/edges/user_edge.rbs
Created file! : ./app/graphql/types/connections/user_connection.rb
Created file! : ./sig/api/app/graphql/types/connections/user_connection.rbs
Created file! : ./app/graphql/resolvers/user_search.rb
Created file! : ./sig/api/app/graphql/resolvers/user_search.rbs
Created file! : ./spec/factories/users.rb
Created file! : ./spec/mutations/base/user_spec.rb
Created file! : ./spec/queries/user_spec.rb
Created file! : ./spec/resolvers/user_search_spec.rb
Created file! : ./spec/policies/user_policy_spec.rb
? Generated SOULs CRUD Files
完成了。
试着动一下
注册
请提供更多上下文信息。
mutation {
createUser(
input: {
uid: "uniq-id"
username: "SOULs"
email: "info@test.com"
}
) {
userEdge {
node {
uid
id
username
email
}
}
}
}
回应
{
"data": {
"createUser": {
"userEdge": {
"node": {
"uid": "uniq-id",
"id": "VXNlcjo0",
"username": "SOULs",
"email": "info@test.com"
}
}
}
}
}
表示 shì)
查询
query {
userSearch(filter: { isDeleted: false }) {
edges {
node {
id
uid
username
email
}
}
nodes {
id
}
pageInfo {
hasNextPage
}
}
}
回应
{
"data": {
"userSearch": {
"edges": [
{
"node": {
"id": "VXNlcjo0",
"uid": "uniq-id",
"username": "SOULs",
"email": "info@test.com"
}
}
],
"nodes": [
{
"id": "VXNlcjo0"
}
],
"pageInfo": {
"hasNextPage": false
}
}
}
}
更新
查询
mutation {
updateUser(input: {
id: "VXNlcjo0"
username: "SOULs API"
}) {
userEdge {
node {
id
username
email
}
}
}
}
反应
{
"data": {
"updateUser": {
"userEdge": {
"node": {
"id": "VXNlcjo0",
"username": "SOULs API",
"email": "info@test.com"
}
}
}
}
}
進行物理删除操作(还有逻辑删除操作)。
查询
mutation {
destroyDeleteUser(input: { id: "VXNlcjo0" }) {
user {
id
username
email
}
}
}
对方回应
{
"data": {
"destroyDeleteUser": {
"user": {
"id": "VXNlcjo0",
"username": "SOULs API",
"email": "info@test.com"
}
}
}
}
最後
我很容易地创建了GraphQL API。
尽管这次没有测试,但由于几乎是自动生成的,因此只需准备FactoryBot即可准备好测试。