<repo_name>joao-arthur-moreira/mongodb-test<file_sep>/src/main/resources/application.properties
spring.data.mongodb.uri=mongodb://localhost/jajm
spring.data.mongodb.username=
spring.data.mongodb.password=<file_sep>/src/main/java/br/com/jajm/mongo/infra/repository/LancamentoRepository.java
package br.com.jajm.mongo.infra.repository;

import java.time.LocalDate;
import java.util.List;

import org.springframework.data.mongodb.repository.MongoRepository;

import br.com.jajm.mongo.domain.model.Lancamento;

public interface LancamentoRepository extends MongoRepository<Lancamento, String> {
	
	List<Lancamento> findByDescricaoContainingAndDataVencimentoBetween(String descricao, LocalDate davencimentoDe, LocalDate dataVencimentoAte);

}
<file_sep>/src/main/java/br/com/jajm/mongo/controller/LancamentoController.java
package br.com.jajm.mongo.controller;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import br.com.jajm.mongo.domain.model.Categoria;
import br.com.jajm.mongo.domain.model.Lancamento;
import br.com.jajm.mongo.domain.model.Pessoa;
import br.com.jajm.mongo.domain.model.filtros.FiltroLancamento;
import br.com.jajm.mongo.infra.repository.CategoriaRepository;
import br.com.jajm.mongo.infra.repository.LancamentoRepository;
import br.com.jajm.mongo.infra.repository.PessoaRepository;

@RestController
@RequestMapping(path = "/lancamentos")
@CrossOrigin
public class LancamentoController {
	
	@Autowired
	private LancamentoRepository lancamentoRepository;
	
	@Autowired
	private CategoriaRepository categoriaRepository;
	
	@Autowired
	private PessoaRepository pessoaRepository;
	
	@GetMapping
	public Page<Lancamento> listarTodos(Pageable pageable) {
		return lancamentoRepository.findAll(pageable);
	}
	
	@GetMapping("/resumo")
	public List<Lancamento> filtrar(FiltroLancamento filtroLancamento) {
		return lancamentoRepository.findByDescricaoContainingAndDataVencimentoBetween(filtroLancamento.getDescricao(), 
				filtroLancamento.getDataVencimentoDe(), filtroLancamento.getDataVencimentoAte());
	}
	
	@GetMapping("/{codigo}")
	public ResponseEntity<Lancamento> porCodigo(@PathVariable String codigo) {
		Optional<Lancamento> lancamentoOptional = lancamentoRepository.findById(codigo);
		return lancamentoOptional.isPresent() ? 
				ResponseEntity
				.ok(lancamentoOptional.get()) : 
			ResponseEntity.notFound().build();
	}
	
	@PostMapping
	@ResponseStatus( value = HttpStatus.CREATED )
	public Lancamento adicionar(@RequestBody Lancamento lancamento) {
		Optional<Pessoa> pessoaOptional = pessoaRepository.findById(lancamento.getPessoa().getCodigo());
		Optional<Categoria> categoriaOptional = categoriaRepository.findById(lancamento.getCategoria().getCodigo());
		
		lancamento.setPessoa(pessoaOptional.get());
		lancamento.setCategoria(categoriaOptional.get());
		
		return lancamentoRepository.save(lancamento);
	}
	
	@DeleteMapping("/{codigo}")
	public ResponseEntity<?> remover(@PathVariable String codigo) {
		Optional<Lancamento> lancamentoOptional = lancamentoRepository.findById(codigo);
		if (lancamentoOptional.isPresent()) {			
			lancamentoRepository.deleteById(codigo);
			return ResponseEntity.noContent().build();
		} else {
			return ResponseEntity.notFound().build();
		}
	}
	
	@PutMapping
	public Lancamento atualizar(@RequestBody Lancamento lancamento) {
		return lancamentoRepository.save(lancamento);
	}

}
<file_sep>/src/main/java/br/com/jajm/mongo/controller/PessoaController.java
package br.com.jajm.mongo.controller;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import br.com.jajm.mongo.domain.model.Pessoa;
import br.com.jajm.mongo.infra.repository.PessoaRepository;

@RestController
@RequestMapping(path = "/pessoas")
@CrossOrigin
public class PessoaController {
	
	@Autowired
	private PessoaRepository pessoaRepository;
	
	@GetMapping
	public List<Pessoa> listarTodas() {
		return pessoaRepository.findAll();
	}
	
	@GetMapping("/por-nome")
	public List<Pessoa> listarPorNome(String nome) {
		return pessoaRepository.findByNomeContainingIgnoreCase(nome);
	}
	
	@GetMapping("/{codigo}")
	public ResponseEntity<Pessoa> porCodigo(@PathVariable String codigo) {
		Optional<Pessoa> pessoaOptional = pessoaRepository.findById(codigo);
		return pessoaOptional.isPresent() ? 
				ResponseEntity
				.ok(pessoaOptional.get()) : 
			ResponseEntity.notFound().build();
	}
	
	@PostMapping
	@ResponseStatus(value = HttpStatus.CREATED)
	public Pessoa adicionar(@RequestBody Pessoa pessoa) {
		return pessoaRepository.save(pessoa);
	}
	
	@DeleteMapping("/{codigo}")	
	public ResponseEntity<?> remover(@PathVariable String codigo) {
		Optional<Pessoa> pessoaOptional = pessoaRepository.findById(codigo);
		if (pessoaOptional.isPresent()) {			
			pessoaRepository.deleteById(codigo);
			return ResponseEntity.noContent().build();
		} else {
			return ResponseEntity.notFound().build();
		}
	}
	
	@PutMapping
	public Pessoa atualizar(@RequestBody Pessoa pessoa) {
		return pessoaRepository.save(pessoa);
	}
	
	@PutMapping("/{codigo}/ativar")
	@ResponseStatus(value = HttpStatus.NO_CONTENT)
	public void ativar(@PathVariable String codigo) {
		ativarInativar(codigo, true);
	}
	
	@PutMapping("/{codigo}/inativar")
	@ResponseStatus(value = HttpStatus.NO_CONTENT)
	public void inativar(@PathVariable String codigo) {
		ativarInativar(codigo, false);
	}

	private void ativarInativar(String codigo, boolean status) {
		Optional<Pessoa> pessoaOptional = pessoaRepository.findById(codigo);
		Pessoa pessoa = pessoaOptional.get();
		pessoa.setStatus(status);
		
		pessoaRepository.save(pessoa);
	}

}
<file_sep>/src/main/java/br/com/jajm/mongo/domain/model/Categoria.java
package br.com.jajm.mongo.domain.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import lombok.Data;

@Data
@Document
public class Categoria {
	
	@Id
	private String codigo;
	
	private String nome;

}
<file_sep>/src/main/java/br/com/jajm/mongo/infra/repository/PessoaRepository.java
package br.com.jajm.mongo.infra.repository;

import java.util.List;

import org.springframework.data.mongodb.repository.MongoRepository;

import br.com.jajm.mongo.domain.model.Pessoa;

public interface PessoaRepository extends MongoRepository<Pessoa, String> {
	
	List<Pessoa> findByNomeContainingIgnoreCase(String nome);

}
<file_sep>/src/main/java/br/com/jajm/mongo/domain/model/Pessoa.java
package br.com.jajm.mongo.domain.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import lombok.Data;

@Data
@Document
public class Pessoa {
	
	@Id
	private String codigo;
	
	private String nome;
	
	private Boolean status;
	
	private String cidade;
	private String estado;
	private String logradouro;
	private String numero;
	private String complemento;
	private String bairro;
	private String cep;

}
