Database
A JSagon está em pleno desenvolvimento de adapters que permitem uma fácil integração com outras tecnologias e ferramentas de terceiros. Porém, é completamente viável fazer uma implementação paralela enquanto determinado adapter ainda não esteja disponível para implementação e deploy para produção.
Este artigo tem como propósito demonstrar uma breve e simples integração com Banco de dados utilizando o Mongoose (MongoDB) e a JSagon Framework. O mesmo esquema e estrutura seria aplicável a qualquer outro banco e ferramenta utilizada, dentre eles Sequilize e TypeORM. Entendido o conceito, a aplicação se torna ampla.
Considerando que o projeto já esteja criado, partiremos de fato para a implementação. A instalação do MongoDB é um requisito para que a implementação funcione corretamente, faça então o download e instale-o de acordo com o seu sistema operacional.
Para realizar a conexão com o banco de dados, utilizaremos o Mongoose. Mongoose é uma biblioteca para NodeJS que fornece soluções que facilitam o manuseio do banco de dados, baseando-se em esquemas para modelar os dados da aplicação. Execute o seguinte código para instalá-lo em sua aplicação:
npm i mongoose
O próximo passo é inicializar o banco de dados junto a aplicação para um uso efetivo. Para isso, crie uma pasta de nome "database" na configuração da aplicação e crie também um arquivo de nome mongodb.ts, o caminho ficará dev/src/config/database/mongodb.ts. No arquivo, inserida o seguinte código:
import mongoose from 'mongoose'
mongoose.connect('mongodb://127.0.0.1:27017/website-db', {
useCreateIndex: true,
useNewUrlParser: true,
useUnifiedTopology: true
}).catch( error => {
console.log('Não foi possível se conectar ao MongoDB', error)
})
No código anterior, o mongoose estabelece uma conexão com o banco de dados MongoDB. A string de conexão segue uma configuração padrão local do MongoDB. O "website-db" é o nome interno do banco a ser utilizado.
Para inicializar a conexão com o banco de dados junto a aplicação, importe o arquivo criado na configuração base como a seguir em dev/src/config/app.config.ts:
// ...
import './database/mongodb'
// ...
Para confirmar que tudo está funcionando corretamente, inicialize a aplicação como a seguir:
npm run dev
Caso a mensagem de erro definida no catch da conexão não apareça, significa que a conexão foi estabelecida.
Implementação
A implementação de exemplo será um simples cadastro de contato no banco de dados, referente aquela área do site onde as pessoas mandam perguntas, dúvidas, etc. A estrutura de pastas e nomes seguem a convenção padrão de quando se cria um projeto novo do zero. Vamos lá.
Todo o desenvolvimento e estrutura foi pensado de forma a uma melhor organização do projeto, e escalabilidade futura.
Crie uma pasta Models no módulo Base do app Website. E crie também um arquivo de nome Contato.ts. O caminho então ficaria dev/src/app/Website/modules/Base/Models/Contato.ts. No arquivo, insira o seguinte código.
import mongoose from 'mongoose'
const contatoSchema = new mongoose.Schema({
nome: {
type: String,
required: [true, 'Nome obrigatório'],
trim: true
},
email: {
type: String,
required: [true, 'E-mail obrigatório'],
trim:true,
lowercase:true
},
message: {
type: String,
equired: [true, 'Mensagem obrigatória'],
},
}, {
timestamps: true
})
const Contato = mongoose.model('Contato', contatoSchema)
export default Contato
Como este é um tutorial de integração, não será aprofundado o funcionamento dos recursos do mongoose.
Visando centralizar o manuseio do model Contato, criaremos agora uma pasta Repository, e um arquivo de nome ContatoRepository. O caminho do arquivo ficará dev/src/app/Website/modules/Base/Repository/ContatoRepository.ts.
import Contato from '../Models/Contato'
class ContatoRepository {
public static async register (nome: string, email: string, mensagem: string) {
const contato = new Contato({nome, email, mensagem})
await contato.save()
}
}
export default ContatoRepository
No exemplo anterior importamos o model Contato, criamos uma classe para centralizar as suas operações, e criamos um método para registrar o contato em banco.
Agora por fim, em nosso controlador, HomeController, e action salvarContato, poderemos utilizar dessa estrutura para facilmente salvar os contatos. No arquivo dev/src/app/Website/modules/Base/Controller/HomeController.ts, realize as mudanças como a seguir:
import { AbstractController, Request, Response } from '@jsagon/core'
import ContatoRepository from '../Repository/ContatoRepository'
class HomeController extends AbstractController {
public async salvarContato(req: Request, res: Response) {
const {nome, email, mensagem} = req.body
await ContatoRepository.register(nome, email, mensagem)
return res.json({msg: 'Contato registrado com sucesso'})
}
}
export default HomeController
Considerações finais
O objetivo do artigo foi demonstrar que aproveitando-se da estrutura da framework pode-se além de integrar com outras ferramentas, organizar a aplicação de maneira a ter um melhor aproveitamento e escalabilidade. Este modelo pode se aplicar a qualquer outra biblioteca de banco de dados que deseje utilizar.
Qualquer dúvida, entre em contato por um dos meios disponíveis.