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 @@ -2,17 +2,22 @@

import com.example.PING.component.dto.response.ComponentTreeResponse;
import com.example.PING.component.service.ComponentService;
import com.example.PING.image.S3ImageService;
import com.example.PING.portfolio.dto.request.PortfolioCreateRequest;
import com.example.PING.portfolio.dto.request.PortfolioUpdateRequest;
import com.example.PING.portfolio.dto.response.PortfolioCreateResponse;
import com.example.PING.portfolio.dto.response.PortfolioResponse;
import com.example.PING.portfolio.dto.response.PortfolioDemoResponse;
import com.example.PING.portfolio.dto.response.PortfolioPageResponse;
import com.example.PING.portfolio.dto.response.PortfolioUpdateResponse;
import com.example.PING.portfolio.service.PortfolioService;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;
Expand All @@ -24,6 +29,7 @@ public class PortfolioController {

private final PortfolioService portfolioService;
private final ComponentService componentService;
private final S3ImageService s3ImageService;


// (포트폴리오 생성) 새 포트폴리오 생성
Expand All @@ -33,24 +39,25 @@ public ResponseEntity<PortfolioCreateResponse> createPortfolio(@RequestBody Port
return ResponseEntity.status(HttpStatus.CREATED).body(response);
}

// @RequestBody(content = @Content(
// encoding = @Encoding(name = "request", contentType = MediaType.APPLICATION_JSON_VALUE)))
// @PostMapping(value = "/file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
// public Test.Response uploadFile(
// @RequestPart("files") @NotEmpty List<MultipartFile> files,
// @RequestPart("request") @Valid Test.Request request
// ) {
// mockFileUploadService.upload(files, request);
// return new Test.Response("success");
// }

// (마이페이지_포트폴리오 조회) 특정 포트폴리오의 (내워크스페이스) 데모 조회
@GetMapping("/demo/{portfolio_id}")
public ResponseEntity<PortfolioDemoResponse> getPortfolioDemo(@PathVariable("portfolio_id") Long portfolioId) {
PortfolioDemoResponse response = portfolioService.getPortfolioDemo(portfolioId);
return ResponseEntity.ok(response);
}

// (전체 포트폴리오 조회) 포트폴리오의 특정 페이지 조회 (최신순 / 좋아요순)
@GetMapping("/page")
public ResponseEntity<PortfolioPageResponse> getSortedPortfolios(
@RequestParam(defaultValue = "0") int page, // 페이지 번호
@RequestParam(defaultValue = "50") int size, // 한 페이지에서 가져올 Portfolio 개수
@RequestParam(defaultValue = "latest") String sort) { // "latest" or "likes"
Pageable pageable = PageRequest.of(page, size);
PortfolioPageResponse response = portfolioService.getPortfoliosSorted(pageable, sort);

return ResponseEntity.ok(response);
}

// (포트폴리오 상세 조회) 특정 포트폴리오의 세부 내용 조회
@GetMapping("/{portfolio_id}")
public ResponseEntity<ComponentTreeResponse> getPortfolioComponentTree(@PathVariable("portfolio_id") Long portfolioId) {
Expand All @@ -63,11 +70,13 @@ public ResponseEntity<ComponentTreeResponse> getPortfolioComponentTree(@PathVari
}

// (포트폴리오 수정) 포트폴리오 타이틀 이미지 변경
@PutMapping("/title_img/{portfolio_id}")
public ResponseEntity<PortfolioUpdateResponse> updatePortfolio(
@PutMapping(value = "/title_img/{portfolio_id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "포트폴리오 타이틀 이미지 변경")
public ResponseEntity<PortfolioUpdateResponse> updatePortfolioTitleImg(
@PathVariable("portfolio_id") Long portfolioId,
@RequestBody PortfolioUpdateRequest portfolioUpdateRequest) {
PortfolioUpdateResponse response = portfolioService.updatePortfolio(portfolioId, portfolioUpdateRequest);
@RequestPart(value = "image", required = false) MultipartFile image) {
String imageURL = s3ImageService.upload(image);
PortfolioUpdateResponse response = portfolioService.updatePortfolioTitleImg(portfolioId, imageURL);
return ResponseEntity.ok(response);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.example.PING.portfolio.dto.response;

import com.example.PING.portfolio.entity.Portfolio;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.data.domain.Page;

import java.util.List;

@Getter
@AllArgsConstructor
public class PortfolioPageResponse {
private List<PortfolioResponse> portfolios; // Portfolio List
private int totalPages; // 총 페이지 수
private long totalElements; // 페이지 내 Portfolio 수
private int currentPage; // 현재 페이지 번호

public static PortfolioPageResponse from(List<PortfolioResponse> portfolioResponses, Page<Portfolio> portfolioPage) {
return new PortfolioPageResponse(
portfolioResponses,
portfolioPage.getTotalPages(),
portfolioPage.getTotalElements(),
portfolioPage.getNumber()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.example.PING.domain.entity.Domain;
import com.example.PING.portfolio.entity.Portfolio;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

Expand All @@ -10,4 +12,6 @@ public interface PortfolioRepository extends JpaRepository<Portfolio, Long> {
Portfolio findByDomain(Domain domain);
// 추가적인 쿼리 메서드를 정의할 수 있습니다.
// List<Portfolio> findByUserId(Long userId);
Page<Portfolio> findAllByOrderByCreatedAtDesc(Pageable pageable); // 최신순 정렬
Page<Portfolio> findAllByOrderByLikesDesc(Pageable pageable); // 좋아요순 정렬
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.example.PING.component.repository.ComponentRepository;
import com.example.PING.domain.repository.DomainRepository;
import com.example.PING.portfolio.dto.request.PortfolioCreateRequest;
import com.example.PING.portfolio.dto.request.PortfolioUpdateRequest;
import com.example.PING.portfolio.dto.response.*;
import com.example.PING.portfolio.entity.Portfolio;
import com.example.PING.portfolio.repository.PortfolioRepository;
Expand All @@ -13,9 +12,14 @@
import com.example.PING.user.entity.User;
import com.example.PING.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class PortfolioService {
Expand Down Expand Up @@ -60,17 +64,21 @@ public PortfolioDemoResponse getPortfolioDemo(Long portfolioId) {
return PortfolioDemoResponse.from(portfolio);
}

// // 특정 사용자의 포트폴리오 리스트 조회
// @Transactional(readOnly = true)
// public UserPortfoliosResponse getUserPortfolios(Long userId) {
//
// List<PortfolioResponse> portfolios = portfolioRepository.findAll().stream()
// .filter(portfolio -> portfolio.getUser().getUserId().equals(userId))
// .map(PortfolioResponse::from)
// .collect(Collectors.toList());
//
// return new UserPortfoliosResponse(userId, portfolios);
// }
// 전체 포트폴리오의 특정 페이지 조회 (최신순 / 좋아요순)
@Transactional(readOnly = true)
public PortfolioPageResponse getPortfoliosSorted(Pageable pageable, String sort) {
Page<Portfolio> portfolioPage;
if (sort.equals("likes")) { // 좋아요순
portfolioPage = portfolioRepository.findAllByOrderByLikesDesc(pageable);
} else { // 최신순(default)
portfolioPage = portfolioRepository.findAllByOrderByCreatedAtDesc(pageable);
}
List<PortfolioResponse> portfolioResponses = portfolioPage.getContent().stream()
.map(PortfolioResponse::from)
.collect(Collectors.toList());

return PortfolioPageResponse.from(portfolioResponses, portfolioPage);
}


@Transactional(readOnly = true)
Expand All @@ -81,12 +89,12 @@ public PortfolioResponse getPortfolioById(Long portfolioId) {
}

@Transactional
public PortfolioUpdateResponse updatePortfolio(Long portfolioId, PortfolioUpdateRequest portfolioUpdateRequest) {
public PortfolioUpdateResponse updatePortfolioTitleImg(Long portfolioId, String imageURL) {
Portfolio portfolio = portfolioRepository.findById(portfolioId)
.orElseThrow(() -> new IllegalArgumentException("Portfolio not found with ID: " + portfolioId));

// @Transactional의 DirtyChecking으로 save 없이 수정 사항 DB에 반영
portfolio.updatePortfolioTitleImg(portfolioUpdateRequest.titleImg());
portfolio.updatePortfolioTitleImg(imageURL);
return PortfolioUpdateResponse.from(portfolio);
}

Expand Down