Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
6948867
hotfix: 비동기 처리 λˆ„λ½ 디버깅
hyunn522 Dec 3, 2025
cabaa2b
feat: User 도메인 ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€
hyunn522 Dec 4, 2025
30e3f17
feat: Video 도메인 ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€
hyunn522 Dec 4, 2025
7a3e789
feat: History 도메인 ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€
hyunn522 Dec 5, 2025
2389148
feat: Comment 도메인 ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€
hyunn522 Dec 5, 2025
f2c438b
feat: Scrap 도메인 ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€
hyunn522 Dec 5, 2025
d229d25
feat: Admin 도메인 ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€
hyunn522 Dec 7, 2025
b5e3aa1
feat: Organization 도메인 ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€
hyunn522 Dec 8, 2025
011a935
feat: Home 도메인 ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€
hyunn522 Dec 6, 2025
527c5ec
feat: CloudFront fallback 처리 μ‹œ μ„€μ • μΆ”κ°€
hyunn522 Dec 8, 2025
c2ec115
feat: CloudFront μ—°κ²° μ‹€νŒ¨ μ‹œ S3둜 fallback 처리 둜직 μΆ”κ°€
hyunn522 Dec 8, 2025
1ed46ed
Merge pull request #106 from AllStackProject/test/#95/λ‹¨μœ„-ν…ŒμŠ€νŠΈ-μ½”λ“œ-μΆ”κ°€
hyunn522 Dec 8, 2025
6ff27aa
Merge pull request #107 from AllStackProject/feat/#105/cloudfront-fal…
hyunn522 Dec 8, 2025
f2cace4
docs: λ¦¬λ“œλ―Έ μ΄ˆμ•ˆ μž‘μ„±
hyunn522 Dec 9, 2025
9058476
docs: μ•„ν‚€ν…μ²˜ μΆ”κ°€
hyunn522 Dec 9, 2025
9210197
docs: μ£Όμš” κΈ°λŠ₯ 문ꡬ μˆ˜μ •
hyunn522 Dec 9, 2025
c06efdb
docs: μ•„ν‚€ν…μ²˜ 사진 크기 μˆ˜μ •
hyunn522 Dec 9, 2025
fe948e3
docs: μ½”λ“œ 블둝 문법 μˆ˜μ •
hyunn522 Dec 9, 2025
e3233c0
docs: ν…Œν¬μΉ© 및 μ„€λͺ… μΆ”κ°€
hyunn522 Dec 10, 2025
654a454
docs: κΈ°λŠ₯ λ‚΄μš© μˆ˜μ •
hyunn522 Dec 10, 2025
fc813f4
Merge pull request #109 from AllStackProject/docs/#108/readme-μž‘μ„±
hyunn522 Dec 10, 2025
8aee0fb
docs: κΈ°λŠ₯ 문ꡬ μˆ˜μ •
hyunn522 Dec 11, 2025
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
145 changes: 143 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,143 @@
# Backend
프라이빗 μ˜μƒ 곡유 ν”Œλž«νΌ Backend Repository
<div align="center">
<h1>Privideo Backend</h1>
<h3>μ‘°μ§ν˜• 프라이빗 μ˜μƒ 곡유 ν”Œλž«νΌ API μ„œλ²„</h3>

<img width="70%" alt="banner" src="https://github.com/user-attachments/assets/a93a8d41-de28-4b55-b559-1ecd48f29c9e" />

<br/><br/>

<p>
<img src="https://img.shields.io/badge/Java-17-007396?style=flat-square&logo=openjdk&logoColor=white"/>
<img src="https://img.shields.io/badge/Spring_Boot-3.5.6-6DB33F?style=flat-square&logo=springboot&logoColor=white"/>
<img src="https://img.shields.io/badge/Spring_Security-6DB33F?style=flat-square&logo=springsecurity&logoColor=white"/>
<img src="https://img.shields.io/badge/JPA_%2B_QueryDSL-59666C?style=flat-square&logo=hibernate&logoColor=white"/>
</p>

<p>
<img src="https://img.shields.io/badge/PostgreSQL-4169E1?style=flat-square&logo=postgresql&logoColor=white"/>
<img src="https://img.shields.io/badge/MongoDB-47A248?style=flat-square&logo=mongodb&logoColor=white"/>
<img src="https://img.shields.io/badge/Redis-DC382D?style=flat-square&logo=redis&logoColor=white"/>
<img src="https://img.shields.io/badge/Gradle-02303A?style=flat-square&logo=gradle&logoColor=white"/>
<img src="https://img.shields.io/badge/JUnit_5-25A162?style=flat-square&logo=junit5&logoColor=white"/>
<img src="https://img.shields.io/badge/Spring_AI-6DB33F?style=flat-square&logo=spring&logoColor=white"/>
<img src="https://img.shields.io/badge/springdoc-85EA2D?style=flat-square&logo=swagger&logoColor=white"/>
</p>

</div>

<br/>

---

## μ£Όμš” κΈ°λŠ₯

- πŸ‘₯ **쑰직 / 멀버 관리**
- 쑰직 생성 및 **μ΄ˆλŒ€ μ½”λ“œ** 기반 κ°€μž…
- μ—­ν•  기반 κΆŒν•œ(κ΄€λ¦¬μž / 일반 멀버)
- 쑰직 λ‚΄ 멀버 κ°€μž…/νƒˆν‡΄, μƒνƒœ 관리(ν™œμ„±/λΉ„ν™œμ„±)

- 🎬 **μ˜μƒ μ—…λ‘œλ“œ & 슀트리밍**
- ν΄λΌμ΄μ–ΈνŠΈκ°€ S3에 μ˜μƒμ„ μ—…λ‘œλ“œν•˜κΈ° μœ„ν•œ **Presigned URL λ°œκΈ‰**
- HLS 인코딩 결과에 λŒ€ν•œ **HLS Prefix 관리**
- CloudFront + **Signed Cookie**λ₯Ό ν™œμš©ν•œ λ³΄μ•ˆ 슀트리밍
- μ˜μƒ 곡개 λ²”μœ„(전체 곡개 / 멀버그룹 μ œν•œ) 및 만료일 μ„€μ •

- πŸ“ˆ **μ‹œμ²­ 이λ ₯ & ꡬ간별 뢄석**
- Redis 기반 μ‹œμ²­ μ„Έμ…˜ 관리 (watchSegments, recentPosition λ“±)
- μ„Έμ…˜ μ’…λ£Œ μ‹œ μ’…λ£Œ μ‹œμ  및 μ΄νƒˆ κ΄€λ ¨ 정보에 λŒ€ν•΄ μš”μ•½ μ €μž₯
- MongoDBλ₯Ό ν™œμš©ν•œ ꡬ간별(μ„Έκ·Έλ¨ΌνŠΈ) μ‹œμ²­ 뢄석 데이터 집계 : ꡬ간별 쑰회수 및 μ΄νƒˆμˆ˜

- πŸ€– **AI 뢄석 제곡 (Spring AI / Vertex AI Gemini)**
- S3의 원본 μ˜μƒμœΌλ‘œλΆ€ν„° RTZR APIλ₯Ό 톡해 STT 처리
- μΆ”μΆœν•œ ν…μŠ€νŠΈμ— λŒ€ν•΄ μš”μ•½, ν€΄μ¦ˆ, ν”Όλ“œλ°± κ²°κ³Ό 생성
- 생성 κ²°κ³Όλ₯Ό μ €μž₯ν•΄ 각 μ˜μƒμ˜ μ‹œμ²­μžμ—κ²Œ 제곡

- 🧩 **κ΄€λ¦¬μž λŒ€μ‹œλ³΄λ“œ**
- 쑰직별 μ˜μƒλ³„ μ‹œμ²­ μ§€ν‘œ(μ™„λ£Œμœ¨, μ΄νƒˆ ꡬ간, μ—°λ Ή/성별 뢄포 λ“±)
- ν•„ν„°(κΈ°κ°„, κ·Έλ£Ή, μΉ΄ν…Œκ³ λ¦¬) 기반 쑰회

---

## πŸ— μ•„ν‚€ν…μ²˜

<div align="center">
<img width="100%" alt="privideo-α„‹α…‘α„α…΅α„α…¦α†¨α„Žα…₯" src="https://github.com/user-attachments/assets/41c73cac-c886-4456-84f4-c5df022dfe2e" />
</div>

- Route53 / Ingressλ₯Ό 톡해 `privideo-backend`둜 μš”μ²­ μœ μž…
- Spring Security + JWT 기반 인증/인가
- JPA + QueryDSL둜 RDB(PostgreSQL) 도메인 λͺ¨λΈ 관리
- MongoDB / Redisλ₯Ό 톡해 λŒ€μš©λŸ‰ μ‹œμ²­ 둜그, μ„Έμ…˜ 정보 관리
- S3 Presigned URL & CloudFront Signed Cookieλ₯Ό μ΄μš©ν•œ μ•ˆμ „ν•˜κ³  효율적인 HLS 슀트리밍 연동

---

## πŸ”– ERD

<img width="100%" alt="FISA" src="https://github.com/user-attachments/assets/f12ae76d-2c93-4d14-8ced-8c6e5e66b185" />

<!--
> RDBμ—λŠ” μ‚¬μš©μž/쑰직/μ˜μƒ/κΆŒν•œ/μ‹œμ²­ 이λ ₯ λ“± **정합성이 μ€‘μš”ν•œ 데이터**,
> MongoDBμ—λŠ” **μ„Έκ·Έλ¨ΌνŠΈ λ‹¨μœ„μ˜ λΆ„μ„μš© 둜그**,
> Redisμ—λŠ” **μ‹€μ‹œκ°„ μ„Έμ…˜ μƒνƒœ**λ₯Ό λΆ„λ¦¬ν•΄μ„œ μ €μž₯ν•©λ‹ˆλ‹€.
-->

---

## πŸ—‚ Repository ꡬ쑰

> 도메인 λ‹¨μœ„λ‘œ λ‚˜λˆ„κ³ , 각 도메인 ν•˜μœ„μ— `controller / service / repository / dto / entity`λ₯Ό λ‘λŠ” ν˜•νƒœ

```
privideo-backend
β”œβ”€β”€ src
β”‚ β”œβ”€β”€ main
β”‚ β”‚ β”œβ”€β”€ java
β”‚ β”‚ β”‚ └── app.allstackproject.privideo
β”‚ β”‚ β”‚ β”œβ”€β”€ PrivideoApplication.java
β”‚ β”‚ β”‚ β”œβ”€β”€ domain
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ admin
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ comment
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ history
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ home
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ member
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ notice
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ organization
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ quiz
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ scrap
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ user
β”‚ β”‚ β”‚ β”‚ └── video
β”‚ β”‚ β”‚ β”œβ”€β”€ global
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ config
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ exception
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ response
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ security
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ util
β”‚ β”‚ β”‚ β”‚ └── validator
β”‚ β”‚ β”‚ └── shared
β”‚ β”‚ β”‚ β”œβ”€β”€ entity
β”‚ β”‚ β”‚ └── enums
β”‚ β”‚ └── resources
β”‚ β”‚ β”œβ”€β”€ application.yml
β”‚ β”‚ β”œβ”€β”€ application-local.yml
β”‚ β”‚ └── lua/
β”‚ └── test
β”‚ β”œβ”€β”€ java
β”‚ β”‚ └── app.allstackproject.privideo
β”‚ β”‚ β”œβ”€β”€ PrivideoApplicationTests.java
β”‚ β”‚ └── domain
β”‚ β”‚ β”œβ”€β”€ admin
β”‚ β”‚ β”œβ”€β”€ comment
β”‚ β”‚ β”œβ”€β”€ history
β”‚ β”‚ β”œβ”€β”€ home
β”‚ β”‚ β”œβ”€β”€ organization
β”‚ β”‚ β”œβ”€β”€ scrap
β”‚ β”‚ β”œβ”€β”€ user
β”‚ β”‚ └── video
β”‚ └── resources
β”‚ β”œβ”€β”€ summarySample.txt
β”‚ β”œβ”€β”€ quizSample.txt
└── └── feedbackSample.txt

```

Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@EnableAsync
@SpringBootApplication
public class PrivideoApplication {

public static void main(String[] args) {
SpringApplication.run(PrivideoApplication.class, args);
}
public static void main(String[] args) {
SpringApplication.run(PrivideoApplication.class, args);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@NoArgsConstructor
public class ReadAllVideoItem {
private Long id;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class HistoryItem {
private Long id;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class PostSignupRequest {
@AgeTypeConstraint
private Integer age;

@NotBlank(message = "λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.")
@NotBlank(message = "μ „ν™”λ²ˆν˜Έλ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.")
private String phoneNumber;

private String organizationCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,34 @@
package app.allstackproject.privideo.domain.user.service;

import static app.allstackproject.privideo.shared.enums.BaseStatusType.ACTIVE;
import static app.allstackproject.privideo.shared.enums.BaseStatusType.INACTIVE;
import static app.allstackproject.privideo.domain.organization.dto.enums.JoinStatusType.PENDING;
import static app.allstackproject.privideo.global.response.status.BaseExceptionResponseStatus.ALREADY_LEAVED_USER;
import static app.allstackproject.privideo.global.response.status.BaseExceptionResponseStatus.DB_CONSTRAINT_VIOLATE;
import static app.allstackproject.privideo.global.response.status.BaseExceptionResponseStatus.DUPLICATE_EMAIL;
import static app.allstackproject.privideo.global.response.status.BaseExceptionResponseStatus.INVALID_ORG_CODE;
import static app.allstackproject.privideo.global.response.status.BaseExceptionResponseStatus.INVALID_PASSWORD;
import static app.allstackproject.privideo.global.response.status.BaseExceptionResponseStatus.ORG_CODE_NOT_AVAILABLE;
import static app.allstackproject.privideo.global.response.status.BaseExceptionResponseStatus.PASSWORD_MISMATCH;
import static app.allstackproject.privideo.global.response.status.BaseExceptionResponseStatus.PASSWORD_SAME_AS_CURRENT;
import static app.allstackproject.privideo.global.response.status.BaseExceptionResponseStatus.USER_NOT_FOUND;
import static app.allstackproject.privideo.shared.enums.BaseStatusType.ACTIVE;
import static app.allstackproject.privideo.shared.enums.BaseStatusType.INACTIVE;

import app.allstackproject.privideo.domain.member.entity.Member;
import app.allstackproject.privideo.domain.member.repository.MemberRepository;
import app.allstackproject.privideo.domain.organization.entity.Organization;
import app.allstackproject.privideo.domain.organization.repository.OrgRedisRepository;
import app.allstackproject.privideo.domain.organization.repository.OrganizationRepository;
import app.allstackproject.privideo.domain.user.dto.enums.GenderType;
import app.allstackproject.privideo.global.exception.ApiException;
import app.allstackproject.privideo.global.security.JwtProvider;
import app.allstackproject.privideo.domain.user.dto.request.PostLoginRequest;
import app.allstackproject.privideo.domain.user.dto.request.PostSignupRequest;
import app.allstackproject.privideo.domain.user.dto.request.UpdateUserInfoRequest;
import app.allstackproject.privideo.domain.user.dto.response.UserInfoResponse;
import app.allstackproject.privideo.domain.member.entity.Member;
import app.allstackproject.privideo.domain.organization.entity.Organization;
import app.allstackproject.privideo.domain.user.entity.User;
import app.allstackproject.privideo.domain.member.repository.MemberRepository;
import app.allstackproject.privideo.domain.organization.repository.OrgRedisRepository;
import app.allstackproject.privideo.domain.organization.repository.OrganizationRepository;
import app.allstackproject.privideo.domain.user.repository.UserRepository;
import app.allstackproject.privideo.global.exception.ApiException;
import app.allstackproject.privideo.global.security.JwtProvider;
import jakarta.validation.Valid;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand Down Expand Up @@ -65,11 +63,7 @@ public boolean signup(@Valid PostSignupRequest postSignupRequest) {
postSignupRequest.getAge()
).hashPassword(passwordEncoder);

try {
userRepository.save(user);
} catch (DataIntegrityViolationException e) {
throw new ApiException(DB_CONSTRAINT_VIOLATE);
}
userRepository.save(user);

String orgCode = postSignupRequest.getOrganizationCode();
if (orgCode != null && !orgCode.isBlank()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,15 +106,26 @@ public BaseResponse<JoinVideoSessionResponse> joinVideoSession(
HttpServletResponse response) {
JoinVideoSessionResult result = videoService.prepareJoinVideoSession(me.memberId(), orgId, videoId);

cloudFrontCookieService.addSignedCookies(response, result.getVideo().getHlsPrefix());
boolean isCloudFrontSuccess = cloudFrontCookieService.addSignedCookies(
response,
result.getVideo().getHlsPrefix()
);

videoService.openWatchSession(
result.getSessionId(),
me.memberId(),
orgId,
videoId
);
return new BaseResponse<>(JoinVideoSessionResponse.from(result));

JoinVideoSessionResponse joinResponse = JoinVideoSessionResponse.from(result);
if (!isCloudFrontSuccess) {
String s3FallbackUrl = videoService.getFallbackPlaybackUrl(result.getVideo().getHlsPrefix());
joinResponse.setPlaybackUrl(s3FallbackUrl);
joinResponse.setFallbackToS3(true);
}

return new BaseResponse<>(joinResponse);
}

@PostMapping("/{videoId}/leave")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@

import app.allstackproject.privideo.domain.video.enums.AiFunctionType;
import app.allstackproject.privideo.domain.quiz.dto.QuizInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.List;
import lombok.Getter;
import lombok.Setter;

@Getter
public class JoinVideoSessionResponse {
private final String sessionId;

private final String playbackUrl;
@Setter
private String playbackUrl;

private final Boolean watchCompleted;

Expand All @@ -31,10 +34,14 @@ public class JoinVideoSessionResponse {

private final String aiSummary;

@Setter
@JsonIgnore
private Boolean fallbackToS3;

private JoinVideoSessionResponse(String sessionId, String playbackUrl, Boolean watchCompleted, VideoInfo video,
List<Long> segViewCnts, Boolean isComment, Boolean isScrapped,
List<String> categories, AiFunctionType aiType, List<QuizInfo> aiQuizzes,
String aiFeedback, String aiSummary) {
String aiFeedback, String aiSummary, Boolean fallbackToS3) {
this.sessionId = sessionId;
this.playbackUrl = playbackUrl;
this.watchCompleted = watchCompleted;
Expand All @@ -47,12 +54,13 @@ private JoinVideoSessionResponse(String sessionId, String playbackUrl, Boolean w
this.aiQuizzes = aiQuizzes == null ? List.of() : List.copyOf(aiQuizzes);
this.aiFeedback = aiFeedback;
this.aiSummary = aiSummary;
this.fallbackToS3 = fallbackToS3;
}

public static JoinVideoSessionResponse from(JoinVideoSessionResult result) {
return new JoinVideoSessionResponse(result.getSessionId(), result.getPlaybackUrl(), result.getWatchCompleted(),
result.getVideo(), result.getSegViewCnts(), result.getIsComment(), result.getIsScrapped(),
result.getCategories(), result.getAiType(), result.getAiQuizzes(), result.getAiFeedback(),
result.getAiSummary());
result.getAiSummary(), false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,33 @@ public class CloudFrontCookieService {
@Value("${cloud.aws.cloudfront.cookie-domain}")
private String COOKIE_DOMAIN;

@Value("${cloud.aws.cloudfront.fallback-enabled:true}")
private boolean fallbackEnabled;

private PrivateKey cachedPrivateKey;

public void addSignedCookies(HttpServletResponse response, String videoHlsPrefix) {
/**
* CloudFront μ„œλͺ…λœ μΏ ν‚€ μΆ”κ°€ (μ‹€νŒ¨ μ‹œ fallback 처리)
*
* @return true if CloudFront cookies added, false if fallback to S3
*/
public boolean addSignedCookies(HttpServletResponse response, String videoHlsPrefix) {
if (!fallbackEnabled) {
addSignedCookiesInternal(response, videoHlsPrefix);
return true;
}

try {
addSignedCookiesInternal(response, videoHlsPrefix);
log.info("CloudFront signed cookies added successfully for: {}", videoHlsPrefix);
return true;
} catch (Exception e) {
log.error("CloudFront signing failed, falling back to S3 direct access: {}", videoHlsPrefix, e);
return false;
}
}

private void addSignedCookiesInternal(HttpServletResponse response, String videoHlsPrefix) {
long expirationTime = Instant.now().getEpochSecond() + COOKIE_TTL_SECONDS;

String resource = String.format(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,10 @@ public void openWatchSession(String sessionId, Long memberId, Long orgId, Long v
}
}

public String getFallbackPlaybackUrl(String hlsPrefix) {
return s3Util.generatePlaybackUrl(hlsPrefix);
}

public boolean leaveVideoSession(LeaveVideoSessionInfo leaveVideoSessionInfo) {
String sessionId = leaveVideoSessionInfo.getSessionId();
if (!videoRedisRepository.existsWatchSession(sessionId)) {
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,14 @@ cloud:
output: ${AWS_OUTPUT_BUCKET}
presign:
upload-expiration: ${AWS_UPLOAD_EXPIRATION}
playback-expiration: PT1H
cloudfront:
distribution-domain: ${CDN_BASE_URL}
cookie-domain: ${COOKIE_DOMAIN}
key-pair-id: ${CF_KEY_PAIR_ID}
cookie-ttl-seconds: ${CF_COOKIE_TTL}
private-key-base64: ${CF_PRIVATE_KEY_BASE64}
fallback-enabled: true
---

spring:
Expand Down
Loading