Skip to content

Commit 578e03e

Browse files
Merge pull request #155 from TeamLearningFlow/deploy
Deploy
2 parents 03aa9ae + 85f41a2 commit 578e03e

38 files changed

Lines changed: 649 additions & 312 deletions

.github/workflows/main.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@ jobs:
2424
# Set up Docker Buildx
2525
- name: Set up Docker Buildx
2626
uses: docker/setup-buildx-action@v2
27-
with:
28-
install: true
29-
driver: docker
3027

3128
# Build and push Docker image
3229
- name: Build and push

src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.querydsl.core.types.PathMetadata;
88
import javax.annotation.processing.Generated;
99
import com.querydsl.core.types.Path;
10+
import com.querydsl.core.types.dsl.PathInits;
1011

1112

1213
/**
@@ -17,6 +18,8 @@ public class QEmailVerificationToken extends EntityPathBase<EmailVerificationTok
1718

1819
private static final long serialVersionUID = -1162432526L;
1920

21+
private static final PathInits INITS = PathInits.DIRECT2;
22+
2023
public static final QEmailVerificationToken emailVerificationToken = new QEmailVerificationToken("emailVerificationToken");
2124

2225
public final QBaseEntity _super = new QBaseEntity(this);
@@ -35,18 +38,29 @@ public class QEmailVerificationToken extends EntityPathBase<EmailVerificationTok
3538
//inherited
3639
public final DateTimePath<java.time.LocalDateTime> updatedAt = _super.updatedAt;
3740

41+
public final QUser user;
42+
3843
public final BooleanPath verified = createBoolean("verified");
3944

4045
public QEmailVerificationToken(String variable) {
41-
super(EmailVerificationToken.class, forVariable(variable));
46+
this(EmailVerificationToken.class, forVariable(variable), INITS);
4247
}
4348

4449
public QEmailVerificationToken(Path<? extends EmailVerificationToken> path) {
45-
super(path.getType(), path.getMetadata());
50+
this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS));
4651
}
4752

4853
public QEmailVerificationToken(PathMetadata metadata) {
49-
super(EmailVerificationToken.class, metadata);
54+
this(metadata, PathInits.getFor(metadata, INITS));
55+
}
56+
57+
public QEmailVerificationToken(PathMetadata metadata, PathInits inits) {
58+
this(EmailVerificationToken.class, metadata, inits);
59+
}
60+
61+
public QEmailVerificationToken(Class<? extends EmailVerificationToken> type, PathMetadata metadata, PathInits inits) {
62+
super(type, metadata, inits);
63+
this.user = inits.isInitialized("user") ? new QUser(forProperty("user")) : null;
5064
}
5165

5266
}

src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ public class QUser extends EntityPathBase<User> {
2222

2323
public final QBaseEntity _super = new QBaseEntity(this);
2424

25+
public final StringPath bannerImgUrl = createString("bannerImgUrl");
26+
2527
public final ListPath<Long, NumberPath<Long>> bookmarkedCollectionIds = this.<Long, NumberPath<Long>>createList("bookmarkedCollectionIds", Long.class, NumberPath.class, PathInits.DIRECT2);
2628

2729
//inherited

src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgress.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public class QUserEpisodeProgress extends EntityPathBase<UserEpisodeProgress> {
3131

3232
public final NumberPath<Integer> episodeNumber = createNumber("episodeNumber", Integer.class);
3333

34+
public final BooleanPath isComplete = createBoolean("isComplete");
35+
3436
public final EnumPath<learningFlow.learningFlow_BE.domain.enums.ResourceType> resourceType = createEnum("resourceType", learningFlow.learningFlow_BE.domain.enums.ResourceType.class);
3537

3638
public final NumberPath<Integer> totalProgress = createNumber("totalProgress", Integer.class);

src/main/java/learningFlow/learningFlow_BE/LearningFlowBeApplication.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5-
import org.springframework.context.annotation.Import;
65
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
76
import org.springframework.scheduling.annotation.EnableScheduling;
87

src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,24 @@ public enum ErrorStatus implements BaseErrorCode {
2121

2222

2323
// 멤버 관려 에러
24+
EMAIL_ALREADY_EXISTS(HttpStatus.BAD_REQUEST,"EMAIL4001" ,"이미 동일한 이메일로 생성된 계정이 존재합니다."),
25+
EMAIL_VERIFICATION_IN_PROGRESS(HttpStatus.BAD_REQUEST, "EMAIL4002", "이미 진행 중인 이메일 인증이 있습니다. 이메일을 확인해주세요."),
26+
EMAIL_CHANGE_SAME_AS_CURRENT(HttpStatus.BAD_REQUEST, "EMAIL4004", "기존과 동일한 이메일로는 변경하실 수 없습니다."),
27+
GOOGLE_USER_CANNOT_CHANGE_EMAIL(HttpStatus.BAD_REQUEST,"EMAIL4005","구글 로그인 유저는 이메일 변경을 하실 수 없습니다."),
28+
EMAIL_CODE_INVALID(HttpStatus.BAD_REQUEST, "EMAIL4006", "유효하지 않은 이메일 인증 코드입니다."),
29+
EMAIL_CODE_EXPIRED(HttpStatus.BAD_REQUEST,"EMAIL4007","만료된 이메일 인증 코드입니다. 이메일 인증을 다시 요청해주세요."),
30+
2431
USER_NOT_FOUND(HttpStatus.BAD_REQUEST, "USER4001", "사용자를 찾을 수 없습니다."),
2532
NICKNAME_NOT_EXIST(HttpStatus.BAD_REQUEST, "USER4002", "닉네임은 필수 입니다."),
2633

34+
// 비밀번호 관련 에러 추가
35+
INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "PASSWORD4001", "유효하지 않은 비밀번호입니다."),
36+
PASSWORD_CURRENT_MISMATCH(HttpStatus.BAD_REQUEST, "PASSWORD4002", "현재 비밀번호가 일치하지 않습니다."),
37+
PASSWORD_SAME_AS_CURRENT(HttpStatus.BAD_REQUEST, "PASSWORD4003", "새 비밀번호는 현재 비밀번호와 달라야 합니다."),
38+
PASSWORD_RESET_CODE_INVALID(HttpStatus.BAD_REQUEST, "PASSWORD4004", "유효하지 않은 비밀번호 재설정 코드입니다."),
39+
PASSWORD_RESET_CODE_EXPIRED(HttpStatus.BAD_REQUEST, "PASSWORD4005", "만료된 비밀번호 재설정 코드입니다. 비밀번호 재설정을 다시 요청해주세요."),
40+
41+
2742
//Resources 관련 에어
2843
RESOURCES_NOT_FOUND(HttpStatus.NOT_FOUND,"RESOURCE4001","강의 에피소드를 찾을 수 없습니다."),
2944
QUANTITY_IS_NULL(HttpStatus.BAD_REQUEST, "RESOURCE4002", "분량이 존재하지 않습니다"),
@@ -41,10 +56,6 @@ public enum ErrorStatus implements BaseErrorCode {
4156
// 예시,,,
4257
ARTICLE_NOT_FOUND(HttpStatus.NOT_FOUND, "ARTICLE4001", "게시글이 없습니다."),
4358

44-
45-
EMAIL_ALREADY_EXISTS(HttpStatus.BAD_REQUEST,"EMAIL4001" ,"이미 동일한 이메일로 생성된 계정이 존재합니다."),
46-
INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "PASSWORD4001", "유효하지 않은 비밀번호입니다."),
47-
4859
//이미지
4960
IMAGE_FORMAT_BADREQUEST(HttpStatus.BAD_REQUEST,"COMMON400","이미지 파일만 업로드할 수 있습니다."),
5061
IMAGE_UPLOAD_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "COMMON5001", "이미지 업로드에 실패했습니다. 다시 시도해주세요."),
Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/*
12
package learningFlow.learningFlow_BE.config;
23
34
//Spring Security까지 CORS 적용 목적
@@ -7,6 +8,7 @@
78
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
89
import org.springframework.web.filter.CorsFilter;
910
11+
import java.util.Arrays;
1012
import java.util.List;
1113
1214
@Configuration
@@ -16,12 +18,28 @@ public class CorsConfig {
1618
public CorsFilter corsFilter() {
1719
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
1820
CorsConfiguration config = new CorsConfiguration();
21+
22+
config.setAllowedOrigins(Arrays.asList(
23+
"http://localhost:3000",
24+
"http://localhost:8081",
25+
"http://onboarding.p-e.kr:8080",
26+
"http://54.180.118.227",
27+
"https://accounts.google.com"
28+
));
29+
30+
config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"));
31+
config.setAllowedHeaders(Arrays.asList("*"));
1932
config.setAllowCredentials(true);
20-
config.setAllowedOrigins(List.of("http://localhost:3000", "http://localhost:8081")); // ✅ Swagger 포함
21-
config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"));
22-
config.setAllowedHeaders(List.of("*"));
23-
config.setMaxAge(3600L);
33+
config.setExposedHeaders(Arrays.asList(
34+
"Authorization",
35+
"Refresh-Token",
36+
"Access-Control-Allow-Origin",
37+
"Access-Control-Allow-Credentials"
38+
));
39+
config.setMaxAge(86400L);
40+
2441
source.registerCorsConfiguration("/**", config);
2542
return new CorsFilter(source);
2643
}
2744
}
45+
*/

src/main/java/learningFlow/learningFlow_BE/config/WebConfig.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/*
12
package learningFlow.learningFlow_BE.config;
23
34
import org.springframework.context.annotation.Configuration;
@@ -10,11 +11,19 @@ public class WebConfig implements WebMvcConfigurer {
1011
@Override
1112
public void addCorsMappings(CorsRegistry registry) {
1213
registry.addMapping("/**")
13-
.allowedOrigins("http://localhost:3000", "http://localhost:8080", "http://onboarding.p-e.kr:8080", "http://54.180.118.227")
14-
// .allowedOrigins("http://localhost:3000") // 프론트엔드 주소
14+
.allowedOriginPatterns("*") // 개발 중일 때만 사용
15+
// 또는 특정 출처만 허용
16+
.allowedOrigins(
17+
"http://localhost:3000",
18+
"http://localhost:8081",
19+
"http://onboarding.p-e.kr:8080",
20+
"http://54.180.118.227",
21+
"https://accounts.google.com"
22+
)
1523
.allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS")
1624
.allowedHeaders("*")
1725
.allowCredentials(true)
1826
.maxAge(86400L);
1927
}
2028
}
29+
*/

src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,16 @@ public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilte
5353
"/search/**",
5454
"/",
5555
"/collections/{collectionId:[\\d]+}",
56-
"/image/upload" //이미지 업로드는 허용
56+
"/image/upload", //이미지 업로드는 허용
57+
"/favicon.ico",
58+
"/register",
59+
"/register/complete",
60+
"/login",
61+
"/login/google",
62+
"/oauth2/**",
63+
"/login/oauth2/**",
64+
"/user/change-email"
5765
).permitAll()
58-
.requestMatchers(
59-
"/register", "/register/complete", "/login", "/login/google", "/oauth2/**").permitAll()
6066
.requestMatchers("/admin/**").hasRole("ADMIN")
6167
.requestMatchers("/user/**", "/resources/**", "/collections/{collectionId:[\\d]+}/likes", "/logout/**").authenticated()
6268
.anyRequest().permitAll()
@@ -72,7 +78,6 @@ public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilte
7278
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
7379
.exceptionHandling(exception ->
7480
exception.authenticationEntryPoint(authenticationEntryPoint));
75-
7681
return http.build();
7782
}
7883

@@ -89,10 +94,37 @@ public PasswordEncoder passwordEncoder() {
8994
@Bean
9095
public CorsConfigurationSource corsConfigurationSource() {
9196
CorsConfiguration configuration = new CorsConfiguration();
92-
configuration.setAllowedOrigins(List.of("http://localhost:3000")); // 프론트엔드 주소
97+
98+
configuration.setAllowedOrigins(Arrays.asList(
99+
"http://localhost:3000",
100+
"http://localhost:8081",
101+
"http://onboarding.p-e.kr:8080",
102+
"http://54.180.118.227",
103+
"https://accounts.google.com"
104+
));
105+
93106
configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"));
94-
configuration.setAllowedHeaders(List.of("*"));
107+
configuration.setAllowedHeaders(Arrays.asList(
108+
"Authorization",
109+
"Refresh-Token",
110+
"Access-Control-Allow-Origin",
111+
"Access-Control-Allow-Credentials",
112+
"Content-Type",
113+
"Accept",
114+
"Origin",
115+
"X-Requested-With"
116+
));
95117
configuration.setAllowCredentials(true);
118+
configuration.setExposedHeaders(Arrays.asList(
119+
"Authorization",
120+
"Refresh-Token",
121+
"Access-Control-Allow-Origin",
122+
"Access-Control-Allow-Credentials",
123+
"Content-Type",
124+
"Accept",
125+
"Origin",
126+
"X-Requested-With"
127+
));
96128
configuration.setMaxAge(86400L);
97129

98130
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ public static SearchRequestDTO.SearchConditionDTO toSearchConditionDTO(
4747

4848
public static CollectionResponseDTO.SearchResultDTO toSearchResultDTO(
4949
List<Collection> collections,
50-
Long lastId,
5150
boolean hasNext,
5251
int totalPages,
5352
int currentPage,
5453
User currentUser,
55-
Map<Long, CollectionResponseDTO.CollectionLearningInfo> learningInfoMap
54+
Map<Long, CollectionResponseDTO.CollectionLearningInfo> learningInfoMap,
55+
int totalCount
5656
) {
5757
List<CollectionResponseDTO.CollectionPreviewDTO> list = collections.stream()
5858
.map(collection -> toCollectionPreviewDTO(
@@ -63,10 +63,10 @@ public static CollectionResponseDTO.SearchResultDTO toSearchResultDTO(
6363

6464
return CollectionResponseDTO.SearchResultDTO.builder()
6565
.searchResults(list)
66-
.lastId(lastId)
6766
.hasNext(hasNext)
6867
.currentPage(currentPage)
6968
.totalPages(totalPages)
69+
.totalCount(totalCount)
7070
.build();
7171
}
7272

@@ -82,6 +82,7 @@ public static CollectionResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO(
8282

8383
return CollectionResponseDTO.CollectionPreviewDTO.builder()
8484
.collectionId(collection.getId())
85+
.imageUrl(collection.getCollectionImgUrl())
8586
.interestField(collection.getInterestField())
8687
.title(collection.getTitle())
8788
.creator(collection.getCreator())

0 commit comments

Comments
 (0)