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
37 changes: 37 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

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

### VS Code ###
.vscode/
4 changes: 4 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM openjdk:19
COPY build/libs/*.jar app.jar
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "app.jar"]
90 changes: 20 additions & 70 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,76 +1,26 @@
# Desafio Back End Java na DoroTech
# 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.
### Projeto
Desenvolvimento de uma API REST para o gerenciamento de produtos eletrônicos com Spring Webflux e MongoDB.
### Tecnologias
- Java 19
- Spring 3.0.0
- Lombok
- Gradle para gerenciamento de dependências
- MapStruct para a conversão entre classes do domínio e DTOs
- Testes automatizados com Mockito e WebTestClient
- Banco de dados NoSQL MongoDB Atlas
- Swagger e OpenAPI para documentação da API.
- Docker e Amazon ECS para o deploy da aplicação.
### Como executar o projeto:

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.
Para acessar o projeto é possível seguir as seguintes alternativas:
1. Realizar o download da [imagem docker](https://hub.docker.com/repository/docker/ferreirabrunomarcelo/product-service) e executar os seguintes comandos:

## 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.
a. `docker pull ferreirabrunomarcelo/product-service:latest`

b. `docker run --publish 8081:8081 ferreirabrunomarcelo/product-service`

Seja criativo! fazer o melhor não é ser complexo.
```
c. acessar pelo navegador a URI `http://localhost:8081/swagger-ui.html`

## Dicas e Informações Valiosas
```
O que gostaríamos de ver em seu teste:

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!!
```

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

### Instruções para entrega
```
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.

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.
```
2. Acessar a API por meio do IP público do [Amazon ECS](http://177.71.160.52:8081/swagger-ui.html).
35 changes: 35 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.0'
id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.ferreirabrunomarcelo'
version = '0.0.1-SNAPSHOT'

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
implementation 'org.mapstruct:mapstruct:1.5.3.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.3.Final'
implementation 'org.springdoc:springdoc-openapi:2.0.0'
implementation 'org.springdoc:springdoc-openapi-starter-webflux-ui:2.0.0'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.projectreactor:reactor-test'
}

tasks.named('test') {
useJUnitPlatform()
}
1 change: 1 addition & 0 deletions product-service
Submodule product-service added at 89f533
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.ferreirabrunomarcelo.productapi;

import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Info;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@OpenAPIDefinition(info = @Info(
title = "Products API",
version = "1.0",
description = "API for electronic product management"
))
public class ProductApiApplication {

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

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.ferreirabrunomarcelo.productapi.configurations;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.config.CorsRegistry;
import org.springframework.web.reactive.config.EnableWebFlux;
import org.springframework.web.reactive.config.WebFluxConfigurer;

@Configuration
@EnableWebFlux
public class CORSConfiguration implements WebFluxConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.ferreirabrunomarcelo.productapi.configurations;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.ReactiveMongoDatabaseFactory;
import org.springframework.data.mongodb.config.MongoConfigurationSupport;
import org.springframework.data.mongodb.core.convert.*;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;


@Configuration
@EnableMongoRepositories
public class MongoDBConfiguration extends MongoConfigurationSupport {

@Value("${spring.data.mongodb.database}")
private String database;

@Bean
public MappingMongoConverter mappingMongoConverter(ReactiveMongoDatabaseFactory databaseFactory,
MongoCustomConversions customConversions, MongoMappingContext mappingContext) {

MappingMongoConverter converter = new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext);
converter.setCustomConversions(customConversions);
converter.setCodecRegistryProvider(databaseFactory);
converter.setTypeMapper(new DefaultMongoTypeMapper(null));

return converter;
}

@Override
protected String getDatabaseName() {
return database;
}
}
Loading