我试着建立一个名为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,并看到以下的画面显示时,表示你已经准备好开始创建应用了。

動作確認

创建模型

用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即可准备好测试。