diff --git a/src/main/java/com/haru/api/domain/lastOpened/converter/UserDocumentLastOpenedConverter.java b/src/main/java/com/haru/api/domain/lastOpened/converter/UserDocumentLastOpenedConverter.java index ea5571c7..aadcbc12 100644 --- a/src/main/java/com/haru/api/domain/lastOpened/converter/UserDocumentLastOpenedConverter.java +++ b/src/main/java/com/haru/api/domain/lastOpened/converter/UserDocumentLastOpenedConverter.java @@ -1,44 +1,22 @@ package com.haru.api.domain.lastOpened.converter; +import com.haru.api.domain.lastOpened.entity.Documentable; import com.haru.api.domain.lastOpened.entity.UserDocumentId; import com.haru.api.domain.lastOpened.entity.UserDocumentLastOpened; -import com.haru.api.domain.lastOpened.entity.enums.DocumentType; -import com.haru.api.domain.meeting.entity.Meeting; -import com.haru.api.domain.moodTracker.entity.MoodTracker; -import com.haru.api.domain.snsEvent.entity.SnsEvent; import com.haru.api.domain.user.entity.User; public class UserDocumentLastOpenedConverter { - public static UserDocumentLastOpened toUserDocumentLastOpened(Meeting meeting, User user) { + public static UserDocumentLastOpened toUserDocumentLastOpened(Documentable document, User user) { - UserDocumentId userDocumentId = new UserDocumentId(user.getId(), meeting.getId(), DocumentType.AI_MEETING_MANAGER); - - return UserDocumentLastOpened.builder() - .id(userDocumentId) - .user(user) - .lastOpened(null) - .build(); - } - - public static UserDocumentLastOpened toUserDocumentLastOpened(SnsEvent snsEvent, User user) { - - UserDocumentId userDocumentId = new UserDocumentId(user.getId(), snsEvent.getId(), DocumentType.SNS_EVENT_ASSISTANT); - - return UserDocumentLastOpened.builder() - .id(userDocumentId) - .user(user) - .lastOpened(null) - .build(); - } - - public static UserDocumentLastOpened toUserDocumentLastOpened(MoodTracker moodTracker, User user) { - - UserDocumentId userDocumentId = new UserDocumentId(user.getId(), moodTracker.getId(), DocumentType.TEAM_MOOD_TRACKER); + UserDocumentId userDocumentId = new UserDocumentId(user.getId(), document.getId(), document.getDocumentType()); return UserDocumentLastOpened.builder() .id(userDocumentId) .user(user) + .workspaceId(document.getWorkspaceId()) .lastOpened(null) + .thumbnailKeyName(document.getThumbnailKeyName()) + .title(document.getTitle()) .build(); } } diff --git a/src/main/java/com/haru/api/domain/user/controller/UserController.java b/src/main/java/com/haru/api/domain/user/controller/UserController.java index d634388a..7c5acec9 100644 --- a/src/main/java/com/haru/api/domain/user/controller/UserController.java +++ b/src/main/java/com/haru/api/domain/user/controller/UserController.java @@ -154,14 +154,15 @@ public ApiResponse checkOriginalP } @Operation(summary = "회원가입 후 로그인", description = - "# [v1.0 (2025-08-15)](https://www.notion.so/2505da7802c5808583b9d0b08087b8e5)" + - " 회원가입 후 로그인까지 진행하는 API입니다." + "# [v1.1 (2025-08-18)](https://www.notion.so/2505da7802c5808583b9d0b08087b8e5)" + + " 회원가입 후 로그인까지 진행하는 API입니다. query string으로 token을 넘기면 워크스페이스에 초대됩니다." ) @PostMapping("/signup-and-login") public ApiResponse signUpAndLogin( - @RequestBody @Valid UserRequestDTO.SignUpRequest request + @RequestBody @Valid UserRequestDTO.SignUpRequest request, + @RequestParam(required = false) String token ) { - UserResponseDTO.LoginResponse response = userCommandService.signupAndLogin(request); + UserResponseDTO.LoginResponse response = userCommandService.signupAndLoginAndInviteAccept(request, token); return ApiResponse.onSuccess(response); } diff --git a/src/main/java/com/haru/api/domain/user/service/UserCommandService.java b/src/main/java/com/haru/api/domain/user/service/UserCommandService.java index 30c6d905..cdd80b84 100644 --- a/src/main/java/com/haru/api/domain/user/service/UserCommandService.java +++ b/src/main/java/com/haru/api/domain/user/service/UserCommandService.java @@ -22,5 +22,5 @@ public interface UserCommandService { UserResponseDTO.CheckOriginalPasswordResponse checkOriginalPassword(UserRequestDTO.CheckOriginalPasswordRequest request, User user); - UserResponseDTO.LoginResponse signupAndLogin(UserRequestDTO.SignUpRequest request); + UserResponseDTO.LoginResponse signupAndLoginAndInviteAccept(UserRequestDTO.SignUpRequest request, String token); } diff --git a/src/main/java/com/haru/api/domain/user/service/UserCommandServiceImpl.java b/src/main/java/com/haru/api/domain/user/service/UserCommandServiceImpl.java index c3dd87e1..b281e09c 100644 --- a/src/main/java/com/haru/api/domain/user/service/UserCommandServiceImpl.java +++ b/src/main/java/com/haru/api/domain/user/service/UserCommandServiceImpl.java @@ -8,6 +8,7 @@ import com.haru.api.domain.user.repository.UserRepository; import com.haru.api.domain.user.security.jwt.JwtUtils; import com.haru.api.domain.user.security.jwt.SecurityUtil; +import com.haru.api.domain.workspace.service.WorkspaceCommandService; import com.haru.api.global.apiPayload.code.status.ErrorStatus; import com.haru.api.global.apiPayload.exception.handler.MemberHandler; import jakarta.transaction.Transactional; @@ -34,7 +35,9 @@ public class UserCommandServiceImpl implements UserCommandService{ private int accessExpTime; @Value("${jwt.refresh-expiration}") private int refreshExpTime; + private final UserRepository userRepository; + private final WorkspaceCommandService workspaceCommandService; private final PasswordEncoder passwordEncoder; private final AuthenticationManagerBuilder authenticationManagerBuilder; private final JwtUtils jwtUtils; @@ -163,7 +166,8 @@ public UserResponseDTO.CheckOriginalPasswordResponse checkOriginalPassword(UserR } @Override - public UserResponseDTO.LoginResponse signupAndLogin(UserRequestDTO.SignUpRequest request) { + @Transactional + public UserResponseDTO.LoginResponse signupAndLoginAndInviteAccept(UserRequestDTO.SignUpRequest request, String token) { String password = passwordEncoder.encode(request.getPassword()); @@ -175,6 +179,8 @@ public UserResponseDTO.LoginResponse signupAndLogin(UserRequestDTO.SignUpRequest User user = UserConverter.toUsers(request, password); userRepository.save(user); + workspaceCommandService.acceptInvite(token); + return login(UserRequestDTO.LoginRequest.builder() .email(request.getEmail()) .password(request.getPassword()) diff --git a/src/main/java/com/haru/api/domain/workspace/service/WorkspaceCommandServiceImpl.java b/src/main/java/com/haru/api/domain/workspace/service/WorkspaceCommandServiceImpl.java index bcc47e17..5921bee0 100644 --- a/src/main/java/com/haru/api/domain/workspace/service/WorkspaceCommandServiceImpl.java +++ b/src/main/java/com/haru/api/domain/workspace/service/WorkspaceCommandServiceImpl.java @@ -1,13 +1,11 @@ package com.haru.api.domain.workspace.service; import com.haru.api.domain.lastOpened.converter.UserDocumentLastOpenedConverter; +import com.haru.api.domain.lastOpened.entity.Documentable; import com.haru.api.domain.lastOpened.entity.UserDocumentLastOpened; import com.haru.api.domain.lastOpened.repository.UserDocumentLastOpenedRepository; -import com.haru.api.domain.meeting.entity.Meeting; import com.haru.api.domain.meeting.repository.MeetingRepository; -import com.haru.api.domain.moodTracker.entity.MoodTracker; import com.haru.api.domain.moodTracker.repository.MoodTrackerRepository; -import com.haru.api.domain.snsEvent.entity.SnsEvent; import com.haru.api.domain.snsEvent.repository.SnsEventRepository; import com.haru.api.domain.user.entity.User; import com.haru.api.domain.user.repository.UserRepository; @@ -107,7 +105,6 @@ public WorkspaceResponseDTO.Workspace updateWorkspace(User user, Workspace works return WorkspaceConverter.toWorkspaceDTO(workspace); } - @Transactional @Override public WorkspaceResponseDTO.InvitationAcceptResult acceptInvite(String token) { @@ -175,8 +172,7 @@ public WorkspaceResponseDTO.InvitationAcceptResult acceptInvite(String token, U .auth(Auth.MEMBER) .build()); - // 각 문서 조회 - // 각 문서 UserDocumentLastOpened로 변환 + // 각 문서 조회 후, UserDocumentLastOpened로 변환 List userDocumentLastOpenedList = addDocumentsToUserLastOpened(foundWorkspace, signedUser); // 워크스페이스에 속해있는 모든 문서를 user_document_last_opened에 추가 @@ -223,17 +219,16 @@ public void sendInviteEmail(User user, WorkspaceRequestDTO.WorkspaceInviteEmailR } private List addDocumentsToUserLastOpened(Workspace workspace, User user) { - List meetingList = meetingRepository.findAllByWorkspaceId(workspace.getId()); - List snsEventList = snsEventRepository.findAllByWorkspaceId(workspace.getId()); - List moodTrackerList = moodTrackerRepository.findAllByWorkspaceId(workspace.getId()); + + List documentList = new ArrayList<>(); + + documentList.addAll(meetingRepository.findAllByWorkspaceId(workspace.getId())); + documentList.addAll(snsEventRepository.findAllByWorkspaceId(workspace.getId())); + documentList.addAll(moodTrackerRepository.findAllByWorkspaceId(workspace.getId())); List userDocumentLastOpenedList = new ArrayList<>(); - for(Meeting meeting : meetingList) - userDocumentLastOpenedList.add(UserDocumentLastOpenedConverter.toUserDocumentLastOpened(meeting, user)); - for(SnsEvent snsEvent : snsEventList) - userDocumentLastOpenedList.add(UserDocumentLastOpenedConverter.toUserDocumentLastOpened(snsEvent, user)); - for(MoodTracker moodTracker : moodTrackerList) - userDocumentLastOpenedList.add(UserDocumentLastOpenedConverter.toUserDocumentLastOpened(moodTracker, user)); + for(Documentable documentable : documentList) + userDocumentLastOpenedList.add(UserDocumentLastOpenedConverter.toUserDocumentLastOpened(documentable, user)); userDocumentLastOpenedRepository.saveAll(userDocumentLastOpenedList);