diff --git a/README.md b/README.md
index da232f4..1d2779b 100644
--- a/README.md
+++ b/README.md
@@ -47,3 +47,16 @@ Use o seguinte comando para iniciar o servidor:
Opcionais:
- Docker([guia](https://docs.docker.com/))
+
+## Endpoints criados
+
+| Verbo | Endpoint | Ação |
+|--------|-------------------------------|----------------------------------------------------------------|
+| GET | usuario | Pegar todos os usuários cadastrados |
+| POST | usuario | Criar um usuário |
+| PUT | usuario | Atualizar um usuário |
+| DELETE | ussuario/{id} | Apagar um usuário |
+| GET | usuario/aniversariantes/{mes} | Pegar todos os usuários que fazem aniversário no {mes} passado |
+| GET | usuario/comeca-com/{letra} | Pegar todos os usuários que tem nome que inicia com a {letra} |
+| GET | usuario/provedores-emails | Pegar todos os provedores de email dos usuários cadastrados |
+| GET | usuario/{id} | Pegar um usuário pelo {id} passado |
diff --git a/src/main/java/com/stefanini/dao/GenericDAO.java b/src/main/java/com/stefanini/dao/GenericDAO.java
index d68fc9a..9c50b27 100644
--- a/src/main/java/com/stefanini/dao/GenericDAO.java
+++ b/src/main/java/com/stefanini/dao/GenericDAO.java
@@ -22,8 +22,9 @@ public GenericDAO() {
}
@Transactional
- public void save(T t){
+ public T save(T t){
em.persist(t);
+ return t;
}
public T findById(I id){
diff --git a/src/main/java/com/stefanini/dto/UsuarioCompletoDto.java b/src/main/java/com/stefanini/dto/UsuarioCompletoDto.java
new file mode 100644
index 0000000..1c37cc4
--- /dev/null
+++ b/src/main/java/com/stefanini/dto/UsuarioCompletoDto.java
@@ -0,0 +1,127 @@
+package com.stefanini.dto;
+
+import java.time.LocalDate;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.stefanini.model.Usuario;
+import com.stefanini.util.CheckPasswordValidator;
+
+public class UsuarioCompletoDto {
+
+ public UsuarioCompletoDto(){
+
+ }
+
+ public UsuarioCompletoDto(Usuario usuario){
+ this.id = usuario.getId();
+ this.nome = usuario.getNome();
+ this.login = usuario.getLogin();
+ this.senha = usuario.getSenha();
+ this.email = usuario.getEmail();
+ this.dataNascimento = usuario.getDataNascimento();
+ }
+
+ private Long id;
+
+ @Size(max = 50)
+ @NotBlank
+ private String nome;
+
+ @Size(min = 5,max = 20)
+ @NotBlank
+ private String login;
+
+ @Size(min = 4,max = 10)
+ @NotBlank
+ @Pattern(regexp = CheckPasswordValidator.PASSWORD_VALIDATOR,message = CheckPasswordValidator.SENHA_FORA_DO_PADRAO)
+ private String senha;
+
+ @Size(min = 10)
+ @NotBlank
+ @Email
+ private String email;
+
+ @JsonFormat(pattern = "dd/MM/yyyy")
+ private LocalDate dataNascimento;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getNome() {
+ return nome;
+ }
+
+ public void setNome(String nome) {
+ this.nome = nome;
+ }
+
+ public String getLogin() {
+ return login;
+ }
+
+ public void setLogin(String login) {
+ this.login = login;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getSenha() {
+ return senha;
+ }
+
+ public void setSenha(String senha) {
+ this.senha = senha;
+ }
+
+ public LocalDate getDataNascimento() {
+ return dataNascimento;
+ }
+
+ public void setDataNascimento(LocalDate dataNascimento) {
+ this.dataNascimento = dataNascimento;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ UsuarioCompletoDto other = (UsuarioCompletoDto) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+
+
+}
diff --git a/src/main/java/com/stefanini/dto/UsuarioDto.java b/src/main/java/com/stefanini/dto/UsuarioDto.java
new file mode 100644
index 0000000..960071d
--- /dev/null
+++ b/src/main/java/com/stefanini/dto/UsuarioDto.java
@@ -0,0 +1,85 @@
+package com.stefanini.dto;
+
+import java.time.LocalDate;
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.stefanini.model.Usuario;
+
+public class UsuarioDto {
+
+ public UsuarioDto(){
+
+ }
+
+ public UsuarioDto(Usuario usuario){
+ this.id = usuario.getId();
+ this.nome = usuario.getNome();
+ this.login = usuario.getLogin();
+ this.email = usuario.getEmail();
+ this.dataNascimento = usuario.getDataNascimento();
+ }
+
+ private Long id;
+
+ @Size(max = 50)
+ @NotBlank
+ private String nome;
+
+ @Size(min = 5,max = 20)
+ @NotBlank
+ private String login;
+
+
+ @Size(min = 10)
+ @NotBlank
+ @Email
+ private String email;
+
+ @JsonFormat(pattern = "dd/MM/yyyy")
+ private LocalDate dataNascimento;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getNome() {
+ return nome;
+ }
+
+ public void setNome(String nome) {
+ this.nome = nome;
+ }
+
+ public String getLogin() {
+ return login;
+ }
+
+ public void setLogin(String login) {
+ this.login = login;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public LocalDate getDataNascimento() {
+ return dataNascimento;
+ }
+
+ public void setDataNascimento(LocalDate dataNascimento) {
+ this.dataNascimento = dataNascimento;
+ }
+
+
+
+}
diff --git a/src/main/java/com/stefanini/exception/MesNaoExisteException.java b/src/main/java/com/stefanini/exception/MesNaoExisteException.java
new file mode 100644
index 0000000..4a0ff78
--- /dev/null
+++ b/src/main/java/com/stefanini/exception/MesNaoExisteException.java
@@ -0,0 +1,15 @@
+package com.stefanini.exception;
+
+import javax.ws.rs.WebApplicationException;
+
+public class MesNaoExisteException extends WebApplicationException {
+ public MesNaoExisteException() {
+ super();
+ }
+ public MesNaoExisteException(String msg) {
+ super(msg);
+ }
+ public MesNaoExisteException(String msg, WebApplicationException e) {
+ super(msg, e);
+ }
+}
diff --git a/src/main/java/com/stefanini/exception/MesNaoExisteMapper.java b/src/main/java/com/stefanini/exception/MesNaoExisteMapper.java
new file mode 100644
index 0000000..cd30e6e
--- /dev/null
+++ b/src/main/java/com/stefanini/exception/MesNaoExisteMapper.java
@@ -0,0 +1,16 @@
+package com.stefanini.exception;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class MesNaoExisteMapper implements ExceptionMapper {
+
+ @Override
+ public Response toResponse(MesNaoExisteException exception) {
+ return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();
+ }
+
+}
diff --git a/src/main/java/com/stefanini/exception/TextoComMaisDeUmaLetraException.java b/src/main/java/com/stefanini/exception/TextoComMaisDeUmaLetraException.java
new file mode 100644
index 0000000..874762b
--- /dev/null
+++ b/src/main/java/com/stefanini/exception/TextoComMaisDeUmaLetraException.java
@@ -0,0 +1,15 @@
+package com.stefanini.exception;
+
+import javax.ws.rs.WebApplicationException;
+
+public class TextoComMaisDeUmaLetraException extends WebApplicationException {
+ public TextoComMaisDeUmaLetraException() {
+ super();
+ }
+ public TextoComMaisDeUmaLetraException(String msg) {
+ super(msg);
+ }
+ public TextoComMaisDeUmaLetraException(String msg, WebApplicationException e) {
+ super(msg, e);
+ }
+}
diff --git a/src/main/java/com/stefanini/exception/TextoComMaisDeUmaLetraMapper.java b/src/main/java/com/stefanini/exception/TextoComMaisDeUmaLetraMapper.java
new file mode 100644
index 0000000..163878a
--- /dev/null
+++ b/src/main/java/com/stefanini/exception/TextoComMaisDeUmaLetraMapper.java
@@ -0,0 +1,16 @@
+package com.stefanini.exception;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class TextoComMaisDeUmaLetraMapper implements ExceptionMapper {
+
+ @Override
+ public Response toResponse(TextoComMaisDeUmaLetraException exception) {
+ return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();
+ }
+
+}
diff --git a/src/main/java/com/stefanini/exception/UsuarioIdNaoExisteException.java b/src/main/java/com/stefanini/exception/UsuarioIdNaoExisteException.java
new file mode 100644
index 0000000..ee8335f
--- /dev/null
+++ b/src/main/java/com/stefanini/exception/UsuarioIdNaoExisteException.java
@@ -0,0 +1,15 @@
+package com.stefanini.exception;
+
+import javax.ws.rs.WebApplicationException;
+
+public class UsuarioIdNaoExisteException extends WebApplicationException {
+ public UsuarioIdNaoExisteException() {
+ super();
+ }
+ public UsuarioIdNaoExisteException(String msg) {
+ super(msg);
+ }
+ public UsuarioIdNaoExisteException(String msg, WebApplicationException e) {
+ super(msg, e);
+ }
+}
diff --git a/src/main/java/com/stefanini/exception/UsuarioIdNaoExisteMapper.java b/src/main/java/com/stefanini/exception/UsuarioIdNaoExisteMapper.java
new file mode 100644
index 0000000..73b3762
--- /dev/null
+++ b/src/main/java/com/stefanini/exception/UsuarioIdNaoExisteMapper.java
@@ -0,0 +1,16 @@
+package com.stefanini.exception;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class UsuarioIdNaoExisteMapper implements ExceptionMapper {
+
+ @Override
+ public Response toResponse(UsuarioIdNaoExisteException exception) {
+ return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();
+ }
+
+}
diff --git a/src/main/java/com/stefanini/exception/UsuarioLoginJaExisteException.java b/src/main/java/com/stefanini/exception/UsuarioLoginJaExisteException.java
new file mode 100644
index 0000000..71f8d70
--- /dev/null
+++ b/src/main/java/com/stefanini/exception/UsuarioLoginJaExisteException.java
@@ -0,0 +1,15 @@
+package com.stefanini.exception;
+
+import javax.ws.rs.WebApplicationException;
+
+public class UsuarioLoginJaExisteException extends WebApplicationException {
+ public UsuarioLoginJaExisteException() {
+ super();
+ }
+ public UsuarioLoginJaExisteException(String msg) {
+ super(msg);
+ }
+ public UsuarioLoginJaExisteException(String msg, WebApplicationException e) {
+ super(msg, e);
+ }
+}
diff --git a/src/main/java/com/stefanini/exception/UsuarioLoginJaExisteMapper.java b/src/main/java/com/stefanini/exception/UsuarioLoginJaExisteMapper.java
new file mode 100644
index 0000000..6bb771e
--- /dev/null
+++ b/src/main/java/com/stefanini/exception/UsuarioLoginJaExisteMapper.java
@@ -0,0 +1,16 @@
+package com.stefanini.exception;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class UsuarioLoginJaExisteMapper implements ExceptionMapper {
+
+ @Override
+ public Response toResponse(UsuarioLoginJaExisteException exception) {
+ return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();
+ }
+
+}
diff --git a/src/main/java/com/stefanini/exception/ValidationMapper.java b/src/main/java/com/stefanini/exception/ValidationMapper.java
new file mode 100644
index 0000000..e1f66fd
--- /dev/null
+++ b/src/main/java/com/stefanini/exception/ValidationMapper.java
@@ -0,0 +1,17 @@
+package com.stefanini.exception;
+
+import javax.validation.ValidationException;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class ValidationMapper implements ExceptionMapper {
+
+ @Override
+ public Response toResponse(ValidationException exception) {
+ return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();
+ }
+
+}
diff --git a/src/main/java/com/stefanini/model/Usuario.java b/src/main/java/com/stefanini/model/Usuario.java
new file mode 100644
index 0000000..ceed9d5
--- /dev/null
+++ b/src/main/java/com/stefanini/model/Usuario.java
@@ -0,0 +1,189 @@
+package com.stefanini.model;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.PrePersist;
+import javax.persistence.PreUpdate;
+import javax.persistence.Table;
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import com.stefanini.dto.UsuarioCompletoDto;
+import com.stefanini.dto.UsuarioDto;
+
+@Entity
+@Table(name = "tb_usuario")
+public class Usuario {
+
+ public Usuario(){
+
+ }
+
+ public Usuario(String nome, String login, String email, String senha, LocalDate dataNascimento) {
+ this.nome = nome;
+ this.login = login;
+ this.email = email;
+ this.senha = senha;
+ this.dataNascimento = dataNascimento;
+ }
+
+ public Usuario(UsuarioCompletoDto usuarioCompletoDto){
+ this.id = usuarioCompletoDto.getId();
+ this.nome = usuarioCompletoDto.getNome();
+ this.login = usuarioCompletoDto.getLogin();
+ this.email = usuarioCompletoDto.getEmail();
+ this.senha = usuarioCompletoDto.getSenha();
+ this.dataNascimento = usuarioCompletoDto.getDataNascimento();
+ }
+
+
+ public Usuario(UsuarioDto usuarioDto){
+ this.id = usuarioDto.getId();
+ this.nome = usuarioDto.getNome();
+ this.login = usuarioDto.getLogin();
+ this.email = usuarioDto.getEmail();
+ this.dataNascimento = usuarioDto.getDataNascimento();
+ }
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Size(max = 50)
+ @NotBlank
+ @Column(nullable = false)
+ private String nome;
+
+ @Size(min = 5,max = 20)
+ @NotBlank
+ @Column(nullable = false,unique = true)
+ private String login;
+
+ @Size(min = 10)
+ @NotBlank
+ @Email
+ @Column(nullable = false)
+ private String email;
+
+ @NotBlank
+ @Column(nullable = false)
+ private String senha;
+
+ @Column
+ private LocalDate dataNascimento;
+
+ @NotNull
+ @Column
+ private LocalDateTime dataCriacao;
+
+ @Column
+ private LocalDateTime dataAtualizacao;
+
+ @PrePersist
+ public void prePersist() {
+ dataCriacao = LocalDateTime.now();
+ dataAtualizacao = LocalDateTime.now();
+ }
+
+ @PreUpdate
+ public void preUpdate() {
+ dataAtualizacao = LocalDateTime.now();
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getNome() {
+ return nome;
+ }
+
+ public void setNome(String nome) {
+ this.nome = nome;
+ }
+
+ public String getLogin() {
+ return login;
+ }
+
+ public void setLogin(String login) {
+ this.login = login;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getSenha() {
+ return senha;
+ }
+
+ public void setSenha(String senha) {
+ this.senha = senha;
+ }
+
+ public LocalDate getDataNascimento() {
+ return dataNascimento;
+ }
+
+ public void setDataNascimento(LocalDate dataNascimento) {
+ this.dataNascimento = dataNascimento;
+ }
+
+ public LocalDateTime getDataCriacao() {
+ return dataCriacao;
+ }
+
+ public void setDataCriacao(LocalDateTime dataCriacao) {
+ this.dataCriacao = dataCriacao;
+ }
+
+ public LocalDateTime getDataAtualizacao() {
+ return dataAtualizacao;
+ }
+
+ public void setDataAtualizacao(LocalDateTime dataAtualizacao) {
+ this.dataAtualizacao = dataAtualizacao;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Usuario other = (Usuario) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+}
diff --git a/src/main/java/com/stefanini/repository/UsuarioRepository.java b/src/main/java/com/stefanini/repository/UsuarioRepository.java
new file mode 100644
index 0000000..da178ec
--- /dev/null
+++ b/src/main/java/com/stefanini/repository/UsuarioRepository.java
@@ -0,0 +1,34 @@
+package com.stefanini.repository;
+
+import java.util.List;
+import javax.enterprise.context.ApplicationScoped;
+import javax.persistence.NoResultException;
+import com.stefanini.dao.GenericDAO;
+import com.stefanini.model.Usuario;
+
+@ApplicationScoped
+public class UsuarioRepository extends GenericDAO {
+
+ public Usuario findByLogin(String login) {
+ try{
+ return this.createQuery("SELECT u from Usuario u where u.login = :login")
+ .setParameter("login", login)
+ .getSingleResult();
+ } catch(NoResultException e){
+ return null;
+ }
+ }
+
+ public List listAllBirthdaysUsersFromMonth(int month){
+ return this.createQuery("SELECT u from Usuario u where month(u.dataNascimento) = :month")
+ .setParameter("month", month)
+ .getResultList();
+ }
+
+ public List listAllUsersNameStartsWith(String startsWith){
+ return this.createQuery("SELECT u from Usuario u where LOWER(u.nome) like LOWER(:pattern)")
+ .setParameter("pattern", startsWith+"%")
+ .getResultList();
+ }
+
+}
diff --git a/src/main/java/com/stefanini/resources/HelloWorldResource.java b/src/main/java/com/stefanini/resources/HelloWorldResource.java
deleted file mode 100644
index 8eda644..0000000
--- a/src/main/java/com/stefanini/resources/HelloWorldResource.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.stefanini.resources;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-
-@Path("/hello-world")
-public class HelloWorldResource {
-
- @GET
- @Produces("text/plain")
- public String hello() {
- return "Hello, World!";
- }
-
-}
diff --git a/src/main/java/com/stefanini/resources/UsuarioResource.java b/src/main/java/com/stefanini/resources/UsuarioResource.java
new file mode 100644
index 0000000..5c22fb8
--- /dev/null
+++ b/src/main/java/com/stefanini/resources/UsuarioResource.java
@@ -0,0 +1,76 @@
+package com.stefanini.resources;
+
+import javax.inject.Inject;
+import javax.validation.Valid;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.GET;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.Produces;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import com.stefanini.dto.UsuarioCompletoDto;
+import com.stefanini.exception.MesNaoExisteException;
+import com.stefanini.exception.TextoComMaisDeUmaLetraException;
+import com.stefanini.exception.UsuarioIdNaoExisteException;
+import com.stefanini.exception.UsuarioLoginJaExisteException;
+import com.stefanini.service.UsuarioService;
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Path("usuario")
+public class UsuarioResource {
+
+ @Inject
+ private UsuarioService usuarioService;
+
+ @POST
+ public Response save(@Valid UsuarioCompletoDto usuario) throws UsuarioLoginJaExisteException{
+ return Response.status(Status.CREATED).entity(usuarioService.save(usuario)).build();
+ }
+
+ @PUT
+ public Response update(@Valid UsuarioCompletoDto usuario) throws UsuarioLoginJaExisteException,UsuarioIdNaoExisteException{
+ return Response.status(Status.CREATED).entity(usuarioService.update(usuario)).build();
+ }
+
+ @GET
+ public Response listAll(){
+ return Response.status(Status.OK).entity(usuarioService.listAll()).build();
+ }
+
+ @GET
+ @Path("/{id}")
+ public Response findById(@PathParam(value = "id") Long id) throws UsuarioIdNaoExisteException{
+ return Response.status(Status.OK).entity(usuarioService.findById(id)).build();
+ }
+
+ @DELETE
+ @Path("/{id}")
+ public Response delete(@PathParam(value = "id") Long id) throws UsuarioIdNaoExisteException{
+ usuarioService.delete(id);
+ return Response.noContent().build();
+ }
+
+ @GET
+ @Path("/aniversariantes/{mes}")
+ public Response listAllBirthdaysUsersFromMonth(@PathParam(value = "mes") int mes) throws MesNaoExisteException{
+ return Response.status(Status.OK).entity(usuarioService.listAllBirthdaysUsersFromMonth(mes)).build();
+ }
+
+ @GET
+ @Path("/provedores-emails")
+ public Response listAllUsersEmailProviders() {
+ return Response.status(Status.OK).entity(usuarioService.listAllUsersEmailProviders()).build();
+ }
+
+ @GET
+ @Path("/comeca-com/{letra}")
+ public Response listAllUsersNameStartsWith(@PathParam(value = "letra") String letra) throws TextoComMaisDeUmaLetraException{
+ return Response.status(Status.OK).entity(usuarioService.listAllUsersNameStartsWith(letra)).build();
+ }
+}
diff --git a/src/main/java/com/stefanini/service/UsuarioService.java b/src/main/java/com/stefanini/service/UsuarioService.java
new file mode 100644
index 0000000..4ff78a8
--- /dev/null
+++ b/src/main/java/com/stefanini/service/UsuarioService.java
@@ -0,0 +1,128 @@
+package com.stefanini.service;
+
+import java.util.HashSet;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+
+import com.stefanini.dto.UsuarioCompletoDto;
+import com.stefanini.dto.UsuarioDto;
+import com.stefanini.exception.MesNaoExisteException;
+import com.stefanini.exception.TextoComMaisDeUmaLetraException;
+import com.stefanini.exception.UsuarioIdNaoExisteException;
+import com.stefanini.exception.UsuarioLoginJaExisteException;
+import com.stefanini.model.Usuario;
+import com.stefanini.repository.UsuarioRepository;
+import com.stefanini.util.Base64Util;
+
+@ApplicationScoped
+public class UsuarioService {
+
+ @Inject
+ private UsuarioRepository usuarioRepository;
+
+ public List listAll() {
+ return usuarioRepository.listAll()
+ .stream()
+ .map(u -> new UsuarioDto(u))
+ .collect(Collectors.toList());
+ }
+
+ public UsuarioCompletoDto findById(Long id) {
+ Usuario usuario = usuarioRepository.findById(id);
+ if(!Objects.nonNull(usuario)){
+ throw new UsuarioIdNaoExisteException("O id informado não existe!");
+ }
+ UsuarioCompletoDto usuarioCompletoDto = new UsuarioCompletoDto(usuario);
+ usuarioCompletoDto.setSenha(Base64Util.decode(usuarioCompletoDto.getSenha()));
+ return usuarioCompletoDto;
+ }
+
+ public UsuarioDto save(UsuarioCompletoDto usuarioCompletoDto) throws UsuarioLoginJaExisteException{
+ if(temLoginUsuario(usuarioCompletoDto.getLogin())){
+ throw new UsuarioLoginJaExisteException("O login informado ja existe!");
+ }
+
+ Usuario novoUsuario = new Usuario(usuarioCompletoDto);
+ novoUsuario.setSenha(Base64Util.encode(novoUsuario.getSenha()));
+ return new UsuarioDto(usuarioRepository.save(novoUsuario));
+ }
+
+ public void delete(Long id) throws UsuarioIdNaoExisteException {
+ if(!temIdUsuario(id)){
+ throw new UsuarioIdNaoExisteException("O id informado não existe!");
+ }
+ usuarioRepository.delete(id);
+ }
+
+ public UsuarioDto update(UsuarioCompletoDto usuarioCompletoDto) throws UsuarioLoginJaExisteException,UsuarioIdNaoExisteException {
+ Usuario usuarioLogin = usuarioRepository.findByLogin(usuarioCompletoDto.getLogin());
+ if(!usuarioCompletoDto.getId().equals(usuarioLogin.getId()) && usuarioCompletoDto.getLogin().equals(usuarioLogin.getLogin())){
+ throw new UsuarioLoginJaExisteException("O login informado ja existe!");
+ }
+ Usuario usuarioPreUpdate = usuarioRepository.findById(usuarioCompletoDto.getId());
+ if(!Objects.nonNull(usuarioPreUpdate)){
+ throw new UsuarioIdNaoExisteException("O id informado não existe!");
+ }
+
+ Usuario editaUsuario = new Usuario(usuarioCompletoDto);
+ editaUsuario.setSenha(Base64Util.encode(editaUsuario.getSenha()));
+ editaUsuario.setDataCriacao(usuarioPreUpdate.getDataCriacao());
+ return new UsuarioDto(usuarioRepository.update(editaUsuario));
+ }
+
+
+ public List listAllBirthdaysUsersFromMonth(int month) throws MesNaoExisteException{
+ if(!mesExiste(month)){
+ throw new MesNaoExisteException("O mês informado não existe!");
+ }
+ return usuarioRepository.listAllBirthdaysUsersFromMonth(month)
+ .stream()
+ .map(u -> new UsuarioDto(u))
+ .collect(Collectors.toList());
+ }
+
+ public List listAllUsersEmailProviders(){
+ List emails = this.listAll().stream().map(u -> u.getEmail()).collect(Collectors.toList());
+ Set providers = new HashSet();
+ emails.stream().forEach(e -> {
+ int position = e.indexOf("@");
+ String provider = e.substring(position);
+ providers.add(provider);
+
+ });
+ return new ArrayList(providers);
+ }
+
+ public List listAllUsersNameStartsWith(String startsWith) throws TextoComMaisDeUmaLetraException{
+ if(!temApenasUmCaractere(startsWith)){
+ throw new TextoComMaisDeUmaLetraException("O texto enviado possui mais de um caractere!");
+ }
+
+ return usuarioRepository.listAllUsersNameStartsWith(startsWith)
+ .stream()
+ .map(u -> new UsuarioDto(u))
+ .collect(Collectors.toList());
+ }
+
+ private boolean temLoginUsuario(String login){
+ return Objects.nonNull(usuarioRepository.findByLogin(login));
+ }
+
+ private boolean temIdUsuario(Long id){
+ return Objects.nonNull(usuarioRepository.findById(id));
+ }
+
+ private boolean temApenasUmCaractere(String string){
+ return string.length() == 1 ;
+ }
+
+ private boolean mesExiste(int mes){
+ return mes >= 1 && mes <= 12;
+ }
+}
diff --git a/src/main/java/com/stefanini/util/Base64Util.java b/src/main/java/com/stefanini/util/Base64Util.java
new file mode 100644
index 0000000..3b6de98
--- /dev/null
+++ b/src/main/java/com/stefanini/util/Base64Util.java
@@ -0,0 +1,13 @@
+package com.stefanini.util;
+
+import java.util.Base64;
+
+public class Base64Util {
+ public static String encode(String string){
+ return Base64.getEncoder().encodeToString(string.getBytes());
+ }
+
+ public static String decode(String string){
+ return new String(Base64.getDecoder().decode(string));
+ }
+}
diff --git a/src/main/java/com/stefanini/util/CheckPasswordValidator.java b/src/main/java/com/stefanini/util/CheckPasswordValidator.java
new file mode 100644
index 0000000..f915230
--- /dev/null
+++ b/src/main/java/com/stefanini/util/CheckPasswordValidator.java
@@ -0,0 +1,7 @@
+package com.stefanini.util;
+
+public class CheckPasswordValidator{
+ public static final String PASSWORD_VALIDATOR = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)" + "(?=.*[-+_!@#$%^&*., ?]).+$";
+ public static final String SENHA_FORA_DO_PADRAO = "A senha deve possuir: um caractere maiuscula, um caractere minusculo, uma caractere especial e um caractere numérico";
+
+}
\ No newline at end of file
diff --git a/src/main/resources/db/carga-inicial.sql b/src/main/resources/db/carga-inicial.sql
index e69de29..bff4ed1 100644
--- a/src/main/resources/db/carga-inicial.sql
+++ b/src/main/resources/db/carga-inicial.sql
@@ -0,0 +1,8 @@
+INSERT INTO `curso_rest`.`tb_usuario`
+(`dataAtualizacao`,`dataCriacao`,`dataNascimento`,`email`,`login`,`nome`,`senha`)
+VALUES
+('2023-02-21 20:27:08.585225', '2023-02-21 20:27:08.585225', '2011-07-01', 'gabrielpsilva@gmail.com', 'gabrielpsilvaAaBb', 'Gabriel', 'JFNlMTIz'),
+('2023-02-21 20:28:08.732232', '2023-02-21 20:28:08.732232', '2011-07-01', 'nathalya@yahoo.com', 'nathalyaSetembro', 'Nathalya', 'JFNlMTIz'),
+('2023-02-21 20:28:18.177241', '2023-02-21 20:28:18.177241', '2011-07-01', 'pikachu@outlook.com', 'pikachuSetembro', 'Pikachu', 'JFNlMTIz'),
+('2023-02-21 20:28:28.741270', '2023-02-21 20:28:28.741270', '2011-04-01', 'garfield@outlook.com', 'garfieldAbril', 'Garfield', 'JFNlMTIz'),
+('2023-02-21 20:28:46.306683', '2023-02-21 20:28:46.306683', '2011-06-01', 'nina@gmail.com', 'ninaJunho', 'Nina', 'JFNlMTIz');
\ No newline at end of file