Skip to content

Commit c0cc703

Browse files
authored
Merge pull request #67 from konkuk-icteam-student/feat/faq
[feat] faq 수정 시 하루 1개 기록만 유지하도록 개선
2 parents b04bf25 + 35668ec commit c0cc703

File tree

14 files changed

+66
-112
lines changed

14 files changed

+66
-112
lines changed

src/main/java/com/better/CommuteMate/domain/faq/entity/Faq.java

Lines changed: 16 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import jakarta.persistence.*;
66
import lombok.*;
77

8+
import java.time.LocalDate;
89
import java.time.LocalDateTime;
910

1011
@Entity
@@ -40,8 +41,8 @@ public class Faq {
4041
@JoinColumn(name = "category_id", nullable = false)
4142
private Category category;
4243

43-
@Column(name = "created_at", nullable = false)
44-
private LocalDateTime createdAt;
44+
@Column(name = "updated_date", nullable = false)
45+
private LocalDate updatedDate;
4546

4647
@Column(name = "deleted_flag", nullable = false)
4748
private Boolean deletedFlag;
@@ -51,32 +52,13 @@ public class Faq {
5152

5253
@PrePersist
5354
protected void onCreate() {
54-
this.createdAt = LocalDateTime.now();
55+
this.updatedDate = LocalDate.now();
5556
this.deletedFlag = false;
5657
}
5758

5859
@PreUpdate
5960
void onUpdate() {
60-
this.createdAt = LocalDateTime.now();
61-
}
62-
63-
@Builder
64-
private Faq(
65-
String title,
66-
String complainantName,
67-
String content,
68-
String answer,
69-
String etc,
70-
User writer,
71-
Category category
72-
) {
73-
this.title = title;
74-
this.complainantName = complainantName;
75-
this.content = content;
76-
this.answer = answer;
77-
this.etc = etc;
78-
this.writer = writer;
79-
this.category = category;
61+
this.updatedDate = LocalDate.now();
8062
}
8163

8264
public static Faq create(
@@ -85,18 +67,18 @@ public static Faq create(
8567
String content,
8668
String answer,
8769
String etc,
88-
User writer,
89-
Category category
70+
Category category,
71+
User writer
9072
) {
91-
return Faq.builder()
92-
.title(title)
93-
.complainantName(complainantName)
94-
.content(content)
95-
.answer(answer)
96-
.etc(etc)
97-
.writer(writer)
98-
.category(category)
99-
.build();
73+
Faq faq = new Faq();
74+
faq.title = title;
75+
faq.complainantName = complainantName;
76+
faq.content = content;
77+
faq.answer = answer;
78+
faq.etc = etc;
79+
faq.category = category;
80+
faq.writer = writer;
81+
return faq;
10082
}
10183

10284
public void update(

src/main/java/com/better/CommuteMate/domain/faq/entity/FaqHistory.java

Lines changed: 17 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import jakarta.persistence.*;
44
import lombok.*;
55

6+
import java.time.LocalDate;
67
import java.time.LocalDateTime;
78
import java.util.List;
89

@@ -43,7 +44,7 @@ public class FaqHistory {
4344
private String writerName; // 작성자 이름
4445

4546
@Column(name = "edited_at", nullable = false)
46-
private LocalDateTime editedAt; // 수정된 날짜
47+
private LocalDate editedAt; // 수정된 날짜
4748

4849
@Column(name = "category_name", length = 100, nullable = false)
4950
private String categoryName; // 분류명
@@ -55,48 +56,24 @@ public class FaqHistory {
5556

5657
@PrePersist
5758
protected void onCreate() {
58-
this.editedAt = LocalDateTime.now();
59-
}
60-
61-
@Builder
62-
private FaqHistory(
63-
Faq faq,
64-
String title,
65-
String complainantName,
66-
String content,
67-
String answer,
68-
String etc,
69-
String writerName,
70-
List<String> managerNames,
71-
String categoryName
72-
) {
73-
this.faq = faq;
74-
this.title = title;
75-
this.complainantName = complainantName;
76-
this.content = content;
77-
this.answer = answer;
78-
this.etc = etc;
79-
this.writerName = writerName;
80-
this.managerNames = managerNames;
81-
this.categoryName = categoryName;
82-
this.editedAt = LocalDateTime.now();
59+
this.editedAt = LocalDate.now();
8360
}
8461

8562
public static FaqHistory create(Faq faq) {
86-
return FaqHistory.builder()
87-
.faq(faq)
88-
.title(faq.getTitle())
89-
.complainantName(faq.getComplainantName())
90-
.content(faq.getContent())
91-
.answer(faq.getAnswer())
92-
.etc(faq.getEtc())
93-
.writerName(faq.getWriter().getName())
94-
.managerNames(faq.getCategory().getManagers()
95-
.stream()
96-
.map(mc -> mc.getManager().getName())
97-
.toList())
98-
.categoryName(faq.getCategory().getName())
99-
.build();
63+
FaqHistory history = new FaqHistory();
64+
history.faq = faq;
65+
history.title = faq.getTitle();
66+
history.complainantName = faq.getComplainantName();
67+
history.content = faq.getContent();
68+
history.answer = faq.getAnswer();
69+
history.etc = faq.getEtc();
70+
history.writerName = faq.getWriter().getName();
71+
history.managerNames = faq.getCategory().getManagers()
72+
.stream()
73+
.map(mc -> mc.getManager().getName())
74+
.toList();
75+
history.categoryName = faq.getCategory().getName();
76+
return history;
10077
}
10178

10279
}
Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,14 @@
11
package com.better.CommuteMate.domain.faq.repository;
22

3-
import com.better.CommuteMate.domain.faq.entity.Faq;
43
import com.better.CommuteMate.domain.faq.entity.FaqHistory;
54
import org.springframework.data.jpa.repository.JpaRepository;
65
import org.springframework.stereotype.Repository;
76

8-
import java.util.List;
7+
import java.time.LocalDate;
98

109
@Repository
1110
public interface FaqHistoryRepository extends JpaRepository<FaqHistory, Long> {
1211

13-
// 특정 FAQ에 대한 모든 히스토리 조회
14-
List<FaqHistory> findByFaq(Faq faq);
12+
void deleteByFaqIdAndEditedAt(Long faqId, LocalDate editedAt);
1513

16-
// FAQ ID로 히스토리 조회 (필요 시)
17-
List<FaqHistory> findByFaqId(Long faqId);
18-
19-
// 최신 수정 이력 하나만 조회 (ex. 최근 변경 로그)
20-
FaqHistory findTopByFaqIdOrderByEditedAtDesc(Long faqId);
2114
}

src/main/java/com/better/CommuteMate/domain/faq/repository/FaqQueryRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.better.CommuteMate.domain.faq.repository;
22

33
import com.better.CommuteMate.domain.faq.entity.Faq;
4-
import com.better.CommuteMate.faq.dto.request.FaqSearchScope;
4+
import com.better.CommuteMate.faq.application.dto.request.FaqSearchScope;
55
import org.springframework.data.domain.Page;
66
import org.springframework.data.domain.Pageable;
77

src/main/java/com/better/CommuteMate/domain/faq/repository/FaqQueryRepositoryImpl.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import com.better.CommuteMate.domain.faq.entity.Faq;
55
import com.better.CommuteMate.domain.faq.entity.QFaq;
66
import com.better.CommuteMate.domain.manager.entity.QManager;
7-
import com.better.CommuteMate.faq.dto.request.FaqSearchScope;
7+
import com.better.CommuteMate.faq.application.dto.request.FaqSearchScope;
88
import com.querydsl.core.BooleanBuilder;
99
import com.querydsl.jpa.JPAExpressions;
1010
import com.querydsl.jpa.impl.JPAQueryFactory;
@@ -60,17 +60,18 @@ public Page<Faq> searchFaqs( Long teamId, Long categoryId, String keyword, FaqSe
6060
}
6161

6262
if (startDate != null) {
63-
where.and(faq.createdAt.goe(startDate.atStartOfDay()));
63+
where.and(faq.updatedDate.goe(startDate));
6464
}
65+
6566
if (endDate != null) {
66-
where.and(faq.createdAt.loe(endDate.atTime(23, 59, 59)));
67+
where.and(faq.updatedDate.loe(endDate));
6768
}
6869

6970
List<Faq> contents = queryFactory
7071
.selectFrom(faq)
7172
.join(faq.category).fetchJoin()
7273
.where(where)
73-
.orderBy(faq.createdAt.desc())
74+
.orderBy(faq.updatedDate.desc())
7475
.offset(pageable.getOffset())
7576
.limit(pageable.getPageSize())
7677
.fetch();

src/main/java/com/better/CommuteMate/faq/application/FaqService.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,19 @@
22

33
import com.better.CommuteMate.domain.category.entity.Category;
44
import com.better.CommuteMate.domain.category.repository.CategoryRepository;
5-
import com.better.CommuteMate.domain.faq.repository.FaqQueryRepository;
6-
import com.better.CommuteMate.faq.dto.request.FaqSearchScope;
7-
import com.better.CommuteMate.faq.dto.request.PostFaqRequest;
8-
import com.better.CommuteMate.faq.dto.request.PutFaqUpdateRequest;
5+
import com.better.CommuteMate.faq.application.dto.request.FaqSearchScope;
6+
import com.better.CommuteMate.faq.application.dto.request.PostFaqRequest;
7+
import com.better.CommuteMate.faq.application.dto.request.PutFaqUpdateRequest;
98
import com.better.CommuteMate.domain.faq.entity.Faq;
109
import com.better.CommuteMate.domain.faq.entity.FaqHistory;
1110
import com.better.CommuteMate.domain.faq.repository.FaqHistoryRepository;
1211
import com.better.CommuteMate.domain.faq.repository.FaqRepository;
1312
import com.better.CommuteMate.domain.user.entity.User;
1413
import com.better.CommuteMate.domain.user.repository.UserRepository;
15-
import com.better.CommuteMate.faq.dto.response.GetFaqListResponse;
16-
import com.better.CommuteMate.faq.dto.response.GetFaqListWrapper;
17-
import com.better.CommuteMate.faq.dto.response.PostFaqResponse;
18-
import com.better.CommuteMate.faq.dto.response.PutFaqUpdateResponse;
14+
import com.better.CommuteMate.faq.application.dto.response.GetFaqListResponse;
15+
import com.better.CommuteMate.faq.application.dto.response.GetFaqListWrapper;
16+
import com.better.CommuteMate.faq.application.dto.response.PostFaqResponse;
17+
import com.better.CommuteMate.faq.application.dto.response.PutFaqUpdateResponse;
1918
import com.better.CommuteMate.global.exceptions.BasicException;
2019
import com.better.CommuteMate.global.exceptions.CategoryException;
2120
import com.better.CommuteMate.global.exceptions.FaqException;
@@ -56,8 +55,8 @@ public PostFaqResponse createFaq(Long userId, PostFaqRequest request) {
5655
request.content(),
5756
request.answer(),
5857
request.etc(),
59-
writer,
60-
category
58+
category,
59+
writer
6160
);
6261

6362
faqRepository.save(faq);
@@ -97,6 +96,8 @@ public PutFaqUpdateResponse updateFaq(Long userId, Long faqId, PutFaqUpdateReque
9796

9897
faqRepository.save(faq);
9998

99+
faqHistoryRepository.deleteByFaqIdAndEditedAt(faqId, LocalDate.now());
100+
100101
FaqHistory faqhistory = FaqHistory.create(faq);
101102
faqHistoryRepository.save(faqhistory);
102103

src/main/java/com/better/CommuteMate/faq/dto/request/FaqSearchScope.java renamed to src/main/java/com/better/CommuteMate/faq/application/dto/request/FaqSearchScope.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.better.CommuteMate.faq.dto.request;
1+
package com.better.CommuteMate.faq.application.dto.request;
22

33
public enum FaqSearchScope {
44
TITLE_CONTENT,

src/main/java/com/better/CommuteMate/faq/dto/request/PostFaqRequest.java renamed to src/main/java/com/better/CommuteMate/faq/application/dto/request/PostFaqRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.better.CommuteMate.faq.dto.request;
1+
package com.better.CommuteMate.faq.application.dto.request;
22

33
import io.swagger.v3.oas.annotations.media.Schema;
44
import jakarta.validation.constraints.NotBlank;

src/main/java/com/better/CommuteMate/faq/dto/request/PutFaqUpdateRequest.java renamed to src/main/java/com/better/CommuteMate/faq/application/dto/request/PutFaqUpdateRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.better.CommuteMate.faq.dto.request;
1+
package com.better.CommuteMate.faq.application.dto.request;
22

33
import io.swagger.v3.oas.annotations.media.Schema;
44
import jakarta.validation.constraints.NotBlank;

src/main/java/com/better/CommuteMate/faq/dto/response/GetFaqListResponse.java renamed to src/main/java/com/better/CommuteMate/faq/application/dto/response/GetFaqListResponse.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package com.better.CommuteMate.faq.dto.response;
1+
package com.better.CommuteMate.faq.application.dto.response;
22

33
import com.better.CommuteMate.domain.faq.entity.Faq;
44
import io.swagger.v3.oas.annotations.media.Schema;
55
import lombok.Getter;
66

7-
import java.time.LocalDateTime;
7+
import java.time.LocalDate;
88

99
@Schema(description = "FAQ 목록 조회 응답 DTO")
1010
@Getter
@@ -16,16 +16,16 @@ public class GetFaqListResponse {
1616
@Schema(description = "faq 제목", example = "학정시 로그인 오륲")
1717
private final String title;
1818

19-
@Schema(description = "faq 작성 날짜 (수정된 경우 최근 수정 날짜)", example = "2025-01-25T13:20:00")
20-
private final LocalDateTime createdAt;
19+
@Schema(description = "faq 작성 날짜 (수정된 경우 최근 수정 날짜)", example = "2025-01-25")
20+
private final LocalDate updatedDate;
2121

2222
@Schema(description = "faq 삭제 여부", example = "true")
2323
private final Boolean deletedFlag;
2424

2525
public GetFaqListResponse(Faq faq) {
2626
this.faqId = faq.getId();
2727
this.title = faq.getTitle();
28-
this.createdAt = faq.getCreatedAt();
28+
this.updatedDate = faq.getUpdatedDate();
2929
this.deletedFlag = faq.getDeletedFlag();
3030
}
3131
}

0 commit comments

Comments
 (0)