Base de bot de discordPredefiniçõesBanco de dados

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:

.env
# ...
FIREBASE_PATH=./firebase.json
# ... 

Veja um exemplo do arquivo firebase.json do banco de dados Firestore:

firebase.json
{
    "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:

src/database/index.ts
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

src/database/documents/member.ts
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:

src/database/index.ts
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:

src/database/index.ts
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