feature login and register

This commit is contained in:
David 2025-08-05 00:23:06 +02:00
parent 06e79d7d50
commit c013aed58f
30 changed files with 306 additions and 58 deletions

View File

@ -3,6 +3,7 @@ package com.dh7789dev.xpeditis.controller.api.v1;
import com.dh7789dev.xpeditis.AuthenticationService; import com.dh7789dev.xpeditis.AuthenticationService;
import com.dh7789dev.xpeditis.dto.AuthenticationRequest; import com.dh7789dev.xpeditis.dto.AuthenticationRequest;
import com.dh7789dev.xpeditis.dto.AuthenticationResponse; import com.dh7789dev.xpeditis.dto.AuthenticationResponse;
import com.dh7789dev.xpeditis.dto.RegisterRequest;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -26,4 +27,10 @@ public class AuthenticationRestController {
@RequestBody @Valid AuthenticationRequest request) { @RequestBody @Valid AuthenticationRequest request) {
return ResponseEntity.ok(service.authenticate(request)); return ResponseEntity.ok(service.authenticate(request));
} }
@PostMapping("/register")
public ResponseEntity<AuthenticationResponse> register(
@RequestBody @Valid RegisterRequest request) {
return ResponseEntity.ok(service.register(request));
}
} }

View File

@ -87,9 +87,4 @@ public class GlobalConfiguration {
return source; return source;
} }
@Bean
public UserDetailsService userDetailsService() {
return username -> userDao.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException(String.format(USER_NOT_FOUND_MSG, username)));
}
} }

View File

@ -24,6 +24,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
private static final String AUTH_HEADER = "Authorization"; private static final String AUTH_HEADER = "Authorization";
private static final String AUTH_TYPE = "Bearer "; private static final String AUTH_TYPE = "Bearer ";
private final UserDetailsService userDetailsService; private final UserDetailsService userDetailsService;
private final JwtUtil jwtUtil; private final JwtUtil jwtUtil;
private final TokenDao tokenDao; private final TokenDao tokenDao;

View File

@ -52,8 +52,6 @@ public class SecurityConfiguration {
"/swagger-ui/**", "/swagger-ui/**",
"/webjars/**", "/webjars/**",
"/swagger-ui.html", "/swagger-ui.html",
"/uploadimage",
"/upload/**",
"/addevent"}; "/addevent"};
private static final WebExpressionAuthorizationManager INTERNAL_ACCESS = private static final WebExpressionAuthorizationManager INTERNAL_ACCESS =
@ -101,12 +99,8 @@ public class SecurityConfiguration {
auth.requestMatchers(WHITE_LIST_URL).permitAll() auth.requestMatchers(WHITE_LIST_URL).permitAll()
.requestMatchers(antMatcher(HttpMethod.GET, "/")).permitAll() .requestMatchers(antMatcher(HttpMethod.GET, "/")).permitAll()
.requestMatchers(antMatcher(HttpMethod.GET, API_V1_URI)).permitAll() .requestMatchers(antMatcher(HttpMethod.GET, API_V1_URI)).permitAll()
.requestMatchers(antMatcher(HttpMethod.GET, "/images/**")).permitAll()
.requestMatchers(antMatcher(HttpMethod.GET, "/api/v1/reservations")).hasRole(ADMIN_ROLE)
.requestMatchers(antMatcher(HttpMethod.GET, "/api/v1/reservations/**")).hasRole(ADMIN_ROLE)
.requestMatchers(antMatcher(HttpMethod.PUT, API_V1_URI)).hasRole(ADMIN_ROLE) .requestMatchers(antMatcher(HttpMethod.PUT, API_V1_URI)).hasRole(ADMIN_ROLE)
.requestMatchers(antMatcher(HttpMethod.DELETE, API_V1_URI)).hasRole(ADMIN_ROLE) .requestMatchers(antMatcher(HttpMethod.DELETE, API_V1_URI)).hasRole(ADMIN_ROLE)
.requestMatchers(antMatcher(HttpMethod.POST, "/api/v1/reservations")).permitAll()
.requestMatchers(antMatcher(HttpMethod.POST, API_V1_URI)).hasRole(ADMIN_ROLE) .requestMatchers(antMatcher(HttpMethod.POST, API_V1_URI)).hasRole(ADMIN_ROLE)
.requestMatchers(antMatcher("/h2-console/**")).access(INTERNAL_ACCESS) .requestMatchers(antMatcher("/h2-console/**")).access(INTERNAL_ACCESS)
.requestMatchers(antMatcher("/actuator/**")).access(INTERNAL_ACCESS) .requestMatchers(antMatcher("/actuator/**")).access(INTERNAL_ACCESS)

View File

@ -1,28 +1,39 @@
INSERT INTO users (username, email, password, role) -- === Companies ===
VALUES ('dbuser', 'dbuser@dev.ovh', '{bcrypt}$2y$10$.qkbukzzX21D.bqbI.B2R.tvWP90o/Y16QRWVLodw51BHft7ZWbc.', 'USER'), INSERT INTO company_entity (id, name, country)
('dbadmin', 'dbadmin@dev.ovh', '{bcrypt}$2y$10$kp1V7UYDEWn17WSK16UcmOnFd1mPFVF6UkLrOOCGtf24HOYt8p1iC', 'ADMIN'); VALUES
(1, 'Global Logistics', 'France'),
(2, 'TransWorld Exports', 'Germany');
INSERT INTO event (name, description, date) -- === Users ===
VALUES ('toto', 'hello', '2025-01-01'), INSERT INTO user_entity (id, username, first_name, last_name, email, password, role, enabled, company_id)
('tata', 'hola', '2025-01-10'); VALUES
(1, 'admin1', 'Alice', 'Martin', 'alice@globallogistics.com', '$2a$10$hash1', 'ADMIN', true, 1),
(2, 'user1', 'Bob', 'Dupont', 'bob@globallogistics.com', '$2a$10$hash2', 'USER', true, 1),
(3, 'admin2', 'Eva', 'Schmidt', 'eva@transworld.com', '$2a$10$hash3', 'ADMIN', true, 2);
INSERT INTO gallery (name, description) -- === Licenses ===
VALUES ('gallery', ''); INSERT INTO license_entity (id, license_key, expiration_date, active, user_id)
VALUES
(1, 'LIC-GL-A', '2025-12-31', true, 1),
(2, 'LIC-GL-B', '2025-12-31', true, 2),
(3, 'LIC-TW-A', '2025-11-30', true, 3);
INSERT INTO menu_category (name) -- === Quotes ===
VALUES ('STARTERS'), INSERT INTO quote_entity (id, reference, status, estimated_amount, created_at, user_id, company_id)
('DISHES'), VALUES
('DESSERTS'), ('550e8400-e29b-41d4-a716-446655440000', 'QT-GL-001', 'PENDING', 1200.50, CURRENT_TIMESTAMP, 1, 1),
('PIZZAS'), ('550e8400-e29b-41d4-a716-446655440001', 'QT-GL-002', 'VALIDATED', 2300.75, CURRENT_TIMESTAMP, 2, 1),
('RED_WINES'), ('550e8400-e29b-41d4-a716-446655440002', 'QT-TW-001', 'VALIDATED', 1950.00, CURRENT_TIMESTAMP, 3, 2);
('WHITE_WINES');
INSERT INTO product (name, description, price, category_id) -- === Export Folders ===
VALUES ('Coconut Cake', 'Fresh Coconut', 4.90, 3), INSERT INTO export_folder_entity (id, reference, validation_date, company_id, quote_id)
('Pasta', 'Fresh Pasta', 12.79, 2), VALUES
('Foie Gras', 'Fresh Pasta', 12.79, 1); (1, 'EXP-GL-002', CURRENT_TIMESTAMP, 1, '550e8400-e29b-41d4-a716-446655440001'),
(2, 'EXP-TW-001', CURRENT_TIMESTAMP, 2, '550e8400-e29b-41d4-a716-446655440002');
INSERT INTO selected_day (date) -- === Tokens ===
VALUES ('2035-01-01'), INSERT INTO token (id, token, token_type, revoked, expired, user_id)
('2035-03-02'), VALUES
('2035-03-10'); (1, 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9-admin1', 'BEARER', false, false, 1),
(2, 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9-user1', 'BEARER', false, false, 2),
(3, 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9-admin2', 'BEARER', false, false, 3);

View File

@ -2,8 +2,11 @@ package com.dh7789dev.xpeditis;
import com.dh7789dev.xpeditis.dto.AuthenticationRequest; import com.dh7789dev.xpeditis.dto.AuthenticationRequest;
import com.dh7789dev.xpeditis.dto.AuthenticationResponse; import com.dh7789dev.xpeditis.dto.AuthenticationResponse;
import com.dh7789dev.xpeditis.dto.RegisterRequest;
public interface AuthenticationService { public interface AuthenticationService {
AuthenticationResponse authenticate(AuthenticationRequest request); AuthenticationResponse authenticate(AuthenticationRequest request);
AuthenticationResponse register(RegisterRequest request);
} }

View File

@ -1,4 +1,19 @@
package com.dh7789dev.xpeditis.dto; package com.dh7789dev.xpeditis.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
@Data
@AllArgsConstructor
public class Company { public class Company {
private Long id;
private String name;
private String country;
private List<UserAccount> users;
private List<Quote> quotes;
private List<ExportFolder> exports;
} }

View File

@ -1,4 +1,19 @@
package com.dh7789dev.xpeditis.dto; package com.dh7789dev.xpeditis.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
public class ExportFolder { public class ExportFolder {
private Long id;
private String reference;
private LocalDateTime validationDate;
private Company company;
private Quote quote;
} }

View File

@ -1,4 +1,16 @@
package com.dh7789dev.xpeditis.dto; package com.dh7789dev.xpeditis.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.time.LocalDate;
@Data
@AllArgsConstructor
public class License { public class License {
private Long id;
private String licenseKey;
private LocalDate expirationDate;
private boolean active;
private UserAccount user;
} }

View File

@ -1,4 +1,22 @@
package com.dh7789dev.xpeditis.dto; package com.dh7789dev.xpeditis.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
public class Quote { public class Quote {
private Long id;
private String reference;
private String status;
private BigDecimal estimatedAmount;
private LocalDateTime createdAt = LocalDateTime.now();
private UserAccount user;
private Company company;
private ExportFolder exportFile;
} }

View File

@ -1,4 +1,37 @@
package com.dh7789dev.xpeditis.dto; package com.dh7789dev.xpeditis.dto;
import jakarta.validation.constraints.NotBlank;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
@Data
@AllArgsConstructor
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@Accessors(chain = true)
public class RegisterRequest { public class RegisterRequest {
@NotBlank
String firstName;
@NotBlank
String lastName;
@NotBlank
String username;
@NotBlank
String email;
@NotBlank
String password;
@NotBlank
String role; // Should be "USER" or "ADMIN"
} }

View File

@ -58,6 +58,10 @@
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -2,6 +2,9 @@ package com.dh7789dev.xpeditis;
import com.dh7789dev.xpeditis.dto.AuthenticationRequest; import com.dh7789dev.xpeditis.dto.AuthenticationRequest;
import com.dh7789dev.xpeditis.dto.AuthenticationResponse; import com.dh7789dev.xpeditis.dto.AuthenticationResponse;
import com.dh7789dev.xpeditis.dto.RegisterRequest;
import com.dh7789dev.xpeditis.dto.UserAccount;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
@ -17,4 +20,9 @@ public class AuthenticationServiceImpl implements AuthenticationService {
public AuthenticationResponse authenticate(AuthenticationRequest request) { public AuthenticationResponse authenticate(AuthenticationRequest request) {
return authenticationRepository.authenticate(request); return authenticationRepository.authenticate(request);
} }
@Override
public AuthenticationResponse register(RegisterRequest request) {
return null;
}
} }

View File

@ -1,4 +1,7 @@
package com.dh7789dev.xpeditis.dao; package com.dh7789dev.xpeditis.dao;
public interface CompanyDao { import com.dh7789dev.xpeditis.entity.CompanyEntity;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CompanyDao extends JpaRepository<CompanyEntity, Long> {
} }

View File

@ -1,4 +1,7 @@
package com.dh7789dev.xpeditis.dao; package com.dh7789dev.xpeditis.dao;
public interface ExportFolderDao { import com.dh7789dev.xpeditis.entity.ExportFolderEntity;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ExportFolderDao extends JpaRepository<ExportFolderEntity, Long> {
} }

View File

@ -1,4 +1,6 @@
package com.dh7789dev.xpeditis.dao; package com.dh7789dev.xpeditis.dao;
public interface LicenseDao { import org.springframework.data.jpa.repository.JpaRepository;
public interface LicenseDao extends JpaRepository<LicenseDao, Long> {
} }

View File

@ -1,4 +1,7 @@
package com.dh7789dev.xpeditis.dao; package com.dh7789dev.xpeditis.dao;
public class QuoteDao { import com.dh7789dev.xpeditis.entity.QuoteEntity;
import org.springframework.data.jpa.repository.JpaRepository;
public interface QuoteDao extends JpaRepository<QuoteEntity, Long> {
} }

View File

@ -12,9 +12,9 @@ public interface TokenDao extends JpaRepository<TokenEntity, Integer> {
Optional<TokenEntity> findByToken(String token); Optional<TokenEntity> findByToken(String token);
@Query(value = """ @Query(value = """
select t from TokenEntity t inner join UserEntity u\s select t from TokenEntity t inner join UserAccountEntity u\s
on t.user.id = u.id\s on t.user.id = u.id\s
where u.id = :userId and (t.expired = false or t.revoked = false)\s where u.id = :userId and (t.expired = false or t.revoked = false)\s
""") """)
List<TokenEntity> findAllValidTokenByUserId(Long userId); List<TokenEntity> findAllValidTokenByUserId(String userId);
} }

View File

@ -2,22 +2,25 @@ package com.dh7789dev.xpeditis.entity;
import jakarta.persistence.*; import jakarta.persistence.*;
import java.util.List;
@Entity @Entity
public class Company extends BaseEntity { public class CompanyEntity extends BaseEntity {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
private String name; private String name;
private String country; private String country;
@OneToMany(mappedBy = "company", cascade = CascadeType.ALL) @OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
private List<UserAccount> users; private List<UserEntity> users;
@OneToMany(mappedBy = "company", cascade = CascadeType.ALL) @OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
private List<Quote> quotes; private List<QuoteEntity> quotes;
@OneToMany(mappedBy = "company", cascade = CascadeType.ALL) @OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
private List<ExportFile> exports; private List<ExportFolderEntity> exports;
} }

View File

@ -1,4 +1,24 @@
package com.dh7789dev.xpeditis.entity; package com.dh7789dev.xpeditis.entity;
public class ExportFolder { import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
public class ExportFolderEntity extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String reference;
private LocalDateTime validationDate;
@ManyToOne
private CompanyEntity company;
@OneToOne
@JoinColumn(name = "quote_id", unique = true)
private QuoteEntity quote;
} }

View File

@ -5,17 +5,19 @@ import jakarta.persistence.*;
import java.time.LocalDate; import java.time.LocalDate;
@Entity @Entity
public class License extends BaseEntity { public class LicenseEntity extends BaseEntity {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
private String licenseKey; private String licenseKey;
private LocalDate expirationDate; private LocalDate expirationDate;
private boolean active; private boolean active;
@OneToOne @OneToOne
@JoinColumn(name = "user_id", unique = true) @JoinColumn(name = "user_id", unique = true)
private UserAccount user; private UserEntity user;
} }

View File

@ -6,23 +6,28 @@ import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Entity @Entity
public class Quote extends BaseEntity { public class QuoteEntity extends BaseEntity {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.UUID)
private Long id; private Long id;
@Column(unique = true, nullable = false)
private String reference; private String reference;
@Column(nullable = false)
private String status; private String status;
private BigDecimal estimatedAmount; private BigDecimal estimatedAmount;
private LocalDateTime createdAt = LocalDateTime.now(); private LocalDateTime createdAt = LocalDateTime.now();
@ManyToOne @ManyToOne
private UserAccount user; private UserEntity user;
@ManyToOne @ManyToOne
private Company company; private CompanyEntity company;
@OneToOne(mappedBy = "quote", cascade = CascadeType.ALL) @OneToOne(mappedBy = "quote", cascade = CascadeType.ALL)
private ExportFile exportFile; private ExportFolderEntity exportFile;
} }

View File

@ -13,7 +13,7 @@ import java.util.List;
@Entity @Entity
@Getter @Getter
@Setter @Setter
public class UserAccountEntity extends BaseEntity implements UserDetails { public class UserEntity extends BaseEntity implements UserDetails {
@NaturalId @NaturalId
@Column(nullable = false, unique = true, length = 50) @Column(nullable = false, unique = true, length = 50)

View File

@ -1,4 +1,25 @@
package com.dh7789dev.xpeditis.mapper; package com.dh7789dev.xpeditis.mapper;
public class CompanyMapper {
import com.dh7789dev.xpeditis.dto.Company;
import com.dh7789dev.xpeditis.entity.CompanyEntity;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;
import org.mapstruct.factory.Mappers;
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface CompanyMapper {
CompanyMapper INSTANCE = Mappers.getMapper(CompanyMapper.class);
@Mapping(target = "createdDate", ignore = true)
@Mapping(target = "modifiedDate", ignore = true)
@Mapping(target = "createdBy", ignore = true)
@Mapping(target = "modifiedBy", ignore = true)
CompanyEntity companyToCompanyEntity(Company company);
Company companyEntityToCompany(CompanyEntity companyEntity);
} }

View File

@ -1,4 +1,21 @@
package com.dh7789dev.xpeditis.mapper; package com.dh7789dev.xpeditis.mapper;
import com.dh7789dev.xpeditis.dto.ExportFolder;
import com.dh7789dev.xpeditis.entity.ExportFolderEntity;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;
import org.mapstruct.factory.Mappers;
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface ExportFolderMapper { public interface ExportFolderMapper {
ExportFolderMapper INSTANCE = Mappers.getMapper(ExportFolderMapper.class);
@Mapping(target = "createdDate", ignore = true)
@Mapping(target = "modifiedDate", ignore = true)
@Mapping(target = "createdBy", ignore = true)
@Mapping(target = "modifiedBy", ignore = true)
ExportFolderEntity exportFolderToCompanyEntity(ExportFolder exportFolder);
ExportFolder exportFolderEntityToExportFolder(ExportFolderEntity exportFolderEntity);
} }

View File

@ -1,4 +1,22 @@
package com.dh7789dev.xpeditis.mapper; package com.dh7789dev.xpeditis.mapper;
import com.dh7789dev.xpeditis.dto.License;
import com.dh7789dev.xpeditis.entity.LicenseEntity;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;
import org.mapstruct.factory.Mappers;
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface LicenseMapper { public interface LicenseMapper {
LicenseMapper INSTANCE = Mappers.getMapper(LicenseMapper.class);
@Mapping(target = "createdDate", ignore = true)
@Mapping(target = "modifiedDate", ignore = true)
@Mapping(target = "createdBy", ignore = true)
@Mapping(target = "modifiedBy", ignore = true)
LicenseEntity licenseToLicenseEntity(License license);
License licenseEntityToLicense(LicenseEntity licenseEntity);
} }

View File

@ -1,4 +1,21 @@
package com.dh7789dev.xpeditis.mapper; package com.dh7789dev.xpeditis.mapper;
import com.dh7789dev.xpeditis.dto.Quote;
import com.dh7789dev.xpeditis.entity.QuoteEntity;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;
import org.mapstruct.factory.Mappers;
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface QuoteMapper { public interface QuoteMapper {
QuoteMapper INSTANCE = Mappers.getMapper(QuoteMapper.class);
@Mapping(target = "createdDate", ignore = true)
@Mapping(target = "modifiedDate", ignore = true)
@Mapping(target = "createdBy", ignore = true)
@Mapping(target = "modifiedBy", ignore = true)
QuoteEntity quoteToQuoteEntity(Quote quote);
Quote quoteEntityToQuote(QuoteEntity quoteEntity);
} }

View File

@ -1,4 +1,24 @@
package com.dh7789dev.xpeditis.mapper; package com.dh7789dev.xpeditis.mapper;
public class UserMapper { import com.dh7789dev.xpeditis.dto.UserAccount;
import com.dh7789dev.xpeditis.entity.UserEntity;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;
import org.mapstruct.factory.Mappers;
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
@Mapping(target = "createdDate", ignore = true)
@Mapping(target = "modifiedDate", ignore = true)
@Mapping(target = "createdBy", ignore = true)
@Mapping(target = "modifiedBy", ignore = true)
UserEntity userAccountToUserEntity(UserAccount user);
UserAccount userEntityToUserAccount(UserEntity userEntity);
} }

View File

@ -64,7 +64,7 @@ public class AuthenticationJwtRepository implements AuthenticationRepository {
} }
private void revokeAllUserTokens(UserEntity userEntity) { private void revokeAllUserTokens(UserEntity userEntity) {
var validUserTokens = tokenDao.findAllValidTokenByUserId(userEntity.getId()); var validUserTokens = tokenDao.findAllValidTokenByUserId(String.valueOf(userEntity.getId()));
if (validUserTokens.isEmpty()) return; if (validUserTokens.isEmpty()) return;
validUserTokens.forEach(token -> { validUserTokens.forEach(token -> {
token.setExpired(true); token.setExpired(true);

View File

@ -1,7 +1,5 @@
package com.dh7789dev.xpeditis.repository; package com.dh7789dev.xpeditis.repository;
import com.dh7789dev.xpeditis.dao.ReservationDao;
import com.dh7789dev.xpeditis.entity.ReservationEntity;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;