Skip to content

Commit 4c6d68a

Browse files
2tleCopilot
andauthored
[FEAT] IsKeyNoteSpeech 플래그 추가 (#168)
* feat: iskeynotespeech flag 추가 * Update src/main/java/com/scg/stop/video/domain/Talk.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: 버그 수정 * fix: 버그 수정 --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 52144c9 commit 4c6d68a

27 files changed

Lines changed: 804 additions & 653 deletions

src/main/java/com/scg/stop/video/controller/TalkController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@ public ResponseEntity<TalkResponse> createTalk(
4343
public ResponseEntity<Page<TalkUserResponse>> getAllTalks(
4444
@RequestParam(value = "title", required = false) String title,
4545
@RequestParam(value = "year", required = false) Integer year,
46+
@RequestParam(value = "isKeynoteSpeech", required = false) Boolean isKeynoteSpeech,
4647
@AuthUser(accessType = {AccessType.OPTIONAL}) User user,
4748
@PageableDefault(page = 0, size = 10) Pageable pageable
4849
) {
49-
Page<TalkUserResponse> talks = talkService.getTalks(user, title, year, pageable);
50+
Page<TalkUserResponse> talks = talkService.getTalks(user, title, year, isKeynoteSpeech, pageable);
5051
return ResponseEntity.status(HttpStatus.OK).body(talks);
5152
}
5253

src/main/java/com/scg/stop/video/domain/Talk.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,33 +36,47 @@ public class Talk extends BaseTimeEntity {
3636
@Column(nullable = false)
3737
private String talkerName;
3838

39+
@Column(name = "is_keynote_speech", nullable = true)
40+
private Boolean keynoteSpeech = false;
41+
3942
@OneToOne(fetch = LAZY, mappedBy = "talk", cascade = CascadeType.REMOVE, orphanRemoval = true)
4043
private Quiz quiz;
4144

4245
@OneToMany(fetch = LAZY, mappedBy = "talk", cascade = CascadeType.REMOVE, orphanRemoval = true)
4346
private List<FavoriteVideo> favoriteVideos;
4447

45-
public Talk(String title, String youtubeId, Integer year, String talkerBelonging, String talkerName) {
48+
public Talk(
49+
String title,
50+
String youtubeId,
51+
Integer year,
52+
String talkerBelonging,
53+
String talkerName,
54+
Boolean keynoteSpeech
55+
) {
4656
this.title = title;
4757
this.youtubeId = youtubeId;
4858
this.year = year;
4959
this.talkerBelonging = talkerBelonging;
5060
this.talkerName = talkerName;
61+
this.keynoteSpeech = keynoteSpeech != null ? keynoteSpeech : false;
5162
this.favoriteVideos = new ArrayList<>();
5263
}
64+
5365
public static Talk from(
5466
String title,
5567
String youtubeId,
5668
Integer year,
5769
String talkerBelonging,
58-
String talkerName
70+
String talkerName,
71+
Boolean keynoteSpeech
5972
) {
6073
return new Talk(
6174
title,
6275
youtubeId,
6376
year,
6477
talkerBelonging,
65-
talkerName
78+
talkerName,
79+
keynoteSpeech
6680
);
6781
}
6882

@@ -71,13 +85,19 @@ public void updateTalk(
7185
String youtubeId,
7286
Integer year,
7387
String talkerBelonging,
74-
String talkerName
88+
String talkerName,
89+
Boolean keynoteSpeech
7590
) {
7691
this.title= title;
7792
this.youtubeId = youtubeId;
7893
this.year = year;
7994
this.talkerBelonging = talkerBelonging;
8095
this.talkerName = talkerName;
96+
this.keynoteSpeech = keynoteSpeech != null ? keynoteSpeech : false;
97+
}
98+
99+
public boolean isKeynoteSpeech() {
100+
return Boolean.TRUE.equals(keynoteSpeech);
81101
}
82102

83103
public void setQuiz(Quiz quiz) {

src/main/java/com/scg/stop/video/dto/request/TalkRequest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.scg.stop.video.dto.request;
22

33
import com.fasterxml.jackson.annotation.JsonUnwrapped;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
45
import com.scg.stop.video.domain.Talk;
56
import jakarta.validation.Valid;
67
import jakarta.validation.constraints.*;
@@ -29,11 +30,14 @@ public class TalkRequest {
2930
@NotBlank(message = "대담자의 성명을 입력해주세요.")
3031
public String talkerName;
3132

33+
@JsonProperty("isKeynoteSpeech")
34+
private Boolean keynoteSpeech;
35+
3236
@JsonUnwrapped
3337
@Valid
3438
public QuizRequest quiz;
3539

3640
public Talk toEntity() {return Talk.from(
37-
title, youtubeId, year, talkerBelonging, talkerName
41+
title, youtubeId, year, talkerBelonging, talkerName, keynoteSpeech
3842
); }
3943
}

src/main/java/com/scg/stop/video/dto/response/TalkResponse.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.scg.stop.video.dto.response;
22

33
import com.fasterxml.jackson.annotation.JsonUnwrapped;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
45
import com.scg.stop.video.domain.Talk;
56
import lombok.AllArgsConstructor;
67
import lombok.Getter;
@@ -16,6 +17,8 @@ public class TalkResponse {
1617
public Integer year;
1718
public String talkerBelonging;
1819
public String talkerName;
20+
@JsonProperty("isKeynoteSpeech")
21+
private Boolean keynoteSpeech;
1922

2023
@JsonUnwrapped
2124
public QuizResponse quiz;
@@ -32,6 +35,7 @@ public static TalkResponse from(Talk talk) {
3235
talk.getYear(),
3336
talk.getTalkerBelonging(),
3437
talk.getTalkerName(),
38+
talk.getKeynoteSpeech(),
3539
(talk.getQuiz() != null)? QuizResponse.from(talk.getQuiz()) : new QuizResponse(),
3640
talk.getCreatedAt(),
3741
talk.getUpdatedAt()

src/main/java/com/scg/stop/video/dto/response/TalkUserResponse.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.scg.stop.video.dto.response;
22

33
import com.fasterxml.jackson.annotation.JsonUnwrapped;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
45
import com.scg.stop.video.domain.Talk;
56
import lombok.AllArgsConstructor;
67
import lombok.Getter;
@@ -16,6 +17,8 @@ public class TalkUserResponse {
1617
public Integer year;
1718
public String talkerBelonging;
1819
public String talkerName;
20+
@JsonProperty("isKeynoteSpeech")
21+
private Boolean keynoteSpeech;
1922
public boolean favorite;
2023

2124
@JsonUnwrapped
@@ -32,6 +35,7 @@ public static TalkUserResponse from(Talk talk) {
3235
talk.getYear(),
3336
talk.getTalkerBelonging(),
3437
talk.getTalkerName(),
38+
talk.getKeynoteSpeech(),
3539
false,
3640
(talk.getQuiz() != null)? QuizResponse.from(talk.getQuiz()) : new QuizResponse(),
3741
talk.getCreatedAt(),
@@ -47,6 +51,7 @@ public static TalkUserResponse from(Talk talk, boolean favorite) {
4751
talk.getYear(),
4852
talk.getTalkerBelonging(),
4953
talk.getTalkerName(),
54+
talk.getKeynoteSpeech(),
5055
favorite,
5156
(talk.getQuiz() != null)? QuizResponse.from(talk.getQuiz()) : new QuizResponse(),
5257
talk.getCreatedAt(),

src/main/java/com/scg/stop/video/repository/TalkRepository.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.scg.stop.video.repository;
22

33
import com.scg.stop.video.domain.Talk;
4-
import com.scg.stop.video.dto.response.TalkResponse;
54
import org.springframework.data.domain.Page;
65
import org.springframework.data.domain.Pageable;
76
import org.springframework.data.jpa.repository.JpaRepository;
@@ -12,11 +11,13 @@ public interface TalkRepository extends JpaRepository<Talk, Long> {
1211

1312
@Query("SELECT t from Talk t "+
1413
"WHERE (:year IS NULL OR t.year = :year) " +
15-
"AND (:title IS NULL OR t.title LIKE %:title%)" +
14+
"AND (:title IS NULL OR t.title LIKE %:title%) " +
15+
"AND ((:isKeynoteSpeech IS NULL AND t.keynoteSpeech = false) OR t.keynoteSpeech = :isKeynoteSpeech) " +
1616
"ORDER BY t.year DESC")
1717
Page<Talk> findPages(
1818
@Param("title") String title,
1919
@Param("year") Integer year,
20+
@Param("isKeynoteSpeech") Boolean isKeynoteSpeech,
2021
Pageable pageable
2122
);
2223
}

src/main/java/com/scg/stop/video/service/TalkService.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ public class TalkService {
3030
private final FavoriteVideoRepository favoriteVideoRepository;
3131

3232
@Transactional(readOnly = true)
33-
public Page<TalkUserResponse> getTalks(User user, String title, Integer year, Pageable pageable) {
34-
Page<Talk> talks = talkRepository.findPages(title, year, pageable);
33+
public Page<TalkUserResponse> getTalks(User user, String title, Integer year, Boolean isKeynoteSpeech, Pageable pageable) {
34+
Page<Talk> talks = talkRepository.findPages(title, year, isKeynoteSpeech, pageable);
3535
if(user == null) return talks.map(TalkUserResponse::from);
3636
List<TalkUserResponse> content = talks.stream().map(talk ->
3737
TalkUserResponse.from(talk, favoriteVideoRepository.existsByTalkAndUser(talk, user))
@@ -54,7 +54,8 @@ public TalkResponse createTalk(TalkRequest talkRequest) {
5454
talkRequest.getYoutubeId(),
5555
talkRequest.getYear(),
5656
talkRequest.getTalkerBelonging(),
57-
talkRequest.getTalkerName()
57+
talkRequest.getTalkerName(),
58+
talkRequest.getKeynoteSpeech()
5859
));
5960
if(talkRequest.getQuiz().getQuiz() != null) {
6061
Quiz quiz = quizRepository.save(Quiz.from(talkRequest.getQuiz().toQuizInfoMap()));
@@ -84,7 +85,8 @@ else if(talkRequest.getQuiz().getQuiz() != null) { // 기존에 없고, 새로
8485
talkRequest.getYoutubeId(),
8586
talkRequest.getYear(),
8687
talkRequest.getTalkerBelonging(),
87-
talkRequest.getTalkerName()
88+
talkRequest.getTalkerName(),
89+
talkRequest.getKeynoteSpeech()
8890
);
8991
return TalkResponse.from(talk);
9092
}

src/main/resources/static/docs/aihub-controller-test.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -566,10 +566,8 @@ <h4 id="_http_response">HTTP response</h4>
566566
Content-Length: 1221
567567

568568
{
569-
"totalPages" : 1,
570569
"totalElements" : 2,
571-
"first" : true,
572-
"last" : true,
570+
"totalPages" : 1,
573571
"size" : 10,
574572
"content" : [ {
575573
"title" : "title",
@@ -600,6 +598,8 @@ <h4 id="_http_response">HTTP response</h4>
600598
"sorted" : false,
601599
"unsorted" : true
602600
},
601+
"first" : true,
602+
"last" : true,
603603
"numberOfElements" : 2,
604604
"pageable" : {
605605
"pageNumber" : 0,
@@ -944,10 +944,8 @@ <h4 id="_http_response">HTTP response</h4>
944944
Content-Length: 1217
945945

946946
{
947-
"totalPages" : 1,
948947
"totalElements" : 2,
949-
"first" : true,
950-
"last" : true,
948+
"totalPages" : 1,
951949
"size" : 10,
952950
"content" : [ {
953951
"title" : "title",
@@ -978,6 +976,8 @@ <h4 id="_http_response">HTTP response</h4>
978976
"sorted" : false,
979977
"unsorted" : true
980978
},
979+
"first" : true,
980+
"last" : true,
981981
"numberOfElements" : 2,
982982
"pageable" : {
983983
"pageNumber" : 0,
@@ -1206,7 +1206,7 @@ <h4 id="_response_fields">Response fields</h4>
12061206
<div id="footer">
12071207
<div id="footer-text">
12081208
Version 0.0.1-SNAPSHOT<br>
1209-
Last updated 2024-10-29 22:56:22 +0900
1209+
Last updated 2026-03-09 14:08:49 +0900
12101210
</div>
12111211
</div>
12121212
</body>

src/main/resources/static/docs/application.html

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -497,45 +497,45 @@ <h4 id="_http_response">HTTP response</h4>
497497
Vary: Access-Control-Request-Method
498498
Vary: Access-Control-Request-Headers
499499
Content-Type: application/json
500-
Content-Length: 1178
500+
Content-Length: 1196
501501

502502
{
503-
"totalPages" : 1,
504503
"totalElements" : 3,
505-
"first" : true,
506-
"last" : true,
504+
"totalPages" : 1,
507505
"size" : 10,
508506
"content" : [ {
509507
"id" : 1,
510508
"name" : "김영한",
511509
"division" : "배민",
512510
"position" : null,
513511
"userType" : "INACTIVE_COMPANY",
514-
"createdAt" : "2024-11-28T19:49:21.620883",
515-
"updatedAt" : "2024-11-28T19:49:21.620885"
512+
"createdAt" : "2026-03-09T14:45:51.578888573",
513+
"updatedAt" : "2026-03-09T14:45:51.578896971"
516514
}, {
517515
"id" : 2,
518516
"name" : "김교수",
519517
"division" : "솦융대",
520518
"position" : "교수",
521519
"userType" : "INACTIVE_PROFESSOR",
522-
"createdAt" : "2024-11-28T19:49:21.620894",
523-
"updatedAt" : "2024-11-28T19:49:21.620895"
520+
"createdAt" : "2026-03-09T14:45:51.578937524",
521+
"updatedAt" : "2026-03-09T14:45:51.578939097"
524522
}, {
525523
"id" : 3,
526524
"name" : "박교수",
527525
"division" : "정통대",
528526
"position" : "교수",
529527
"userType" : "INACTIVE_PROFESSOR",
530-
"createdAt" : "2024-11-28T19:49:21.620897",
531-
"updatedAt" : "2024-11-28T19:49:21.620897"
528+
"createdAt" : "2026-03-09T14:45:51.578945944",
529+
"updatedAt" : "2026-03-09T14:45:51.578947442"
532530
} ],
533531
"number" : 0,
534532
"sort" : {
535533
"empty" : true,
536534
"sorted" : false,
537535
"unsorted" : true
538536
},
537+
"first" : true,
538+
"last" : true,
539539
"numberOfElements" : 3,
540540
"pageable" : {
541541
"pageNumber" : 0,
@@ -786,7 +786,7 @@ <h4 id="_http_response">HTTP response</h4>
786786
Vary: Access-Control-Request-Method
787787
Vary: Access-Control-Request-Headers
788788
Content-Type: application/json
789-
Content-Length: 272
789+
Content-Length: 278
790790

791791
{
792792
"id" : 1,
@@ -796,8 +796,8 @@ <h4 id="_http_response">HTTP response</h4>
796796
"division" : "배민",
797797
"position" : "CEO",
798798
"userType" : "INACTIVE_COMPANY",
799-
"createdAt" : "2024-11-28T19:49:21.643274",
800-
"updatedAt" : "2024-11-28T19:49:21.643275"
799+
"createdAt" : "2026-03-09T14:45:51.664182733",
800+
"updatedAt" : "2026-03-09T14:45:51.664222751"
801801
}</code></pre>
802802
</div>
803803
</div>
@@ -926,7 +926,7 @@ <h4 id="_http_response">HTTP response</h4>
926926
Vary: Access-Control-Request-Method
927927
Vary: Access-Control-Request-Headers
928928
Content-Type: application/json
929-
Content-Length: 262
929+
Content-Length: 269
930930

931931
{
932932
"id" : 1,
@@ -936,8 +936,8 @@ <h4 id="_http_response">HTTP response</h4>
936936
"division" : "배민",
937937
"position" : "CEO",
938938
"userType" : "COMPANY",
939-
"createdAt" : "2024-11-28T19:49:21.637588",
940-
"updatedAt" : "2024-11-28T19:49:21.63759"
939+
"createdAt" : "2026-03-09T14:45:51.637606699",
940+
"updatedAt" : "2026-03-09T14:45:51.637612649"
941941
}</code></pre>
942942
</div>
943943
</div>
@@ -1077,7 +1077,7 @@ <h4 id="_http_response">HTTP response</h4>
10771077
<div id="footer">
10781078
<div id="footer-text">
10791079
Version 0.0.1-SNAPSHOT<br>
1080-
Last updated 2024-10-28 21:44:55 +0900
1080+
Last updated 2026-03-09 14:08:49 +0900
10811081
</div>
10821082
</div>
10831083
</body>

src/main/resources/static/docs/auth-controller-test.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -489,9 +489,9 @@ <h4 id="_http_response">HTTP response</h4>
489489
Vary: Origin
490490
Vary: Access-Control-Request-Method
491491
Vary: Access-Control-Request-Headers
492-
Set-Cookie: refresh-token=refresh_token; Path=/; Max-Age=604800; Expires=Thu, 5 Dec 2024 10:49:18 GMT; Secure; HttpOnly; SameSite=None
493-
Set-Cookie: access-token=access_token; Path=/; Max-Age=604800; Expires=Thu, 5 Dec 2024 10:49:18 GMT; Secure; SameSite=None
494-
Location: https://localhost:3000/login/kakao</code></pre>
492+
Set-Cookie: refresh-token=refresh_token; Path=/; Max-Age=604800; Expires=Mon, 16 Mar 2026 05:45:42 GMT; Secure; HttpOnly; SameSite=None
493+
Set-Cookie: access-token=access_token; Path=/; Max-Age=604800; Expires=Mon, 16 Mar 2026 05:45:42 GMT; Secure; SameSite=None
494+
Location: http://localhost:3000/login/kakao</code></pre>
495495
</div>
496496
</div>
497497
</div>
@@ -785,7 +785,7 @@ <h4 id="_http_response">HTTP response</h4>
785785
<div id="footer">
786786
<div id="footer-text">
787787
Version 0.0.1-SNAPSHOT<br>
788-
Last updated 2024-10-28 21:44:55 +0900
788+
Last updated 2026-03-09 14:08:49 +0900
789789
</div>
790790
</div>
791791
</body>

0 commit comments

Comments
 (0)