Skip to content

Instantly share code, notes, and snippets.

@moaible
Last active July 30, 2020 01:19
Show Gist options
  • Save moaible/e84cf0244652f9350e94e3a9a0be4555 to your computer and use it in GitHub Desktop.
Save moaible/e84cf0244652f9350e94e3a9a0be4555 to your computer and use it in GitHub Desktop.
Amplify API Wrapper
import { API, Logger } from 'aws-amplify';
// NOTE: もしAmplify関連で問題を調査したい場合 'DEBUG' にすると細かい挙動が確認できます
Logger.LOG_LEVEL = 'WARN';
export type Headers = object | undefined; // TODO: 適切な型にする
export type QueryParams = object | undefined; // TODO: 適切な型にする
export type Body = object | undefined; // TODO: 適切な型にする
export interface ApiRequest {
base?: string;
method: ApiMethod;
pathResource: string;
headers?: Headers;
body?: Body;
queryStringParameters?: QueryParams;
}
async function mapToApiMethodFunction<T>(
amplifyAPI: AmplifyAPIClient<T>,
request: ApiRequest,
): Promise<ApiResponse<T>> {
switch (request.method) {
case 'GET': {
return amplifyAPI.get(request.base, request.pathResource, {
headers: request.headers,
body: request.body,
queryStringParameters: request.queryStringParameters,
});
}
case 'POST': {
return amplifyAPI.post(request.base, request.pathResource, {
headers: request.headers,
body: request.body,
queryStringParameters: request.queryStringParameters,
});
}
case 'DELETE': {
return amplifyAPI.del(request.base, request.pathResource, {
headers: request.headers,
body: request.body,
queryStringParameters: request.queryStringParameters,
});
}
case 'PUT': {
return amplifyAPI.put(request.base, request.pathResource, {
headers: request.headers,
body: request.body,
queryStringParameters: request.queryStringParameters,
});
}
case 'PATCH': {
return amplifyAPI.patch(request.base, request.pathResource, {
headers: request.headers,
body: request.body,
queryStringParameters: request.queryStringParameters,
});
}
default: {
return Promise.reject(new Error('never call case'));
}
}
}
export async function send<T>(request: ApiRequest): Promise<T> {
return mapToApiMethodFunction<T>(API, request).then((response) => {
return response;
});
}
export type ApiMethod = 'GET' | 'POST' | 'DELETE' | 'PATCH' | 'PUT';
type ApiMethodFunctionParameters = undefined | {
headers: undefined | object;
body: undefined | object;
queryStringParameters: undefined | object;
withCredentials?: boolean;
};
type ApiResponse<T> = T;
interface AmplifyAPIClient<T> {
get(apiName: string,
path: string,
parameters: ApiMethodFunctionParameters): Promise<ApiResponse<T>>;
post(apiName: string,
path: string,
parameters: ApiMethodFunctionParameters): Promise<ApiResponse<T>>;
del(apiName: string,
path: string,
parameters: ApiMethodFunctionParameters): Promise<ApiResponse<T>>;
patch(apiName: string,
path: string,
parameters: ApiMethodFunctionParameters): Promise<ApiResponse<T>>;
put(apiName: string,
path: string,
parameters: ApiMethodFunctionParameters): Promise<ApiResponse<T>>;
}
import * as api from '../api/AmplifyApiClient';
export type ExampleResponse = {
name: string
}
export async function getExample(id: number): Promise<ExampleResponse> {
return api.send({
method: 'GET',
pathResource: `/example/${id}`,
headers: {},
// NOTE: GETでbodyに空オブジェクトを入れるとSigned Requestで必ず失敗する
// @see https://github.com/aws-amplify/amplify-js/issues/3534
body: null,
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment