diff --git a/src/main/java/org/cardanofoundation/authentication/aop/UserAspect.java b/src/main/java/org/cardanofoundation/authentication/aop/UserAspect.java index 940ef73d..acfcd7e9 100644 --- a/src/main/java/org/cardanofoundation/authentication/aop/UserAspect.java +++ b/src/main/java/org/cardanofoundation/authentication/aop/UserAspect.java @@ -28,27 +28,26 @@ public class UserAspect { @AfterReturning("execution(* org.cardanofoundation.authentication.service.impl.AuthenticationServiceImpl.signIn(*)) && args(signInRequest)") public void signInLog(SignInRequest signInRequest) { - String username = ""; + String accountId = ""; Integer type = signInRequest.getType(); if (type == 0) { - username = signInRequest.getUsername(); + accountId = signInRequest.getEmail(); } else { - username = signInRequest.getAddress(); + accountId = signInRequest.getAddress(); } - UserEntity user = userService.findByUsername(username); + UserEntity user = userService.findByAccountId(accountId); userHistoryService.saveUserHistory(EUserAction.LOGIN, Instant.now(), user); } @AfterReturning("execution(* org.cardanofoundation.authentication.service.impl.AuthenticationServiceImpl.signUp(*)) && args(signUpRequest)") public void signUpLog(SignUpRequest signUpRequest) { - UserEntity user = userService.findByUsername(signUpRequest.getEmail()); + UserEntity user = userService.findByAccountId(signUpRequest.getEmail()); userHistoryService.saveUserHistory(EUserAction.CREATED, Instant.now(), user); } @AfterReturning("execution(* org.cardanofoundation.authentication.service.impl.AuthenticationServiceImpl.signOut(org.cardanofoundation.authentication.model.request.auth.SignOutRequest,..)) && args(signOutRequest,..)") public void signOutLog(SignOutRequest signOutRequest) { - String username = signOutRequest.getUsername(); - UserEntity user = userService.findByUsername(username); + UserEntity user = userService.findByAccountId(signOutRequest.getAccountId()); userHistoryService.saveUserHistory(EUserAction.LOGOUT, Instant.now(), user); } } diff --git a/src/main/java/org/cardanofoundation/authentication/config/AuthTokenFilter.java b/src/main/java/org/cardanofoundation/authentication/config/AuthTokenFilter.java index 3e93b8b3..9a5ffc10 100644 --- a/src/main/java/org/cardanofoundation/authentication/config/AuthTokenFilter.java +++ b/src/main/java/org/cardanofoundation/authentication/config/AuthTokenFilter.java @@ -43,8 +43,8 @@ protected void doFilterInternal(@NotNull HttpServletRequest request, throw new InvalidAccessTokenException(); } - String username = jwtProvider.getUserNameFromJwtToken(token); - UserDetailsImpl userDetails = (UserDetailsImpl) userService.loadUserByUsername(username); + String accountId = jwtProvider.getAccountIdFromJwtToken(token); + UserDetailsImpl userDetails = (UserDetailsImpl) userService.loadUserByUsername(accountId); UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( userDetails.getUsername(), null, userDetails.getAuthorities()); authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); diff --git a/src/main/java/org/cardanofoundation/authentication/constant/AuthConstant.java b/src/main/java/org/cardanofoundation/authentication/constant/AuthConstant.java index 5b398549..87d62448 100644 --- a/src/main/java/org/cardanofoundation/authentication/constant/AuthConstant.java +++ b/src/main/java/org/cardanofoundation/authentication/constant/AuthConstant.java @@ -8,29 +8,33 @@ public final class AuthConstant { public static final String BASE_AUTH_PATH = "/api/v1/auth/"; - public static final String BASE_ADMIN_PATH = "/api/v1/admin/"; - public static final String BASE_USER_PATH = "/api/v1/user/"; public static final String BASE_VERIFY_PATH = "/api/v1/verify/"; public static final String[] AUTH_WHITELIST = { - BASE_AUTH_PATH + "sign-in", BASE_AUTH_PATH + "sign-up", - BASE_AUTH_PATH + "refresh-token", BASE_AUTH_PATH + "sign-out", + BASE_AUTH_PATH + "sign-in", + BASE_AUTH_PATH + "sign-up", + BASE_AUTH_PATH + "refresh-token", + BASE_AUTH_PATH + "sign-out", BASE_AUTH_PATH + "get-nonce***", - BASE_ADMIN_PATH + "sign-up", BASE_ADMIN_PATH + "sign-in", - BASE_ADMIN_PATH + "refresh-token", BASE_ADMIN_PATH + "sign-out", - BASE_VERIFY_PATH + "active", BASE_VERIFY_PATH + "forgot-password", + BASE_VERIFY_PATH + "active", + BASE_VERIFY_PATH + "forgot-password", BASE_VERIFY_PATH + "reset-password" }; public static final String[] USER_WHITELIST = { - BASE_USER_PATH + "exist-username", BASE_USER_PATH + "exist-email"}; + BASE_USER_PATH + "exist-email" + }; - public static final String[] DOCUMENT_WHITELIST = {"/v3/api-docs/**", "/planning/", - "/swagger-ui/**", "/swagger-ui.html"}; + public static final String[] DOCUMENT_WHITELIST = { + "/v3/api-docs/**", + "/planning/", + "/swagger-ui/**", + "/swagger-ui.html" + }; public static final String[] CLIENT_WHITELIST = {"/", "/error", "/favicon.ico", "/**/*.png", - "/**/*.gif", "/**/*.svg", "/**/*.jpg", "/**/*.html", "/**/*.css", "/**/*.scss", "/**/*.js"}; - + "/**/*.gif", "/**/*.svg", "/**/*.jpg", "/**/*.html", "/**/*.css", "/**/*.scss", "/**/*.js" + }; } diff --git a/src/main/java/org/cardanofoundation/authentication/controller/AuthAdminController.java b/src/main/java/org/cardanofoundation/authentication/controller/AuthAdminController.java deleted file mode 100644 index 189d8354..00000000 --- a/src/main/java/org/cardanofoundation/authentication/controller/AuthAdminController.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.cardanofoundation.authentication.controller; - -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.cardanofoundation.authentication.model.request.admin.RemoveUserRequest; -import org.cardanofoundation.authentication.model.request.admin.SignInAdminRequest; -import org.cardanofoundation.authentication.model.request.admin.SignUpAdminRequest; -import org.cardanofoundation.authentication.model.request.auth.SignOutRequest; -import org.cardanofoundation.authentication.model.response.MessageResponse; -import org.cardanofoundation.authentication.model.response.auth.RefreshTokenResponse; -import org.cardanofoundation.authentication.model.response.auth.SignInResponse; -import org.cardanofoundation.authentication.service.AuthenticationAdminService; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -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.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/v1/admin") -@RequiredArgsConstructor -@Tag(name = "Authentication Admin Controller", description = "") -public class AuthAdminController { - - private final AuthenticationAdminService authenticationAdminService; - - @PostMapping(value = "/sign-up", consumes = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity signUp( - @Valid @RequestBody SignUpAdminRequest signUpAdmin) { - return ResponseEntity.ok(authenticationAdminService.signUp(signUpAdmin)); - } - - @PostMapping(value = "/sign-in", consumes = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity signIn(@Valid @RequestBody SignInAdminRequest signInAdmin) { - return ResponseEntity.ok(authenticationAdminService.signIn(signInAdmin)); - } - - @GetMapping("/refresh-token") - public ResponseEntity refreshToken( - @Valid @RequestParam("refreshJwt") String refreshJwt, HttpServletRequest httpServletRequest) { - return ResponseEntity.ok( - authenticationAdminService.refreshToken(refreshJwt, httpServletRequest)); - } - - @PostMapping(value = "/sign-out", consumes = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity signOut(@Valid @RequestBody SignOutRequest signOutRequest, - HttpServletRequest httpServletRequest) { - return ResponseEntity.ok( - authenticationAdminService.signOut(signOutRequest, httpServletRequest)); - } - - @DeleteMapping(value = "/remove") - public ResponseEntity remove(@RequestBody RemoveUserRequest removeUserRequest, - HttpServletRequest httpServletRequest) { - return ResponseEntity.ok( - authenticationAdminService.remove(removeUserRequest, httpServletRequest)); - } -} diff --git a/src/main/java/org/cardanofoundation/authentication/controller/UserController.java b/src/main/java/org/cardanofoundation/authentication/controller/UserController.java index 06662231..a0aff29a 100644 --- a/src/main/java/org/cardanofoundation/authentication/controller/UserController.java +++ b/src/main/java/org/cardanofoundation/authentication/controller/UserController.java @@ -25,11 +25,6 @@ public class UserController { private final UserService userService; - @GetMapping("/exist-username") - public ResponseEntity checkExistUsername(@RequestParam("username") String username) { - return ResponseEntity.ok(userService.checkExistUsername(username)); - } - @PutMapping("/edit-avatar") public ResponseEntity editAvatar(@RequestParam("avatar") MultipartFile avatar, HttpServletRequest httpServletRequest) { diff --git a/src/main/java/org/cardanofoundation/authentication/controller/VerifyMailController.java b/src/main/java/org/cardanofoundation/authentication/controller/VerifyMailController.java index 8c0eb9e5..7879ca36 100644 --- a/src/main/java/org/cardanofoundation/authentication/controller/VerifyMailController.java +++ b/src/main/java/org/cardanofoundation/authentication/controller/VerifyMailController.java @@ -1,10 +1,10 @@ package org.cardanofoundation.authentication.controller; -import org.cardanofoundation.authentication.model.request.admin.ResetPasswordRequest; -import org.cardanofoundation.authentication.model.response.MessageResponse; -import org.cardanofoundation.authentication.service.VerifyService; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.cardanofoundation.authentication.model.request.auth.ResetPasswordRequest; +import org.cardanofoundation.authentication.model.response.MessageResponse; +import org.cardanofoundation.authentication.service.VerifyService; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; diff --git a/src/main/java/org/cardanofoundation/authentication/mapper/UserMapper.java b/src/main/java/org/cardanofoundation/authentication/mapper/UserMapper.java index d30c0eb4..e405db30 100644 --- a/src/main/java/org/cardanofoundation/authentication/mapper/UserMapper.java +++ b/src/main/java/org/cardanofoundation/authentication/mapper/UserMapper.java @@ -1,7 +1,6 @@ package org.cardanofoundation.authentication.mapper; import org.cardanofoundation.authentication.model.entity.UserEntity; -import org.cardanofoundation.authentication.model.request.admin.SignUpAdminRequest; import org.cardanofoundation.authentication.model.request.auth.SignUpRequest; import org.cardanofoundation.authentication.model.response.UserResponse; import org.mapstruct.Mapper; @@ -15,6 +14,4 @@ public interface UserMapper { UserEntity requestToEntity(SignUpRequest request); UserResponse entityToResponse(UserEntity user); - - UserEntity requestAdminToEntity(SignUpAdminRequest request); } diff --git a/src/main/java/org/cardanofoundation/authentication/mapper/WalletMapper.java b/src/main/java/org/cardanofoundation/authentication/mapper/WalletMapper.java deleted file mode 100644 index 5efcbe7a..00000000 --- a/src/main/java/org/cardanofoundation/authentication/mapper/WalletMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.cardanofoundation.authentication.mapper; - -import org.cardanofoundation.authentication.model.entity.WalletEntity; -import org.cardanofoundation.authentication.model.request.auth.WalletRequest; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface WalletMapper { - - WalletMapper INSTANCE = Mappers.getMapper(WalletMapper.class); - - WalletEntity requestToEntity(WalletRequest request); -} diff --git a/src/main/java/org/cardanofoundation/authentication/model/entity/UserEntity.java b/src/main/java/org/cardanofoundation/authentication/model/entity/UserEntity.java index 377e1d6b..78f9d0fb 100644 --- a/src/main/java/org/cardanofoundation/authentication/model/entity/UserEntity.java +++ b/src/main/java/org/cardanofoundation/authentication/model/entity/UserEntity.java @@ -10,7 +10,6 @@ import jakarta.persistence.JoinTable; import jakarta.persistence.ManyToMany; import jakarta.persistence.Table; -import jakarta.validation.constraints.NotNull; import java.util.HashSet; import java.util.Objects; import java.util.Set; @@ -34,11 +33,7 @@ @Where(clause = "is_deleted = false") public class UserEntity extends BaseEntity { - @Column(name = "username", length = 64, nullable = false) - @NotNull - private String username; - - @Column(name = "email", length = 64) + @Column(name = "email", length = 64, unique = true) private String email; @Column(name = "avatar") @@ -52,7 +47,6 @@ public class UserEntity extends BaseEntity { private EStatus status; @Column(name = "is_deleted", nullable = false, columnDefinition = "BOOLEAN DEFAULT false") - @NotNull private boolean isDeleted; @ManyToMany(fetch = FetchType.EAGER) diff --git a/src/main/java/org/cardanofoundation/authentication/model/entity/security/UserDetailsImpl.java b/src/main/java/org/cardanofoundation/authentication/model/entity/security/UserDetailsImpl.java index 7f7f1515..edec9412 100644 --- a/src/main/java/org/cardanofoundation/authentication/model/entity/security/UserDetailsImpl.java +++ b/src/main/java/org/cardanofoundation/authentication/model/entity/security/UserDetailsImpl.java @@ -1,6 +1,7 @@ package org.cardanofoundation.authentication.model.entity.security; import com.fasterxml.jackson.annotation.JsonIgnore; +import java.io.Serial; import org.cardanofoundation.authentication.model.entity.UserEntity; import java.util.Collection; import java.util.List; @@ -12,6 +13,7 @@ public class UserDetailsImpl implements UserDetails { + @Serial private static final long serialVersionUID = 1L; private final Long id; @@ -34,17 +36,15 @@ public UserDetailsImpl(Long id, String username, String email, String password, this.authorities = authorities; } - public static UserDetailsImpl build(UserEntity user, String password) { - List authorities = + public static UserDetailsImpl build(UserEntity user, String accountId, String password) { + List authorities = user.getRoles().stream() .map(role -> new SimpleGrantedAuthority(role.getName().name())) - .collect(Collectors.toList()); - + .toList(); return new UserDetailsImpl( - user.getId(), user.getUsername(), user.getEmail(), password, authorities); + user.getId(), accountId, user.getEmail(), password, authorities); } - @Override public Collection getAuthorities() { return authorities; diff --git a/src/main/java/org/cardanofoundation/authentication/model/request/admin/RemoveUserRequest.java b/src/main/java/org/cardanofoundation/authentication/model/request/admin/RemoveUserRequest.java deleted file mode 100644 index 69e82adb..00000000 --- a/src/main/java/org/cardanofoundation/authentication/model/request/admin/RemoveUserRequest.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.cardanofoundation.authentication.model.request.admin; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class RemoveUserRequest { - - @NotNull - @NotBlank - private String password; -} diff --git a/src/main/java/org/cardanofoundation/authentication/model/request/admin/SignInAdminRequest.java b/src/main/java/org/cardanofoundation/authentication/model/request/admin/SignInAdminRequest.java deleted file mode 100644 index ed293476..00000000 --- a/src/main/java/org/cardanofoundation/authentication/model/request/admin/SignInAdminRequest.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.cardanofoundation.authentication.model.request.admin; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class SignInAdminRequest { - - @NotBlank - @NotNull - @Email - private String email; - - @NotBlank - @NotNull - private String password; -} diff --git a/src/main/java/org/cardanofoundation/authentication/model/request/admin/SignUpAdminRequest.java b/src/main/java/org/cardanofoundation/authentication/model/request/admin/SignUpAdminRequest.java deleted file mode 100644 index 58187632..00000000 --- a/src/main/java/org/cardanofoundation/authentication/model/request/admin/SignUpAdminRequest.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.cardanofoundation.authentication.model.request.admin; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Getter; -import lombok.Setter; -import org.cardanofoundation.authentication.model.enums.ERole; - -@Getter -@Setter -public class SignUpAdminRequest { - - @NotNull - @NotBlank - private String username; - - @NotNull - @NotBlank - @Email - private String email; - - @NotNull - @NotBlank - private String password; - - @NotNull - private ERole role; -} diff --git a/src/main/java/org/cardanofoundation/authentication/model/request/admin/ResetPasswordRequest.java b/src/main/java/org/cardanofoundation/authentication/model/request/auth/ResetPasswordRequest.java similarity index 81% rename from src/main/java/org/cardanofoundation/authentication/model/request/admin/ResetPasswordRequest.java rename to src/main/java/org/cardanofoundation/authentication/model/request/auth/ResetPasswordRequest.java index 67646c41..7938cb1b 100644 --- a/src/main/java/org/cardanofoundation/authentication/model/request/admin/ResetPasswordRequest.java +++ b/src/main/java/org/cardanofoundation/authentication/model/request/auth/ResetPasswordRequest.java @@ -1,4 +1,4 @@ -package org.cardanofoundation.authentication.model.request.admin; +package org.cardanofoundation.authentication.model.request.auth; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; diff --git a/src/main/java/org/cardanofoundation/authentication/model/request/auth/SignInRequest.java b/src/main/java/org/cardanofoundation/authentication/model/request/auth/SignInRequest.java index 6886679b..91ff33d9 100644 --- a/src/main/java/org/cardanofoundation/authentication/model/request/auth/SignInRequest.java +++ b/src/main/java/org/cardanofoundation/authentication/model/request/auth/SignInRequest.java @@ -12,7 +12,7 @@ public class SignInRequest { private String signature; - private String username; + private String email; private String password; diff --git a/src/main/java/org/cardanofoundation/authentication/model/request/auth/SignOutRequest.java b/src/main/java/org/cardanofoundation/authentication/model/request/auth/SignOutRequest.java index 1daa94d5..ffc17979 100644 --- a/src/main/java/org/cardanofoundation/authentication/model/request/auth/SignOutRequest.java +++ b/src/main/java/org/cardanofoundation/authentication/model/request/auth/SignOutRequest.java @@ -15,5 +15,5 @@ public class SignOutRequest { @NotNull @NotBlank - private String username; + private String accountId; } diff --git a/src/main/java/org/cardanofoundation/authentication/model/request/auth/WalletRequest.java b/src/main/java/org/cardanofoundation/authentication/model/request/auth/WalletRequest.java deleted file mode 100644 index aee75a59..00000000 --- a/src/main/java/org/cardanofoundation/authentication/model/request/auth/WalletRequest.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.cardanofoundation.authentication.model.request.auth; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Getter; -import lombok.Setter; -import org.cardanofoundation.authentication.model.enums.ENetworkType; -import org.cardanofoundation.authentication.model.enums.EWalletName; - -@Getter -@Setter -public class WalletRequest { - - @NotNull - @NotBlank - private String address; - - @NotNull - @NotBlank - private EWalletName walletName; - - private String networkId; - - private ENetworkType networkType; - - @NotNull - private String signature; -} diff --git a/src/main/java/org/cardanofoundation/authentication/model/response/UserInfoResponse.java b/src/main/java/org/cardanofoundation/authentication/model/response/UserInfoResponse.java index c15fb86e..4d33c13f 100644 --- a/src/main/java/org/cardanofoundation/authentication/model/response/UserInfoResponse.java +++ b/src/main/java/org/cardanofoundation/authentication/model/response/UserInfoResponse.java @@ -10,7 +10,7 @@ @Builder public class UserInfoResponse { - private String username; + private String address; private String email; diff --git a/src/main/java/org/cardanofoundation/authentication/model/response/UserResponse.java b/src/main/java/org/cardanofoundation/authentication/model/response/UserResponse.java index 8291248a..1393318b 100644 --- a/src/main/java/org/cardanofoundation/authentication/model/response/UserResponse.java +++ b/src/main/java/org/cardanofoundation/authentication/model/response/UserResponse.java @@ -7,7 +7,7 @@ @Setter public class UserResponse { - private String username; + private String address; private String email; diff --git a/src/main/java/org/cardanofoundation/authentication/model/response/auth/SignInResponse.java b/src/main/java/org/cardanofoundation/authentication/model/response/auth/SignInResponse.java index 80bb3136..de877ae5 100644 --- a/src/main/java/org/cardanofoundation/authentication/model/response/auth/SignInResponse.java +++ b/src/main/java/org/cardanofoundation/authentication/model/response/auth/SignInResponse.java @@ -13,8 +13,6 @@ public class SignInResponse { private String tokenType; - private String username; - private String email; private String refreshToken; diff --git a/src/main/java/org/cardanofoundation/authentication/provider/JwtProvider.java b/src/main/java/org/cardanofoundation/authentication/provider/JwtProvider.java index 7cd05cd4..68becc1e 100644 --- a/src/main/java/org/cardanofoundation/authentication/provider/JwtProvider.java +++ b/src/main/java/org/cardanofoundation/authentication/provider/JwtProvider.java @@ -37,29 +37,28 @@ public class JwtProvider { private final MailProperties mail; - - public String generateJwtToken(Authentication authentication, String username) { + public String generateJwtToken(Authentication authentication, String accountId) { UserDetailsImpl userPrincipal = (UserDetailsImpl) authentication.getPrincipal(); - return Jwts.builder().setSubject(username) + return Jwts.builder().setSubject(accountId) .claim(CommonConstant.AUTHORITIES_KEY, userPrincipal.getAuthorities().stream().map(GrantedAuthority::getAuthority) - .collect(Collectors.toList())).setIssuedAt(new Date()) + .toList()).setIssuedAt(new Date()) .setExpiration(new Date((new Date()).getTime() + expirationMs)) .signWith(rsaConfig.getPrivateKeyAuth(), SignatureAlgorithm.RS256).compact(); } - public String generateCodeForVerify(String username) { - return Jwts.builder().setSubject(username).setIssuedAt(new Date()) + public String generateCodeForVerify(String email) { + return Jwts.builder().setSubject(email).setIssuedAt(new Date()) .setExpiration(new Date((new Date()).getTime() + mail.getExpirationMs())) .signWith(rsaConfig.getPrivateKeyMail(), SignatureAlgorithm.RS256).compact(); } - public String getUserNameFromJwtToken(String token) { + public String getAccountIdFromJwtToken(String token) { return Jwts.parserBuilder().setSigningKey(rsaConfig.getPublicKeyAuth()).build() .parseClaimsJws(token).getBody().getSubject(); } - public String getUserNameFromJwtToken(HttpServletRequest httpServletRequest) { + public String getAccountIdFromJwtToken(HttpServletRequest httpServletRequest) { String token = parseJwt(httpServletRequest); return Jwts.parserBuilder().setSigningKey(rsaConfig.getPublicKeyAuth()).build() .parseClaimsJws(token).getBody().getSubject(); @@ -106,15 +105,15 @@ public Boolean validateVerifyCode(String code) { return Boolean.TRUE; } - public String getUserNameFromVerifyCode(String code) { + public String getAccountIdFromVerifyCode(String code) { return Jwts.parserBuilder().setSigningKey(rsaConfig.getPublicKeyMail()).build() .parseClaimsJws(code).getBody().getSubject(); } - public String generateJwtTokenFromUser(UserEntity user) { - return Jwts.builder().setSubject(user.getUsername()) + public String generateJwtToken(UserEntity user, String accountId) { + return Jwts.builder().setSubject(accountId) .claim(CommonConstant.AUTHORITIES_KEY, - user.getRoles().stream().map(RoleEntity::getName).collect(Collectors.toList())) + user.getRoles().stream().map(RoleEntity::getName).toList()) .setIssuedAt(new Date()).setExpiration(new Date((new Date()).getTime() + expirationMs)) .signWith(rsaConfig.getPrivateKeyAuth(), SignatureAlgorithm.RS256).compact(); } diff --git a/src/main/java/org/cardanofoundation/authentication/provider/MailProvider.java b/src/main/java/org/cardanofoundation/authentication/provider/MailProvider.java index 0d2ed8da..e089206e 100644 --- a/src/main/java/org/cardanofoundation/authentication/provider/MailProvider.java +++ b/src/main/java/org/cardanofoundation/authentication/provider/MailProvider.java @@ -24,7 +24,7 @@ public class MailProvider { private final MailProperties mail; public void sendVerifyEmail(UserEntity user, EUserAction emailType, String code) { - log.info("start send verify mail to: " + user.getUsername()); + log.info("start send verify mail to: " + user.getEmail()); String contentHtml = "Hi there,
" + "Please click the link below to verify account:
" diff --git a/src/main/java/org/cardanofoundation/authentication/provider/RedisProvider.java b/src/main/java/org/cardanofoundation/authentication/provider/RedisProvider.java index 522abaa4..9ca3173d 100644 --- a/src/main/java/org/cardanofoundation/authentication/provider/RedisProvider.java +++ b/src/main/java/org/cardanofoundation/authentication/provider/RedisProvider.java @@ -19,19 +19,19 @@ public class RedisProvider { /* * @author: phuc.nguyen5 * @since: 06/12/2022 - * description: Add access token + username to redis after logout or refresh token + * description: Add access token + accountId to redis after logout or refresh token * @update: */ - public void blacklistJwt(String token, String username) { + public void blacklistJwt(String token, String accountId) { if (!isTokenBlacklisted(token)) { - redisTemplate.opsForValue().set(RedisConstant.JWT + token, username); + redisTemplate.opsForValue().set(RedisConstant.JWT + token, accountId); } } /* * @author: phuc.nguyen5 * @since: 06/12/2022 - * description: Check exist access token + username from redis + * description: Check exist access token + accountId from redis * @update: */ public boolean isTokenBlacklisted(String token) { diff --git a/src/main/java/org/cardanofoundation/authentication/repository/BookMarkRepository.java b/src/main/java/org/cardanofoundation/authentication/repository/BookMarkRepository.java index 18db2a7f..67c7659a 100644 --- a/src/main/java/org/cardanofoundation/authentication/repository/BookMarkRepository.java +++ b/src/main/java/org/cardanofoundation/authentication/repository/BookMarkRepository.java @@ -17,14 +17,14 @@ public interface BookMarkRepository extends JpaRepository /* * @author: phuc.nguyen5 * @since: 10/11/2022 - * description: find all bookmark by username and type + * description: find all bookmark by userId and type * @update: 05/12/2022 */ @Query(value = "SELECT be FROM BookMarkEntity be " + "JOIN UserEntity ue ON be.user.id = ue.id " - + "WHERE ue.username = :username AND be.type = :type AND be.network = :network " + + "WHERE ue.id = :userId AND be.type = :type AND be.network = :network " + "ORDER BY be.createdDate DESC") - Page findAllBookMarkByUserAndType(@Param("username") String username, + Page findAllBookMarkByUserAndType(@Param("userId") Long userId, @Param("type") EBookMarkType type, @Param("network") ENetworkType network, Pageable pageable); /* @@ -45,12 +45,12 @@ Long checkExistBookMark(@Param("userId") Long userId, @Param("keyword") String k /* * @author: phuc.nguyen5 * @since: 30/01/2023 - * description: find all bookmark key by username + * description: find all bookmark key by userId * @update: */ @Query(value = "SELECT be FROM BookMarkEntity be " + "JOIN UserEntity ue ON be.user.id = ue.id " - + "WHERE ue.username = :username AND be.network = :network") - List findAllKeyBookMarkByUser(@Param("username") String username, + + "WHERE ue.id = :userId AND be.network = :network") + List findAllKeyBookMarkByUser(@Param("userId") Long userId, @Param("network") ENetworkType network); } diff --git a/src/main/java/org/cardanofoundation/authentication/repository/PrivateNoteRepository.java b/src/main/java/org/cardanofoundation/authentication/repository/PrivateNoteRepository.java index f33e191a..368d0b3b 100644 --- a/src/main/java/org/cardanofoundation/authentication/repository/PrivateNoteRepository.java +++ b/src/main/java/org/cardanofoundation/authentication/repository/PrivateNoteRepository.java @@ -41,8 +41,8 @@ Long checkExistNote(@Param("userId") Long userId, @Param("txHash") String txHash */ @Query(value = "SELECT pn FROM PrivateNoteEntity pn " + "JOIN UserEntity ue ON pn.user.id = ue.id " - + "WHERE ue.username = :username AND pn.network = :network " + + "WHERE ue.id = :userId AND pn.network = :network " + "ORDER BY pn.createdDate DESC") - Page findAllNote(@Param("username") String username, @Param("network") + Page findAllNote(@Param("userId") Long userId, @Param("network") ENetworkType network, Pageable pageable); } diff --git a/src/main/java/org/cardanofoundation/authentication/repository/RefreshTokenRepository.java b/src/main/java/org/cardanofoundation/authentication/repository/RefreshTokenRepository.java index 2335c6dc..55b3113e 100644 --- a/src/main/java/org/cardanofoundation/authentication/repository/RefreshTokenRepository.java +++ b/src/main/java/org/cardanofoundation/authentication/repository/RefreshTokenRepository.java @@ -12,14 +12,10 @@ @Repository public interface RefreshTokenRepository extends JpaRepository { - @NotNull - @Override - Optional findById(@NotNull Long id); - Optional findByToken(String token); @Query(value = "SELECT rf FROM RefreshTokenEntity rf " + "JOIN UserEntity ue ON rf.user.id = ue.id " - + "WHERE ue.username = :username") - List findALlByUsername(@Param("username") String username); + + "WHERE ue.id = :userId") + List findALlByUserId(@Param("userId") Long userId); } diff --git a/src/main/java/org/cardanofoundation/authentication/repository/UserRepository.java b/src/main/java/org/cardanofoundation/authentication/repository/UserRepository.java index 13ff8dae..dd64de1a 100644 --- a/src/main/java/org/cardanofoundation/authentication/repository/UserRepository.java +++ b/src/main/java/org/cardanofoundation/authentication/repository/UserRepository.java @@ -14,18 +14,10 @@ public interface UserRepository extends JpaRepository { /* * @author: phuc.nguyen5 * @since: 26/10/2022 - * description: find user by username - * @update: 05/12/2022 - */ - Optional findByUsername(String username); - - /* - * @author: phuc.nguyen5 - * @since: 26/10/2022 - * description: check exist user by username + * description: find user by email * @update: 05/12/2022 */ - Boolean existsByUsername(String username); + Optional findByEmail(String email); /* * @author: phuc.nguyen5 @@ -36,7 +28,7 @@ public interface UserRepository extends JpaRepository { @Query("SELECT ue FROM UserEntity ue " + "JOIN WalletEntity we ON ue.id = we.user.id " + "WHERE we.address = :address") - Optional findUserByWalletAddress(@Param("address") String address); + Optional findUserByAddress(@Param("address") String address); /* * @author: phuc.nguyen5 @@ -53,13 +45,4 @@ public interface UserRepository extends JpaRepository { * @update: */ Optional findByEmailAndStatus(String email, EStatus status); - - - /* - * @author: phuc.nguyen5 - * @since: 11/01/2023 - * description: find user by username - * @update: - */ - Optional findByUsernameAndStatus(String username, EStatus status); } diff --git a/src/main/java/org/cardanofoundation/authentication/repository/WalletRepository.java b/src/main/java/org/cardanofoundation/authentication/repository/WalletRepository.java index 180f7263..894f0ba7 100644 --- a/src/main/java/org/cardanofoundation/authentication/repository/WalletRepository.java +++ b/src/main/java/org/cardanofoundation/authentication/repository/WalletRepository.java @@ -4,6 +4,7 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository @@ -18,5 +19,16 @@ public interface WalletRepository extends JpaRepository { @Query(value = "SELECT we FROM UserEntity ue " + "JOIN WalletEntity we ON ue.id = we.user.id " + "WHERE we.address = :address") - Optional findWalletByAddress(String address); + Optional findWalletByAddress(@Param("address") String address); + + /* + * @author: phuc.nguyen5 + * @since: 19/05/2023 + * description: find address by userId + * @update: + */ + @Query(value = "SELECT we.address FROM UserEntity ue " + + "JOIN WalletEntity we ON ue.id = we.user.id " + + "WHERE ue.id = :userId") + String findAddressByUserId(@Param("userId") Long userId); } diff --git a/src/main/java/org/cardanofoundation/authentication/service/AuthenticationAdminService.java b/src/main/java/org/cardanofoundation/authentication/service/AuthenticationAdminService.java deleted file mode 100644 index 17f17acc..00000000 --- a/src/main/java/org/cardanofoundation/authentication/service/AuthenticationAdminService.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.cardanofoundation.authentication.service; - -import jakarta.servlet.http.HttpServletRequest; -import org.cardanofoundation.authentication.model.request.admin.RemoveUserRequest; -import org.cardanofoundation.authentication.model.request.admin.SignInAdminRequest; -import org.cardanofoundation.authentication.model.request.admin.SignUpAdminRequest; -import org.cardanofoundation.authentication.model.request.auth.SignOutRequest; -import org.cardanofoundation.authentication.model.response.MessageResponse; -import org.cardanofoundation.authentication.model.response.auth.RefreshTokenResponse; -import org.cardanofoundation.authentication.model.response.auth.SignInResponse; - -public interface AuthenticationAdminService { - - /* - * @author: phuc.nguyen5 - * @since: 09/01/2023 - * description: process sign up admin account - * @update: - */ - MessageResponse signUp(SignUpAdminRequest signUpAdmin); - - /* - * @author: phuc.nguyen5 - * @since: 10/01/2023 - * description: process sign in admin account - * @update: - */ - SignInResponse signIn(SignInAdminRequest signInAdmin); - - /* - * @author: phuc.nguyen5 - * @since: 11/01/2023 - * description: process gen new access token by refresh token - * @update: - */ - RefreshTokenResponse refreshToken(String refreshJwt, - HttpServletRequest httpServletRequest); - - /* - * @author: phuc.nguyen5 - * @since: 12/1/2023 - * description: process logout account - * @update: - */ - MessageResponse signOut(SignOutRequest signOutRequest, HttpServletRequest httpServletRequest); - - /* - * @author: phuc.nguyen5 - * @since: 12/1/2023 - * description: process remove admin account - * @update: - */ - MessageResponse remove(RemoveUserRequest removeUserRequest, - HttpServletRequest httpServletRequest); -} diff --git a/src/main/java/org/cardanofoundation/authentication/service/AuthenticationService.java b/src/main/java/org/cardanofoundation/authentication/service/AuthenticationService.java index 59a83d3a..6bb18dbc 100644 --- a/src/main/java/org/cardanofoundation/authentication/service/AuthenticationService.java +++ b/src/main/java/org/cardanofoundation/authentication/service/AuthenticationService.java @@ -15,7 +15,7 @@ public interface AuthenticationService { /* * @author: phuc.nguyen5 * @since: 21/10/2022 - * description: process login with wallet or username + * description: process login with wallet or email * @update: */ SignInResponse signIn(SignInRequest signInRequest); diff --git a/src/main/java/org/cardanofoundation/authentication/service/RefreshTokenService.java b/src/main/java/org/cardanofoundation/authentication/service/RefreshTokenService.java index 328cbe9f..101e9faa 100644 --- a/src/main/java/org/cardanofoundation/authentication/service/RefreshTokenService.java +++ b/src/main/java/org/cardanofoundation/authentication/service/RefreshTokenService.java @@ -37,12 +37,4 @@ public interface RefreshTokenService { * @update: */ RefreshTokenEntity addRefreshToken(UserEntity user); - - /* - * @author: phuc.nguyen5 - * @since: 24/10/2022 - * description: delete refresh token record by username - * @update: - */ - void revokeRefreshTokenByUsername(String username); } diff --git a/src/main/java/org/cardanofoundation/authentication/service/UserService.java b/src/main/java/org/cardanofoundation/authentication/service/UserService.java index 73bde863..21874e34 100644 --- a/src/main/java/org/cardanofoundation/authentication/service/UserService.java +++ b/src/main/java/org/cardanofoundation/authentication/service/UserService.java @@ -5,7 +5,6 @@ import org.cardanofoundation.authentication.model.enums.ENetworkType; import org.cardanofoundation.authentication.model.enums.EStatus; import org.cardanofoundation.authentication.model.request.EditUserRequest; -import org.cardanofoundation.authentication.model.request.admin.SignUpAdminRequest; import org.cardanofoundation.authentication.model.request.auth.SignUpRequest; import org.cardanofoundation.authentication.model.response.UserInfoResponse; import org.cardanofoundation.authentication.model.response.UserResponse; @@ -14,14 +13,6 @@ public interface UserService extends UserDetailsService { - /* - * @author: phuc.nguyen5 - * @since: 9/11/2022 - * description: check exist username - * @update: - */ - Boolean checkExistUsername(String username); - /* * @author: phuc.nguyen5 * @since: 9/11/2022 @@ -49,10 +40,10 @@ public interface UserService extends UserDetailsService { /* * @author: phuc.nguyen5 * @since: 22/12/2022 - * description: find user by username + * description: find user by accountId * @update: */ - UserEntity findByUsername(String username); + UserEntity findByAccountId(String accountId); /* * @author: phuc.nguyen5 @@ -62,21 +53,13 @@ public interface UserService extends UserDetailsService { */ Boolean checkExistEmail(String email); - /* - * @author: phuc.nguyen5 - * @since: 7/1/2023 - * description: save user admin - * @update: - */ - UserEntity saveUserAdmin(SignUpAdminRequest signUpAdmin); - /* * @author: phuc.nguyen5 * @since: 9/1/2023 - * description: active user admin + * description: active user * @update: */ - void activeUser(String username); + void activeUser(String accountId); /* * @author: phuc.nguyen5 @@ -86,14 +69,6 @@ public interface UserService extends UserDetailsService { */ UserEntity findByEmailAndStatus(String email, EStatus status); - /* - * @author: phuc.nguyen5 - * @since: 22/12/2022 - * description: find user by username - * @update: - */ - UserEntity findByUsernameAndStatus(String username, EStatus status); - /* * @author: phuc.nguyen5 * @since: 16/1/2023 diff --git a/src/main/java/org/cardanofoundation/authentication/service/VerifyService.java b/src/main/java/org/cardanofoundation/authentication/service/VerifyService.java index f8ea3ecc..6df5bb37 100644 --- a/src/main/java/org/cardanofoundation/authentication/service/VerifyService.java +++ b/src/main/java/org/cardanofoundation/authentication/service/VerifyService.java @@ -1,6 +1,6 @@ package org.cardanofoundation.authentication.service; -import org.cardanofoundation.authentication.model.request.admin.ResetPasswordRequest; +import org.cardanofoundation.authentication.model.request.auth.ResetPasswordRequest; import org.cardanofoundation.authentication.model.response.MessageResponse; public interface VerifyService { diff --git a/src/main/java/org/cardanofoundation/authentication/service/impl/AuthenticationAdminServiceImpl.java b/src/main/java/org/cardanofoundation/authentication/service/impl/AuthenticationAdminServiceImpl.java deleted file mode 100644 index 2183b487..00000000 --- a/src/main/java/org/cardanofoundation/authentication/service/impl/AuthenticationAdminServiceImpl.java +++ /dev/null @@ -1,148 +0,0 @@ -package org.cardanofoundation.authentication.service.impl; - -import org.cardanofoundation.explorer.common.exceptions.BusinessException; -import org.cardanofoundation.explorer.common.exceptions.InvalidAccessTokenException; -import org.cardanofoundation.explorer.common.exceptions.enums.CommonErrorCode; -import jakarta.servlet.http.HttpServletRequest; -import java.util.Objects; -import java.util.concurrent.ThreadPoolExecutor; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -import org.cardanofoundation.authentication.constant.CommonConstant; -import org.cardanofoundation.authentication.model.entity.RefreshTokenEntity; -import org.cardanofoundation.authentication.model.entity.UserEntity; -import org.cardanofoundation.authentication.model.entity.security.UserDetailsImpl; -import org.cardanofoundation.authentication.model.enums.EStatus; -import org.cardanofoundation.authentication.model.enums.EUserAction; -import org.cardanofoundation.authentication.model.request.admin.RemoveUserRequest; -import org.cardanofoundation.authentication.model.request.admin.SignInAdminRequest; -import org.cardanofoundation.authentication.model.request.admin.SignUpAdminRequest; -import org.cardanofoundation.authentication.model.request.auth.SignOutRequest; -import org.cardanofoundation.authentication.model.response.MessageResponse; -import org.cardanofoundation.authentication.model.response.auth.RefreshTokenResponse; -import org.cardanofoundation.authentication.model.response.auth.SignInResponse; -import org.cardanofoundation.authentication.provider.JwtProvider; -import org.cardanofoundation.authentication.provider.MailProvider; -import org.cardanofoundation.authentication.provider.RedisProvider; -import org.cardanofoundation.authentication.repository.UserRepository; -import org.cardanofoundation.authentication.service.AuthenticationAdminService; -import org.cardanofoundation.authentication.service.RefreshTokenService; -import org.cardanofoundation.authentication.service.UserService; -import org.cardanofoundation.authentication.thread.MailHandler; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -@Log4j2 -public class AuthenticationAdminServiceImpl implements AuthenticationAdminService { - - private final UserRepository userRepository; - - private final UserService userService; - - private final MailProvider mailProvider; - - private final PasswordEncoder encoder; - - private final JwtProvider jwtProvider; - - private final ThreadPoolExecutor sendMailExecutor; - - private final AuthenticationManager authenticationManager; - - private final RefreshTokenService refreshTokenService; - - private final RedisProvider redisProvider; - - @Override - public MessageResponse signUp(SignUpAdminRequest signUpAdmin) { - String username = signUpAdmin.getUsername(); - if (Boolean.TRUE.equals(userService.checkExistUsername(username))) { - throw new BusinessException(CommonErrorCode.USERNAME_IS_ALREADY_EXIST); - } - String email = signUpAdmin.getEmail(); - if (Boolean.TRUE.equals(userService.checkExistEmail(email))) { - throw new BusinessException(CommonErrorCode.EMAIL_IS_ALREADY_EXIST); - } - signUpAdmin.setPassword(encoder.encode(signUpAdmin.getPassword())); - UserEntity user = userService.saveUserAdmin(signUpAdmin); - String verifyCode = jwtProvider.generateCodeForVerify(user.getUsername()); - sendMailExecutor.execute(new MailHandler(mailProvider, user, EUserAction.CREATED, verifyCode)); - return new MessageResponse(CommonConstant.CODE_SUCCESS, CommonConstant.RESPONSE_SUCCESS); - } - - @Override - public SignInResponse signIn(SignInAdminRequest signInAdmin) { - log.info("login with admin account is running..."); - String email = signInAdmin.getEmail(); - String password = signInAdmin.getPassword(); - Authentication authentication; - try { - authentication = authenticationManager.authenticate( - new UsernamePasswordAuthenticationToken(email, password)); - SecurityContextHolder.getContext().setAuthentication(authentication); - } catch (AuthenticationException e) { - log.error("Exception authentication: " + e.getMessage()); - throw new BusinessException(CommonErrorCode.USERNAME_OR_PASSWORD_INVALID); - } - SecurityContextHolder.getContext().setAuthentication(authentication); - UserEntity user = userService.findByEmailAndStatus(email, EStatus.ACTIVE); - String accessToken = jwtProvider.generateJwtToken(authentication, user.getUsername()); - UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal(); - RefreshTokenEntity refreshToken = refreshTokenService.addRefreshToken(user); - return SignInResponse.builder().token(accessToken).username(user.getUsername()) - .email(userDetails.getEmail()).tokenType(CommonConstant.TOKEN_TYPE) - .refreshToken(refreshToken.getToken()).build(); - } - - @Override - public RefreshTokenResponse refreshToken(String refreshJwt, - HttpServletRequest httpServletRequest) { - final String accessToken = jwtProvider.parseJwt(httpServletRequest); - return refreshTokenService.findByRefToken(refreshJwt).map(refreshTokenService::verifyExpiration) - .map(refToken -> { - UserEntity user = refToken.getUser(); - redisProvider.blacklistJwt(accessToken, user.getUsername()); - return jwtProvider.generateJwtTokenFromUser(user); - }).map(newAccessToken -> RefreshTokenResponse.builder().accessToken(newAccessToken) - .refreshToken(refreshJwt).tokenType(CommonConstant.TOKEN_TYPE).build()) - .orElseThrow(() -> new BusinessException(CommonErrorCode.UNKNOWN_ERROR)); - } - - @Override - public MessageResponse signOut(SignOutRequest signOutRequest, - HttpServletRequest httpServletRequest) { - String username = signOutRequest.getUsername(); - String refreshJwt = signOutRequest.getRefreshJwt(); - String accessToken = jwtProvider.parseJwt(httpServletRequest); - refreshTokenService.revokeRefreshToken(refreshJwt); - redisProvider.blacklistJwt(accessToken, username); - return new MessageResponse(CommonConstant.CODE_SUCCESS, CommonConstant.RESPONSE_SUCCESS); - } - - @Override - public MessageResponse remove(RemoveUserRequest removeUserRequest, - HttpServletRequest httpServletRequest) { - final String accessToken = jwtProvider.parseJwt(httpServletRequest); - if (redisProvider.isTokenBlacklisted(accessToken)) { - throw new InvalidAccessTokenException(); - } - String username = jwtProvider.getUserNameFromJwtToken(accessToken); - UserEntity user = userService.findByUsernameAndStatus(username, EStatus.ACTIVE); - if (Objects.isNull(user) || !encoder.matches(removeUserRequest.getPassword(), - user.getPassword())) { - return new MessageResponse(CommonConstant.CODE_FAILURE, CommonConstant.RESPONSE_FAILURE); - } - refreshTokenService.revokeRefreshTokenByUsername(username); - redisProvider.blacklistJwt(accessToken, username); - user.setDeleted(Boolean.TRUE); - userRepository.save(user); - return new MessageResponse(CommonConstant.CODE_SUCCESS, CommonConstant.RESPONSE_SUCCESS); - } -} diff --git a/src/main/java/org/cardanofoundation/authentication/service/impl/AuthenticationServiceImpl.java b/src/main/java/org/cardanofoundation/authentication/service/impl/AuthenticationServiceImpl.java index 4d171b8c..15b9c1bd 100644 --- a/src/main/java/org/cardanofoundation/authentication/service/impl/AuthenticationServiceImpl.java +++ b/src/main/java/org/cardanofoundation/authentication/service/impl/AuthenticationServiceImpl.java @@ -1,8 +1,5 @@ package org.cardanofoundation.authentication.service.impl; -import org.cardanofoundation.explorer.common.exceptions.BusinessException; -import org.cardanofoundation.explorer.common.exceptions.IgnoreRollbackException; -import org.cardanofoundation.explorer.common.exceptions.enums.CommonErrorCode; import jakarta.servlet.http.HttpServletRequest; import java.time.Instant; import java.util.Objects; @@ -34,6 +31,9 @@ import org.cardanofoundation.authentication.service.WalletService; import org.cardanofoundation.authentication.thread.MailHandler; import org.cardanofoundation.authentication.util.NonceUtils; +import org.cardanofoundation.explorer.common.exceptions.BusinessException; +import org.cardanofoundation.explorer.common.exceptions.IgnoreRollbackException; +import org.cardanofoundation.explorer.common.exceptions.enums.CommonErrorCode; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; @@ -73,17 +73,17 @@ public class AuthenticationServiceImpl implements AuthenticationService { @Override public SignInResponse signIn(SignInRequest signInRequest) { log.info("login is running..."); - String username = ""; + String accountId = ""; String password = ""; WalletEntity wallet = null; Integer type = signInRequest.getType(); if (type == 0) { - log.info("login with username and password..."); - username = signInRequest.getUsername(); + log.info("login with email and password..."); + accountId = signInRequest.getEmail(); password = signInRequest.getPassword(); } else { log.info("login with cardano wallet..."); - username = signInRequest.getAddress(); + accountId = signInRequest.getAddress(); password = NonceUtils.getNonceFromSignature(signInRequest.getSignature()); wallet = walletRepository.findWalletByAddress(signInRequest.getAddress()) .orElseThrow(() -> new BusinessException(CommonErrorCode.WALLET_IS_NOT_EXIST)); @@ -96,7 +96,7 @@ public SignInResponse signIn(SignInRequest signInRequest) { Authentication authentication; try { authentication = authenticationManager.authenticate( - new UsernamePasswordAuthenticationToken(username, password)); + new UsernamePasswordAuthenticationToken(accountId, password)); } catch (AuthenticationException e) { log.error("Exception authentication: " + e.getMessage()); if (type == 0) { @@ -105,15 +105,15 @@ public SignInResponse signIn(SignInRequest signInRequest) { throw new BusinessException(CommonErrorCode.SIGNATURE_INVALID); } } - UserEntity user = userService.findByUsername(username); + UserEntity user = userService.findByAccountId(accountId); SecurityContextHolder.getContext().setAuthentication(authentication); - String accessToken = jwtProvider.generateJwtToken(authentication, username); + String accessToken = jwtProvider.generateJwtToken(authentication, accountId); UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal(); RefreshTokenEntity refreshToken = refreshTokenService.addRefreshToken(user); if (Objects.nonNull(wallet)) { walletService.updateNonce(wallet); } - return SignInResponse.builder().token(accessToken).username(username) + return SignInResponse.builder().token(accessToken).address(signInRequest.getAddress()) .email(userDetails.getEmail()).tokenType(CommonConstant.TOKEN_TYPE) .refreshToken(refreshToken.getToken()).build(); } @@ -127,7 +127,7 @@ public MessageResponse signUp(SignUpRequest signUpRequest) { } signUpRequest.setPassword(encoder.encode(signUpRequest.getPassword())); UserEntity user = userService.saveUser(signUpRequest); - String verifyCode = jwtProvider.generateCodeForVerify(user.getUsername()); + String verifyCode = jwtProvider.generateCodeForVerify(email); sendMailExecutor.execute(new MailHandler(mailProvider, user, EUserAction.CREATED, verifyCode)); return MessageResponse.builder().code(CommonConstant.CODE_SUCCESS) .message(CommonConstant.RESPONSE_SUCCESS).build(); @@ -140,8 +140,10 @@ public RefreshTokenResponse refreshToken(String refreshJwt, return refreshTokenService.findByRefToken(refreshJwt).map(refreshTokenService::verifyExpiration) .map(refToken -> { UserEntity user = refToken.getUser(); - redisProvider.blacklistJwt(accessToken, user.getUsername()); - return jwtProvider.generateJwtTokenFromUser(user); + String address = walletRepository.findAddressByUserId(user.getId()); + String accountId = Objects.isNull(address) ? user.getEmail() : address; + redisProvider.blacklistJwt(accessToken, accountId); + return jwtProvider.generateJwtToken(user, accountId); }).map(newAccessToken -> RefreshTokenResponse.builder().accessToken(newAccessToken) .refreshToken(refreshJwt).tokenType(CommonConstant.TOKEN_TYPE).build()) .orElseThrow(() -> new BusinessException(CommonErrorCode.UNKNOWN_ERROR)); @@ -150,11 +152,10 @@ public RefreshTokenResponse refreshToken(String refreshJwt, @Override public MessageResponse signOut(SignOutRequest signOutRequest, HttpServletRequest httpServletRequest) { - String username = signOutRequest.getUsername(); String refreshJwt = signOutRequest.getRefreshJwt(); String accessToken = jwtProvider.parseJwt(httpServletRequest); refreshTokenService.revokeRefreshToken(refreshJwt); - redisProvider.blacklistJwt(accessToken, username); + redisProvider.blacklistJwt(accessToken, signOutRequest.getAccountId()); return new MessageResponse(CommonConstant.CODE_SUCCESS, CommonConstant.RESPONSE_SUCCESS); } diff --git a/src/main/java/org/cardanofoundation/authentication/service/impl/BookMarkServiceImpl.java b/src/main/java/org/cardanofoundation/authentication/service/impl/BookMarkServiceImpl.java index 3c178736..daf409b0 100644 --- a/src/main/java/org/cardanofoundation/authentication/service/impl/BookMarkServiceImpl.java +++ b/src/main/java/org/cardanofoundation/authentication/service/impl/BookMarkServiceImpl.java @@ -44,8 +44,8 @@ public class BookMarkServiceImpl implements BookMarkService { @Override public BookMarkResponse addBookMark(BookMarkRequest bookMarkRequest, HttpServletRequest httpServletRequest) { - String username = jwtProvider.getUserNameFromJwtToken(httpServletRequest); - UserEntity user = userService.findByUsername(username); + String accountId = jwtProvider.getAccountIdFromJwtToken(httpServletRequest); + UserEntity user = userService.findByAccountId(accountId); if (Objects.nonNull( bookMarkRepository.checkExistBookMark(user.getId(), bookMarkRequest.getKeyword(), bookMarkRequest.getType(), bookMarkRequest.getNetwork()))) { @@ -67,8 +67,10 @@ public BasePageResponse findBookMarkByType( HttpServletRequest httpServletRequest, EBookMarkType bookMarkType, ENetworkType network, Pageable pageable) { BasePageResponse response = new BasePageResponse<>(); - String username = jwtProvider.getUserNameFromJwtToken(httpServletRequest); - Page bookMarkPage = bookMarkRepository.findAllBookMarkByUserAndType(username, + String accountId = jwtProvider.getAccountIdFromJwtToken(httpServletRequest); + UserEntity user = userService.findByAccountId(accountId); + Page bookMarkPage = bookMarkRepository.findAllBookMarkByUserAndType( + user.getId(), bookMarkType, network, pageable); if (!bookMarkPage.isEmpty()) { response.setData(bookMarkMapper.listEntityToResponse(bookMarkPage.getContent())); @@ -88,16 +90,18 @@ public MessageResponse deleteById(Long bookMarkId) { @Override public List findKeyBookMark(HttpServletRequest httpServletRequest, ENetworkType network) { - String username = jwtProvider.getUserNameFromJwtToken(httpServletRequest); - List bookMarks = bookMarkRepository.findAllKeyBookMarkByUser(username, network); + String accountId = jwtProvider.getAccountIdFromJwtToken(httpServletRequest); + UserEntity user = userService.findByAccountId(accountId); + List bookMarks = bookMarkRepository.findAllKeyBookMarkByUser(user.getId(), + network); return bookMarkMapper.listEntityToResponse(bookMarks); } @Override public AddBookMarkResponse addBookMarks(BookMarksRequest bookMarksRequest, HttpServletRequest httpServletRequest) { - String username = jwtProvider.getUserNameFromJwtToken(httpServletRequest); - UserEntity user = userService.findByUsername(username); + String accountId = jwtProvider.getAccountIdFromJwtToken(httpServletRequest); + UserEntity user = userService.findByAccountId(accountId); AtomicReference pass = new AtomicReference<>(0); AtomicReference fail = new AtomicReference<>(0); bookMarksRequest.getBookMarks().forEach(bookMarkRequest -> { diff --git a/src/main/java/org/cardanofoundation/authentication/service/impl/PrivateNoteServiceImpl.java b/src/main/java/org/cardanofoundation/authentication/service/impl/PrivateNoteServiceImpl.java index 8b02306c..3eba8050 100644 --- a/src/main/java/org/cardanofoundation/authentication/service/impl/PrivateNoteServiceImpl.java +++ b/src/main/java/org/cardanofoundation/authentication/service/impl/PrivateNoteServiceImpl.java @@ -39,8 +39,8 @@ public class PrivateNoteServiceImpl implements PrivateNoteService { @Override public MessageResponse addPrivateNote(PrivateNoteRequest privateNoteRequest, HttpServletRequest httpServletRequest) { - String username = jwtProvider.getUserNameFromJwtToken(httpServletRequest); - UserEntity user = userService.findByUsername(username); + String accountId = jwtProvider.getAccountIdFromJwtToken(httpServletRequest); + UserEntity user = userService.findByAccountId(accountId); if (Objects.nonNull( noteRepository.checkExistNote(user.getId(), privateNoteRequest.getTxHash(), privateNoteRequest.getNetwork()))) { @@ -62,8 +62,9 @@ public BasePageResponse findAllNote(HttpServletRequest http ENetworkType network, Pageable pageable) { BasePageResponse response = new BasePageResponse<>(); - String username = jwtProvider.getUserNameFromJwtToken(httpServletRequest); - Page notePage = noteRepository.findAllNote(username, network, pageable); + String accountId = jwtProvider.getAccountIdFromJwtToken(httpServletRequest); + UserEntity user = userService.findByAccountId(accountId); + Page notePage = noteRepository.findAllNote(user.getId(), network, pageable); if (!notePage.isEmpty()) { response.setData(noteMapper.listEntityToResponse(notePage.getContent())); } diff --git a/src/main/java/org/cardanofoundation/authentication/service/impl/RefreshTokenServiceImpl.java b/src/main/java/org/cardanofoundation/authentication/service/impl/RefreshTokenServiceImpl.java index 28d173cc..611354fd 100644 --- a/src/main/java/org/cardanofoundation/authentication/service/impl/RefreshTokenServiceImpl.java +++ b/src/main/java/org/cardanofoundation/authentication/service/impl/RefreshTokenServiceImpl.java @@ -54,12 +54,4 @@ public RefreshTokenEntity addRefreshToken(UserEntity user) { .token(UUID.randomUUID().toString()).build(); return refreshTokenRepository.save(refreshToken); } - - @Override - public void revokeRefreshTokenByUsername(String username) { - List refreshTokenList = refreshTokenRepository.findALlByUsername(username); - if (Objects.nonNull(refreshTokenList) && !refreshTokenList.isEmpty()) { - refreshTokenList.forEach(refreshTokenRepository::delete); - } - } } diff --git a/src/main/java/org/cardanofoundation/authentication/service/impl/UserServiceImpl.java b/src/main/java/org/cardanofoundation/authentication/service/impl/UserServiceImpl.java index a9a4cc77..4a87650c 100644 --- a/src/main/java/org/cardanofoundation/authentication/service/impl/UserServiceImpl.java +++ b/src/main/java/org/cardanofoundation/authentication/service/impl/UserServiceImpl.java @@ -1,7 +1,5 @@ package org.cardanofoundation.authentication.service.impl; -import org.cardanofoundation.explorer.common.exceptions.BusinessException; -import org.cardanofoundation.explorer.common.exceptions.enums.CommonErrorCode; import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Base64; @@ -22,7 +20,6 @@ import org.cardanofoundation.authentication.model.enums.EStatus; import org.cardanofoundation.authentication.model.enums.EUserAction; import org.cardanofoundation.authentication.model.request.EditUserRequest; -import org.cardanofoundation.authentication.model.request.admin.SignUpAdminRequest; import org.cardanofoundation.authentication.model.request.auth.SignUpRequest; import org.cardanofoundation.authentication.model.response.UserInfoResponse; import org.cardanofoundation.authentication.model.response.UserResponse; @@ -34,6 +31,8 @@ import org.cardanofoundation.authentication.repository.UserRepository; import org.cardanofoundation.authentication.repository.WalletRepository; import org.cardanofoundation.authentication.service.UserService; +import org.cardanofoundation.explorer.common.exceptions.BusinessException; +import org.cardanofoundation.explorer.common.exceptions.enums.CommonErrorCode; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; @@ -61,27 +60,25 @@ public class UserServiceImpl implements UserService { private static final UserMapper userMapper = UserMapper.INSTANCE; @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - UserEntity user = userRepository.findByUsernameAndStatus(username, EStatus.ACTIVE) - .orElseThrow(() -> new BusinessException(CommonErrorCode.USER_IS_NOT_EXIST)); - String password = user.getPassword(); - WalletEntity wallet = walletRepository.findWalletByAddress(username).orElse(null); - if (Objects.nonNull(wallet)) { + public UserDetails loadUserByUsername(String accountId) throws UsernameNotFoundException { + UserEntity user = userRepository.findByEmailAndStatus(accountId, EStatus.ACTIVE).orElse(null); + String password = ""; + if (Objects.isNull(user)) { + WalletEntity wallet = walletRepository.findWalletByAddress(accountId) + .orElseThrow(() -> new BusinessException(CommonErrorCode.USER_IS_NOT_EXIST)); password = wallet.getNonceEncode(); + user = wallet.getUser(); + } else { + password = user.getPassword(); } - return UserDetailsImpl.build(user, password); - } - - @Override - public Boolean checkExistUsername(String username) { - return userRepository.existsByUsername(username); + return UserDetailsImpl.build(user, accountId, password); } @Override public UserResponse editAvatar(MultipartFile avatar, HttpServletRequest httpServletRequest) { log.info("edit user image is running..."); - String username = jwtProvider.getUserNameFromJwtToken(httpServletRequest); - UserEntity user = findByUsername(username); + String accountId = jwtProvider.getAccountIdFromJwtToken(httpServletRequest); + UserEntity user = findByAccountId(accountId); if (Objects.nonNull(avatar)) { StringBuilder base64Image = new StringBuilder(CommonConstant.BASE64_PREFIX); try { @@ -97,17 +94,19 @@ public UserResponse editAvatar(MultipartFile avatar, HttpServletRequest httpServ @Override public UserInfoResponse infoUser(HttpServletRequest httpServletRequest, ENetworkType network) { - String username = jwtProvider.getUserNameFromJwtToken(httpServletRequest); - UserEntity user = findByUsername(username); - Integer sizeBookMark = bookMarkRepository.getCountBookMarkByUser(user.getId(), network); - Integer sizeNote = noteRepository.getCountNoteByUser(user.getId(), network); + String accountId = jwtProvider.getAccountIdFromJwtToken(httpServletRequest); + UserEntity user = findByAccountId(accountId); + Long userId = user.getId(); + Integer sizeBookMark = bookMarkRepository.getCountBookMarkByUser(userId, network); + Integer sizeNote = noteRepository.getCountNoteByUser(userId, network); UserHistoryEntity userHistory = userHistoryRepository.findFirstByUserAndUserActionOrderByActionTimeDesc( user, EUserAction.LOGIN); if (Objects.isNull(userHistory)) { userHistory = userHistoryRepository.findFirstByUserAndUserActionOrderByActionTimeDesc(user, EUserAction.CREATED); } - return UserInfoResponse.builder().username(username).email(user.getEmail()) + String address = walletRepository.findAddressByUserId(userId); + return UserInfoResponse.builder().address(address).email(user.getEmail()) .avatar(user.getAvatar()).sizeBookmark(sizeBookMark).sizeNote(sizeNote) .lastLogin(userHistory.getActionTime()).build(); } @@ -115,16 +114,18 @@ public UserInfoResponse infoUser(HttpServletRequest httpServletRequest, ENetwork @Override public UserEntity saveUser(SignUpRequest signUpRequest) { UserEntity user = userMapper.requestToEntity(signUpRequest); - user.setUsername(signUpRequest.getEmail()); user.setStatus(EStatus.PENDING); user.setRoles(addRoleForUser(ERole.ROLE_USER)); return userRepository.save(user); } @Override - public UserEntity findByUsername(String username) { - return userRepository.findByUsername(username) - .orElseThrow(() -> new BusinessException(CommonErrorCode.USER_IS_NOT_EXIST)); + public UserEntity findByAccountId(String accountId) { + UserEntity user = userRepository.findUserByAddress(accountId).orElse(null); + if (Objects.isNull(user)) { + return userRepository.findByEmail(accountId).orElse(null); + } + return user; } @Override @@ -133,16 +134,8 @@ public Boolean checkExistEmail(String email) { } @Override - public UserEntity saveUserAdmin(SignUpAdminRequest signUpAdmin) { - UserEntity user = userMapper.requestAdminToEntity(signUpAdmin); - user.setRoles(addRoleForUser(signUpAdmin.getRole())); - user.setStatus(EStatus.PENDING); - return userRepository.save(user); - } - - @Override - public void activeUser(String username) { - UserEntity user = userRepository.findByUsername(username) + public void activeUser(String email) { + UserEntity user = userRepository.findByEmail(email) .orElseThrow(() -> new BusinessException(CommonErrorCode.USER_IS_NOT_EXIST)); user.setStatus(EStatus.ACTIVE); userRepository.save(user); @@ -154,25 +147,20 @@ public UserEntity findByEmailAndStatus(String email, EStatus status) { .orElseThrow(() -> new BusinessException(CommonErrorCode.USER_IS_NOT_EXIST)); } - @Override - public UserEntity findByUsernameAndStatus(String username, EStatus status) { - return userRepository.findByUsernameAndStatus(username, status).orElse(null); - } - @Override public UserResponse editUser(EditUserRequest editUserRequest, HttpServletRequest httpServletRequest) { log.info("edit user is running..."); String emailReq = editUserRequest.getEmail(); - String token = jwtProvider.parseJwt(httpServletRequest); - String username = jwtProvider.getUserNameFromJwtToken(token); - UserEntity user = findByUsername(username); - if (Objects.nonNull(emailReq)) { - if (Boolean.TRUE.equals(checkExistEmail(emailReq))) { - throw new BusinessException(CommonErrorCode.EMAIL_IS_ALREADY_EXIST); - } - user.setEmail(emailReq); + String accountId = jwtProvider.getAccountIdFromJwtToken(httpServletRequest); + UserEntity user = findByAccountId(accountId); + if (Objects.nonNull(user.getEmail())) { + throw new BusinessException(CommonErrorCode.UNKNOWN_ERROR); + } + if (Boolean.TRUE.equals(checkExistEmail(emailReq))) { + throw new BusinessException(CommonErrorCode.EMAIL_IS_ALREADY_EXIST); } + user.setEmail(emailReq); UserEntity userEdit = userRepository.save(user); return userMapper.entityToResponse(userEdit); } @@ -180,7 +168,6 @@ public UserResponse editUser(EditUserRequest editUserRequest, @Override public UserEntity saveUser(String address) { UserEntity user = UserEntity.builder() - .username(address) .status(EStatus.ACTIVE) .roles(addRoleForUser(ERole.ROLE_USER)) .build(); diff --git a/src/main/java/org/cardanofoundation/authentication/service/impl/VerifyServiceImpl.java b/src/main/java/org/cardanofoundation/authentication/service/impl/VerifyServiceImpl.java index fa1ffcf0..c1249cc5 100644 --- a/src/main/java/org/cardanofoundation/authentication/service/impl/VerifyServiceImpl.java +++ b/src/main/java/org/cardanofoundation/authentication/service/impl/VerifyServiceImpl.java @@ -1,6 +1,5 @@ package org.cardanofoundation.authentication.service.impl; -import org.cardanofoundation.explorer.common.exceptions.enums.CommonErrorCode; import java.util.Objects; import java.util.concurrent.ThreadPoolExecutor; import lombok.RequiredArgsConstructor; @@ -9,7 +8,7 @@ import org.cardanofoundation.authentication.model.entity.UserEntity; import org.cardanofoundation.authentication.model.enums.EStatus; import org.cardanofoundation.authentication.model.enums.EUserAction; -import org.cardanofoundation.authentication.model.request.admin.ResetPasswordRequest; +import org.cardanofoundation.authentication.model.request.auth.ResetPasswordRequest; import org.cardanofoundation.authentication.model.response.MessageResponse; import org.cardanofoundation.authentication.provider.JwtProvider; import org.cardanofoundation.authentication.provider.MailProvider; @@ -18,6 +17,7 @@ import org.cardanofoundation.authentication.service.UserService; import org.cardanofoundation.authentication.service.VerifyService; import org.cardanofoundation.authentication.thread.MailHandler; +import org.cardanofoundation.explorer.common.exceptions.enums.CommonErrorCode; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -49,11 +49,11 @@ public MessageResponse checkVerifySignUpByEmail(String code) { if (validateCode.equals(Boolean.FALSE)) { return new MessageResponse(CommonErrorCode.INVALID_VERIFY_CODE); } - String username = jwtProvider.getUserNameFromVerifyCode(code); - redisProvider.blacklistJwt(code, username); - UserEntity user = userService.findByUsernameAndStatus(username, EStatus.PENDING); + String accountId = jwtProvider.getAccountIdFromVerifyCode(code); + redisProvider.blacklistJwt(code, accountId); + UserEntity user = userService.findByEmailAndStatus(accountId, EStatus.PENDING); if (Objects.nonNull(user)) { - userService.activeUser(username); + userService.activeUser(accountId); } else { return new MessageResponse(CommonErrorCode.VERIFY_CODE_NOT_PENDING); } @@ -70,9 +70,9 @@ public MessageResponse resetPassword(ResetPasswordRequest resetPasswordRequest) if (validateCode.equals(Boolean.FALSE)) { return new MessageResponse(CommonErrorCode.INVALID_VERIFY_CODE); } - String username = jwtProvider.getUserNameFromVerifyCode(code); - redisProvider.blacklistJwt(code, username); - UserEntity user = userService.findByUsernameAndStatus(username, EStatus.ACTIVE); + String accountId = jwtProvider.getAccountIdFromVerifyCode(code); + redisProvider.blacklistJwt(code, accountId); + UserEntity user = userService.findByEmailAndStatus(accountId, EStatus.ACTIVE); if (Objects.isNull(user)) { return new MessageResponse(CommonConstant.CODE_FAILURE, CommonConstant.RESPONSE_FAILURE); } @@ -87,7 +87,7 @@ public MessageResponse forgotPassword(String email) { if (Objects.isNull(user)) { return new MessageResponse(CommonConstant.CODE_FAILURE, CommonConstant.RESPONSE_FAILURE); } - String code = jwtProvider.generateCodeForVerify(user.getUsername()); + String code = jwtProvider.generateCodeForVerify(email); sendMailExecutor.execute(new MailHandler(mailProvider, user, EUserAction.RESET_PASSWORD, code)); return new MessageResponse(CommonConstant.CODE_SUCCESS, CommonConstant.RESPONSE_SUCCESS); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ddc569c0..c24be1a7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: ${SPRING_PROFILES_ACTIVE} + active: ${SPRING_PROFILES_ACTIVE:local} mvc: pathmatch: matching-strategy: ANT_PATH_MATCHER diff --git a/src/test/java/org/cardanofoundation/authentication/authentication/AuthenticationServiceTest.java b/src/test/java/org/cardanofoundation/authentication/authentication/AuthenticationServiceTest.java index 7d0c91cd..a2f84e8e 100644 --- a/src/test/java/org/cardanofoundation/authentication/authentication/AuthenticationServiceTest.java +++ b/src/test/java/org/cardanofoundation/authentication/authentication/AuthenticationServiceTest.java @@ -2,6 +2,9 @@ import static org.mockito.ArgumentMatchers.any; +import java.time.Instant; +import java.util.Optional; +import java.util.Set; import org.cardanofoundation.authentication.model.entity.RefreshTokenEntity; import org.cardanofoundation.authentication.model.entity.RoleEntity; import org.cardanofoundation.authentication.model.entity.UserEntity; @@ -23,9 +26,6 @@ import org.cardanofoundation.explorer.common.exceptions.BusinessException; import org.cardanofoundation.explorer.common.exceptions.IgnoreRollbackException; import org.cardanofoundation.explorer.common.exceptions.enums.CommonErrorCode; -import java.time.Instant; -import java.util.Optional; -import java.util.Set; import org.junit.Before; import org.junit.Test; import org.junit.jupiter.api.Assertions; @@ -84,7 +84,7 @@ public void setup() { private final String REFRESH_TOKEN = "b2d4e520-4e07-43aa-9a09-f9667f52ce0e"; - private final String USER_NAME = "Test"; + private final String EMAIL = "test.30.04@gmail.com"; private final String PASSWORD = "password"; @@ -169,15 +169,15 @@ public void whenLoginUsingWallet_AuthenticateSuccess_returnResponse() { Authentication authentication = Mockito.mock(Authentication.class); RoleEntity role = new RoleEntity(); role.setName(ERole.ROLE_USER); - UserEntity user = UserEntity.builder().username(ADDRESS_WALLET) - .email("test5.6@gmail.com").roles(Set.of(role)).isDeleted(false).build(); - UserDetailsImpl userDetails = UserDetailsImpl.build(user, NONCE); + UserEntity user = UserEntity.builder() + .email(EMAIL).roles(Set.of(role)).isDeleted(false).build(); + UserDetailsImpl userDetails = UserDetailsImpl.build(user, ADDRESS_WALLET, NONCE); Mockito.when(authentication.getPrincipal()).thenReturn(userDetails); Mockito.when(walletRepository.findWalletByAddress(ADDRESS_WALLET)) .thenReturn(Optional.of(wallet)); Mockito.when(authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(ADDRESS_WALLET, NONCE))).thenReturn(authentication); - Mockito.when(userService.findByUsername(ADDRESS_WALLET)).thenReturn(user); + Mockito.when(userService.findByAccountId(ADDRESS_WALLET)).thenReturn(user); Mockito.when(jwtProvider.generateJwtToken(authentication, ADDRESS_WALLET)).thenReturn(JWT); Mockito.when(refreshTokenService.addRefreshToken(user)) .thenReturn(RefreshTokenEntity.builder().token(REFRESH_TOKEN).build()); @@ -187,13 +187,13 @@ public void whenLoginUsingWallet_AuthenticateSuccess_returnResponse() { } @Test - public void whenLoginUsingUsername_UserIsNotExist_ThrowException() { + public void whenLoginUsingEmal_UserIsNotExist_ThrowException() { SignInRequest signInRequest = new SignInRequest(); - signInRequest.setUsername(USER_NAME); + signInRequest.setEmail(EMAIL); signInRequest.setPassword(PASSWORD); signInRequest.setType(0); Mockito.when(authenticationManager.authenticate( - new UsernamePasswordAuthenticationToken(USER_NAME, PASSWORD))) + new UsernamePasswordAuthenticationToken(EMAIL, PASSWORD))) .thenThrow(new BusinessException(CommonErrorCode.USER_IS_NOT_EXIST)); BusinessException exception = Assertions.assertThrows(BusinessException.class, () -> { authenticationService.signIn(signInRequest); @@ -204,13 +204,13 @@ public void whenLoginUsingUsername_UserIsNotExist_ThrowException() { } @Test - public void whenLoginUsingUsername_UsernameOrPasswordInValid_ThrowException() { + public void whenLoginUsingEmal_EmalOrPasswordInValid_ThrowException() { SignInRequest signInRequest = new SignInRequest(); - signInRequest.setUsername(USER_NAME); + signInRequest.setEmail(EMAIL); signInRequest.setPassword(PASSWORD); signInRequest.setType(0); Mockito.when(authenticationManager.authenticate( - new UsernamePasswordAuthenticationToken(USER_NAME, PASSWORD))) + new UsernamePasswordAuthenticationToken(EMAIL, PASSWORD))) .thenThrow(new BusinessException(CommonErrorCode.USERNAME_OR_PASSWORD_INVALID)); BusinessException exception = Assertions.assertThrows(BusinessException.class, () -> { authenticationService.signIn(signInRequest); @@ -221,22 +221,22 @@ public void whenLoginUsingUsername_UsernameOrPasswordInValid_ThrowException() { } @Test - public void whenLoginUsingUsername_AuthenticateSuccess_ThrowException() { + public void whenLoginUsingEmal_AuthenticateSuccess_ThrowException() { SignInRequest signInRequest = new SignInRequest(); - signInRequest.setUsername(USER_NAME); + signInRequest.setEmail(EMAIL); signInRequest.setPassword(PASSWORD); signInRequest.setType(0); Authentication authentication = Mockito.mock(Authentication.class); RoleEntity role = new RoleEntity(); role.setName(ERole.ROLE_USER); - UserEntity user = UserEntity.builder().username(USER_NAME) + UserEntity user = UserEntity.builder() .email("test5.6@gmail.com").roles(Set.of(role)).isDeleted(false).build(); - UserDetailsImpl userDetails = UserDetailsImpl.build(user, PASSWORD); + UserDetailsImpl userDetails = UserDetailsImpl.build(user, EMAIL, PASSWORD); Mockito.when(authentication.getPrincipal()).thenReturn(userDetails); Mockito.when(authenticationManager.authenticate( - new UsernamePasswordAuthenticationToken(USER_NAME, PASSWORD))).thenReturn(authentication); - Mockito.when(userService.findByUsername(USER_NAME)).thenReturn(user); - Mockito.when(jwtProvider.generateJwtToken(authentication, USER_NAME)).thenReturn(JWT); + new UsernamePasswordAuthenticationToken(EMAIL, PASSWORD))).thenReturn(authentication); + Mockito.when(userService.findByAccountId(EMAIL)).thenReturn(user); + Mockito.when(jwtProvider.generateJwtToken(authentication, EMAIL)).thenReturn(JWT); Mockito.when(refreshTokenService.addRefreshToken(user)) .thenReturn(RefreshTokenEntity.builder().token(REFRESH_TOKEN).build()); Mockito.when(userHistoryRepository.save(any())).thenReturn(UserHistoryEntity.builder().build()); diff --git a/src/test/java/org/cardanofoundation/authentication/crud/JpaTest.java b/src/test/java/org/cardanofoundation/authentication/crud/JpaTest.java index fdfc85c1..3ec966b9 100644 --- a/src/test/java/org/cardanofoundation/authentication/crud/JpaTest.java +++ b/src/test/java/org/cardanofoundation/authentication/crud/JpaTest.java @@ -1,5 +1,8 @@ package org.cardanofoundation.authentication.crud; +import java.time.Instant; +import java.util.List; +import java.util.Optional; import org.cardanofoundation.authentication.model.entity.BookMarkEntity; import org.cardanofoundation.authentication.model.entity.PrivateNoteEntity; import org.cardanofoundation.authentication.model.entity.RefreshTokenEntity; @@ -20,9 +23,6 @@ import org.cardanofoundation.authentication.repository.UserHistoryRepository; import org.cardanofoundation.authentication.repository.UserRepository; import org.cardanofoundation.authentication.repository.WalletRepository; -import java.time.Instant; -import java.util.List; -import java.util.Optional; import org.junit.Test; import org.junit.jupiter.api.Assertions; import org.junit.runner.RunWith; @@ -59,9 +59,13 @@ public class JpaTest { @Autowired private PrivateNoteRepository privateNoteRepository; + private final String EMAIL = "test.30.04@gmail.com"; + + private final String ADDRESS = "123456789QWERTY"; + @Test public void whenInsertUser() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) .isDeleted(false).build(); UserEntity userTest = userRepository.save(user); @@ -69,69 +73,62 @@ public void whenInsertUser() { } @Test - public void whenFindByUsername() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + public void whenFindByEmail() { + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) .isDeleted(false).build(); userRepository.save(user); - Optional userOpt = userRepository.findByUsername("test.30.04"); + Optional userOpt = userRepository.findByEmail(EMAIL); Assertions.assertTrue(userOpt.isPresent()); } - @Test - public void whenExistsByUsername() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") - .avatar(null) - .isDeleted(false).build(); - userRepository.save(user); - Boolean isExist = userRepository.existsByUsername("test.30.04"); - Assertions.assertTrue(isExist); - } - @Test public void whenExistsByEmail() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) .isDeleted(false).build(); userRepository.save(user); - Boolean isExist = userRepository.existsByEmail("test.30.04@gmail.com"); + Boolean isExist = userRepository.existsByEmail(EMAIL); Assertions.assertTrue(isExist); } @Test - public void findByEmailAndStatus() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + public void whenFindByEmailAndStatus() { + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) .status( EStatus.ACTIVE) .isDeleted(false).build(); userRepository.save(user); - Optional userOpt = userRepository.findByEmailAndStatus("test.30.04@gmail.com", + Optional userOpt = userRepository.findByEmailAndStatus(EMAIL, EStatus.ACTIVE); Assertions.assertTrue(userOpt.isPresent()); } @Test - public void findByUsernameAndStatus() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + public void whenFindUserByAddress() { + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) - .status( - EStatus.ACTIVE) .isDeleted(false).build(); - userRepository.save(user); - Optional userOpt = userRepository.findByUsernameAndStatus("test.30.04", - EStatus.ACTIVE); - Assertions.assertTrue(userOpt.isPresent()); + UserEntity user1 = userRepository.save(user); + WalletEntity wallet = WalletEntity.builder().walletName(EWalletName.NAMI) + .address(ADDRESS).nonce("8890825581941064700") + .nonceEncode("$2a$10$lPoc5.JX3s78BbK14Fams.Nqz0hQIDmFDFSsAI4.zR3Nhy0alCPMq") + .expiryDateNonce(Instant.now()).networkId("1").networkType(ENetworkType.MAIN_NET) + .user(user1).build(); + walletRepository.save(wallet); + UserEntity userTest = userRepository.findUserByAddress(ADDRESS).orElse(null); + Assertions.assertNotNull(userTest); } @Test public void whenInsertWallet() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) .isDeleted(false).build(); UserEntity user1 = userRepository.save(user); WalletEntity wallet = WalletEntity.builder().walletName(EWalletName.NAMI) - .address("123456789QWERTY").nonce("8890825581941064700") + .address(ADDRESS).nonce("8890825581941064700") .nonceEncode("$2a$10$lPoc5.JX3s78BbK14Fams.Nqz0hQIDmFDFSsAI4.zR3Nhy0alCPMq") .expiryDateNonce(Instant.now()).networkId("1").networkType(ENetworkType.MAIN_NET) .user(user1).build(); @@ -140,24 +137,40 @@ public void whenInsertWallet() { } @Test - public void whenFindByStakeAddress() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + public void whenFindWalletByAddress() { + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) .isDeleted(false).build(); UserEntity user1 = userRepository.save(user); WalletEntity wallet = WalletEntity.builder().walletName(EWalletName.NAMI) - .address("123456789QWERTY").nonce("8890825581941064700") + .address(ADDRESS).nonce("8890825581941064700") .nonceEncode("$2a$10$lPoc5.JX3s78BbK14Fams.Nqz0hQIDmFDFSsAI4.zR3Nhy0alCPMq") .expiryDateNonce(Instant.now()).networkId("1").networkType(ENetworkType.MAIN_NET) .user(user1).build(); walletRepository.save(wallet); - Optional walletOpt = walletRepository.findWalletByAddress("123456789QWERTY"); + Optional walletOpt = walletRepository.findWalletByAddress(ADDRESS); Assertions.assertTrue(walletOpt.isPresent()); } + @Test + public void whenFindAddressByUserId() { + UserEntity user = UserEntity.builder().email(EMAIL) + .avatar(null) + .isDeleted(false).build(); + UserEntity user1 = userRepository.save(user); + WalletEntity wallet = WalletEntity.builder().walletName(EWalletName.NAMI) + .address(ADDRESS).nonce("8890825581941064700") + .nonceEncode("$2a$10$lPoc5.JX3s78BbK14Fams.Nqz0hQIDmFDFSsAI4.zR3Nhy0alCPMq") + .expiryDateNonce(Instant.now()).networkId("1").networkType(ENetworkType.MAIN_NET) + .user(user1).build(); + walletRepository.save(wallet); + String address = walletRepository.findAddressByUserId(user1.getId()); + Assertions.assertEquals(ADDRESS, address); + } + @Test public void whenInsertUserHistory() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) .isDeleted(false).build(); UserEntity userInsert = userRepository.save(user); @@ -171,7 +184,7 @@ public void whenInsertUserHistory() { @Test public void whenInsertRefreshToken() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) .isDeleted(false).build(); UserEntity userInsert = userRepository.save(user); @@ -183,7 +196,7 @@ public void whenInsertRefreshToken() { @Test public void whenFindRefreshTokenByToken() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) .isDeleted(false).build(); UserEntity userInsert = userRepository.save(user); @@ -196,16 +209,16 @@ public void whenFindRefreshTokenByToken() { } @Test - public void whenFindAllRefreshTokenByUsername() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + public void whenFindAllRefreshTokenByUserId() { + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) .isDeleted(false).build(); UserEntity userInsert = userRepository.save(user); RefreshTokenEntity refreshToken = RefreshTokenEntity.builder().token("123qsf34fwf45fwdeaf5gsfc") .user(userInsert).expiryDate(Instant.now()).build(); refreshTokenRepository.save(refreshToken); - List refreshTokens = refreshTokenRepository.findALlByUsername( - "test.30.04"); + List refreshTokens = refreshTokenRepository.findALlByUserId( + userInsert.getId()); Assertions.assertEquals(1, refreshTokens.size()); } @@ -217,7 +230,7 @@ public void whenFindRoleByName() { @Test public void whenInsertBookmark() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) .isDeleted(false).build(); UserEntity userTest = userRepository.save(user); @@ -229,7 +242,7 @@ public void whenInsertBookmark() { @Test public void whenInsertPrivateNote() { - UserEntity user = UserEntity.builder().username("test.30.04").email("test.30.04@gmail.com") + UserEntity user = UserEntity.builder().email(EMAIL) .avatar(null) .isDeleted(false).build(); UserEntity userTest = userRepository.save(user);