Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
6200788
Initial commit
adslima Jan 29, 2019
fd9bfc2
Criando testes controlles
Jan 29, 2019
36db40c
Adicionado suporte a CI com TravisCI
Jan 29, 2019
094fd48
Adicionado badge do TravisCI ao repositorio
Jan 29, 2019
f2fbf66
Correção nos testes do controller
Jan 29, 2019
76ee4ab
Finalizando testes Controller command
Jan 29, 2019
11b130f
Ajustes no formado da data do teste do controller
Jan 29, 2019
5e91bc6
Correções nas nomenclaturas
Jan 29, 2019
f94ff3b
refatorando testes unitarios e indexação de categorias
Jan 30, 2019
24eb9a4
Melhoria na consulta das queries com indexacão com Solr
Jan 30, 2019
3cfc167
melhorando consultas dos documentos com solr
Jan 31, 2019
1108173
.
Jan 31, 2019
fc6be4d
Rafatorando metodo de atualização no e insercão do solr
Feb 1, 2019
c977671
aumento da cobertura de testes
Feb 2, 2019
1e20bbd
inciando dockerização do projeto
Feb 2, 2019
d2bdca1
Finalizando testes do controller de consulta(query)
Feb 3, 2019
5d3be29
refatorando nomenclaturas
Feb 3, 2019
c8089f0
removendo trecho de codigo não usado.
Feb 3, 2019
6904644
merge dos arquivos
Feb 4, 2019
559a238
Preparando dockerização
Feb 4, 2019
f9d305b
Ajustes na @doc
Feb 5, 2019
edb58d7
Documentação Javadoc
Feb 5, 2019
8a63e16
Documentação JavaDoc
Feb 5, 2019
b4f66bd
Documentação JavaDoc
Feb 5, 2019
65012cb
Documentacao javadoc
Feb 5, 2019
28a73a8
Ajustes na documentação javadoc
Feb 5, 2019
64792bc
Documentação javaDoc
Feb 7, 2019
b6f8c07
Add 'Expense-Management-api/' from commit '64792bc6320b0ee852ff045e0a…
adslima Feb 13, 2019
afde6a2
Ajustes nas nomenclaturas das categorias.
adslima Feb 13, 2019
048a4c4
Correção dos itens do enum de categorias.
adslima Feb 13, 2019
ad14843
Ajustes no arquivo do travis, para integracao continiua
Feb 16, 2019
9b14302
ajustes nos pom dos projetos
Feb 18, 2019
de1b296
removendo arquivos nao usados do projeto
Feb 18, 2019
bb39ca3
correção na configuração do pom
Feb 18, 2019
7415462
Ajustes no parent POM
Feb 18, 2019
34c8760
Ajustes no parent POM
Feb 18, 2019
75708ab
Correção na configuracao e arquivo properties
Feb 18, 2019
37c921f
Ajustes nas configurações do pom do query
Feb 18, 2019
d018efc
adicionando o integração entre oauth e Zuul para segurança no balance…
Feb 20, 2019
1edb743
Iniciando processo de conteinerização com docker e docker composer
Feb 21, 2019
26ced61
Ajustes na na pesquisa de sugestao das catetorias e inclusão das imag…
Feb 24, 2019
efc4950
ajustes nos teste do query
Feb 25, 2019
589fceb
Update README.md
adslima Feb 28, 2019
77dc47e
Update README.md
adslima Feb 28, 2019
ee17ec9
Ajustes nos serviços de registro e balanceamento de carga
Mar 6, 2019
6e03c9c
Finalizando configuração nos arquivos Dockerfile e docker composer
Mar 6, 2019
e938fca
Finalizando configuração nos arquivos Docker file e docker composer
Mar 6, 2019
9249d6d
ReadMe com informaçoes e instruções da aplicação.
Mar 9, 2019
7488c47
ReadME com informaçoes e instruções da aplicação.
Mar 9, 2019
cdd01f2
ReadME com informaçoes e instruções da aplicação.
Mar 9, 2019
6bd00f0
ReadME com informaçoes e instruções da aplicação.
Mar 10, 2019
2e7bd69
ajustes do arquivo docker-compose
Mar 11, 2019
45cd483
Complementos das informações
adslima Mar 11, 2019
0be6e07
Ajustes nas classes de exceptions
Mar 14, 2019
ba70e4a
Ajustes nas classes de exceptions
Mar 14, 2019
1c06221
Ajustes nas classes de exceptions
Mar 14, 2019
37fa2d2
Ajustes nas classes de exceptions
Mar 14, 2019
eedff67
Merge branch 'master' of https://github.com/adslima/TestBackJava
Mar 14, 2019
6075009
Ajustes nas classes de exceptions
Mar 14, 2019
5968388
ajustes no mentodo de consulta.
Mar 18, 2019
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
25 changes: 25 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
19 changes: 19 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
language: java


sudo: required


script:


- java -version


- echo $JAVA_HOME


jdk:


- oraclejdk8
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2019 Andrews Lima

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
206 changes: 131 additions & 75 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,76 +1,132 @@
# Show me the code

### # DESAFIO:

API REST para Gestão de Gastos!

```
Funcionalidade: Integração de gastos por cartão
Apenas sistemas credenciados poderão incluir novos gastos
É esperado um volume de 100.000 inclusões por segundo
Os gastos, serão informados atraves do protoloco JSON, seguindo padrão:
{ "descricao": "alfanumerico", "valor": double americano, "codigousuario": numerico, "data": Data dem formato UTC }
```
```
Funcionalidade: Listagem de gastos*
Dado que acesso como um cliente autenticado que pode visualizar os gastos do cartão
Quando acesso a interface de listagem de gastos
Então gostaria de ver meus gastos mais atuais.
[![Build Status](https://travis-ci.org/adslima/TestBackJava.svg?branch=master)](https://travis-ci.org/adslima/TestBackJava)


# Micros serviços com spring boot, eureka, zuul, oauth, RabbitMq, solr e Axon Framework.


## Microservices architecture

Contém 5 componentes, todos eles são aplicativos implantáveis ​​independentemente.


### Service Registry (registro de serviços):

Este serviço mantém o registro de todos os microservices que foram implantados.
Foi feito uso do netflix eureka neste projeto.

### Service Gateway (roteamento de serviços):

Pensando na questão do client realizar suas chamadas, diretamente para um único ponto de entrada
que encaminharia a solicitação para o serviço de back-end apropriado.
Com base nessa questão, usei o netflix zuul, o configurando para rotear as solicitações especificando rotas.

### Auth Service(serviço de autenticação):

Para acessar qualquer recurso de autenticação é necessário,
em vez de usar as credenciais do proprietário do recurso para acessar recursos protegidos,
o cliente obtém um token de acesso.


### Expense Management Command & Expense Management Query

Com base no que o CQRS propõe, para que separemos a aplicação em modelos diferentes para atualização e exibição,
que de acordo com o padrão do CQRS estariamos falando dos Comandos e Consultas.
No momento que o usuário realiza um compra com cartão, isso é roteado para o modelo de comando
que por sua vez, irá realizar operações necessárias e informará ao modelo de consulta
para que as novas informações sejam exibidas para o usuário.
Ainda com o uso do Axon Framework foi possivel a implementação do padrão arquitetural CQRS.

Para comunicação de nossas aplicações. ocorrerá através de barramento de eventos fazendo uso do RabbitMq.
Para a persistência dos gastos com cartões, será feito uso do Mysql.
E para indexação das categotorias, será feito uso do SOLR.


# Pré requisito

- Maven 3
- Java 8
- Git
- Docker/Docker Compose

## No Docker serão criados os serviços listados abaixo:

- Mysql
- Solr
- RabbitMq

- Service Registry
- Auth Service
- Service Gateway

- Expense Management Command
- Expense Management Query

# Preparando ambiente

Em cada serviço (registry, auth, gateway, command e query)

### Executar o seguinte commando:
- mvn clean compile package -DskipTests

# Executando

### Após esse procedimento, dentro da pasta raiz do projeto executar
- docker-compose up --no-start


Ao termino desse processo, executar os seguintes comandos:

- docker start mysql solr rabbit
- docker start eureka oauth
- docker start command query
- docker start zuul

*Obs. Devemos considerar um intervalo entre entre os start's dos serviços.


## Com tudo rodando, devemos realizar a solicitação do token para acesso dos serviços;
para isso faremos o seguinte request:

POST
http://localhost:8765/auth-api/oauth/token?grant_type=password&username=demo&password=password

Authorization: Basic dHJ1c3RlZC1hcHA6cGFzc3dvcmQ=

Content-Type: application/json

com o token em 'mãos',vamos realizar um cadastro de gastos com cartão.

POST
http://localhost:8765/commands/api-command

{
"userCode": 12345,
"description": "RecargaCel",
"date": "2019-03-01T01:45:55.031",
"value": 15.00
}


*Para esta funcionalidade é esperado 2.000 acessos por segundo.
*O cliente espera ver gastos realizados a 5 segundos atrás.
```
```
Funcionalidade: Filtro de gastos
Dado que acesso como um cliente autenticado
E acessei a interface de listagem de gastos
E configure o filtro de data igual a 27/03/1992
Então gostaria de ver meus gastos apenas deste dia.
```
```
Funcionalidade: Categorização de gastos
Dado que acesso como um cliente autenticado
Quando acesso o detalhe de um gasto
E este não possui uma categoria
Então devo conseguir incluir uma categoria para este
```
```
Funcionalidade: Sugestão de categoria
Dado que acesso como um cliente autenticado
Quando acesso o detalhe do gasto que não possui categoria
E começo a digitar a categoria que desejo
Então uma lista de sugestões de categoria deve ser exibida, estas baseadas em categorias já informadas por outro usuários.
```
```
Funcionalidade: Categorização automatica de gasto
No processo de integração de gastos, a categoria deve ser incluida automaticamente
caso a descrição de um gasto seja igual a descrição de qualquer outro gasto já categorizado pelo cliente
o mesmo deve receber esta categoria no momento da inclusão do mesmo
```
### # Avaliação

Você será avaliado pela usabilidade, por respeitar o design e pela arquitetura da API.
É esperado que você consiga explicar as decisões que tomou durante o desenvolvimento através de commits.

* Springboot - Java - Maven (preferêncialmente) ([https://projects.spring.io/spring-boot/](https://projects.spring.io/spring-boot/))
* RESTFul ([https://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/](https://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/))
* DDD ([https://airbrake.io/blog/software-design/domain-driven-design](https://airbrake.io/blog/software-design/domain-driven-design))
* Microservices ([https://martinfowler.com/microservices/](https://martinfowler.com/microservices/))
* Testes unitários, teste o que achar importante (De preferência JUnit + Mockito). Mas pode usar o que você tem mais experiência, só nos explique o que ele tem de bom.
* SOAPUI para testes de carga ([https://www.soapui.org/load-testing/concept.html](https://www.soapui.org/load-testing/concept.html))
* Uso de diferentes formas de armazenamento de dados (REDIS, Cassandra, Solr/Lucene)
* Uso do git
* Diferencial: Criptografia de comunicação, com troca de chaves. ([http://noiseprotocol.org/](http://noiseprotocol.org/))
* Diferencial: CQRS ([https://martinfowler.com/bliki/CQRS.html](https://martinfowler.com/bliki/CQRS.html))
* Diferencial: Docker File + Docker Compose (com dbs) para rodar seus jars.

### # Observações gerais

Adicione um arquivo [README.md](http://README.md) com os procedimentos para executar o projeto.
Pedimos que trabalhe sozinho e não divulgue o resultado na internet.

Faça um fork desse desse repositório em seu Github e nos envie um Pull Request com o resultado, por favor informe por qual empresa você esta se candidatando.

### # Importante: não há prazo de entrega, faça com qualidade!

# BOA SORTE!
## Para edição de categorias

PUT
http://localhost:8765/commands/api-command/{id}/categories

{"category": "Serviços"}

## Para Listarmos os gastos:

GET
http://localhost:8765/queries/api-queries/12345/expense-menagement

## Para a listagem por data;

GET
http://localhost:8765/queries/api-queries/expense-menagement?userCode=12345&date=2019-03-01T00:00:00


## Para sugestão de categotorias:

GET
http://localhost:8765/queries/api-queries/{Texto_a_Pesquisar}/categories

9 changes: 9 additions & 0 deletions auth-service/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM java:8-jre-alpine

RUN mkdir -p /auth-service
ADD target/auth-service-0.0.1-SNAPSHOT.jar /auth-service
ADD target/classes/application.properties /auth-service

WORKDIR /auth-service

ENTRYPOINT ["java", "-jar", "auth-service-0.0.1-SNAPSHOT.jar"]
101 changes: 101 additions & 0 deletions auth-service/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>br.com.adslima</groupId>
<artifactId>auth-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>auth-service</name>
<description>Oauth Server</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR2</spring-cloud.version>
</properties>

<dependencies>
<!-- <dependency> -->
<!-- <groupId>org.springframework.boot</groupId> -->
<!-- <artifactId>spring-boot-starter-actuator</artifactId> -->
<!-- </dependency> -->
<!-- <dependency> -->
<!-- <groupId>org.springframework.cloud</groupId> -->
<!-- <artifactId>spring-cloud-starter-config</artifactId> -->
<!-- </dependency> -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

<!-- <dependency> -->
<!-- <groupId>org.springframework.cloud</groupId> -->
<!-- <artifactId>spring-cloud-starter-zuul</artifactId> -->
<!-- </dependency> -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- H2 Database -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>


</project>
Loading