Skip to content

Commit cee9a2f

Browse files
committed
feat: add functions to fetch swagger.json from saddleback server
1 parent b7eb86d commit cee9a2f

File tree

6 files changed

+173
-6
lines changed

6 files changed

+173
-6
lines changed

rollup.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,6 @@ export default {
7070
file: './dist/index.js',
7171
format: 'cjs',
7272
},
73-
external: ['camelcase', 'commander', 'fs-extra', 'handlebars', 'json-schema-ref-parser'],
73+
external: ['camelcase', 'commander', 'fs-extra', 'handlebars', 'json-schema-ref-parser', 'axios', 'form-data'],
7474
plugins: getPlugins(),
7575
};

src/generateSaddlebackSpec.ts

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import { generate, Options } from './generate';
2-
import { isString } from './utils/isString';
3-
import { getOpenApiSpec } from './utils/getOpenApiSpec';
42
import { OpenApi } from './openApi/v3/interfaces/OpenApi';
5-
import { Dictionary } from './utils/types';
63
import { OpenApiSchema } from './openApi/v3/interfaces/OpenApiSchema';
7-
import { removeLodashPrefix } from './utils/removeLodashPrefix';
4+
import { getOpenApiSpec } from './utils/getOpenApiSpec';
5+
import { isString } from './utils/isString';
86
import { mapSwaggerRef } from './utils/mapSwaggerRef';
7+
import { removeLodashPrefix } from './utils/removeLodashPrefix';
98
import { removeLodashPrefixFromRef } from './utils/removeLodashPrefixFromRef';
9+
import { getApiToken } from './utils/saddleback/getApiToken';
10+
import { getRequestVerificationToken } from './utils/saddleback/getRequestVerificationToken';
11+
import { getSessionCookie } from './utils/saddleback/getSessionCookie';
12+
import { getSwaggerJson } from './utils/saddleback/getSwaggerJson';
13+
import { Dictionary } from './utils/types';
1014

1115
type Config = Options & {
1216
useSaddlebackServices?: boolean;
@@ -16,7 +20,54 @@ type Config = Options & {
1620
};
1721

1822
export const generateSaddlebackSpec = async (config: Config) => {
19-
const openApi: OpenApi = isString(config.input) ? await getOpenApiSpec(config.input) : config.input;
23+
const username = '[email protected]';
24+
const password = "&cY8at<'S5PfJa#k";
25+
const swaggerUrl = `https://hc-workflowsservice-dev.azurewebsites.net/api-doc/v1/swagger.json`;
26+
27+
const loginUrl = `https://identity-dev.saddleback.com/account/login`;
28+
const tokenUrl = `https://identity-dev.saddleback.com/connect/authorize/callback`;
29+
30+
// params
31+
const client_id = 'cm';
32+
const response_type = 'token';
33+
const scope = 'cm-api.default';
34+
const redirect_uri = (swaggerUrl.match(new RegExp(`.*\.net`)) || [])[0] + '/api-doc-auth-callback';
35+
const response_mode = 'form_post';
36+
const state = 'e57a56201103b8bda3981515294649254a764612d871ecbe7a31efb8e3e66c8b';
37+
const nonce = '78fd83bf2d178a5c5de18f9f7da3269b34f7daa07d4accc28cd0bdb87f9deee8';
38+
const returnUrl = `/connect/authorize/callback?client_id=${client_id}&response_type=${response_type}&scope=${scope}&redirect_uri=${redirect_uri}&state=${state}&nonce=${nonce}&response_mode=${response_mode}`;
39+
40+
const { requestVerificationToken, cookie } = await getRequestVerificationToken({
41+
url: loginUrl,
42+
params: { returnUrl },
43+
});
44+
45+
const { cookie: sessionCookie } = await getSessionCookie({
46+
url: loginUrl,
47+
username,
48+
password,
49+
cookie,
50+
requestVerificationToken,
51+
params: { returnUrl },
52+
});
53+
54+
const { apiToken } = await getApiToken({
55+
url: tokenUrl,
56+
cookie: sessionCookie,
57+
params: {
58+
client_id,
59+
response_type,
60+
scope,
61+
redirect_uri,
62+
state,
63+
nonce,
64+
response_mode,
65+
},
66+
});
67+
68+
const { data: json } = await getSwaggerJson({ url: swaggerUrl, apiToken: apiToken });
69+
70+
const openApi: OpenApi = isString(config.input) ? await getOpenApiSpec(config.input) : config.input;
2071

2172
if (config.removeLodashPrefixes && openApi.components && openApi.components.schemas) {
2273
const newSchemas: Dictionary<OpenApiSchema> = {};

src/utils/saddleback/getApiToken.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import axios from 'axios';
2+
3+
export const getApiToken = async ({
4+
url,
5+
cookie,
6+
params,
7+
}: {
8+
url: string;
9+
cookie: string;
10+
params: Record<string, string>;
11+
}): Promise<{ apiToken: string }> => {
12+
const response = await axios(url, {
13+
method: 'GET',
14+
headers: {
15+
Cookie: cookie,
16+
},
17+
params,
18+
maxRedirects: 0,
19+
});
20+
21+
const regexp = new RegExp(`type='hidden' name='access_token' value='(.*)'`);
22+
const apiToken = response.data.match(regexp)?.[1] || null;
23+
24+
if (apiToken === null) throw new Error('wrong apiToken getApiToken');
25+
26+
return { apiToken };
27+
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import axios from 'axios';
2+
3+
export const getRequestVerificationToken = async ({
4+
url,
5+
params,
6+
}: {
7+
url: string;
8+
params: Record<string, string>;
9+
}): Promise<{ requestVerificationToken: string; cookie: string }> => {
10+
const response0 = await axios(url, {
11+
method: 'GET',
12+
params,
13+
maxRedirects: 0,
14+
});
15+
const regexp = new RegExp(`<input name="__RequestVerificationToken" type="hidden" value="(.*)"`);
16+
const requestVerificationToken = response0.data.match(regexp)?.[1] || null;
17+
18+
const cookies = response0.headers['set-cookie'];
19+
const cookieString = cookies?.reduce((acc, it) => `${acc}${it};`, '') || null;
20+
21+
if (!requestVerificationToken || !cookieString) throw new Error('getRequestVerificationToken failed');
22+
23+
return {
24+
cookie: cookieString,
25+
requestVerificationToken,
26+
};
27+
};
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import axios, { AxiosError } from 'axios';
2+
import FormData from 'form-data';
3+
4+
export const getSessionCookie = async ({
5+
username,
6+
password,
7+
requestVerificationToken,
8+
url,
9+
params,
10+
cookie,
11+
}: {
12+
username: string;
13+
password: string;
14+
requestVerificationToken: string;
15+
url: string;
16+
params: Record<string, string>;
17+
cookie: string;
18+
}): Promise<{ cookie: string }> => {
19+
let cookieString = '';
20+
21+
try {
22+
const form = new FormData();
23+
form.append('Username', username);
24+
form.append('Password', password);
25+
form.append('__RequestVerificationToken', requestVerificationToken);
26+
27+
const response = await axios(`${url}`, {
28+
method: 'POST',
29+
data: form,
30+
params,
31+
headers: {
32+
Cookie: cookie,
33+
'Content-Type': 'application/x-www-form-urlencoded',
34+
},
35+
maxRedirects: 0,
36+
});
37+
} catch (e) {
38+
const error = e as AxiosError;
39+
if (error.response && error.response.status === 302) {
40+
const cookies = error.response?.headers['set-cookie'] || [];
41+
cookieString = cookies.reduce((acc, it) => `${acc}${it};`, '') || '';
42+
} else {
43+
throw new Error('Wrong response getSessionCookie');
44+
}
45+
} finally {
46+
if (cookieString.length === 0) throw new Error('Wrong cookies getSessionCookie');
47+
48+
return { cookie: cookieString };
49+
}
50+
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import axios, { AxiosResponse } from 'axios';
2+
3+
export const getSwaggerJson = async ({ url, apiToken }: { url: string; apiToken: string }): Promise<AxiosResponse> => {
4+
const response = await axios(url, {
5+
method: 'GET',
6+
headers: {
7+
Cookie: `apiKey=${apiToken}`,
8+
},
9+
maxRedirects: 0,
10+
});
11+
return response;
12+
};

0 commit comments

Comments
 (0)