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 896047b3..c6eab05c 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 @@ -71,12 +71,12 @@ public ApiResponse logout( "현재는 jwt token을 구현하지 않아 pathvariable로 userId를 넣어주세요.추후 jwt token이 구현되면 수정하겠습니다." ) @GetMapping("/{userId}/info") - public ApiResponse getUserInfo( + public ApiResponse getUserInfo( @PathVariable Long userId ) { - UserResponseDTO.UserDTO userDTO = userQueryService.getUserInfo(userId); + UserResponseDTO.User user = userQueryService.getUserInfo(userId); - return ApiResponse.onSuccess(userDTO); + return ApiResponse.onSuccess(user); } @Operation(summary = "회원 정보 수정", description = @@ -84,13 +84,13 @@ public ApiResponse getUserInfo( "현재는 jwt token을 구현하지 않아 pathvariable로 userId를 넣어주세요.추후 jwt token이 구현되면 수정하겠습니다." ) @PatchMapping("/{userId}/info") - public ApiResponse updateUserInfo( + public ApiResponse updateUserInfo( @PathVariable Long userId, @RequestBody @Valid UserRequestDTO.UserInfoUpdateRequest request ) { - UserResponseDTO.UserDTO userDTO = userCommandService.updateUserInfo(userId, request); + UserResponseDTO.User user = userCommandService.updateUserInfo(userId, request); - return ApiResponse.onSuccess(userDTO); + return ApiResponse.onSuccess(user); } @Operation(summary = "이메일로 회원 리스트 조회", description = @@ -99,13 +99,13 @@ public ApiResponse updateUserInfo( "현재는 jwt token을 구현하지 않아 pathvariable로 userId를 넣어주세요.추후 jwt token이 구현되면 수정하겠습니다." ) @GetMapping("{userId}/search") - public ApiResponse> searchUsers( + public ApiResponse> searchUsers( @PathVariable Long userId, @RequestParam String email ) { - List userDTOs = userQueryService.getSimilarEmailUsers(userId, email); + List users = userQueryService.getSimilarEmailUsers(userId, email); - return ApiResponse.onSuccess(userDTOs); + return ApiResponse.onSuccess(users); } } diff --git a/src/main/java/com/haru/api/domain/user/converter/UserConverter.java b/src/main/java/com/haru/api/domain/user/converter/UserConverter.java index ad3c85f2..c6e7b030 100644 --- a/src/main/java/com/haru/api/domain/user/converter/UserConverter.java +++ b/src/main/java/com/haru/api/domain/user/converter/UserConverter.java @@ -14,8 +14,8 @@ public static Users toUsers(UserRequestDTO.SignUpRequest request) { .build(); } - public static UserResponseDTO.UserDTO toUserDTO(Users users) { - return UserResponseDTO.UserDTO.builder() + public static UserResponseDTO.User toUserDTO(Users users) { + return UserResponseDTO.User.builder() .id(users.getId()) .email(users.getEmail()) .name(users.getName()) diff --git a/src/main/java/com/haru/api/domain/user/dto/UserResponseDTO.java b/src/main/java/com/haru/api/domain/user/dto/UserResponseDTO.java index a4c09980..64068d2d 100644 --- a/src/main/java/com/haru/api/domain/user/dto/UserResponseDTO.java +++ b/src/main/java/com/haru/api/domain/user/dto/UserResponseDTO.java @@ -7,7 +7,7 @@ public class UserResponseDTO { @Getter @Builder - public static class UserDTO { + public static class User { private Long id; private String email; private String imageUrl; diff --git a/src/main/java/com/haru/api/domain/user/entity/Users.java b/src/main/java/com/haru/api/domain/user/entity/Users.java index b561ff07..e24dcc06 100644 --- a/src/main/java/com/haru/api/domain/user/entity/Users.java +++ b/src/main/java/com/haru/api/domain/user/entity/Users.java @@ -4,18 +4,19 @@ import com.haru.api.global.common.entity.BaseEntity; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; import java.time.LocalDateTime; @Entity +@Table(name = "users") @Getter @DynamicUpdate @DynamicInsert @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor +@Builder public class Users extends BaseEntity { @Id @@ -45,13 +46,4 @@ public void encodePassword(String password) { this.password = password; } - @Builder - public Users(String name, String email, String password, Status status, String profileImage, LocalDateTime inactiveDate) { - this.name = name; - this.email = email; - this.password = password; - this.status = status; - this.profileImage = profileImage; - this.inactiveDate = inactiveDate; - } } 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 c003674e..e6fca03a 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 @@ -7,7 +7,7 @@ public interface UserCommandService { void signUp(UserRequestDTO.SignUpRequest request); UserResponseDTO.LoginResponse login(UserRequestDTO.LoginRequest request); - UserResponseDTO.UserDTO updateUserInfo(Long userId, UserRequestDTO.UserInfoUpdateRequest request); + UserResponseDTO.User updateUserInfo(Long userId, UserRequestDTO.UserInfoUpdateRequest request); UserResponseDTO.RefreshResponse refresh(String refreshToken); 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 5ae02079..434867c6 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 @@ -97,7 +97,7 @@ public void logout(String accessToken) { @Override @Transactional - public UserResponseDTO.UserDTO updateUserInfo(Long userId, UserRequestDTO.UserInfoUpdateRequest request) { + public UserResponseDTO.User updateUserInfo(Long userId, UserRequestDTO.UserInfoUpdateRequest request) { String name = request.getName(); Users user = userRepository.findById(userId) .orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); diff --git a/src/main/java/com/haru/api/domain/user/service/UserQueryService.java b/src/main/java/com/haru/api/domain/user/service/UserQueryService.java index a5262292..2a556bbe 100644 --- a/src/main/java/com/haru/api/domain/user/service/UserQueryService.java +++ b/src/main/java/com/haru/api/domain/user/service/UserQueryService.java @@ -5,7 +5,7 @@ import java.util.List; public interface UserQueryService { - UserResponseDTO.UserDTO getUserInfo(Long userId); + UserResponseDTO.User getUserInfo(Long userId); - List getSimilarEmailUsers(Long userId, String email); + List getSimilarEmailUsers(Long userId, String email); } diff --git a/src/main/java/com/haru/api/domain/user/service/UserQueryServiceImpl.java b/src/main/java/com/haru/api/domain/user/service/UserQueryServiceImpl.java index 29e08cfd..c82640ff 100644 --- a/src/main/java/com/haru/api/domain/user/service/UserQueryServiceImpl.java +++ b/src/main/java/com/haru/api/domain/user/service/UserQueryServiceImpl.java @@ -18,7 +18,7 @@ public class UserQueryServiceImpl implements UserQueryService { private final UserRepository userRepository; @Override - public UserResponseDTO.UserDTO getUserInfo(Long userId) { + public UserResponseDTO.User getUserInfo(Long userId) { Users user = userRepository.findById(userId) .orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); @@ -27,7 +27,7 @@ public UserResponseDTO.UserDTO getUserInfo(Long userId) { } @Override - public List getSimilarEmailUsers(Long userId, String email) { + public List getSimilarEmailUsers(Long userId, String email) { userRepository.findById(userId) .orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); @@ -35,7 +35,7 @@ public List getSimilarEmailUsers(Long userId, String em List users = userRepository.findTop4UsersByEmailContainingIgnoreCase(email); return users.parallelStream() - .map(user -> UserResponseDTO.UserDTO.builder() + .map(user -> UserResponseDTO.User.builder() .id(user.getId()) .email(user.getEmail()) .imageUrl(user.getProfileImage()) diff --git a/src/main/java/com/haru/api/domain/userWorkspace/entity/Auth.java b/src/main/java/com/haru/api/domain/userWorkspace/entity/Auth.java new file mode 100644 index 00000000..f68f0db7 --- /dev/null +++ b/src/main/java/com/haru/api/domain/userWorkspace/entity/Auth.java @@ -0,0 +1,5 @@ +package com.haru.api.domain.userWorkspace.entity; + +public enum Auth { + ADMIN, MEMBER, +} diff --git a/src/main/java/com/haru/api/domain/userWorkspace/entity/UserWorkspace.java b/src/main/java/com/haru/api/domain/userWorkspace/entity/UserWorkspace.java new file mode 100644 index 00000000..db4686e8 --- /dev/null +++ b/src/main/java/com/haru/api/domain/userWorkspace/entity/UserWorkspace.java @@ -0,0 +1,37 @@ +package com.haru.api.domain.userWorkspace.entity; + +import com.haru.api.domain.user.entity.Users; +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 = "users_workspaces") +@Getter +@DynamicUpdate +@DynamicInsert +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class UserWorkspace extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private Users user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "workspace_id", nullable = false) + private Workspace workspace; + + @Column(name = "auth", nullable = false) + @Enumerated(EnumType.STRING) + private Auth auth; + +} diff --git a/src/main/java/com/haru/api/domain/userWorkspace/repository/UserWorkspaceRepository.java b/src/main/java/com/haru/api/domain/userWorkspace/repository/UserWorkspaceRepository.java new file mode 100644 index 00000000..789f9a95 --- /dev/null +++ b/src/main/java/com/haru/api/domain/userWorkspace/repository/UserWorkspaceRepository.java @@ -0,0 +1,7 @@ +package com.haru.api.domain.userWorkspace.repository; + +import com.haru.api.domain.userWorkspace.entity.UserWorkspace; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserWorkspaceRepository extends JpaRepository { +} diff --git a/src/main/java/com/haru/api/domain/workspace/controller/WorkspaceController.java b/src/main/java/com/haru/api/domain/workspace/controller/WorkspaceController.java new file mode 100644 index 00000000..36067596 --- /dev/null +++ b/src/main/java/com/haru/api/domain/workspace/controller/WorkspaceController.java @@ -0,0 +1,34 @@ +package com.haru.api.domain.workspace.controller; + +import com.haru.api.domain.user.security.jwt.SecurityUtil; +import com.haru.api.domain.workspace.dto.WorkspaceRequestDTO; +import com.haru.api.domain.workspace.dto.WorkspaceResponseDTO; +import com.haru.api.domain.workspace.service.WorkspaceCommandService; +import com.haru.api.global.apiPayload.ApiResponse; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/workspaces") +public class WorkspaceController { + + private final WorkspaceCommandService workspaceCommandService; + + @Operation(summary = "워크스페이스 생성", description = + "# 워크스페이스 생성 API 입니다. 워크스페이스 제목과 초대하고자 하는 사람의 이메일을 입력해주세요." + ) + @PostMapping + public ApiResponse createWorkspace( + @RequestBody WorkspaceRequestDTO.WorkspaceCreateRequest request + ) { + + Long userId = SecurityUtil.getCurrentUserId(); + + WorkspaceResponseDTO.Workspace workspace = workspaceCommandService.createWorkspace(userId, request); + + return ApiResponse.onSuccess(workspace); + } + +} diff --git a/src/main/java/com/haru/api/domain/workspace/converter/WorkspaceConverter.java b/src/main/java/com/haru/api/domain/workspace/converter/WorkspaceConverter.java new file mode 100644 index 00000000..76f466da --- /dev/null +++ b/src/main/java/com/haru/api/domain/workspace/converter/WorkspaceConverter.java @@ -0,0 +1,13 @@ +package com.haru.api.domain.workspace.converter; + +import com.haru.api.domain.workspace.dto.WorkspaceResponseDTO; +import com.haru.api.domain.workspace.entity.Workspace; + +public class WorkspaceConverter { + public static WorkspaceResponseDTO.Workspace toWorkspaceDTO(Workspace workspace) { + return WorkspaceResponseDTO.Workspace.builder() + .workspaceId(workspace.getId()) + .name(workspace.getTitle()) + .build(); + } +} diff --git a/src/main/java/com/haru/api/domain/workspace/dto/WorkspaceRequestDTO.java b/src/main/java/com/haru/api/domain/workspace/dto/WorkspaceRequestDTO.java new file mode 100644 index 00000000..35041bcc --- /dev/null +++ b/src/main/java/com/haru/api/domain/workspace/dto/WorkspaceRequestDTO.java @@ -0,0 +1,18 @@ +package com.haru.api.domain.workspace.dto; + +import jakarta.validation.constraints.NotBlank; +import lombok.Builder; +import lombok.Getter; + +import java.util.List; + +public class WorkspaceRequestDTO { + + @Getter + @Builder + public static class WorkspaceCreateRequest { + @NotBlank(message = "워크스페이스 제목은 빈 값일 수 없습니다.") + private String name; + private List memberEmails; + } +} diff --git a/src/main/java/com/haru/api/domain/workspace/dto/WorkspaceResponseDTO.java b/src/main/java/com/haru/api/domain/workspace/dto/WorkspaceResponseDTO.java new file mode 100644 index 00000000..f0e8f917 --- /dev/null +++ b/src/main/java/com/haru/api/domain/workspace/dto/WorkspaceResponseDTO.java @@ -0,0 +1,14 @@ +package com.haru.api.domain.workspace.dto; + +import lombok.Builder; +import lombok.Getter; + +public class WorkspaceResponseDTO { + + @Getter + @Builder + public static class Workspace { + private Long workspaceId; + private String name; + } +} diff --git a/src/main/java/com/haru/api/domain/workspace/entity/Workspaces.java b/src/main/java/com/haru/api/domain/workspace/entity/Workspace.java similarity index 76% rename from src/main/java/com/haru/api/domain/workspace/entity/Workspaces.java rename to src/main/java/com/haru/api/domain/workspace/entity/Workspace.java index b1b601e4..c0690dda 100644 --- a/src/main/java/com/haru/api/domain/workspace/entity/Workspaces.java +++ b/src/main/java/com/haru/api/domain/workspace/entity/Workspace.java @@ -7,12 +7,14 @@ import org.hibernate.annotations.DynamicUpdate; @Entity +@Table(name = "workspaces") @Getter @DynamicUpdate @DynamicInsert @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor -public class Workspaces extends BaseEntity { +@Builder +public class Workspace extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -24,9 +26,4 @@ public class Workspaces extends BaseEntity { @Column(columnDefinition = "TEXT") private String imageUrl; - @Builder - public Workspaces(String title, String imageUrl) { - this.title = title; - this.imageUrl = imageUrl; - } } diff --git a/src/main/java/com/haru/api/domain/workspace/repository/WorkspaceRepository.java b/src/main/java/com/haru/api/domain/workspace/repository/WorkspaceRepository.java new file mode 100644 index 00000000..bcc138b6 --- /dev/null +++ b/src/main/java/com/haru/api/domain/workspace/repository/WorkspaceRepository.java @@ -0,0 +1,7 @@ +package com.haru.api.domain.workspace.repository; + +import com.haru.api.domain.workspace.entity.Workspace; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface WorkspaceRepository extends JpaRepository { +} diff --git a/src/main/java/com/haru/api/domain/workspace/service/WorkspaceCommandService.java b/src/main/java/com/haru/api/domain/workspace/service/WorkspaceCommandService.java new file mode 100644 index 00000000..cb0dddfa --- /dev/null +++ b/src/main/java/com/haru/api/domain/workspace/service/WorkspaceCommandService.java @@ -0,0 +1,9 @@ +package com.haru.api.domain.workspace.service; + +import com.haru.api.domain.workspace.dto.WorkspaceRequestDTO; +import com.haru.api.domain.workspace.dto.WorkspaceResponseDTO; + +public interface WorkspaceCommandService { + + WorkspaceResponseDTO.Workspace createWorkspace(Long userId, WorkspaceRequestDTO.WorkspaceCreateRequest request); +} 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 new file mode 100644 index 00000000..31078f14 --- /dev/null +++ b/src/main/java/com/haru/api/domain/workspace/service/WorkspaceCommandServiceImpl.java @@ -0,0 +1,51 @@ +package com.haru.api.domain.workspace.service; + +import com.haru.api.domain.user.entity.Users; +import com.haru.api.domain.user.repository.UserRepository; +import com.haru.api.domain.userWorkspace.entity.Auth; +import com.haru.api.domain.userWorkspace.entity.UserWorkspace; +import com.haru.api.domain.userWorkspace.repository.UserWorkspaceRepository; +import com.haru.api.domain.workspace.converter.WorkspaceConverter; +import com.haru.api.domain.workspace.dto.WorkspaceRequestDTO; +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.global.apiPayload.code.status.ErrorStatus; +import com.haru.api.global.apiPayload.exception.handler.MemberHandler; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class WorkspaceCommandServiceImpl implements WorkspaceCommandService { + + private final UserRepository userRepository; + private final WorkspaceRepository workspaceRepository; + private final UserWorkspaceRepository userWorkspaceRepository; + + @Override + public WorkspaceResponseDTO.Workspace createWorkspace(Long userId, WorkspaceRequestDTO.WorkspaceCreateRequest request) { + + Users foundUser = userRepository.findById(userId) + .orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); + + // workspace 생성 및 저장 + Workspace workspace = workspaceRepository.save(com.haru.api.domain.workspace.entity.Workspace.builder() + .title(request.getName()) + .build()); + + + // s3에 사진 추가하는 메서드 + + // request로 받은 이메일로 초대 메일 전송하는 메서드 + + // user_workspace 테이블에 생성자 정보 저장 + userWorkspaceRepository.save(UserWorkspace.builder() + .user(foundUser) + .workspace(workspace) + .auth(Auth.ADMIN) + .build()); + + return WorkspaceConverter.toWorkspaceDTO(workspaceRepository.save(workspace)); + } +}