Firestore
Veja como utilizar a predefinição de banco de dados firestore
Você vai precisar ter um banco de dados Firestore para utilizar esta predefinição! Caso queira criar um na nuvem de forma gratuita, siga este guia
Env
O esquema de validação das variáveis de ambiente recebe uma nova propriedade, agora é necessário definir o caminho do arquivo da sua conta firebase na variável FIREBASE_PATH
:
# ...
FIREBASE_PATH=./firebase.json
# ...
Veja um exemplo do arquivo firebase.json
do banco de dados Firestore:
{
"type": "type",
"project_id": "project_id",
"private_key_id": "private_key_id",
"private_key": "private_key",
"client_email": "private_key",
"client_id": "private_key",
"auth_uri": "private_key",
"token_uri": "private_key",
"auth_provider_x509_cert_url": "private_key",
"client_x509_cert_url": "private_key"
}
Abaixo confira as predefinições de acordo com a biblioteca usada:
Typesaurus
Estrutura
A estrutura desta predefinição foi feita usando a biblioteca typesaurs, então para criar nossos dados utilizamos schemas typesaurus
O arquivo index.ts
da pasta src/database
deve fazer a conexão com o banco de dados:
import firebase from "firebase-admin";
import { MemberDocument } from "./documents/MemberDocument.js";
import { GuildDocument } from "./documents/GuildDocument.js";
import { schema, Typesaurus } from "typesaurus";
import { logger } from "#base";
import { env } from "#env";
import path from "node:path";
import chalk from "chalk";
import fs from "node:fs";
const firebaseAccountPath = rootTo(env.FIREBASE_PATH);
if (!fs.existsSync(firebaseAccountPath)){
const filename = chalk.yellow(`"${path.basename(firebaseAccountPath)}"`);
const text = chalk.red(`The ${filename} file was not found in ${__rootname}`);
logger.error(text);
process.exit(0);
}
const firebaseAccount: firebase.ServiceAccount = JSON.parse(
fs.readFileSync(firebaseAccountPath, { encoding: "utf-8" })
);
firebase.initializeApp({ credential: firebase.credential.cert(firebaseAccount) });
export const db = schema(({ collection }) => ({
guilds: collection<GuildDocument>().sub({
members: collection<MemberDocument>()
})
}));
export type DatabaseSchema = Typesaurus.Schema<typeof db>;
export type MemberSchema = DatabaseSchema["guilds"]["sub"]["members"]["Data"];
export type GuildSchema = DatabaseSchema["guilds"]["Data"];
export * from "./functions/guilds.js";
export * from "./functions/members.js";
As coleções dos documentos ficam no objeto da variável db
, ou seja, para cada novo schema de documento que você criar, coloque a coleção como uma propriedade desta variável ou como sub propriedade de um existente.
Assim quando você precisar criar, ler, atualizar ou deletar dados, basta importar a variável db
de #database
e utilizar os métodos da coleção:
Confira a documentação da biblioteca para saber o melhor uso: https://typesaurus.com/get-started/
Sempre use a variável db
do atalho de importação "#database"
, dessa forma o arquivo que contém o código que faz a conexão com o banco de dados é chamado.
Interfaces
Para ter o autocomplete das propriedades na variável db ao criar coleções, é necessário passar interfaces de dados no genérico das coleções, você pode criar as interfaces das suas coleções na pasta src/databases/documents
interface MemberDocument {
wallet?: {
coins?: number;
}
}
export { MemberDocument };
Depois de criar sua interface, importe ele no arquivo index.ts
da pasta src/database
e crie uma coleção passando ela como genérico:
import { MemberDocument } from "./documents/MemberDocument.js";
import { GuildDocument } from "./documents/GuildDocument.js";
import { schema } from "typesaurus";
export const db = schema(({ collection }) => ({
guilds: collection<GuildDocument>().sub({
members: collection<MemberDocument>()
})
}));
Firelord
Estrutura
A estrutura desta predefinição foi feita usando a biblioteca firelord, então para criar nossos dados utilizamos as funções do firelord
O arquivo index.ts
da pasta src/database
deve fazer a conexão com o banco de dados:
import fs from "node:fs";
import chalk from "chalk";
import { logger } from "#base";
import { env } from "#env";
import path from "node:path";
const firebaseAccountPath = rootTo(env.FIREBASE_PATH);
if (!fs.existsSync(firebaseAccountPath)){
const filename = chalk.yellow(`"${path.basename(firebaseAccountPath)}"`);
const text = chalk.red(`The ${filename} file was not found in ${__rootname}`);
logger.error(text);
process.exit(0);
}
const firebaseAccount = JSON.parse(
fs.readFileSync(firebaseAccountPath, { encoding: "utf-8" })
);
import { getFirelord, getFirestore } from "firelord";
import { cert, initializeApp } from "firebase-admin/app";
import { GuildDocument } from "./documents/GuildDocument.js";
import { MemberDocument } from "./documents/MemberDocument.js";
const app = getFirestore(initializeApp({ credential: cert(firebaseAccount) }));
export const db = {
guildsRef: getFirelord<GuildDocument>(app, "guilds"),
membersRef: getFirelord<MemberDocument>(app, "guilds", "members"),
guilds(id: string){
return this.guildsRef.doc(id);
},
members(member: { guild: { id: string }, id: string }){
return this.membersRef.doc(member.guild.id, member.id);
}
};
Os modelos dos documentos ficam no objeto da variável db
, ou seja, para cada novo schema de documento que você criar, coloque o modelo como uma propriedade desta variável
Assim quando você precisar criar, ler, atualizar ou deletar dados, basta importar a variável db
de #database
e utilizar os métodos do modelo:
Confira a documentação da biblioteca para saber o melhor uso: https://firelordjs.com/quick_start_admin