diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index c989e87b..00000000 --- a/Jenkinsfile +++ /dev/null @@ -1,65 +0,0 @@ -pipeline { - agent any - stages { - stage ('Build Discovery') { - steps { - checkout([ - $class: 'GitSCM', - branches: [[name: 'feature/refactoring_service_rent']], - userRemoteConfigs: [[ - credentialsId: 'github_login', - url: 'https://github.com/imovato/backend/' - ]]]) - dir('discovery') { - bat 'mvn clean package -DskipTests=true' - } - } - } - - stage ('Deploy Discovery') { - steps { - dir('discovery') { - deploy adapters: [tomcat8(credentialsId: 'TomcatLogin', path: '', url: 'http://localhost:8001/')], contextPath: 'discovery', war: 'target/discovery-0.0.1-SNAPSHOT.war' - } - } - } - - stage ('Build Rent') { - steps { - dir('rent') { - bat 'mvn clean package -DskipTests=true' - } - } - } - - stage ('Unit Tests-Rent') { - steps { - dir('rent'){ - bat 'mvn test' - } - } - } - stage ('Sonar Analysis') { - environment { - scannerHome = tool 'SONAR_SCANNER' - } - steps { - withSonarQubeEnv('SONAR_LOCAL') { - bat "${scannerHome}/bin/sonar-scanner -e -Dsonar.projectKey=Imovato -Dsonar.host.url=http://localhost:9000 -Dsonar.login=fafc5fd8cda17cd9cf6e2e31bf248d294b8d0568 -Dsonar.java.binaries=target -Dsonar.coverage.exclusions=**/.mvn/**,**/src/test/**,**/model/**,**Application.java" - } - } - } - stage ('Deploy Rent') { - steps { - deploy adapters: [tomcat8(credentialsId: 'TomcatLogin', path: '', url: 'http://localhost:8001/')], contextPath: 'rentService', war: 'target/rent-0.0.1-SNAPSHOT.war' - } - } - stage ('API Test-Rent') { - steps { - dir('tests-api') { - bat 'mvn test' - } - } - } - } -} diff --git a/cadastral/.gitignore b/cadastral/.gitignore index 64cdf512..4857385d 100644 --- a/cadastral/.gitignore +++ b/cadastral/.gitignore @@ -1,37 +1,52 @@ HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -mvnw -mvnw.cmd -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ - -src/main/resources/static/ \ No newline at end of file + target/ + !.mvn/wrapper/maven-wrapper.jar + !**/src/main/**/target/ + !**/src/test/**/target/ + + ### STS ### + .apt_generated + .classpath + .factorypath + .project + .settings + .springBeans + .sts4-cache + + ### IntelliJ IDEA ### + mvnw + mvnw.cmd + .idea + *.iws + *.iml + *.ipr + + ### NetBeans ### + /nbproject/private/ + /nbbuild/ + /dist/ + /nbdist/ + /.nb-gradle/ + build/ + !**/src/main/**/build/ + !**/src/test/**/build/ + + ### VS Code ### + .vscode/ + + src/main/resources/static/ + + ### Arquivos de log ### + *.log + *.tmp + *.bak + + ### Arquivos de configuração local ### + .env + *.properties + *.yml + *.yaml + + ### Sistema operacional ### + Thumbs.db + .DS_Store \ No newline at end of file diff --git a/cadastral/pom.xml b/cadastral/pom.xml index 801f2caf..b31f3daf 100644 --- a/cadastral/pom.xml +++ b/cadastral/pom.xml @@ -97,6 +97,35 @@ org.springframework.boot spring-boot-starter-security + + io.github.cdimascio + dotenv-java + 3.0.0 + + + org.springframework.cloud + spring-cloud-starter-config + + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + javax.xml.bind + jaxb-api + 2.3.1 + + + + org.mapstruct + mapstruct + 1.5.5.Final + + @@ -123,6 +152,11 @@ lombok ${lombok.version} + + org.mapstruct + mapstruct-processor + 1.5.5.Final + diff --git a/cadastral/src/main/java/com/unipampa/crud/config/MessageConfig.java b/cadastral/src/main/java/com/unipampa/crud/config/MessageConfig.java deleted file mode 100644 index 276eeda0..00000000 --- a/cadastral/src/main/java/com/unipampa/crud/config/MessageConfig.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.unipampa.crud.config; - -import org.springframework.amqp.core.*; -import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; -import org.springframework.amqp.support.converter.MessageConverter; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class MessageConfig { - - @Value("${crud.rabbitmq.exchanges.exchangeAccommodations}") - private String exchangeAccommodations; - - @Value("${crud.rabbitmq.exchanges.exchangeUsers}") - private String exchangeUsers; - - @Value("${crud.rabbitmq.queues.accommodationQueue}") - private String accommodationQueue; - - @Value("${crud.rabbitmq.queues.userQueue}") - private String userQueue; - - @Bean - public Exchange exchangeAccommodations() { - return ExchangeBuilder.fanoutExchange(exchangeAccommodations).durable(true).build(); - } - - @Bean - public Exchange exchangeUsers() { - return ExchangeBuilder.fanoutExchange(exchangeUsers).durable(true).build(); - } - - @Bean - public Queue propertyQueue() { - return new Queue(accommodationQueue, true); - } - - @Bean - public Queue userQueue() { - return new Queue(userQueue, true); - } - - @Bean - public Binding bindingAccomodationQueue(@Qualifier("exchangeAccommodations") FanoutExchange fanoutExchange, Queue propertyQueue) { - return BindingBuilder.bind(propertyQueue).to(fanoutExchange); - } - - @Bean - public Binding bindingUserQueue(@Qualifier("exchangeUsers") FanoutExchange fanoutExchange, Queue userQueue) { - return BindingBuilder.bind(userQueue).to(fanoutExchange); - } - - @Bean - public MessageConverter jsonMessageConverter() { - return new Jackson2JsonMessageConverter(); - } - -} diff --git a/cadastral/src/main/java/com/unipampa/crud/config/MongoScriptInitializer.java b/cadastral/src/main/java/com/unipampa/crud/config/MongoScriptInitializer.java new file mode 100644 index 00000000..1523c904 --- /dev/null +++ b/cadastral/src/main/java/com/unipampa/crud/config/MongoScriptInitializer.java @@ -0,0 +1,95 @@ +package com.unipampa.crud.config; + +import com.mongodb.client.MongoClients; +import com.unipampa.crud.enums.UserType; +import io.github.cdimascio.dotenv.Dotenv; +import org.bson.Document; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +import java.util.List; + +@Configuration +public class MongoScriptInitializer implements CommandLineRunner { + + private final PasswordEncoder passwordEncoder; + private final Dotenv dotenv = Dotenv.load(); + + public MongoScriptInitializer(PasswordEncoder passwordEncoder) { + this.passwordEncoder = passwordEncoder; + } + + + @Override + public void run(String... args) throws Exception { + System.out.println("Verificando se os dados já existem no banco..."); + + try (var client = MongoClients.create("mongodb://localhost:27017")) { + var database = client.getDatabase("cadastral"); + var roleCollection = database.getCollection("role"); + var userCollection = database.getCollection("user"); + + + long count = roleCollection.countDocuments(); + + if (count == 0) { + System.out.println("Dados não encontrados, criando inicialização..."); + + roleCollection.insertMany(List.of( + new Document("_id", "65f3c89d-8f45-4732-9021-f84d559d6a12").append("roleName", "ROLE_HOST"), + new Document("_id", "65f3c89d-8f45-4732-9021-f84d559d6a13").append("roleName", "ROLE_GUEST"), + new Document("_id", "65f3c89d-8f45-4732-9021-f84d559d6a14").append("roleName", "ROLE_ADMINISTRATOR") + )); + + System.out.println("Dados de inicialização criados com sucesso!"); + } else { + System.out.println("Dados já existem no banco. Inicialização não necessária."); + } + + // Inicializar usuários + long userCount = userCollection.countDocuments(); + + if (userCount == 0) { + System.out.println("Usuários não encontrados, criando inicialização..."); + + Document roleAdmin = roleCollection.find(new Document("roleName", "ROLE_ADMINISTRATOR")).first(); + + if (roleAdmin == null) { + throw new IllegalStateException("Role 'ROLE_ADMINISTRATOR' não encontrada no banco!"); + } + + userCollection.insertMany(List.of( + new Document("_id", "admin-1") + .append("userName", dotenv.get("ADMIN1_USERNAME")) + .append("password", passwordEncoder.encode(dotenv.get("ADMIN1_PASSWORD"))) + .append("roles", List.of(roleAdmin)), + + new Document("_id", "admin-2") + .append("userName", dotenv.get("ADMIN2_USERNAME")) + .append("password", passwordEncoder.encode(dotenv.get("ADMIN2_PASSWORD"))) + .append("roles", List.of(roleAdmin)), + + new Document("_id", "admin-3") + .append("userName", dotenv.get("ADMIN3_USERNAME")) + .append("password", passwordEncoder.encode(dotenv.get("ADMIN3_PASSWORD"))) + .append("roles", List.of(roleAdmin)), + + new Document("_id", "admin-4") + .append("userName", dotenv.get("ADMIN4_USERNAME")) + .append("password", passwordEncoder.encode(dotenv.get("ADMIN4_PASSWORD"))) + .append("roles", List.of(roleAdmin)) + )); + + System.out.println("Usuários criados com sucesso!"); + } else { + System.out.println("Usuários já existem no banco. Inicialização de usuários não necessária."); + } + + + } catch (Exception e) { + System.err.println("Erro ao inicializar o MongoDB: " + e.getMessage()); + } + } +} diff --git a/cadastral/src/main/java/com/unipampa/crud/config/RabbitConfig.java b/cadastral/src/main/java/com/unipampa/crud/config/RabbitConfig.java new file mode 100644 index 00000000..d9364a3c --- /dev/null +++ b/cadastral/src/main/java/com/unipampa/crud/config/RabbitConfig.java @@ -0,0 +1,24 @@ +package com.unipampa.crud.config; + +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + + @Bean + public Jackson2JsonMessageConverter jackson2JsonMessageConverter() { + return new Jackson2JsonMessageConverter(); + } + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, + Jackson2JsonMessageConverter converter) { + RabbitTemplate template = new RabbitTemplate(connectionFactory); + template.setMessageConverter(converter); + return template; + } +} diff --git a/cadastral/src/main/java/com/unipampa/crud/config/security/JwtAuthenticationFilter.java b/cadastral/src/main/java/com/unipampa/crud/config/security/JwtAuthenticationFilter.java new file mode 100644 index 00000000..f49cda92 --- /dev/null +++ b/cadastral/src/main/java/com/unipampa/crud/config/security/JwtAuthenticationFilter.java @@ -0,0 +1,52 @@ +package com.unipampa.crud.config.security; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Component +public class JwtAuthenticationFilter extends OncePerRequestFilter { + + @Autowired + private JwtProvider jwtProvider; + + @Autowired + private UserDetailsServiceImpl userDetailsService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + String token = extractToken(request); + if (token != null && jwtProvider.validateToken(token)) { + String userId = jwtProvider.getSubjectFromToken(token); + logger.info("username extraído do token: " + userId); + + UserDetails userDetails = userDetailsService.loadUserByUserId(userId); + logger.info("user details encontrado: " + userDetails); + + UsernamePasswordAuthenticationToken authentication = + new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + + SecurityContextHolder.getContext().setAuthentication(authentication); + } + + filterChain.doFilter(request, response); + + } + + private String extractToken(HttpServletRequest request) { + String authHeader = request.getHeader("Authorization"); + if (authHeader != null && authHeader.startsWith("Bearer ")) { + return authHeader.substring(7); + } + return null; + } +} diff --git a/cadastral/src/main/java/com/unipampa/crud/config/security/JwtProvider.java b/cadastral/src/main/java/com/unipampa/crud/config/security/JwtProvider.java new file mode 100644 index 00000000..f56fad24 --- /dev/null +++ b/cadastral/src/main/java/com/unipampa/crud/config/security/JwtProvider.java @@ -0,0 +1,64 @@ +package com.unipampa.crud.config.security; + +import io.jsonwebtoken.*; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.stream.Collectors; + +@Log4j2 +@Component +public class JwtProvider { + + @Value( "${ead.auth.jwtSecret}") + private String jwtSecret; + + @Value( "${ead.auth.jwtExpirationMs}") + private int jwtExpirationMs; + + public String generateJwtToken(Authentication authentication) { + UserDatailsImpl userPrincipal = (UserDatailsImpl) authentication.getPrincipal(); + + final String roles = userPrincipal.getAuthorities().stream().map(role -> { + return role.getAuthority(); + }).collect(Collectors.joining()); + + return Jwts.builder() + .setSubject(userPrincipal.getUserId()) + .claim("roles", roles) + .setIssuedAt(new Date()) + .setExpiration(new Date((new Date()).getTime() + jwtExpirationMs)) + .signWith(io.jsonwebtoken.SignatureAlgorithm.HS512, jwtSecret) + .compact(); + } + + public String getSubjectFromToken(String token) { + return Jwts.parser() + .setSigningKey(jwtSecret) + .parseClaimsJws(token) + .getBody() + .getSubject(); + } + + public boolean validateToken(String authToken) { + try { + Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(authToken); + return true; + + } catch (SignatureException e) { + log.error("Invalid JWT signature: {}", e.getMessage()); + } catch (MalformedJwtException e) { + log.error("Invalid JWT token: {}", e.getMessage()); + } catch (ExpiredJwtException e) { + log.error("JWT token is expired: {}", e.getMessage()); + } catch (UnsupportedJwtException e) { + log.error("JWT token is unsupported: {}", e.getMessage()); + } catch (IllegalArgumentException e) { + log.error("JWT claims string is empty: {}", e.getMessage()); + } + return false; + } +} diff --git a/cadastral/src/main/java/com/unipampa/crud/config/security/SecurityConfig.java b/cadastral/src/main/java/com/unipampa/crud/config/security/SecurityConfig.java index 459c9cc1..13fd1628 100644 --- a/cadastral/src/main/java/com/unipampa/crud/config/security/SecurityConfig.java +++ b/cadastral/src/main/java/com/unipampa/crud/config/security/SecurityConfig.java @@ -1,9 +1,9 @@ package com.unipampa.crud.config.security; +import jakarta.ws.rs.HttpMethod; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; @@ -13,42 +13,30 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableMethodSecurity public class SecurityConfig { - private static final String HOST = "HOST"; - private static final String ADMIN = "ADMINISTRATOR"; - private static final String GUEST = "GUEST"; @Autowired private UserDetailsServiceImpl userDetailsService; - private static final String[] PUBLIC_MATCHERS = { - "/users/**" - }; + @Autowired + private JwtAuthenticationFilter jwtAuthenticationFilter; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http.authorizeHttpRequests(auth -> auth - .requestMatchers(HttpMethod.POST, PUBLIC_MATCHERS).permitAll() - .requestMatchers("/accommodations/images/**").permitAll() - .requestMatchers(HttpMethod.POST, "/accommodations/**").hasAnyRole(HOST, ADMIN) - .requestMatchers(HttpMethod.GET, "/accommodations/**").hasAnyRole(HOST, GUEST, ADMIN) - .requestMatchers(HttpMethod.GET, "/accommodations/{id}").hasAnyRole(HOST, GUEST, ADMIN) - .requestMatchers(HttpMethod.PUT, "/accommodations/{id}").hasAnyRole(HOST, ADMIN) - .requestMatchers(HttpMethod.DELETE, "/accommodations/{id}").hasAnyRole(HOST, ADMIN) - - .requestMatchers(HttpMethod.GET, "/users").hasRole(ADMIN) - .requestMatchers(HttpMethod.GET, "/users/email/**").hasAnyRole(ADMIN, HOST, GUEST) - .requestMatchers(HttpMethod.GET, "/users/{id}").hasAnyRole(ADMIN, HOST, GUEST) - .requestMatchers(HttpMethod.PUT, "/users/{id}").hasAnyRole(ADMIN, HOST, GUEST) - .requestMatchers(HttpMethod.DELETE, "/users/{id}").hasAnyRole(ADMIN, HOST, GUEST) - + http + .csrf(AbstractHttpConfigurer::disable) + .authorizeHttpRequests(auth -> auth + .requestMatchers(HttpMethod.POST, "/users/**", "/auth/**").permitAll() + .requestMatchers(HttpMethod.GET, "/accommodations", "/accommodations/**", "/images/**").permitAll() .anyRequest().authenticated() ) - .httpBasic(Customizer.withDefaults()) - .csrf(AbstractHttpConfigurer::disable); + .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) + .httpBasic(Customizer.withDefaults()); + return http.build(); } diff --git a/cadastral/src/main/java/com/unipampa/crud/config/security/UserDatailsImpl.java b/cadastral/src/main/java/com/unipampa/crud/config/security/UserDatailsImpl.java index 72fdfb03..d071fae9 100644 --- a/cadastral/src/main/java/com/unipampa/crud/config/security/UserDatailsImpl.java +++ b/cadastral/src/main/java/com/unipampa/crud/config/security/UserDatailsImpl.java @@ -29,7 +29,7 @@ public class UserDatailsImpl implements UserDetails { public static UserDatailsImpl build(User user) { List authorities = user.getRoles().stream() - .map(role -> new SimpleGrantedAuthority(role.getAuthority())) + .map(role -> new SimpleGrantedAuthority(role.getRoleName().name())) .collect(Collectors.toList()); return new UserDatailsImpl ( diff --git a/cadastral/src/main/java/com/unipampa/crud/config/security/UserDetailsServiceImpl.java b/cadastral/src/main/java/com/unipampa/crud/config/security/UserDetailsServiceImpl.java index 3182d833..f9f5985c 100644 --- a/cadastral/src/main/java/com/unipampa/crud/config/security/UserDetailsServiceImpl.java +++ b/cadastral/src/main/java/com/unipampa/crud/config/security/UserDetailsServiceImpl.java @@ -2,6 +2,7 @@ import com.unipampa.crud.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -10,7 +11,7 @@ @Service public class UserDetailsServiceImpl implements UserDetailsService { - public static final String USER_NOT_FOUND = "Usuário não encontrado para o nome de usuário: "; + public static final String USER_NOT_FOUND = "Usuário não encontrado para o id de usuário: "; @Autowired private UserRepository userRepository; @@ -18,11 +19,18 @@ public class UserDetailsServiceImpl implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { try { - var user = userRepository.findByUserName(username) - .orElseThrow(() -> new UsernameNotFoundException(USER_NOT_FOUND + username)); - return UserDatailsImpl.build(user); + var user = userRepository.findByUserName(username); + var opt = user.orElseThrow(() -> new UsernameNotFoundException(USER_NOT_FOUND + username)); + return UserDatailsImpl.build(opt); } catch (Exception e) { throw new UsernameNotFoundException("Erro de conectividade ou ao carregar os dados do usuário: " + username, e); } } + + public UserDetails loadUserByUserId(String userId) throws AuthenticationCredentialsNotFoundException { + var user = userRepository.findById(userId); + var userModel = user.orElseThrow(() -> new AuthenticationCredentialsNotFoundException(USER_NOT_FOUND + userId)); + return UserDatailsImpl.build(userModel); + + } } diff --git a/cadastral/src/main/java/com/unipampa/crud/dto/AccommodationMessageDTO.java b/cadastral/src/main/java/com/unipampa/crud/dto/AccommodationMessageDTO.java new file mode 100644 index 00000000..fb20fc99 --- /dev/null +++ b/cadastral/src/main/java/com/unipampa/crud/dto/AccommodationMessageDTO.java @@ -0,0 +1,11 @@ +package com.unipampa.crud.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class AccommodationMessageDTO { + private BigDecimal price; + private int maxOccupancy; +} diff --git a/cadastral/src/main/java/com/unipampa/crud/dto/JwtDTO.java b/cadastral/src/main/java/com/unipampa/crud/dto/JwtDTO.java new file mode 100644 index 00000000..aaac8b48 --- /dev/null +++ b/cadastral/src/main/java/com/unipampa/crud/dto/JwtDTO.java @@ -0,0 +1,15 @@ +package com.unipampa.crud.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +public class JwtDTO { + + @NotNull + private final String token; + + private final String type = "Bearer"; +} diff --git a/cadastral/src/main/java/com/unipampa/crud/dto/LoginDTO.java b/cadastral/src/main/java/com/unipampa/crud/dto/LoginDTO.java new file mode 100644 index 00000000..413497c4 --- /dev/null +++ b/cadastral/src/main/java/com/unipampa/crud/dto/LoginDTO.java @@ -0,0 +1,13 @@ +package com.unipampa.crud.dto; + +import jakarta.validation.constraints.NotBlank; + +public record LoginDTO( + + @NotBlank + String username, + + @NotBlank + String password + +) {} diff --git a/cadastral/src/main/java/com/unipampa/crud/entities/Accommodation.java b/cadastral/src/main/java/com/unipampa/crud/entities/Accommodation.java index f5d8c4e2..260206f8 100644 --- a/cadastral/src/main/java/com/unipampa/crud/entities/Accommodation.java +++ b/cadastral/src/main/java/com/unipampa/crud/entities/Accommodation.java @@ -1,5 +1,6 @@ package com.unipampa.crud.entities; +import com.unipampa.crud.enums.AccommodationStats; import com.unipampa.crud.enums.AccommodationType; import lombok.Builder; import lombok.Data; @@ -36,5 +37,6 @@ public class Accommodation { private int imageCount; private int maxOccupancy; private String hostId; + private AccommodationStats stats; } diff --git a/cadastral/src/main/java/com/unipampa/crud/entities/User.java b/cadastral/src/main/java/com/unipampa/crud/entities/User.java index c78de22e..93873ac4 100644 --- a/cadastral/src/main/java/com/unipampa/crud/entities/User.java +++ b/cadastral/src/main/java/com/unipampa/crud/entities/User.java @@ -1,6 +1,7 @@ package com.unipampa.crud.entities; import com.fasterxml.jackson.annotation.JsonFormat; +import com.unipampa.crud.enums.UserStats; import com.unipampa.crud.enums.UserType; import lombok.AllArgsConstructor; import lombok.Builder; @@ -27,12 +28,14 @@ public class User implements Serializable { @Id private String id; + @Field("userName") private String userName; private String password; private String cpf; private String email; private String name; private UserType type; + private UserStats stats; @DBRef private Set roles = new HashSet<>(); @@ -46,4 +49,5 @@ public class User implements Serializable { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'") private LocalDateTime lastUpdateDate; + } diff --git a/cadastral/src/main/java/com/unipampa/crud/enums/AccommodationStats.java b/cadastral/src/main/java/com/unipampa/crud/enums/AccommodationStats.java new file mode 100644 index 00000000..3f1b4e6b --- /dev/null +++ b/cadastral/src/main/java/com/unipampa/crud/enums/AccommodationStats.java @@ -0,0 +1,12 @@ +package com.unipampa.crud.enums; + +import io.swagger.v3.oas.annotations.media.Schema; + +public enum AccommodationStats { + + @Schema(description = "Propriedade indisponível") + UNAVAILABLE, + + @Schema(description = "Propriedade disponível") + AVAILABLE; +} diff --git a/cadastral/src/main/java/com/unipampa/crud/enums/UserStats.java b/cadastral/src/main/java/com/unipampa/crud/enums/UserStats.java new file mode 100644 index 00000000..72a3d475 --- /dev/null +++ b/cadastral/src/main/java/com/unipampa/crud/enums/UserStats.java @@ -0,0 +1,6 @@ +package com.unipampa.crud.enums; + +public enum UserStats { + + AVAILABLE, UNAVAILABLE; +} diff --git a/cadastral/src/main/java/com/unipampa/crud/mappers/UserMapper.java b/cadastral/src/main/java/com/unipampa/crud/mappers/UserMapper.java new file mode 100644 index 00000000..7a7db77e --- /dev/null +++ b/cadastral/src/main/java/com/unipampa/crud/mappers/UserMapper.java @@ -0,0 +1,14 @@ +package com.unipampa.crud.mappers; + +import com.unipampa.crud.dto.UserDTO; +import com.unipampa.crud.entities.User; +import org.mapstruct.*; + +@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface UserMapper { + + + @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) + void updateUserFromDto(UserDTO dto, @MappingTarget User entity); + +} diff --git a/cadastral/src/main/java/com/unipampa/crud/repository/UserRepository.java b/cadastral/src/main/java/com/unipampa/crud/repository/UserRepository.java index 62ac135b..3afdc61a 100644 --- a/cadastral/src/main/java/com/unipampa/crud/repository/UserRepository.java +++ b/cadastral/src/main/java/com/unipampa/crud/repository/UserRepository.java @@ -18,4 +18,7 @@ public interface UserRepository extends MongoRepository { @EntityGraph(attributePaths = {"roles"}, type = EntityGraph.EntityGraphType.FETCH) Optional findByUserName(String username); + + @EntityGraph(attributePaths = {"roles"}, type = EntityGraph.EntityGraphType.FETCH) + Optional findById(String userId); } \ No newline at end of file diff --git a/cadastral/src/main/java/com/unipampa/crud/resources/AccommodationResource.java b/cadastral/src/main/java/com/unipampa/crud/resources/AccommodationResource.java index 71f3f9e7..e542830f 100644 --- a/cadastral/src/main/java/com/unipampa/crud/resources/AccommodationResource.java +++ b/cadastral/src/main/java/com/unipampa/crud/resources/AccommodationResource.java @@ -7,6 +7,7 @@ import com.unipampa.crud.dto.AccommodationRequestDTO; import com.unipampa.crud.dto.ErrorResponse; import com.unipampa.crud.entities.Accommodation; +import com.unipampa.crud.enums.AccommodationStats; import com.unipampa.crud.mappers.AccommodationMapper; import com.unipampa.crud.service.AccommodationService; import com.unipampa.crud.validations.ValidationsRegisterAccommodation; @@ -24,6 +25,7 @@ import org.springframework.http.MediaType; import org.springframework.http.MediaTypeFactory; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -58,6 +60,8 @@ public class AccommodationResource { @Autowired private List validations; + + @PreAuthorize( "hasAnyRole('ROLE_ADMINISTRATOR', 'ROLE_HOST')" ) @PostMapping @Operation(summary = "Criar uma nova acomodação", description = "Valida e salva uma nova acomodação no sistema.") @@ -81,6 +85,7 @@ public ResponseEntity save( accommodation.setId(novoId); String authenticatedUserId = SecurityUtil.getAuthenticatedUserId(); accommodation.setHostId(authenticatedUserId); + accommodation.setStats(AccommodationStats.AVAILABLE); accommodationService.save(accommodation, images); URI location = URI.create("/accommodations/" + accommodation.getId()); @@ -88,43 +93,7 @@ public ResponseEntity save( return ResponseEntity.created(location).body(accomodationResponseDTO); } - @GetMapping - @Operation(summary = "Listar todas as acomodações", - description = "Retorna uma lista contendo todas as acomodações cadastradas.") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "Lista retornada com sucesso", - content = @Content(schema = @Schema(implementation = AccommodationDTO.class))) - }) - public ResponseEntity> findAll() { - List accommodationDtos = accommodationService.findAll() - .stream() - .map(accommodation -> accommodationMapper.toDTO(accommodation)) - .collect(Collectors.toList()); - - return ResponseEntity.ok(accommodationDtos); - } - - @GetMapping("{id}") - @Operation(summary = "Buscar acomodação por ID", - description = "Retorna os dados de uma acomodação específica a partir do seu ID.") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "Acomodação encontrada", - content = @Content(schema = @Schema(implementation = AccommodationDTO.class))), - @ApiResponse(responseCode = "404", description = "Acomodação não encontrada", - content = @Content(schema = @Schema(implementation = ErrorResponse.class))) - }) - public ResponseEntity getById(@PathVariable("id") String id) { - Optional accommodationOptional = accommodationService.findById(id); - - if (accommodationOptional.isPresent()) { - AccommodationDTO dto = accommodationMapper.toDTO(accommodationOptional.get()); - return ResponseEntity.ok(dto); - } - - ErrorResponse errorResponse = new ErrorResponse("Acomodação não encontrada para o ID fornecido.", LocalDateTime.now()); - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponse); - } - + @PreAuthorize( "hasAnyRole('ROLE_ADMINISTRATOR', 'ROLE_HOST')" ) @DeleteMapping("{id}") @Operation(summary = "Deletar acomodação por ID", description = "Remove uma acomodação existente a partir do seu ID.") @@ -143,6 +112,7 @@ public ResponseEntity deleteAccommodation(@PathVariable("id") String id) return ResponseEntity.noContent().build(); } + @PreAuthorize( "hasAnyRole('ROLE_ADMINISTRATOR', 'ROLE_HOST')" ) @PutMapping("{id}") @Operation(summary = "Atualizar acomodação por ID", description = "Atualiza os dados de uma acomodação existente.") @@ -188,6 +158,44 @@ public ResponseEntity updateAccommodation( } } + @GetMapping + @Operation(summary = "Listar todas as acomodações", + description = "Retorna uma lista contendo todas as acomodações cadastradas.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Lista retornada com sucesso", + content = @Content(schema = @Schema(implementation = AccommodationDTO.class))) + }) + public ResponseEntity> findAll() { + List accommodationDtos = accommodationService.findAll() + .stream() + .map(accommodation -> accommodationMapper.toDTO(accommodation)) + .collect(Collectors.toList()); + + return ResponseEntity.ok(accommodationDtos); + } + + @GetMapping("{id}") + @Operation(summary = "Buscar acomodação por ID", + description = "Retorna os dados de uma acomodação específica a partir do seu ID.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Acomodação encontrada", + content = @Content(schema = @Schema(implementation = AccommodationDTO.class))), + @ApiResponse(responseCode = "404", description = "Acomodação não encontrada", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))) + }) + public ResponseEntity getById(@PathVariable("id") String id) { + Optional accommodationOptional = accommodationService.findById(id); + + if (accommodationOptional.isPresent()) { + AccommodationDTO dto = accommodationMapper.toDTO(accommodationOptional.get()); + return ResponseEntity.ok(dto); + } + + ErrorResponse errorResponse = new ErrorResponse("Acomodação não encontrada para o ID fornecido.", LocalDateTime.now()); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponse); + } + + @GetMapping("images/{id}/{filename}") public ResponseEntity getImage(@PathVariable String id, @PathVariable String filename) throws MalformedURLException, MalformedURLException { Path path = Paths.get(uploadsDir + id).resolve(filename); @@ -197,7 +205,6 @@ public ResponseEntity getImage(@PathVariable String id, @PathVariable } Resource resource = new UrlResource(path.toUri()); - MediaType contentType = MediaTypeFactory.getMediaType(resource) .orElse(MediaType.APPLICATION_OCTET_STREAM); diff --git a/cadastral/src/main/java/com/unipampa/crud/resources/AuthResource.java b/cadastral/src/main/java/com/unipampa/crud/resources/AuthResource.java new file mode 100644 index 00000000..59e472de --- /dev/null +++ b/cadastral/src/main/java/com/unipampa/crud/resources/AuthResource.java @@ -0,0 +1,50 @@ +package com.unipampa.crud.resources; + +import com.unipampa.crud.config.security.JwtProvider; +import com.unipampa.crud.dto.JwtDTO; +import com.unipampa.crud.dto.LoginDTO; +import jakarta.validation.Valid; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Log4j2 +@RestController +@RequestMapping("/auth") +public class AuthResource { + + @Autowired + private AuthenticationManager authenticationManager; + + @Autowired + private JwtProvider jwtProvider; + + + + @PostMapping() + public ResponseEntity authenticateUser(@Valid @RequestBody LoginDTO loginDTO) { + try { + Authentication authentication = authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken(loginDTO.username(), loginDTO.password())); + + SecurityContextHolder.getContext().setAuthentication(authentication); + + String jwt = jwtProvider.generateJwtToken(authentication); + return ResponseEntity.ok(new JwtDTO(jwt)); + + } catch (Exception e) { + System.out.println("🚨 Falha na autenticação: " + e.getClass().getSimpleName() + " - " + e.getMessage()); + return ResponseEntity.status(401).body(null); + } + + } + +} diff --git a/cadastral/src/main/java/com/unipampa/crud/resources/UserResource.java b/cadastral/src/main/java/com/unipampa/crud/resources/UserResource.java index 656c3113..ddcdf59e 100644 --- a/cadastral/src/main/java/com/unipampa/crud/resources/UserResource.java +++ b/cadastral/src/main/java/com/unipampa/crud/resources/UserResource.java @@ -5,6 +5,8 @@ import com.unipampa.crud.dto.UserDTO; import com.unipampa.crud.entities.Role; import com.unipampa.crud.entities.User; +import com.unipampa.crud.enums.UserStats; +import com.unipampa.crud.mappers.UserMapper; import com.unipampa.crud.service.RoleService; import com.unipampa.crud.service.UserService; import com.unipampa.crud.validations.ValidationsSignup; @@ -18,6 +20,7 @@ import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.*; @@ -35,6 +38,7 @@ public class UserResource { private static final String USER_NOT_FOUND = "Usuário não encontrado para esse email!"; private static final String USER_SAVED_SUCCESSFULLY_LOG = "Usuário salvo com sucesso, username: {}"; private static final String ACTION_NOT_AUTHORIZED = "Você não pode executar essa ação"; + @Autowired private UserService userService; @@ -50,6 +54,9 @@ public class UserResource { @Autowired PasswordEncoder passwordEncoder; + @Autowired + private UserMapper userMapper; + public UserResource(UserService userService) { this.userService = userService; } @@ -67,12 +74,14 @@ public ResponseEntity saveUser(@RequestBody UserDTO userDto) { user.setCreationDate(LocalDateTime.now(ZoneId.of("UTC"))); user.setLastUpdateDate(LocalDateTime.now(ZoneId.of("UTC"))); user.getRoles().add(role); + user.setStats(UserStats.AVAILABLE); userService.save(user); log.info(USER_SAVED_SUCCESSFULLY_LOG, user.getUserName()); return new ResponseEntity<>(HttpStatus.CREATED); } + @PreAuthorize( "hasRole('ROLE_ADMINISTRATOR')" ) @GetMapping @Operation(summary = "Retorna todos os usuários cadastrados") public ResponseEntity> getAllUsers( @@ -84,6 +93,7 @@ public ResponseEntity> getAllUsers( return ResponseEntity.status(HttpStatus.OK).body(users); } + @PreAuthorize( "hasAnyRole('ROLE_ADMINISTRATOR', 'ROLE_HOST', 'ROLE_GUEST')" ) @GetMapping("email/{email}") @Operation(summary = "Retorna um usuario pelo email") public ResponseEntity getUserByEmail(@PathVariable("email") String email) { @@ -95,6 +105,7 @@ public ResponseEntity getUserByEmail(@PathVariable("email") String email return new ResponseEntity<>(user, HttpStatus.OK); } + @PreAuthorize( "hasAnyRole('ROLE_ADMINISTRATOR', 'ROLE_HOST', 'ROLE_GUEST')" ) @GetMapping("{id}") @Operation(summary = "Retorna um usuario pelo id") public ResponseEntity getUserById(@PathVariable("id") String id) { @@ -106,7 +117,7 @@ public ResponseEntity getUserById(@PathVariable("id") String id) { return new ResponseEntity<>(user, HttpStatus.OK); } - + @PreAuthorize( "hasAnyRole('ROLE_ADMINISTRATOR', 'ROLE_HOST', 'ROLE_GUEST')" ) @PutMapping("{id}") @Operation(summary = "Atualiza um usuario pelo id") public ResponseEntity updateUser(@RequestBody UserDTO userDTO, @PathVariable("id")String id) { @@ -116,11 +127,12 @@ public ResponseEntity updateUser(@RequestBody UserDTO userDTO, @PathVar } userService.isOwnerOrAdmin(user); var userModel = user.get(); - BeanUtils.copyProperties(userDTO, userModel); + userMapper.updateUserFromDto(userDTO, userModel); userService.save(userModel); return new ResponseEntity<>(userModel, HttpStatus.OK); } + @PreAuthorize( "hasAnyRole('ROLE_ADMINISTRATOR', 'ROLE_HOST', 'ROLE_GUEST')" ) @DeleteMapping("{id}") @Operation(summary = "Remove um usuario pelo seu id") public ResponseEntity deleteUser(@PathVariable("id") String id) { diff --git a/cadastral/src/main/java/com/unipampa/crud/sender/AccommodationSender.java b/cadastral/src/main/java/com/unipampa/crud/sender/AccommodationSender.java index 02537948..0659d3bc 100644 --- a/cadastral/src/main/java/com/unipampa/crud/sender/AccommodationSender.java +++ b/cadastral/src/main/java/com/unipampa/crud/sender/AccommodationSender.java @@ -1,6 +1,8 @@ package com.unipampa.crud.sender; +import com.unipampa.crud.dto.AccommodationMessageDTO; import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -21,6 +23,8 @@ public AccommodationSender(RabbitTemplate rabbitTemplate) { } public void sendMessage(Accommodation accommodation) { + AccommodationMessageDTO dto = new AccommodationMessageDTO(); + BeanUtils.copyProperties(accommodation, dto); rabbitTemplate.convertAndSend(exchange, "", accommodation); } diff --git a/cadastral/src/main/java/com/unipampa/crud/service/impl/AccommodationServiceImpl.java b/cadastral/src/main/java/com/unipampa/crud/service/impl/AccommodationServiceImpl.java index 4cb37561..63b7d735 100644 --- a/cadastral/src/main/java/com/unipampa/crud/service/impl/AccommodationServiceImpl.java +++ b/cadastral/src/main/java/com/unipampa/crud/service/impl/AccommodationServiceImpl.java @@ -2,9 +2,11 @@ import com.unipampa.crud.config.security.SecurityUtil; import com.unipampa.crud.entities.Accommodation; +import com.unipampa.crud.enums.AccommodationStats; import com.unipampa.crud.repository.AccommodationRepository; import com.unipampa.crud.sender.AccommodationSender; import com.unipampa.crud.service.AccommodationService; +import jakarta.persistence.EntityNotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -59,7 +61,16 @@ public List findAll() { @Override public void delete(String id) { - propertyRepository.deleteById(id); + Accommodation property = propertyRepository.findById(id) + .orElseThrow(() -> new EntityNotFoundException("Property not found with id: " + id)); + // Atualiza o status para INATIVO + property.setStats(AccommodationStats.UNAVAILABLE); + + // Salva novamente no banco de dados + Accommodation updatedProperty = propertyRepository.save(property); + + // Envia a mensagem para o microsserviço transacional + accommodationSender.sendMessage(updatedProperty); } diff --git a/cadastral/src/main/java/com/unipampa/crud/service/impl/UserServiceImpl.java b/cadastral/src/main/java/com/unipampa/crud/service/impl/UserServiceImpl.java index d2e551c5..100b50ed 100644 --- a/cadastral/src/main/java/com/unipampa/crud/service/impl/UserServiceImpl.java +++ b/cadastral/src/main/java/com/unipampa/crud/service/impl/UserServiceImpl.java @@ -2,10 +2,12 @@ import com.unipampa.crud.config.security.SecurityUtil; import com.unipampa.crud.entities.User; +import com.unipampa.crud.enums.UserStats; import com.unipampa.crud.exceptions.ResourceNotFoundException; import com.unipampa.crud.repository.UserRepository; import com.unipampa.crud.sender.UserSender; import com.unipampa.crud.service.UserService; +import jakarta.persistence.EntityNotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -46,7 +48,11 @@ public List findAll() { @Override public void delete(String id) { - userRepository.deleteById(id); + User user = userRepository.findById(id) + .orElseThrow(() -> new EntityNotFoundException("User not found with id: " + id)); + user.setStats(UserStats.UNAVAILABLE); + userRepository.save(user); + userSender.sendMessage(user); } @Override diff --git a/cadastral/src/main/resources/.env b/cadastral/src/main/resources/.env new file mode 100644 index 00000000..844d3663 --- /dev/null +++ b/cadastral/src/main/resources/.env @@ -0,0 +1,12 @@ +# Variáveis relacionadas ao MongoDB +ADMIN1_USERNAME=samuel +ADMIN1_PASSWORD=123456 + +ADMIN2_USERNAME=denner +ADMIN2_PASSWORD=123456 + +ADMIN3_USERNAME=basso +ADMIN3_PASSWORD=123456 + +ADMIN4_USERNAME=auri +ADMIN4_PASSWORD=123456 diff --git a/cadastral/src/main/resources/application-dev.yml b/cadastral/src/main/resources/application-dev.yml index e8b616de..9e2fa64c 100644 --- a/cadastral/src/main/resources/application-dev.yml +++ b/cadastral/src/main/resources/application-dev.yml @@ -1,13 +1,20 @@ -# SONAR LOCAL: mvn clean verify sonar:sonar -Dsonar.projectKey=Imovato -Dsonar.host.url=http://localhost:9000 -Dsonar.login=sqp_8065f01e13e240636a05812095cc3af86e62507c +## SONAR LOCAL: mvn clean verify sonar:sonar -Dsonar.projectKey=Imovato -Dsonar.host.url=http://localhost:9000 -Dsonar.login=sqp_8065f01e13e240636a05812095cc3af86e62507c server: - port: ${PORT:0} - servlet: - context-path: + port: 5757 spring: + application: + name: cadastral + config: + import: 'optional:configserver:' + cloud: + config: + discovery: + service-id: config-server + jpa: generate-ddl: false - + autoconfigure: exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration jmx: @@ -17,22 +24,15 @@ spring: mongodb: host: localhost port: 27017 - database: crud-service + database: cadastral auto-index-creation: true - mongodb: - embedded: - version: 4.0.21 - sql: - init: - mode: always - schema-locations: classpath:db/init-mongo.js rabbitmq: host: localhost port: 5672 - username: guest - password: guest + username: un_user + password: un_user crud: rabbitmq: @@ -45,8 +45,8 @@ crud: ead: serviceRegistry: - username: admin - password: '123456' + username: un_user + password: 'un_user' eureka: client: @@ -55,4 +55,4 @@ eureka: service-url: defaultZone: 'http://${ead.serviceRegistry.username}:${ead.serviceRegistry.password}@localhost:8761/eureka' app: - uploads-dir: C:/Users/Samuel Modesto/OneDrive/Documentos/Projetos/TCC/imovato/backend/cadastral/uploads/imoveis \ No newline at end of file + uploads-dir: C:/Users/Samuel Modesto/OneDrive/Documentos/Projetos/TCC/imovato/backend/cadastral/uploads/ \ No newline at end of file diff --git a/cadastral/src/main/resources/application-hlg.yml b/cadastral/src/main/resources/application-hlg.yml deleted file mode 100644 index e836caeb..00000000 --- a/cadastral/src/main/resources/application-hlg.yml +++ /dev/null @@ -1,44 +0,0 @@ -# SONAR LOCAL: mvn clean verify sonar:sonar -Dsonar.projectKey=Imovato -Dsonar.host.url=http://localhost:9000 -Dsonar.login=sqp_8065f01e13e240636a05812095cc3af86e62507c - - jpa: - show-sql: true - hibernate: - ddl-auto: update - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL57Dialect - jmx: - enabled: false - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:33060/crud-service?useTimezone=true&serverTimezone=UTC - username: root - password: example - - data: - mongodb: - host: localhost - port: 27017 - database: crud-service - - rabbitmq: - host: localhost - port: 5672 - username: guest - password: guest - -crud: - rabbitmq: - exchange: crud.exchange - routingkeyProperty: crud.property.routingkey - routingkeyUser: crud.user.routingkey - authExchange: auth.exchange - signupQueue: auth.signup - - -eureka: - instance: - hostname: discovery-prod-df66734906f8.herokuapp.com - client: - serviceUrl: - defaultZone: https://discovery-prod-df66734906f8.herokuapp.com/eureka/ diff --git a/cadastral/src/main/resources/application.yml b/cadastral/src/main/resources/application.yml index db58590c..db40f783 100644 --- a/cadastral/src/main/resources/application.yml +++ b/cadastral/src/main/resources/application.yml @@ -1,7 +1,11 @@ -# SONAR LOCAL: mvn clean verify sonar:sonar -Dsonar.projectKey=Imovato -Dsonar.host.url=http://localhost:9000 -Dsonar.login=sqp_8065f01e13e240636a05812095cc3af86e62507c spring: application: - name: CrudService - profiles: - active: dev + name: cadastral + config: + import: "configserver:" + cloud: + config: + discovery: + enabled: true + service-id: config-server \ No newline at end of file diff --git a/cadastral/src/main/resources/db/init-mongo.js b/cadastral/src/main/resources/db/init-mongo.js deleted file mode 100644 index 29e7cbd4..00000000 --- a/cadastral/src/main/resources/db/init-mongo.js +++ /dev/null @@ -1,25 +0,0 @@ -// Verifica se a collection roles existe e a limpa se necessário -db.role.drop(); - -// Define as roles com UUIDs -const roles = [ - { - _id: "65f3c89d-8f45-4732-9021-f84d559d6a12", - roleName: "ROLE_HOST" - }, - { - _id: "65f3c89d-8f45-4732-9021-f84d559d6a13", - roleName: "ROLE_GUEST" - }, - { - _id: "65f3c89d-8f45-4732-9021-f84d559d6a14", - roleName: "ROLE_ADMINISTRATOR" - } -]; - -// Insere as roles -db.role.insertMany(roles); - -// Verifica se foram inseridas -print("Roles criadas:"); -db.role.find().pretty(); \ No newline at end of file diff --git a/cadastral/src/main/resources/db/init-users-mongo.js b/cadastral/src/main/resources/db/init-users-mongo.js deleted file mode 100644 index 3c818485..00000000 --- a/cadastral/src/main/resources/db/init-users-mongo.js +++ /dev/null @@ -1,31 +0,0 @@ -// Verifica se a collection "user" existe e a limpa se necessário -db.user.drop(); - -// Verifica se as roles já existem no banco -const hostRole = db.role.findOne({ roleName: "ROLE_GUEST" }); -if (!hostRole) { - throw new Error("Role 'ROLE_GUEST' não encontrada no banco de dados."); -} - - -// Cria o objeto para o usuário -const user = { - _id: ObjectId(), // Cria um ObjectId único para o usuário - userName: "isadora", - password: "123456", // A senha precisa ser criptografada no backend antes de ser usada - cpf: "090354949312634423547364354224", - email: "samuedl@gmfaiflfl.codm.BR", - name: "string", - phone: "string", - type: "ROLE_GUEST", // Associado ao tipo do usuário - roles: [hostRole._id], // Relacionamento com a role "HOST" - creationDate: new Date(), - lastUpdateDate: new Date(), -}; - -// Insere o usuário no banco -db.user.insert(user); - -// Verifica se o usuário foi inserido -print("Usuário criado:"); -db.user.find().pretty(); \ No newline at end of file diff --git a/cadastral/uploads/68826b3f16ab226cd91043bc/2c2152ff-d475-48f9-8c44-37acc396c0f7-image9.jpg b/cadastral/uploads/68826b3f16ab226cd91043bc/2c2152ff-d475-48f9-8c44-37acc396c0f7-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/68826b3f16ab226cd91043bc/2c2152ff-d475-48f9-8c44-37acc396c0f7-image9.jpg differ diff --git a/cadastral/uploads/68826b3f16ab226cd91043bc/5049ff38-462e-4420-bf7f-5c366433f748-image10.png b/cadastral/uploads/68826b3f16ab226cd91043bc/5049ff38-462e-4420-bf7f-5c366433f748-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/68826b3f16ab226cd91043bc/5049ff38-462e-4420-bf7f-5c366433f748-image10.png differ diff --git a/cadastral/uploads/68826b3f16ab226cd91043bc/553d7259-b8b7-4eaf-84c5-53631f3930f6-image8.jpg b/cadastral/uploads/68826b3f16ab226cd91043bc/553d7259-b8b7-4eaf-84c5-53631f3930f6-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/68826b3f16ab226cd91043bc/553d7259-b8b7-4eaf-84c5-53631f3930f6-image8.jpg differ diff --git a/cadastral/uploads/68826b4a16ab226cd91043bd/355e9a09-2d6f-4054-a690-b0848e7b0ed1-image8.jpg b/cadastral/uploads/68826b4a16ab226cd91043bd/355e9a09-2d6f-4054-a690-b0848e7b0ed1-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/68826b4a16ab226cd91043bd/355e9a09-2d6f-4054-a690-b0848e7b0ed1-image8.jpg differ diff --git a/cadastral/uploads/68826b4a16ab226cd91043bd/6c49ef50-6666-4307-a714-aee74b16ad85-image9.jpg b/cadastral/uploads/68826b4a16ab226cd91043bd/6c49ef50-6666-4307-a714-aee74b16ad85-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/68826b4a16ab226cd91043bd/6c49ef50-6666-4307-a714-aee74b16ad85-image9.jpg differ diff --git a/cadastral/uploads/68826b4a16ab226cd91043bd/d273b28b-a4cd-471d-b7dc-f862fd0f6a49-image10.png b/cadastral/uploads/68826b4a16ab226cd91043bd/d273b28b-a4cd-471d-b7dc-f862fd0f6a49-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/68826b4a16ab226cd91043bd/d273b28b-a4cd-471d-b7dc-f862fd0f6a49-image10.png differ diff --git a/cadastral/uploads/68826d1a95e5bf2053d1d809/3bfbd682-6c29-4502-aeff-cdb647c06f69-image9.jpg b/cadastral/uploads/68826d1a95e5bf2053d1d809/3bfbd682-6c29-4502-aeff-cdb647c06f69-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/68826d1a95e5bf2053d1d809/3bfbd682-6c29-4502-aeff-cdb647c06f69-image9.jpg differ diff --git a/cadastral/uploads/68826d1a95e5bf2053d1d809/b6c9aa03-5be1-4a13-a47f-45ab505131e9-image10.png b/cadastral/uploads/68826d1a95e5bf2053d1d809/b6c9aa03-5be1-4a13-a47f-45ab505131e9-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/68826d1a95e5bf2053d1d809/b6c9aa03-5be1-4a13-a47f-45ab505131e9-image10.png differ diff --git a/cadastral/uploads/68826d1a95e5bf2053d1d809/ea2c1ec7-6713-47da-9a3d-c249b83246f8-image8.jpg b/cadastral/uploads/68826d1a95e5bf2053d1d809/ea2c1ec7-6713-47da-9a3d-c249b83246f8-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/68826d1a95e5bf2053d1d809/ea2c1ec7-6713-47da-9a3d-c249b83246f8-image8.jpg differ diff --git a/cadastral/uploads/68826d9a95e5bf2053d1d80a/68e59853-2ebb-4ee1-9b99-f7d1cced236a-image9.jpg b/cadastral/uploads/68826d9a95e5bf2053d1d80a/68e59853-2ebb-4ee1-9b99-f7d1cced236a-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/68826d9a95e5bf2053d1d80a/68e59853-2ebb-4ee1-9b99-f7d1cced236a-image9.jpg differ diff --git a/cadastral/uploads/68826d9a95e5bf2053d1d80a/cf9752f2-8a9a-4423-bc70-ce0ac56ec042-image8.jpg b/cadastral/uploads/68826d9a95e5bf2053d1d80a/cf9752f2-8a9a-4423-bc70-ce0ac56ec042-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/68826d9a95e5bf2053d1d80a/cf9752f2-8a9a-4423-bc70-ce0ac56ec042-image8.jpg differ diff --git a/cadastral/uploads/68826d9a95e5bf2053d1d80a/ddde2aa6-ab82-4245-b1ad-fc9ed43be012-image10.png b/cadastral/uploads/68826d9a95e5bf2053d1d80a/ddde2aa6-ab82-4245-b1ad-fc9ed43be012-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/68826d9a95e5bf2053d1d80a/ddde2aa6-ab82-4245-b1ad-fc9ed43be012-image10.png differ diff --git a/cadastral/uploads/68826f4510bd9260540a2d85/0e5ae327-d511-4880-b10c-d48ee0f19047-image9.jpg b/cadastral/uploads/68826f4510bd9260540a2d85/0e5ae327-d511-4880-b10c-d48ee0f19047-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/68826f4510bd9260540a2d85/0e5ae327-d511-4880-b10c-d48ee0f19047-image9.jpg differ diff --git a/cadastral/uploads/68826f4510bd9260540a2d85/dffcf61c-4f96-4511-a684-1cfcdf1f4414-image10.png b/cadastral/uploads/68826f4510bd9260540a2d85/dffcf61c-4f96-4511-a684-1cfcdf1f4414-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/68826f4510bd9260540a2d85/dffcf61c-4f96-4511-a684-1cfcdf1f4414-image10.png differ diff --git a/cadastral/uploads/68826f4510bd9260540a2d85/e0976763-61bb-4d9c-b26b-656fd8a20cab-image8.jpg b/cadastral/uploads/68826f4510bd9260540a2d85/e0976763-61bb-4d9c-b26b-656fd8a20cab-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/68826f4510bd9260540a2d85/e0976763-61bb-4d9c-b26b-656fd8a20cab-image8.jpg differ diff --git a/cadastral/uploads/6882702910bd9260540a2d86/a3eb10e0-55c6-49cc-975f-cde949cc192f-image10.png b/cadastral/uploads/6882702910bd9260540a2d86/a3eb10e0-55c6-49cc-975f-cde949cc192f-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/6882702910bd9260540a2d86/a3eb10e0-55c6-49cc-975f-cde949cc192f-image10.png differ diff --git a/cadastral/uploads/6882702910bd9260540a2d86/b70f267b-a0a2-4550-8e39-d89472133d10-image8.jpg b/cadastral/uploads/6882702910bd9260540a2d86/b70f267b-a0a2-4550-8e39-d89472133d10-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/6882702910bd9260540a2d86/b70f267b-a0a2-4550-8e39-d89472133d10-image8.jpg differ diff --git a/cadastral/uploads/6882702910bd9260540a2d86/e12bf50d-9847-4b4a-9e01-4854329f7b47-image9.jpg b/cadastral/uploads/6882702910bd9260540a2d86/e12bf50d-9847-4b4a-9e01-4854329f7b47-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/6882702910bd9260540a2d86/e12bf50d-9847-4b4a-9e01-4854329f7b47-image9.jpg differ diff --git a/cadastral/uploads/688270e110bd9260540a2d87/0e3a80c1-81b8-464d-9204-367dc3c5f06b-image10.png b/cadastral/uploads/688270e110bd9260540a2d87/0e3a80c1-81b8-464d-9204-367dc3c5f06b-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/688270e110bd9260540a2d87/0e3a80c1-81b8-464d-9204-367dc3c5f06b-image10.png differ diff --git a/cadastral/uploads/688270e110bd9260540a2d87/5854e5e9-af85-4bd2-8134-273c2e44b2c0-image8.jpg b/cadastral/uploads/688270e110bd9260540a2d87/5854e5e9-af85-4bd2-8134-273c2e44b2c0-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/688270e110bd9260540a2d87/5854e5e9-af85-4bd2-8134-273c2e44b2c0-image8.jpg differ diff --git a/cadastral/uploads/688270e110bd9260540a2d87/dc40f014-dac5-476b-8591-e50bb78bcb6e-image9.jpg b/cadastral/uploads/688270e110bd9260540a2d87/dc40f014-dac5-476b-8591-e50bb78bcb6e-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/688270e110bd9260540a2d87/dc40f014-dac5-476b-8591-e50bb78bcb6e-image9.jpg differ diff --git a/cadastral/uploads/6882929c1036e11a5cbd37cf/1f3f6781-29f6-4fea-8382-0c3d888827f0-image8.jpg b/cadastral/uploads/6882929c1036e11a5cbd37cf/1f3f6781-29f6-4fea-8382-0c3d888827f0-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/6882929c1036e11a5cbd37cf/1f3f6781-29f6-4fea-8382-0c3d888827f0-image8.jpg differ diff --git a/cadastral/uploads/6882929c1036e11a5cbd37cf/48e2963c-b249-4a29-a355-aceefc5d27d8-image10.png b/cadastral/uploads/6882929c1036e11a5cbd37cf/48e2963c-b249-4a29-a355-aceefc5d27d8-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/6882929c1036e11a5cbd37cf/48e2963c-b249-4a29-a355-aceefc5d27d8-image10.png differ diff --git a/cadastral/uploads/6882929c1036e11a5cbd37cf/962ddd98-b4f7-42bb-84f0-eacba6bfe3fe-image9.jpg b/cadastral/uploads/6882929c1036e11a5cbd37cf/962ddd98-b4f7-42bb-84f0-eacba6bfe3fe-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/6882929c1036e11a5cbd37cf/962ddd98-b4f7-42bb-84f0-eacba6bfe3fe-image9.jpg differ diff --git a/cadastral/uploads/688297b61036e11a5cbd37d4/72e051cc-1936-4bd6-98ba-cadb06ddfd2a-image9.jpg b/cadastral/uploads/688297b61036e11a5cbd37d4/72e051cc-1936-4bd6-98ba-cadb06ddfd2a-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/688297b61036e11a5cbd37d4/72e051cc-1936-4bd6-98ba-cadb06ddfd2a-image9.jpg differ diff --git a/cadastral/uploads/688297b61036e11a5cbd37d4/7bdd9119-54db-407d-af48-700d837a6fa9-image10.png b/cadastral/uploads/688297b61036e11a5cbd37d4/7bdd9119-54db-407d-af48-700d837a6fa9-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/688297b61036e11a5cbd37d4/7bdd9119-54db-407d-af48-700d837a6fa9-image10.png differ diff --git a/cadastral/uploads/688297b61036e11a5cbd37d4/dd20f223-0eee-44fa-97b0-b4a5846f01bf-image8.jpg b/cadastral/uploads/688297b61036e11a5cbd37d4/dd20f223-0eee-44fa-97b0-b4a5846f01bf-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/688297b61036e11a5cbd37d4/dd20f223-0eee-44fa-97b0-b4a5846f01bf-image8.jpg differ diff --git a/cadastral/uploads/688298111036e11a5cbd37d5/5858b783-4c48-48d5-8a2c-0e37237c4de9-image8.jpg b/cadastral/uploads/688298111036e11a5cbd37d5/5858b783-4c48-48d5-8a2c-0e37237c4de9-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/688298111036e11a5cbd37d5/5858b783-4c48-48d5-8a2c-0e37237c4de9-image8.jpg differ diff --git a/cadastral/uploads/688298111036e11a5cbd37d5/c344ccc3-be93-452f-8bc1-9b1678ae7814-image10.png b/cadastral/uploads/688298111036e11a5cbd37d5/c344ccc3-be93-452f-8bc1-9b1678ae7814-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/688298111036e11a5cbd37d5/c344ccc3-be93-452f-8bc1-9b1678ae7814-image10.png differ diff --git a/cadastral/uploads/688298111036e11a5cbd37d5/cf10cbf3-764c-4aea-8ac5-f8c7a0c4e4d2-image9.jpg b/cadastral/uploads/688298111036e11a5cbd37d5/cf10cbf3-764c-4aea-8ac5-f8c7a0c4e4d2-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/688298111036e11a5cbd37d5/cf10cbf3-764c-4aea-8ac5-f8c7a0c4e4d2-image9.jpg differ diff --git a/cadastral/uploads/68879e97b534697f1c7c6256/8ee689f7-9cd0-4fad-b292-1a07ebb1a39d-image8.jpg b/cadastral/uploads/68879e97b534697f1c7c6256/8ee689f7-9cd0-4fad-b292-1a07ebb1a39d-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/68879e97b534697f1c7c6256/8ee689f7-9cd0-4fad-b292-1a07ebb1a39d-image8.jpg differ diff --git a/cadastral/uploads/68879e97b534697f1c7c6256/df5dcfea-bf61-41d7-9b29-4d6e76b91008-image9.jpg b/cadastral/uploads/68879e97b534697f1c7c6256/df5dcfea-bf61-41d7-9b29-4d6e76b91008-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/68879e97b534697f1c7c6256/df5dcfea-bf61-41d7-9b29-4d6e76b91008-image9.jpg differ diff --git a/cadastral/uploads/68879e97b534697f1c7c6256/f9d08279-eb36-4019-bf6b-bf0547a7a063-image10.png b/cadastral/uploads/68879e97b534697f1c7c6256/f9d08279-eb36-4019-bf6b-bf0547a7a063-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/68879e97b534697f1c7c6256/f9d08279-eb36-4019-bf6b-bf0547a7a063-image10.png differ diff --git a/cadastral/uploads/68879f46b534697f1c7c6257/04d42396-0775-4a7a-bc38-5986056c8ff6-image9.jpg b/cadastral/uploads/68879f46b534697f1c7c6257/04d42396-0775-4a7a-bc38-5986056c8ff6-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/68879f46b534697f1c7c6257/04d42396-0775-4a7a-bc38-5986056c8ff6-image9.jpg differ diff --git a/cadastral/uploads/68879f46b534697f1c7c6257/833e376e-0f79-4b23-a3ec-d0f12207070e-image8.jpg b/cadastral/uploads/68879f46b534697f1c7c6257/833e376e-0f79-4b23-a3ec-d0f12207070e-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/68879f46b534697f1c7c6257/833e376e-0f79-4b23-a3ec-d0f12207070e-image8.jpg differ diff --git a/cadastral/uploads/68879f46b534697f1c7c6257/e37750bd-4726-484b-b231-1ee08f69fc49-image10.png b/cadastral/uploads/68879f46b534697f1c7c6257/e37750bd-4726-484b-b231-1ee08f69fc49-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/68879f46b534697f1c7c6257/e37750bd-4726-484b-b231-1ee08f69fc49-image10.png differ diff --git a/cadastral/uploads/68879f4fb534697f1c7c6258/386bde06-7419-4714-adfd-1fecc5673da7-image10.png b/cadastral/uploads/68879f4fb534697f1c7c6258/386bde06-7419-4714-adfd-1fecc5673da7-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/68879f4fb534697f1c7c6258/386bde06-7419-4714-adfd-1fecc5673da7-image10.png differ diff --git a/cadastral/uploads/68879f4fb534697f1c7c6258/9efecc87-0ee9-4b1a-9e35-d4a8010c1656-image9.jpg b/cadastral/uploads/68879f4fb534697f1c7c6258/9efecc87-0ee9-4b1a-9e35-d4a8010c1656-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/68879f4fb534697f1c7c6258/9efecc87-0ee9-4b1a-9e35-d4a8010c1656-image9.jpg differ diff --git a/cadastral/uploads/68879f4fb534697f1c7c6258/a0852835-939a-4404-b6bf-fc6436f46583-image8.jpg b/cadastral/uploads/68879f4fb534697f1c7c6258/a0852835-939a-4404-b6bf-fc6436f46583-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/68879f4fb534697f1c7c6258/a0852835-939a-4404-b6bf-fc6436f46583-image8.jpg differ diff --git a/cadastral/uploads/68879f67b534697f1c7c6259/3f02a13a-3a91-4f36-bdd2-004c4d6925eb-image8.jpg b/cadastral/uploads/68879f67b534697f1c7c6259/3f02a13a-3a91-4f36-bdd2-004c4d6925eb-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/68879f67b534697f1c7c6259/3f02a13a-3a91-4f36-bdd2-004c4d6925eb-image8.jpg differ diff --git a/cadastral/uploads/68879f67b534697f1c7c6259/735852b7-cb99-4723-9a4f-982b1e40bd3c-image9.jpg b/cadastral/uploads/68879f67b534697f1c7c6259/735852b7-cb99-4723-9a4f-982b1e40bd3c-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/68879f67b534697f1c7c6259/735852b7-cb99-4723-9a4f-982b1e40bd3c-image9.jpg differ diff --git a/cadastral/uploads/68879f67b534697f1c7c6259/a835ec27-91c9-47ae-9d65-16e7253cd157-image10.png b/cadastral/uploads/68879f67b534697f1c7c6259/a835ec27-91c9-47ae-9d65-16e7253cd157-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/68879f67b534697f1c7c6259/a835ec27-91c9-47ae-9d65-16e7253cd157-image10.png differ diff --git a/cadastral/uploads/68879f8cb534697f1c7c625a/a698ac57-6ccc-4596-a079-4c4e2f6f97c2-image9.jpg b/cadastral/uploads/68879f8cb534697f1c7c625a/a698ac57-6ccc-4596-a079-4c4e2f6f97c2-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/68879f8cb534697f1c7c625a/a698ac57-6ccc-4596-a079-4c4e2f6f97c2-image9.jpg differ diff --git a/cadastral/uploads/68879f8cb534697f1c7c625a/deadfcaa-3453-47bf-adf9-a8ff74b595b5-image8.jpg b/cadastral/uploads/68879f8cb534697f1c7c625a/deadfcaa-3453-47bf-adf9-a8ff74b595b5-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/68879f8cb534697f1c7c625a/deadfcaa-3453-47bf-adf9-a8ff74b595b5-image8.jpg differ diff --git a/cadastral/uploads/68879f8cb534697f1c7c625a/ed7a2161-dc7e-490b-9936-6cfbb4c6a80a-image10.png b/cadastral/uploads/68879f8cb534697f1c7c625a/ed7a2161-dc7e-490b-9936-6cfbb4c6a80a-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/68879f8cb534697f1c7c625a/ed7a2161-dc7e-490b-9936-6cfbb4c6a80a-image10.png differ diff --git a/cadastral/uploads/imoveis6882684f7636cc3b937718dd/5d3dbb73-6599-4847-8116-0a3649bda962-image10.png b/cadastral/uploads/imoveis6882684f7636cc3b937718dd/5d3dbb73-6599-4847-8116-0a3649bda962-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/imoveis6882684f7636cc3b937718dd/5d3dbb73-6599-4847-8116-0a3649bda962-image10.png differ diff --git a/cadastral/uploads/imoveis6882684f7636cc3b937718dd/d490f31a-a617-43bb-8e85-b3952ef32181-image8.jpg b/cadastral/uploads/imoveis6882684f7636cc3b937718dd/d490f31a-a617-43bb-8e85-b3952ef32181-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/imoveis6882684f7636cc3b937718dd/d490f31a-a617-43bb-8e85-b3952ef32181-image8.jpg differ diff --git a/cadastral/uploads/imoveis6882684f7636cc3b937718dd/ed170666-112e-4e12-b1ea-863b4d3722f4-image9.jpg b/cadastral/uploads/imoveis6882684f7636cc3b937718dd/ed170666-112e-4e12-b1ea-863b4d3722f4-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/imoveis6882684f7636cc3b937718dd/ed170666-112e-4e12-b1ea-863b4d3722f4-image9.jpg differ diff --git a/cadastral/uploads/imoveis6887f4641dd09475a23ba23a/32cae174-108c-4a66-b272-ee6b08e7ce4c-image9.jpg b/cadastral/uploads/imoveis6887f4641dd09475a23ba23a/32cae174-108c-4a66-b272-ee6b08e7ce4c-image9.jpg new file mode 100644 index 00000000..d8e4775e Binary files /dev/null and b/cadastral/uploads/imoveis6887f4641dd09475a23ba23a/32cae174-108c-4a66-b272-ee6b08e7ce4c-image9.jpg differ diff --git a/cadastral/uploads/imoveis6887f4641dd09475a23ba23a/59e29223-15a7-4006-bc34-7f551338caa7-image10.png b/cadastral/uploads/imoveis6887f4641dd09475a23ba23a/59e29223-15a7-4006-bc34-7f551338caa7-image10.png new file mode 100644 index 00000000..e1dd8859 Binary files /dev/null and b/cadastral/uploads/imoveis6887f4641dd09475a23ba23a/59e29223-15a7-4006-bc34-7f551338caa7-image10.png differ diff --git a/cadastral/uploads/imoveis6887f4641dd09475a23ba23a/9fcb7fee-c409-4561-a7a1-eac32a3f01f6-image8.jpg b/cadastral/uploads/imoveis6887f4641dd09475a23ba23a/9fcb7fee-c409-4561-a7a1-eac32a3f01f6-image8.jpg new file mode 100644 index 00000000..edc538b4 Binary files /dev/null and b/cadastral/uploads/imoveis6887f4641dd09475a23ba23a/9fcb7fee-c409-4561-a7a1-eac32a3f01f6-image8.jpg differ diff --git a/discovery/src/main/java/com/example/discovery/config/SecurityConfig.java b/discovery/src/main/java/com/example/discovery/config/SecurityConfig.java index 46ace5dc..76078e8a 100644 --- a/discovery/src/main/java/com/example/discovery/config/SecurityConfig.java +++ b/discovery/src/main/java/com/example/discovery/config/SecurityConfig.java @@ -33,8 +33,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti @Bean public UserDetailsService userDetailsService(PasswordEncoder encoder) { UserDetails user = User.builder() - .username("admin") - .password(encoder.encode("123456")) + .username("un_user") + .password(encoder.encode("un_user")) .roles("ADMIN") .build(); diff --git a/discovery/src/main/resources/application-dev.yml b/discovery/src/main/resources/application-dev.yml index 450a35d7..a1a7467b 100644 --- a/discovery/src/main/resources/application-dev.yml +++ b/discovery/src/main/resources/application-dev.yml @@ -4,6 +4,14 @@ server: spring: application: name: discovery + data: + mongodb: + host: localhost + port: 27017 + database: cadastral + username: un_user + password: un_user + auto-index-creation: true ead: serviceRegistry: @@ -13,6 +21,4 @@ ead: eureka: client: registerWithEureka: false - fetchRegistry: false - service-url: - defaultZone: 'http://${ead.serviceRegistry.username}:${ead.serviceRegistry.password}@localhost:8761/eureka' + fetchRegistry: false \ No newline at end of file diff --git a/docker-compose-deploy.yml b/docker-compose-deploy.yml deleted file mode 100644 index edd8d6c3..00000000 --- a/docker-compose-deploy.yml +++ /dev/null @@ -1,142 +0,0 @@ -version: '3.4' -services: - - ################################ DISCOVERY ################################ - discovery: - image: matt0balda/imovato:discovery - ports: - - 8087:8087 - networks: - - imovato-network - - ################################ GATEWAY ################################ - gateway: - image: matt0balda/imovato:gateway - ports: - - 8080:8080 - depends_on: - - discovery - environment: - EUREKA.CLIENT.SERVICEURL.DEFAULTZONE: http://discovery:8087/discovery/eureka - networks: - - imovato-network - - ################################ MICRO-SERVICES ################################ - crud-service: - image: crud-service - restart: always - build: - context: . - dockerfile: CrudService/Dockerfile - environment: - TZ: America/Sao_Paulo - EUREKA.CLIENT.SERVICEURL.DEFAULTZONE: http://discovery:8087/discovery/eureka - RABBIT_URI: amqp://guest:guest@rabbitmq:5672 - SPRING.RABBITMQ.HOST: rabbitmq - SPRING.RABBITMQ.USERNAME: admin - SPRING.RABBITMQ.PASSWORD: admin - SPRING.DATASOURCE.URL: jdbc:mysql://crud-db:3308/crud_service?useSSL=false&serverTimezone=UTC&enabledTLSProtocols=TLSv1.2 - SPRING.DATASOURCE.USERNAME: root - SPRING.DATASOURCE.PASSWORD: root - ports: - - 8081:8081 - depends_on: - - discovery - - gateway - - crud-db - - rabbitmq - networks: - - imovato-network - - rent-service: - image: rent-service - restart: always - build: - context: . - dockerfile: rent/Dockerfile - environment: - TZ: America/Sao_Paulo - EUREKA.CLIENT.SERVICEURL.DEFAULTZONE: http://discovery:8087/discovery/eureka - RABBIT_URI: amqp://guest:guest@rabbitmq:5672 - SPRING.RABBITMQ.HOST: rabbitmq - SPRING.RABBITMQ.USERNAME: admin - SPRING.RABBITMQ.PASSWORD: admin - SPRING.DATASOURCE.URL: jdbc:mysql://rent-db:3309/rent_service?useSSL=false&serverTimezone=UTC&enabledTLSProtocols=TLSv1.2 - SPRING.DATASOURCE.USERNAME: root - SPRING.DATASOURCE.PASSWORD: root - ports: - - 8085:8085 - depends_on: - - discovery - - gateway - - rent-db - - rabbitmq - networks: - - imovato-network - - ################################ DATA BASES ################################ - crud-db: - image: mysql:5.7.22 - command: --default-authentication-plugin=mysql_native_password - restart: always - environment: - TZ: America/Sao_Paulo - MYSQL_ROOT_PASSWORD: root - MYSQL_USER: root - MYSQL_PASSWORD: root - MYSQL_DATABASE: crud_service - MYSQL_ROOT_HOST: '%' - MYSQL_TCP_PORT: 3308 - ports: - - 3308:3308 - expose: - - 3308 - networks: - - imovato-network - - rent-db: - image: mysql:5.7.22 - command: --default-authentication-plugin=mysql_native_password - restart: always - environment: - TZ: America/Sao_Paulo - MYSQL_ROOT_PASSWORD: root - MYSQL_USER: root - MYSQL_PASSWORD: root - MYSQL_DATABASE: rent_service - MYSQL_ROOT_HOST: '%' - MYSQL_TCP_PORT: 3309 - ports: - - 3309:3309 - expose: - - 3309 - networks: - - imovato-network - - ################################ RABBIT-MQ ################################ - - rabbitmq: - image: rabbitmq:3-management - ports: - - 5672:5672 - - 15672:15672 - volumes: - - ./rabbit_definitions.json:/etc/rabbitmq/rabbit_definitions.json - - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf - - ./storage/rabbitmq1:/var/lib/rabbitmq - working_dir: /var/lib/rabbitmq - environment: - - RABBITMQ_ERLANG_COOKIE=secret_pass - #- RABBITMQ_DEFAULT_USER=admin - #- RABBITMQ_DEFAULT_PASS=admin - #- RABBITMQ_LOAD_DEFINITIONS=./rabbit_definitions.json - networks: - - imovato-network - -volumes: - #database: - rabbitmq: - -networks: - imovato-network: - driver: bridge \ No newline at end of file diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml deleted file mode 100644 index 0af28b7d..00000000 --- a/docker-compose-dev.yml +++ /dev/null @@ -1,29 +0,0 @@ -version: '3' -services: - db: - image: mysql - ports: - - 3306:3306 - volumes: - - ./storage/db:/var/lib/mysql - - ./scripts:/docker-entrypoint-initdb.d - environment: - - MYSQL_ROOT_PASSWORD=admin - rabbitmq: - image: rabbitmq:3-management - ports: - - 5672:5672 - - 15672:15672 - volumes: - - ./rabbit_definitions.json:/etc/rabbitmq/rabbit_definitions.json - - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf - - ./storage/rabbitmq1:/var/lib/rabbitmq - working_dir: /var/lib/rabbitmq - environment: - - RABBITMQ_ERLANG_COOKIE=secret_pass - #- RABBITMQ_DEFAULT_USER=admin - #- RABBITMQ_DEFAULT_PASS=admin - #- RABBITMQ_LOAD_DEFINITIONS=./rabbit_definitions.json -volumes: - db: - rabbitmq: \ No newline at end of file diff --git a/docker-compose-sonar.yml b/docker-compose-sonar.yml deleted file mode 100644 index f7a4ad06..00000000 --- a/docker-compose-sonar.yml +++ /dev/null @@ -1,43 +0,0 @@ -version: '3' -services: - sonarqube: - container_name: sonar - image: sonarqube:7.9.2-community - restart: always - ports: - - "9000:9000" - - "9092:9092" - networks: - - sonarnet - environment: - - sonar.jdbc.url=jdbc:postgresql://pg-sonar:5432/sonar - depends_on: - - pg-sonar - volumes: - - sonarqube_conf:/opt/sonarqube/conf - - sonarqube_data:/opt/sonarqube/data - - sonarqube_extensions:/opt/sonarqube/extensions - - sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins - - pg-sonar: - container_name: pg-sonar - image: postgres:9.6 - networks: - - sonarnet - environment: - - POSTGRES_USER=sonar - - POSTGRES_PASSWORD=sonar - volumes: - - postgresql:/var/lib/postgresql - - postgresql_data:/var/lib/postgresql/data - -networks: - sonarnet: - -volumes: - sonarqube_conf: - sonarqube_data: - sonarqube_extensions: - sonarqube_bundled-plugins: - postgresql: - postgresql_data: \ No newline at end of file diff --git a/gateway/pom.xml b/gateway/pom.xml index 0d53a93f..7eaa9f0e 100644 --- a/gateway/pom.xml +++ b/gateway/pom.xml @@ -50,6 +50,10 @@ reactor-test test + + org.springframework.cloud + spring-cloud-starter-config + diff --git a/gateway/src/main/java/com/imovato/gateway/GatewayApplication.java b/gateway/src/main/java/com/imovato/gateway/GatewayApplication.java index 4e4885ac..0eb59eae 100644 --- a/gateway/src/main/java/com/imovato/gateway/GatewayApplication.java +++ b/gateway/src/main/java/com/imovato/gateway/GatewayApplication.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +@EnableDiscoveryClient @SpringBootApplication public class GatewayApplication { diff --git a/gateway/src/main/resources/application-dev.yml b/gateway/src/main/resources/application-dev.yml new file mode 100644 index 00000000..dfaa83ac --- /dev/null +++ b/gateway/src/main/resources/application-dev.yml @@ -0,0 +1,26 @@ +spring: + application: + name: gateway + cloud: + gateway: + discovery: + locator: + enabled: true + lower-case-service-id: true + +server: + port: 5959 + +ead: + serviceRegistry: + username: un_user + password: 'un_user' + +eureka: + client: + registerWithEureka: true + fetchRegistry: true + service-url: + defaultZone: 'http://${ead.serviceRegistry.username}:${ead.serviceRegistry.password}@localhost:8761/eureka' + + diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index f01fbd62..c65d5a22 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -1,26 +1,9 @@ spring: application: name: gateway + config: + import: "configserver:" cloud: - gateway: + config: discovery: - locator: - enabled: true - lower-case-service-id: true - -server: - port: 8989 - -ead: - serviceRegistry: - username: admin - password: '123456' - -eureka: - client: - registerWithEureka: true - fetchRegistry: true - service-url: - defaultZone: 'http://${ead.serviceRegistry.username}:${ead.serviceRegistry.password}@localhost:8761/eureka' - - + service-id: config-server \ No newline at end of file diff --git a/kill_all.sh b/kill_all.sh deleted file mode 100755 index 45c6fe3f..00000000 --- a/kill_all.sh +++ /dev/null @@ -1 +0,0 @@ -lsof -ti :8080-8087 | xargs kill diff --git a/rabbit_definitions.json b/rabbit_definitions.json deleted file mode 100644 index f0aafe7f..00000000 --- a/rabbit_definitions.json +++ /dev/null @@ -1,182 +0,0 @@ -{ - "rabbit_version": "3.8.17", - "rabbitmq_version": "3.8.17", - "product_name": "RabbitMQ", - "product_version": "3.8.17", - "users": [ - { - "name": "admin", - "password_hash": "ixDLvGlM4yCHCPS50Xx9Ze3nmbBdCQaavHcS1t78XUJgRME2", - "hashing_algorithm": "rabbit_password_hashing_sha256", - "tags": "administrator", - "limits": {} - } - ], - "vhosts": [ - { - "name": "/" - } - ], - "permissions": [ - { - "user": "admin", - "vhost": "/", - "configure": ".*", - "write": ".*", - "read": ".*" - } - ], - "topic_permissions": [], - "parameters": [], - "global_parameters": [ - { - "name": "internal_cluster_id", - "value": "rabbitmq-cluster-id-iqJEfVGyMrrgjLsBNPU6_g" - } - ], - "policies": [], - "queues": [ - { - "name": "crud.acquisition.user", - "vhost": "/", - "durable": true, - "auto_delete": false, - "arguments": { - "x-queue-type": "classic" - } - }, - { - "name": "crud.scheduling.property", - "vhost": "/", - "durable": true, - "auto_delete": false, - "arguments": { - "x-queue-type": "classic" - } - }, - { - "name": "crud.acquisition.property", - "vhost": "/", - "durable": true, - "auto_delete": false, - "arguments": { - "x-queue-type": "classic" - } - }, - { - "name": "crud.rent.user", - "vhost": "/", - "durable": true, - "auto_delete": false, - "arguments": { - "x-queue-type": "classic" - } - }, - { - "name": "crud.payment.property", - "vhost": "/", - "durable": true, - "auto_delete": false, - "arguments": { - "x-queue-type": "classic" - } - }, - { - "name": "crud.rent.property", - "vhost": "/", - "durable": true, - "auto_delete": false, - "arguments": { - "x-queue-type": "classic" - } - }, - { - "name": "auth.signup", - "vhost": "/", - "durable": true, - "auto_delete": false, - "arguments": { - "x-queue-type": "classic" - } - }, - { - "name": "crud.scheduling.user", - "vhost": "/", - "durable": true, - "auto_delete": false, - "arguments": { - "x-queue-type": "classic" - } - } - ], - "exchanges": [ - { - "name": "auth.exchange", - "vhost": "/", - "type": "direct", - "durable": true, - "auto_delete": false, - "internal": false, - "arguments": {} - }, - { - "name": "crud.exchange", - "vhost": "/", - "type": "direct", - "durable": true, - "auto_delete": false, - "internal": false, - "arguments": {} - } - ], - "bindings": [ - { - "source": "auth.exchange", - "vhost": "/", - "destination": "auth.signup", - "destination_type": "queue", - "routing_key": "auth.signup.routingKey", - "arguments": {} - }, - { - "source": "crud.exchange", - "vhost": "/", - "destination": "crud.acquisition.property", - "destination_type": "queue", - "routing_key": "crud.property.routingkey", - "arguments": {} - }, - { - "source": "crud.exchange", - "vhost": "/", - "destination": "crud.rent.property", - "destination_type": "queue", - "routing_key": "crud.property.routingkey", - "arguments": {} - }, - { - "source": "crud.exchange", - "vhost": "/", - "destination": "crud.scheduling.property", - "destination_type": "queue", - "routing_key": "crud.property.routingkey\t", - "arguments": {} - }, - { - "source": "crud.exchange", - "vhost": "/", - "destination": "crud.acquisition.user", - "destination_type": "queue", - "routing_key": "crud.user.routingkey", - "arguments": {} - }, - { - "source": "crud.exchange", - "vhost": "/", - "destination": "crud.rent.user", - "destination_type": "queue", - "routing_key": "crud.user.routingkey", - "arguments": {} - } - ] -} \ No newline at end of file diff --git a/rabbitmq.config b/rabbitmq.config deleted file mode 100644 index e69fd6c8..00000000 --- a/rabbitmq.config +++ /dev/null @@ -1,6 +0,0 @@ -loopback_users.guest = false -listeners.tcp.default = 5672 -default_pass = admin -default_user = admin -management.tcp.port = 15672 -load_definitions = /etc/rabbitmq/rabbit_definitions.json \ No newline at end of file diff --git a/rent/src/main/java/com/example/rent/RentApplication.java b/rent/src/main/java/com/example/rent/RentApplication.java deleted file mode 100644 index 14e7e52d..00000000 --- a/rent/src/main/java/com/example/rent/RentApplication.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.rent; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; - -@SpringBootApplication() -public class RentApplication { - public static void main(String[] args) { - SpringApplication.run(RentApplication.class, args); - } -} diff --git a/rent/src/main/java/com/example/rent/dto/AccommodationDto.java b/rent/src/main/java/com/example/rent/dto/AccommodationDto.java deleted file mode 100644 index 35859b37..00000000 --- a/rent/src/main/java/com/example/rent/dto/AccommodationDto.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.example.rent.dto; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - -@JsonIgnoreProperties(ignoreUnknown = true) -public record AccommodationDto(Double price) { -} - diff --git a/rent/src/main/java/com/example/rent/dto/BookingDto.java b/rent/src/main/java/com/example/rent/dto/BookingDto.java deleted file mode 100644 index 7af398c8..00000000 --- a/rent/src/main/java/com/example/rent/dto/BookingDto.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.example.rent.dto; - -import java.time.LocalDate; -import java.util.List; - -public record BookingDto(Long accommodationId, List guestIds, LocalDate intialDate, LocalDate endDate) { -} diff --git a/rent/src/main/java/com/example/rent/dto/UserDto.java b/rent/src/main/java/com/example/rent/dto/UserDto.java deleted file mode 100644 index 606130d5..00000000 --- a/rent/src/main/java/com/example/rent/dto/UserDto.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.rent.dto; - -import com.example.rent.enums.UserType; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - -record UserDto(String name, String email, UserType type) { - -} - diff --git a/rent/src/main/java/com/example/rent/entities/Payment.java b/rent/src/main/java/com/example/rent/entities/Payment.java deleted file mode 100644 index d2df303c..00000000 --- a/rent/src/main/java/com/example/rent/entities/Payment.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.rent.entities; - -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDate; -import java.util.UUID; - -@Entity -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class Payment { - - @Id - private UUID id; - - private boolean authorized; - - private LocalDate authorizationDate; - - private int profitPercentagePlataform; - -} diff --git a/rent/src/main/resources/application.yml b/rent/src/main/resources/application.yml deleted file mode 100644 index dc79f3ef..00000000 --- a/rent/src/main/resources/application.yml +++ /dev/null @@ -1,5 +0,0 @@ -spring: - application: - name: RentService - profiles: - active: dev diff --git a/rent/.gitignore b/transacional/.gitignore similarity index 100% rename from rent/.gitignore rename to transacional/.gitignore diff --git a/rent/Dockerfile b/transacional/Dockerfile similarity index 100% rename from rent/Dockerfile rename to transacional/Dockerfile diff --git a/rent/docker-compose.yml b/transacional/docker-compose.yml similarity index 100% rename from rent/docker-compose.yml rename to transacional/docker-compose.yml diff --git a/rent/pom.xml b/transacional/pom.xml similarity index 89% rename from rent/pom.xml rename to transacional/pom.xml index fd4817d5..b8164699 100644 --- a/rent/pom.xml +++ b/transacional/pom.xml @@ -9,9 +9,9 @@ com.imovato - rent + transacional 0.0.1-SNAPSHOT - rent + transacional Demo project for Spring Boot @@ -32,6 +32,20 @@ target/site/jacoco/jacoco.xml + + org.springframework.boot + spring-boot-starter-security + + + io.jsonwebtoken + jjwt + 0.9.1 + + + javax.xml.bind + jaxb-api + 2.3.1 + org.springframework.boot spring-boot-starter-amqp @@ -100,6 +114,11 @@ 2.0.1 + + org.springframework.cloud + spring-cloud-starter-config + + diff --git a/transacional/src/main/java/com/example/rent/TransacionalApplication.java b/transacional/src/main/java/com/example/rent/TransacionalApplication.java new file mode 100644 index 00000000..68cf84d7 --- /dev/null +++ b/transacional/src/main/java/com/example/rent/TransacionalApplication.java @@ -0,0 +1,13 @@ +package com.example.rent; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +@SpringBootApplication +@EnableDiscoveryClient +public class TransacionalApplication { + public static void main(String[] args) { + SpringApplication.run(TransacionalApplication.class, args); + } +} diff --git a/rent/src/main/java/com/example/rent/config/AppConf.java b/transacional/src/main/java/com/example/rent/config/AppConf.java similarity index 100% rename from rent/src/main/java/com/example/rent/config/AppConf.java rename to transacional/src/main/java/com/example/rent/config/AppConf.java diff --git a/rent/src/main/java/com/example/rent/config/JacksonConfig.java b/transacional/src/main/java/com/example/rent/config/JacksonConfig.java similarity index 100% rename from rent/src/main/java/com/example/rent/config/JacksonConfig.java rename to transacional/src/main/java/com/example/rent/config/JacksonConfig.java diff --git a/transacional/src/main/java/com/example/rent/config/RabbitConfig.java b/transacional/src/main/java/com/example/rent/config/RabbitConfig.java new file mode 100644 index 00000000..1cf851b5 --- /dev/null +++ b/transacional/src/main/java/com/example/rent/config/RabbitConfig.java @@ -0,0 +1,59 @@ +package com.example.rent.config; + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.FanoutExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + + @Value("${crud.rabbitmq.exchanges.exchangeAccommodations}") + private String exchangeAccommodations; + + @Value("${crud.rabbitmq.exchanges.exchangeUsers}") + private String exchangeUsers; + + @Value("${crud.rabbitmq.queues.accommodationQueue}") + private String accommodationQueue; + + @Value("${crud.rabbitmq.queues.userQueue}") + private String userQueue; + + // Exchanges + @Bean + public FanoutExchange accommodationsExchange() { + return new FanoutExchange(exchangeAccommodations, true, false); + } + + @Bean + public FanoutExchange usersExchange() { + return new FanoutExchange(exchangeUsers, true, false); + } + + // Queues + @Bean + public Queue accommodationQueue() { + return new Queue(accommodationQueue, true); + } + + @Bean + public Queue userQueue() { + return new Queue(userQueue, true); + } + + // Bindings + @Bean + public Binding bindingAccommodation() { + return BindingBuilder.bind(accommodationQueue()).to(accommodationsExchange()); + } + + @Bean + public Binding bindingUser() { + return BindingBuilder.bind(userQueue()).to(usersExchange()); + } +} + diff --git a/transacional/src/main/java/com/example/rent/config/security/JwtAuthenticationFilter.java b/transacional/src/main/java/com/example/rent/config/security/JwtAuthenticationFilter.java new file mode 100644 index 00000000..9f8d5416 --- /dev/null +++ b/transacional/src/main/java/com/example/rent/config/security/JwtAuthenticationFilter.java @@ -0,0 +1,50 @@ +package com.example.rent.config.security; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Component +public class JwtAuthenticationFilter extends OncePerRequestFilter { + + @Autowired + private JwtProvider jwtProvider; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + String token = extractToken(request); + if (token != null && jwtProvider.validateToken(token)) { + String userId = jwtProvider.getSubjectFromToken(token); + logger.info("username extraído do token: " + userId); + + String roleStr = jwtProvider.getClaimNameJwt(token, "roles"); + UserDetails userDetails = UserDatailsImpl.build(userId, roleStr); + logger.info("user details encontrado: " + userDetails); + + UsernamePasswordAuthenticationToken authentication = + new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + + SecurityContextHolder.getContext().setAuthentication(authentication); + } + + filterChain.doFilter(request, response); + + } + + private String extractToken(HttpServletRequest request) { + String authHeader = request.getHeader("Authorization"); + if (authHeader != null && authHeader.startsWith("Bearer ")) { + return authHeader.substring(7); + } + return null; + } +} diff --git a/transacional/src/main/java/com/example/rent/config/security/JwtProvider.java b/transacional/src/main/java/com/example/rent/config/security/JwtProvider.java new file mode 100644 index 00000000..ff117ae1 --- /dev/null +++ b/transacional/src/main/java/com/example/rent/config/security/JwtProvider.java @@ -0,0 +1,45 @@ +package com.example.rent.config.security; + +import io.jsonwebtoken.*; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Log4j2 +@Component +public class JwtProvider { + + @Value( "${ead.auth.jwtSecret}") + private String jwtSecret; + + public String getSubjectFromToken(String token) { + return Jwts.parser() + .setSigningKey(jwtSecret) + .parseClaimsJws(token) + .getBody() + .getSubject(); + } + + public String getClaimNameJwt(String token, String claimName) { + return Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token).getBody().get(claimName, String.class); + } + + public boolean validateToken(String authToken) { + try { + Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(authToken); + return true; + + } catch (SignatureException e) { + log.error("Invalid JWT signature: {}", e.getMessage()); + } catch (MalformedJwtException e) { + log.error("Invalid JWT token: {}", e.getMessage()); + } catch (ExpiredJwtException e) { + log.error("JWT token is expired: {}", e.getMessage()); + } catch (UnsupportedJwtException e) { + log.error("JWT token is unsupported: {}", e.getMessage()); + } catch (IllegalArgumentException e) { + log.error("JWT claims string is empty: {}", e.getMessage()); + } + return false; + } +} diff --git a/transacional/src/main/java/com/example/rent/config/security/SecurityConfig.java b/transacional/src/main/java/com/example/rent/config/security/SecurityConfig.java new file mode 100644 index 00000000..d9a4826d --- /dev/null +++ b/transacional/src/main/java/com/example/rent/config/security/SecurityConfig.java @@ -0,0 +1,39 @@ +package com.example.rent.config.security; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@Configuration +@EnableMethodSecurity +public class SecurityConfig { + + @Autowired + private JwtAuthenticationFilter jwtAuthenticationFilter; + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .csrf(AbstractHttpConfigurer::disable) + .authorizeHttpRequests(auth -> auth + .anyRequest().authenticated() + ) + .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) + .httpBasic(Customizer.withDefaults()); + + return http.build(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} \ No newline at end of file diff --git a/transacional/src/main/java/com/example/rent/config/security/SecurityUtil.java b/transacional/src/main/java/com/example/rent/config/security/SecurityUtil.java new file mode 100644 index 00000000..5b572d0b --- /dev/null +++ b/transacional/src/main/java/com/example/rent/config/security/SecurityUtil.java @@ -0,0 +1,34 @@ +package com.example.rent.config.security; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; + +public class SecurityUtil { + + public static String getAuthenticatedUserId() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.getPrincipal() instanceof UserDatailsImpl userDetails) { + return userDetails.getUserId(); + } + + throw new RuntimeException("Usuário não autenticado!"); + } + + public static boolean isAuthenticatedAdmin() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMINISTRATOR"))) { + return true; + } + return false; + } + + public static boolean isOwnerOrAdmin(String resourceUserId) { + String authenticatedUserId = getAuthenticatedUserId(); + return isAuthenticatedAdmin() || authenticatedUserId.equals(resourceUserId); + } + + +} \ No newline at end of file diff --git a/transacional/src/main/java/com/example/rent/config/security/UserDatailsImpl.java b/transacional/src/main/java/com/example/rent/config/security/UserDatailsImpl.java new file mode 100644 index 00000000..9c151f86 --- /dev/null +++ b/transacional/src/main/java/com/example/rent/config/security/UserDatailsImpl.java @@ -0,0 +1,75 @@ +package com.example.rent.config.security; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.io.Serial; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +public class UserDatailsImpl implements UserDetails { + + @Serial + private static final long serialVersionUID = 4735505087197006457L; + private String userId; + private Collection authorities; + + public UserDatailsImpl(String userId, Collection authorities) { + this.userId = userId; + this.authorities = authorities; + } + + public static UserDatailsImpl build(String userId, String roleStr) { + List authorities = Arrays.stream(roleStr.split(",")) + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + + return new UserDatailsImpl( + userId, + authorities + ); + } + + @Override + public Collection getAuthorities() { + return this.authorities; + } + + @Override + public String getPassword() { + return null; + } + + @Override + public String getUsername() { + return null; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } + + public String getUserId() { + return userId; + } + +} diff --git a/transacional/src/main/java/com/example/rent/dto/AccommodationDto.java b/transacional/src/main/java/com/example/rent/dto/AccommodationDto.java new file mode 100644 index 00000000..c9e4db1f --- /dev/null +++ b/transacional/src/main/java/com/example/rent/dto/AccommodationDto.java @@ -0,0 +1,9 @@ +package com.example.rent.dto; + +import com.example.rent.enums.StatusAccommodation; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record AccommodationDto(String id, Double price, int maxOccupancy, StatusAccommodation stats) { +} + diff --git a/transacional/src/main/java/com/example/rent/dto/BookingDto.java b/transacional/src/main/java/com/example/rent/dto/BookingDto.java new file mode 100644 index 00000000..e6020bdf --- /dev/null +++ b/transacional/src/main/java/com/example/rent/dto/BookingDto.java @@ -0,0 +1,7 @@ +package com.example.rent.dto; + +import java.time.LocalDate; +import java.util.List; + +public record BookingDto(String accommodationId, List guestIds, LocalDate intialDate, LocalDate endDate) { +} diff --git a/rent/src/main/java/com/example/rent/dto/RentDto.java b/transacional/src/main/java/com/example/rent/dto/RentDto.java similarity index 100% rename from rent/src/main/java/com/example/rent/dto/RentDto.java rename to transacional/src/main/java/com/example/rent/dto/RentDto.java diff --git a/transacional/src/main/java/com/example/rent/dto/UserDto.java b/transacional/src/main/java/com/example/rent/dto/UserDto.java new file mode 100644 index 00000000..1ea8c37f --- /dev/null +++ b/transacional/src/main/java/com/example/rent/dto/UserDto.java @@ -0,0 +1,11 @@ +package com.example.rent.dto; + +import com.example.rent.enums.UserStats; +import com.example.rent.enums.UserType; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record UserDto(String id, String name, String email, UserType type, UserStats stats) { + +} + diff --git a/rent/src/main/java/com/example/rent/entities/Accommodation.java b/transacional/src/main/java/com/example/rent/entities/Accommodation.java similarity index 79% rename from rent/src/main/java/com/example/rent/entities/Accommodation.java rename to transacional/src/main/java/com/example/rent/entities/Accommodation.java index af08bbc6..000169ed 100644 --- a/rent/src/main/java/com/example/rent/entities/Accommodation.java +++ b/transacional/src/main/java/com/example/rent/entities/Accommodation.java @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; +import java.io.Serial; import java.io.Serializable; @Entity @@ -17,9 +18,11 @@ @Builder public class Accommodation implements Serializable { + @Serial + private static final long serialVersionUID = 6742147475962430968L; + @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + private String id; private Double price; diff --git a/rent/src/main/java/com/example/rent/entities/Booking.java b/transacional/src/main/java/com/example/rent/entities/Booking.java similarity index 100% rename from rent/src/main/java/com/example/rent/entities/Booking.java rename to transacional/src/main/java/com/example/rent/entities/Booking.java diff --git a/rent/src/main/java/com/example/rent/entities/GuestBooking.java b/transacional/src/main/java/com/example/rent/entities/GuestBooking.java similarity index 100% rename from rent/src/main/java/com/example/rent/entities/GuestBooking.java rename to transacional/src/main/java/com/example/rent/entities/GuestBooking.java diff --git a/rent/src/main/java/com/example/rent/entities/Rent.java b/transacional/src/main/java/com/example/rent/entities/Rent.java similarity index 100% rename from rent/src/main/java/com/example/rent/entities/Rent.java rename to transacional/src/main/java/com/example/rent/entities/Rent.java diff --git a/rent/src/main/java/com/example/rent/entities/User.java b/transacional/src/main/java/com/example/rent/entities/User.java similarity index 61% rename from rent/src/main/java/com/example/rent/entities/User.java rename to transacional/src/main/java/com/example/rent/entities/User.java index 0341aadb..7d00d8c7 100644 --- a/rent/src/main/java/com/example/rent/entities/User.java +++ b/transacional/src/main/java/com/example/rent/entities/User.java @@ -1,5 +1,6 @@ package com.example.rent.entities; +import com.example.rent.enums.UserStats; import com.example.rent.enums.UserType; import jakarta.persistence.*; import lombok.AllArgsConstructor; @@ -7,8 +8,8 @@ import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serial; import java.io.Serializable; -import java.util.List; @Entity @Data @@ -17,15 +18,21 @@ @Builder public class User implements Serializable { + @Serial + private static final long serialVersionUID = -9206949953784522451L; + @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + private String id; private String name; private String email; @Enumerated(EnumType.STRING) + @Column(name = "user_type", length = 30, nullable = false) private UserType userType; + @Enumerated(EnumType.STRING) + private UserStats stats; + } diff --git a/rent/src/main/java/com/example/rent/enums/StatusAccommodation.java b/transacional/src/main/java/com/example/rent/enums/StatusAccommodation.java similarity index 90% rename from rent/src/main/java/com/example/rent/enums/StatusAccommodation.java rename to transacional/src/main/java/com/example/rent/enums/StatusAccommodation.java index 0536fbe1..1d881a12 100644 --- a/rent/src/main/java/com/example/rent/enums/StatusAccommodation.java +++ b/transacional/src/main/java/com/example/rent/enums/StatusAccommodation.java @@ -5,7 +5,8 @@ public enum StatusAccommodation { RENTED, BOOKING, - AVAILABLE; + AVAILABLE, + UNAVAILABLE; @JsonCreator public static StatusAccommodation fromString(String value) { diff --git a/rent/src/main/java/com/example/rent/enums/StatusReservation.java b/transacional/src/main/java/com/example/rent/enums/StatusReservation.java similarity index 100% rename from rent/src/main/java/com/example/rent/enums/StatusReservation.java rename to transacional/src/main/java/com/example/rent/enums/StatusReservation.java diff --git a/transacional/src/main/java/com/example/rent/enums/UserStats.java b/transacional/src/main/java/com/example/rent/enums/UserStats.java new file mode 100644 index 00000000..fc936c7e --- /dev/null +++ b/transacional/src/main/java/com/example/rent/enums/UserStats.java @@ -0,0 +1,6 @@ +package com.example.rent.enums; + +public enum UserStats { + + AVAILABLE, UNAVAILABLE; +} diff --git a/rent/src/main/java/com/example/rent/enums/UserType.java b/transacional/src/main/java/com/example/rent/enums/UserType.java similarity index 81% rename from rent/src/main/java/com/example/rent/enums/UserType.java rename to transacional/src/main/java/com/example/rent/enums/UserType.java index 476761d8..e70f393d 100644 --- a/rent/src/main/java/com/example/rent/enums/UserType.java +++ b/transacional/src/main/java/com/example/rent/enums/UserType.java @@ -4,11 +4,11 @@ public enum UserType { - HOST, + ROLE_HOST, - GUEST, + ROLE_GUEST, - ADMINISTRATOR; + ROLE_ADMINISTRATOR; @JsonCreator public static UserType fromString(String value) { diff --git a/rent/src/main/java/com/example/rent/exceptions/BadRequestException.java b/transacional/src/main/java/com/example/rent/exceptions/BadRequestException.java similarity index 100% rename from rent/src/main/java/com/example/rent/exceptions/BadRequestException.java rename to transacional/src/main/java/com/example/rent/exceptions/BadRequestException.java diff --git a/rent/src/main/java/com/example/rent/exceptions/BadRequestExceptionDetails.java b/transacional/src/main/java/com/example/rent/exceptions/BadRequestExceptionDetails.java similarity index 100% rename from rent/src/main/java/com/example/rent/exceptions/BadRequestExceptionDetails.java rename to transacional/src/main/java/com/example/rent/exceptions/BadRequestExceptionDetails.java diff --git a/rent/src/main/java/com/example/rent/exceptions/ExceptionDetails.java b/transacional/src/main/java/com/example/rent/exceptions/ExceptionDetails.java similarity index 100% rename from rent/src/main/java/com/example/rent/exceptions/ExceptionDetails.java rename to transacional/src/main/java/com/example/rent/exceptions/ExceptionDetails.java diff --git a/rent/src/main/java/com/example/rent/exceptions/ValidationExceptionDetails.java b/transacional/src/main/java/com/example/rent/exceptions/ValidationExceptionDetails.java similarity index 100% rename from rent/src/main/java/com/example/rent/exceptions/ValidationExceptionDetails.java rename to transacional/src/main/java/com/example/rent/exceptions/ValidationExceptionDetails.java diff --git a/rent/src/main/java/com/example/rent/handler/RestExceptionHandler.java b/transacional/src/main/java/com/example/rent/handler/RestExceptionHandler.java similarity index 100% rename from rent/src/main/java/com/example/rent/handler/RestExceptionHandler.java rename to transacional/src/main/java/com/example/rent/handler/RestExceptionHandler.java diff --git a/rent/src/main/java/com/example/rent/mapper/BookingMapper.java b/transacional/src/main/java/com/example/rent/mapper/BookingMapper.java similarity index 95% rename from rent/src/main/java/com/example/rent/mapper/BookingMapper.java rename to transacional/src/main/java/com/example/rent/mapper/BookingMapper.java index c1045903..b16a8d3f 100644 --- a/rent/src/main/java/com/example/rent/mapper/BookingMapper.java +++ b/transacional/src/main/java/com/example/rent/mapper/BookingMapper.java @@ -24,7 +24,7 @@ public static Booking toEntity(BookingDto dto, Accommodation accommodation, List } public static BookingDto toDto(Booking booking) { - List guestIds = booking.getGuests().stream() + List guestIds = booking.getGuests().stream() .map(guestBooking -> guestBooking.getGuest().getId()) .toList(); diff --git a/rent/src/main/java/com/example/rent/receiver/AccommodationReceiver.java b/transacional/src/main/java/com/example/rent/receiver/AccommodationReceiver.java similarity index 88% rename from rent/src/main/java/com/example/rent/receiver/AccommodationReceiver.java rename to transacional/src/main/java/com/example/rent/receiver/AccommodationReceiver.java index 44a57698..06db94e0 100644 --- a/rent/src/main/java/com/example/rent/receiver/AccommodationReceiver.java +++ b/transacional/src/main/java/com/example/rent/receiver/AccommodationReceiver.java @@ -24,8 +24,10 @@ public AccommodationReceiver(AccommodationRepository accommodationRepository) { @RabbitListener(queues = {"${crud.rabbitmq.queues.accommodationQueue}"}) public void receive(@Payload AccommodationDto dto) { Accommodation accommodation = new Accommodation(); + accommodation.setId(dto.id()); accommodation.setPrice(dto.price()); - accommodation.setStatus(StatusAccommodation.AVAILABLE); + accommodation.setStatus(dto.stats()); + accommodation.setGuestCapacity(dto.maxOccupancy()); accommodationRepository.save(accommodation); } } diff --git a/rent/src/main/java/com/example/rent/receiver/UserReceiver.java b/transacional/src/main/java/com/example/rent/receiver/UserReceiver.java similarity index 61% rename from rent/src/main/java/com/example/rent/receiver/UserReceiver.java rename to transacional/src/main/java/com/example/rent/receiver/UserReceiver.java index b6257ea2..4ca99c08 100644 --- a/rent/src/main/java/com/example/rent/receiver/UserReceiver.java +++ b/transacional/src/main/java/com/example/rent/receiver/UserReceiver.java @@ -1,5 +1,6 @@ package com.example.rent.receiver; +import com.example.rent.dto.UserDto; import com.example.rent.entities.User; import com.example.rent.repository.UserRepository; import org.springframework.amqp.rabbit.annotation.RabbitListener; @@ -17,13 +18,15 @@ public UserReceiver(UserRepository userRepository) { this.userRepository = userRepository; } -// @RabbitListener(queues = {"${crud.rabbitmq.queues.userQueue}"}) -// public void receive(@Payload UserDTO dto) { -// User user = new User(); -// user.setName(dto.name()); -// user.setEmail(dto.email()); -// user.setUserType(dto.type()); -// userRepository.save(user); -// } + @RabbitListener(queues = {"${crud.rabbitmq.queues.userQueue}"}) + public void receive(@Payload UserDto dto) { + User user = new User(); + user.setId(dto.id()); + user.setName(dto.name()); + user.setEmail(dto.email()); + user.setUserType(dto.type()); + user.setStats(dto.stats()); + userRepository.save(user); + } } diff --git a/rent/src/main/java/com/example/rent/repository/AccommodationRepository.java b/transacional/src/main/java/com/example/rent/repository/AccommodationRepository.java similarity index 93% rename from rent/src/main/java/com/example/rent/repository/AccommodationRepository.java rename to transacional/src/main/java/com/example/rent/repository/AccommodationRepository.java index 9df90b96..9a2b2eed 100644 --- a/rent/src/main/java/com/example/rent/repository/AccommodationRepository.java +++ b/transacional/src/main/java/com/example/rent/repository/AccommodationRepository.java @@ -9,6 +9,6 @@ import java.util.UUID; @Repository -public interface AccommodationRepository extends JpaRepository { +public interface AccommodationRepository extends JpaRepository { } diff --git a/rent/src/main/java/com/example/rent/repository/BookingRepository.java b/transacional/src/main/java/com/example/rent/repository/BookingRepository.java similarity index 100% rename from rent/src/main/java/com/example/rent/repository/BookingRepository.java rename to transacional/src/main/java/com/example/rent/repository/BookingRepository.java diff --git a/rent/src/main/java/com/example/rent/repository/RentRepository.java b/transacional/src/main/java/com/example/rent/repository/RentRepository.java similarity index 100% rename from rent/src/main/java/com/example/rent/repository/RentRepository.java rename to transacional/src/main/java/com/example/rent/repository/RentRepository.java diff --git a/rent/src/main/java/com/example/rent/repository/UserRepository.java b/transacional/src/main/java/com/example/rent/repository/UserRepository.java similarity index 76% rename from rent/src/main/java/com/example/rent/repository/UserRepository.java rename to transacional/src/main/java/com/example/rent/repository/UserRepository.java index 0e1e41c7..dd25fd6d 100644 --- a/rent/src/main/java/com/example/rent/repository/UserRepository.java +++ b/transacional/src/main/java/com/example/rent/repository/UserRepository.java @@ -7,6 +7,6 @@ import java.util.UUID; @Repository -public interface UserRepository extends JpaRepository { +public interface UserRepository extends JpaRepository { } diff --git a/rent/src/main/java/com/example/rent/resources/BookingResource.java b/transacional/src/main/java/com/example/rent/resources/BookingResource.java similarity index 62% rename from rent/src/main/java/com/example/rent/resources/BookingResource.java rename to transacional/src/main/java/com/example/rent/resources/BookingResource.java index 6102300f..eb8699a6 100644 --- a/rent/src/main/java/com/example/rent/resources/BookingResource.java +++ b/transacional/src/main/java/com/example/rent/resources/BookingResource.java @@ -2,26 +2,24 @@ import com.example.rent.dto.BookingDto; import com.example.rent.entities.Booking; -import com.example.rent.entities.GuestBooking; -import com.example.rent.entities.User; import com.example.rent.enums.StatusReservation; import com.example.rent.mapper.BookingMapper; +import com.example.rent.repository.BookingRepository; import com.example.rent.response.RentResponse; import com.example.rent.service.BookingService; import com.example.rent.service.RentService; import com.example.rent.service.UserService; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; -import org.apache.coyote.Response; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; import jakarta.validation.Valid; -import java.time.LocalDateTime; -import java.util.List; import java.util.Optional; @RestController @@ -38,35 +36,36 @@ public class BookingResource { @Autowired private UserService userService; + @Autowired + private BookingRepository bookingRepository; + + + + @PreAuthorize("hasAnyRole('ROLE_ADMINISTRATOR', 'ROLE_GUEST')") @PostMapping - @Operation(summary = "Cria uma reserva existente") - public ResponseEntity createBooking(@RequestBody BookingDto request) { + @Operation(summary = "Cria uma reserva para uma propriedade existente") + public ResponseEntity createBooking(@RequestBody BookingDto request, Authentication authentication) { Booking response = bookingService.createBooking(request); return ResponseEntity.status(HttpStatus.CREATED).body(response); } + @PreAuthorize("hasAnyRole('ROLE_ADMINISTRATOR', 'ROLE_GUEST')") @PostMapping("/checkin/{idBooking}") @Operation(summary = "Faz checkin em uma reserva existente") public ResponseEntity checkin(@PathVariable @Valid Long idBooking) { return new ResponseEntity<>(rentService.processCheckin(idBooking), HttpStatus.CREATED); } - /* CONSULTAR RESERVA - * Retornar detalhes da reserva. - */ + @PreAuthorize("hasAnyRole('ROLE_ADMINISTRATOR', 'ROLE_GUEST', 'ROLE_HOST')") @Operation(summary = "Consulta uma reserva existente") @GetMapping("/{id}") public ResponseEntity getBookingById(@PathVariable Long id) throws Exception { Booking booking = bookingService.getBookingById(id); return ResponseEntity.ok(BookingMapper.toDto(booking)); - } - /* CANCELAR RESERVA - * cancelar os dados de uma reserva, - * trocar a coluna status_reservation da tabela boooking para CANCELED - */ + @PreAuthorize("hasAnyRole('ROLE_ADMINISTRATOR', 'ROLE_GUEST', 'ROLE_HOST')") @Operation(summary = "Cancela uma reserva existente") @PatchMapping("/{id}/cancel") public ResponseEntity cancelBookingById(@PathVariable Long id) throws Exception { @@ -74,19 +73,26 @@ public ResponseEntity cancelBookingById(@PathVariable Long id) throw return ResponseEntity.ok(BookingMapper.toDto(booking)); } - - /* CRIAR O ENDPOINT DE PAGAMENTO DA RESERVA - * - Validar o status_reservation da tabela boooking (se CANCELED ou CONFIRMED lançar exception) - * - verificar o usuario que está pagando para alterar essas informações. - * - trocar a coluna is_paid para true e popular a coluna payment_date - com a data do pagamento. - */ - + @PreAuthorize("hasAnyRole('ROLE_ADMINISTRATOR', 'ROLE_GUEST')") @PatchMapping("/{id}/pay/{userId}") @Operation(summary = "Realiza o pagamento de uma reserva") - public ResponseEntity payBooking(@PathVariable Long id, @PathVariable Long userId) throws Exception { + public ResponseEntity payBooking(@PathVariable Long id, @PathVariable String userId) throws Exception { BookingDto bookingDto = bookingService.payBooking(id, userId); return ResponseEntity.ok(bookingDto); } + @PreAuthorize("hasRole('ROLE_ADMINISTRATOR')") + @PostMapping("/forcar/cancelamento/{idReserva}") + public ResponseEntity forcarCancelamento(@PathVariable Long idReserva) { + Optional reservaOptional = bookingRepository.findById(idReserva); + + if (reservaOptional.isPresent()) { + Booking reserva = reservaOptional.get(); + reserva.setStatusReservation(StatusReservation.CANCELED); + bookingRepository.save(reserva); + return ResponseEntity.ok("Reserva " + idReserva + " foi cancelada com sucesso."); + } else { + return ResponseEntity.status(404).body("Reserva com ID " + idReserva + " não encontrada."); + } + } } diff --git a/rent/src/main/java/com/example/rent/resources/RentResource.java b/transacional/src/main/java/com/example/rent/resources/RentResource.java similarity index 100% rename from rent/src/main/java/com/example/rent/resources/RentResource.java rename to transacional/src/main/java/com/example/rent/resources/RentResource.java diff --git a/rent/src/main/java/com/example/rent/response/RentResponse.java b/transacional/src/main/java/com/example/rent/response/RentResponse.java similarity index 100% rename from rent/src/main/java/com/example/rent/response/RentResponse.java rename to transacional/src/main/java/com/example/rent/response/RentResponse.java diff --git a/rent/src/main/java/com/example/rent/scheduler/CancelamentoReservaScheduler.java b/transacional/src/main/java/com/example/rent/scheduler/CancelamentoReservaScheduler.java similarity index 100% rename from rent/src/main/java/com/example/rent/scheduler/CancelamentoReservaScheduler.java rename to transacional/src/main/java/com/example/rent/scheduler/CancelamentoReservaScheduler.java diff --git a/rent/src/main/java/com/example/rent/service/AccommodationService.java b/transacional/src/main/java/com/example/rent/service/AccommodationService.java similarity index 77% rename from rent/src/main/java/com/example/rent/service/AccommodationService.java rename to transacional/src/main/java/com/example/rent/service/AccommodationService.java index 17794c6d..abc10f85 100644 --- a/rent/src/main/java/com/example/rent/service/AccommodationService.java +++ b/transacional/src/main/java/com/example/rent/service/AccommodationService.java @@ -5,7 +5,7 @@ import java.util.Optional; public interface AccommodationService { - Optional findAccommodationById(Long id); + Optional findAccommodationById(String id); void changeStatusForRented(Accommodation accommodation); } diff --git a/rent/src/main/java/com/example/rent/service/BookingService.java b/transacional/src/main/java/com/example/rent/service/BookingService.java similarity index 83% rename from rent/src/main/java/com/example/rent/service/BookingService.java rename to transacional/src/main/java/com/example/rent/service/BookingService.java index 424df0c8..fdd0fe90 100644 --- a/rent/src/main/java/com/example/rent/service/BookingService.java +++ b/transacional/src/main/java/com/example/rent/service/BookingService.java @@ -12,5 +12,5 @@ public interface BookingService { Booking updateBooking(Booking request) throws Exception; - BookingDto payBooking(Long bookingId, Long userId) throws Exception; + BookingDto payBooking(Long bookingId, String userId) throws Exception; } diff --git a/rent/src/main/java/com/example/rent/service/RentService.java b/transacional/src/main/java/com/example/rent/service/RentService.java similarity index 100% rename from rent/src/main/java/com/example/rent/service/RentService.java rename to transacional/src/main/java/com/example/rent/service/RentService.java diff --git a/rent/src/main/java/com/example/rent/service/UserService.java b/transacional/src/main/java/com/example/rent/service/UserService.java similarity index 80% rename from rent/src/main/java/com/example/rent/service/UserService.java rename to transacional/src/main/java/com/example/rent/service/UserService.java index 8b2e55e7..819ed6a9 100644 --- a/rent/src/main/java/com/example/rent/service/UserService.java +++ b/transacional/src/main/java/com/example/rent/service/UserService.java @@ -7,6 +7,6 @@ public interface UserService { - Optional findById(Long id); + Optional findById(String id); } diff --git a/rent/src/main/java/com/example/rent/service/impl/AccommodationServiceImpl.java b/transacional/src/main/java/com/example/rent/service/impl/AccommodationServiceImpl.java similarity index 91% rename from rent/src/main/java/com/example/rent/service/impl/AccommodationServiceImpl.java rename to transacional/src/main/java/com/example/rent/service/impl/AccommodationServiceImpl.java index f83232b1..fd5304b0 100644 --- a/rent/src/main/java/com/example/rent/service/impl/AccommodationServiceImpl.java +++ b/transacional/src/main/java/com/example/rent/service/impl/AccommodationServiceImpl.java @@ -15,7 +15,7 @@ public class AccommodationServiceImpl implements AccommodationService { private final AccommodationRepository accommodationRepository; @Override - public Optional findAccommodationById(Long id) { + public Optional findAccommodationById(String id) { return accommodationRepository.findById(id); } diff --git a/rent/src/main/java/com/example/rent/service/impl/BookingServiceImpl.java b/transacional/src/main/java/com/example/rent/service/impl/BookingServiceImpl.java similarity index 98% rename from rent/src/main/java/com/example/rent/service/impl/BookingServiceImpl.java rename to transacional/src/main/java/com/example/rent/service/impl/BookingServiceImpl.java index fda65eba..6e966362 100644 --- a/rent/src/main/java/com/example/rent/service/impl/BookingServiceImpl.java +++ b/transacional/src/main/java/com/example/rent/service/impl/BookingServiceImpl.java @@ -144,7 +144,7 @@ public Booking updateBooking(Booking request) throws Exception { } @Override - public BookingDto payBooking(Long bookingId, Long userId) throws Exception { + public BookingDto payBooking(Long bookingId, String userId) throws Exception { Booking booking = getBookingById(bookingId); if (booking.getStatusReservation() == StatusReservation.CANCELED diff --git a/rent/src/main/java/com/example/rent/service/impl/RentServiceImpl.java b/transacional/src/main/java/com/example/rent/service/impl/RentServiceImpl.java similarity index 100% rename from rent/src/main/java/com/example/rent/service/impl/RentServiceImpl.java rename to transacional/src/main/java/com/example/rent/service/impl/RentServiceImpl.java diff --git a/rent/src/main/java/com/example/rent/service/impl/UserServiceImpl.java b/transacional/src/main/java/com/example/rent/service/impl/UserServiceImpl.java similarity index 90% rename from rent/src/main/java/com/example/rent/service/impl/UserServiceImpl.java rename to transacional/src/main/java/com/example/rent/service/impl/UserServiceImpl.java index 6f9dd9f8..bcd2e795 100644 --- a/rent/src/main/java/com/example/rent/service/impl/UserServiceImpl.java +++ b/transacional/src/main/java/com/example/rent/service/impl/UserServiceImpl.java @@ -15,7 +15,7 @@ public class UserServiceImpl implements UserService { private final UserRepository userRepository; - public Optional findById(Long id) { + public Optional findById(String id) { return userRepository.findById(id); } diff --git a/rent/src/main/java/com/example/rent/utils/ConverterResponse.java b/transacional/src/main/java/com/example/rent/utils/ConverterResponse.java similarity index 100% rename from rent/src/main/java/com/example/rent/utils/ConverterResponse.java rename to transacional/src/main/java/com/example/rent/utils/ConverterResponse.java diff --git a/rent/src/main/java/com/example/rent/validations/DateValidations.java b/transacional/src/main/java/com/example/rent/validations/DateValidations.java similarity index 100% rename from rent/src/main/java/com/example/rent/validations/DateValidations.java rename to transacional/src/main/java/com/example/rent/validations/DateValidations.java diff --git a/rent/src/main/java/com/example/rent/validations/impl/ValidateMinimumDaysForRent.java b/transacional/src/main/java/com/example/rent/validations/impl/ValidateMinimumDaysForRent.java similarity index 100% rename from rent/src/main/java/com/example/rent/validations/impl/ValidateMinimumDaysForRent.java rename to transacional/src/main/java/com/example/rent/validations/impl/ValidateMinimumDaysForRent.java diff --git a/rent/src/main/java/com/example/rent/validations/impl/ValidateStartDate.java b/transacional/src/main/java/com/example/rent/validations/impl/ValidateStartDate.java similarity index 100% rename from rent/src/main/java/com/example/rent/validations/impl/ValidateStartDate.java rename to transacional/src/main/java/com/example/rent/validations/impl/ValidateStartDate.java diff --git a/rent/src/main/resources/application-dev.yml b/transacional/src/main/resources/application-dev.yml similarity index 55% rename from rent/src/main/resources/application-dev.yml rename to transacional/src/main/resources/application-dev.yml index 60f46973..728ce723 100644 --- a/rent/src/main/resources/application-dev.yml +++ b/transacional/src/main/resources/application-dev.yml @@ -1,13 +1,13 @@ server: - port: ${PORT:0} + port: 5858 spring: application: - name: rentService + name: transacional datasource: - url: jdbc:mysql://localhost:33060/crud-service?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=America/Sao_Paulo - username: root - password: example + url: jdbc:mysql://localhost:33060/transacional?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=America/Sao_Paulo + username: un_user + password: un_user driver-class-name: com.mysql.cj.jdbc.Driver jpa: @@ -21,8 +21,8 @@ spring: rabbitmq: host: localhost port: 5672 - username: guest - password: guest + username: un_user + password: un_user sleuth: sampler: @@ -34,14 +34,17 @@ spring: crud: rabbitmq: + exchanges: + exchangeAccommodations: crud.fanout.register-accommodations + exchangeUsers: crud.fanout.register-users queues: accommodationQueue: crud.register-accommodations.queue userQueue: crud.register-users.queue ead: serviceRegistry: - username: admin - password: '123456' + username: un_user + password: 'un_user' eureka: client: @@ -65,31 +68,4 @@ management: info: app: Microsserviço de Aluguel website: bla - github: https://github.com/imovato - -#resilience4j: -# retry: -# instances: -# default: -# max-attempts: 5 -# wait-duration: 1s -# enable-exponential-backoff: true -# retrySave: -# max-attempts: 10 -# wait-duration: 1s -# enable-exponential-backoff: true -# ratelimiter: -# instances: -# default: -# limit-for-period: 2 -# limit-refresh-period: 10s -# bulkhead: -# instances: -# default: -# max-concurrent-calls: 10 -# -# circuitbreaker: -# instances: -# default: -# minimum-number-of-calls: 4 -# sliding-window-size: 8 \ No newline at end of file + github: https://github.com/imovato \ No newline at end of file diff --git a/transacional/src/main/resources/application.yml b/transacional/src/main/resources/application.yml new file mode 100644 index 00000000..1fcbefb0 --- /dev/null +++ b/transacional/src/main/resources/application.yml @@ -0,0 +1,9 @@ +spring: + application: + name: transacional + config: + import: "configserver:" + cloud: + config: + discovery: + service-id: config-server \ No newline at end of file diff --git a/rent/src/main/resources/data.sql b/transacional/src/main/resources/data.sql similarity index 100% rename from rent/src/main/resources/data.sql rename to transacional/src/main/resources/data.sql diff --git a/rent/src/test/java/com/example/rent/resources/RentControllerTest.java b/transacional/src/test/java/com/example/rent/resources/RentControllerTest.java similarity index 100% rename from rent/src/test/java/com/example/rent/resources/RentControllerTest.java rename to transacional/src/test/java/com/example/rent/resources/RentControllerTest.java diff --git a/rent/src/test/java/com/example/rent/service/impl/AccommodationServiceImplTest.java b/transacional/src/test/java/com/example/rent/service/impl/AccommodationServiceImplTest.java similarity index 80% rename from rent/src/test/java/com/example/rent/service/impl/AccommodationServiceImplTest.java rename to transacional/src/test/java/com/example/rent/service/impl/AccommodationServiceImplTest.java index a940826d..18ea4a79 100644 --- a/rent/src/test/java/com/example/rent/service/impl/AccommodationServiceImplTest.java +++ b/transacional/src/test/java/com/example/rent/service/impl/AccommodationServiceImplTest.java @@ -29,31 +29,31 @@ class AccommodationServiceImplTest { @BeforeEach void setUp() { mockAccommodation = new Accommodation(); - mockAccommodation.setId(1L); + mockAccommodation.setId("abc"); mockAccommodation.setPrice(500.00); } @Test void testFindAccommodationByIdSuccess() { - when(accommodationRepository.findById(1L)).thenReturn(Optional.of(mockAccommodation)); + when(accommodationRepository.findById("abc")).thenReturn(Optional.of(mockAccommodation)); - Optional result = accommodationService.findAccommodationById(1L); + Optional result = accommodationService.findAccommodationById("abc"); assertTrue(result.isPresent()); assertEquals(1L, result.get().getId()); assertEquals(500.00, result.get().getPrice()); - verify(accommodationRepository, times(1)).findById(1L); + verify(accommodationRepository, times(1)).findById("abc"); } @Test void testFindAccommodationByIdNotFound() { - when(accommodationRepository.findById(2L)).thenReturn(Optional.empty()); + when(accommodationRepository.findById("xyz")).thenReturn(Optional.empty()); - Optional result = accommodationService.findAccommodationById(2L); + Optional result = accommodationService.findAccommodationById("xyz"); assertFalse(result.isPresent()); - verify(accommodationRepository, times(1)).findById(2L); + verify(accommodationRepository, times(1)).findById("xyz"); } @Test diff --git a/rent/src/test/java/com/example/rent/service/impl/RentServiceImplTest.java b/transacional/src/test/java/com/example/rent/service/impl/RentServiceImplTest.java similarity index 100% rename from rent/src/test/java/com/example/rent/service/impl/RentServiceImplTest.java rename to transacional/src/test/java/com/example/rent/service/impl/RentServiceImplTest.java diff --git a/rent/src/test/java/com/example/rent/service/impl/UserServiceImplTest.java b/transacional/src/test/java/com/example/rent/service/impl/UserServiceImplTest.java similarity index 100% rename from rent/src/test/java/com/example/rent/service/impl/UserServiceImplTest.java rename to transacional/src/test/java/com/example/rent/service/impl/UserServiceImplTest.java diff --git a/rent/src/test/java/com/example/rent/utils/ConverterResponseTest.java b/transacional/src/test/java/com/example/rent/utils/ConverterResponseTest.java similarity index 100% rename from rent/src/test/java/com/example/rent/utils/ConverterResponseTest.java rename to transacional/src/test/java/com/example/rent/utils/ConverterResponseTest.java diff --git a/rent/src/test/java/com/example/rent/validations/impl/ValidateMinimumDaysForRentTest.java b/transacional/src/test/java/com/example/rent/validations/impl/ValidateMinimumDaysForRentTest.java similarity index 100% rename from rent/src/test/java/com/example/rent/validations/impl/ValidateMinimumDaysForRentTest.java rename to transacional/src/test/java/com/example/rent/validations/impl/ValidateMinimumDaysForRentTest.java diff --git a/rent/src/test/java/com/example/rent/validations/impl/ValidateStartDateTest.java b/transacional/src/test/java/com/example/rent/validations/impl/ValidateStartDateTest.java similarity index 100% rename from rent/src/test/java/com/example/rent/validations/impl/ValidateStartDateTest.java rename to transacional/src/test/java/com/example/rent/validations/impl/ValidateStartDateTest.java