Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
130 changes: 130 additions & 0 deletions COMMENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
<p align="center">
<a href="#bd">Banco de Dados</a>
<a href="#tecnologias">Tecnologias</a>
<a href="#estrutura">Estrutura e Padrões </a>
</p>

---

<h1 id='bd'> 🤖 Banco de Dados </h1>

Configurando e rodando a base de dados:

**Documentação completa para instalação do Docker.**
Docker: Facilita a criação de ambientes isolados que não interferem em outras operações do sistema operacional.

- [Docker e Docker-Compose](https://www.notion.so/Docker-e-Docker-Compose-16771f2ceefe4a05a8c29df4ca49e97a#9e90bc8e2e4a4672a3a5d3baa7138f91)

- ormconfig: É o arquivo responsável pela configuração e conexão do TypeORM com nossa aplicação.

```bash
{
"type": "postgres",
"port": 5432,
"host": "localhost",
"username": "docker",
"password": "docker",
"database": "fullStack",
"entities": [
"./src/modules/users/entities/*.ts"
],
"migrations": [
"./src/database/migrations/*.ts"
],
"cli": {
"migrationsDir": "./src/database/migrations"
}
}

```

- docker-compose: É o arquivo responsável por criar nosso container com o **postgres**.
Apos você configurar o docker e docker-compose este arquivo vai fazer com que nosso banco se inicie automaticamente.

```bash
version: "3.7"

services:
database_fullStack:
image: postgres
container_name: database_fullStack
restart: always
ports:
- 5432:5432
environment:
- POSTGRES_USER=docker
- POSTGRES_PASSWORD=docker
- POSTGRES_DB=fullStack
volumes:
- pgdata:/data/postgres

volumes:
pgdata:
driver: local
```

---

<h1 id='tecnologias'> 🤖 Tecnologias e Libs </h1>

**Node.js**
**Vue.js**
**BootsTrapVue**

**Express**: Uma biblioteca que facilita a criação do nosso servidor.
**UUID**: É responsável pela criação de id's unicos e comparação se uma string do tipo UUID.
**TypeORM**: ORM que intermedializa nossa comunicação com o PostgreSQL (ou qualquer outro banco).
**Typescript**: Superset de javascript. Trás como sua principal feature o uso de tipagems de variáveis.
**PostgreSQL**: Banco de Dados escolhido para persistir nossos dados.

---

<h1 id='estrutura'> 🤖 Estrutura e Padrões </h1>

<p align="center">
Neste projeto foi escolhido o padrão DDD(Domain-Driven Development). Nesta arquitetura os arquivos são organizados
por domínio de conhecimento. Nesse caso, estamos trabalhando apenas com o modúlo de usuário, mas caso houve-se
outra "entidade", trabalhariamos em outro modulo seus arquivos.
</p>

<p>
Programação Orientada a Objetos: Fica muito simples trabalhar com conceitos de S.O.L.I.D, Repositories, Services e Decorators usando classes.
</p>

## Design Patters

Dividir as rotas por cada entidade;

Conceito de Model/Entidade: É a forma de como os dados devem ser gravados.

## Repositories

Repositório: Conexão entre a persistência dos dados e a rota. É altamente recomendado que apenas o repositório trabalhe em cima dos métodos de persistência.

## Services

O Service é um conceito introduzido no Service Pattern. Ele tem como objetivo abstrair regras de negócio das rotas, além de tornar nosso código mais reutilizável.

No contexto da nossa jornada, essa implementação visa reduzir a complexidade das rotas da nossa aplicação e deixá-las responsáveis apenas pelo que realmente devem fazer: receber uma requisição, repassar os dados da requisição a outro arquivo e devolver uma resposta.

O Service deve ter um nome descritivo (ex.: updateDeliveryManProfileService) e **sempre** possuir apenas **um** método (ex.: execute()). Além disso, caso outra rota ou arquivo precise executar essa mesma ação, basta chamar e executar esse Service, obedecedo assim a outro importante princípio: DRY (Don't Repeat Yourself).

Os services não tem acesso a requisição e resposta da rota, sempre que houver um erro ou excessão será feito um throw Error.

## SOLID

### Single Responsability Principle

- Uma classe deve ter exclusivamente uma responsabilidade;
- Alterar um código nessa classe não deve influenciar o funcionamento de outros códigos;
- Classes com uma única responsabilidade são mais legíveis e testáveis;

### Dependency Inversion Principle

Classes de nível superior não devem depender diretamente de outras classes de nível inferior e sim de interfaces.

### Liskov Substitution Principle

Esse princípio defende o uso de polimorfismo, assim como usamos no princípio anterior, para estabelecer que um objeto pode ser substituído por qualquer outro do mesmo tipo sem danificar o comportamento da aplicação.

Já que estamos utilizando TypeScript com suporte às interfaces, o mesmo já vai nos avisar de qualquer erro ferindo esse princípio.
186 changes: 66 additions & 120 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,120 +1,66 @@
Obi Tec - Full Stack Web Developer
===================
O objetivo deste desafio é principalmente conhecermos um pouco mais de você que se candidatou para a nossa vaga de desenvolvedor Full Stack Web.

É importante ressaltar que solução do desafio não tem um gabarito. Vamos verificar as técnicas que utilizaram para a criação do serviço, como vocês encaram este desafio e também, claro, a entrega da solução.

As regras e os requisitos técnicos estão detalhadas abaixo, boa sorte!

_Time Obi.Tec_
# Especificações Técnicas
- **Front End:** [Vue.js](https://vuejs.org)
- **UI Framework**: [Vuetifyjs](https://vuetifyjs.com/en) ou [Bootstrap](https://bootstrap-vue.org)
- **API:** NodeJS
- **Banco de Dados:** PostgreSQL, MySQL ou MongoDB
- **Idioma de escrita do código:** Inglês

# Requisitos
## Contextualização
Considere que para o módulo de autenticação da **Plataforma Obi Tec oAuth** será desenvolvido um **serviço** para o gerenciamento do **cadastro de usuário**. O desafio consiste em criar uma aplicação para o cadastro de usuários que atenda (mas não se detenha) aos critérios mínimos de aceitação.

## Histórias do Usuário
- **Sendo** um usuário administrativo da Plataforma Obi Tec oAuth
- **Quero** gerenciar os usuários da Plataforma
- **Para** que seja possível configurar acessos aos sistemas dos clientes

### Critérios mínimos de aceite:
#### Cenário: listar usuários cadastrados
- **Dado** que estou na Plataforma Obi Tec oAuth
- **Quando** clico no menu Usuários
- **Então** abre a tela de Consulta de Usuários
- **E** exibe opção Cadastrar ao topo
- **E** exibe lista dos usuários
- **E** para cada registro exibe o UUID (identificador único do usuário), Name e E-mail
- **E** exibe a opção Editar
- **E** exibe a opção Excluir

#### Cenário: cadastrar novo usuário
- **Dado** que estou na tela de Consulta de Usuários
- **Quando** clico em Cadastrar
- **Então** abre a tela de Cadastro do Usuário
- **E** exibe os campos obrigatórios, UUID, Name e E-mail
####
- **Dado** que inseri dados válidos nos campos
- **Quando** clico em Salvar
- **Então** cria o novo usuário na base
- **E** retorna mensagem de sucesso
####
- **Dado** que insiro um UUID já cadastrado
- **Quando** clico em Salvar
- **Então** é realizado uma validação que o UUID já existe
- **E** retorna mensagem de erro "UUID já cadastrado"
####
- **Dado** que insiro um E-mail já cadastrado
- **Quando** clico em Salvar
- **Então** é realizado uma validação que o e-mail já existe
- **E** retorna mensagem de erro "E-mail já cadastrado"
####
- **Dado** que não desejo cadastrar mais o Usuário
- **Quando** clico em Cancelar
- **Então** retorna para tela Consulta de Usuários
- **E** não persiste a gravação dos dados no banco

#### Cenário editar cadastro de usuário
- **Dado** que estou na tela de Consulta de Usuários
- **Quando** clico em Editar Usuários
- **Então** abre a tela de Edição
- **E** exibe os campos do cadastro preenchidos
- **E** habilita alteração dos campos editáveis
####
- **Dado** que altero os dados do Usuário
- **Quando** clica em Salvar
- **Então** grava os dados editáveis na base
####
- **Dado** que estou na tela de Edição
- **Quando** clica em Cancelar
- **Então** retorna para a tela de Consulta de Usuários
- **E** não persiste a gravação dos dados

#### Cenário: excluir cadastro de usuário
- **Dado** que estou na tela de Consulta de Usuários
- **Quando** clico em Excluir
- **Então** exibe a modal de confirmação de exclusão
####
- **Dado** que estou na modal de confirmação de exclusão
- **Quando** clico em Confirmar
- **Então** então exclui o registro do Usuário
####
- **Dado** que estou na modal de confirmação de exclusão
- **Quando** clico em Cancelar
- **Então** então fecha a modal e não persiste a exclusão

## Campos obrigatórios:
- **UUID** (não editável)
- **Nome** (editável)
- **E-mail** (editável)

# Desejável
- Testes unitários
- Documentação da arquitetura de solução

# Critérios de avaliação
- Qualidade de escrita do código
- Organização do projeto
- Qualidade da API
- Lógica da solução implementada
- Qualidade da camada de persistência
- Utilização do Git (quantidade e descrição dos commits, Git Flow, ...)
- Funcionalidades extras

# Instruções de entrega
1. Crie um fork do repositório no seu GitHub
2. Faça o push do código desenvolvido no seu Github
3. Inclua um README.md explicando como rodar o projeto
4. Inclua um arquivo chamado COMMENTS.md explicando
- Decisão da arquitetura utilizada
- Lista de bibliotecas de terceiros utilizadas
- O que você melhoraria se tivesse mais tempo
- Quais requisitos obrigatórios que não foram entregues (se houver)
5. Informe ao recrutador quando concluir o desafio junto com o link do repositório
6. Após revisão do projeto junto com a equipe de desenvolvimento deixe seu repositório privado
<p align="center">
<a href="#features">Features</a>
<a href="#tecnologias">Tecnologias</a>
<a href="#clone">Clonar Repositório</a>
</p>

---

<h1 id='tecnologias'> 🤖 Tecnologias </h1>

As seguintes ferramentas foram usadas na construção do projeto:

**Back-end**

- [Node.js](https://nodejs.org/en/)
- [TypeORM](https://typeorm.io/#/)
- [Docker e Docker-Compose](https://www.notion.so/Docker-e-Docker-Compose-16771f2ceefe4a05a8c29df4ca49e97a#9e90bc8e2e4a4672a3a5d3baa7138f91)

**Front-End**
- [VueJs](https://cli.vuejs.org/guide/installation.html)
- [BootstrapVue](https://bootstrap-vue.org/)

<h1 id='features'> ✔️ Features </h1>

- [x] Listagem de usuários.
- [x] Cadastro de usuários.
- [x] Atualizar dados do usuários.
- [x] Deletar usuário.


<h1 id='clone'>❗ Pré-requisitos</h1>

Antes de começar, você vai precisar ter instalado em sua máquina as seguintes ferramentas:
[Git](https://git-scm.com), [Node.js](https://nodejs.org/en/), [Docker](https://www.notion.so/Docker-e-Docker-Compose-16771f2ceefe4a05a8c29df4ca49e97a#9e90bc8e2e4a4672a3a5d3baa7138f91), [Vuejs](https://cli.vuejs.org/guide/installation.html) e algum gerenciador de pacotes: Npm ou [Yarn](https://yarnpkg.com/)
Além disto é bom ter um editor para trabalhar com o código como [VSCode](https://code.visualstudio.com/)


### 💡 Clonando Repositório

```bash
# Clone este repositório
$ git clone <https://github.com/AndrewReis/>

# Acesse a pasta do projeto no terminal/cmd
$ cd
```

### 🎲 Rodando o Back End (servidor)

```bash

# Vá para a pasta backend
$ cd

# Instale as dependências
$ npm install
ou
$ yarn install

# Execute a aplicação em ambiente de Desenvolvimento.
$ npm run dev
ou
$ yarn dev

# O servidor inciará na porta:3333 - acesse <http://localhost:3333>
```
20 changes: 20 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
version: "3.7"

services:
database_fullStack:
image: postgres
container_name: database_fullStack
restart: always
ports:
- 5432:5432
environment:
- POSTGRES_USER=docker
- POSTGRES_PASSWORD=docker
- POSTGRES_DB=fullStack
volumes:
- pgdata:/data/postgres


volumes:
pgdata:
driver: local
17 changes: 17 additions & 0 deletions ormconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"type": "postgres",
"port": 5432,
"host": "localhost",
"username": "docker",
"password": "docker",
"database": "fullStack",
"entities": [
"./src/modules/users/entities/*.ts"
],
"migrations": [
"./src/database/migrations/*.ts"
],
"cli": {
"migrationsDir": "./src/database/migrations"
}
}
25 changes: 25 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"name": "challenge-full-stack-web-developer",
"version": "1.0.0",
"main": "index.js",
"repository": "https://github.com/AndrewReis/challenge-full-stack-web-developer.git",
"author": "AndrewReis <andrew-reiis@outlook.com>",
"license": "MIT",
"scripts": {
"dev": "ts-node-dev --transpile-only --ignore-watch node_modules src/server.ts",
"typeorm": "ts-node-dev ./node_modules/typeorm/cli"
},
"dependencies": {
"express": "^4.17.1",
"pg": "^8.6.0",
"reflect-metadata": "^0.1.13",
"typeorm": "^0.2.32"
},
"devDependencies": {
"@types/cors": "^2.8.10",
"@types/express": "^4.17.12",
"@types/uuid": "^8.3.0",
"ts-node-dev": "^1.1.6",
"typescript": "^4.3.2"
}
}
3 changes: 3 additions & 0 deletions src/database/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { createConnection } from 'typeorm';

createConnection();
Loading