Skip to content

Commit 9e11e18

Browse files
authored
Pass resourceName through to ProjectManagementRequestHandler. (#400)
Uses `resourceName` instead of `appId`. This is essentially a no-op change, but it sets a better example of how to use Firebase's public API.
1 parent f3486ce commit 9e11e18

File tree

7 files changed

+182
-231
lines changed

7 files changed

+182
-231
lines changed

src/project-management/android-app.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,21 @@ import * as validator from '../utils/validator';
1919
import { ProjectManagementRequestHandler, assertServerResponse } from './project-management-api-request';
2020

2121
export class AndroidApp {
22+
private readonly resourceName: string;
23+
2224
constructor(
2325
public readonly appId: string,
2426
private readonly requestHandler: ProjectManagementRequestHandler) {
2527
if (!validator.isNonEmptyString(appId)) {
2628
throw new FirebaseProjectManagementError(
2729
'invalid-argument', 'appId must be a non-empty string.');
2830
}
31+
32+
this.resourceName = `projects/-/androidApps/${appId}`;
2933
}
3034

3135
public getMetadata(): Promise<AndroidAppMetadata> {
32-
return this.requestHandler.getAndroidMetadata(this.appId)
36+
return this.requestHandler.getResource(this.resourceName)
3337
.then((responseData: any) => {
3438
assertServerResponse(
3539
validator.isNonNullObject(responseData),
@@ -56,11 +60,11 @@ export class AndroidApp {
5660
}
5761

5862
public setDisplayName(newDisplayName: string): Promise<void> {
59-
return this.requestHandler.setAndroidDisplayName(this.appId, newDisplayName);
63+
return this.requestHandler.setDisplayName(this.resourceName, newDisplayName);
6064
}
6165

6266
public getShaCertificates(): Promise<ShaCertificate[]> {
63-
return this.requestHandler.getAndroidShaCertificates(this.appId)
67+
return this.requestHandler.getAndroidShaCertificates(this.resourceName)
6468
.then((responseData: any) => {
6569
assertServerResponse(
6670
validator.isNonNullObject(responseData),
@@ -93,19 +97,19 @@ export class AndroidApp {
9397
}
9498

9599
public addShaCertificate(certificateToAdd: ShaCertificate): Promise<void> {
96-
return this.requestHandler.addAndroidShaCertificate(this.appId, certificateToAdd);
100+
return this.requestHandler.addAndroidShaCertificate(this.resourceName, certificateToAdd);
97101
}
98102

99103
public deleteShaCertificate(certificateToDelete: ShaCertificate): Promise<void> {
100-
return this.requestHandler.deleteAndroidShaCertificate(certificateToDelete);
104+
return this.requestHandler.deleteResource(certificateToDelete.resourceName);
101105
}
102106

103107
/**
104108
* @return {Promise<string>} A promise that resolves to a UTF-8 JSON string, typically intended to
105109
* be written to a JSON file.
106110
*/
107111
public getConfig(): Promise<string> {
108-
return this.requestHandler.getAndroidConfig(this.appId)
112+
return this.requestHandler.getConfig(this.resourceName)
109113
.then((responseData: any) => {
110114
assertServerResponse(
111115
validator.isNonNullObject(responseData),

src/project-management/ios-app.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,21 @@ import * as validator from '../utils/validator';
1919
import { ProjectManagementRequestHandler, assertServerResponse } from './project-management-api-request';
2020

2121
export class IosApp {
22+
private readonly resourceName: string;
23+
2224
constructor(
2325
public readonly appId: string,
2426
private readonly requestHandler: ProjectManagementRequestHandler) {
2527
if (!validator.isNonEmptyString(appId)) {
2628
throw new FirebaseProjectManagementError(
2729
'invalid-argument', 'appId must be a non-empty string.');
2830
}
31+
32+
this.resourceName = `projects/-/iosApps/${appId}`;
2933
}
3034

3135
public getMetadata(): Promise<IosAppMetadata> {
32-
return this.requestHandler.getIosMetadata(this.appId)
36+
return this.requestHandler.getResource(this.resourceName)
3337
.then((responseData: any) => {
3438
assertServerResponse(
3539
validator.isNonNullObject(responseData),
@@ -56,15 +60,15 @@ export class IosApp {
5660
}
5761

5862
public setDisplayName(newDisplayName: string): Promise<void> {
59-
return this.requestHandler.setIosDisplayName(this.appId, newDisplayName);
63+
return this.requestHandler.setDisplayName(this.resourceName, newDisplayName);
6064
}
6165

6266
/**
6367
* @return {Promise<string>} A promise that resolves to a UTF-8 XML string, typically intended to
6468
* be written to a plist file.
6569
*/
6670
public getConfig(): Promise<string> {
67-
return this.requestHandler.getIosConfig(this.appId)
71+
return this.requestHandler.getConfig(this.resourceName)
6872
.then((responseData: any) => {
6973
assertServerResponse(
7074
validator.isNonNullObject(responseData),

src/project-management/project-management-api-request.ts

Lines changed: 64 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -115,32 +115,44 @@ export class ProjectManagementRequestHandler {
115115
this.httpClient = new AuthorizedHttpClient(app);
116116
}
117117

118-
public listAndroidApps(projectId: string): Promise<object> {
118+
/**
119+
* @param {string} parentResourceName Fully-qualified resource name of the project whose Android
120+
* apps you want to list.
121+
*/
122+
public listAndroidApps(parentResourceName: string): Promise<object> {
119123
return this.invokeRequestHandler(
120124
'GET',
121-
`projects/${projectId}/androidApps?page_size=${LIST_APPS_MAX_PAGE_SIZE}`,
125+
`${parentResourceName}/androidApps?page_size=${LIST_APPS_MAX_PAGE_SIZE}`,
122126
/* requestData */ null,
123127
'v1beta1');
124128
}
125129

126-
public listIosApps(projectId: string): Promise<object> {
130+
/**
131+
* @param {string} parentResourceName Fully-qualified resource name of the project whose iOS apps
132+
* you want to list.
133+
*/
134+
public listIosApps(parentResourceName: string): Promise<object> {
127135
return this.invokeRequestHandler(
128136
'GET',
129-
`projects/${projectId}/iosApps?page_size=${LIST_APPS_MAX_PAGE_SIZE}`,
137+
`${parentResourceName}/iosApps?page_size=${LIST_APPS_MAX_PAGE_SIZE}`,
130138
/* requestData */ null,
131139
'v1beta1');
132140
}
133141

142+
/**
143+
* @param {string} parentResourceName Fully-qualified resource name of the project that you want
144+
* to create the Android app within.
145+
*/
134146
public createAndroidApp(
135-
projectId: string, packageName: string, displayName?: string): Promise<object> {
147+
parentResourceName: string, packageName: string, displayName?: string): Promise<object> {
136148
const requestData: any = {
137149
packageName,
138150
};
139151
if (validator.isNonEmptyString(displayName)) {
140152
requestData.displayName = displayName;
141153
}
142154
return this
143-
.invokeRequestHandler('POST', `projects/${projectId}/androidApps`, requestData, 'v1beta1')
155+
.invokeRequestHandler('POST', `${parentResourceName}/androidApps`, requestData, 'v1beta1')
144156
.then((responseData: any) => {
145157
assertServerResponse(
146158
validator.isNonNullObject(responseData),
@@ -154,16 +166,20 @@ export class ProjectManagementRequestHandler {
154166
});
155167
}
156168

169+
/**
170+
* @param {string} parentResourceName Fully-qualified resource name of the project that you want
171+
* to create the iOS app within.
172+
*/
157173
public createIosApp(
158-
projectId: string, bundleId: string, displayName?: string): Promise<object> {
174+
parentResourceName: string, bundleId: string, displayName?: string): Promise<object> {
159175
const requestData: any = {
160176
bundleId,
161177
};
162178
if (validator.isNonEmptyString(displayName)) {
163179
requestData.displayName = displayName;
164180
}
165181
return this
166-
.invokeRequestHandler('POST', `projects/${projectId}/iosApps`, requestData, 'v1beta1')
182+
.invokeRequestHandler('POST', `${parentResourceName}/iosApps`, requestData, 'v1beta1')
167183
.then((responseData: any) => {
168184
assertServerResponse(
169185
validator.isNonNullObject(responseData),
@@ -177,69 +193,69 @@ export class ProjectManagementRequestHandler {
177193
});
178194
}
179195

180-
public getAndroidMetadata(appId: string): Promise<object> {
181-
return this.invokeRequestHandler(
182-
'GET', `projects/-/androidApps/${appId}`, /* requestData */ null, 'v1beta1');
183-
}
184-
185-
public getIosMetadata(appId: string): Promise<object> {
186-
return this.invokeRequestHandler(
187-
'GET', `projects/-/iosApps/${appId}`, /* requestData */ null, 'v1beta1');
188-
}
189-
190-
public setAndroidDisplayName(appId: string, newDisplayName: string): Promise<void> {
191-
const requestData = {
192-
displayName: newDisplayName,
193-
};
194-
return this
195-
.invokeRequestHandler(
196-
'PATCH',
197-
`projects/-/androidApps/${appId}?update_mask=display_name`,
198-
requestData,
199-
'v1beta1')
200-
.then(() => null);
201-
}
202-
203-
public setIosDisplayName(appId: string, newDisplayName: string): Promise<void> {
196+
/**
197+
* @param {string} resourceName Fully-qualified resource name of the entity whose display name you
198+
* want to set.
199+
*/
200+
public setDisplayName(resourceName: string, newDisplayName: string): Promise<void> {
204201
const requestData = {
205202
displayName: newDisplayName,
206203
};
207204
return this
208205
.invokeRequestHandler(
209-
'PATCH', `projects/-/iosApps/${appId}?update_mask=display_name`, requestData, 'v1beta1')
206+
'PATCH', `${resourceName}?update_mask=display_name`, requestData, 'v1beta1')
210207
.then(() => null);
211208
}
212209

213-
public getAndroidShaCertificates(appId: string): Promise<object> {
210+
/**
211+
* @param {string} parentResourceName Fully-qualified resource name of the Android app whose SHA
212+
* certificates you want to get.
213+
*/
214+
public getAndroidShaCertificates(parentResourceName: string): Promise<object> {
214215
return this.invokeRequestHandler(
215-
'GET', `projects/-/androidApps/${appId}/sha`, /* requestData */ null, 'v1beta1');
216+
'GET', `${parentResourceName}/sha`, /* requestData */ null, 'v1beta1');
216217
}
217218

218-
public addAndroidShaCertificate(appId: string, certificate: ShaCertificate): Promise<void> {
219+
/**
220+
* @param {string} parentResourceName Fully-qualified resource name of the Android app that you
221+
* want to add the given SHA certificate to.
222+
*/
223+
public addAndroidShaCertificate(
224+
parentResourceName: string, certificate: ShaCertificate): Promise<void> {
219225
const requestData = {
220226
shaHash: certificate.shaHash,
221227
certType: CERT_TYPE_API_MAP[certificate.certType],
222228
};
223229
return this
224-
.invokeRequestHandler('POST', `projects/-/androidApps/${appId}/sha`, requestData, 'v1beta1')
230+
.invokeRequestHandler('POST', `${parentResourceName}/sha`, requestData, 'v1beta1')
225231
.then(() => null);
226232
}
227233

228-
public deleteAndroidShaCertificate(certificateToDelete: ShaCertificate): Promise<void> {
229-
return this
230-
.invokeRequestHandler(
231-
'DELETE', certificateToDelete.resourceName, /* requestData */ null, 'v1beta1')
232-
.then(() => null);
234+
/**
235+
* @param {string} parentResourceName Fully-qualified resource name of the app whose config you
236+
* want to get.
237+
*/
238+
public getConfig(parentResourceName: string): Promise<object> {
239+
return this.invokeRequestHandler(
240+
'GET', `${parentResourceName}/config`, /* requestData */ null, 'v1beta1');
233241
}
234242

235-
public getAndroidConfig(appId: string): Promise<object> {
236-
return this.invokeRequestHandler(
237-
'GET', `projects/-/androidApps/${appId}/config`, /* requestData */ null, 'v1beta1');
243+
/**
244+
* @param {string} parentResourceName Fully-qualified resource name of the entity that you want to
245+
* get.
246+
*/
247+
public getResource(parentResourceName: string): Promise<object> {
248+
return this.invokeRequestHandler('GET', parentResourceName, /* requestData */ null, 'v1beta1');
238249
}
239250

240-
public getIosConfig(appId: string): Promise<object> {
241-
return this.invokeRequestHandler(
242-
'GET', `projects/-/iosApps/${appId}/config`, /* requestData */ null, 'v1beta1');
251+
/**
252+
* @param {string} resourceName Fully-qualified resource name of the entity that you want to
253+
* delete.
254+
*/
255+
public deleteResource(resourceName: string): Promise<void> {
256+
return this
257+
.invokeRequestHandler('DELETE', resourceName, /* requestData */ null, 'v1beta1')
258+
.then(() => null);
243259
}
244260

245261
private pollRemoteOperationWithExponentialBackoff(

src/project-management/project-management.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class ProjectManagementInternals implements FirebaseServiceInternalsInterface {
4444
export class ProjectManagement implements FirebaseServiceInterface {
4545
public readonly INTERNAL: ProjectManagementInternals = new ProjectManagementInternals();
4646

47+
private readonly resourceName: string;
4748
private readonly projectId: string;
4849
private readonly requestHandler: ProjectManagementRequestHandler;
4950

@@ -68,6 +69,7 @@ export class ProjectManagement implements FirebaseServiceInterface {
6869
+ 'set project ID as an app option. Alternatively, set the GOOGLE_CLOUD_PROJECT '
6970
+ 'environment variable.');
7071
}
72+
this.resourceName = `projects/${this.projectId}`;
7173

7274
this.requestHandler = new ProjectManagementRequestHandler(app);
7375
}
@@ -104,7 +106,7 @@ export class ProjectManagement implements FirebaseServiceInterface {
104106
* Creates a new Firebase Android app, associated with this Firebase project.
105107
*/
106108
public createAndroidApp(packageName: string, displayName?: string): Promise<AndroidApp> {
107-
return this.requestHandler.createAndroidApp(this.projectId, packageName, displayName)
109+
return this.requestHandler.createAndroidApp(this.resourceName, packageName, displayName)
108110
.then((responseData: any) => {
109111
assertServerResponse(
110112
validator.isNonNullObject(responseData),
@@ -123,7 +125,7 @@ export class ProjectManagement implements FirebaseServiceInterface {
123125
* Creates a new Firebase iOS app, associated with this Firebase project.
124126
*/
125127
public createIosApp(bundleId: string, displayName?: string): Promise<IosApp> {
126-
return this.requestHandler.createIosApp(this.projectId, bundleId, displayName)
128+
return this.requestHandler.createIosApp(this.resourceName, bundleId, displayName)
127129
.then((responseData: any) => {
128130
assertServerResponse(
129131
validator.isNonNullObject(responseData),
@@ -143,8 +145,8 @@ export class ProjectManagement implements FirebaseServiceInterface {
143145
*/
144146
private listPlatformApps<T>(platform: 'android' | 'ios', callerName: string): Promise<T[]> {
145147
const listPromise: Promise<object> = (platform === 'android') ?
146-
this.requestHandler.listAndroidApps(this.projectId)
147-
: this.requestHandler.listIosApps(this.projectId);
148+
this.requestHandler.listAndroidApps(this.resourceName)
149+
: this.requestHandler.listIosApps(this.resourceName);
148150

149151
return listPromise
150152
.then((responseData: any) => {

0 commit comments

Comments
 (0)