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