Skip to content

Commit 43845af

Browse files
committed
Create Endpoint type
1 parent 405ded0 commit 43845af

6 files changed

Lines changed: 48 additions & 40 deletions

File tree

src/helpers/request.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ type RequestGenerator<Args, ResponseType> = {
5555
handleResponse: HandleResponse<ResponseType>;
5656
};
5757

58+
type Endpoint<PathnameParams, RequestArgs, ResponseType> = {
59+
getPathname: (params: PathnameParams) => string;
60+
} & RequestGenerator<RequestArgs, ResponseType>;
61+
export const makeEndpoint = <PathnameParams, RequestArgs, ResponseType>(
62+
endpoint: Endpoint<PathnameParams, RequestArgs, ResponseType>,
63+
) => endpoint;
64+
5865
type GeneratedRequestFunction<Args, ResponseType> = (
5966
...a: Parameters<HandleRequest<Args>>
6067
) => Promise<ApiResponse<ResponseType>>;

src/methods/collections/index.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { handleFeedResponse } from '../../helpers/feed';
22
import { compactDefined } from '../../helpers/fp';
33
import * as Query from '../../helpers/query';
4-
import { createRequestHandler } from '../../helpers/request';
4+
import { createRequestHandler, makeEndpoint } from '../../helpers/request';
55
import { castResponse } from '../../helpers/response';
66
import { OrientationParam, PaginationParams } from '../../types/request';
77

@@ -14,7 +14,7 @@ const COLLECTIONS_PATH_PREFIX = '/collections';
1414
export const getPhotos = (() => {
1515
const getPathname = ({ collectionId }: CollectionId) =>
1616
`${COLLECTIONS_PATH_PREFIX}/${collectionId}/photos`;
17-
return {
17+
return makeEndpoint({
1818
getPathname,
1919
handleRequest: createRequestHandler(
2020
({
@@ -27,25 +27,25 @@ export const getPhotos = (() => {
2727
}),
2828
),
2929
handleResponse: handleFeedResponse<any>(),
30-
};
30+
});
3131
})();
3232

3333
export const get = (() => {
3434
const getPathname = ({ collectionId }: CollectionId) =>
3535
`${COLLECTIONS_PATH_PREFIX}/${collectionId}`;
36-
return {
36+
return makeEndpoint({
3737
getPathname,
3838
handleRequest: createRequestHandler(({ collectionId }: CollectionId) => ({
3939
pathname: getPathname({ collectionId }),
4040
query: {},
4141
})),
4242
handleResponse: castResponse<any>(),
43-
};
43+
});
4444
})();
4545

4646
export const list = (() => {
4747
const getPathname = () => COLLECTIONS_PATH_PREFIX;
48-
return {
48+
return makeEndpoint({
4949
getPathname,
5050
handleRequest: createRequestHandler(
5151
(paginationParams: Pick<PaginationParams, 'page' | 'perPage'> = {}) => ({
@@ -54,18 +54,18 @@ export const list = (() => {
5454
}),
5555
),
5656
handleResponse: handleFeedResponse<any>(),
57-
};
57+
});
5858
})();
5959

6060
export const getRelated = (() => {
6161
const getPathname = ({ collectionId }: CollectionId) =>
6262
`${COLLECTIONS_PATH_PREFIX}/${collectionId}/related`;
63-
return {
63+
return makeEndpoint({
6464
getPathname,
6565
handleRequest: createRequestHandler(({ collectionId }: CollectionId) => ({
6666
pathname: getPathname({ collectionId }),
6767
query: {},
6868
})),
6969
handleResponse: castResponse<any>(),
70-
};
70+
});
7171
})();

src/methods/photos/index.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { handleFeedResponse } from '../../helpers/feed';
22
import { compactDefined } from '../../helpers/fp';
33
import * as Query from '../../helpers/query';
4-
import { createRequestHandler } from '../../helpers/request';
4+
import { createRequestHandler, makeEndpoint } from '../../helpers/request';
55
import { castResponse } from '../../helpers/response';
66
import { isDefined } from '../../helpers/typescript';
77
import { parseQueryAndPathname } from '../../helpers/url';
@@ -16,43 +16,43 @@ const PHOTOS_PATH_PREFIX = '/photos';
1616

1717
export const list = (() => {
1818
const getPathname = () => PHOTOS_PATH_PREFIX;
19-
return {
19+
return makeEndpoint({
2020
getPathname,
2121
handleRequest: createRequestHandler((feedParams: PaginationParams = {}) => ({
2222
pathname: PHOTOS_PATH_PREFIX,
2323
query: compactDefined(Query.getFeedParams(feedParams)),
2424
})),
2525
handleResponse: handleFeedResponse<Photo.Basic>(),
26-
};
26+
});
2727
})();
2828

2929
export const get = (() => {
3030
const getPathname = ({ photoId }: PhotoId) => `${PHOTOS_PATH_PREFIX}/${photoId}`;
31-
return {
31+
return makeEndpoint({
3232
getPathname,
3333
handleRequest: createRequestHandler(({ photoId }: PhotoId) => ({
3434
pathname: getPathname({ photoId }),
3535
query: {},
3636
})),
3737
handleResponse: castResponse<Photo.Full>(),
38-
};
38+
});
3939
})();
4040

4141
export const getStats = (() => {
4242
const getPathname = ({ photoId }: PhotoId) => `${PHOTOS_PATH_PREFIX}/${photoId}/statistics`;
43-
return {
43+
return makeEndpoint({
4444
getPathname,
4545
handleRequest: createRequestHandler(({ photoId }: PhotoId) => ({
4646
pathname: getPathname({ photoId }),
4747
query: {},
4848
})),
4949
handleResponse: castResponse<Photo.Stats>(),
50-
};
50+
});
5151
})();
5252

5353
export const getRandom = (() => {
5454
const getPathname = () => `${PHOTOS_PATH_PREFIX}/random`;
55-
return {
55+
return makeEndpoint({
5656
getPathname,
5757
handleRequest: createRequestHandler(
5858
({
@@ -85,7 +85,7 @@ export const getRandom = (() => {
8585
// An array when the `count` query parameter is used.
8686
Photo.Random | Photo.Random[]
8787
>(),
88-
};
88+
});
8989
})();
9090

9191
export const trackDownload = {

src/methods/search/index.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { compactDefined } from '../../helpers/fp';
22
import * as Query from '../../helpers/query';
3-
import { createRequestHandler } from '../../helpers/request';
3+
import { createRequestHandler, makeEndpoint } from '../../helpers/request';
44
import { castResponse } from '../../helpers/response';
55
import { OrientationParam, PaginationParams } from '../../types/request';
66
import { ColorId, ContentFilter, Language, SearchOrderBy } from './types/request';
@@ -32,7 +32,7 @@ type SearchPhotosParams = SearchParams &
3232

3333
export const getPhotos = (() => {
3434
const getPathname = () => `${SEARCH_PATH_PREFIX}/photos`;
35-
return {
35+
return makeEndpoint({
3636
getPathname,
3737
handleRequest: createRequestHandler(
3838
({
@@ -58,29 +58,29 @@ export const getPhotos = (() => {
5858
}),
5959
),
6060
handleResponse: castResponse<SearchResponse.Photos>(),
61-
};
61+
});
6262
})();
6363

6464
export const getCollections = (() => {
6565
const getPathname = () => `${SEARCH_PATH_PREFIX}/collections`;
66-
return {
66+
return makeEndpoint({
6767
getPathname,
6868
handleRequest: createRequestHandler(({ query, ...paginationParams }: SearchParams) => ({
6969
pathname: getPathname(),
7070
query: { query, ...Query.getFeedParams(paginationParams) },
7171
})),
7272
handleResponse: castResponse<SearchResponse.Collections>(),
73-
};
73+
});
7474
})();
7575

7676
export const getUsers = (() => {
7777
const getPathname = () => `${SEARCH_PATH_PREFIX}/users`;
78-
return {
78+
return makeEndpoint({
7979
getPathname,
8080
handleRequest: createRequestHandler(({ query, ...paginationParams }: SearchParams) => ({
8181
pathname: getPathname(),
8282
query: { query, ...Query.getFeedParams(paginationParams) },
8383
})),
8484
handleResponse: castResponse<SearchResponse.Users>(),
85-
};
85+
});
8686
})();

src/methods/topics/index.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { handleFeedResponse } from '../../helpers/feed';
22
import { compactDefined, flow } from '../../helpers/fp';
33
import * as Query from '../../helpers/query';
4+
import { makeEndpoint } from '../../helpers/request';
45
import { castResponse } from '../../helpers/response';
56
import { OmitStrict } from '../../helpers/typescript';
67
import { OrientationParam, PaginationParams } from '../../types/request';
@@ -16,7 +17,7 @@ const getTopicPath = ({ topicIdOrSlug }: TopicIdOrSlug) => `${BASE_TOPIC_PATH}/$
1617

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

19-
export const list = {
20+
export const list = makeEndpoint({
2021
getPathname: getTopicPath,
2122
handleRequest: ({
2223
page,
@@ -38,20 +39,20 @@ export const list = {
3839
}),
3940
}),
4041
handleResponse: handleFeedResponse<Topic.Basic>(),
41-
};
42+
});
4243

43-
export const get = {
44+
export const get = makeEndpoint({
4445
getPathname: getTopicPath,
4546
handleRequest: ({ topicIdOrSlug }: TopicIdOrSlug) => ({
4647
pathname: getTopicPath({ topicIdOrSlug }),
4748
query: {},
4849
}),
4950
handleResponse: castResponse<Topic.Full>(),
50-
};
51+
});
5152

5253
export const getPhotos = (() => {
5354
const getPathname = flow(getTopicPath, topicPath => `${topicPath}/photos`);
54-
return {
55+
return makeEndpoint({
5556
getPathname,
5657
handleRequest: ({
5758
topicIdOrSlug,
@@ -65,5 +66,5 @@ export const getPhotos = (() => {
6566
}),
6667
}),
6768
handleResponse: handleFeedResponse<Photo.Basic>(),
68-
};
69+
});
6970
})();

src/methods/users/index.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { handleFeedResponse } from '../../helpers/feed';
22
import { compactDefined } from '../../helpers/fp';
33
import * as Query from '../../helpers/query';
4-
import { createRequestHandler } from '../../helpers/request';
4+
import { createRequestHandler, makeEndpoint } from '../../helpers/request';
55
import { castResponse } from '../../helpers/response';
66
import { OrientationParam, PaginationParams } from '../../types/request';
77
import * as User from './types';
@@ -16,19 +16,19 @@ const USERS_PATH_PREFIX = '/users';
1616

1717
export const get = (() => {
1818
const getPathname = ({ username }: Username) => `${USERS_PATH_PREFIX}/${username}`;
19-
return {
19+
return makeEndpoint({
2020
getPathname,
2121
handleRequest: createRequestHandler(({ username }: Username) => ({
2222
pathname: getPathname({ username }),
2323
query: {},
2424
})),
2525
handleResponse: castResponse<User.Full>(),
26-
};
26+
});
2727
})();
2828

2929
export const getPhotos = (() => {
3030
const getPathname = ({ username }: Username) => `${USERS_PATH_PREFIX}/${username}/photos`;
31-
return {
31+
return makeEndpoint({
3232
getPathname,
3333
handleRequest: createRequestHandler(
3434
({
@@ -50,12 +50,12 @@ export const getPhotos = (() => {
5050
}),
5151
),
5252
handleResponse: handleFeedResponse<Photo.Basic>(),
53-
};
53+
});
5454
})();
5555

5656
export const getLikes = (() => {
5757
const getPathname = ({ username }: Username) => `${USERS_PATH_PREFIX}/${username}/likes`;
58-
return {
58+
return makeEndpoint({
5959
getPathname,
6060
handleRequest: createRequestHandler(
6161
({
@@ -71,11 +71,11 @@ export const getLikes = (() => {
7171
}),
7272
),
7373
handleResponse: handleFeedResponse<Photo.Basic>(),
74-
};
74+
});
7575
})();
7676
export const getCollections = (() => {
7777
const getPathname = ({ username }: Username) => `${USERS_PATH_PREFIX}/${username}/collections`;
78-
return {
78+
return makeEndpoint({
7979
getPathname,
8080
handleRequest: createRequestHandler(
8181
({ username, ...paginationParams }: Username & PaginationParams) => ({
@@ -84,5 +84,5 @@ export const getCollections = (() => {
8484
}),
8585
),
8686
handleResponse: handleFeedResponse<Collection.Basic>(),
87-
};
87+
});
8888
})();

0 commit comments

Comments
 (0)