Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
cee7a2c
Instalado o JDK 1.8, spring e etc usando o spring initializer, config…
jonatassantoszup Jun 24, 2019
7da18a0
Criado o modelo cliente e efetuando a configuração do jpa com spring …
jonatassantoszup Jun 25, 2019
0a0f93d
criado o modelo, clientDTO e mais configuração do solr
jonatassantoszup Jun 25, 2019
6743677
criado o modelo, clientDTO e mais configuração do solr
jonatassantoszup Jun 25, 2019
7f38a5a
Correção do padrão de persistencia repository
jonatassantoszup Jun 26, 2019
25a7fae
refinando o codigo
jonatassantoszup Jun 26, 2019
df6ec7e
corrigindo erro interno
jonatassantoszup Jun 27, 2019
5a08e29
configuracao do padrao repository e refatoramento do codigo
jonatassantoszup Jun 27, 2019
97c59a3
Finalizado a busca dos atributos utilizando um filtro básico com if
jonatassantoszup Jun 27, 2019
e2f3bf6
Criado o metodo post e configurado o uriBuilder
jonatassantoszup Jun 27, 2019
b8f76ff
Corrigido pequenos erros e testado o metodo post usando o swagger
jonatassantoszup Jun 27, 2019
d903ad0
Configurado o bean validation
jonatassantoszup Jun 27, 2019
3c215c2
Apenas refatorando código
jonatassantoszup Jun 27, 2019
52e44fe
configurado o retorno da mensagem do validation
jonatassantoszup Jun 27, 2019
720814f
Corrigindo o id do cliente que estava sendo salvo no solr
jonatassantoszup Jun 27, 2019
f1f8244
Configurado path dinamico
jonatassantoszup Jun 28, 2019
31ac4d6
Funcao de update optimizada
jonatassantoszup Jun 28, 2019
da6a093
Configurado o retorno 404 para que o usuario final não receba stacktrace
jonatassantoszup Jun 28, 2019
4eb7649
Removido a classa hello, aplicado paginacao
jonatassantoszup Jun 28, 2019
3c57f07
Refatorado a paginacao
jonatassantoszup Jun 28, 2019
40067e2
Configurado o cacheEvict e aplicado ao projeto o spring security e co…
jonatassantoszup Jun 28, 2019
ed518b9
Configurando segurança
jonatassantoszup Jun 28, 2019
dd52cdf
Autenticado o usuario
jonatassantoszup Jun 29, 2019
86e8c5f
Configurado o Jwt
jonatassantoszup Jun 30, 2019
4b25761
Configurado a autenticacao via token, utilizando spring configuration
jonatassantoszup Jul 1, 2019
69cf7fa
Criacao de lancamento de gasto e busca de gasto por data
jonatassantoszup Jul 2, 2019
0281b7e
Correcao da busca por data
jonatassantoszup Jul 3, 2019
20cf2e6
refinando o codigo
jonatassantoszup Jun 26, 2019
226a8fa
corrigindo erro interno
jonatassantoszup Jun 27, 2019
27c30da
Criado e configurado o usuario, incluindo seguranca do mesmo
jonatassantoszup Jul 6, 2019
dcfce05
Refatorando para simplificar o projeto: - refatorado nome das entidad…
jonatassantoszup Jul 6, 2019
9599f6e
Refatorando para simplificação de código: - Removido CRUD de usuario …
jonatassantoszup Jul 6, 2019
f6e7f08
Refatorando para simplificar a aplicação: -Removido DetalheGastosDTO.…
jonatassantoszup Jul 6, 2019
2e71c16
Refatorando para simplificar a aplicação: - Criado teste unitário par…
jonatassantoszup Jul 6, 2019
a3ff820
Refatorando para simplificar a aplicação: - Ajuste no método de lista…
jonatassantoszup Jul 6, 2019
530ac92
Refatorando para simplificar a aplicação: - Correção do negócio da bu…
jonatassantoszup Jul 6, 2019
84ce0dd
Alterado nome do teste de busca de gastos por dia para um nome mais s…
jonatassantoszup Jul 6, 2019
d7e2b7d
Categorização de Gastos: - Criado serviço de categorização de gastos.…
jonatassantoszup Jul 6, 2019
c69c0fb
Refatorando para simplificar a aplicação: - Remoção de classes que nã…
jonatassantoszup Jul 6, 2019
38ce5b1
Refatorando para simplificar a aplicação: - Alteração de nomes para n…
jonatassantoszup Jul 7, 2019
b6198b6
Refatorando autoricação: -Separada autenticação de Sistema e Usuario …
jonatassantoszup Jul 7, 2019
221ecda
Refatorando autenticação: - Corrigido erros em cliente e sistema que …
jonatassantoszup Jul 8, 2019
7c72859
Adicionado projeto ao docker. - Adicionado ambiente para o solr. - Al…
jonatassantoszup Jul 8, 2019
edfc653
Correção de erros e estabilização da aplicação. Ajustes para usar com…
jonatassantoszup Jul 9, 2019
ab8bf95
Removido login cliente. Ajuste na query para encontrar por email para…
jonatassantoszup Jul 9, 2019
66bc0f2
Removido configurações de IDE desnecessárias
jonatassantoszup Jul 9, 2019
f8b6e54
Criado READ-ME com as instruções para execução do projeto
jonatassantoszup Jul 9, 2019
607c265
Alterada a imagem do docker para utilizar imagem que já vem com o solr
jonatassantoszup Jul 9, 2019
faeabf1
Para simplificar as operações do solr, agora está sendo utilizado o c…
jonatassantoszup Jul 9, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
100 changes: 35 additions & 65 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,76 +1,46 @@
# Show me the code
# Desafio Santander Way

### # 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.

*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.
### # ETAPAS

* 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.
Faça o clone do projeto
Execute o comando
~~~~
mvn clean package
~~~~
Depois execute o docker apontando para o dockerfile da aplicação
~~~~
docker build -t .
docker run -d -p 8080:8080 -p 8983:8983 -e SOLR_HOME=/solr-cores -t santanderway:latest
~~~~
Caso o solr não tenha sido executado com sucesso, entre no bash e execute manualmente com o comando:
~~~~
./solr-8.1.1/bin/solr start -force
~~~~

### # Observações gerais
Agora você pode navegar pelo contrato da aplicação

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.
### # Link do Swagger
http://localhost:8080/swagger-ui.html

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.
### # Autenticação
Já possui dois usuários criados na aplicação, do qual a senha já está criptografada e guardada no solr

### # Importante: não há prazo de entrega, faça com qualidade!
### # Sistema
```
{
"email":"william2@email.com",
"senha":"william"
}
```
### # Cliente
```
{
"email":"william@email.com",
"senha":"william"
}
```

# BOA SORTE!
31 changes: 31 additions & 0 deletions testeSantanderWay/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**

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

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

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/

### VS Code ###
.vscode/
114 changes: 114 additions & 0 deletions testeSantanderWay/.mvn/wrapper/MavenWrapperDownloader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.Properties;

public class MavenWrapperDownloader {

/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL =
"https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";

/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";

/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";

/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";

public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());

// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if(mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if(mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: : " + url);

File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if(!outputFile.getParentFile().exists()) {
if(!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}

private static void downloadFileFromURL(String urlString, File destination) throws Exception {
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}

}
Binary file added testeSantanderWay/.mvn/wrapper/maven-wrapper.jar
Binary file not shown.
1 change: 1 addition & 0 deletions testeSantanderWay/.mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
7 changes: 7 additions & 0 deletions testeSantanderWay/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FROM solr:8.1.1
LABEL maintainer="jonatas.santos@zup.com.br"
COPY target/app-1.0.0.jar /app.jar
COPY --chown=solr target/classes/solr-cores /solr-cores
EXPOSE 8080
EXPOSE 8983
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
Loading