project-management.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /*! firebase-admin v12.1.1 */
  2. "use strict";
  3. /*!
  4. * Copyright 2018 Google Inc.
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. Object.defineProperty(exports, "__esModule", { value: true });
  19. exports.ProjectManagement = void 0;
  20. const error_1 = require("../utils/error");
  21. const utils = require("../utils/index");
  22. const validator = require("../utils/validator");
  23. const android_app_1 = require("./android-app");
  24. const ios_app_1 = require("./ios-app");
  25. const project_management_api_request_internal_1 = require("./project-management-api-request-internal");
  26. const app_metadata_1 = require("./app-metadata");
  27. /**
  28. * The Firebase ProjectManagement service interface.
  29. */
  30. class ProjectManagement {
  31. /**
  32. * @param app - The app for this ProjectManagement service.
  33. * @constructor
  34. * @internal
  35. */
  36. constructor(app) {
  37. this.app = app;
  38. if (!validator.isNonNullObject(app) || !('options' in app)) {
  39. throw new error_1.FirebaseProjectManagementError('invalid-argument', 'First argument passed to admin.projectManagement() must be a valid Firebase app '
  40. + 'instance.');
  41. }
  42. this.requestHandler = new project_management_api_request_internal_1.ProjectManagementRequestHandler(app);
  43. }
  44. /**
  45. * Lists up to 100 Firebase Android apps associated with this Firebase project.
  46. *
  47. * @returns The list of Android apps.
  48. */
  49. listAndroidApps() {
  50. return this.listPlatformApps('android', 'listAndroidApps()');
  51. }
  52. /**
  53. * Lists up to 100 Firebase iOS apps associated with this Firebase project.
  54. *
  55. * @returns The list of iOS apps.
  56. */
  57. listIosApps() {
  58. return this.listPlatformApps('ios', 'listIosApps()');
  59. }
  60. /**
  61. * Creates an `AndroidApp` object, referencing the specified Android app within
  62. * this Firebase project.
  63. *
  64. * This method does not perform an RPC.
  65. *
  66. * @param appId - The `appId` of the Android app to reference.
  67. *
  68. * @returns An `AndroidApp` object that references the specified Firebase Android app.
  69. */
  70. androidApp(appId) {
  71. return new android_app_1.AndroidApp(appId, this.requestHandler);
  72. }
  73. /**
  74. * Creates an `iOSApp` object, referencing the specified iOS app within
  75. * this Firebase project.
  76. *
  77. * This method does not perform an RPC.
  78. *
  79. * @param appId - The `appId` of the iOS app to reference.
  80. *
  81. * @returns An `iOSApp` object that references the specified Firebase iOS app.
  82. */
  83. iosApp(appId) {
  84. return new ios_app_1.IosApp(appId, this.requestHandler);
  85. }
  86. /**
  87. * Creates a `ShaCertificate` object.
  88. *
  89. * This method does not perform an RPC.
  90. *
  91. * @param shaHash - The SHA-1 or SHA-256 hash for this certificate.
  92. *
  93. * @returns A `ShaCertificate` object contains the specified SHA hash.
  94. */
  95. shaCertificate(shaHash) {
  96. return new android_app_1.ShaCertificate(shaHash);
  97. }
  98. /**
  99. * Creates a new Firebase Android app associated with this Firebase project.
  100. *
  101. * @param packageName - The canonical package name of the Android App,
  102. * as would appear in the Google Play Developer Console.
  103. * @param displayName - An optional user-assigned display name for this
  104. * new app.
  105. *
  106. * @returns A promise that resolves to the newly created Android app.
  107. */
  108. createAndroidApp(packageName, displayName) {
  109. return this.getResourceName()
  110. .then((resourceName) => {
  111. return this.requestHandler.createAndroidApp(resourceName, packageName, displayName);
  112. })
  113. .then((responseData) => {
  114. (0, project_management_api_request_internal_1.assertServerResponse)(validator.isNonNullObject(responseData), responseData, 'createAndroidApp()\'s responseData must be a non-null object.');
  115. (0, project_management_api_request_internal_1.assertServerResponse)(validator.isNonEmptyString(responseData.appId), responseData, '"responseData.appId" field must be present in createAndroidApp()\'s response data.');
  116. return new android_app_1.AndroidApp(responseData.appId, this.requestHandler);
  117. });
  118. }
  119. /**
  120. * Creates a new Firebase iOS app associated with this Firebase project.
  121. *
  122. * @param bundleId - The iOS app bundle ID to use for this new app.
  123. * @param displayName - An optional user-assigned display name for this
  124. * new app.
  125. *
  126. * @returns A promise that resolves to the newly created iOS app.
  127. */
  128. createIosApp(bundleId, displayName) {
  129. return this.getResourceName()
  130. .then((resourceName) => {
  131. return this.requestHandler.createIosApp(resourceName, bundleId, displayName);
  132. })
  133. .then((responseData) => {
  134. (0, project_management_api_request_internal_1.assertServerResponse)(validator.isNonNullObject(responseData), responseData, 'createIosApp()\'s responseData must be a non-null object.');
  135. (0, project_management_api_request_internal_1.assertServerResponse)(validator.isNonEmptyString(responseData.appId), responseData, '"responseData.appId" field must be present in createIosApp()\'s response data.');
  136. return new ios_app_1.IosApp(responseData.appId, this.requestHandler);
  137. });
  138. }
  139. /**
  140. * Lists up to 100 Firebase apps associated with this Firebase project.
  141. *
  142. * @returns A promise that resolves to the metadata list of the apps.
  143. */
  144. listAppMetadata() {
  145. return this.getResourceName()
  146. .then((resourceName) => {
  147. return this.requestHandler.listAppMetadata(resourceName);
  148. })
  149. .then((responseData) => {
  150. return this.getProjectId()
  151. .then((projectId) => {
  152. return this.transformResponseToAppMetadata(responseData, projectId);
  153. });
  154. });
  155. }
  156. /**
  157. * Update the display name of this Firebase project.
  158. *
  159. * @param newDisplayName - The new display name to be updated.
  160. *
  161. * @returns A promise that resolves when the project display name has been updated.
  162. */
  163. setDisplayName(newDisplayName) {
  164. return this.getResourceName()
  165. .then((resourceName) => {
  166. return this.requestHandler.setDisplayName(resourceName, newDisplayName);
  167. });
  168. }
  169. transformResponseToAppMetadata(responseData, projectId) {
  170. this.assertListAppsResponseData(responseData, 'listAppMetadata()');
  171. if (!responseData.apps) {
  172. return [];
  173. }
  174. return responseData.apps.map((appJson) => {
  175. (0, project_management_api_request_internal_1.assertServerResponse)(validator.isNonEmptyString(appJson.appId), responseData, '"apps[].appId" field must be present in the listAppMetadata() response data.');
  176. (0, project_management_api_request_internal_1.assertServerResponse)(validator.isNonEmptyString(appJson.platform), responseData, '"apps[].platform" field must be present in the listAppMetadata() response data.');
  177. const metadata = {
  178. appId: appJson.appId,
  179. platform: app_metadata_1.AppPlatform[appJson.platform] || app_metadata_1.AppPlatform.PLATFORM_UNKNOWN,
  180. projectId,
  181. resourceName: appJson.name,
  182. };
  183. if (appJson.displayName) {
  184. metadata.displayName = appJson.displayName;
  185. }
  186. return metadata;
  187. });
  188. }
  189. getResourceName() {
  190. return this.getProjectId()
  191. .then((projectId) => {
  192. return `projects/${projectId}`;
  193. });
  194. }
  195. getProjectId() {
  196. if (this.projectId) {
  197. return Promise.resolve(this.projectId);
  198. }
  199. return utils.findProjectId(this.app)
  200. .then((projectId) => {
  201. // Assert that a specific project ID was provided within the app.
  202. if (!validator.isNonEmptyString(projectId)) {
  203. throw new error_1.FirebaseProjectManagementError('invalid-project-id', 'Failed to determine project ID. Initialize the SDK with service account credentials, or '
  204. + 'set project ID as an app option. Alternatively, set the GOOGLE_CLOUD_PROJECT '
  205. + 'environment variable.');
  206. }
  207. this.projectId = projectId;
  208. return this.projectId;
  209. });
  210. }
  211. /**
  212. * Lists up to 100 Firebase apps for a specified platform, associated with this Firebase project.
  213. */
  214. listPlatformApps(platform, callerName) {
  215. return this.getResourceName()
  216. .then((resourceName) => {
  217. return (platform === 'android') ?
  218. this.requestHandler.listAndroidApps(resourceName)
  219. : this.requestHandler.listIosApps(resourceName);
  220. })
  221. .then((responseData) => {
  222. this.assertListAppsResponseData(responseData, callerName);
  223. if (!responseData.apps) {
  224. return [];
  225. }
  226. return responseData.apps.map((appJson) => {
  227. (0, project_management_api_request_internal_1.assertServerResponse)(validator.isNonEmptyString(appJson.appId), responseData, `"apps[].appId" field must be present in the ${callerName} response data.`);
  228. if (platform === 'android') {
  229. return new android_app_1.AndroidApp(appJson.appId, this.requestHandler);
  230. }
  231. else {
  232. return new ios_app_1.IosApp(appJson.appId, this.requestHandler);
  233. }
  234. });
  235. });
  236. }
  237. assertListAppsResponseData(responseData, callerName) {
  238. (0, project_management_api_request_internal_1.assertServerResponse)(validator.isNonNullObject(responseData), responseData, `${callerName}'s responseData must be a non-null object.`);
  239. if (responseData.apps) {
  240. (0, project_management_api_request_internal_1.assertServerResponse)(validator.isArray(responseData.apps), responseData, `"apps" field must be present in the ${callerName} response data.`);
  241. }
  242. }
  243. }
  244. exports.ProjectManagement = ProjectManagement;