diff --git a/src/main/java/com/hotsix/server/global/config/SecurityConfig.java b/src/main/java/com/hotsix/server/global/config/SecurityConfig.java index 25cc7bf..858e96e 100644 --- a/src/main/java/com/hotsix/server/global/config/SecurityConfig.java +++ b/src/main/java/com/hotsix/server/global/config/SecurityConfig.java @@ -55,6 +55,10 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http, ) .authorizeHttpRequests(auth -> auth .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll() + .requestMatchers(HttpMethod.GET, + "/api/v1/projects", + "/api/v1/projects/*" + ).permitAll() .requestMatchers( "/swagger-ui/**", "/v3/api-docs/**", diff --git a/src/main/java/com/hotsix/server/project/controller/ProjectController.java b/src/main/java/com/hotsix/server/project/controller/ProjectController.java index 3ecc51e..3f86949 100644 --- a/src/main/java/com/hotsix/server/project/controller/ProjectController.java +++ b/src/main/java/com/hotsix/server/project/controller/ProjectController.java @@ -7,6 +7,7 @@ import com.hotsix.server.project.dto.ProjectRequestDto; import com.hotsix.server.project.dto.ProjectResponseDto; import com.hotsix.server.project.dto.ProjectStatusUpdateRequestDto; +import com.hotsix.server.project.dto.ProjectSummaryResponse; import com.hotsix.server.project.service.ProjectService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -125,4 +126,12 @@ public CommonResponse getProjectCreatorId( Long creatorId = projectService.getProjectCreatorId(projectId); return CommonResponse.success(creatorId); } + + @GetMapping("/me") + @Operation(summary = "내 프로젝트 목록 조회", description = "로그인한 사용자의 모든 프로젝트를 상태별로 반환합니다.") + public CommonResponse> getMyProjects() { + List myProjects = projectService.getProjectsByUser(); + return CommonResponse.success(myProjects); + } + } \ No newline at end of file diff --git a/src/main/java/com/hotsix/server/project/dto/ProjectSummaryResponse.java b/src/main/java/com/hotsix/server/project/dto/ProjectSummaryResponse.java new file mode 100644 index 0000000..0201d4f --- /dev/null +++ b/src/main/java/com/hotsix/server/project/dto/ProjectSummaryResponse.java @@ -0,0 +1,25 @@ +package com.hotsix.server.project.dto; + +import com.hotsix.server.project.entity.Project; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor +public class ProjectSummaryResponse { + private Long projectId; + private String title; + private String status; + private String deadline; + + public static ProjectSummaryResponse from(Project project) { + return ProjectSummaryResponse.builder() + .projectId(project.getProjectId()) + .title(project.getTitle()) + .status(project.getStatus().name()) + .deadline(project.getDeadline().toString()) + .build(); + } +} diff --git a/src/main/java/com/hotsix/server/project/repository/ProjectRepository.java b/src/main/java/com/hotsix/server/project/repository/ProjectRepository.java index 6faea2a..2c87800 100644 --- a/src/main/java/com/hotsix/server/project/repository/ProjectRepository.java +++ b/src/main/java/com/hotsix/server/project/repository/ProjectRepository.java @@ -27,5 +27,7 @@ public interface ProjectRepository extends JpaRepository { @Query("SELECT p FROM Project p " + "WHERE (p.initiator = :user OR p.participant = :user) AND p.status = :status") List findByInitiatorOrParticipantAndStatus(@Param("user") User user, @Param("status") Status status); + + List findByInitiatorOrParticipant(User initiator, User participant); } diff --git a/src/main/java/com/hotsix/server/project/service/ProjectService.java b/src/main/java/com/hotsix/server/project/service/ProjectService.java index 6ba29cb..b032a1f 100644 --- a/src/main/java/com/hotsix/server/project/service/ProjectService.java +++ b/src/main/java/com/hotsix/server/project/service/ProjectService.java @@ -2,7 +2,8 @@ import com.hotsix.server.aws.manager.AmazonS3Manager; -import com.hotsix.server.project.dto.ProjectStatusUpdateRequestDto; +import com.hotsix.server.global.Rq.Rq; +import com.hotsix.server.project.dto.*; import com.hotsix.server.project.entity.Category; import com.hotsix.server.project.entity.ProjectImage; import com.hotsix.server.project.exception.ProjectErrorCase; @@ -10,11 +11,8 @@ import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import com.hotsix.server.project.dto.ProjectFileResponseDto; import com.hotsix.server.global.exception.ApplicationException; -import com.hotsix.server.project.dto.ProjectRequestDto; -import com.hotsix.server.project.dto.ProjectResponseDto; import com.hotsix.server.project.dto.ProjectStatusUpdateRequestDto; import com.hotsix.server.project.entity.Project; import com.hotsix.server.project.entity.Status; @@ -35,6 +33,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -46,6 +45,7 @@ public class ProjectService { private final UserRepository userRepository; private final AmazonS3Manager amazonS3Manager; private final BookmarkService bookmarkService; + private final Rq rq; @Transactional public ProjectResponseDto registerProject(Long currentUserId, ProjectRequestDto dto, List images) { @@ -293,4 +293,12 @@ public Long getProjectCreatorId(Long projectId) { return project.getInitiator().getUserId(); } + public List getProjectsByUser() { + User actor = rq.getUser(); + List projects = projectRepository.findByInitiatorOrParticipant(actor, actor); + + return projects.stream() + .map(ProjectSummaryResponse::from) + .collect(Collectors.toList()); + } } \ No newline at end of file diff --git a/src/main/java/com/hotsix/server/user/controller/UserController.java b/src/main/java/com/hotsix/server/user/controller/UserController.java index 0424441..9c25039 100644 --- a/src/main/java/com/hotsix/server/user/controller/UserController.java +++ b/src/main/java/com/hotsix/server/user/controller/UserController.java @@ -162,5 +162,4 @@ public CommonResponse uploadProfileImage(@RequestParam("file") Multipart imageUrl ); } - }