Skip to content
Open
Changes from all commits
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
92 changes: 69 additions & 23 deletions deploy/database.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,14 @@ export type DatabaseContext = GlobalContext & {
org?: string;
};

/**
* Build the Deno KV connect URL for a per-environment database id, suitable for
* `Deno.openKv("https://api.deno.com/v2/databases/<id>/connect")`.
*/
function kvConnectUrl(databaseId: string): string {
return `https://api.deno.com/v2/databases/${databaseId}/connect`;
}

const databasesProvisionCommand = new Command<DatabaseContext>()
.description("Provision a database")
.example("Provision a Deno KV database", "provision my-db --kind denokv")
Expand Down Expand Up @@ -72,11 +80,15 @@ const databasesProvisionCommand = new Command<DatabaseContext>()
},
});

console.log(
`${
green("✔")
} Successfully provisioned ${options.kind} database '${name}'.`,
);
if (options.json) {
writeJsonResult({ database: name, engine: options.kind, org });
} else {
console.error(
`${
green("✔")
} Successfully provisioned ${options.kind} database '${name}'.`,
);
}
}));

const databasesLinkCommand = new Command<DatabaseContext>()
Expand Down Expand Up @@ -164,15 +176,23 @@ const databasesLinkCommand = new Command<DatabaseContext>()
engine,
connection_config: connectionConfig,
});
console.log(`${green("✔")} Connection test successful.`);
if (options.json) {
writeJsonResult({ database: name, engine, dryRun: true, ok: true });
} else {
console.error(`${green("✔")} Connection test successful.`);
}
} else {
await trpcClient.mutation("databases.createInstance", {
org: org,
slug: name,
engine,
connectionConfig,
});
console.log(`${green("✔")} Successfully linked database '${name}'.`);
if (options.json) {
writeJsonResult({ database: name, engine, org });
} else {
console.error(`${green("✔")} Successfully linked database '${name}'.`);
}
}
}));

Expand All @@ -193,9 +213,15 @@ const databasesAssignCommand = new Command<DatabaseContext>()
databaseInstance: name,
});

console.log(
`${green("✔")} Successfully assigned database '${name}' to app '${app}'.`,
);
if (options.json) {
writeJsonResult({ database: name, app, org });
} else {
console.error(
`${
green("✔")
} Successfully assigned database '${name}' to app '${app}'.`,
);
}
}));

const databasesDetachCommand = new Command<DatabaseContext>()
Expand All @@ -215,11 +241,15 @@ const databasesDetachCommand = new Command<DatabaseContext>()
databaseInstance: name,
});

console.log(
`${
green("✔")
} Successfully detached database '${name}' from app '${app}'.`,
);
if (options.json) {
writeJsonResult({ database: name, app, org });
} else {
console.error(
`${
green("✔")
} Successfully detached database '${name}' from app '${app}'.`,
);
}
}));

const databasesQueryCommand = new Command<DatabaseContext>()
Expand Down Expand Up @@ -332,7 +362,12 @@ const databasesListCommand = new Command<DatabaseContext>()
{
slug: string;
created_at: Date;
databases: Array<{ name: string; status: string; created_at: Date }>;
databases: Array<{
name: string;
status: string;
created_at: Date;
metadata?: { td_id?: string };
}>;
assignments: Array<{ app_slug: string }>;
} & ConnectionInfo
>;
Expand All @@ -344,11 +379,17 @@ const databasesListCommand = new Command<DatabaseContext>()
createdAt: database.created_at,
assignments: database.assignments.map((a) => a.app_slug),
connection: database.safeConnectionConfig,
databases: database.databases.map((db) => ({
name: db.name,
status: db.status,
createdAt: db.created_at,
})),
databases: database.databases.map((db) => {
const databaseId = db.metadata?.td_id;
return {
name: db.name,
status: db.status,
createdAt: db.created_at,
...(databaseId
? { databaseId, connectUrl: kvConnectUrl(databaseId) }
: {}),
};
}),
})));
return;
}
Expand All @@ -371,14 +412,15 @@ const databasesListCommand = new Command<DatabaseContext>()
},
(database) => {
return {
headers: ["NAME", "STATUS", "CREATED"],
headers: ["NAME", "STATUS", "CREATED", "DATABASE ID"],
rows: database.databases.map((database) => {
return [
database.name,
database.status,
renderTemporalTimestamp(
database.created_at.toISOString(),
),
database.metadata?.td_id ?? "",
];
}),
};
Expand All @@ -400,7 +442,11 @@ const databasesDeleteCommand = new Command<DatabaseContext>()
databaseInstance: name,
});

console.log(`${green("✔")} Successfully deleted database '${name}'.`);
if (options.json) {
writeJsonResult({ database: name, org });
} else {
console.error(`${green("✔")} Successfully deleted database '${name}'.`);
}
}));

export const databasesCommand = new Command<GlobalContext>()
Expand Down
Loading