diff --git a/src/main/java/com/project/bumawiki/domain/auth/infra/BsmLoginHandler.java b/src/main/java/com/project/bumawiki/domain/auth/infra/BsmLoginHandler.java index b583da06..22c0fc7d 100644 --- a/src/main/java/com/project/bumawiki/domain/auth/infra/BsmLoginHandler.java +++ b/src/main/java/com/project/bumawiki/domain/auth/infra/BsmLoginHandler.java @@ -20,9 +20,9 @@ public class BsmLoginHandler { private final BsmOauth bsmOauth; - public User getUserByAuthId(String authId) { + public User getUserByAuthCode(String authCode) { try { - String token = bsmOauth.getToken(authId); + String token = bsmOauth.getToken(authCode); BsmResourceResponse response = bsmOauth.getResource(token); return createUnknownUser(response); } catch (BsmAuthCodeNotFoundException | BsmAuthTokenNotFoundException e) { diff --git a/src/main/java/com/project/bumawiki/domain/auth/presentation/AuthController.java b/src/main/java/com/project/bumawiki/domain/auth/presentation/AuthController.java index 77bff943..5dd545b6 100644 --- a/src/main/java/com/project/bumawiki/domain/auth/presentation/AuthController.java +++ b/src/main/java/com/project/bumawiki/domain/auth/presentation/AuthController.java @@ -9,9 +9,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.project.bumawiki.domain.auth.presentation.dto.LoginReqestDto; -import com.project.bumawiki.domain.auth.presentation.dto.RefreshTokenRequestDto; -import com.project.bumawiki.domain.auth.presentation.dto.TokenResponseDto; +import com.project.bumawiki.domain.auth.presentation.dto.request.LoginRequestDto; +import com.project.bumawiki.domain.auth.presentation.dto.request.RefreshTokenRequestDto; +import com.project.bumawiki.domain.auth.presentation.dto.response.TokenResponseDto; import com.project.bumawiki.domain.auth.service.CommandAuthService; import lombok.RequiredArgsConstructor; @@ -24,8 +24,8 @@ public class AuthController { private final CommandAuthService commandAuthService; @PostMapping("/oauth/bsm") - public TokenResponseDto userSignup(@RequestBody LoginReqestDto loginReqestDto) throws IOException { - return TokenResponseDto.from(commandAuthService.login(loginReqestDto.accessToken())); + public TokenResponseDto userSignup(@RequestBody LoginRequestDto loginRequestDto) throws IOException { + return TokenResponseDto.from(commandAuthService.login(loginRequestDto.authCode())); } @PutMapping("/refresh/access") diff --git a/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/LoginReqestDto.java b/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/LoginReqestDto.java deleted file mode 100644 index 6b6079e7..00000000 --- a/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/LoginReqestDto.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.project.bumawiki.domain.auth.presentation.dto; - -public record LoginReqestDto( - String accessToken -) { -} diff --git a/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/RefreshTokenRequestDto.java b/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/RefreshTokenRequestDto.java deleted file mode 100644 index 495e863a..00000000 --- a/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/RefreshTokenRequestDto.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.project.bumawiki.domain.auth.presentation.dto; - -public record RefreshTokenRequestDto( - String refreshToken -) { -} diff --git a/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/request/LoginRequestDto.java b/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/request/LoginRequestDto.java new file mode 100644 index 00000000..369db502 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/request/LoginRequestDto.java @@ -0,0 +1,9 @@ +package com.project.bumawiki.domain.auth.presentation.dto.request; + +import jakarta.validation.constraints.NotNull; + +public record LoginRequestDto( + @NotNull(message = "authCode는 null일 수 없습니다.") + String authCode +) { +} diff --git a/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/request/RefreshTokenRequestDto.java b/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/request/RefreshTokenRequestDto.java new file mode 100644 index 00000000..a6c80307 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/request/RefreshTokenRequestDto.java @@ -0,0 +1,9 @@ +package com.project.bumawiki.domain.auth.presentation.dto.request; + +import jakarta.validation.constraints.NotNull; + +public record RefreshTokenRequestDto( + @NotNull(message = "refreshToken은 null일 수 없습니다.") + String refreshToken +) { +} diff --git a/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/TokenResponseDto.java b/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/response/TokenResponseDto.java similarity index 80% rename from src/main/java/com/project/bumawiki/domain/auth/presentation/dto/TokenResponseDto.java rename to src/main/java/com/project/bumawiki/domain/auth/presentation/dto/response/TokenResponseDto.java index d7113543..3a07b479 100644 --- a/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/TokenResponseDto.java +++ b/src/main/java/com/project/bumawiki/domain/auth/presentation/dto/response/TokenResponseDto.java @@ -1,4 +1,4 @@ -package com.project.bumawiki.domain.auth.presentation.dto; +package com.project.bumawiki.domain.auth.presentation.dto.response; import com.project.bumawiki.domain.auth.domain.Token; diff --git a/src/main/java/com/project/bumawiki/domain/auth/service/CommandAuthService.java b/src/main/java/com/project/bumawiki/domain/auth/service/CommandAuthService.java index 91cc85cc..81e4a40d 100644 --- a/src/main/java/com/project/bumawiki/domain/auth/service/CommandAuthService.java +++ b/src/main/java/com/project/bumawiki/domain/auth/service/CommandAuthService.java @@ -26,8 +26,8 @@ public class CommandAuthService { private final UserCreator userCreator; private final UserUpdater userUpdater; - public Token login(String authId) { - User unknownUser = bsmLoginHandler.getUserByAuthId(authId); + public Token login(String authCode) { + User unknownUser = bsmLoginHandler.getUserByAuthCode(authCode); User user = userReader.getNullableUserByEmail(unknownUser.getEmail()); if (user == null) { diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsResponseDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsResponseDto.java index bd317a8e..aaa530e3 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsResponseDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsResponseDto.java @@ -8,7 +8,7 @@ import com.project.bumawiki.domain.docs.domain.type.DocsType; import com.project.bumawiki.domain.docs.util.DocsUtil; import com.project.bumawiki.domain.user.domain.User; -import com.project.bumawiki.domain.user.presentation.dto.SimpleUserDto; +import com.project.bumawiki.domain.user.presentation.dto.response.SimpleUserResponseDto; public record DocsResponseDto( Long id, @@ -18,7 +18,7 @@ public record DocsResponseDto( LocalDateTime lastModifiedAt, int enroll, boolean isDocsDetail, - List contributors, + List contributors, int version, String thumbnail ) { @@ -33,7 +33,7 @@ public DocsResponseDto(Docs docs, List contributors, VersionDocs versionDo docs.getEnroll(), true, contributors.stream() - .map(SimpleUserDto::new) + .map(SimpleUserResponseDto::new) .toList(), versionDocs.getVersion(), DocsUtil.getThumbnail(versionDocs.getContents()) diff --git a/src/main/java/com/project/bumawiki/domain/user/domain/User.java b/src/main/java/com/project/bumawiki/domain/user/domain/User.java index 7d1e1bfb..ba780566 100644 --- a/src/main/java/com/project/bumawiki/domain/user/domain/User.java +++ b/src/main/java/com/project/bumawiki/domain/user/domain/User.java @@ -1,22 +1,14 @@ package com.project.bumawiki.domain.user.domain; -import java.util.ArrayList; -import java.util.List; - -import com.project.bumawiki.domain.thumbsup.domain.ThumbsUp; -import com.project.bumawiki.domain.thumbsup.presentation.dto.ThumbsUpResponseDto; import com.project.bumawiki.domain.user.domain.authority.Authority; -import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.OneToMany; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; @@ -37,13 +29,6 @@ public class User { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @OneToMany( - mappedBy = "user", - fetch = FetchType.LAZY, - cascade = CascadeType.ALL, - orphanRemoval = true) - @Builder.Default - private final List thumbsUps = new ArrayList<>(); @Email @Size(max = 32) @Column(unique = true, length = 32) @@ -59,18 +44,12 @@ public class User { @Column(length = 16) @Enumerated(EnumType.STRING) private Authority authority; + @NotNull @Size(max = 16) @Column(length = 16) private String name; - public List getList() { - return this.thumbsUps - .stream() - .map(ThumbsUp::getDto) - .toList(); - } - public void update(User user) { this.email = user.getEmail(); this.name = user.getName(); @@ -78,7 +57,8 @@ public void update(User user) { this.nickName = user.getNickName(); } - public void changeUserAuthority(Authority authority) { + public void updateAuthority(Authority authority) { this.authority = authority; } + } diff --git a/src/main/java/com/project/bumawiki/domain/user/domain/repository/UserRepositoryMapper.java b/src/main/java/com/project/bumawiki/domain/user/domain/repository/UserRepositoryMapper.java deleted file mode 100644 index 5d3eff0f..00000000 --- a/src/main/java/com/project/bumawiki/domain/user/domain/repository/UserRepositoryMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.project.bumawiki.domain.user.domain.repository; - -import org.springframework.stereotype.Repository; - -import com.project.bumawiki.domain.user.domain.User; -import com.project.bumawiki.domain.user.exception.UserNotFoundException; - -import lombok.RequiredArgsConstructor; - -@Repository -@RequiredArgsConstructor -public class UserRepositoryMapper { - - private final UserRepository userRepository; - - public User getByEmail(final String email) { - User user = userRepository.findByEmail(email); - if (user == null) { - throw UserNotFoundException.EXCEPTION; - } - return user; - } - - public User getById(final Long userId) { - return userRepository.findById(userId) - .orElseThrow(() -> UserNotFoundException.EXCEPTION); - } - -} diff --git a/src/main/java/com/project/bumawiki/domain/user/exception/UserNotFoundException.java b/src/main/java/com/project/bumawiki/domain/user/exception/UserNotFoundException.java deleted file mode 100644 index 3a42e2a1..00000000 --- a/src/main/java/com/project/bumawiki/domain/user/exception/UserNotFoundException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.project.bumawiki.domain.user.exception; - -import com.project.bumawiki.global.error.exception.BumawikiException; -import com.project.bumawiki.global.error.exception.ErrorCode; - -public class UserNotFoundException extends BumawikiException { - - public static final UserNotFoundException EXCEPTION = new UserNotFoundException(ErrorCode.USER_NOT_FOUND); - - public UserNotFoundException(ErrorCode errorCode) { - super(errorCode); - } -} diff --git a/src/main/java/com/project/bumawiki/domain/user/implementation/UserUpdater.java b/src/main/java/com/project/bumawiki/domain/user/implementation/UserUpdater.java index 6bd81384..b6e84ac1 100644 --- a/src/main/java/com/project/bumawiki/domain/user/implementation/UserUpdater.java +++ b/src/main/java/com/project/bumawiki/domain/user/implementation/UserUpdater.java @@ -1,6 +1,7 @@ package com.project.bumawiki.domain.user.implementation; import com.project.bumawiki.domain.user.domain.User; +import com.project.bumawiki.domain.user.domain.authority.Authority; import com.project.bumawiki.global.annotation.Implementation; @Implementation @@ -8,4 +9,8 @@ public class UserUpdater { public void update(User user, User newUserInfo) { user.update(newUserInfo); } + + public void updateAuthority(User user, Authority authority) { + user.updateAuthority(authority); + } } diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/UserAuthorityController.java b/src/main/java/com/project/bumawiki/domain/user/presentation/UserAuthorityController.java deleted file mode 100644 index 3bdef9dd..00000000 --- a/src/main/java/com/project/bumawiki/domain/user/presentation/UserAuthorityController.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.project.bumawiki.domain.user.presentation; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.project.bumawiki.domain.user.domain.authority.Authority; -import com.project.bumawiki.domain.user.presentation.dto.UserAuthorityDto; -import com.project.bumawiki.domain.user.service.UserAuthorityService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api") -@RequiredArgsConstructor -public class UserAuthorityController { - private final UserAuthorityService userAuthorityService; - - @PutMapping("/set/authority") - public ResponseEntity setUserAuthority(@RequestBody final UserAuthorityDto userAuthorityDto) { - Authority authority = userAuthorityService.execute(userAuthorityDto); - return ResponseEntity.ok().body(authority); - } - -} diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/UserController.java b/src/main/java/com/project/bumawiki/domain/user/presentation/UserController.java new file mode 100644 index 00000000..d508c037 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/user/presentation/UserController.java @@ -0,0 +1,59 @@ +package com.project.bumawiki.domain.user.presentation; + +import org.springframework.http.HttpStatus; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import com.project.bumawiki.domain.auth.annotation.AdminOnly; +import com.project.bumawiki.domain.auth.annotation.LoginRequired; +import com.project.bumawiki.domain.auth.service.QueryAuthService; +import com.project.bumawiki.domain.docs.service.QueryDocsService; +import com.project.bumawiki.domain.user.domain.User; +import com.project.bumawiki.domain.user.presentation.dto.request.UserAuthorityRequestDto; +import com.project.bumawiki.domain.user.presentation.dto.response.UserResponseDto; +import com.project.bumawiki.domain.user.service.CommandUserService; +import com.project.bumawiki.domain.user.service.QueryUserService; + +import lombok.RequiredArgsConstructor; + +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/user") +public class UserController { + + private final QueryUserService userInfoService; + private final QueryDocsService queryDocsService; + private final QueryAuthService queryAuthService; + private final CommandUserService commandUserService; + + @GetMapping + @LoginRequired + public UserResponseDto findMyInfo() { + User user = queryAuthService.getCurrentUser(); + return new UserResponseDto(user, queryDocsService.findAllVersionDocsByUser(user)); + } + + @GetMapping("/{id}") + public UserResponseDto findAnotherUserInFo(@PathVariable Long id) { + User foundUser = userInfoService.findUserInfo(id); + return new UserResponseDto( + foundUser, + queryDocsService.findAllVersionDocsByUser(foundUser) + ); + } + + @AdminOnly + @PatchMapping("/authority") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void updateUserAuthority(@RequestBody UserAuthorityRequestDto userAuthorityRequestDto) { + commandUserService.updateUserAuthority(userAuthorityRequestDto.id(), userAuthorityRequestDto.authority()); + } + +} diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/UserInfoController.java b/src/main/java/com/project/bumawiki/domain/user/presentation/UserInfoController.java deleted file mode 100644 index dbbea70b..00000000 --- a/src/main/java/com/project/bumawiki/domain/user/presentation/UserInfoController.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.project.bumawiki.domain.user.presentation; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; - -import com.project.bumawiki.domain.auth.service.QueryAuthService; -import com.project.bumawiki.domain.docs.service.QueryDocsService; -import com.project.bumawiki.domain.user.domain.User; -import com.project.bumawiki.domain.user.presentation.dto.UserResponseDto; -import com.project.bumawiki.domain.user.service.UserInfoService; - -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@RestController -@RequestMapping("/api/user") -public class UserInfoController { - - private final UserInfoService userInfoService; - private final QueryDocsService queryDocsService; - private final QueryAuthService queryAuthService; - - @GetMapping - @ResponseStatus(HttpStatus.OK) - public UserResponseDto findUserInfo() { - User user = queryAuthService.getCurrentUser(); - return new UserResponseDto(user, queryDocsService.findAllVersionDocsByUser(user)); - } - - @GetMapping("/{id}") - public ResponseEntity findAnotherUserInFo(@PathVariable Long id) { - User foundUser = userInfoService.findAnotherInfo(id); - UserResponseDto response = new UserResponseDto(foundUser, - queryDocsService.findAllVersionDocsByUser(foundUser)); - return ResponseEntity.ok().body(response); - } - -} diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/SimpleUserDto.java b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/SimpleUserDto.java deleted file mode 100644 index be052bd6..00000000 --- a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/SimpleUserDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.project.bumawiki.domain.user.presentation.dto; - -import com.project.bumawiki.domain.user.domain.User; - -import lombok.Getter; - -@Getter -public class SimpleUserDto { - private final Long id; - - private final String email; - - private final String nickName; - - private final String name; - - public SimpleUserDto(User user) { - this.id = user.getId(); - this.email = user.getEmail(); - this.nickName = user.getNickName(); - this.name = user.getName(); - } -} diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserAuthorityDto.java b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserAuthorityDto.java deleted file mode 100644 index e79d23bd..00000000 --- a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserAuthorityDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.project.bumawiki.domain.user.presentation.dto; - -import com.project.bumawiki.domain.user.domain.authority.Authority; - -import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class UserAuthorityDto { - - @NotNull - private String email; - @NotNull - private Authority authority; - -} diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserResponseDto.java b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserResponseDto.java deleted file mode 100644 index 05de6a9c..00000000 --- a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserResponseDto.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.project.bumawiki.domain.user.presentation.dto; - -import java.util.List; - -import com.project.bumawiki.domain.docs.domain.VersionDocs; -import com.project.bumawiki.domain.docs.presentation.dto.response.ContributeDocsResponseDto; -import com.project.bumawiki.domain.user.domain.User; -import com.project.bumawiki.domain.user.domain.authority.Authority; - -import lombok.Getter; - -@Getter -public class UserResponseDto { - private final Long id; - - private final String email; - - private final String nickName; - - private final String name; - - private final Authority authority; - - private final List contributeDocs; - - public UserResponseDto(User user, List versionDocs) { - this.id = user.getId(); - this.email = user.getEmail(); - this.nickName = user.getNickName(); - this.authority = user.getAuthority(); - this.name = user.getName(); - this.contributeDocs = versionDocs - .stream() - .map(ContributeDocsResponseDto::new) - .toList(); - } -} diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/request/UserAuthorityRequestDto.java b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/request/UserAuthorityRequestDto.java new file mode 100644 index 00000000..9ec3dc47 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/request/UserAuthorityRequestDto.java @@ -0,0 +1,13 @@ +package com.project.bumawiki.domain.user.presentation.dto.request; + +import com.project.bumawiki.domain.user.domain.authority.Authority; + +import jakarta.validation.constraints.NotNull; + +public record UserAuthorityRequestDto( + @NotNull(message = "id는 null일 수 없습니다.") + Long id, + @NotNull(message = "authority는 null일 수 없습니다.") + Authority authority +) { +} diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/response/SimpleUserResponseDto.java b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/response/SimpleUserResponseDto.java new file mode 100644 index 00000000..22ec29f6 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/response/SimpleUserResponseDto.java @@ -0,0 +1,20 @@ +package com.project.bumawiki.domain.user.presentation.dto.response; + +import com.project.bumawiki.domain.user.domain.User; + +public record SimpleUserResponseDto( + Long id, + String email, + String nickName, + String name +) { + + public SimpleUserResponseDto(User user) { + this( + user.getId(), + user.getEmail(), + user.getNickName(), + user.getName() + ); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/response/UserResponseDto.java b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/response/UserResponseDto.java new file mode 100644 index 00000000..d234eaa0 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/response/UserResponseDto.java @@ -0,0 +1,30 @@ +package com.project.bumawiki.domain.user.presentation.dto.response; + +import java.util.List; + +import com.project.bumawiki.domain.docs.domain.VersionDocs; +import com.project.bumawiki.domain.docs.presentation.dto.response.ContributeDocsResponseDto; +import com.project.bumawiki.domain.user.domain.User; +import com.project.bumawiki.domain.user.domain.authority.Authority; + +public record UserResponseDto( + Long id, + String email, + String nickName, + String name, + Authority authority, + List contributeDocs +) { + public UserResponseDto(User user, List versionDocs) { + this( + user.getId(), + user.getEmail(), + user.getNickName(), + user.getName(), + user.getAuthority(), + versionDocs.stream() + .map(ContributeDocsResponseDto::new) + .toList() + ); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/user/service/CommandUserService.java b/src/main/java/com/project/bumawiki/domain/user/service/CommandUserService.java new file mode 100644 index 00000000..68593fc3 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/user/service/CommandUserService.java @@ -0,0 +1,25 @@ +package com.project.bumawiki.domain.user.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.project.bumawiki.domain.user.domain.User; +import com.project.bumawiki.domain.user.domain.authority.Authority; +import com.project.bumawiki.domain.user.implementation.UserReader; +import com.project.bumawiki.domain.user.implementation.UserUpdater; + +import lombok.RequiredArgsConstructor; + +@Service +@Transactional +@RequiredArgsConstructor +public class CommandUserService { + private final UserReader userReader; + private final UserUpdater userUpdater; + + public void updateUserAuthority(Long id, Authority authority) { + User user = userReader.getById(id); + userUpdater.updateAuthority(user, authority); + } + +} diff --git a/src/main/java/com/project/bumawiki/domain/user/service/QueryUserService.java b/src/main/java/com/project/bumawiki/domain/user/service/QueryUserService.java new file mode 100644 index 00000000..32f10af1 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/user/service/QueryUserService.java @@ -0,0 +1,21 @@ +package com.project.bumawiki.domain.user.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.project.bumawiki.domain.user.domain.User; +import com.project.bumawiki.domain.user.implementation.UserReader; + +import lombok.RequiredArgsConstructor; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class QueryUserService { + + private final UserReader userReader; + + public User findUserInfo(Long userId) { + return userReader.getById(userId); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/user/service/UserAuthorityService.java b/src/main/java/com/project/bumawiki/domain/user/service/UserAuthorityService.java deleted file mode 100644 index c6a0e8db..00000000 --- a/src/main/java/com/project/bumawiki/domain/user/service/UserAuthorityService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.project.bumawiki.domain.user.service; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.project.bumawiki.domain.user.domain.User; -import com.project.bumawiki.domain.user.domain.authority.Authority; -import com.project.bumawiki.domain.user.domain.repository.UserRepositoryMapper; -import com.project.bumawiki.domain.user.presentation.dto.UserAuthorityDto; - -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -@Transactional -public class UserAuthorityService { - private final UserRepositoryMapper userRepositoryMapper; - - public Authority execute(final UserAuthorityDto userAuthorityDto) { - User user = userRepositoryMapper.getByEmail(userAuthorityDto.getEmail()); - user.changeUserAuthority(userAuthorityDto.getAuthority()); - return user.getAuthority(); - } - -} diff --git a/src/main/java/com/project/bumawiki/domain/user/service/UserInfoService.java b/src/main/java/com/project/bumawiki/domain/user/service/UserInfoService.java deleted file mode 100644 index b9a7a974..00000000 --- a/src/main/java/com/project/bumawiki/domain/user/service/UserInfoService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.project.bumawiki.domain.user.service; - -import com.project.bumawiki.domain.user.domain.User; -import com.project.bumawiki.domain.user.domain.repository.UserRepositoryMapper; -import com.project.bumawiki.global.annotation.ServiceWithTransactionalReadOnly; - -import lombok.RequiredArgsConstructor; - -@ServiceWithTransactionalReadOnly -@RequiredArgsConstructor -public class UserInfoService { - - private final UserRepositoryMapper userRepositoryMapper; - - public User findAnotherInfo(Long userId) { - return userRepositoryMapper.getById(userId); - } -} diff --git a/src/test/java/com/project/bumawiki/domain/user/service/CommandUserServiceTest.java b/src/test/java/com/project/bumawiki/domain/user/service/CommandUserServiceTest.java new file mode 100644 index 00000000..b3a01b8a --- /dev/null +++ b/src/test/java/com/project/bumawiki/domain/user/service/CommandUserServiceTest.java @@ -0,0 +1,61 @@ +package com.project.bumawiki.domain.user.service; + +import static com.navercorp.fixturemonkey.api.experimental.JavaGetterMethodPropertySelector.*; +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.RepeatedTest; +import org.springframework.beans.factory.annotation.Autowired; + +import net.jqwik.api.Arbitraries; + +import com.project.bumawiki.domain.user.domain.User; +import com.project.bumawiki.domain.user.domain.authority.Authority; +import com.project.bumawiki.domain.user.domain.repository.UserRepository; +import com.project.bumawiki.global.error.exception.BumawikiException; +import com.project.bumawiki.global.error.exception.ErrorCode; +import com.project.bumawiki.global.service.FixtureGenerator; +import com.project.bumawiki.global.service.ServiceTest; + +class CommandUserServiceTest extends ServiceTest { + + @Autowired + private CommandUserService commandUserService; + @Autowired + private UserRepository userRepository; + + @RepeatedTest(REPEAT_COUNT) + void 유저_권한_업데이트() { + // given + Authority authority = Arbitraries.of(Authority.class).sample(); + // 위와 다른 권한을 랜덤으로 선택 + Authority otherAuthority = Arbitraries.of(Authority.class).filter(it -> it != authority).sample(); + + User user = FixtureGenerator.getDefaultUserBuilder() + .set(javaGetter(User::getAuthority), authority) + .sample(); + + userRepository.save(user); + // when + commandUserService.updateUserAuthority(user.getId(), otherAuthority); + + // then + assertThat(userRepository.findById(user.getId()).get().getAuthority()).isEqualTo(otherAuthority); + } + + @RepeatedTest(REPEAT_COUNT) + void 없는_유저_권한_업데이트() { + // given + Authority authority = Arbitraries.of(Authority.class).sample(); + + Long id = Arbitraries.longs().greaterOrEqual(1).sample(); + // when + BumawikiException exception = assertThrows(BumawikiException.class, + () -> commandUserService.updateUserAuthority(id, authority) + ); + + // then + assertThat(exception.getErrorCode()).isEqualTo(ErrorCode.USER_NOT_FOUND); + } + +} diff --git a/src/test/java/com/project/bumawiki/domain/user/service/QueryUserServiceTest.java b/src/test/java/com/project/bumawiki/domain/user/service/QueryUserServiceTest.java new file mode 100644 index 00000000..2b137284 --- /dev/null +++ b/src/test/java/com/project/bumawiki/domain/user/service/QueryUserServiceTest.java @@ -0,0 +1,53 @@ +package com.project.bumawiki.domain.user.service; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.RepeatedTest; +import org.springframework.beans.factory.annotation.Autowired; + +import net.jqwik.api.Arbitraries; + +import com.project.bumawiki.domain.user.domain.User; +import com.project.bumawiki.domain.user.domain.repository.UserRepository; +import com.project.bumawiki.global.error.exception.BumawikiException; +import com.project.bumawiki.global.error.exception.ErrorCode; +import com.project.bumawiki.global.service.FixtureGenerator; +import com.project.bumawiki.global.service.ServiceTest; + +class QueryUserServiceTest extends ServiceTest { + + @Autowired + private QueryUserService queryUserService; + @Autowired + private UserRepository userRepository; + + @RepeatedTest(REPEAT_COUNT) + void 다른유저_ID로_조회() { + // given + User user = FixtureGenerator.getDefaultUserBuilder() + .sample(); + + userRepository.save(user); + // when + User foundUser = queryUserService.findUserInfo(user.getId()); + + // then + assertThat(user.getId()).isEqualTo(foundUser.getId()); + } + + @RepeatedTest(REPEAT_COUNT) + void 없는_유저_조회() { + // given + Long id = Arbitraries.longs().greaterOrEqual(1).sample(); + + // when + BumawikiException exception = assertThrows(BumawikiException.class, + () -> queryUserService.findUserInfo(id) + ); + + // then + assertThat(exception.getErrorCode()).isEqualTo(ErrorCode.USER_NOT_FOUND); + } + +} diff --git a/src/test/java/com/project/bumawiki/global/service/FixtureGenerator.java b/src/test/java/com/project/bumawiki/global/service/FixtureGenerator.java index 1ea5e7bd..ae3bb943 100644 --- a/src/test/java/com/project/bumawiki/global/service/FixtureGenerator.java +++ b/src/test/java/com/project/bumawiki/global/service/FixtureGenerator.java @@ -40,8 +40,7 @@ public static ArbitraryBuilder getDefaultVersionDocsBuilder(Docs do public static ArbitraryBuilder getDefaultUserBuilder() { return fixtureGenerator.giveMeBuilder(User.class) .setNull(javaGetter(User::getId)) - .set(javaGetter(User::getAuthority), Authority.USER) - .setNull(javaGetter(User::getThumbsUps)); + .set(javaGetter(User::getAuthority), Authority.USER); } public static ArbitraryBuilder getDefaultThumbsUpBuilder(Docs docs, User user) {