Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature(farrow-restapi): combine request schema and response schema to be api schema. #19

Open
Lucifier129 opened this issue Dec 26, 2020 · 4 comments
Labels
enhancement New feature or request

Comments

@Lucifier129
Copy link
Collaborator

Lucifier129 commented Dec 26, 2020

For now, farrow-http just supporting the request schema.

We can use farrow-schema to describe the request and response of all the RESTFul API and integrate it with something like oepnapi. And seamless reusing the schema/type of all Apis in client-side for implementing type-safe fetcher.

The server-side

import { RequestType, ResponseType, toRouter } from 'farrow-restapi'

const GetUserRequest = RequestType({
  url: '/user?<id:int>'
})

const GetUserResponse = ResponseType ({
  success: Boolean,
  message:  String,
  data: {
    id: Number,
    name: String,
    email: String  
  }
})

const GetUserApi = {
  request: GetUserRequest ,
  response: GetUserResponse 
}

const Apis = {
  getUser: GetUserApi
}

const getUserRouter = toRouter(GetUserApi)

getUserRouter.impl(request => {
  // response should be GetUserResponse 
})

The client-side

The schema of API can generate an API client for client-side

import { createFarrowApiClient } from 'farrow-restapi-client'

let client= createFarrowApiClient(Apis, {
  baseurl: '/path/to/base'
})

client.getUser(GetUserRequest) -> Promise<GetUserResponse>
@Lucifier129 Lucifier129 added the enhancement New feature or request label Dec 26, 2020
@ianmartorell
Copy link

Would this allow to use a typed API client on a frontend project that's separate from the backend? Like a create-react-app project. I'm currently achieving this using Express and customized versions of the packages in https://github.com/rawrmaan/restyped. I leverage yarn workspaces to import the backend workspace (which exports an API typescript interface) from the frontend workspace. It works great, but it feels a little hacky in some places. I can give a more in-depth explanation on the whole setup if needed.

I'm really liking what I have seen from Farrow thus far, so I'd like to consider it for future projects!

@Lucifier129
Copy link
Collaborator Author

Would this allow to use a typed API client on a frontend project that's separate from the backend?

Yes, that is the goal.

It will provide at least three ways to share the server-side schema/type with the client-side

  • via npm package. We can publish the schema of the server project, and install it in any frontend project.

  • via monorepo. Put server project and frontend project together in one git repos, and share the same schema written by farrow-schema. In the server project, farrow-restapi will use the schema as the spec/interface to implement; In the frontend project, farrow-restapi-client will use the schema as the source/contract to consume/fetch

  • via introspection. Similar to GraphQL, farrow-restapi will provide a special api for introspection. We can use the response of introspection to generate TS code via a compiler tool or rebuild the TS type via type infer

@uinz
Copy link
Contributor

uinz commented Dec 31, 2020

Prisma's introspect has a very good experience

We can try to use the OpenAPI(swagger3) specification, so that clients in other languages can also consume

@Lucifier129
Copy link
Collaborator Author

@uinz Good point! Thanks for sharing!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants