Skip to content

Commit

Permalink
feat: update in memory db pt-br
Browse files Browse the repository at this point in the history
  • Loading branch information
rsaz committed Jul 5, 2024
1 parent 1a07f2d commit d007348
Show file tree
Hide file tree
Showing 2 changed files with 153 additions and 122 deletions.
181 changes: 106 additions & 75 deletions i18n/pt/docusaurus-plugin-content-docs/current/providers/in-memory-db.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand All @@ -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<string, IEntity[]> = {};
// 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<IMiddleware>(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<string, IEntity[]> = {};
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<UserEntity> {
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<UserEntity> {
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<User> {
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<User> {
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
94 changes: 47 additions & 47 deletions package.json
Original file line number Diff line number Diff line change
@@ -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"
}
}

0 comments on commit d007348

Please sign in to comment.