Skip to content

Commit

Permalink
Create Endpoint type
Browse files Browse the repository at this point in the history
  • Loading branch information
OliverJAsh committed Jun 23, 2021
1 parent 405ded0 commit 43845af
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 40 deletions.
7 changes: 7 additions & 0 deletions src/helpers/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,13 @@ type RequestGenerator<Args, ResponseType> = {
handleResponse: HandleResponse<ResponseType>;
};

type Endpoint<PathnameParams, RequestArgs, ResponseType> = {
getPathname: (params: PathnameParams) => string;
} & RequestGenerator<RequestArgs, ResponseType>;
export const makeEndpoint = <PathnameParams, RequestArgs, ResponseType>(
endpoint: Endpoint<PathnameParams, RequestArgs, ResponseType>,
) => endpoint;

type GeneratedRequestFunction<Args, ResponseType> = (
...a: Parameters<HandleRequest<Args>>
) => Promise<ApiResponse<ResponseType>>;
Expand Down
18 changes: 9 additions & 9 deletions src/methods/collections/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { handleFeedResponse } from '../../helpers/feed';
import { compactDefined } from '../../helpers/fp';
import * as Query from '../../helpers/query';
import { createRequestHandler } from '../../helpers/request';
import { createRequestHandler, makeEndpoint } from '../../helpers/request';
import { castResponse } from '../../helpers/response';
import { OrientationParam, PaginationParams } from '../../types/request';

Expand All @@ -14,7 +14,7 @@ const COLLECTIONS_PATH_PREFIX = '/collections';
export const getPhotos = (() => {
const getPathname = ({ collectionId }: CollectionId) =>
`${COLLECTIONS_PATH_PREFIX}/${collectionId}/photos`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(
({
Expand All @@ -27,25 +27,25 @@ export const getPhotos = (() => {
}),
),
handleResponse: handleFeedResponse<any>(),
};
});
})();

export const get = (() => {
const getPathname = ({ collectionId }: CollectionId) =>
`${COLLECTIONS_PATH_PREFIX}/${collectionId}`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(({ collectionId }: CollectionId) => ({
pathname: getPathname({ collectionId }),
query: {},
})),
handleResponse: castResponse<any>(),
};
});
})();

export const list = (() => {
const getPathname = () => COLLECTIONS_PATH_PREFIX;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(
(paginationParams: Pick<PaginationParams, 'page' | 'perPage'> = {}) => ({
Expand All @@ -54,18 +54,18 @@ export const list = (() => {
}),
),
handleResponse: handleFeedResponse<any>(),
};
});
})();

export const getRelated = (() => {
const getPathname = ({ collectionId }: CollectionId) =>
`${COLLECTIONS_PATH_PREFIX}/${collectionId}/related`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(({ collectionId }: CollectionId) => ({
pathname: getPathname({ collectionId }),
query: {},
})),
handleResponse: castResponse<any>(),
};
});
})();
18 changes: 9 additions & 9 deletions src/methods/photos/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { handleFeedResponse } from '../../helpers/feed';
import { compactDefined } from '../../helpers/fp';
import * as Query from '../../helpers/query';
import { createRequestHandler } from '../../helpers/request';
import { createRequestHandler, makeEndpoint } from '../../helpers/request';
import { castResponse } from '../../helpers/response';
import { isDefined } from '../../helpers/typescript';
import { parseQueryAndPathname } from '../../helpers/url';
Expand All @@ -16,43 +16,43 @@ const PHOTOS_PATH_PREFIX = '/photos';

export const list = (() => {
const getPathname = () => PHOTOS_PATH_PREFIX;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler((feedParams: PaginationParams = {}) => ({
pathname: PHOTOS_PATH_PREFIX,
query: compactDefined(Query.getFeedParams(feedParams)),
})),
handleResponse: handleFeedResponse<Photo.Basic>(),
};
});
})();

export const get = (() => {
const getPathname = ({ photoId }: PhotoId) => `${PHOTOS_PATH_PREFIX}/${photoId}`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(({ photoId }: PhotoId) => ({
pathname: getPathname({ photoId }),
query: {},
})),
handleResponse: castResponse<Photo.Full>(),
};
});
})();

export const getStats = (() => {
const getPathname = ({ photoId }: PhotoId) => `${PHOTOS_PATH_PREFIX}/${photoId}/statistics`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(({ photoId }: PhotoId) => ({
pathname: getPathname({ photoId }),
query: {},
})),
handleResponse: castResponse<Photo.Stats>(),
};
});
})();

export const getRandom = (() => {
const getPathname = () => `${PHOTOS_PATH_PREFIX}/random`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(
({
Expand Down Expand Up @@ -85,7 +85,7 @@ export const getRandom = (() => {
// An array when the `count` query parameter is used.
Photo.Random | Photo.Random[]
>(),
};
});
})();

export const trackDownload = {
Expand Down
14 changes: 7 additions & 7 deletions src/methods/search/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { compactDefined } from '../../helpers/fp';
import * as Query from '../../helpers/query';
import { createRequestHandler } from '../../helpers/request';
import { createRequestHandler, makeEndpoint } from '../../helpers/request';
import { castResponse } from '../../helpers/response';
import { OrientationParam, PaginationParams } from '../../types/request';
import { ColorId, ContentFilter, Language, SearchOrderBy } from './types/request';
Expand Down Expand Up @@ -32,7 +32,7 @@ type SearchPhotosParams = SearchParams &

export const getPhotos = (() => {
const getPathname = () => `${SEARCH_PATH_PREFIX}/photos`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(
({
Expand All @@ -58,29 +58,29 @@ export const getPhotos = (() => {
}),
),
handleResponse: castResponse<SearchResponse.Photos>(),
};
});
})();

export const getCollections = (() => {
const getPathname = () => `${SEARCH_PATH_PREFIX}/collections`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(({ query, ...paginationParams }: SearchParams) => ({
pathname: getPathname(),
query: { query, ...Query.getFeedParams(paginationParams) },
})),
handleResponse: castResponse<SearchResponse.Collections>(),
};
});
})();

export const getUsers = (() => {
const getPathname = () => `${SEARCH_PATH_PREFIX}/users`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(({ query, ...paginationParams }: SearchParams) => ({
pathname: getPathname(),
query: { query, ...Query.getFeedParams(paginationParams) },
})),
handleResponse: castResponse<SearchResponse.Users>(),
};
});
})();
13 changes: 7 additions & 6 deletions src/methods/topics/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { handleFeedResponse } from '../../helpers/feed';
import { compactDefined, flow } from '../../helpers/fp';
import * as Query from '../../helpers/query';
import { makeEndpoint } from '../../helpers/request';
import { castResponse } from '../../helpers/response';
import { OmitStrict } from '../../helpers/typescript';
import { OrientationParam, PaginationParams } from '../../types/request';
Expand All @@ -16,7 +17,7 @@ const getTopicPath = ({ topicIdOrSlug }: TopicIdOrSlug) => `${BASE_TOPIC_PATH}/$

type TopicOrderBy = 'latest' | 'oldest' | 'position' | 'featured';

export const list = {
export const list = makeEndpoint({
getPathname: getTopicPath,
handleRequest: ({
page,
Expand All @@ -38,20 +39,20 @@ export const list = {
}),
}),
handleResponse: handleFeedResponse<Topic.Basic>(),
};
});

export const get = {
export const get = makeEndpoint({
getPathname: getTopicPath,
handleRequest: ({ topicIdOrSlug }: TopicIdOrSlug) => ({
pathname: getTopicPath({ topicIdOrSlug }),
query: {},
}),
handleResponse: castResponse<Topic.Full>(),
};
});

export const getPhotos = (() => {
const getPathname = flow(getTopicPath, topicPath => `${topicPath}/photos`);
return {
return makeEndpoint({
getPathname,
handleRequest: ({
topicIdOrSlug,
Expand All @@ -65,5 +66,5 @@ export const getPhotos = (() => {
}),
}),
handleResponse: handleFeedResponse<Photo.Basic>(),
};
});
})();
18 changes: 9 additions & 9 deletions src/methods/users/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { handleFeedResponse } from '../../helpers/feed';
import { compactDefined } from '../../helpers/fp';
import * as Query from '../../helpers/query';
import { createRequestHandler } from '../../helpers/request';
import { createRequestHandler, makeEndpoint } from '../../helpers/request';
import { castResponse } from '../../helpers/response';
import { OrientationParam, PaginationParams } from '../../types/request';
import * as User from './types';
Expand All @@ -16,19 +16,19 @@ const USERS_PATH_PREFIX = '/users';

export const get = (() => {
const getPathname = ({ username }: Username) => `${USERS_PATH_PREFIX}/${username}`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(({ username }: Username) => ({
pathname: getPathname({ username }),
query: {},
})),
handleResponse: castResponse<User.Full>(),
};
});
})();

export const getPhotos = (() => {
const getPathname = ({ username }: Username) => `${USERS_PATH_PREFIX}/${username}/photos`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(
({
Expand All @@ -50,12 +50,12 @@ export const getPhotos = (() => {
}),
),
handleResponse: handleFeedResponse<Photo.Basic>(),
};
});
})();

export const getLikes = (() => {
const getPathname = ({ username }: Username) => `${USERS_PATH_PREFIX}/${username}/likes`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(
({
Expand All @@ -71,11 +71,11 @@ export const getLikes = (() => {
}),
),
handleResponse: handleFeedResponse<Photo.Basic>(),
};
});
})();
export const getCollections = (() => {
const getPathname = ({ username }: Username) => `${USERS_PATH_PREFIX}/${username}/collections`;
return {
return makeEndpoint({
getPathname,
handleRequest: createRequestHandler(
({ username, ...paginationParams }: Username & PaginationParams) => ({
Expand All @@ -84,5 +84,5 @@ export const getCollections = (() => {
}),
),
handleResponse: handleFeedResponse<Collection.Basic>(),
};
});
})();

0 comments on commit 43845af

Please sign in to comment.