Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions etc/firebase-admin.remote-config.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -199,15 +199,23 @@ export class RemoteConfig {
// (undocumented)
readonly app: App;
createTemplateFromJSON(json: string): RemoteConfigTemplate;
getServerConfigTemplate(): Promise<RemoteConfigTemplate>;
getServerConfigTemplateAtVersion(versionNumber: number | string): Promise<RemoteConfigTemplate>;
getServerTemplate(options?: GetServerTemplateOptions): Promise<ServerTemplate>;
getTemplate(): Promise<RemoteConfigTemplate>;
getTemplateAtVersion(versionNumber: number | string): Promise<RemoteConfigTemplate>;
initServerTemplate(options?: InitServerTemplateOptions): ServerTemplate;
listServerConfigVersions(options?: ListVersionsOptions): Promise<ListVersionsResult>;
listVersions(options?: ListVersionsOptions): Promise<ListVersionsResult>;
publishServerConfigTemplate(template: RemoteConfigTemplate, options?: {
force: boolean;
}): Promise<RemoteConfigTemplate>;
publishTemplate(template: RemoteConfigTemplate, options?: {
force: boolean;
}): Promise<RemoteConfigTemplate>;
rollback(versionNumber: number | string): Promise<RemoteConfigTemplate>;
rollbackServerConfigTemplate(versionNumber: number | string): Promise<RemoteConfigTemplate>;
validateServerConfigTemplate(template: RemoteConfigTemplate): Promise<RemoteConfigTemplate>;
validateTemplate(template: RemoteConfigTemplate): Promise<RemoteConfigTemplate>;
}

Expand Down
136 changes: 136 additions & 0 deletions src/remote-config/remote-config-api-client-internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,142 @@ export class RemoteConfigApiClient {
});
}

public getServerConfigTemplate(): Promise<RemoteConfigTemplate> {
return this.getUrl()
.then((url) => {
const request: HttpRequestConfig = {
method: 'GET',
url: `${url}/namespaces/firebase-server/remoteConfig`,
headers: FIREBASE_REMOTE_CONFIG_HEADERS
};
return this.httpClient.send(request);
})
.then((resp) => {
return this.toRemoteConfigTemplate(resp);
})
.catch((err) => {
throw this.toFirebaseError(err);
});
}

public getServerConfigTemplateAtVersion(versionNumber: number | string): Promise<RemoteConfigTemplate> {
const data = { versionNumber: this.validateVersionNumber(versionNumber) };
return this.getUrl()
.then((url) => {
const request: HttpRequestConfig = {
method: 'GET',
url: `${url}/namespaces/firebase-server/remoteConfig`,
headers: FIREBASE_REMOTE_CONFIG_HEADERS,
data
};
return this.httpClient.send(request);
})
.then((resp) => {
return this.toRemoteConfigTemplate(resp);
})
.catch((err) => {
throw this.toFirebaseError(err);
});
}

public validateServerConfigTemplate(template: RemoteConfigTemplate): Promise<RemoteConfigTemplate> {
template = this.validateInputRemoteConfigTemplate(template);
return this.sendServerPutRequest(template, template.etag, true)
.then((resp) => {
this.validateEtag(resp.headers['etag']);
return this.toRemoteConfigTemplate(resp, template.etag);
})
.catch((err) => {
throw this.toFirebaseError(err);
});
}
Comment thread
congminh1254 marked this conversation as resolved.

public publishServerConfigTemplate(
template: RemoteConfigTemplate,
options?: { force: boolean; }
): Promise<RemoteConfigTemplate> {
template = this.validateInputRemoteConfigTemplate(template);
let ifMatch: string = template.etag;
if (options && options.force === true) {
ifMatch = '*';
}
return this.sendServerPutRequest(template, ifMatch)
.then((resp) => {
return this.toRemoteConfigTemplate(resp);
})
.catch((err) => {
throw this.toFirebaseError(err);
});
}
Comment thread
congminh1254 marked this conversation as resolved.

public rollbackServerConfigTemplate(versionNumber: number | string): Promise<RemoteConfigTemplate> {
const data = { versionNumber: this.validateVersionNumber(versionNumber) };
return this.getUrl()
.then((url) => {
const request: HttpRequestConfig = {
method: 'POST',
url: `${url}/namespaces/firebase-server/remoteConfig:rollback`,
headers: FIREBASE_REMOTE_CONFIG_HEADERS,
data
};
return this.httpClient.send(request);
})
.then((resp) => {
return this.toRemoteConfigTemplate(resp);
})
.catch((err) => {
throw this.toFirebaseError(err);
});
}

public listServerConfigVersions(options?: ListVersionsOptions): Promise<ListVersionsResult> {
if (typeof options !== 'undefined') {
options = this.validateListVersionsOptions(options);
}
return this.getUrl()
.then((url) => {
const request: HttpRequestConfig = {
method: 'GET',
url: `${url}/namespaces/firebase-server/remoteConfig:listVersions`,
headers: FIREBASE_REMOTE_CONFIG_HEADERS,
data: options
};
return this.httpClient.send(request);
})
.then((resp) => {
return resp.data;
})
.catch((err) => {
throw this.toFirebaseError(err);
});
}

private sendServerPutRequest(
template: RemoteConfigTemplate,
etag: string,
validateOnly?: boolean
): Promise<RequestResponse> {
let path = 'namespaces/firebase-server/remoteConfig';
if (validateOnly) {
path += '?validate_only=true';
}
return this.getUrl()
.then((url) => {
const request: HttpRequestConfig = {
method: 'PUT',
url: `${url}/${path}`,
headers: { ...FIREBASE_REMOTE_CONFIG_HEADERS, 'If-Match': etag },
data: {
conditions: template.conditions,
parameters: template.parameters,
parameterGroups: template.parameterGroups,
version: template.version,
}
};
return this.httpClient.send(request);
});
}
Comment thread
congminh1254 marked this conversation as resolved.
Outdated

private sendPutRequest(
template: RemoteConfigTemplate,
etag: string,
Expand Down
89 changes: 89 additions & 0 deletions src/remote-config/remote-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,95 @@ export class RemoteConfig {

return template;
}

/**
* Gets the current active version of the server-side {@link RemoteConfigTemplate} of the project.
*
* @returns A promise that fulfills with a `RemoteConfigTemplate`.
*/
public getServerConfigTemplate(): Promise<RemoteConfigTemplate> {
return this.client.getServerConfigTemplate()
.then((templateResponse) => {
return new RemoteConfigTemplateImpl(templateResponse);
});
}

/**
* Gets the requested version of the server-side {@link RemoteConfigTemplate} of the project.
*
* @param versionNumber - Version number of the Remote Config template to look up.
*
* @returns A promise that fulfills with a `RemoteConfigTemplate`.
*/
public getServerConfigTemplateAtVersion(versionNumber: number | string): Promise<RemoteConfigTemplate> {
return this.client.getServerConfigTemplateAtVersion(versionNumber)
.then((templateResponse) => {
return new RemoteConfigTemplateImpl(templateResponse);
});
}

/**
* Validates a server-side {@link RemoteConfigTemplate}.
*
* @param template - The Remote Config template to be validated.
* @returns A promise that fulfills with the validated `RemoteConfigTemplate`.
*/
public validateServerConfigTemplate(template: RemoteConfigTemplate): Promise<RemoteConfigTemplate> {
return this.client.validateServerConfigTemplate(template)
.then((templateResponse) => {
return new RemoteConfigTemplateImpl(templateResponse);
});
}

/**
* Publishes a server-side Remote Config template.
*
* @param template - The Remote Config template to be published.
* @param options - Optional options object when publishing a Remote Config template:
* - `force`: Setting this to `true` forces the Remote Config template to
* be updated and circumvent the ETag.
*
* @returns A Promise that fulfills with the published `RemoteConfigTemplate`.
*/
public publishServerConfigTemplate(
template: RemoteConfigTemplate,
options?: { force: boolean }
): Promise<RemoteConfigTemplate> {
return this.client.publishServerConfigTemplate(template, options)
.then((templateResponse) => {
return new RemoteConfigTemplateImpl(templateResponse);
});
}

/**
* Rolls back a project's published server-side Remote Config template to the specified version.
*
* @param versionNumber - The version number of the Remote Config template to roll back to.
* @returns A promise that fulfills with the published `RemoteConfigTemplate`.
*/
public rollbackServerConfigTemplate(versionNumber: number | string): Promise<RemoteConfigTemplate> {
return this.client.rollbackServerConfigTemplate(versionNumber)
.then((templateResponse) => {
return new RemoteConfigTemplateImpl(templateResponse);
});
}

/**
* Gets a list of server-side Remote Config template versions that have been published, sorted in reverse
* chronological order.
*
* @param options - Optional options object for getting a list of versions.
* @returns A promise that fulfills with a `ListVersionsResult`.
*/
public listServerConfigVersions(options?: ListVersionsOptions): Promise<ListVersionsResult> {
return this.client.listServerConfigVersions(options)
.then((listVersionsResponse) => {
return {
versions: listVersionsResponse.versions?.map(version => new VersionImpl(version)) ?? [],
nextPageToken: listVersionsResponse.nextPageToken,
};
});
}
}

/**
Expand Down
Loading