Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,18 @@ public ApiResponse<WorkspaceResponseDTO.Workspace> updateWorkspace(
return ApiResponse.onSuccess(workspace);
}

@Operation(summary = "워크스페이스 초대 수락", description =
"# 워크스페이스 초대 수락 API 입니다. jwt 토큰을 헤더에 넣어주세요"
)
@PostMapping("/workspaces/invite-accept")
public ApiResponse<?> acceptInvite(
@RequestParam("code") String code
) {
Long userId = SecurityUtil.getCurrentUserId();

workspaceCommandService.acceptInvite(userId, code);

return ApiResponse.onSuccess(null);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ public interface WorkspaceCommandService {
WorkspaceResponseDTO.Workspace createWorkspace(Long userId, WorkspaceRequestDTO.WorkspaceCreateRequest request);

WorkspaceResponseDTO.Workspace updateWorkspace(Long userId, Long workspaceid, WorkspaceRequestDTO.WorkspaceUpdateRequest request);

void acceptInvite(Long userId, String code);
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@
import com.haru.api.domain.workspace.dto.WorkspaceResponseDTO;
import com.haru.api.domain.workspace.entity.Workspace;
import com.haru.api.domain.workspace.repository.WorkspaceRepository;
import com.haru.api.domain.workspaceInvitation.entity.WorkspaceInvitation;
import com.haru.api.domain.workspaceInvitation.repository.WorkspaceInvitationRepository;
import com.haru.api.global.apiPayload.code.status.ErrorStatus;
import com.haru.api.global.apiPayload.exception.handler.MemberHandler;
import com.haru.api.global.apiPayload.exception.handler.WorkspaceHandler;
import com.haru.api.global.apiPayload.exception.handler.WorkspaceInvitationHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -24,9 +27,10 @@ public class WorkspaceCommandServiceImpl implements WorkspaceCommandService {
private final UserRepository userRepository;
private final WorkspaceRepository workspaceRepository;
private final UserWorkspaceRepository userWorkspaceRepository;
private final WorkspaceInvitationRepository workspaceInvitationRepository;

@Override
@Transactional
@Override
public WorkspaceResponseDTO.Workspace createWorkspace(Long userId, WorkspaceRequestDTO.WorkspaceCreateRequest request) {

Users foundUser = userRepository.findById(userId)
Expand All @@ -53,8 +57,8 @@ public WorkspaceResponseDTO.Workspace createWorkspace(Long userId, WorkspaceRequ
return WorkspaceConverter.toWorkspaceDTO(workspaceRepository.save(workspace));
}

@Override
@Transactional
@Override
public WorkspaceResponseDTO.Workspace updateWorkspace(Long userId, Long workspaceId, WorkspaceRequestDTO.WorkspaceUpdateRequest request) {

Users foundUser = userRepository.findById(userId)
Expand All @@ -71,5 +75,30 @@ public WorkspaceResponseDTO.Workspace updateWorkspace(Long userId, Long workspac
return WorkspaceConverter.toWorkspaceDTO(foundWorkspace);
}

@Transactional
@Override
public void acceptInvite(Long userId, String code) {

Users foundUser = userRepository.findById(userId)
.orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND));

WorkspaceInvitation foundWorkspaceInvitation = workspaceInvitationRepository.findByInvitationCode(code)
.orElseThrow(() -> new WorkspaceInvitationHandler(ErrorStatus.INVITATION_NOT_FOUND));

if(foundWorkspaceInvitation.getIsAccepted())
throw new WorkspaceInvitationHandler(ErrorStatus.ALREADY_ACCEPTED);

if(!foundWorkspaceInvitation.getEmail().equals(foundUser.getEmail()))
throw new WorkspaceInvitationHandler(ErrorStatus.EMAIL_MISMATCH);

userWorkspaceRepository.save(UserWorkspace.builder()
.user(foundUser)
.workspace(foundWorkspaceInvitation.getWorkspace())
.auth(Auth.MEMBER)
.build());

foundWorkspaceInvitation.setIsAccepted(true);
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.haru.api.domain.workspaceInvitation.entity;

import com.haru.api.domain.workspace.entity.Workspace;
import com.haru.api.global.common.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;

@Entity
@Table(name = "workspace_invitations")
@Getter
@DynamicUpdate
@DynamicInsert
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
public class WorkspaceInvitation extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String email;

@ManyToOne(fetch = FetchType.LAZY)
Workspace workspace;

private String invitationCode;

@Setter
private Boolean isAccepted = false;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.haru.api.domain.workspaceInvitation.repository;

import com.haru.api.domain.workspaceInvitation.entity.WorkspaceInvitation;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface WorkspaceInvitationRepository extends JpaRepository<WorkspaceInvitation, Long> {
Optional<WorkspaceInvitation> findByInvitationCode(String invitationCode);
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ public enum ErrorStatus implements BaseErrorCode {
// AI회의 Meetings 관련 에러
MEETING_FILE_NOT_FOUND(HttpStatus.BAD_REQUEST, "MEETING1001", "안건지가 업로드되지 않았습니다."),

// workspace 초대 관련 에러
INVITATION_NOT_FOUND(HttpStatus.NOT_FOUND, "INVITATION1001", "초대 코드에 해당하는 초대장이 존재하지 않습니다."),
EMAIL_MISMATCH(HttpStatus.BAD_REQUEST, "INVITATION1002", "초대장의 이메일과 현재 유저의 이메일이 일치하지 않습니다."),
ALREADY_ACCEPTED(HttpStatus.BAD_REQUEST, "INVITATION1003", "이미 초대가 수락된 초대장입니다."),

// 예시,,,
ARTICLE_NOT_FOUND(HttpStatus.NOT_FOUND, "ARTICLE4001", "게시글이 없습니다.");

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.haru.api.global.apiPayload.exception.handler;

import com.haru.api.global.apiPayload.code.BaseErrorCode;
import com.haru.api.global.apiPayload.exception.GeneralException;

public class WorkspaceInvitationHandler extends GeneralException {
public WorkspaceInvitationHandler(BaseErrorCode errorCode) {
super(errorCode);
}
}