Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
721f118
created new branch and added project maven to project
samuelplima Dec 10, 2022
288e95e
added springboot to project
samuelplima Dec 10, 2022
ea6b1af
created entity products and also added H2 database dependency
samuelplima Dec 10, 2022
43a0f10
created service classes for products
samuelplima Dec 10, 2022
303d6fb
refactor product class added space
samuelplima Dec 10, 2022
a1c2a6e
created class product repository
samuelplima Dec 10, 2022
7116b2a
refactor moved entity products from package controller to package ent…
samuelplima Dec 10, 2022
2bd71bc
created class product controller
samuelplima Dec 10, 2022
5795116
created classes for customized exceptions
samuelplima Dec 10, 2022
0160cdb
added dependencies for swagger
samuelplima Dec 10, 2022
1bbd497
created class and implemented swagger configs
samuelplima Dec 10, 2022
ad13e64
created and implemented class product dto
samuelplima Dec 10, 2022
d2742f5
refactor excluded unused import
samuelplima Dec 10, 2022
229d309
created service methods in services and implemented empty methods in …
samuelplima Dec 10, 2022
729965b
added annotations @Service and @Repository to service and repository …
samuelplima Dec 10, 2022
cc0d9f0
refactor changed parameter order in JpaRepository extension
samuelplima Dec 10, 2022
402b637
implemented method create new product in product services
samuelplima Dec 10, 2022
b7ca5d3
implemented method find all products
samuelplima Dec 10, 2022
33e6f30
implemented get method in product controller
samuelplima Dec 10, 2022
94cd8d8
implemented post method create product in product controller
samuelplima Dec 10, 2022
62534cf
added configs in application properties
samuelplima Dec 10, 2022
e2bb814
refactor excluded unused variable
samuelplima Dec 10, 2022
284a13b
refactor changed Product DTO class
samuelplima Dec 10, 2022
0bb4d95
refactor created builder for products creation
samuelplima Dec 10, 2022
885ed02
refactor method name
samuelplima Dec 10, 2022
c5f43d9
refactor service method it was missing to save in the repository
samuelplima Dec 10, 2022
c8f9b6e
implementhed method find by id in services
samuelplima Dec 10, 2022
673cb6c
implementhed method find by id in controller
samuelplima Dec 10, 2022
0d1c3ec
implementhed method delete in product services
samuelplima Dec 10, 2022
38e2004
implementhed method delete in product controller
samuelplima Dec 10, 2022
99243ab
implementhed method update in product services
samuelplima Dec 10, 2022
de44aa9
implementhed method update in product controller
samuelplima Dec 10, 2022
7edb9b3
refactor changed entity class name
samuelplima Dec 10, 2022
2ac0f93
changed database configurations to dynamo db
samuelplima Dec 11, 2022
a89099c
created and implemented SQS configurations
samuelplima Dec 11, 2022
5129f23
refactor corrected queue name
samuelplima Dec 11, 2022
ee7ccff
implemented asynchronous processing in product creation with SQS
samuelplima Dec 11, 2022
238975f
refactor name changing
samuelplima Dec 11, 2022
30df035
added buildspec and dockerfile
samuelplima Dec 11, 2022
d258343
refactor removed println
samuelplima Dec 11, 2022
adad072
refactor changed buildspec file
samuelplima Dec 11, 2022
ed1b437
refactor changed buildspec file
samuelplima Dec 11, 2022
f9db81d
refactor changed buildspec file
samuelplima Dec 11, 2022
ccc2d9d
refactor changed buildspec file
samuelplima Dec 11, 2022
ed0a908
refactor corrected buildspec file to integrate aws codepipeline
samuelplima Dec 12, 2022
671429a
refactor corrected buildspec file to integrate aws codepipeline
samuelplima Dec 12, 2022
4b38020
refactor corrected Dockerfile
samuelplima Dec 12, 2022
9f07be3
refactor corrected Dockerfile
samuelplima Dec 12, 2022
8779ed8
refactor corrected container name
samuelplima Dec 12, 2022
05bfd6e
changed java image source
samuelplima Dec 12, 2022
30ec044
created documentation readme
samuelplima Dec 12, 2022
f4acbc2
refactor removed unused imports
samuelplima Dec 12, 2022
8f0cd88
changed method getAll return type to show product IDs thats gonna be …
samuelplima Dec 12, 2022
bd8e75c
changed readme
samuelplima Dec 12, 2022
338817a
changed readme
samuelplima Dec 12, 2022
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
8 changes: 8 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM public.ecr.aws/amazoncorretto/amazoncorretto:11
EXPOSE 81
ADD target/dorotech_teste-1.0-SNAPSHOT.jar dorotech_teste-1.0-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","/dorotech_teste-1.0-SNAPSHOT.jar"]
101 changes: 43 additions & 58 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,76 +1,61 @@
# Desafio Back End Java na DoroTech

Somos uma empresa com clientes que atuam em vários segmentos do mercado, com diferentes tecnologias, culturas e desafios.
### Documentação
```

Gostamos de compor nossos times com profissionais multidisciplinares, que tenham alta capacidade de aprendizado, sejam detalhistas, resilientes, questionadores e curiosos. Você, como Java Developer, será o responsável por implementar, dar manutenção, aplicar correções e propor soluções em projetos de software.
1. Desenvolvido aplicação CRUD para cadastro, recuperação, update e delete de produtos.

## Requisitos do desafio:
```
1. Criar um código que execute um CRUD(Create, Read, Update, Delete) em uma tabela para gerenciar produtos eletrônicos.
2. Use um banco NoSQL(DynamoDB é um diferencial).
3. Utilizar Spring como framework(Quarkus é um diferencial).
4. Dados da tabela a ser criada no banco:
- Products:
name,
description,
price,
amount.
2. Foi utilizado o Framework SpringBoot para desenvolvimento, java 11, Maven, Swagger e Lombok.

3. Os dados estão sendo persistidos no Banco de dados NOSQl DynamoDB, tambem estou utilizando Docker, ECR, ECS, fargate, CodeBuild e CodePipeline para deploy da aplicação.

Seja criativo! fazer o melhor não é ser complexo.
```
4. Utilizei processamento assincrono para criação de um novo produto, utilizando o SQS da AWS

## Dicas e Informações Valiosas
```
O que gostaríamos de ver em seu teste:
5. As variaveis de ambiente com as credenciais da AWS para testar a aplicação serão enviadas ao avaliador

6. A aplicação foi configurada para rodar na porta 8081, assim como a porta do container que esta sendo exposta é a porta 81

7. É possivil testar e verificar parte da documentação gerada pelo swagger no link gerado pelo mesmo quando rodando local: http://localhost:8081/swagger-ui.html#/

8. Como rodar manualmente:
- va ao diretorio raiz do projeto e acesse a pasta target
- em seguida abra no terminal a localização e entre com o seguinte comando
- mvn spring-boot:run
Obs: atente-se as variaveis de ambiente

Convenção de nome em classes, objetos, variáveis, métodos e etc.
Faça commits regulares. Eles são melhores do que um commit gigantesco. Gostaríamos de ver commits organizados e padronizados, então capriche neles!
Bônus 1 Quarkus & AWS, implementação de uma lambda AWS utilizando framework Quarkus
Bônus 2 Testes automatizados
Observação: Nenhum dos itens acima é obrigatório.

O que o seu Teste não deve ter:
Saber que não foi você quem implementou o projeto.
Várias bibliotecas instaladas sem uso.
Falta de organização de código.
Falta de documentação.
Nome de variáveis sem sentido ou sem padrão de nomes.
Histórico de commits desorganizado e despadronizado.

Boa Sorte!!
```
9. Acesso através da API publica : http://54.237.216.243:8081/ + rotas
Acesso atraǘes da API publica + Swagger : http://54.237.216.243:8081/swagger-ui.html#/

9. Caso deseje rodar via IDE recomendo fortemente o uso do Intellij, porem caso use outra IDE não deve encontrar grandes problemas pois todo o gerenciamento
de dependencias esta sendo feito pelo maven, basta apenas ter atenção ao detalhe do anotation processor do lombok e tambem adicionar as variaveis de ambiente


## Itens obrigatórios
```
1. Possibilitar a criação de um novo produto
2. Possibilitar consulta de todos os produtos no banco de dados.
3. Possibilitar consultar um produto específico pelo id.
4. Permitir a exclusão de um produto.
5. Persistir os dados na base.
```

## Itens desejáveis
### Métodos HTTP
```
1. Criação de Testes unitários.
2. Utilização de alguma ferramenta AWS(API Gateway, Lambda, SQS, SNS, EC2,..).
3. Docker.
4. Utilização de algum padrão de projeto.
--->>>Local
- Busca todos os produtos - GET : http://localhost:8081/products/getAllProducts
- Cria produto - POST : http://localhost:8081/products/createProduct
- Encontra produto por ID - GET : GET http://localhost:8081/products/getProductById/{{id}}
- Deleta produto por ID - DELETE : http://localhost:8081/products/deleteProduct/{{id}}
- Atualiza produto por ID - UPDATE : http://localhost:8081/products/updateProduct/{{id}}

```

### Instruções para entrega
### Funcionamento do programa
```
1. Fazer um fork desse repositório

2. Criar um branch com o seu primeiro e último nome
git checkout -b joao-silva

3. Escreva a documentação da sua aplicação
Você deve, substituir o conteúdo do arquivo README.md e escrever a documentação da sua aplicação, com os seguintes tópicos:
- Projeto: Descreva o projeto e como você o executou. Seja objetivo.
- Tecnologias: Descreva quais tecnologias foram utilizadas, enumerando versões (se necessário) e os links para suas documentações, quais bibliotecas instalou e porque.
Como compilar e rodar: Descreva como compilar e rodar sua aplicação.
OBS: Recomendo a utilização do Swagger para fins de testes manuais. Link Segue Acima

4. Faça uma Pull Request
Após implementada a solução, crie uma pull request com o seu projeto para esse repositório, avise o recrutador.
- Ao iniciar o programa localmente o mesmo ira rodar na porta local 8081 e necessitará das variaveis de ambiente para se conectar a AWS
e por fim se conectar ao DynamoDB e ao sistema de filas SQS
- Ja existe uma carga de dados no Banco então se ao iniciar o software e acessar o metodo GET /getAllProducts esse por sua vez deverá retornar os produtos do banco
- Para criar um produto isso deverá ser feito através do metodo POST /createProduct, a criação de produtos ocorrerá em background com o DTO do produto sendo enviado
para uma fila SQS, e só após a fila ser consumida esse novo produto será persistido no banco.
- Para fazer um update, primeiro deve-se saber o ID do produto em seguida atualizar as informação e então enviar a requisição.
- Para se fazer um delete também é necessário saber o ID do produto que se deseja excluir.

```


31 changes: 31 additions & 0 deletions buildspec.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
version: 0.2


phases:
pre_build:
commands:
- mvn clean install
- echo Logging in to Amazon ECR...
- aws --version
- aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 237601488461.dkr.ecr.us-east-1.amazonaws.com
- REPOSITORY_URI=237601488461.dkr.ecr.us-east-1.amazonaws.com/myrepository
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=build-$(echo $CODEBUILD_BUILD_ID | awk -F":" '{print $2}')
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t myrepository .
- docker tag myrepository:latest 237601488461.dkr.ecr.us-east-1.amazonaws.com/myrepository:latest
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker images...
- docker push 237601488461.dkr.ecr.us-east-1.amazonaws.com/myrepository:latest
- echo Writing image definitions file...
- printf '[{"name":"container","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
- cat imagedefinitions.json
artifacts:
files:
- imagedefinitions.json
- target/dorotech_teste-1.0-SNAPSHOT.jar
107 changes: 107 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
<?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>groupId</groupId>
<artifactId>dorotech_teste</artifactId>
<version>1.0-SNAPSHOT</version>

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

<properties>
<java.version>11</java.version>
</properties>

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

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

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

<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>

<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>

<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-dynamodb</artifactId>
<version>1.12.198</version>
</dependency>

<dependency>
<groupId>com.github.derjust</groupId>
<artifactId>spring-data-dynamodb</artifactId>
<version>5.1.0</version>
</dependency>

<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>amazon-sqs-java-messaging-lib</artifactId>
<version>1.0.8</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>

<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-sqs</artifactId>
<version>1.12.198</version>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>


</project>
15 changes: 15 additions & 0 deletions src/main/java/com/br/dorotech/app/DorotechApp.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.br.dorotech.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication
@EnableSwagger2
public class DorotechApp {

public static void main(String[] args) {
SpringApplication.run(DorotechApp.class, args);
}

}
44 changes: 44 additions & 0 deletions src/main/java/com/br/dorotech/app/configs/DynamoDbConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.br.dorotech.app.configs;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;


@Configuration
@EnableDynamoDBRepositories(basePackages = "com.br.dorotech.app.repositories")
public class DynamoDbConfig {

@Value("${amazon.dynamodb.endpoint}")
private String amazonDynamoDBEndpoint;

@Value("${amazon.aws.accesskey}")
private String amazonAWSAccessKey;

@Value("${amazon.aws.secretkey}")
private String amazonAWSSecretKey;

@Bean
public AmazonDynamoDB amazonDynamoDB() {
AmazonDynamoDB amazonDynamoDB
= new AmazonDynamoDBClient(amazonAWSCredentials());

if (!StringUtils.isEmpty(amazonDynamoDBEndpoint)) {
amazonDynamoDB.setEndpoint(amazonDynamoDBEndpoint);
}

return amazonDynamoDB;
}

@Bean
public AWSCredentials amazonAWSCredentials() {
return new BasicAWSCredentials(
amazonAWSAccessKey, amazonAWSSecretKey);
}
}
Loading