Skip to content

Commit 52f3bc3

Browse files
authored
Merge pull request #2 from prezly/feature/sdk
Feature - SDK
2 parents 2751796 + be1e404 commit 52f3bc3

29 files changed

+540
-35
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ build/Release
2525

2626
node_modules/
2727

28+
/coverage
29+
2830
# TypeScript cache
2931
*.tsbuildinfo
3032

jest.config.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@ module.exports = {
55
},
66
testEnvironment: 'node',
77
setupFiles: ['<rootDir>/setupJest.ts'],
8+
moduleNameMapper: {
9+
'^Api$': '<rootDir>/src/Api',
10+
'^types$': '<rootDir>/src/types',
11+
},
812
};

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@prezly/sdk",
33
"version": "1.0.0",
44
"description": "Prezly API SDK",
5-
"main": "dist/sdk.js",
5+
"main": "dist/index.js",
66
"repository": {
77
"type": "git",
88
"url": "https://github.com/prezly/sdk.git"

src/Api/Api.ts

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,71 @@
11
import { Method, HeadersMap, Response } from './types';
22
import createRequest from './createRequest';
33

4+
const withAccessToken = (headers: HeadersMap = {}, accessToken: string): HeadersMap => ({
5+
...headers,
6+
'x-access-token': accessToken,
7+
});
8+
9+
interface Params {
10+
accessToken: string;
11+
headers?: HeadersMap;
12+
query?: object;
13+
}
14+
15+
interface ParamsWithPayload extends Params {
16+
payload?: object;
17+
}
18+
419
const Api = {
5-
get: <P = any>(
6-
url: string,
7-
{ query, headers }: { headers?: HeadersMap; query?: object } = {},
8-
): Promise<Response<P>> =>
20+
get: <P = any>(url: string, { accessToken, headers, query }: Params): Promise<Response<P>> =>
921
createRequest(url, {
22+
headers: withAccessToken(headers, accessToken),
1023
method: Method.GET,
11-
headers,
1224
query,
1325
}),
1426

1527
post: <P = any>(
1628
url: string,
17-
{
18-
headers,
19-
query,
20-
payload,
21-
}: { headers?: HeadersMap; query?: object; payload?: object } = {},
29+
{ accessToken, headers, payload, query }: ParamsWithPayload,
2230
): Promise<Response<P>> =>
2331
createRequest(url, {
32+
headers: withAccessToken(headers, accessToken),
2433
method: Method.POST,
25-
headers,
26-
query,
2734
payload,
35+
query,
2836
}),
2937

3038
put: <P = any>(
3139
url: string,
32-
{
33-
headers,
34-
query,
35-
payload,
36-
}: { headers?: HeadersMap; query?: object; payload?: object } = {},
40+
{ accessToken, headers, payload, query }: ParamsWithPayload,
3741
): Promise<Response<P>> =>
3842
createRequest(url, {
43+
headers: withAccessToken(headers, accessToken),
3944
method: Method.PUT,
40-
headers,
41-
query,
4245
payload,
46+
query,
4347
}),
4448

4549
patch: <P = any>(
4650
url: string,
47-
{
48-
headers,
49-
query,
50-
payload,
51-
}: { headers?: HeadersMap; query?: object; payload?: object } = {},
51+
{ accessToken, headers, payload, query }: ParamsWithPayload,
5252
): Promise<Response<P>> =>
5353
createRequest(url, {
54+
headers: withAccessToken(headers, accessToken),
5455
method: Method.PATCH,
55-
headers,
56-
query,
5756
payload,
57+
query,
5858
}),
5959

6060
delete: <P = any>(
6161
url: string,
62-
{
63-
headers,
64-
query,
65-
payload,
66-
}: { headers?: HeadersMap; query?: object; payload?: object } = {},
62+
{ accessToken, headers, payload, query }: ParamsWithPayload,
6763
): Promise<Response<P>> =>
6864
createRequest(url, {
65+
headers: withAccessToken(headers, accessToken),
6966
method: Method.DELETE,
70-
headers,
71-
query,
7267
payload,
68+
query,
7369
}),
7470
};
7571

src/Sdk/Coverage/Coverage.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { Api } from 'Api';
2+
import { Coverage } from 'types';
3+
4+
import { coverageUrl } from '../routing';
5+
import { getItemId } from '../utils';
6+
7+
import { CoverageListResponse } from './types';
8+
9+
interface Options {
10+
accessToken: string;
11+
baseUrl: string;
12+
}
13+
14+
export default class CoverageSdk {
15+
private readonly accessToken: string;
16+
private readonly url: string;
17+
18+
constructor({ accessToken, baseUrl }: Options) {
19+
this.accessToken = accessToken;
20+
this.url = `${baseUrl}/${coverageUrl}`;
21+
}
22+
23+
async list(): Promise<CoverageListResponse> {
24+
const response = await Api.get<CoverageListResponse>(this.url, {
25+
accessToken: this.accessToken,
26+
});
27+
return response.payload;
28+
}
29+
30+
async get(itemOrItemId: string | Coverage): Promise<Coverage> {
31+
const response = await Api.get<{ coverage: Coverage }>(this.getUrlWithId(itemOrItemId), {
32+
accessToken: this.accessToken,
33+
});
34+
return response.payload.coverage;
35+
}
36+
37+
async create(): Promise<Coverage> {
38+
throw new Error('Not implemented!');
39+
}
40+
41+
async update(): Promise<Coverage> {
42+
throw new Error('Not implemented!');
43+
}
44+
45+
async delete(itemOrItemId: string | Coverage): Promise<void> {
46+
await Api.delete<{ coverage: Coverage }>(this.getUrlWithId(itemOrItemId), {
47+
accessToken: this.accessToken,
48+
});
49+
}
50+
51+
private getUrlWithId(itemOrItemId: string | Coverage): string {
52+
const itemId: string = getItemId<string, Coverage>(itemOrItemId);
53+
return `${this.url}/${itemId}`;
54+
}
55+
}

src/Sdk/Coverage/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default as Coverage } from './Coverage';

src/Sdk/Coverage/types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { Coverage, Pagination } from 'types';
2+
3+
export interface CoverageListResponse {
4+
coverage: Coverage[];
5+
sort: string;
6+
pagination: Pagination;
7+
}

src/Sdk/Sdk.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Options } from './types';
2+
import { Coverage } from './Coverage';
3+
4+
export const BASE_URL = 'https://api.prezly.com';
5+
6+
export default class Sdk {
7+
public coverage: Coverage;
8+
9+
constructor({ accessToken, baseUrl = BASE_URL }: Options) {
10+
this.coverage = new Coverage({
11+
accessToken,
12+
baseUrl,
13+
});
14+
}
15+
}

src/Sdk/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default as Sdk } from './Sdk';

src/Sdk/routing.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const coverageUrl = '/v2/coverage';

0 commit comments

Comments
 (0)