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