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 @@ -16,6 +16,8 @@
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
Expand Down Expand Up @@ -44,10 +46,9 @@ public ResponseEntity<BaseResponse> getBlogList(
@RequestParam(required = false) Integer generation,
@RequestParam(required = false) Position position,
@RequestParam(required = false) Category category,
@RequestParam(required = false) Long lastId,
@RequestParam(defaultValue = "10") int size
Pageable pageable
) {
List<BlogResponse> result = blogService.getFilteredPostsWithPaging(generation, position, category, lastId, size);
Page<BlogResponse> result = blogService.getFilteredPostsWithPaging(generation, position, category, pageable);
return ResponseEntity.ok(new BaseResponse(result));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.kusitms.website.domain.blog.entity.BlogAuthor;
import com.kusitms.website.domain.blog.entity.BlogPost;
import com.kusitms.website.domain.blog.entity.Category;
import com.querydsl.core.annotations.QueryProjection;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;

Expand All @@ -12,32 +13,45 @@
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BlogResponse {
@JsonProperty("blog_post_id")
@Schema(description = "블로그 글 아이디")
private Long id;
@Schema(description = "블로그 글 제목")
private String title;
@Schema(description = "블로그 카테고리 이름")
private Category category;
@Schema(description = "블로그 주소")
private String address;
@Schema(description = "블로그 이미지 주소")
private String imageAddress;
@Schema(description = "블로그 글 내용")
private String content;
@Schema(description = "활동명")
private String categoryName;
@Schema(description = "기수")
private Integer cardinal;
@Schema(description = "파트명")
private String position;

public static BlogResponse fromEntity(BlogPost post) {
return BlogResponse.builder()
.id(post.getId())
.title(post.getTitle())
.category(post.getCategory())
.address(post.getAddress())
.imageAddress(post.getImageAddress())
.content(post.getContent())
.build();
@QueryProjection
public BlogResponse(Long id,
String title,
String address,
String imageAddress,
String content,
String categoryName,
Integer cardinal,
String position) {
this.id = id;
this.title = title;
this.address = address;
this.imageAddress = imageAddress;
this.content = content;
this.categoryName = categoryName;
this.cardinal = cardinal;
this.position = position;
}




}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.kusitms.website.domain.blog.repository;

import com.kusitms.website.domain.blog.dto.response.BlogResponse;
import com.kusitms.website.domain.blog.entity.BlogPost;
import com.kusitms.website.domain.blog.entity.Category;
import com.kusitms.website.domain.blog.entity.Position;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;

public interface BlogPostQueryRepository {
List<BlogPost> findByFiltersWithPaging(Integer generation, Position position, Category category, Long lastId, int size);
Page<BlogResponse> findByFiltersWithPaging(Integer generation, Position position, Category category, Pageable pageable);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
package com.kusitms.website.domain.blog.repository;

import com.kusitms.website.domain.blog.dto.response.BlogResponse;
import com.kusitms.website.domain.blog.entity.*;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.CaseBuilder;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Repository;

import java.util.List;
Expand All @@ -15,7 +21,7 @@ public class BlogPostQueryRepositoryImpl implements BlogPostQueryRepository {
private final QBlogAuthor blogAuthor = QBlogAuthor.blogAuthor;

@Override
public List<BlogPost> findByFiltersWithPaging(Integer generation, Position position, Category category, Long lastId, int size) {
public Page<BlogResponse> findByFiltersWithPaging(Integer generation, Position position, Category category, Pageable pageable) {

BooleanBuilder builder = new BooleanBuilder();

Expand All @@ -31,16 +37,46 @@ public List<BlogPost> findByFiltersWithPaging(Integer generation, Position posit
builder.and(blogPost.category.eq(category));
}

if (lastId != null) {
builder.and(blogPost.id.lt(lastId));
}

return queryFactory
.selectFrom(blogPost)
List<BlogResponse> results = queryFactory
.select(Projections.constructor(
BlogResponse.class,
blogPost.id,
blogPost.title,
blogPost.address,
blogPost.imageAddress,
blogPost.content,
new CaseBuilder()
.when(blogPost.category.eq(Category.DOCUMENT)).then(Category.DOCUMENT.getDescription())
.when(blogPost.category.eq(Category.INTERVIEW)).then(Category.INTERVIEW.getDescription())
.when(blogPost.category.eq(Category.GIFT)).then(Category.GIFT.getDescription())
.when(blogPost.category.eq(Category.MEETUP)).then(Category.MEETUP.getDescription())
.when(blogPost.category.eq(Category.GROUP_TF)).then(Category.GROUP_TF.getDescription())
.otherwise("기타"),
blogAuthor.generation,
// Position → description
new CaseBuilder()
.when(blogAuthor.position.eq(Position.FRONTEND)).then(Position.FRONTEND.getDescription())
.when(blogAuthor.position.eq(Position.BACKEND)).then(Position.BACKEND.getDescription())
.when(blogAuthor.position.eq(Position.PLAN)).then(Position.PLAN.getDescription())
.when(blogAuthor.position.eq(Position.DESIGNER)).then(Position.DESIGNER.getDescription())
.otherwise("기타")
))
.from(blogPost)
.join(blogPost.blogAuthor, blogAuthor)
.where(builder)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.orderBy(blogPost.id.desc())
.limit(size)
.fetch();

// ② total count 조회
long total = queryFactory
.select(blogPost.count())
.from(blogPost)
.join(blogPost.blogAuthor, blogAuthor)
.where(builder)
.fetchOne();

return new PageImpl<>(results, pageable, total);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import com.kusitms.website.domain.blog.repository.BlogPostQueryRepository;
import com.kusitms.website.domain.blog.repository.BlogPostRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.List;
Expand All @@ -18,16 +20,12 @@ public class BlogService {

private final BlogPostRepository blogPostRepository;

public List<BlogResponse> getFilteredPostsWithPaging(
public Page<BlogResponse> getFilteredPostsWithPaging(
Integer generation,
Position position,
Category category,
Long lastId,
int size
Pageable pageable
) {
return blogPostRepository.findByFiltersWithPaging(generation, position, category, lastId, size)
.stream()
.map(BlogResponse::fromEntity)
.collect(Collectors.toList());
return blogPostRepository.findByFiltersWithPaging(generation, position, category, pageable);
}
}
Loading