Skip to content

Commit

Permalink
feat(open-payments): add validateResponses flag to optionally disable…
Browse files Browse the repository at this point in the history
… openapi schema validation
  • Loading branch information
mkurapov committed Apr 18, 2024
1 parent c07b378 commit b5f986a
Show file tree
Hide file tree
Showing 10 changed files with 209 additions and 155 deletions.
36 changes: 19 additions & 17 deletions packages/open-payments/src/client/grant.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { HttpMethod } from '@interledger/openapi'
import { HttpMethod, ResponseValidator } from '@interledger/openapi'
import {
GrantOrTokenRequestArgs,
RouteDeps,
Expand Down Expand Up @@ -33,22 +33,24 @@ export interface GrantRoutes {
export const createGrantRoutes = (deps: GrantRouteDeps): GrantRoutes => {
const { openApi, client, ...baseDeps } = deps

const requestGrantValidator = openApi.createResponseValidator<
PendingGrant | Grant
>({
path: getASPath('/'),
method: HttpMethod.POST
})
const continueGrantValidator = openApi.createResponseValidator<
GrantContinuation | Grant
>({
path: getASPath('/continue/{id}'),
method: HttpMethod.POST
})
const cancelGrantValidator = openApi.createResponseValidator({
path: getASPath('/continue/{id}'),
method: HttpMethod.DELETE
})
let requestGrantValidator: ResponseValidator<PendingGrant | Grant>
let continueGrantValidator: ResponseValidator<GrantContinuation | Grant>
let cancelGrantValidator: ResponseValidator<void>

if (deps.validateResponses) {
requestGrantValidator = openApi.createResponseValidator({
path: getASPath('/'),
method: HttpMethod.POST
})
continueGrantValidator = openApi.createResponseValidator({
path: getASPath('/continue/{id}'),
method: HttpMethod.POST
})
cancelGrantValidator = openApi.createResponseValidator({
path: getASPath('/continue/{id}'),
method: HttpMethod.DELETE
})
}

return {
request: (
Expand Down
54 changes: 29 additions & 25 deletions packages/open-payments/src/client/incoming-payment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,56 +41,57 @@ export const createIncomingPaymentRoutes = (
): IncomingPaymentRoutes => {
const { openApi, ...baseDeps } = deps

const getIncomingPaymentOpenApiValidator =
openApi.createResponseValidator<IncomingPaymentWithPaymentMethods>({
let getIncomingPaymentOpenApiValidator: ResponseValidator<IncomingPaymentWithPaymentMethods>
let getPublicIncomingPaymentOpenApiValidator: ResponseValidator<PublicIncomingPayment>
let createIncomingPaymentOpenApiValidator: ResponseValidator<IncomingPaymentWithPaymentMethods>
let completeIncomingPaymentOpenApiValidator: ResponseValidator<IncomingPayment>
let listIncomingPaymentOpenApiValidator: ResponseValidator<IncomingPaymentPaginationResult>

if (deps.validateResponses) {
getIncomingPaymentOpenApiValidator = openApi.createResponseValidator({
path: getRSPath('/incoming-payments/{id}'),
method: HttpMethod.GET
})

const getPublicIncomingPaymentOpenApiValidator =
openApi.createResponseValidator<PublicIncomingPayment>({
getPublicIncomingPaymentOpenApiValidator = openApi.createResponseValidator({
path: getRSPath('/incoming-payments/{id}'),
method: HttpMethod.GET
})

const createIncomingPaymentOpenApiValidator =
openApi.createResponseValidator<IncomingPaymentWithPaymentMethods>({
createIncomingPaymentOpenApiValidator = openApi.createResponseValidator({
path: getRSPath('/incoming-payments'),
method: HttpMethod.POST
})

const completeIncomingPaymentOpenApiValidator =
openApi.createResponseValidator<IncomingPayment>({
completeIncomingPaymentOpenApiValidator = openApi.createResponseValidator({
path: getRSPath('/incoming-payments/{id}/complete'),
method: HttpMethod.POST
})

const listIncomingPaymentOpenApiValidator =
openApi.createResponseValidator<IncomingPaymentPaginationResult>({
listIncomingPaymentOpenApiValidator = openApi.createResponseValidator({
path: getRSPath('/incoming-payments'),
method: HttpMethod.GET
})
}

return {
get: (args: ResourceRequestArgs) =>
getIncomingPayment(baseDeps, args, getIncomingPaymentOpenApiValidator),
getPublic: (args: UnauthenticatedResourceRequestArgs) => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
return getPublicIncomingPayment(
getPublic: (args: UnauthenticatedResourceRequestArgs) =>
getPublicIncomingPayment(
baseDeps,
args,
getPublicIncomingPaymentOpenApiValidator
)
},
),
create: (
requestArgs: ResourceRequestArgs,
createArgs: CreateIncomingPaymentArgs
) =>
createIncomingPayment(
baseDeps,
requestArgs,
createIncomingPaymentOpenApiValidator,
createArgs
createArgs,
createIncomingPaymentOpenApiValidator
),
complete: (args: ResourceRequestArgs) =>
completeIncomingPayment(
Expand All @@ -117,11 +118,14 @@ export const createUnauthenticatedIncomingPaymentRoutes = (
): UnauthenticatedIncomingPaymentRoutes => {
const { openApi, ...baseDeps } = deps

const getPublicIncomingPaymentOpenApiValidator =
openApi.createResponseValidator<PublicIncomingPayment>({
let getPublicIncomingPaymentOpenApiValidator: ResponseValidator<PublicIncomingPayment>

if (deps.validateResponses) {
getPublicIncomingPaymentOpenApiValidator = openApi.createResponseValidator({
path: getRSPath('/incoming-payments/{id}'),
method: HttpMethod.GET
})
}

return {
get: (args: UnauthenticatedResourceRequestArgs) =>
Expand All @@ -136,7 +140,7 @@ export const createUnauthenticatedIncomingPaymentRoutes = (
export const getIncomingPayment = async (
deps: BaseDeps,
args: ResourceRequestArgs,
validateOpenApiResponse: ResponseValidator<IncomingPaymentWithPaymentMethods>
validateOpenApiResponse?: ResponseValidator<IncomingPaymentWithPaymentMethods>
) => {
const { url } = args

Expand All @@ -163,16 +167,16 @@ export const getIncomingPayment = async (
export const getPublicIncomingPayment = async (
deps: BaseDeps,
args: UnauthenticatedResourceRequestArgs,
validateOpenApiResponse: ResponseValidator<PublicIncomingPayment>
validateOpenApiResponse?: ResponseValidator<PublicIncomingPayment>
) => {
return await get(deps, args, validateOpenApiResponse)
}

export const createIncomingPayment = async (
deps: BaseDeps,
requestArgs: ResourceRequestArgs,
validateOpenApiResponse: ResponseValidator<IncomingPaymentWithPaymentMethods>,
createArgs: CreateIncomingPaymentArgs
createArgs: CreateIncomingPaymentArgs,
validateOpenApiResponse?: ResponseValidator<IncomingPaymentWithPaymentMethods>
) => {
const { url: baseUrl, accessToken } = requestArgs
const url = `${baseUrl}${getRSPath('/incoming-payments')}`
Expand All @@ -198,7 +202,7 @@ export const createIncomingPayment = async (
export const completeIncomingPayment = async (
deps: BaseDeps,
args: ResourceRequestArgs,
validateOpenApiResponse: ResponseValidator<IncomingPayment>
validateOpenApiResponse?: ResponseValidator<IncomingPayment>
) => {
const { url: incomingPaymentUrl, accessToken } = args
const url = `${incomingPaymentUrl}/complete`
Expand All @@ -224,7 +228,7 @@ export const completeIncomingPayment = async (
export const listIncomingPayment = async (
deps: BaseDeps,
args: CollectionRequestArgs,
validateOpenApiResponse: ResponseValidator<IncomingPaymentPaginationResult>,
validateOpenApiResponse?: ResponseValidator<IncomingPaymentPaginationResult>,
pagination?: PaginationArgs
) => {
const { url: baseUrl, accessToken, walletAddress } = args
Expand Down
11 changes: 9 additions & 2 deletions packages/open-payments/src/client/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export interface BaseDeps {
httpClient: HttpClient
logger: Logger
useHttp: boolean
validateResponses: boolean
}

interface UnauthenticatedClientDeps extends BaseDeps {
Expand Down Expand Up @@ -129,6 +130,7 @@ const parseKey = (

const createUnauthenticatedDeps = async ({
useHttp = false,
validateResponses = true,
...args
}: Partial<CreateUnauthenticatedClientArgs> = {}): Promise<UnauthenticatedClientDeps> => {
const logger = args?.logger ?? createLogger({ name: 'Open Payments Client' })
Expand All @@ -149,12 +151,14 @@ const createUnauthenticatedDeps = async ({
walletAddressServerOpenApi,
resourceServerOpenApi,
logger,
useHttp
useHttp,
validateResponses
}
}

const createAuthenticatedClientDeps = async ({
useHttp = false,
validateResponses = true,
...args
}:
| CreateAuthenticatedClientArgs
Expand Down Expand Up @@ -206,7 +210,8 @@ const createAuthenticatedClientDeps = async ({
resourceServerOpenApi,
authServerOpenApi,
logger,
useHttp
useHttp,
validateResponses
}
}

Expand All @@ -219,6 +224,8 @@ export interface CreateUnauthenticatedClientArgs {
logLevel?: LevelWithSilent
/** If enabled, all requests will use http as protocol. Use in development mode only. */
useHttp?: boolean
/** Enables or disables response validation against the Open Payments OpenAPI specs. Defaults to true. */
validateResponses?: boolean
}

export interface UnauthenticatedClient {
Expand Down
15 changes: 9 additions & 6 deletions packages/open-payments/src/client/outgoing-payment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,23 +32,26 @@ export const createOutgoingPaymentRoutes = (
): OutgoingPaymentRoutes => {
const { openApi, ...baseDeps } = deps

const getOutgoingPaymentOpenApiValidator =
openApi.createResponseValidator<OutgoingPayment>({
let getOutgoingPaymentOpenApiValidator: ResponseValidator<OutgoingPayment>
let listOutgoingPaymentOpenApiValidator: ResponseValidator<OutgoingPaymentPaginationResult>
let createOutgoingPaymentOpenApiValidator: ResponseValidator<OutgoingPayment>

if (deps.validateResponses) {
getOutgoingPaymentOpenApiValidator = openApi.createResponseValidator({
path: getRSPath('/outgoing-payments/{id}'),
method: HttpMethod.GET
})

const listOutgoingPaymentOpenApiValidator =
openApi.createResponseValidator<OutgoingPaymentPaginationResult>({
listOutgoingPaymentOpenApiValidator = openApi.createResponseValidator({
path: getRSPath('/outgoing-payments'),
method: HttpMethod.GET
})

const createOutgoingPaymentOpenApiValidator =
openApi.createResponseValidator<OutgoingPayment>({
createOutgoingPaymentOpenApiValidator = openApi.createResponseValidator({
path: getRSPath('/outgoing-payments'),
method: HttpMethod.POST
})
}

return {
get: (requestArgs: ResourceRequestArgs) =>
Expand Down
21 changes: 13 additions & 8 deletions packages/open-payments/src/client/quote.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,20 @@ export interface QuoteRoutes {
export const createQuoteRoutes = (deps: RouteDeps): QuoteRoutes => {
const { openApi, ...baseDeps } = deps

const getQuoteOpenApiValidator = openApi.createResponseValidator<Quote>({
path: getRSPath('/quotes/{id}'),
method: HttpMethod.GET
})
let getQuoteOpenApiValidator: ResponseValidator<Quote>
let createQuoteOpenApiValidator: ResponseValidator<Quote>

const createQuoteOpenApiValidator = openApi.createResponseValidator<Quote>({
path: getRSPath('/quotes'),
method: HttpMethod.POST
})
if (deps.validateResponses) {
getQuoteOpenApiValidator = openApi.createResponseValidator({
path: getRSPath('/quotes/{id}'),
method: HttpMethod.GET
})

createQuoteOpenApiValidator = openApi.createResponseValidator({
path: getRSPath('/quotes'),
method: HttpMethod.POST
})
}

return {
get: (args: ResourceRequestArgs) =>
Expand Down

0 comments on commit b5f986a

Please sign in to comment.