1 |
|
2 | "use strict";
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 | Object.defineProperty(exports, "__esModule", { value: true });
|
19 | exports.ProjectManagementRequestHandler = exports.assertServerResponse = void 0;
|
20 | var api_request_1 = require("../utils/api-request");
|
21 | var error_1 = require("../utils/error");
|
22 | var index_1 = require("../utils/index");
|
23 | var validator = require("../utils/validator");
|
24 |
|
25 | var PROJECT_MANAGEMENT_HOST_AND_PORT = 'firebase.googleapis.com:443';
|
26 |
|
27 | var PROJECT_MANAGEMENT_PATH = '/v1/';
|
28 |
|
29 | var PROJECT_MANAGEMENT_BETA_PATH = '/v1beta1/';
|
30 |
|
31 | var PROJECT_MANAGEMENT_HEADERS = {
|
32 | 'X-Client-Version': "Node/Admin/" + index_1.getSdkVersion(),
|
33 | };
|
34 |
|
35 | var PROJECT_MANAGEMENT_TIMEOUT_MILLIS = 10000;
|
36 | var LIST_APPS_MAX_PAGE_SIZE = 100;
|
37 | var CERT_TYPE_API_MAP = {
|
38 | sha1: 'SHA_1',
|
39 | sha256: 'SHA_256',
|
40 | };
|
41 | function assertServerResponse(condition, responseData, message) {
|
42 | if (!condition) {
|
43 | throw new error_1.FirebaseProjectManagementError('invalid-server-response', message + " Response data: " + JSON.stringify(responseData, null, 2));
|
44 | }
|
45 | }
|
46 | exports.assertServerResponse = assertServerResponse;
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 | var ProjectManagementRequestHandler = (function () {
|
54 | |
55 |
|
56 |
|
57 |
|
58 | function ProjectManagementRequestHandler(app) {
|
59 | this.baseUrl = "https://" + PROJECT_MANAGEMENT_HOST_AND_PORT + PROJECT_MANAGEMENT_PATH;
|
60 | this.baseBetaUrl = "https://" + PROJECT_MANAGEMENT_HOST_AND_PORT + PROJECT_MANAGEMENT_BETA_PATH;
|
61 | this.httpClient = new api_request_1.AuthorizedHttpClient(app);
|
62 | }
|
63 | ProjectManagementRequestHandler.wrapAndRethrowHttpError = function (errStatusCode, errText) {
|
64 | var errorCode;
|
65 | var errorMessage;
|
66 | switch (errStatusCode) {
|
67 | case 400:
|
68 | errorCode = 'invalid-argument';
|
69 | errorMessage = 'Invalid argument provided.';
|
70 | break;
|
71 | case 401:
|
72 | case 403:
|
73 | errorCode = 'authentication-error';
|
74 | errorMessage = 'An error occurred when trying to authenticate. Make sure the credential '
|
75 | + 'used to authenticate this SDK has the proper permissions. See '
|
76 | + 'https://firebase.google.com/docs/admin/setup for setup instructions.';
|
77 | break;
|
78 | case 404:
|
79 | errorCode = 'not-found';
|
80 | errorMessage = 'The specified entity could not be found.';
|
81 | break;
|
82 | case 409:
|
83 | errorCode = 'already-exists';
|
84 | errorMessage = 'The specified entity already exists.';
|
85 | break;
|
86 | case 500:
|
87 | errorCode = 'internal-error';
|
88 | errorMessage = 'An internal error has occurred. Please retry the request.';
|
89 | break;
|
90 | case 503:
|
91 | errorCode = 'service-unavailable';
|
92 | errorMessage = 'The server could not process the request in time. See the error '
|
93 | + 'documentation for more details.';
|
94 | break;
|
95 | default:
|
96 | errorCode = 'unknown-error';
|
97 | errorMessage = 'An unknown server error was returned.';
|
98 | }
|
99 | if (!errText) {
|
100 | errText = '<missing>';
|
101 | }
|
102 | throw new error_1.FirebaseProjectManagementError(errorCode, errorMessage + " Status code: " + errStatusCode + ". Raw server response: \"" + errText + "\".");
|
103 | };
|
104 | |
105 |
|
106 |
|
107 |
|
108 | ProjectManagementRequestHandler.prototype.listAndroidApps = function (parentResourceName) {
|
109 | return this.invokeRequestHandler('GET', parentResourceName + "/androidApps?page_size=" + LIST_APPS_MAX_PAGE_SIZE,
|
110 | null, 'v1beta1');
|
111 | };
|
112 | |
113 |
|
114 |
|
115 |
|
116 | ProjectManagementRequestHandler.prototype.listIosApps = function (parentResourceName) {
|
117 | return this.invokeRequestHandler('GET', parentResourceName + "/iosApps?page_size=" + LIST_APPS_MAX_PAGE_SIZE,
|
118 | null, 'v1beta1');
|
119 | };
|
120 | |
121 |
|
122 |
|
123 |
|
124 | ProjectManagementRequestHandler.prototype.listAppMetadata = function (parentResourceName) {
|
125 | return this.invokeRequestHandler('GET', parentResourceName + ":searchApps?page_size=" + LIST_APPS_MAX_PAGE_SIZE,
|
126 | null, 'v1beta1');
|
127 | };
|
128 | |
129 |
|
130 |
|
131 |
|
132 | ProjectManagementRequestHandler.prototype.createAndroidApp = function (parentResourceName, packageName, displayName) {
|
133 | var _this = this;
|
134 | var requestData = {
|
135 | packageName: packageName,
|
136 | };
|
137 | if (validator.isNonEmptyString(displayName)) {
|
138 | requestData.displayName = displayName;
|
139 | }
|
140 | return this
|
141 | .invokeRequestHandler('POST', parentResourceName + "/androidApps", requestData, 'v1beta1')
|
142 | .then(function (responseData) {
|
143 | assertServerResponse(validator.isNonNullObject(responseData), responseData, 'createAndroidApp\'s responseData must be a non-null object.');
|
144 | assertServerResponse(validator.isNonEmptyString(responseData.name), responseData, 'createAndroidApp\'s responseData.name must be a non-empty string.');
|
145 | return _this.pollRemoteOperationWithExponentialBackoff(responseData.name);
|
146 | });
|
147 | };
|
148 | |
149 |
|
150 |
|
151 |
|
152 | ProjectManagementRequestHandler.prototype.createIosApp = function (parentResourceName, bundleId, displayName) {
|
153 | var _this = this;
|
154 | var requestData = {
|
155 | bundleId: bundleId,
|
156 | };
|
157 | if (validator.isNonEmptyString(displayName)) {
|
158 | requestData.displayName = displayName;
|
159 | }
|
160 | return this
|
161 | .invokeRequestHandler('POST', parentResourceName + "/iosApps", requestData, 'v1beta1')
|
162 | .then(function (responseData) {
|
163 | assertServerResponse(validator.isNonNullObject(responseData), responseData, 'createIosApp\'s responseData must be a non-null object.');
|
164 | assertServerResponse(validator.isNonEmptyString(responseData.name), responseData, 'createIosApp\'s responseData.name must be a non-empty string.');
|
165 | return _this.pollRemoteOperationWithExponentialBackoff(responseData.name);
|
166 | });
|
167 | };
|
168 | |
169 |
|
170 |
|
171 |
|
172 | ProjectManagementRequestHandler.prototype.setDisplayName = function (resourceName, newDisplayName) {
|
173 | var requestData = {
|
174 | displayName: newDisplayName,
|
175 | };
|
176 | return this
|
177 | .invokeRequestHandler('PATCH', resourceName + "?update_mask=display_name", requestData, 'v1beta1')
|
178 | .then(function () { return undefined; });
|
179 | };
|
180 | |
181 |
|
182 |
|
183 |
|
184 | ProjectManagementRequestHandler.prototype.getAndroidShaCertificates = function (parentResourceName) {
|
185 | return this.invokeRequestHandler('GET', parentResourceName + "/sha", null, 'v1beta1');
|
186 | };
|
187 | |
188 |
|
189 |
|
190 |
|
191 | ProjectManagementRequestHandler.prototype.addAndroidShaCertificate = function (parentResourceName, certificate) {
|
192 | var requestData = {
|
193 | shaHash: certificate.shaHash,
|
194 | certType: CERT_TYPE_API_MAP[certificate.certType],
|
195 | };
|
196 | return this
|
197 | .invokeRequestHandler('POST', parentResourceName + "/sha", requestData, 'v1beta1')
|
198 | .then(function () { return undefined; });
|
199 | };
|
200 | |
201 |
|
202 |
|
203 |
|
204 | ProjectManagementRequestHandler.prototype.getConfig = function (parentResourceName) {
|
205 | return this.invokeRequestHandler('GET', parentResourceName + "/config", null, 'v1beta1');
|
206 | };
|
207 | |
208 |
|
209 |
|
210 |
|
211 | ProjectManagementRequestHandler.prototype.getResource = function (parentResourceName) {
|
212 | return this.invokeRequestHandler('GET', parentResourceName, null, 'v1beta1');
|
213 | };
|
214 | |
215 |
|
216 |
|
217 |
|
218 | ProjectManagementRequestHandler.prototype.deleteResource = function (resourceName) {
|
219 | return this
|
220 | .invokeRequestHandler('DELETE', resourceName, null, 'v1beta1')
|
221 | .then(function () { return undefined; });
|
222 | };
|
223 | ProjectManagementRequestHandler.prototype.pollRemoteOperationWithExponentialBackoff = function (operationResourceName) {
|
224 | var _this = this;
|
225 | var poller = new api_request_1.ExponentialBackoffPoller();
|
226 | return poller.poll(function () {
|
227 | return _this.invokeRequestHandler('GET', operationResourceName, null)
|
228 | .then(function (responseData) {
|
229 | if (responseData.error) {
|
230 | var errStatusCode = responseData.error.code || 500;
|
231 | var errText = responseData.error.message || JSON.stringify(responseData.error);
|
232 | ProjectManagementRequestHandler.wrapAndRethrowHttpError(errStatusCode, errText);
|
233 | }
|
234 | if (!responseData.done) {
|
235 |
|
236 | return null;
|
237 | }
|
238 |
|
239 | return responseData.response;
|
240 | });
|
241 | });
|
242 | };
|
243 | |
244 |
|
245 |
|
246 | ProjectManagementRequestHandler.prototype.invokeRequestHandler = function (method, path, requestData, apiVersion) {
|
247 | if (apiVersion === void 0) { apiVersion = 'v1'; }
|
248 | var baseUrlToUse = (apiVersion === 'v1') ? this.baseUrl : this.baseBetaUrl;
|
249 | var request = {
|
250 | method: method,
|
251 | url: "" + baseUrlToUse + path,
|
252 | headers: PROJECT_MANAGEMENT_HEADERS,
|
253 | data: requestData,
|
254 | timeout: PROJECT_MANAGEMENT_TIMEOUT_MILLIS,
|
255 | };
|
256 | return this.httpClient.send(request)
|
257 | .then(function (response) {
|
258 |
|
259 | if (!response.isJson()) {
|
260 | throw new api_request_1.HttpError(response);
|
261 | }
|
262 | return response.data;
|
263 | })
|
264 | .catch(function (err) {
|
265 | if (err instanceof api_request_1.HttpError) {
|
266 | ProjectManagementRequestHandler.wrapAndRethrowHttpError(err.response.status, err.response.text);
|
267 | }
|
268 | throw err;
|
269 | });
|
270 | };
|
271 | return ProjectManagementRequestHandler;
|
272 | }());
|
273 | exports.ProjectManagementRequestHandler = ProjectManagementRequestHandler;
|