From 0145807d22ca29294f6fc795519154d21ce3ea88 Mon Sep 17 00:00:00 2001 From: Rafael Bantu <34097797+rafaelbantu@users.noreply.github.com> Date: Sun, 21 Apr 2024 16:12:22 -0300 Subject: [PATCH] sync --- .idea/vcs.xml | 2 +- .../wpdauth/controller/UsersController.java | 161 +++++++++++++++--- .../model/EduCemadenOrganizations.java | 31 +++- .../wpdauth/model/Users.java | 2 +- .../wpdauth/repository/UsersRepository.java | 8 +- .../wpdauth/service/UsersService.java | 106 +++++++++++- src/main/resources/application.properties | 28 +-- 7 files changed, 275 insertions(+), 63 deletions(-) diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 9661ac7..c8397c9 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/src/main/java/org/waterproofingdata/wpdauth/controller/UsersController.java b/src/main/java/org/waterproofingdata/wpdauth/controller/UsersController.java index 9da0c7c..939b6fe 100644 --- a/src/main/java/org/waterproofingdata/wpdauth/controller/UsersController.java +++ b/src/main/java/org/waterproofingdata/wpdauth/controller/UsersController.java @@ -2,10 +2,14 @@ package org.waterproofingdata.wpdauth.controller; import javax.servlet.http.HttpServletRequest; +import org.springframework.http.HttpStatus; import org.waterproofingdata.wpdauth.dto.CustomMapper; import org.waterproofingdata.wpdauth.dto.UsersRequestDTO; import org.waterproofingdata.wpdauth.dto.UsersResponseDTO; +import org.waterproofingdata.wpdauth.exception.CustomException; +import org.waterproofingdata.wpdauth.model.EduCemadenOrganizations; import org.waterproofingdata.wpdauth.model.Users; +import org.waterproofingdata.wpdauth.model.UsersEducemadenOrganizations; import org.waterproofingdata.wpdauth.service.UsersService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -26,6 +30,10 @@ import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import io.swagger.annotations.Authorization; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + @RestController @RequestMapping("/users") @Api(tags = "users") @@ -33,6 +41,115 @@ public class UsersController { @Autowired private UsersService userService; + private final UsersService usersService; + private final UsersService.UsersEducemadenOrganizationsService usersEducemadenOrganizationsService; + + @Autowired + public UsersController(UsersService usersService, UsersService.UsersEducemadenOrganizationsService usersEducemadenOrganizationsService) { + this.usersService = usersService; + this.usersEducemadenOrganizationsService = usersEducemadenOrganizationsService; + } + + // Endpoint para associar um usuário a uma instituição + @PostMapping("/associate") + public ResponseEntity associateUserWithOrganization( + @RequestBody UsersEducemadenOrganizations userOrganizationMapping) { + UsersEducemadenOrganizations savedMapping = usersEducemadenOrganizationsService.saveUserOrganizationMapping(userOrganizationMapping); + + return new ResponseEntity<>(savedMapping, HttpStatus.CREATED); + } + + // Endpoint para encontrar um mapeamento de usuário por ID do usuário + @GetMapping("/organization/{userId}") + public ResponseEntity findUserOrganizationMappingByUserId( + @PathVariable Integer userId) { + UsersEducemadenOrganizations mapping = usersEducemadenOrganizationsService.findByUserId(userId); + + return mapping != null + ? new ResponseEntity<>(mapping, HttpStatus.OK) + : new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + // Endpoint para encontrar um mapeamento de usuário por chave de ativação + @GetMapping("/organization/activation/{activationKey}") + public ResponseEntity findUserOrganizationMappingByActivationKey( + @PathVariable UUID activationKey) { + UsersEducemadenOrganizations mapping = usersEducemadenOrganizationsService.findByActivationKey(activationKey); + + return mapping != null + ? new ResponseEntity<>(mapping, HttpStatus.OK) + : new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + @RestController + @RequestMapping("/organizations") + public class EduCemadenOrganizationsController { + + // Inject the service + private final UsersService.EduCemadenOrganizationsService organizationsService; + + @Autowired + public EduCemadenOrganizationsController(UsersService.EduCemadenOrganizationsService organizationsService) { + this.organizationsService = organizationsService; + } + + // Endpoint to get all organizations + @GetMapping("/all") + @PreAuthorize("hasRole('ROLE_ADMIN')") + public ResponseEntity> getAllOrganizations() { + List organizations = organizationsService.getAllOrganizations(); + return new ResponseEntity<>(organizations, HttpStatus.OK); + } + + // Endpoint to get an organization by ID + @GetMapping("/{id}") + @PreAuthorize("hasRole('ROLE_INSTITUTION')") + public ResponseEntity getOrganizationById(@PathVariable Integer id) { + Optional organization = organizationsService.getOrganizationById(id); + return organization.map(value -> new ResponseEntity<>(value, HttpStatus.OK)) + .orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND)); + } + + // Endpoint para atualizar uma instituição por ID + @PutMapping("/update/{id}") + @PreAuthorize("hasRole('ROLE_INSTITUTION')") + public ResponseEntity updateOrganization( + @PathVariable Integer id, + @RequestBody EduCemadenOrganizations updatedOrganization) { + Optional updatedOrg = organizationsService.updateOrganization(id, updatedOrganization); + + return updatedOrg.map(value -> new ResponseEntity<>(value, HttpStatus.OK)) + .orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND)); + } + } + + @PostMapping("/createInstitution") + @ApiOperation( + value = "${UserController.createInstitution}", + notes = "This is the createInstitution method to create new institutions." + ) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Something went wrong"), + @ApiResponse(code = 422, message = "Required parameters should be provided") + } + ) + public ResponseEntity createInstitution( + @ApiParam( + name = "institution", + value = "Institution details", + required = true + ) + @RequestBody EduCemadenOrganizations institution + ) { + try { + // Adiciona lógica para criar instituição no serviço e retorna UUID + UUID activationKey = userService.createInstitution(institution); + return ResponseEntity.ok(activationKey); + } catch (CustomException ce) { + return ResponseEntity.status(ce.getHttpStatus()).body(null); + } + } + @PutMapping("/update") public ResponseEntity editUser(@RequestBody Users updatedUser) { Users editedUser = userService.editUser(updatedUser); @@ -95,27 +212,27 @@ public class UsersController { return userService.existsByUsername(username); } - @PostMapping("/existsByNickname") - @ApiOperation( - value = "${UserController.existsByNickname}", - notes = "From a nickname, this method returns if there is a nickname in db or not." - ) - @ApiResponses(value = {// - @ApiResponse(code = 400, message = "Something went wrong") - } - ) - public boolean existsByNickname(// - @ApiParam( - name = "nickname", - type = "String", - value = "nickname of the user", - example = "This is an unique field, and consumers should be aware of it.", - required = true - ) - @RequestParam String nickname - ) { - return userService.existsByNickname(nickname); - } +// @PostMapping("/existsByNickname") +// @ApiOperation( +// value = "${UserController.existsByNickname}", +// notes = "From a nickname, this method returns if there is a nickname in db or not." +// ) +// @ApiResponses(value = {// +// @ApiResponse(code = 400, message = "Something went wrong") +// } +// ) +// public boolean existsByNickname(// +// @ApiParam( +// name = "nickname", +// type = "String", +// value = "nickname of the user", +// example = "This is an unique field, and consumers should be aware of it.", +// required = true +// ) +// @RequestParam String nickname +// ) { +// return userService.existsByNickname(nickname); +// } @PostMapping("/login") @ApiOperation( @@ -168,7 +285,7 @@ public class UsersController { ) { return userService.signup(CustomMapper.map(user, Users.class)); } - + @PostMapping("/activate") @PreAuthorize("hasRole('ROLE_INSTITUTION') or hasRole('ROLE_CLIENT')") @ApiOperation( diff --git a/src/main/java/org/waterproofingdata/wpdauth/model/EduCemadenOrganizations.java b/src/main/java/org/waterproofingdata/wpdauth/model/EduCemadenOrganizations.java index f264124..77df525 100644 --- a/src/main/java/org/waterproofingdata/wpdauth/model/EduCemadenOrganizations.java +++ b/src/main/java/org/waterproofingdata/wpdauth/model/EduCemadenOrganizations.java @@ -2,22 +2,19 @@ package org.waterproofingdata.wpdauth.model; import java.util.UUID; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import javax.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @Entity(name = "educemaden_organizations") +@Table(name = "educemaden_organizations") @Getter @Setter @NoArgsConstructor public class EduCemadenOrganizations { @Id - @GeneratedValue private Integer id; @Column(nullable = true) @@ -47,6 +44,30 @@ public class EduCemadenOrganizations { @Column(nullable = true) private String address; + @Column(nullable = true) + private String rua; + + @Column(nullable = true) + private String numero; + + @Column(nullable = true) + private String bairro; + + @Column(nullable = true) + private String cep; + + @Column(nullable = true) + private String cidade; + + @Column(nullable = true) + private String uf; + + @Column(nullable = true) + private String lat; + + @Column(nullable = true) + private String lng; + @Column(nullable = true) private String responsible; diff --git a/src/main/java/org/waterproofingdata/wpdauth/model/Users.java b/src/main/java/org/waterproofingdata/wpdauth/model/Users.java index 55b09b3..61d2648 100644 --- a/src/main/java/org/waterproofingdata/wpdauth/model/Users.java +++ b/src/main/java/org/waterproofingdata/wpdauth/model/Users.java @@ -33,7 +33,7 @@ public class Users { private String username; @Size(min = 4, max = 255, message = "Minimum name length: 4 characters") - @Column(unique = true, nullable = false) + @Column(nullable = false) private String nickname; @Size(min = 8, message = "Minimum password length: 8 characters") diff --git a/src/main/java/org/waterproofingdata/wpdauth/repository/UsersRepository.java b/src/main/java/org/waterproofingdata/wpdauth/repository/UsersRepository.java index 4b67d7f..32a5e32 100644 --- a/src/main/java/org/waterproofingdata/wpdauth/repository/UsersRepository.java +++ b/src/main/java/org/waterproofingdata/wpdauth/repository/UsersRepository.java @@ -16,10 +16,10 @@ public interface UsersRepository extends JpaRepository { Users findByUsername(String username); - boolean existsByNickname(String nickname); - - @Query(value = "SELECT nickname || rank() OVER (PARTITION BY nickname) nickname_unique FROM auth.users WHERE nickname = ?1", nativeQuery = true) - String findSuggestedNickname(String nickname); +// boolean existsByNickname(String nickname); + +// @Query(value = "SELECT nickname || rank() OVER (PARTITION BY nickname) nickname_unique FROM auth.users WHERE nickname = ?1", nativeQuery = true) +// String findSuggestedNickname(String nickname); @Modifying(clearAutomatically = true) @Query(value = "UPDATE auth.users SET active = ?2 WHERE username = ?1", nativeQuery = true) diff --git a/src/main/java/org/waterproofingdata/wpdauth/service/UsersService.java b/src/main/java/org/waterproofingdata/wpdauth/service/UsersService.java index ec917d0..013329c 100644 --- a/src/main/java/org/waterproofingdata/wpdauth/service/UsersService.java +++ b/src/main/java/org/waterproofingdata/wpdauth/service/UsersService.java @@ -1,5 +1,8 @@ package org.waterproofingdata.wpdauth.service; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; import java.util.UUID; import javax.servlet.http.HttpServletRequest; @@ -7,6 +10,7 @@ import javax.servlet.http.HttpServletRequest; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.AuthenticationException; @@ -47,6 +51,92 @@ public class UsersService { @Autowired private AuthenticationManager authenticationManager; + @Service + public class UsersEducemadenOrganizationsService { + + private final UsersEducemadenOrganizationsRepository usersRepository; + + @Autowired + public UsersEducemadenOrganizationsService(UsersEducemadenOrganizationsRepository usersRepository) { + this.usersRepository = usersRepository; + } + + // ... outros métodos + + public UsersEducemadenOrganizations saveUserOrganizationMapping(UsersEducemadenOrganizations userOrganizationMapping) { + return usersRepository.save(userOrganizationMapping); + } + + public UsersEducemadenOrganizations findByUserId(Integer userId) { + return usersRepository.findByUsersid(userId); + } + + public UsersEducemadenOrganizations findByActivationKey(UUID activationKey) { + return usersRepository.findByActivationkey(activationKey); + } + } + + @Service + public class EduCemadenOrganizationsService { + // Inject the repository + private final EduCemadenOrganizationsRepository organizationsRepository; + + @Autowired + public EduCemadenOrganizationsService(EduCemadenOrganizationsRepository organizationsRepository) { + this.organizationsRepository = organizationsRepository; + } + + // Method to get all organizations + public List getAllOrganizations() { + return organizationsRepository.findAll(); + } + + // Method to get an organization by ID + public Optional getOrganizationById(Integer id) { + return organizationsRepository.findById(id); + } + + public Optional updateOrganization(Integer id, EduCemadenOrganizations updatedOrganization) { + return organizationsRepository.findById(id) + .map(existingOrganization -> { + // Atualizar os campos necessários + existingOrganization.setName(updatedOrganization.getName()); + existingOrganization.setInep_code(updatedOrganization.getInep_code()); + existingOrganization.setPhone(updatedOrganization.getPhone()); + existingOrganization.setType(updatedOrganization.getType()); + existingOrganization.setWebsite(updatedOrganization.getWebsite()); + existingOrganization.setLogin(updatedOrganization.getLogin()); + existingOrganization.setAddress(updatedOrganization.getAddress()); + existingOrganization.setRua(updatedOrganization.getRua()); + existingOrganization.setNumero(updatedOrganization.getNumero()); + existingOrganization.setBairro(updatedOrganization.getBairro()); + existingOrganization.setCep(updatedOrganization.getCep()); + existingOrganization.setCidade(updatedOrganization.getCidade()); + existingOrganization.setUf(updatedOrganization.getUf()); + existingOrganization.setLat(updatedOrganization.getLat()); + existingOrganization.setLng(updatedOrganization.getLng()); + existingOrganization.setResponsible(updatedOrganization.getResponsible()); + + // Salvar a instituição atualizada + return organizationsRepository.save(existingOrganization); + }); + } + } + +// public String createInstitution(EduCemadenOrganizations institution) { +// institution.setActivationkey(UUID.randomUUID()); +// +// EduCemadenOrganizations savedInstitution = eduCemadenOrganizationsRepository.save(institution); +// return jwtTokenProvider.createToken(savedInstitution.getName(), Arrays.asList(Roles.ROLE_INSTITUTION)); +// } + + public UUID createInstitution(EduCemadenOrganizations institution) { + institution.setActivationkey(UUID.randomUUID()); + + EduCemadenOrganizations savedInstitution = eduCemadenOrganizationsRepository.save(institution); + return savedInstitution.getActivationkey(); + } + public Users editUser(@NotNull Users updatedUser) { Users existingUser = usersRepository.findById(updatedUser.getId()).orElse(null); if (existingUser != null) { @@ -91,10 +181,10 @@ public class UsersService { public boolean existsByUsername(String username) { return usersRepository.existsByUsername(username); } - - public boolean existsByNickname(String nickname) { - return usersRepository.existsByNickname(nickname); - } + +// public boolean existsByNickname(String nickname) { +// return usersRepository.existsByNickname(nickname); +// } public Users search(String username) { Users user = usersRepository.findByUsername(username); @@ -130,10 +220,10 @@ public class UsersService { if (user.getNickname().length() == 0) { throw new CustomException("Nickname must be provided", HttpStatus.UNPROCESSABLE_ENTITY); } - else if (existsByNickname(user.getNickname())) { - String nickname_unique = usersRepository.findSuggestedNickname(user.getNickname()); - throw new CustomException(String.format("Nickname already exists. Would you like to use '%s'?", nickname_unique), HttpStatus.UNPROCESSABLE_ENTITY); - } +// else if (existsByNickname(user.getNickname())) { +// String nickname_unique = usersRepository.findSuggestedNickname(user.getNickname()); +// throw new CustomException(String.format("Nickname already exists. Would you like to use '%s'?", nickname_unique), HttpStatus.UNPROCESSABLE_ENTITY); +// } if (user.getPassword().length() == 0) { throw new CustomException("Password must be provided", HttpStatus.UNPROCESSABLE_ENTITY); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index fdc9d6e..626b63c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,9 +5,10 @@ spring.datasource.hikari.maximumPoolSize=5 ## PostgreSQL spring.datasource.url=jdbc:postgresql://localhost:5432/wpdauth spring.datasource.username=uwpdauth -spring.datasource.password=root +spring.datasource.password=pwd123 -spring.jpa.properties.hibernate.default_schema=auth +spring.jpa.hibernate.ddl-auto=none +spring.jpa.properties.hibernate.default_schema=auth server.port=8080 @@ -15,10 +16,10 @@ security.jwt.token.secret-key= ##5 minutes duration by default: 5 minutes * 60 seconds * 1000 miliseconds security.jwt.token.expire-length=300000 -spring.mail.host= +spring.mail.host=smtp.gmail.com spring.mail.port=587 -spring.mail.username= -spring.mail.password= +spring.mail.username=danieldrb@gmail.com +spring.mail.password=1234 spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true @@ -27,20 +28,3 @@ UsersController.signup=Creates user and returns its JWT token. UsersController.delete=Deletes specific user by username. UsersController.search=Returns specific user by username. UsersController.me=Returns current user's data. - -# actuator -management.endpoint.health.show-details=always -#indica que health deve mostrar detalhes sempre - -management.endpoints.web.exposure.include=* -#alem do health e do info ele sempre vai export todos endpoints disponiveis - -info.app.name=@project.name@ -info.app.description=@project.description@ -info.app.version=@project.version@ -info.app.encoding=@project.build.sourceEncoding@ -info.app.java.version=@java.version@ -# puxa informacoes do projeto do pom.xml - -spring.boot.admin.client.url=http://localhost:8080 -# configurando o Spring Boot Admin Server \ No newline at end of file