Completed
Push — master ( e4da3f...33c5b3 )
by Jean
49s
created

api.js ➔ ... ➔ ???   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 3
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
1
/**
2
 * @file Module 'codingame/api'
3
 * @author woshilapin <[email protected]>
4
 */
5
/**
6
 * API for Codingame's services
7
 * @module codingame/api
8
 */
9
import request from 'request';
10
11
import cgparse from './parse.js';
12
import CodingameError from './error.js';
13
14
/**
15
 * Codingame's API to log in
16
 *
17
 * @name login
18
 * @function
19
 * @param {string} username - The login to authenticate
20
 * @param {string} password - The password to authenticate
21
 * @returns {Promise<Object>} Body of the response
22
 * @memberof module:codingame/api
23
 * @instance
24
 */
25
let login = (username, password) => {
26
	return new Promise((resolve, reject) => {
27
		let options = {
28
			"method": `POST`,
29
			"baseUrl": `https://www.codingame.com`,
30
			"uri": `/services/CodingamerRemoteService/loginSiteV2`,
31
			"headers": {
32
				"Accept": `application/json`,
33
				"Content-Type": `application/json;charset=utf-8`
34
			},
35
			"body": [username, password, true],
36
			"jar": true,
37
			"json": true
38
		};
39
		request(options, (error, response, body) => {
40
			if (response.statusCode >= 400) {
41
				reject(error);
42
			} else {
43
				resolve(body);
44
			}
45
		});
46
	});
47
};
48
49
/**
50
 * Codingame's API for launching a test
51
 *
52
 * @name test
53
 * @function
54
 * @param {string} exercise - Hash of the exercise to test
55
 * @param {number} test - Test's number
56
 * @param {string} language - Language of the program to send
57
 * @param {string} bundle - Content of the program to send
58
 * @returns {Promise<Object>} The result only if request succeed and test passed
59
 * @memberof module:codingame/api
60
 * @instance
61
 */
62
let test = (exercise, test, language, bundle) => {
63
	return new Promise((resolve, reject) => {
64
		let options = {
65
			"method": `POST`,
66
			"baseUrl": `https://www.codingame.com`,
67
			"uri": `/services/TestSessionRemoteService/play`,
68
			"headers": {
69
				"Accept": `application/json`,
70
				"Content-Type": `application/json;charset=utf-8`
71
			},
72
			"body": [
73
				exercise,
74
				{
75
					"code": bundle,
76
					"programmingLanguageId": language,
77
					"multipleLanguages": {
78
						"testIndex": test
79
					}
80
				}
81
			],
82
			"jar": true,
83
			"json": true
84
		};
85
		request(options, (error, response, body) => {
86
			if (response.statusCode >= 400) {
87
				reject(error);
88
			} else {
89
				let meta = {
90
					"exercise": exercise,
91
					"test": test,
92
					"language": language,
93
					"bundle": bundle
94
				};
95
				cgparse.parse(body)
96
					.then((success) => {
0 ignored issues
show
Unused Code introduced by
The parameter success is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
97
						resolve(meta);
98
					}, (error) => {
99
						if (error instanceof CodingameError) {
100
							error.attach(meta);
101
						}
102
						reject(error);
103
					});
104
			}
105
		});
106
	});
107
};
108
109
export default {
110
	"login": login,
111
	"test": test
112
};
113