Skip to content

Commit

Permalink
Add commands to create and list RTDB instances (#1225)
Browse files Browse the repository at this point in the history
Add commands to create and list RTDB instances
  • Loading branch information
ryanpbrewster committed May 15, 2019
1 parent a9914ea commit 56f1144
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 1 deletion.
3 changes: 2 additions & 1 deletion changelog.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
feature - database:instances:{create,list} now allow viewing and creating Realtime Database instances
fixed - Fixed issue with CORS rejecting some callable functions.
fixed - Functions emulator no longer watches node_modules files.
fixed - Functions emulator fails to route HTTPS functions to user-provided Express app
fixed - Functions emulator fails to provide correct req.path
fixed - Functions emulator fails on various malformed body requests
fixed - Functions emulator fails on various malformed body requests
15 changes: 15 additions & 0 deletions src/commands/database-instances-create.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import Command = require("../command");
import logger = require("../logger");
import requirePermissions = require("../requirePermissions");
import getProjectNumber = require("../getProjectNumber");
import firedata = require("../gcp/firedata");

export default new Command("database:instances:create <instanceName>")
.description("create a realtime database instance")
.before(requirePermissions, ["firebase.projects.create"])
.action(async (instanceName: string, options: any) => {
const projectNumber = await getProjectNumber(options);
const instance = await firedata.createDatabaseInstance(projectNumber, instanceName);
logger.info(`created database instance ${instance.instance}`);
return instance;
});
18 changes: 18 additions & 0 deletions src/commands/database-instances-list.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import Command = require("../command");
import logger = require("../logger");
import requirePermissions = require("../requirePermissions");
import getProjectNumber = require("../getProjectNumber");
import firedata = require("../gcp/firedata");

export default new Command("database:instances:list")
.description("list realtime database instances")
.before(requirePermissions, ["firebase.projects.list"])
.action(async (options: any) => {
const projectNumber = await getProjectNumber(options);
const instances = await firedata.listDatabaseInstances(projectNumber);
for (const instance of instances) {
logger.info(instance.instance);
}
logger.info(`Project ${options.project} has ${instances.length} database instances`);
return instances;
});
3 changes: 3 additions & 0 deletions src/commands/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ module.exports = function(client) {
client.auth.upload = loadCommand("auth-import");
client.database = {};
client.database.get = loadCommand("database-get");
client.database.instances = {};
client.database.instances.create = loadCommand("database-instances-create");
client.database.instances.list = loadCommand("database-instances-list");
client.database.profile = loadCommand("database-profile");
client.database.push = loadCommand("database-push");
client.database.remove = loadCommand("database-remove");
Expand Down
58 changes: 58 additions & 0 deletions src/gcp/firedata.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import * as api from "../api";
import * as logger from "../logger";
import * as utils from "../utils";

export interface DatabaseInstance {
// The globally unique name of the Database instance.
// Required to be URL safe. ex: 'red-ant'
instance: string;
}

function _handleErrorResponse(response: any): any {
if (response.body && response.body.error) {
return utils.reject(response.body.error, { code: 2 });
}

logger.debug("[firedata] error:", response.status, response.body);
return utils.reject("Unexpected error encountered with FireData.", {
code: 2,
});
}

/**
* Create a new Realtime Database instance
* @param projectId Project from which you want to get the ruleset.
* @param instanceName The name for the new Realtime Database instance.
*/
export async function createDatabaseInstance(
projectNumber: number,
instanceName: string
): Promise<any> {
const response = await api.request("POST", `/v1/projects/${projectNumber}/databases`, {
auth: true,
origin: api.firedataOrigin,
json: {
instance: instanceName,
},
});
if (response.status === 200) {
return response.body.instance;
}
return _handleErrorResponse(response);
}

/**
* Create a new Realtime Database instance
* @param projectId Project from which you want to get the ruleset.
* @param instanceName The name for the new Realtime Database instance.
*/
export async function listDatabaseInstances(projectNumber: number): Promise<DatabaseInstance[]> {
const response = await api.request("GET", `/v1/projects/${projectNumber}/databases`, {
auth: true,
origin: api.firedataOrigin,
});
if (response.status === 200) {
return response.body.instance;
}
return _handleErrorResponse(response);
}

0 comments on commit 56f1144

Please sign in to comment.