diff --git a/packages/io-ts-http/src/statusCode.ts b/packages/io-ts-http/src/statusCode.ts index a7185191..d0d01b43 100644 --- a/packages/io-ts-http/src/statusCode.ts +++ b/packages/io-ts-http/src/statusCode.ts @@ -6,6 +6,7 @@ export const HttpToKeyStatus = { 401: 'unauthenticated', 403: 'permissionDenied', 404: 'notFound', + 409: 'conflict', 429: 'rateLimitExceeded', 500: 'internalError', 503: 'serviceUnavailable', @@ -19,6 +20,7 @@ export const KeyToHttpStatus = { unauthenticated: 401, permissionDenied: 403, notFound: 404, + conflict: 409, rateLimitExceeded: 429, internalError: 500, serviceUnavailable: 503, diff --git a/packages/response/src/index.ts b/packages/response/src/index.ts index cd7cdb41..a8db6cdc 100644 --- a/packages/response/src/index.ts +++ b/packages/response/src/index.ts @@ -1,41 +1,2 @@ -/* - * @api-ts/response - */ - -// HTTP | GRPC | Response -// ----------------------------|--------------------|--------------------------- -// 400 (bad request) | INVALID_ARGUMENT | Response.invalidRequest -// 401 (unauthorized) | UNAUTHENTICATED | Response.unauthenticated -// 403 (forbidden) | PERMISSION_DENIED | Response.permissionDenied -// 404 (not found) | NOT_FOUND | Response.notFound -// 405 (method not allowed) | NOT_FOUND | Response.notFound -// 429 (rate-limit) | RESOURCE_EXHAUSTED | Response.rateLimitExceeded -// 500 (internal server error) | INTERNAL | Response.internalError -// 503 (service unavailable) | UNAVAILABLE | Response.serviceUnavailable - -export type Status = - | 'ok' - | 'invalidRequest' - | 'unauthenticated' - | 'permissionDenied' - | 'notFound' - | 'rateLimitExceeded' - | 'internalError' - | 'serviceUnavailable'; - -export type Response = { type: Status; payload: unknown }; - -const responseFunction = - (status: S) => - (payload: T) => ({ type: status, payload }); - -export const Response = { - ok: responseFunction('ok'), - invalidRequest: responseFunction('invalidRequest'), - unauthenticated: responseFunction('unauthenticated'), - permissionDenied: responseFunction('permissionDenied'), - notFound: responseFunction('notFound'), - rateLimitExceeded: responseFunction('rateLimitExceeded'), - internalError: responseFunction('internalError'), - serviceUnavailable: responseFunction('serviceUnavailable'), -}; +export * from './response'; +export * from './keyed-response'; diff --git a/packages/response/src/keyed-response.ts b/packages/response/src/keyed-response.ts new file mode 100644 index 00000000..7a063e39 --- /dev/null +++ b/packages/response/src/keyed-response.ts @@ -0,0 +1,44 @@ +/* + * @api-ts/response + */ + +// HTTP | GRPC | Response +// ----------------------------|--------------------|--------------------------- +// 400 (bad request) | INVALID_ARGUMENT | Response.invalidRequest +// 401 (unauthorized) | UNAUTHENTICATED | Response.unauthenticated +// 403 (forbidden) | PERMISSION_DENIED | Response.permissionDenied +// 404 (not found) | NOT_FOUND | Response.notFound +// 405 (method not allowed) | NOT_FOUND | Response.notFound +// 409 (conflict) | ALREADY_EXISTS | Response.conflict +// 429 (rate-limit) | RESOURCE_EXHAUSTED | Response.rateLimitExceeded +// 500 (internal server error) | INTERNAL | Response.internalError +// 503 (service unavailable) | UNAVAILABLE | Response.serviceUnavailable + +export type KeyedStatus = + | 'ok' + | 'invalidRequest' + | 'unauthenticated' + | 'permissionDenied' + | 'notFound' + | 'conflict' + | 'rateLimitExceeded' + | 'internalError' + | 'serviceUnavailable'; + +export type KeyedResponse = { type: KeyedStatus; payload: unknown }; + +const responseFunction = + (status: S) => + (payload: T) => ({ type: status, payload }); + +export const KeyedResponse = { + ok: responseFunction('ok'), + invalidRequest: responseFunction('invalidRequest'), + unauthenticated: responseFunction('unauthenticated'), + permissionDenied: responseFunction('permissionDenied'), + notFound: responseFunction('notFound'), + conflict: responseFunction('conflict'), + rateLimitExceeded: responseFunction('rateLimitExceeded'), + internalError: responseFunction('internalError'), + serviceUnavailable: responseFunction('serviceUnavailable'), +}; diff --git a/packages/response/src/response.ts b/packages/response/src/response.ts new file mode 100644 index 00000000..4f65555a --- /dev/null +++ b/packages/response/src/response.ts @@ -0,0 +1,35 @@ +/* + * @api-ts/response + */ + +// HTTP | GRPC | Response +// ----------------------------|--------------------|--------------------------- +// 400 (bad request) | INVALID_ARGUMENT | Response.invalidRequest +// 401 (unauthorized) | UNAUTHENTICATED | Response.unauthenticated +// 403 (forbidden) | PERMISSION_DENIED | Response.permissionDenied +// 404 (not found) | NOT_FOUND | Response.notFound +// 405 (method not allowed) | NOT_FOUND | Response.notFound +// 409 (conflict) | ALREADY_EXISTS | Response.conflict +// 429 (rate-limit) | RESOURCE_EXHAUSTED | Response.rateLimitExceeded +// 500 (internal server error) | INTERNAL | Response.internalError +// 503 (service unavailable) | UNAVAILABLE | Response.serviceUnavailable + +export type Status = 200 | 400 | 401 | 403 | 404 | 409 | 429 | 500 | 503; + +export type Response = { type: Status; payload: unknown }; + +const ResponseFunction = + (status: S) => + (payload: T) => ({ type: status, payload }); + +export const Response = { + ok: ResponseFunction(200), + invalidRequest: ResponseFunction(400), + unauthenticated: ResponseFunction(401), + permissionDenied: ResponseFunction(403), + notFound: ResponseFunction(404), + conflict: ResponseFunction(409), + rateLimitExceeded: ResponseFunction(429), + internalError: ResponseFunction(500), + serviceUnavailable: ResponseFunction(503), +};