From d007348e09ebfdc82b4df62b99d96f5083f5f710 Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Thu, 4 Jul 2024 20:03:39 -0700 Subject: [PATCH] feat: update in memory db pt-br --- .../current/providers/in-memory-db.md | 181 ++++++++++-------- package.json | 94 ++++----- 2 files changed, 153 insertions(+), 122 deletions(-) diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/providers/in-memory-db.md b/i18n/pt/docusaurus-plugin-content-docs/current/providers/in-memory-db.md index f88da20c..e5b750ed 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/providers/in-memory-db.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/providers/in-memory-db.md @@ -2,19 +2,21 @@ sidebar_position: 3 --- -# BD em Memória +# Banco de Dados na Memória -O BD em Memória é um provedor que usa um banco de dados simples em memória para armazenar dados. É uma classe injetada no sistema de injeção de dependência do ExpressoTS como um singleton. +O Banco de Dados na Memória (In Memory DB) é um provedor que utiliza um banco de dados simples em memória para armazenar dados. É uma classe que pode ser registrada no sistema de injeção de dependência do ExpressoTS como um singleton. -Essa classe gerencia tabelas, representadas por pares chave-valor, onde a chave é o nome da tabela e o valor é um array de entidades. +```typescript +this.provider.register(InMemoryDB, "Singleton"); +``` -A classe InMemoryDB fornece uma forma simples e eficiente de simular um banco de dados totalmente em memória, o que pode ser particularmente útil para testes e desenvolvimento rápido onde um banco de dados completo pode ser excessivo. +A classe InMemoryDB oferece uma maneira simples e eficiente de simular um banco de dados inteiramente na memória, o que pode ser particularmente útil para testes e desenvolvimento rápido, onde um banco de dados completo pode ser excessivo. ## Inspetor de BD -Outra característica interessante adicionada à classe InMemoryDB é a capacidade de imprimir tabelas no console usando console.table. Esta característica é particularmente útil para fins de depuração e teste. Também pode ser usada para inspecionar rapidamente o conteúdo de uma tabela. +Outra funcionalidade interessante adicionada à classe InMemoryDB é a capacidade de imprimir tabelas no console usando console.table. Esta funcionalidade é especialmente útil para fins de depuração e teste. Também pode ser usada para inspecionar rapidamente o conteúdo de uma tabela. -O conteúdo da tabela será impresso no console sempre que o repositório for utilizado por qualquer endpoint que tenha operações de leitura ou gravação no banco de dados. +O conteúdo da tabela será impresso no console toda vez que o repositório for usado por qualquer endpoint que tenha operações de leitura ou escrita no banco de dados. Aqui está uma imagem mostrando a saída no console do InMemoryDB quando criamos um novo usuário: @@ -24,114 +26,143 @@ Aqui está uma imagem mostrando a saída no console do InMemoryDB quando criamos O Inspetor de BD está ativado por padrão. Assim que você criar uma nova entidade e estender a classe BaseRepository, o InMemoryDB imprimirá a tabela no console. ::: -## Definição da Classe +## Como Usar o InMemoryDB -Explicação detalhada da definição da classe InMemoryDB. +Para usar a classe InMemoryDB, você precisa importá-la do pacote expressots e registrá-la como um singleton no sistema de injeção de dependência. Aqui está um exemplo de como fazer isso em uma classe de serviço: + +### Registrar InMemoryDB ```typescript -@provideSingleton(InMemoryDB) -class InMemoryDB { - private tables: Record = {}; - // Definições de métodos ... -} -``` +export class App extends AppExpress { + private middleware: IMiddleware; + private provider: ProviderManager; -Este decorador indica que a classe InMemoryDB é um Singleton dentro do sistema de injeção de dependência. + constructor() { + super(); + this.middleware = container.get(Middleware); + this.provider = container.get(ProviderManager); + } -```typescript -@provideSingleton(InMemoryDB) -``` + protected configureServices(): void { + this.provider.register(InMemoryDB, "Singleton"); + } -Propriedades da classe tables é uma propriedade privada que mantém as tabelas em memória. Cada tabela é um par chave-valor onde a chave é o nome da tabela, e o valor é um array de entidades (IEntity[]). + protected postServerInitialization(): void {} -```typescript -private tables: Record = {}; + protected serverShutdown(): void {} +} ``` -## Métodos da Classe - -A classe InMemoryDB fornece os seguintes métodos: +Ao registrar a classe `InMemoryDB`, você pode especificar o escopo como string ou usando o `BindingScopeEnum`. -### Método Get Table +### Defina sua Entidade ```typescript -getTable(tableName: string): IEntity[] +@provide(UserEntity) +export class UserEntity { + id: string; + name: string; + email: string; + + constructor() { + this.id = randomUUID(); + } +} ``` -Parâmetros - -- tableName (string): O nome da tabela a ser recuperada. -- Retorna: IEntity[]: Um array de entidades armazenadas na tabela especificada. -- Descrição: Recupera uma tabela pelo nome do banco de dados em memória. Se a tabela não existir, inicializa uma tabela vazia. +### Crie o Padrao de Repositorio -### Método Show Tables +O repositório é uma classe que estende a classe BaseRepository e é usada para gerenciar entidades de um tipo específico. A classe do repositório faz parte do sistema de injeção de dependência e é marcada pelo decorador @provide. ```typescript -showTables(): void +@provide(UserRepository) +export class UserRepository extends BaseRepository { + constructor() { + super("users"); + } +} ``` -Descrição: Imprime uma lista de todas as tabelas existentes no banco de dados em memória na saída padrão. Se não existirem tabelas, ele exibe "Nenhuma tabela existe". +Na classe acima, estamos criando um repositório para a classe UserEntity. O repositório é inicializado com o nome da tabela users no construtor. -### Método Print Table +Você também pode definir métodos personalizados para o repositório de usuários. ```typescript -printTable(tableName: string): void +@provide(UserRepository) +class UserRepository extends BaseRepository { + constructor() { + super("users"); + } + + // Custom method implemented for the UserRepository only + findByEmail(email: string): User | null { + const user = this.table.find((item) => item.email === email); + return user || null; + } +} ``` -Parâmetros - -- tableName (string): O nome da tabela cujos registros devem ser impressos. -- Descrição: Imprime todos os registros em uma tabela específica no console usando console.table. Se a tabela não existir ou estiver vazia, notifica o usuário pela saída padrão. - -:::info -No modelo opinativo, o InMemoryDB já está implementado na classe BaseRepository. Você não precisa usá-lo diretamente. -::: +### Usando o Repositório -## Como Estender BaseRepository +Você pode injetar o repositório no construtor ou via injeção de propriedade. -Aqui está um trecho de código que mostra como estender a classe BaseRepository para implementar um repositório personalizado. +Injeção de Propriedade: ```typescript -@provide(UserRepository) -class UserRepository extends BaseRepository { - constructor() { - super("users"); - } +@provide(UserCreateUseCase) +export class UserCreateUseCase { + @inject(UserRepository) + private userRepo: UserRepository; + + @inject(UserEntity) + private userEntity: UserEntity; + + execute(payload: IUserCreateRequestDTO): IUserCreateResponseDTO { + this.userEntity.name = payload.name; + this.userEntity.email = payload.email; + + this.userRepo.create(this.userEntity); + + return { + id: this.userEntity.id, + name: this.userEntity.name, + email: this.userEntity.email, + }; + } } ``` -A classe UserRepository é um repositório especializado voltado para o gerenciamento de entidades de usuário. Ela estende a classe genérica BaseRepository e define seu nome de tabela como "users" durante a construção. Esta classe faz parte do sistema de injeção de dependência e é marcada pelo decorador @provide. - -Qualquer método personalizado pode ser adicionado à classe UserRepository. Por exemplo, o seguinte trecho de código mostra como implementar um método findByEmail que procura um usuário por e-mail. +Injeção no Construtor: ```typescript -@provide(UserRepository) -class UserRepository extends BaseRepository { - constructor() { - super("users"); - } - - // Método personalizado implementado apenas para o UserRepository - findByEmail(email: string): User | null { - const user = this.table.find((item) => item.email === email); - return user || null; - } +@provide(UserCreateUseCase) +export class UserCreateUseCase { + constructor(private userEntity: UserEntity, private userRepo: UserRepository) {} + + execute(payload: IUserCreateRequestDTO): IUserCreateResponseDTO { + this.userEntity.name = payload.name; + this.userEntity.email = payload.email; + + this.userRepo.create(this.userEntity); + + return { + id: this.userEntity.id, + name: this.userEntity.name, + email: this.userEntity.email, + }; + } } ``` -:::caution SPOILER ALERT -No futuro, planejamos estender o padrão de repositório para suportar vários bancos de dados, todos facilmente montáveis através do nosso CLI -::: - --- ## Apoie o projeto ExpressoTS é um projeto de código aberto licenciado sob o MIT. É um projeto independente com desenvolvimento contínuo possibilitado graças ao seu suporte. Se você deseja ajudar, por favor considere: -- Se tornar um **[Sponsor no GitHub](https://github.com/sponsors/expressots)** -- Siga a **[organização](https://github.com/expressots)** no GitHub e de um Star ⭐ no projeto -- Subscreva no nosso canal na Twitch: **[Richard Zampieri](https://www.twitch.tv/richardzampieri)** -- Entre no nosso **[Discord](https://discord.com/invite/PyPJfGK)** -- Contribua submetendo **[issues e pull requests](https://github.com/expressots/expressots/issues/new/choose)** -- Compartilhe o projeto com seus amigos e colegas +- Se tornar um **[Sponsor no GitHub](https://github.com/sponsors/expressots)** +- Siga a **[organização](https://github.com/expressots)** no GitHub e de um Star ⭐ no projeto +- Subscreva no nosso canal na Twitch: **[Richard Zampieri](https://www.twitch.tv/richardzampieri)** +- Entre no nosso **[Discord](https://discord.com/invite/PyPJfGK)** +- Contribua submetendo **[issues e pull requests](https://github.com/expressots/expressots/issues/new/choose)** +- Compartilhe o projeto com seus amigos e colegas diff --git a/package.json b/package.json index d263123b..11b7362e 100644 --- a/package.json +++ b/package.json @@ -1,49 +1,49 @@ { - "name": "classic", - "version": "1.0.0", - "private": true, - "scripts": { - "docusaurus": "docusaurus", - "start": "docusaurus start", - "build": "docusaurus build", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "clear": "docusaurus clear", - "serve": "docusaurus serve", - "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids", - "typecheck": "tsc" - }, - "dependencies": { - "@docusaurus/core": "^2.4.1", - "@docusaurus/preset-classic": "^2.4.1", - "@docusaurus/remark-plugin-npm2yarn": "^3.0.0", - "@docusaurus/theme-mermaid": "^2.4.3", - "@mdx-js/react": "^1.6.22", - "axios": "^1.5.1", - "clsx": "^1.2.1", - "prism-react-renderer": "^1.3.5", - "react": "^17.0.2", - "react-dom": "^17.0.2" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "^2.4.1", - "@tsconfig/docusaurus": "^1.0.5", - "typescript": "^4.7.4" - }, - "browserslist": { - "production": [ - ">0.5%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "engines": { - "node": ">=16.14" - } + "name": "classic", + "version": "1.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "typecheck": "tsc" + }, + "dependencies": { + "@docusaurus/core": "^2.4.1", + "@docusaurus/preset-classic": "^2.4.1", + "@docusaurus/remark-plugin-npm2yarn": "^3.0.0", + "@docusaurus/theme-mermaid": "^2.4.3", + "@mdx-js/react": "^1.6.22", + "axios": "^1.5.1", + "clsx": "^1.2.1", + "prism-react-renderer": "^1.3.5", + "react": "^17.0.2", + "react-dom": "^17.0.2" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^2.4.1", + "@tsconfig/docusaurus": "^1.0.5", + "typescript": "^4.7.4" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "engines": { + "node": ">=16.14" + } }