diff --git a/build.gradle b/build.gradle index 150a163e..a92c05c2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,7 @@ -buildscript { - ext { - queryDslVersion = '5.0.0' - } -} - plugins { id 'java' - id 'org.springframework.boot' version '2.7.12' - id 'io.spring.dependency-management' version '1.0.15.RELEASE' - id 'org.jetbrains.kotlin.jvm' - id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" + id 'org.springframework.boot' version '3.2.6' + id 'io.spring.dependency-management' version '1.1.3' } group = 'ddingdong' @@ -36,13 +28,11 @@ dependencies { //develop implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - implementation 'org.springdoc:springdoc-openapi-ui:1.6.11' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' implementation 'org.springframework.boot:spring-boot-configuration-processor' - implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" - implementation "com.querydsl:querydsl-apt:${queryDslVersion}" + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' //db implementation 'org.springframework.boot:spring-boot-starter-data-jpa' @@ -50,11 +40,16 @@ dependencies { implementation 'org.flywaydb:flyway-core' implementation "org.flywaydb:flyway-mysql" + // queryDSL + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + //etc(기타) implementation 'io.awspring.cloud:spring-cloud-starter-aws:2.4.4' implementation 'org.apache.poi:poi:5.2.0' implementation 'org.apache.poi:poi-ooxml:5.2.0' - implementation 'io.hypersistence:hypersistence-utils-hibernate-55:3.7.2' implementation 'io.sentry:sentry-logback:7.6.0' implementation 'com.fasterxml.jackson.core:jackson-core' implementation 'com.github.f4b6a3:uuid-creator:6.0.0' @@ -63,6 +58,10 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'com.auth0:java-jwt:4.2.1' + // Sentry + implementation 'io.sentry:sentry-spring-boot-starter-jakarta:7.14.0' + implementation 'io.sentry:sentry-logback:7.14.0' + //test testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' @@ -70,9 +69,11 @@ dependencies { testAnnotationProcessor 'org.projectlombok:lombok' testRuntimeOnly "org.junit.platform:junit-platform-launcher" testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter:1.0.23") + // TestContainer testImplementation 'org.testcontainers:testcontainers:1.20.1' testImplementation 'org.testcontainers:junit-jupiter:1.20.1' + // mysql 컨테이너 testImplementation 'org.testcontainers:mysql:1.20.1' } @@ -80,34 +81,3 @@ dependencies { tasks.named('test') { useJUnitPlatform() } -def querydslDir = "$buildDir/generated/'querydsl'" - -querydsl { // JPA 사용여부 및 사용 경로 설정 - jpa = true - querydslSourcesDir = querydslDir -} - -sourceSets { // build시 사용할 sourceSet 추가 설정 - main.java.srcDir querydslDir -} - -compileQuerydsl { // querydsl 컴파일 시 사용할 옵션 설정 - options.annotationProcessorPath = configurations.querydsl -} - -// querydsl이 compileClassPath를 상속하도록 설정 -configurations { - compileOnly { - extendsFrom annotationProcessor - } - querydsl.extendsFrom compileClasspath -} - -compileQuerydsl.doFirst { - if (file(querydslDir).exists()) - delete(file(querydslDir)) -} - -compileQuerydsl { - options.annotationProcessorPath = configurations.querydsl -} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832..943f0cbf 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 774fae87..20db9ad5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index a69d9cb6..65dcd68d 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac diff --git a/gradlew.bat b/gradlew.bat index f127cfd4..93e3f59f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% diff --git a/src/main/generated/ddingdong/ddingdongBE/common/QBaseEntity.java b/src/main/generated/ddingdong/ddingdongBE/common/QBaseEntity.java new file mode 100644 index 00000000..d54f9ac7 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/common/QBaseEntity.java @@ -0,0 +1,39 @@ +package ddingdong.ddingdongBE.common; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseEntity is a Querydsl query type for BaseEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseEntity extends EntityPathBase { + + private static final long serialVersionUID = 654623242L; + + public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); + + public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); + + public final DateTimePath updatedAt = createDateTime("updatedAt", java.time.LocalDateTime.class); + + public QBaseEntity(String variable) { + super(BaseEntity.class, forVariable(variable)); + } + + public QBaseEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseEntity(PathMetadata metadata) { + super(BaseEntity.class, metadata); + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/activityreport/domain/QActivityReport.java b/src/main/generated/ddingdong/ddingdongBE/domain/activityreport/domain/QActivityReport.java new file mode 100644 index 00000000..19f596c1 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/activityreport/domain/QActivityReport.java @@ -0,0 +1,73 @@ +package ddingdong.ddingdongBE.domain.activityreport.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QActivityReport is a Querydsl query type for ActivityReport + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QActivityReport extends EntityPathBase { + + private static final long serialVersionUID = 1287698975L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QActivityReport activityReport = new QActivityReport("activityReport"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + public final ddingdong.ddingdongBE.domain.club.entity.QClub club; + + public final StringPath content = createString("content"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final DateTimePath endDate = createDateTime("endDate", java.time.LocalDateTime.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final ListPath participants = this.createList("participants", Participant.class, QParticipant.class, PathInits.DIRECT2); + + public final StringPath place = createString("place"); + + public final DateTimePath startDate = createDateTime("startDate", java.time.LocalDateTime.class); + + public final StringPath term = createString("term"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QActivityReport(String variable) { + this(ActivityReport.class, forVariable(variable), INITS); + } + + public QActivityReport(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QActivityReport(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QActivityReport(PathMetadata metadata, PathInits inits) { + this(ActivityReport.class, metadata, inits); + } + + public QActivityReport(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.club = inits.isInitialized("club") ? new ddingdong.ddingdongBE.domain.club.entity.QClub(forProperty("club"), inits.get("club")) : null; + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/activityreport/domain/QActivityReportTermInfo.java b/src/main/generated/ddingdong/ddingdongBE/domain/activityreport/domain/QActivityReportTermInfo.java new file mode 100644 index 00000000..4f9ccac8 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/activityreport/domain/QActivityReportTermInfo.java @@ -0,0 +1,45 @@ +package ddingdong.ddingdongBE.domain.activityreport.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QActivityReportTermInfo is a Querydsl query type for ActivityReportTermInfo + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QActivityReportTermInfo extends EntityPathBase { + + private static final long serialVersionUID = -149711239L; + + public static final QActivityReportTermInfo activityReportTermInfo = new QActivityReportTermInfo("activityReportTermInfo"); + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final DatePath endDate = createDate("endDate", java.time.LocalDate.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final DatePath startDate = createDate("startDate", java.time.LocalDate.class); + + public final NumberPath term = createNumber("term", Integer.class); + + public QActivityReportTermInfo(String variable) { + super(ActivityReportTermInfo.class, forVariable(variable)); + } + + public QActivityReportTermInfo(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QActivityReportTermInfo(PathMetadata metadata) { + super(ActivityReportTermInfo.class, metadata); + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/activityreport/domain/QParticipant.java b/src/main/generated/ddingdong/ddingdongBE/domain/activityreport/domain/QParticipant.java new file mode 100644 index 00000000..eac43fc5 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/activityreport/domain/QParticipant.java @@ -0,0 +1,41 @@ +package ddingdong.ddingdongBE.domain.activityreport.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QParticipant is a Querydsl query type for Participant + */ +@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") +public class QParticipant extends BeanPath { + + private static final long serialVersionUID = 670376887L; + + public static final QParticipant participant = new QParticipant("participant"); + + public final StringPath department = createString("department"); + + public final StringPath name = createString("name"); + + public final StringPath studentId = createString("studentId"); + + public QParticipant(String variable) { + super(Participant.class, forVariable(variable)); + } + + public QParticipant(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QParticipant(PathMetadata metadata) { + super(Participant.class, metadata); + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/banner/entity/QBanner.java b/src/main/generated/ddingdong/ddingdongBE/domain/banner/entity/QBanner.java new file mode 100644 index 00000000..111a5af0 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/banner/entity/QBanner.java @@ -0,0 +1,67 @@ +package ddingdong.ddingdongBE.domain.banner.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QBanner is a Querydsl query type for Banner + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QBanner extends EntityPathBase { + + private static final long serialVersionUID = 1783101330L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QBanner banner = new QBanner("banner"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + public final StringPath colorCode = createString("colorCode"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath subTitle = createString("subTitle"); + + public final StringPath title = createString("title"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final ddingdong.ddingdongBE.domain.user.entity.QUser user; + + public QBanner(String variable) { + this(Banner.class, forVariable(variable), INITS); + } + + public QBanner(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QBanner(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QBanner(PathMetadata metadata, PathInits inits) { + this(Banner.class, metadata, inits); + } + + public QBanner(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.user = inits.isInitialized("user") ? new ddingdong.ddingdongBE.domain.user.entity.QUser(forProperty("user")) : null; + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/club/entity/QClub.java b/src/main/generated/ddingdong/ddingdongBE/domain/club/entity/QClub.java new file mode 100644 index 00000000..44ad4e4e --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/club/entity/QClub.java @@ -0,0 +1,96 @@ +package ddingdong.ddingdongBE.domain.club.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QClub is a Querydsl query type for Club + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QClub extends EntityPathBase { + + private static final long serialVersionUID = -316467098L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QClub club = new QClub("club"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + public final StringPath activity = createString("activity"); + + public final StringPath category = createString("category"); + + public final ListPath clubMembers = this.createList("clubMembers", ClubMember.class, QClubMember.class, PathInits.DIRECT2); + + public final StringPath content = createString("content"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final DateTimePath endRecruitPeriod = createDateTime("endRecruitPeriod", java.time.LocalDateTime.class); + + public final StringPath formUrl = createString("formUrl"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath ideal = createString("ideal"); + + public final StringPath introduction = createString("introduction"); + + public final StringPath leader = createString("leader"); + + public final QLocation location; + + public final StringPath name = createString("name"); + + public final QPhoneNumber phoneNumber; + + public final StringPath regularMeeting = createString("regularMeeting"); + + public final ddingdong.ddingdongBE.domain.scorehistory.entity.QScore score; + + public final DateTimePath startRecruitPeriod = createDateTime("startRecruitPeriod", java.time.LocalDateTime.class); + + public final StringPath tag = createString("tag"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final ddingdong.ddingdongBE.domain.user.entity.QUser user; + + public QClub(String variable) { + this(Club.class, forVariable(variable), INITS); + } + + public QClub(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QClub(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QClub(PathMetadata metadata, PathInits inits) { + this(Club.class, metadata, inits); + } + + public QClub(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.location = inits.isInitialized("location") ? new QLocation(forProperty("location")) : null; + this.phoneNumber = inits.isInitialized("phoneNumber") ? new QPhoneNumber(forProperty("phoneNumber")) : null; + this.score = inits.isInitialized("score") ? new ddingdong.ddingdongBE.domain.scorehistory.entity.QScore(forProperty("score")) : null; + this.user = inits.isInitialized("user") ? new ddingdong.ddingdongBE.domain.user.entity.QUser(forProperty("user")) : null; + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/club/entity/QClubMember.java b/src/main/generated/ddingdong/ddingdongBE/domain/club/entity/QClubMember.java new file mode 100644 index 00000000..66648174 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/club/entity/QClubMember.java @@ -0,0 +1,71 @@ +package ddingdong.ddingdongBE.domain.club.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QClubMember is a Querydsl query type for ClubMember + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QClubMember extends EntityPathBase { + + private static final long serialVersionUID = 2035559072L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QClubMember clubMember = new QClubMember("clubMember"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + public final QClub club; + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final StringPath department = createString("department"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath name = createString("name"); + + public final StringPath phoneNumber = createString("phoneNumber"); + + public final EnumPath position = createEnum("position", Position.class); + + public final StringPath studentNumber = createString("studentNumber"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QClubMember(String variable) { + this(ClubMember.class, forVariable(variable), INITS); + } + + public QClubMember(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QClubMember(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QClubMember(PathMetadata metadata, PathInits inits) { + this(ClubMember.class, metadata, inits); + } + + public QClubMember(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.club = inits.isInitialized("club") ? new QClub(forProperty("club"), inits.get("club")) : null; + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/club/entity/QLocation.java b/src/main/generated/ddingdong/ddingdongBE/domain/club/entity/QLocation.java new file mode 100644 index 00000000..77129a51 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/club/entity/QLocation.java @@ -0,0 +1,37 @@ +package ddingdong.ddingdongBE.domain.club.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QLocation is a Querydsl query type for Location + */ +@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") +public class QLocation extends BeanPath { + + private static final long serialVersionUID = 578992997L; + + public static final QLocation location = new QLocation("location"); + + public final StringPath value = createString("value"); + + public QLocation(String variable) { + super(Location.class, forVariable(variable)); + } + + public QLocation(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QLocation(PathMetadata metadata) { + super(Location.class, metadata); + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/club/entity/QPhoneNumber.java b/src/main/generated/ddingdong/ddingdongBE/domain/club/entity/QPhoneNumber.java new file mode 100644 index 00000000..5300b9a0 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/club/entity/QPhoneNumber.java @@ -0,0 +1,37 @@ +package ddingdong.ddingdongBE.domain.club.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QPhoneNumber is a Querydsl query type for PhoneNumber + */ +@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") +public class QPhoneNumber extends BeanPath { + + private static final long serialVersionUID = -1553481561L; + + public static final QPhoneNumber phoneNumber = new QPhoneNumber("phoneNumber"); + + public final StringPath number = createString("number"); + + public QPhoneNumber(String variable) { + super(PhoneNumber.class, forVariable(variable)); + } + + public QPhoneNumber(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QPhoneNumber(PathMetadata metadata) { + super(PhoneNumber.class, metadata); + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/documents/entity/QDocument.java b/src/main/generated/ddingdong/ddingdongBE/domain/documents/entity/QDocument.java new file mode 100644 index 00000000..eefe3f18 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/documents/entity/QDocument.java @@ -0,0 +1,63 @@ +package ddingdong.ddingdongBE.domain.documents.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QDocument is a Querydsl query type for Document + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QDocument extends EntityPathBase { + + private static final long serialVersionUID = 1823046323L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QDocument document = new QDocument("document"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath title = createString("title"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final ddingdong.ddingdongBE.domain.user.entity.QUser user; + + public QDocument(String variable) { + this(Document.class, forVariable(variable), INITS); + } + + public QDocument(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QDocument(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QDocument(PathMetadata metadata, PathInits inits) { + this(Document.class, metadata, inits); + } + + public QDocument(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.user = inits.isInitialized("user") ? new ddingdong.ddingdongBE.domain.user.entity.QUser(forProperty("user")) : null; + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/feed/entity/QFeed.java b/src/main/generated/ddingdong/ddingdongBE/domain/feed/entity/QFeed.java new file mode 100644 index 00000000..0c128495 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/feed/entity/QFeed.java @@ -0,0 +1,69 @@ +package ddingdong.ddingdongBE.domain.feed.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QFeed is a Querydsl query type for Feed + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QFeed extends EntityPathBase { + + private static final long serialVersionUID = -603750858L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QFeed feed = new QFeed("feed"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + public final StringPath activityContent = createString("activityContent"); + + public final ddingdong.ddingdongBE.domain.club.entity.QClub club; + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final EnumPath feedType = createEnum("feedType", FeedType.class); + + public final StringPath fileUrl = createString("fileUrl"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath thumbnailUrl = createString("thumbnailUrl"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QFeed(String variable) { + this(Feed.class, forVariable(variable), INITS); + } + + public QFeed(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QFeed(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QFeed(PathMetadata metadata, PathInits inits) { + this(Feed.class, metadata, inits); + } + + public QFeed(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.club = inits.isInitialized("club") ? new ddingdong.ddingdongBE.domain.club.entity.QClub(forProperty("club"), inits.get("club")) : null; + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/fileinformation/entity/QFileInformation.java b/src/main/generated/ddingdong/ddingdongBE/domain/fileinformation/entity/QFileInformation.java new file mode 100644 index 00000000..989998ce --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/fileinformation/entity/QFileInformation.java @@ -0,0 +1,57 @@ +package ddingdong.ddingdongBE.domain.fileinformation.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QFileInformation is a Querydsl query type for FileInformation + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QFileInformation extends EntityPathBase { + + private static final long serialVersionUID = 1337656640L; + + public static final QFileInformation fileInformation = new QFileInformation("fileInformation"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final EnumPath fileDomainCategory = createEnum("fileDomainCategory", FileDomainCategory.class); + + public final EnumPath fileTypeCategory = createEnum("fileTypeCategory", FileTypeCategory.class); + + public final StringPath findParam = createString("findParam"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath storedName = createString("storedName"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final StringPath uploadName = createString("uploadName"); + + public QFileInformation(String variable) { + super(FileInformation.class, forVariable(variable)); + } + + public QFileInformation(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QFileInformation(PathMetadata metadata) { + super(FileInformation.class, metadata); + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/fixzone/entity/QFixZone.java b/src/main/generated/ddingdong/ddingdongBE/domain/fixzone/entity/QFixZone.java new file mode 100644 index 00000000..91fa9b49 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/fixzone/entity/QFixZone.java @@ -0,0 +1,69 @@ +package ddingdong.ddingdongBE.domain.fixzone.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QFixZone is a Querydsl query type for FixZone + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QFixZone extends EntityPathBase { + + private static final long serialVersionUID = 306285152L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QFixZone fixZone = new QFixZone("fixZone"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + public final ddingdong.ddingdongBE.domain.club.entity.QClub club; + + public final StringPath content = createString("content"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final ListPath fixZoneComments = this.createList("fixZoneComments", FixZoneComment.class, QFixZoneComment.class, PathInits.DIRECT2); + + public final NumberPath id = createNumber("id", Long.class); + + public final BooleanPath isCompleted = createBoolean("isCompleted"); + + public final StringPath title = createString("title"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QFixZone(String variable) { + this(FixZone.class, forVariable(variable), INITS); + } + + public QFixZone(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QFixZone(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QFixZone(PathMetadata metadata, PathInits inits) { + this(FixZone.class, metadata, inits); + } + + public QFixZone(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.club = inits.isInitialized("club") ? new ddingdong.ddingdongBE.domain.club.entity.QClub(forProperty("club"), inits.get("club")) : null; + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/fixzone/entity/QFixZoneComment.java b/src/main/generated/ddingdong/ddingdongBE/domain/fixzone/entity/QFixZoneComment.java new file mode 100644 index 00000000..2f38a4d7 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/fixzone/entity/QFixZoneComment.java @@ -0,0 +1,66 @@ +package ddingdong.ddingdongBE.domain.fixzone.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QFixZoneComment is a Querydsl query type for FixZoneComment + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QFixZoneComment extends EntityPathBase { + + private static final long serialVersionUID = 85888991L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QFixZoneComment fixZoneComment = new QFixZoneComment("fixZoneComment"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + public final ddingdong.ddingdongBE.domain.club.entity.QClub club; + + public final StringPath content = createString("content"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final QFixZone fixZone; + + public final NumberPath id = createNumber("id", Long.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QFixZoneComment(String variable) { + this(FixZoneComment.class, forVariable(variable), INITS); + } + + public QFixZoneComment(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QFixZoneComment(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QFixZoneComment(PathMetadata metadata, PathInits inits) { + this(FixZoneComment.class, metadata, inits); + } + + public QFixZoneComment(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.club = inits.isInitialized("club") ? new ddingdong.ddingdongBE.domain.club.entity.QClub(forProperty("club"), inits.get("club")) : null; + this.fixZone = inits.isInitialized("fixZone") ? new QFixZone(forProperty("fixZone"), inits.get("fixZone")) : null; + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/notice/entity/QNotice.java b/src/main/generated/ddingdong/ddingdongBE/domain/notice/entity/QNotice.java new file mode 100644 index 00000000..0a3a292f --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/notice/entity/QNotice.java @@ -0,0 +1,65 @@ +package ddingdong.ddingdongBE.domain.notice.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QNotice is a Querydsl query type for Notice + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QNotice extends EntityPathBase { + + private static final long serialVersionUID = 1329809898L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QNotice notice = new QNotice("notice"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + public final StringPath content = createString("content"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath title = createString("title"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final ddingdong.ddingdongBE.domain.user.entity.QUser user; + + public QNotice(String variable) { + this(Notice.class, forVariable(variable), INITS); + } + + public QNotice(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QNotice(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QNotice(PathMetadata metadata, PathInits inits) { + this(Notice.class, metadata, inits); + } + + public QNotice(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.user = inits.isInitialized("user") ? new ddingdong.ddingdongBE.domain.user.entity.QUser(forProperty("user")) : null; + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/question/entity/QQuestion.java b/src/main/generated/ddingdong/ddingdongBE/domain/question/entity/QQuestion.java new file mode 100644 index 00000000..aa6beee7 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/question/entity/QQuestion.java @@ -0,0 +1,65 @@ +package ddingdong.ddingdongBE.domain.question.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QQuestion is a Querydsl query type for Question + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QQuestion extends EntityPathBase { + + private static final long serialVersionUID = 1457764422L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QQuestion question1 = new QQuestion("question1"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath question = createString("question"); + + public final StringPath reply = createString("reply"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final ddingdong.ddingdongBE.domain.user.entity.QUser user; + + public QQuestion(String variable) { + this(Question.class, forVariable(variable), INITS); + } + + public QQuestion(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QQuestion(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QQuestion(PathMetadata metadata, PathInits inits) { + this(Question.class, metadata, inits); + } + + public QQuestion(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.user = inits.isInitialized("user") ? new ddingdong.ddingdongBE.domain.user.entity.QUser(forProperty("user")) : null; + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/scorehistory/entity/QScore.java b/src/main/generated/ddingdong/ddingdongBE/domain/scorehistory/entity/QScore.java new file mode 100644 index 00000000..19bf423e --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/scorehistory/entity/QScore.java @@ -0,0 +1,37 @@ +package ddingdong.ddingdongBE.domain.scorehistory.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QScore is a Querydsl query type for Score + */ +@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") +public class QScore extends BeanPath { + + private static final long serialVersionUID = 1745274966L; + + public static final QScore score = new QScore("score"); + + public final NumberPath value = createNumber("value", java.math.BigDecimal.class); + + public QScore(String variable) { + super(Score.class, forVariable(variable)); + } + + public QScore(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QScore(PathMetadata metadata) { + super(Score.class, metadata); + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/scorehistory/entity/QScoreHistory.java b/src/main/generated/ddingdong/ddingdongBE/domain/scorehistory/entity/QScoreHistory.java new file mode 100644 index 00000000..5307ff85 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/scorehistory/entity/QScoreHistory.java @@ -0,0 +1,67 @@ +package ddingdong.ddingdongBE.domain.scorehistory.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QScoreHistory is a Querydsl query type for ScoreHistory + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QScoreHistory extends EntityPathBase { + + private static final long serialVersionUID = 275105630L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QScoreHistory scoreHistory = new QScoreHistory("scoreHistory"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + public final NumberPath amount = createNumber("amount", java.math.BigDecimal.class); + + public final ddingdong.ddingdongBE.domain.club.entity.QClub club; + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath reason = createString("reason"); + + public final EnumPath scoreCategory = createEnum("scoreCategory", ScoreCategory.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QScoreHistory(String variable) { + this(ScoreHistory.class, forVariable(variable), INITS); + } + + public QScoreHistory(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QScoreHistory(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QScoreHistory(PathMetadata metadata, PathInits inits) { + this(ScoreHistory.class, metadata, inits); + } + + public QScoreHistory(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.club = inits.isInitialized("club") ? new ddingdong.ddingdongBE.domain.club.entity.QClub(forProperty("club"), inits.get("club")) : null; + } + +} + diff --git a/src/main/generated/ddingdong/ddingdongBE/domain/user/entity/QUser.java b/src/main/generated/ddingdong/ddingdongBE/domain/user/entity/QUser.java new file mode 100644 index 00000000..8d66ec94 --- /dev/null +++ b/src/main/generated/ddingdong/ddingdongBE/domain/user/entity/QUser.java @@ -0,0 +1,55 @@ +package ddingdong.ddingdongBE.domain.user.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QUser is a Querydsl query type for User + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QUser extends EntityPathBase { + + private static final long serialVersionUID = 146845456L; + + public static final QUser user = new QUser("user"); + + public final ddingdong.ddingdongBE.common.QBaseEntity _super = new ddingdong.ddingdongBE.common.QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath deletedAt = createDateTime("deletedAt", java.time.LocalDateTime.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath name = createString("name"); + + public final StringPath password = createString("password"); + + public final EnumPath role = createEnum("role", Role.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final StringPath userId = createString("userId"); + + public QUser(String variable) { + super(User.class, forVariable(variable)); + } + + public QUser(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QUser(PathMetadata metadata) { + super(User.class, metadata); + } + +} + diff --git a/src/main/java/ddingdong/ddingdongBE/DdingdongBeApplication.java b/src/main/java/ddingdong/ddingdongBE/DdingdongBeApplication.java index 1dfc7d36..14361f89 100644 --- a/src/main/java/ddingdong/ddingdongBE/DdingdongBeApplication.java +++ b/src/main/java/ddingdong/ddingdongBE/DdingdongBeApplication.java @@ -1,7 +1,7 @@ package ddingdong.ddingdongBE; import java.util.TimeZone; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/src/main/java/ddingdong/ddingdongBE/common/BaseEntity.java b/src/main/java/ddingdong/ddingdongBE/common/BaseEntity.java index a418273d..8fd16308 100644 --- a/src/main/java/ddingdong/ddingdongBE/common/BaseEntity.java +++ b/src/main/java/ddingdong/ddingdongBE/common/BaseEntity.java @@ -1,9 +1,9 @@ package ddingdong.ddingdongBE.common; import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.EntityListeners; -import javax.persistence.MappedSuperclass; +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; import lombok.Getter; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; diff --git a/src/main/java/ddingdong/ddingdongBE/common/config/QueryDslConfig.java b/src/main/java/ddingdong/ddingdongBE/common/config/QueryDslConfig.java index 4ce600c7..6410d584 100644 --- a/src/main/java/ddingdong/ddingdongBE/common/config/QueryDslConfig.java +++ b/src/main/java/ddingdong/ddingdongBE/common/config/QueryDslConfig.java @@ -1,8 +1,8 @@ package ddingdong.ddingdongBE.common.config; import com.querydsl.jpa.impl.JPAQueryFactory; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/ddingdong/ddingdongBE/common/config/SecurityConfig.java b/src/main/java/ddingdong/ddingdongBE/common/config/SecurityConfig.java index cbee601a..991e4cbb 100644 --- a/src/main/java/ddingdong/ddingdongBE/common/config/SecurityConfig.java +++ b/src/main/java/ddingdong/ddingdongBE/common/config/SecurityConfig.java @@ -10,6 +10,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @@ -28,47 +29,43 @@ public class SecurityConfig { public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthService authService, JwtConfig config) throws Exception { http - .authorizeHttpRequests() - .antMatchers(API_PREFIX + "/auth/**", - API_PREFIX + "/events/**") - .permitAll() - .antMatchers(API_PREFIX + "/admin/**").hasRole("ADMIN") - .antMatchers(API_PREFIX + "/club/**").hasRole("CLUB") - .antMatchers(GET, - API_PREFIX + "/clubs/**", - API_PREFIX + "/notices/**", - API_PREFIX + "/banners/**", - API_PREFIX + "/documents/**", - API_PREFIX + "/questions/**") - .permitAll() - .antMatchers("/v3/api-docs/**", "/swagger-ui/**", "/swagger-resources/**").permitAll() - .anyRequest() - .authenticated() - .and() - .cors() - .configurationSource(corsConfigurationSource()) - .and() + .authorizeHttpRequests(auth -> auth + .requestMatchers(API_PREFIX + "/auth/**", + API_PREFIX + "/events/**") + .permitAll() + .requestMatchers(API_PREFIX + "/admin/**").hasRole("ADMIN") + .requestMatchers(API_PREFIX + "/club/**").hasRole("CLUB") + .requestMatchers(GET, + API_PREFIX + "/clubs/**", + API_PREFIX + "/notices/**", + API_PREFIX + "/banners/**", + API_PREFIX + "/documents/**", + API_PREFIX + "/questions/**", + API_PREFIX + "/feeds/**") + .permitAll() + .requestMatchers("/v3/api-docs/**", "/swagger-ui/**", "/swagger-resources/**") + .permitAll() + .anyRequest() + .authenticated() + ) + .cors(cors -> cors + .configurationSource(corsConfigurationSource()) + ) /* csrf, headers, http-basic, rememberMe, formLogin 비활성화 */ - .formLogin() - .disable() - .logout() - .disable() - .csrf() - .disable() - .headers() - .disable() - .httpBasic() - .disable() - .rememberMe() - .disable() + .csrf(AbstractHttpConfigurer::disable) + .headers(AbstractHttpConfigurer::disable) + .httpBasic(AbstractHttpConfigurer::disable) + .rememberMe(AbstractHttpConfigurer::disable) + .formLogin(AbstractHttpConfigurer::disable) + .logout(AbstractHttpConfigurer::disable) /* Session 설정 */ - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() + .sessionManagement(session -> session + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + ) /* Jwt 필터 */ @@ -76,9 +73,10 @@ public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthService authSer /* exceptionHandling */ - .exceptionHandling() - .authenticationEntryPoint(restAuthenticationEntryPoint()) - .accessDeniedHandler(accessDeniedHandler()); + .exceptionHandling(exceptions -> exceptions + .authenticationEntryPoint(restAuthenticationEntryPoint()) + .accessDeniedHandler(accessDeniedHandler()) + ); return http.build(); } diff --git a/src/main/java/ddingdong/ddingdongBE/common/exception/CustomExceptionHandler.java b/src/main/java/ddingdong/ddingdongBE/common/exception/CustomExceptionHandler.java index 1627b8db..d7138089 100644 --- a/src/main/java/ddingdong/ddingdongBE/common/exception/CustomExceptionHandler.java +++ b/src/main/java/ddingdong/ddingdongBE/common/exception/CustomExceptionHandler.java @@ -4,10 +4,15 @@ import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; import static org.springframework.http.HttpStatus.NOT_FOUND; +import io.sentry.Sentry; import io.swagger.v3.oas.annotations.Hidden; +import jakarta.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.util.NoSuchElementException; -import javax.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; @@ -30,10 +35,30 @@ public class CustomExceptionHandler { public ErrorResponse handleSystemException(Throwable exception, HttpServletRequest request) { String connectionInfo = createLogConnectionInfo(request); + String requestMethod = request.getMethod(); + String requestUrl = request.getRequestURI(); + String queryString = + (request.getQueryString() != null) ? "?" + request.getQueryString() : ""; + String clientIp = + (request.getHeader("X-Forwarded-For") != null) ? request.getHeader("X-Forwarded-For") + : request.getRemoteAddr(); + loggingApplicationError(connectionInfo + "\n" + "[SYSTEM-ERROR]" + " : " + exception.getMessage()); + Sentry.captureException(exception, scope -> { + scope.setExtra("requestMethod", requestMethod); + scope.setExtra("requestUrl", requestUrl); + scope.setExtra("queryString", queryString); + scope.setExtra("clientIp", clientIp); + + String requestBody = getRequestBody(request); + if (requestBody != null) { + scope.setExtra("requestBody", requestBody); + } + }); + return new ErrorResponse(INTERNAL_SERVER_ERROR.value(), "Internal Sever Error", LocalDateTime.now()); } @@ -111,7 +136,6 @@ public ExceptionResponse handleMissingServletRequestPartException(MissingServlet return ExceptionResponse.of(BAD_REQUEST, e.getMessage()); } - private String createLogConnectionInfo(HttpServletRequest request) { String requestMethod = request.getMethod(); String requestUrl = request.getRequestURI(); @@ -125,4 +149,24 @@ private String createLogConnectionInfo(HttpServletRequest request) { private void loggingApplicationError(String applicationLog) { log.warn("errorLog = {}", applicationLog); } + + private String getRequestBody(HttpServletRequest request) { + try ( + InputStream inputStream = request.getInputStream(); + BufferedReader reader = new BufferedReader( + new InputStreamReader(inputStream, StandardCharsets.UTF_8)) + ) { + StringBuilder stringBuilder = new StringBuilder(); + String line; + + while ((line = reader.readLine()) != null) { + stringBuilder.append(line); + } + + return stringBuilder.toString(); + } catch (Exception e) { + return null; + } + + } } diff --git a/src/main/java/ddingdong/ddingdongBE/common/filter/JwtAuthenticationFilter.java b/src/main/java/ddingdong/ddingdongBE/common/filter/JwtAuthenticationFilter.java index 1f923bed..c99e1662 100644 --- a/src/main/java/ddingdong/ddingdongBE/common/filter/JwtAuthenticationFilter.java +++ b/src/main/java/ddingdong/ddingdongBE/common/filter/JwtAuthenticationFilter.java @@ -8,10 +8,10 @@ import ddingdong.ddingdongBE.common.config.JwtConfig; import ddingdong.ddingdongBE.domain.user.entity.User; import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; diff --git a/src/main/java/ddingdong/ddingdongBE/common/handler/CustomAccessDeniedHandler.java b/src/main/java/ddingdong/ddingdongBE/common/handler/CustomAccessDeniedHandler.java index 8cd1f73e..eeae1585 100644 --- a/src/main/java/ddingdong/ddingdongBE/common/handler/CustomAccessDeniedHandler.java +++ b/src/main/java/ddingdong/ddingdongBE/common/handler/CustomAccessDeniedHandler.java @@ -5,8 +5,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import ddingdong.ddingdongBE.common.exception.ExceptionResponse; import java.io.IOException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.web.access.AccessDeniedHandler; diff --git a/src/main/java/ddingdong/ddingdongBE/common/handler/RestAuthenticationEntryPoint.java b/src/main/java/ddingdong/ddingdongBE/common/handler/RestAuthenticationEntryPoint.java index 38c8151f..ea9fc589 100644 --- a/src/main/java/ddingdong/ddingdongBE/common/handler/RestAuthenticationEntryPoint.java +++ b/src/main/java/ddingdong/ddingdongBE/common/handler/RestAuthenticationEntryPoint.java @@ -9,8 +9,8 @@ import ddingdong.ddingdongBE.common.exception.ErrorResponse; import java.io.IOException; import java.time.LocalDateTime; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; diff --git a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/controller/dto/request/CreateActivityTermInfoRequest.java b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/controller/dto/request/CreateActivityTermInfoRequest.java index f4c6dc53..2ec58293 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/controller/dto/request/CreateActivityTermInfoRequest.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/controller/dto/request/CreateActivityTermInfoRequest.java @@ -2,7 +2,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; -import javax.validation.constraints.Pattern; +import jakarta.validation.constraints.Pattern; import org.springframework.format.annotation.DateTimeFormat; @Schema( diff --git a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/domain/ActivityReport.java b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/domain/ActivityReport.java index f99f5bac..4145189a 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/domain/ActivityReport.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/domain/ActivityReport.java @@ -3,32 +3,30 @@ import ddingdong.ddingdongBE.common.BaseEntity; import ddingdong.ddingdongBE.domain.activityreport.controller.dto.request.UpdateActivityReportRequest; import ddingdong.ddingdongBE.domain.club.entity.Club; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Table; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @SQLDelete(sql = "update activity_report set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") -@Table(appliesTo = "activity_report") +@SQLRestriction("deleted_at IS NULL") public class ActivityReport extends BaseEntity { @Id @@ -49,7 +47,7 @@ public class ActivityReport extends BaseEntity { @ElementCollection private List participants; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/domain/ActivityReportTermInfo.java b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/domain/ActivityReportTermInfo.java index 3eb92627..dabf70a1 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/domain/ActivityReportTermInfo.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/domain/ActivityReportTermInfo.java @@ -1,27 +1,25 @@ package ddingdong.ddingdongBE.domain.activityreport.domain; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import java.time.LocalDate; import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Table; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @SQLDelete(sql = "update activity_report_term_info set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") -@Table(appliesTo = "activity_report_term_info") +@SQLRestriction("deleted_at IS NULL") public class ActivityReportTermInfo { @Id @@ -37,7 +35,7 @@ public class ActivityReportTermInfo { @Column(nullable = false, columnDefinition = "DATE") private LocalDate endDate; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; @Builder diff --git a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/domain/Participant.java b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/domain/Participant.java index 6ce873af..e06b048d 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/domain/Participant.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/domain/Participant.java @@ -1,6 +1,6 @@ package ddingdong.ddingdongBE.domain.activityreport.domain; -import javax.persistence.Embeddable; +import jakarta.persistence.Embeddable; import lombok.AccessLevel; import lombok.Getter; diff --git a/src/main/java/ddingdong/ddingdongBE/domain/banner/entity/Banner.java b/src/main/java/ddingdong/ddingdongBE/domain/banner/entity/Banner.java index a73c0b0e..282175a4 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/banner/entity/Banner.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/banner/entity/Banner.java @@ -3,29 +3,27 @@ import ddingdong.ddingdongBE.common.BaseEntity; import ddingdong.ddingdongBE.domain.banner.controller.dto.request.UpdateBannerRequest; import ddingdong.ddingdongBE.domain.user.entity.User; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Table; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @SQLDelete(sql = "update banner set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") -@Table(appliesTo = "banner") +@SQLRestriction("deleted_at IS NULL") public class Banner extends BaseEntity { @Id @@ -42,7 +40,7 @@ public class Banner extends BaseEntity { private String colorCode; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; @Builder diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/api/CentralClubApi.java b/src/main/java/ddingdong/ddingdongBE/domain/club/api/CentralClubApi.java index 42e08525..ccfa9b31 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/api/CentralClubApi.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/api/CentralClubApi.java @@ -14,7 +14,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import java.util.List; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/request/RegisterClubRequest.java b/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/request/RegisterClubRequest.java index b21ae364..75f82a51 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/request/RegisterClubRequest.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/request/RegisterClubRequest.java @@ -5,6 +5,7 @@ import ddingdong.ddingdongBE.domain.club.entity.PhoneNumber; import ddingdong.ddingdongBE.domain.scorehistory.entity.Score; import ddingdong.ddingdongBE.domain.user.entity.User; +import java.math.BigDecimal; import lombok.Getter; @Getter @@ -31,7 +32,7 @@ public Club toEntity(User user) { .leader(leaderName) .location(Location.from("S0000")) .phoneNumber(PhoneNumber.from("010-0000-0000")) - .score(Score.from(0)).build(); + .score(Score.from(BigDecimal.ZERO)).build(); } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/request/UpdateClubMemberRequest.java b/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/request/UpdateClubMemberRequest.java index 50c40d94..4bcc6948 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/request/UpdateClubMemberRequest.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/request/UpdateClubMemberRequest.java @@ -3,7 +3,7 @@ import ddingdong.ddingdongBE.domain.club.entity.Position; import ddingdong.ddingdongBE.domain.club.service.dto.UpdateClubMemberCommand; import io.swagger.v3.oas.annotations.media.Schema; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import lombok.Builder; @Schema( diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/response/AdminClubResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/response/AdminClubResponse.java index eeca23be..06491ae3 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/response/AdminClubResponse.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/response/AdminClubResponse.java @@ -1,5 +1,6 @@ package ddingdong.ddingdongBE.domain.club.controller.dto.response; +import java.math.BigDecimal; import java.util.List; import ddingdong.ddingdongBE.domain.club.entity.Club; @@ -15,12 +16,12 @@ public class AdminClubResponse { private String category; - private float score; + private BigDecimal score; private List profileImageUrls; @Builder - private AdminClubResponse(Long id, String name, String category, float score, List profileImageUrls) { + private AdminClubResponse(Long id, String name, String category, BigDecimal score, List profileImageUrls) { this.id = id; this.name = name; this.category = category; diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/entity/Club.java b/src/main/java/ddingdong/ddingdongBE/domain/club/entity/Club.java index b77295df..8908b820 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/entity/Club.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/entity/Club.java @@ -4,34 +4,33 @@ import ddingdong.ddingdongBE.domain.club.controller.dto.request.UpdateClubRequest; import ddingdong.ddingdongBE.domain.scorehistory.entity.Score; import ddingdong.ddingdongBE.domain.user.entity.User; +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; -import javax.persistence.Column; -import javax.persistence.Embedded; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Table; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @SQLDelete(sql = "update club set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") -@Table(appliesTo = "club") +@SQLRestriction("deleted_at IS NULL") public class Club extends BaseEntity { @Id @@ -78,7 +77,7 @@ public class Club extends BaseEntity { @Embedded private Score score; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; @Builder @@ -115,7 +114,7 @@ public void updateClubInfo(UpdateClubRequest request) { this.formUrl = request.getFormUrl() != null ? request.getFormUrl() : this.formUrl; } - public float editScore(Score score) { + public BigDecimal editScore(Score score) { this.score = score; return this.score.getValue(); } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/entity/ClubMember.java b/src/main/java/ddingdong/ddingdongBE/domain/club/entity/ClubMember.java index a90bedb6..125f8079 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/entity/ClubMember.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/entity/ClubMember.java @@ -1,31 +1,29 @@ package ddingdong.ddingdongBE.domain.club.entity; import ddingdong.ddingdongBE.common.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Table; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @SQLDelete(sql = "update club_member set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") -@Table(appliesTo = "club_member") +@SQLRestriction("deleted_at IS NULL") public class ClubMember extends BaseEntity { @Id @@ -47,7 +45,7 @@ public class ClubMember extends BaseEntity { private String department; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; @Builder diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/entity/Location.java b/src/main/java/ddingdong/ddingdongBE/domain/club/entity/Location.java index c806dc0d..f2508838 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/entity/Location.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/entity/Location.java @@ -3,8 +3,8 @@ import static ddingdong.ddingdongBE.common.exception.ErrorMessage.*; import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/entity/PhoneNumber.java b/src/main/java/ddingdong/ddingdongBE/domain/club/entity/PhoneNumber.java index 2ceeb129..28b08707 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/entity/PhoneNumber.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/entity/PhoneNumber.java @@ -3,10 +3,10 @@ import static ddingdong.ddingdongBE.common.exception.ErrorMessage.ILLEGAL_CLUB_PHONE_NUMBER_PATTERN; import java.util.Objects; -import javax.persistence.Access; -import javax.persistence.AccessType; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Access; +import jakarta.persistence.AccessType; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java b/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java index 550bd414..cb31d6a4 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java @@ -24,6 +24,7 @@ import ddingdong.ddingdongBE.domain.scorehistory.entity.Score; import ddingdong.ddingdongBE.domain.user.entity.User; import ddingdong.ddingdongBE.file.FileStore; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; import lombok.RequiredArgsConstructor; @@ -104,7 +105,7 @@ public void delete(Long clubId) { } @Transactional - public float updateClubScore(Long clubId, float score) { + public BigDecimal updateClubScore(Long clubId, BigDecimal score) { Club club = getByClubId(clubId); return club.editScore(generateNewScore(club.getScore(), score)); @@ -164,8 +165,8 @@ private void updateProfileImageInformation(UpdateClubRequest request, Club club) } } - private Score generateNewScore(Score beforeUpdateScore, float value) { - return Score.from(beforeUpdateScore.getValue() + value); + private Score generateNewScore(Score beforeUpdateScore, BigDecimal value) { + return Score.from(beforeUpdateScore.getValue().add(value)); } private RecruitmentStatus checkRecruit(LocalDateTime now, Club club) { diff --git a/src/main/java/ddingdong/ddingdongBE/domain/documents/entity/Document.java b/src/main/java/ddingdong/ddingdongBE/domain/documents/entity/Document.java index 4bca80ad..eb4f6c8c 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/documents/entity/Document.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/documents/entity/Document.java @@ -2,29 +2,27 @@ import ddingdong.ddingdongBE.common.BaseEntity; import ddingdong.ddingdongBE.domain.user.entity.User; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Table; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @SQLDelete(sql = "update document set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") -@Table(appliesTo = "document") +@SQLRestriction("deleted_at IS NULL") public class Document extends BaseEntity { @Id @@ -38,7 +36,7 @@ public class Document extends BaseEntity { @Column(nullable = false) private String title; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; diff --git a/src/main/java/ddingdong/ddingdongBE/domain/event/controller/dto/request/ApplyEventRequest.java b/src/main/java/ddingdong/ddingdongBE/domain/event/controller/dto/request/ApplyEventRequest.java index 0a0e5d15..36e55eef 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/event/controller/dto/request/ApplyEventRequest.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/event/controller/dto/request/ApplyEventRequest.java @@ -1,6 +1,6 @@ package ddingdong.ddingdongBE.domain.event.controller.dto.request; -import javax.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotBlank; public record ApplyEventRequest( @NotBlank(message = "학번은 빈 값이 될 수 없습니다.") diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/api/FeedApi.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/api/FeedApi.java new file mode 100644 index 00000000..cfef9010 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/api/FeedApi.java @@ -0,0 +1,42 @@ +package ddingdong.ddingdongBE.domain.feed.api; + +import ddingdong.ddingdongBE.domain.feed.controller.dto.response.FeedListResponse; +import ddingdong.ddingdongBE.domain.feed.controller.dto.response.FeedResponse; +import ddingdong.ddingdongBE.domain.feed.controller.dto.response.NewestFeedListResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; + +@Tag(name = "Feed - User", description = "Feed API") +@RequestMapping("/server") +public interface FeedApi { + + @Operation(summary = "동아리 피드 전체 조회 API") + @ApiResponse(responseCode = "200", description = "동아리 피드 전체 조회 성공", + content = @Content(schema = @Schema(implementation = FeedListResponse.class))) + @ResponseStatus(HttpStatus.OK) + @GetMapping("/clubs/{clubId}/feeds") + List getAllFeedByClubId(@PathVariable Long clubId); + + @Operation(summary = "전체 동아리 최신 피드 조회 API") + @ApiResponse(responseCode = "200", description = "전체 동아리 최신 피드 조회 성공", + content = @Content(schema = @Schema(implementation = NewestFeedListResponse.class))) + @ResponseStatus(HttpStatus.OK) + @GetMapping("/feeds") + List getNewestAllFeed(); + + @Operation(summary = "동아리 피드 상세 조회 API") + @ApiResponse(responseCode = "200", description = "동아리 피드 상세 조회 API", + content = @Content(schema = @Schema(implementation = FeedResponse.class))) + @ResponseStatus(HttpStatus.OK) + @GetMapping("/feeds/{feedId}") + FeedResponse getByFeedId(@PathVariable("feedId") Long feedId); +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/FeedController.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/FeedController.java new file mode 100644 index 00000000..d87dd2f6 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/FeedController.java @@ -0,0 +1,41 @@ +package ddingdong.ddingdongBE.domain.feed.controller; + +import ddingdong.ddingdongBE.domain.feed.api.FeedApi; +import ddingdong.ddingdongBE.domain.feed.controller.dto.response.FeedListResponse; +import ddingdong.ddingdongBE.domain.feed.controller.dto.response.FeedResponse; +import ddingdong.ddingdongBE.domain.feed.controller.dto.response.NewestFeedListResponse; +import ddingdong.ddingdongBE.domain.feed.service.FacadeFeedService; +import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedListQuery; +import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedQuery; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class FeedController implements FeedApi { + + private final FacadeFeedService facadeFeedService; + + @Override + public List getAllFeedByClubId(Long clubId) { + List feedListQueries = facadeFeedService.getAllByClubId(clubId); + return feedListQueries.stream() + .map(FeedListResponse::from) + .toList(); + } + + @Override + public List getNewestAllFeed() { + List newestFeedListQueries = facadeFeedService.getNewestAll(); + return newestFeedListQueries.stream() + .map(NewestFeedListResponse::from) + .toList(); + } + + @Override + public FeedResponse getByFeedId(Long feedId) { + FeedQuery feedquery = facadeFeedService.getById(feedId); + return FeedResponse.from(feedquery); + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/FeedListResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/FeedListResponse.java new file mode 100644 index 00000000..8b2a8456 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/FeedListResponse.java @@ -0,0 +1,24 @@ +package ddingdong.ddingdongBE.domain.feed.controller.dto.response; + +import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedListQuery; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +@Builder +public record FeedListResponse( + @Schema(description = "피드 ID", example = "1") + Long id, + @Schema(description = "피드 썸네일 URL", example = "https://%s.s3.%s.amazonaws.com/%s/%s/%s") + String thumbnailUrl, + @Schema(description = "피드 타입", example = "IMAGE") + String feedType +) { + + public static FeedListResponse from(FeedListQuery info) { + return FeedListResponse.builder() + .id(info.id()) + .thumbnailUrl(info.thumbnailUrl()) + .feedType(info.feedType()) + .build(); + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/FeedResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/FeedResponse.java new file mode 100644 index 00000000..e832c6ea --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/FeedResponse.java @@ -0,0 +1,53 @@ +package ddingdong.ddingdongBE.domain.feed.controller.dto.response; + +import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedQuery; +import ddingdong.ddingdongBE.domain.feed.service.dto.query.ClubProfileQuery; +import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalDate; +import lombok.Builder; + +@Builder +public record FeedResponse( + @Schema(description = "피드 ID", example = "1") + Long id, + @Schema(description = "동아리 정보") + ClubProfileResponse clubProfile, + @Schema(description = "활동 내용", example = "안녕하세요. 카우 피드에요") + String activityContent, + @Schema(description = "CDN URL", example = "https://example.cloudfront.net") + String fileUrl, + @Schema(description = "피드 유형", example = "IMAGE") + String feedType, + @Schema(description = "생성 날짜", example = "2024-08-31") + LocalDate createdDate +) { + + @Builder + record ClubProfileResponse( + @Schema(description = "동아리 ID", example = "1") + Long id, + @Schema(description = "동아리 이름", example = "카우") + String name, + @Schema(description = "동아리 프로필 이미지 url", example = "https://%s.s3.%s.amazonaws.com/%s/%s/%s") + String profileImageUrl + ) { + public static ClubProfileResponse from(ClubProfileQuery query) { + return ClubProfileResponse.builder() + .id(query.id()) + .name(query.name()) + .profileImageUrl(query.profileImageUrl()) + .build(); + } + } + + public static FeedResponse from(FeedQuery info) { + return FeedResponse.builder() + .id(info.id()) + .clubProfile(ClubProfileResponse.from(info.clubProfileQuery())) + .activityContent(info.activityContent()) + .fileUrl(info.fileUrl()) + .feedType(info.feedType()) + .createdDate(info.createdDate()) + .build(); + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/NewestFeedListResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/NewestFeedListResponse.java new file mode 100644 index 00000000..6f0aa2aa --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/NewestFeedListResponse.java @@ -0,0 +1,24 @@ +package ddingdong.ddingdongBE.domain.feed.controller.dto.response; + +import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedListQuery; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +@Builder +public record NewestFeedListResponse( + @Schema(description = "피드 ID", example = "1") + Long id, + @Schema(description = "피드 썸네일 URL", example = "https://%s.s3.%s.amazonaws.com/%s/%s/%s") + String thumbnailUrl, + @Schema(description = "피드 타입", example = "IMAGE") + String feedType +) { + + public static NewestFeedListResponse from(FeedListQuery info) { + return NewestFeedListResponse.builder() + .id(info.id()) + .thumbnailUrl(info.thumbnailUrl()) + .feedType(info.feedType()) + .build(); + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/entity/Feed.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/entity/Feed.java new file mode 100644 index 00000000..b1b16676 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/entity/Feed.java @@ -0,0 +1,60 @@ +package ddingdong.ddingdongBE.domain.feed.entity; + +import ddingdong.ddingdongBE.common.BaseEntity; +import ddingdong.ddingdongBE.domain.club.entity.Club; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import java.time.LocalDateTime; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.SQLRestriction; + +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +@SQLDelete(sql = "update feed set deleted_at = CURRENT_TIMESTAMP where id=?") +@SQLRestriction("deleted_at IS NULL") +public class Feed extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String activityContent; + + @Column(nullable = false) + private String thumbnailUrl; + + @Column(nullable = false) + private String fileUrl; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private FeedType feedType; + + @ManyToOne(fetch = FetchType.LAZY) + private Club club; + + @Column(name = "deleted_at") + private LocalDateTime deletedAt; + + @Builder + private Feed(String activityContent, String thumbnailUrl, Club club, FeedType feedType, String fileUrl) { + this.activityContent = activityContent; + this.thumbnailUrl = thumbnailUrl; + this.club = club; + this.feedType = feedType; + this.fileUrl = fileUrl; + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/entity/FeedType.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/entity/FeedType.java new file mode 100644 index 00000000..f3ace1a3 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/entity/FeedType.java @@ -0,0 +1,5 @@ +package ddingdong.ddingdongBE.domain.feed.entity; + +public enum FeedType { + IMAGE, VIDEO +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepository.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepository.java new file mode 100644 index 00000000..2adfe775 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepository.java @@ -0,0 +1,31 @@ +package ddingdong.ddingdongBE.domain.feed.repository; + +import ddingdong.ddingdongBE.domain.feed.entity.Feed; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface FeedRepository extends JpaRepository { + + @Query(value = """ + SELECT * FROM feed + WHERE club_id =:clubId + AND deleted_at IS NULL + ORDER BY id DESC + """ + , nativeQuery = true) + List findAllByClubIdOrderById(@Param("clubId") Long clubId); + + @Query(value = """ + SELECT * FROM feed f + WHERE f.id in + (SELECT max(id) + FROM feed + WHERE deleted_at IS NULL + GROUP BY club_id) + ORDER BY id DESC + """ + , nativeQuery = true) + List findNewestAll(); +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FacadeFeedService.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FacadeFeedService.java new file mode 100644 index 00000000..0ed641f6 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FacadeFeedService.java @@ -0,0 +1,60 @@ +package ddingdong.ddingdongBE.domain.feed.service; + +import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileDomainCategory.CLUB_PROFILE; +import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileTypeCategory.IMAGE; + +import ddingdong.ddingdongBE.domain.club.entity.Club; +import ddingdong.ddingdongBE.domain.feed.entity.Feed; +import ddingdong.ddingdongBE.domain.feed.service.dto.query.ClubProfileQuery; +import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedListQuery; +import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedQuery; +import ddingdong.ddingdongBE.domain.fileinformation.service.FileInformationService; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class FacadeFeedService { + + private final FeedService feedService; + private final FileInformationService fileInformationService; + + public List getAllByClubId(Long clubId) { + List feeds = feedService.getAllByClubId(clubId); + return feeds.stream() + .map(FeedListQuery::from) + .toList(); + } + + public List getNewestAll() { + List feeds = feedService.getNewestAll(); + return feeds.stream() + .map(FeedListQuery::from) + .toList(); + } + + public FeedQuery getById(Long feedId) { + Feed feed = feedService.getById(feedId); + ClubProfileQuery clubProfileQuery = extractClubInfo(feed.getClub()); + return FeedQuery.of(feed, clubProfileQuery); + } + + private ClubProfileQuery extractClubInfo(Club club) { + String clubName = club.getName(); + List profileImageUrls = fileInformationService.getImageUrls( + IMAGE.getFileType() + CLUB_PROFILE.getFileDomain() + club.getId() + ); + String profileImageUrl = profileImageUrls.stream() + .findFirst() + .orElse(null); + + return ClubProfileQuery.builder() + .id(club.getId()) + .name(clubName) + .profileImageUrl(profileImageUrl) + .build(); + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FeedService.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FeedService.java new file mode 100644 index 00000000..a729b933 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FeedService.java @@ -0,0 +1,30 @@ +package ddingdong.ddingdongBE.domain.feed.service; + +import ddingdong.ddingdongBE.common.exception.PersistenceException.ResourceNotFound; +import ddingdong.ddingdongBE.domain.feed.entity.Feed; +import ddingdong.ddingdongBE.domain.feed.repository.FeedRepository; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class FeedService { + + private final FeedRepository feedRepository; + + public List getAllByClubId(Long clubId) { + return feedRepository.findAllByClubIdOrderById(clubId); + } + + public List getNewestAll() { + return feedRepository.findNewestAll(); + } + + public Feed getById(Long feedId) { + return feedRepository.findById(feedId) + .orElseThrow(() -> new ResourceNotFound("Feed(id: " + feedId + ")를 찾을 수 없습니다.")); + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/ClubProfileQuery.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/ClubProfileQuery.java new file mode 100644 index 00000000..49b4e64c --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/ClubProfileQuery.java @@ -0,0 +1,12 @@ +package ddingdong.ddingdongBE.domain.feed.service.dto.query; + +import lombok.Builder; + +@Builder +public record ClubProfileQuery( + Long id, + String name, + String profileImageUrl +) { + +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/FeedListQuery.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/FeedListQuery.java new file mode 100644 index 00000000..a7259b99 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/FeedListQuery.java @@ -0,0 +1,20 @@ +package ddingdong.ddingdongBE.domain.feed.service.dto.query; + +import ddingdong.ddingdongBE.domain.feed.entity.Feed; +import lombok.Builder; + +@Builder +public record FeedListQuery( + Long id, + String thumbnailUrl, + String feedType +) { + + public static FeedListQuery from(Feed feed) { + return FeedListQuery.builder() + .id(feed.getId()) + .thumbnailUrl(feed.getThumbnailUrl()) + .feedType(feed.getFeedType().toString()) + .build(); + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/FeedQuery.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/FeedQuery.java new file mode 100644 index 00000000..fba2d10b --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/FeedQuery.java @@ -0,0 +1,28 @@ +package ddingdong.ddingdongBE.domain.feed.service.dto.query; + +import ddingdong.ddingdongBE.domain.feed.entity.Feed; +import java.time.LocalDate; +import lombok.Builder; + +@Builder +public record FeedQuery( + Long id, + ClubProfileQuery clubProfileQuery, + String activityContent, + String fileUrl, + String feedType, + LocalDate createdDate +) { + + public static FeedQuery of(Feed feed, ClubProfileQuery clubProfileQuery) { + return FeedQuery.builder() + .id(feed.getId()) + .clubProfileQuery(clubProfileQuery) + .activityContent(feed.getActivityContent()) + .fileUrl(feed.getFileUrl()) + .feedType(feed.getFeedType().toString()) + .createdDate(LocalDate.from(feed.getCreatedAt())) + .build(); + } +} + diff --git a/src/main/java/ddingdong/ddingdongBE/domain/fileinformation/entity/FileInformation.java b/src/main/java/ddingdong/ddingdongBE/domain/fileinformation/entity/FileInformation.java index d416d6e2..0303d62d 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/fileinformation/entity/FileInformation.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/fileinformation/entity/FileInformation.java @@ -1,28 +1,26 @@ package ddingdong.ddingdongBE.domain.fileinformation.entity; import ddingdong.ddingdongBE.common.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Table; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @SQLDelete(sql = "update file_information set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") -@Table(appliesTo = "file_information") +@SQLRestriction("deleted_at IS NULL") public class FileInformation extends BaseEntity { @Id @@ -41,7 +39,7 @@ public class FileInformation extends BaseEntity { private String findParam; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; diff --git a/src/main/java/ddingdong/ddingdongBE/domain/fixzone/entity/FixZone.java b/src/main/java/ddingdong/ddingdongBE/domain/fixzone/entity/FixZone.java index 2b640a30..3592ac94 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/fixzone/entity/FixZone.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/fixzone/entity/FixZone.java @@ -2,33 +2,31 @@ import ddingdong.ddingdongBE.common.BaseEntity; import ddingdong.ddingdongBE.domain.club.entity.Club; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Table; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @SQLDelete(sql = "update fix_zone set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") -@Table(appliesTo = "fix_zone") +@SQLRestriction("deleted_at IS NULL") public class FixZone extends BaseEntity { @Id @@ -48,7 +46,7 @@ public class FixZone extends BaseEntity { private boolean isCompleted; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; @Builder diff --git a/src/main/java/ddingdong/ddingdongBE/domain/fixzone/entity/FixZoneComment.java b/src/main/java/ddingdong/ddingdongBE/domain/fixzone/entity/FixZoneComment.java index 8861aac8..47108a20 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/fixzone/entity/FixZoneComment.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/fixzone/entity/FixZoneComment.java @@ -2,30 +2,28 @@ import ddingdong.ddingdongBE.common.BaseEntity; import ddingdong.ddingdongBE.domain.club.entity.Club; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import java.time.LocalDateTime; import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @SQLDelete(sql = "update fix_zone_comment set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") +@SQLRestriction("deleted_at IS NULL") @NoArgsConstructor(access = AccessLevel.PROTECTED) -@Table(name = "fix_zone_comment") public class FixZoneComment extends BaseEntity { @Id @@ -42,7 +40,7 @@ public class FixZoneComment extends BaseEntity { private String content; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; @Builder diff --git a/src/main/java/ddingdong/ddingdongBE/domain/notice/entity/Notice.java b/src/main/java/ddingdong/ddingdongBE/domain/notice/entity/Notice.java index 13d69b6a..de15a328 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/notice/entity/Notice.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/notice/entity/Notice.java @@ -3,29 +3,27 @@ import ddingdong.ddingdongBE.common.BaseEntity; import ddingdong.ddingdongBE.domain.notice.controller.dto.request.UpdateNoticeRequest; import ddingdong.ddingdongBE.domain.user.entity.User; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @SQLDelete(sql = "update notice set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") -@Table(name = "notice") +@SQLRestriction("deleted_at IS NULL") public class Notice extends BaseEntity { @Id @@ -40,7 +38,7 @@ public class Notice extends BaseEntity { private String content; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; @Builder diff --git a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/AdminEventController.java b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/AdminEventController.java deleted file mode 100644 index f9913b1e..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/AdminEventController.java +++ /dev/null @@ -1,30 +0,0 @@ -package ddingdong.ddingdongBE.domain.qrstamp.controller; - -import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response.AppliedUsersResponse; -import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response.DetailAppliedUserResponse; -import ddingdong.ddingdongBE.domain.qrstamp.service.QrStampService; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/server/admin/events") -@RequiredArgsConstructor -public class AdminEventController { - - private final QrStampService qrStampService; - - @GetMapping("/applied-users") - public List getAppliedUsers() { - return qrStampService.findAllAppliedUsers(); - } - - @GetMapping("/applied-users/{appliedUserId}") - public DetailAppliedUserResponse getAppliedUsers(@PathVariable Long appliedUserId) { - return qrStampService.findAppliedUser(appliedUserId); - } - -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/UserEventController.java b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/UserEventController.java deleted file mode 100644 index 76a779db..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/UserEventController.java +++ /dev/null @@ -1,60 +0,0 @@ -package ddingdong.ddingdongBE.domain.qrstamp.controller; - -import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileDomainCategory.EVENT; -import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileTypeCategory.IMAGE; - -import ddingdong.ddingdongBE.domain.event.controller.dto.request.ApplyEventRequest; -import ddingdong.ddingdongBE.domain.fileinformation.service.FileInformationService; -import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.request.CollectStampRequest; -import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response.CollectionResultResponse; -import ddingdong.ddingdongBE.domain.qrstamp.service.QrStampService; -import ddingdong.ddingdongBE.file.service.FileService; -import java.time.LocalDateTime; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -@RestController -@RequestMapping("/server/events") -@RequiredArgsConstructor -public class UserEventController { - - private final QrStampService qrStampService; - private final FileService fileService; - private final FileInformationService fileInformationService; - - @PostMapping("/stamps") - public String collectStamp(@RequestBody CollectStampRequest request) { - LocalDateTime collectedAt = LocalDateTime.now(); - return qrStampService.collectStamp(request, collectedAt); - } - - @GetMapping("/stamps") - public CollectionResultResponse getCollectionResult(@RequestParam String studentName, @RequestParam String studentNumber) { - return qrStampService.getCollectionResult(studentName, studentNumber); - } - - @PatchMapping("/apply") - public void applyEvent( - @ModelAttribute ApplyEventRequest request, - @RequestPart(name = "certificationImage", required = false) MultipartFile image - ) { - Long stampHistoryId = qrStampService.findByStudentNumber(request.studentNumber()); - - fileService.uploadFile(stampHistoryId, List.of(image), IMAGE, EVENT); - - List imageUrls = fileInformationService.getImageUrls(IMAGE.getFileType() + EVENT.getFileDomain() + stampHistoryId); - - qrStampService.applyEvent(request, imageUrls); - } - -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/request/CollectStampRequest.java b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/request/CollectStampRequest.java deleted file mode 100644 index e617256d..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/request/CollectStampRequest.java +++ /dev/null @@ -1,28 +0,0 @@ -package ddingdong.ddingdongBE.domain.qrstamp.controller.dto.request; - -import ddingdong.ddingdongBE.domain.qrstamp.entity.StampHistory; -import javax.validation.constraints.Size; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class CollectStampRequest { - - private String studentName; - - private String department; - - @Size(min = 8, max = 8, message = "학번은 8자리입니다.") - private String studentNumber; - - private String clubCode; - - public StampHistory toStampHistoryEntity() { - return StampHistory.builder() - .studentName(this.studentName) - .department(this.department) - .studentNumber(this.studentNumber).build(); - } -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/response/AppliedUsersResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/response/AppliedUsersResponse.java deleted file mode 100644 index 4b7332a8..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/response/AppliedUsersResponse.java +++ /dev/null @@ -1,27 +0,0 @@ -package ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response; - -import ddingdong.ddingdongBE.domain.qrstamp.entity.StampHistory; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Builder -public class AppliedUsersResponse { - - private final Long id; - private final String studentName; - private final String studentNumber; - private final String department; - - public static AppliedUsersResponse from(StampHistory stampHistory) { - return AppliedUsersResponse.builder() - .id(stampHistory.getId()) - .studentName(stampHistory.getStudentName()) - .studentNumber(stampHistory.getStudentNumber()) - .department(stampHistory.getDepartment()).build(); - } - -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/response/CollectedStampsResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/response/CollectedStampsResponse.java deleted file mode 100644 index cf801e70..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/response/CollectedStampsResponse.java +++ /dev/null @@ -1,25 +0,0 @@ -package ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response; - -import com.fasterxml.jackson.annotation.JsonFormat; -import java.time.LocalDateTime; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Builder -public class CollectedStampsResponse { - - private String stamp; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime collectedAt; - - public static CollectedStampsResponse of(String stampName, LocalDateTime collectedAt) { - return CollectedStampsResponse.builder() - .stamp(stampName) - .collectedAt(collectedAt).build(); - } - -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/response/CollectionResultResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/response/CollectionResultResponse.java deleted file mode 100644 index 616c9fa3..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/response/CollectionResultResponse.java +++ /dev/null @@ -1,25 +0,0 @@ -package ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response; - -import ddingdong.ddingdongBE.domain.qrstamp.entity.StampHistory; -import java.util.List; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Builder -public class CollectionResultResponse { - - private boolean isCompleted; - private List collections; - - public static CollectionResultResponse of(boolean isCompleted, - List collectedStampsResponse) { - return CollectionResultResponse.builder() - .isCompleted(isCompleted) - .collections(collectedStampsResponse) - .build(); - } -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/response/DetailAppliedUserResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/response/DetailAppliedUserResponse.java deleted file mode 100644 index 6de8ff9e..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/dto/response/DetailAppliedUserResponse.java +++ /dev/null @@ -1,35 +0,0 @@ -package ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response; - -import ddingdong.ddingdongBE.domain.qrstamp.entity.StampHistory; -import java.util.List; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor(access = AccessLevel.PROTECTED) -@Builder -public class DetailAppliedUserResponse { - - private Long id; - private String studentName; - private String studentNumber; - private String department; - private List collections; - private String certificationImageUrl; - - public static DetailAppliedUserResponse from(StampHistory stampHistory) { - return DetailAppliedUserResponse.builder() - .id(stampHistory.getId()) - .studentName(stampHistory.getStudentName()) - .studentNumber(stampHistory.getStudentNumber()) - .department(stampHistory.getDepartment()) - .collections(stampHistory.getCollectedStamps().keySet().stream() - .map(stamp -> CollectedStampsResponse.of(stamp.getName(), - stampHistory.getCollectedStamps().get(stamp))) - .toList()) - .certificationImageUrl(stampHistory.getCertificationImageUrl()).build(); - } - -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/entity/ClubStamp.java b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/entity/ClubStamp.java deleted file mode 100644 index 2744b1de..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/entity/ClubStamp.java +++ /dev/null @@ -1,67 +0,0 @@ -package ddingdong.ddingdongBE.domain.qrstamp.entity; - -import java.util.Arrays; -import java.util.NoSuchElementException; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public enum ClubStamp { - - 너나들이("너나들이", "EVENTNNDE"), - 키비탄("키비탄", "EVENTKBT"), - RCY("RCY", "EVENTRCY"), - PTPI("PTPI", "EVENTPTPI"), - 인액터스("인액터스", "EVENTIACT"), - COW("COW", "EVENTCOW"), - 비주얼("비주얼", "EVENTVISUAL"), - SK_루키("SK루키", "EVENTSKROOKIE"), - 명지챌린저스("명지챌린저스", "EVENTMC"), - 농어민후생연구회_흙("농어민후생연구회 흙", "EVENTSOIL"), - 흑풍("흑풍", "EVENTBLACK"), - 통해("통해", "EVENTTH"), - MGH("MGH", "EVENTMGH"), - 화이트홀스("화이트홀스", "EVENTWH"), - 주리랑("주리랑", "EVENTJURI"), - 극예술연구회_알("극예술연구회 알", "EVENTAL"), - 그림패시만화("그림패시만화", "EVENTPIC"), - 포토랩("포토랩", "EVENTPHO"), - 디비전("디비전", "EVENTDIV"), - 코아("코아", "EVENTCOAD"), - 씨네메이션("씨네메이션", "EVENTCINE"), - 실로암("실로암", "EVENTSIL"), - CCC("ccc", "EVENTCCC"), - CFM("Cfm", "EVENTCFM"), - UBF("UBF", "EVENTUBF"), - BB("BB", "EVENTBB"), - 씨네필("씨네필", "EVENTFIL"), - 에뚜알("에뚜알", "EVENTALL"), - DEPTH("DEPth", "EVENTDEPTH"), - IVF("IVF", "EVENTIVF"), - 명월("명월", "EVENTMON"), - 나라오르다("나라오르다", "EVENTFLY"), - 굴렁쇠("굴렁쇠", "EVENTBIKE"), - 나이너스("나이너스", "EVENTBASE"), - FC_명지("FC명지", "EVENTFC"), - 삼박자("삼박자", "EVENTSAM"), - 무릉도원("무릉도원", "EVENTKAL"), - 오버행("오버행", "EVENTHANG"), - MJTA("MJTA", "EVENTMJTA"), - 콕콕콕("콕콕콕", "EVENTCOK"), - 바다이야기("바다이야기", "EVENTSEA"), - 파인("파인", "EVENTPINE"), - TIME("TIME", "EVENTTIME"), - 명지서법("명지서법", "EVENTWORD"), - MIRS("MIRS", "EVENTMIRS"); - - private final String name; - private final String code; - - public static ClubStamp getByClubCode(String code) { - return Arrays.stream(ClubStamp.values()) - .filter(clubStamp -> clubStamp.getCode().equals(code)) - .findFirst() - .orElseThrow(() -> new NoSuchElementException("동아리 코드를 확인해주세요.")); - } -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/entity/StampHistory.java b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/entity/StampHistory.java deleted file mode 100644 index 1bc98d8c..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/entity/StampHistory.java +++ /dev/null @@ -1,87 +0,0 @@ -package ddingdong.ddingdongBE.domain.qrstamp.entity; - -import ddingdong.ddingdongBE.common.BaseEntity; -import io.hypersistence.utils.hibernate.type.json.JsonType; -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Type; -import org.hibernate.annotations.TypeDef; -import org.hibernate.annotations.Where; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Entity -@TypeDef(name = "json", typeClass = JsonType.class) -@SQLDelete(sql = "update stamp_history set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") -@Table(name = "stamp_history", uniqueConstraints = @UniqueConstraint(columnNames = {"studentName", "studentNumber"})) -public class StampHistory extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private String studentName; - - @Column(nullable = false) - private String studentNumber; - - @Type(type = "json") - @Column(columnDefinition = "json") - private final Map collectedStamps = new HashMap<>(); - - private LocalDateTime completedAt; - - private String department; - - private String telephone; - - private String certificationImageUrl; - - @Column(name = "deleted_at") - private LocalDateTime deletedAt; - - @Builder - private StampHistory(Long id, String studentName, String department, String studentNumber, - String telephone, LocalDateTime completedAt, String certificationImageUrl) { - this.id = id; - this.studentName = studentName; - this.department = department; - this.studentNumber = studentNumber; - this.telephone = telephone; - this.completedAt = completedAt; - this.certificationImageUrl = certificationImageUrl; - } - - public void collectStamp(ClubStamp clubStamp, LocalDateTime collectedAt) { - this.collectedStamps.put(clubStamp, collectedAt); - if (this.collectedStamps.size() == 10) { - this.completedAt = LocalDateTime.now(); - } - } - - public boolean isCompleted() { - return this.collectedStamps.size() >= 10; - } - - - public void apply(String telephone, String certificationImageUrl) { - this.telephone = telephone; - this.certificationImageUrl = certificationImageUrl; - } - -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/repository/StampHistoryRepository.java b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/repository/StampHistoryRepository.java deleted file mode 100644 index dd0cee31..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/repository/StampHistoryRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package ddingdong.ddingdongBE.domain.qrstamp.repository; - -import ddingdong.ddingdongBE.domain.qrstamp.entity.StampHistory; -import java.util.List; -import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface StampHistoryRepository extends JpaRepository { - - Optional findStampHistoryByStudentNumber(String studentNumber); - - Optional findStampHistoryByStudentNameAndStudentNumber(String studentName, String studentNumber); - - List findAllByCertificationImageUrlIsNotNull(); - -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/service/QrStampService.java b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/service/QrStampService.java deleted file mode 100644 index 77c4e8fa..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/service/QrStampService.java +++ /dev/null @@ -1,100 +0,0 @@ -package ddingdong.ddingdongBE.domain.qrstamp.service; - -import static ddingdong.ddingdongBE.common.exception.ErrorMessage.INVALID_STAMP_COUNT_FOR_APPLY; -import static ddingdong.ddingdongBE.common.exception.ErrorMessage.NO_SUCH_QR_STAMP_HISTORY; - -import ddingdong.ddingdongBE.domain.event.controller.dto.request.ApplyEventRequest; -import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.request.CollectStampRequest; -import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response.AppliedUsersResponse; -import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response.CollectedStampsResponse; -import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response.CollectionResultResponse; -import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response.DetailAppliedUserResponse; -import ddingdong.ddingdongBE.domain.qrstamp.entity.ClubStamp; -import ddingdong.ddingdongBE.domain.qrstamp.entity.StampHistory; -import ddingdong.ddingdongBE.domain.qrstamp.repository.StampHistoryRepository; -import java.time.LocalDateTime; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class QrStampService { - - private final StampHistoryRepository stampHistoryRepository; - - @Transactional - public String collectStamp(CollectStampRequest request, LocalDateTime collectedAt) { - StampHistory stampHistory = stampHistoryRepository.findStampHistoryByStudentNameAndStudentNumber( - request.getStudentName(), - request.getStudentNumber()) - .orElse(request.toStampHistoryEntity()); - if (stampHistory.isCompleted()) { - return "10개의 벚꽃을 모두 채우셨습니다. 이벤트 응모를 완료해주세요!"; - } - ClubStamp clubStamp = ClubStamp.getByClubCode(request.getClubCode()); - stampHistory.collectStamp(clubStamp, collectedAt); - - stampHistoryRepository.save(stampHistory); - return "ok"; - } - - public CollectionResultResponse getCollectionResult(String studentName, String studentNumber) { - StampHistory stampHistory = stampHistoryRepository.findStampHistoryByStudentNameAndStudentNumber( - studentName, studentNumber) - .orElse(StampHistory.builder() - .studentNumber(studentNumber) - .studentName(studentName).build()); - - List collectedStampsResponse = stampHistory.getCollectedStamps().keySet().stream() - .map(stamp -> CollectedStampsResponse.of(stamp.getName(), - stampHistory.getCollectedStamps().get(stamp))) - .toList(); - return CollectionResultResponse.of(stampHistory.isCompleted(), collectedStampsResponse); - } - - @Transactional - public void applyEvent(ApplyEventRequest request, List imageUrls) { - StampHistory stampHistory = stampHistoryRepository.findStampHistoryByStudentNumber( - request.studentNumber() - ) - .orElseThrow(() -> new NoSuchElementException(NO_SUCH_QR_STAMP_HISTORY.getText())); - - validateEventIsCompleted(stampHistory); - - stampHistory.apply(request.telephone(), imageUrls.get(0)); - } - - public Long findByStudentNumber(String studentNumber) { - StampHistory stampHistory = stampHistoryRepository.findStampHistoryByStudentNumber(studentNumber) - .orElseThrow(() -> new NoSuchElementException(NO_SUCH_QR_STAMP_HISTORY.getText())); - - return stampHistory.getId(); - } - - public List findAllAppliedUsers() { - List appliedStampHistories = stampHistoryRepository.findAllByCertificationImageUrlIsNotNull(); - return appliedStampHistories.stream() - .map(AppliedUsersResponse::from) - .collect(Collectors.toList()); - } - - public DetailAppliedUserResponse findAppliedUser(Long stampHistoryId) { - StampHistory stampHistory = stampHistoryRepository.findById(stampHistoryId) - .orElseThrow(() -> new NoSuchElementException("응모 내역이 존재하지 않습니다.")); - - return DetailAppliedUserResponse.from(stampHistory); - - } - - private void validateEventIsCompleted(StampHistory stampHistory) { - if (!stampHistory.isCompleted()) { - throw new IllegalArgumentException(INVALID_STAMP_COUNT_FOR_APPLY.getText()); - } - } - -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/question/entity/Question.java b/src/main/java/ddingdong/ddingdongBE/domain/question/entity/Question.java index 605a1125..4234631f 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/question/entity/Question.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/question/entity/Question.java @@ -2,29 +2,27 @@ import ddingdong.ddingdongBE.common.BaseEntity; import ddingdong.ddingdongBE.domain.user.entity.User; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @RequiredArgsConstructor(access = AccessLevel.PROTECTED) @SQLDelete(sql = "update question set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") -@Table(name = "question") +@SQLRestriction("deleted_at IS NULL") public class Question extends BaseEntity { @Id @@ -41,7 +39,7 @@ public class Question extends BaseEntity { @Column(nullable = false) private String reply; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; @Builder diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/api/AdminScoreHistoryApi.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/api/AdminScoreHistoryApi.java index 73ccdedf..41474be2 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/api/AdminScoreHistoryApi.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/api/AdminScoreHistoryApi.java @@ -11,7 +11,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryController.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryController.java index ff6d2b65..38f36fda 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryController.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryController.java @@ -20,7 +20,7 @@ public class ClubScoreHistoryController implements ClubScoreHistoryApi { public ScoreHistoryFilterByClubResponse findMyScoreHistories(PrincipalDetails principalDetails) { Club club = clubService.getByUserId(principalDetails.getUser().getId()); - List scoreHistoryResponses = scoreHistoryService.findAllByUserId(club.getId()) + List scoreHistoryResponses = scoreHistoryService.findAllByClubId(club.getId()) .stream() .map(ScoreHistoryResponse::from) .toList(); diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/request/CreateScoreHistoryRequest.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/request/CreateScoreHistoryRequest.java index 6071ed73..e3f0e29e 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/request/CreateScoreHistoryRequest.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/request/CreateScoreHistoryRequest.java @@ -4,7 +4,8 @@ import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreCategory; import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreHistory; import io.swagger.v3.oas.annotations.media.Schema; -import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import jakarta.validation.constraints.NotNull; import lombok.Builder; @Schema( @@ -26,7 +27,7 @@ public record CreateScoreHistoryRequest( @Schema(description = "변동 점수", example = "10") @NotNull(message = "변동 점수는 필수입니다.") - float amount + BigDecimal amount ) { public ScoreHistory toEntity(Club club) { diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/ScoreHistoryFilterByClubResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/ScoreHistoryFilterByClubResponse.java index 1f4d7485..9950e94d 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/ScoreHistoryFilterByClubResponse.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/ScoreHistoryFilterByClubResponse.java @@ -5,6 +5,7 @@ import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreHistory; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Schema; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; import lombok.Builder; @@ -17,7 +18,7 @@ public record ScoreHistoryFilterByClubResponse( @Schema(description = "동아리 총 점수", example = "50") - float totalScore, + BigDecimal totalScore, @ArraySchema(schema = @Schema(description = "점수내역 목록", implementation = ScoreHistoryResponse.class)) List scoreHistories ) { @@ -41,7 +42,7 @@ public record ScoreHistoryResponse( @Schema(description = "점수 내역 이유", example = "활동보고서 작성") String reason, @Schema(description = "변동 점수", example = "10") - float amount, + BigDecimal amount, @Schema(description = "작성일", example = "2024-01-01") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime createdAt diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/Score.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/Score.java index 5f1e1ab6..173d9f30 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/Score.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/Score.java @@ -1,8 +1,9 @@ package ddingdong.ddingdongBE.domain.scorehistory.entity; +import java.math.BigDecimal; import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -15,9 +16,9 @@ public class Score { @Column(name = "score") - private float value; + private BigDecimal value; - private Score(float value) { + private Score(BigDecimal value) { this.value = value; } @@ -30,7 +31,7 @@ public boolean equals(Object o) { return false; } Score score = (Score) o; - return getValue() == score.getValue(); + return Objects.equals(getValue(), score.getValue()); } @Override @@ -38,7 +39,7 @@ public int hashCode() { return Objects.hash(getValue()); } - public static Score from(float value) { + public static Score from(BigDecimal value) { return new Score(value); } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/ScoreHistory.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/ScoreHistory.java index ee66a932..afec0c9b 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/ScoreHistory.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/entity/ScoreHistory.java @@ -1,34 +1,31 @@ package ddingdong.ddingdongBE.domain.scorehistory.entity; import ddingdong.ddingdongBE.common.BaseEntity; - import ddingdong.ddingdongBE.domain.club.entity.Club; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import java.math.BigDecimal; import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; - -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @SQLDelete(sql = "update score_history set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") -@Table(name = "score_history") +@SQLRestriction("deleted_at IS NULL") public class ScoreHistory extends BaseEntity { @Id @@ -39,18 +36,18 @@ public class ScoreHistory extends BaseEntity { @JoinColumn(name = "club_id") private Club club; - private float amount; + private BigDecimal amount; @Enumerated(EnumType.STRING) private ScoreCategory scoreCategory; private String reason; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; @Builder - public ScoreHistory(Club club, float amount, ScoreCategory scoreCategory, String reason) { + public ScoreHistory(Club club, BigDecimal amount, ScoreCategory scoreCategory, String reason) { this.club = club; this.amount = amount; this.scoreCategory = scoreCategory; diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/ScoreHistoryService.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/ScoreHistoryService.java index 7f4b0e1a..d7472271 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/ScoreHistoryService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/ScoreHistoryService.java @@ -5,6 +5,8 @@ import ddingdong.ddingdongBE.domain.scorehistory.controller.dto.request.CreateScoreHistoryRequest; import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreHistory; import ddingdong.ddingdongBE.domain.scorehistory.repository.ScoreHistoryRepository; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -21,7 +23,7 @@ public class ScoreHistoryService { public void create(final Long clubId, CreateScoreHistoryRequest createScoreHistoryRequest) { Club club = clubService.getByClubId(clubId); - float score = roundToThirdPoint(createScoreHistoryRequest.amount()); + BigDecimal score = roundToThirdPoint(createScoreHistoryRequest.amount()); clubService.updateClubScore(clubId, score); scoreHistoryRepository.save(createScoreHistoryRequest.toEntity(club)); } @@ -37,7 +39,7 @@ public List findAllByUserId(final Long userId) { return scoreHistoryRepository.findByClubId(club.getId()); } - private float roundToThirdPoint(float value) { - return Math.round(value * 1000.0) / 1000.0F; + private BigDecimal roundToThirdPoint(BigDecimal value) { + return value.setScale(3, RoundingMode.DOWN); } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/user/entity/Password.java b/src/main/java/ddingdong/ddingdongBE/domain/user/entity/Password.java index 14a66bb7..8df6752a 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/user/entity/Password.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/user/entity/Password.java @@ -3,7 +3,7 @@ import static ddingdong.ddingdongBE.common.exception.ErrorMessage.*; import java.util.Objects; -import javax.persistence.Column; +import jakarta.persistence.Column; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/ddingdong/ddingdongBE/domain/user/entity/User.java b/src/main/java/ddingdong/ddingdongBE/domain/user/entity/User.java index d8c4713f..22d389a5 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/user/entity/User.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/user/entity/User.java @@ -1,28 +1,27 @@ package ddingdong.ddingdongBE.domain.user.entity; import ddingdong.ddingdongBE.common.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; - -import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; -import org.hibernate.annotations.Where; +import org.hibernate.annotations.SQLRestriction; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @SQLDelete(sql = "update users set deleted_at = CURRENT_TIMESTAMP where id=?") -@Where(clause = "deleted_at IS NULL") +@SQLRestriction("deleted_at IS NULL") @Table(name = "users") public class User extends BaseEntity { @@ -40,7 +39,7 @@ public class User extends BaseEntity { @Enumerated(EnumType.STRING) private Role role; - @Column(name = "deleted_at") + @Column(name = "deleted_at", columnDefinition = "TIMESTAMP") private LocalDateTime deletedAt; @Builder diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 1adac477..871e848e 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -12,10 +12,9 @@ spring: jpa: database: mysql hibernate: - ddl-auto: update + ddl-auto: validate properties: hibernate.format_sql: true - dialect: org.hibernate.dialect.MySQL8InnoDBDialect defer-datasource-initialization: false sql: diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 041345b5..39d37aa7 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -3,9 +3,6 @@ spring: activate: on-profile: local - flyway: - enabled: false - datasource: url: jdbc:mysql://localhost:3307/ddingdong_local_db driver-class-name: com.mysql.cj.jdbc.Driver @@ -14,14 +11,9 @@ spring: jpa: hibernate: - ddl-auto: create + ddl-auto: validate properties: hibernate: format_sql: true - dialect: org.hibernate.dialect.MySQL8Dialect show-sql: true - defer-datasource-initialization: true - - sql: - init: - mode: always + defer-datasource-initialization: false diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 24ae6186..e4cddf3d 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -11,7 +11,6 @@ spring: jpa: database: mysql - database-platform: org.hibernate.dialect.MySQL5InnoDBDialect hibernate: ddl-auto: none properties: @@ -28,3 +27,7 @@ jwt: issuer: "ddingdong" secret: ${JWT_SECRET} expiration: 36000 + +sentry: + dsn: ${SENTRY_DSN} + environment: prod diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index b272b78e..630f3095 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -14,7 +14,6 @@ spring: show-sql: true format_sql: true auto_quote_keyword: true - dialect: org.hibernate.dialect.MySQL8Dialect sql: init: diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index bf014957..3591c538 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -2,5 +2,34 @@ insert into users(name, password, role, userid) values ('ddingdong', '$2a$12$9BIi3IGc79rU3Xgbnxq/X.T37Hlfrf/lSc2/g0HLeM1g7HmFXE8v.', 'ADMIN', 'ddingdong11'), ('cow', '$2a$12$9BIi3IGc79rU3Xgbnxq/X.T37Hlfrf/lSc2/g0HLeM1g7HmFXE8v.', 'CLUB', 'cow11'); -insert into club(name, category, leader, tag, score, phone_number, location, user_id) -values ('카우', '학술', '김세빈', 'IT', 0, '010-0000-0000', 'S1350', 2); +INSERT INTO club(name, + category, + leader, + tag, + score, + phone_number, + location, + user_id, + start_recruit_period, + end_recruit_period, + regular_meeting, + introduction, + activity, + ideal, + form_url) +VALUES ('카우', + '학술', + '김세빈', + 'IT', + 0, + '010-0000-0000', + 'S1350', + 2, + NULL, + NULL, + '매주 월요일 18:00시', + '동아리 소개입니다.', + '동아리 활동내용입니다.', + NULL, + NULL + ); diff --git a/src/main/resources/db/migration/V4__Create_feed.sql b/src/main/resources/db/migration/V4__Create_feed.sql new file mode 100644 index 00000000..73f2c581 --- /dev/null +++ b/src/main/resources/db/migration/V4__Create_feed.sql @@ -0,0 +1,11 @@ +CREATE TABLE feed ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + activity_content VARCHAR(255) NOT NULL, + thumbnail_url VARCHAR(255) NOT NULL, + feed_type VARCHAR(10) NOT NULL, + deleted_at DATETIME, + club_id BIGINT, + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL, + CONSTRAINT fk_feed_club_id FOREIGN KEY (club_id) REFERENCES club(id) +); diff --git a/src/main/resources/db/migration/V5__Alter_score_type.sql b/src/main/resources/db/migration/V5__Alter_score_type.sql new file mode 100644 index 00000000..f0d0e2c7 --- /dev/null +++ b/src/main/resources/db/migration/V5__Alter_score_type.sql @@ -0,0 +1 @@ +ALTER TABLE score_history MODIFY amount decimal(10,3) diff --git a/src/main/resources/db/migration/V6__Feed_add_column_fileurl.sql b/src/main/resources/db/migration/V6__Feed_add_column_fileurl.sql new file mode 100644 index 00000000..7df7ae26 --- /dev/null +++ b/src/main/resources/db/migration/V6__Feed_add_column_fileurl.sql @@ -0,0 +1 @@ +ALTER TABLE feed ADD COLUMN file_url VARCHAR(255) NOT NULL; diff --git a/src/main/resources/db/migration/V7__Drop_table_stamp_history.sql b/src/main/resources/db/migration/V7__Drop_table_stamp_history.sql new file mode 100644 index 00000000..b4c3f97d --- /dev/null +++ b/src/main/resources/db/migration/V7__Drop_table_stamp_history.sql @@ -0,0 +1 @@ +DROP TABLE stamp_history; diff --git a/src/main/resources/db/migration/V8__apply_key_name_convention.sql b/src/main/resources/db/migration/V8__apply_key_name_convention.sql new file mode 100644 index 00000000..8d7a3696 --- /dev/null +++ b/src/main/resources/db/migration/V8__apply_key_name_convention.sql @@ -0,0 +1,70 @@ +-- activity_report_participants 테이블 +ALTER TABLE activity_report_participants + DROP FOREIGN KEY FKbine0e4wrv5vp15ifuivm7ysv, + ADD CONSTRAINT FK_activity_report_participants_activity_report_id + FOREIGN KEY (activity_report_id) REFERENCES activity_report (id); + +-- banner 테이블 +ALTER TABLE banner + DROP FOREIGN KEY FKk5t5cl4qmev8n93gi9whm44p5, + ADD CONSTRAINT FK_banner_users_id + FOREIGN KEY (user_id) REFERENCES users (id); + +-- club 테이블 +ALTER TABLE club + DROP FOREIGN KEY FK7xnudv3706b3xpjrhutva13rd, + ADD CONSTRAINT FK_club_users_user_id + FOREIGN KEY (user_id) REFERENCES users (id); + +-- activity_report 테이블 +ALTER TABLE activity_report + DROP FOREIGN KEY FKol6ps7dpml9l2kuokcciyv1kk, + ADD CONSTRAINT FK_activity_report_club_id + FOREIGN KEY (club_id) REFERENCES club (id); + +-- club_member 테이블 +ALTER TABLE club_member + DROP FOREIGN KEY FKf6tl19ih8acrmheidn4xos2tx, + ADD CONSTRAINT FK_club_member_club_id + FOREIGN KEY (club_id) REFERENCES club (id); + +-- document 테이블 +ALTER TABLE document + DROP FOREIGN KEY FKm19xjdnh3l6aueyrpm1705t52, + ADD CONSTRAINT FK_document_users_id + FOREIGN KEY (user_id) REFERENCES users (id); + +-- fix_zone 테이블 +ALTER TABLE fix_zone + DROP FOREIGN KEY FKrv7031dafqlk0k5nm8x69p85g, + ADD CONSTRAINT FK_fix_zone_club_id + FOREIGN KEY (club_id) REFERENCES club (id); + +-- fix_zone_comment 테이블 +ALTER TABLE fix_zone_comment + DROP FOREIGN KEY FKc2d91n1o7eindrcl3io79hlj7, + ADD CONSTRAINT FK_fix_zone_comment_club_id + FOREIGN KEY (club_id) REFERENCES club (id); + +ALTER TABLE fix_zone_comment + DROP FOREIGN KEY FKfbkrutdl1qo2f1hnva40cixj7, + ADD CONSTRAINT FK_fix_zone_comment_fix_zone_id + FOREIGN KEY (fix_zone_id) REFERENCES fix_zone (id); + +-- notice 테이블 +ALTER TABLE notice + DROP FOREIGN KEY FK6hu3mfrsmpbqjk44w2fq5t5us, + ADD CONSTRAINT FK_notice_users_id + FOREIGN KEY (user_id) REFERENCES users (id); + +-- question 테이블 +ALTER TABLE question + DROP FOREIGN KEY FK7rnpup7eaonh2ubt922ormoij, + ADD CONSTRAINT FK_question_users_id + FOREIGN KEY (user_id) REFERENCES users (id); + +-- score_history 테이블 +ALTER TABLE score_history + DROP FOREIGN KEY FK1otphxnm3ngxfkbw3lmbwqt78, + ADD CONSTRAINT FK_score_history_club_id + FOREIGN KEY (club_id) REFERENCES club (id); diff --git a/src/test/java/ddingdong/ddingdongBE/common/support/DataInitializer.java b/src/test/java/ddingdong/ddingdongBE/common/support/DataInitializer.java index 2ecc1fcd..19b33e58 100644 --- a/src/test/java/ddingdong/ddingdongBE/common/support/DataInitializer.java +++ b/src/test/java/ddingdong/ddingdongBE/common/support/DataInitializer.java @@ -1,10 +1,10 @@ package ddingdong.ddingdongBE.common.support; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; import java.util.ArrayList; import java.util.List; -import javax.persistence.EntityManager; +import jakarta.persistence.EntityManager; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.springframework.context.annotation.Profile; diff --git a/src/test/java/ddingdong/ddingdongBE/common/support/FixtureMonkeyFactory.java b/src/test/java/ddingdong/ddingdongBE/common/support/FixtureMonkeyFactory.java index 35fc0cbc..69d96838 100644 --- a/src/test/java/ddingdong/ddingdongBE/common/support/FixtureMonkeyFactory.java +++ b/src/test/java/ddingdong/ddingdongBE/common/support/FixtureMonkeyFactory.java @@ -11,4 +11,11 @@ public static FixtureMonkey getBuilderIntrospectorMonkey() { .build(); } + public static FixtureMonkey getNotNullBuilderIntrospectorMonkey() { + return FixtureMonkey.builder() + .objectIntrospector(BuilderArbitraryIntrospector.INSTANCE) + .defaultNotNull(true) + .build(); + } + } diff --git a/src/test/java/ddingdong/ddingdongBE/domain/activityreport/domain/ActivityReportTest.java b/src/test/java/ddingdong/ddingdongBE/domain/activityreport/domain/ActivityReportTest.java index 7b86d8c4..e5214441 100644 --- a/src/test/java/ddingdong/ddingdongBE/domain/activityreport/domain/ActivityReportTest.java +++ b/src/test/java/ddingdong/ddingdongBE/domain/activityreport/domain/ActivityReportTest.java @@ -1,10 +1,8 @@ package ddingdong.ddingdongBE.domain.activityreport.domain; -import static org.junit.jupiter.api.Assertions.*; - import ddingdong.ddingdongBE.common.support.DataJpaTestSupport; import ddingdong.ddingdongBE.domain.activityreport.repository.ActivityReportRepository; -import javax.persistence.EntityManager; +import jakarta.persistence.EntityManager; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -37,4 +35,4 @@ void soft_delete() { Assertions.assertThat(findActivityReport).isNotNull(); Assertions.assertThat(findActivityReport.getDeletedAt()).isNotNull(); } -} \ No newline at end of file +} diff --git a/src/test/java/ddingdong/ddingdongBE/domain/club/service/FacadeClubMemberServiceTest.java b/src/test/java/ddingdong/ddingdongBE/domain/club/service/FacadeClubMemberServiceTest.java index c1740512..e975fe7e 100644 --- a/src/test/java/ddingdong/ddingdongBE/domain/club/service/FacadeClubMemberServiceTest.java +++ b/src/test/java/ddingdong/ddingdongBE/domain/club/service/FacadeClubMemberServiceTest.java @@ -11,11 +11,13 @@ import ddingdong.ddingdongBE.domain.club.repository.ClubMemberRepository; import ddingdong.ddingdongBE.domain.club.repository.ClubRepository; import ddingdong.ddingdongBE.domain.club.service.dto.UpdateClubMemberCommand; +import ddingdong.ddingdongBE.domain.scorehistory.entity.Score; import ddingdong.ddingdongBE.domain.user.entity.User; import ddingdong.ddingdongBE.domain.user.repository.UserRepository; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.math.BigDecimal; import java.util.List; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; @@ -86,7 +88,10 @@ void updateClubList() throws IOException { ); User savedUser = userRepository.save(fixtureMonkey.giveMeOne(User.class)); - Club savedClub = clubRepository.save(fixtureMonkey.giveMeBuilder(Club.class).set("user", savedUser).sample()); + Club savedClub = clubRepository.save(fixtureMonkey.giveMeBuilder(Club.class) + .set("user", savedUser) + .set("score", Score.from(BigDecimal.ZERO)) + .sample()); List clubMembers = fixtureMonkey.giveMeBuilder(ClubMember.class) .set("club", savedClub) .sampleList(5); @@ -108,7 +113,10 @@ void updateClubList() throws IOException { void update() { //given User savedUser = userRepository.save(fixtureMonkey.giveMeOne(User.class)); - Club savedClub = clubRepository.save(fixtureMonkey.giveMeBuilder(Club.class).set("user", savedUser).sample()); + Club savedClub = clubRepository.save(fixtureMonkey.giveMeBuilder(Club.class) + .set("user", savedUser) + .set("score", Score.from(BigDecimal.ZERO)) + .sample()); ClubMember savedClubMember = clubMemberRepository.save( fixtureMonkey.giveMeBuilder(ClubMember.class).set("club", savedClub).sample()); diff --git a/src/test/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepositoryTest.java b/src/test/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepositoryTest.java new file mode 100644 index 00000000..632afc49 --- /dev/null +++ b/src/test/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepositoryTest.java @@ -0,0 +1,128 @@ +package ddingdong.ddingdongBE.domain.feed.repository; + +import com.navercorp.fixturemonkey.FixtureMonkey; +import ddingdong.ddingdongBE.common.support.DataJpaTestSupport; +import ddingdong.ddingdongBE.common.support.FixtureMonkeyFactory; +import ddingdong.ddingdongBE.domain.club.entity.Club; +import ddingdong.ddingdongBE.domain.club.repository.ClubRepository; +import ddingdong.ddingdongBE.domain.feed.entity.Feed; +import ddingdong.ddingdongBE.domain.feed.entity.FeedType; +import ddingdong.ddingdongBE.domain.scorehistory.entity.Score; +import java.math.BigDecimal; +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class FeedRepositoryTest extends DataJpaTestSupport { + + @Autowired + private ClubRepository clubRepository; + + @Autowired + private FeedRepository feedRepository; + + private final FixtureMonkey fixture = FixtureMonkeyFactory.getNotNullBuilderIntrospectorMonkey(); + + @DisplayName("동아리 ID로 해당 동아리의 모든 피드를 최신순으로 조회한다.") + @Test + void findAllByClubIdOrderById() { + // given + Club club = fixture.giveMeBuilder(Club.class) + .set("name", "카우") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .sample(); + Club savedClub = clubRepository.save(club); + + Feed feed1 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub) + .set("thumbnailUrl", "썸네일1") + .set("feedType", FeedType.IMAGE) + .sample(); + Feed feed2 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub) + .set("thumbnailUrl", "썸네일2") + .set("feedType", FeedType.VIDEO) + .sample(); + Feed feed3 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub) + .set("thumbnailUrl", "썸네일3") + .set("feedType", FeedType.IMAGE) + .sample(); + feedRepository.save(feed1); + feedRepository.save(feed2); + feedRepository.save(feed3); + + // when + List feeds = feedRepository.findAllByClubIdOrderById(savedClub.getId()); + + // then + Assertions.assertThat(feeds.get(0).getThumbnailUrl()).isEqualTo("썸네일3"); + Assertions.assertThat(feeds.get(0).getId()).isEqualTo(3L); + Assertions.assertThat(feeds.get(1).getThumbnailUrl()).isEqualTo("썸네일2"); + Assertions.assertThat(feeds.get(1).getId()).isEqualTo(2L); + Assertions.assertThat(feeds.get(2).getThumbnailUrl()).isEqualTo("썸네일1"); + Assertions.assertThat(feeds.get(2).getId()).isEqualTo(1L); + } + + @DisplayName("모든 동아리의 최신 피드를 모두 조회할 수 있다.") + @Test + void test() { + // given + Club club1 = fixture.giveMeBuilder(Club.class) + .set("name", "카우1") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .sample(); + Club club2 = fixture.giveMeBuilder(Club.class) + .set("name", "카우2") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .sample(); + Club club3 = fixture.giveMeBuilder(Club.class) + .set("name", "카우3") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .sample(); + Club savedClub1 = clubRepository.save(club1); + Club savedClub2 = clubRepository.save(club2); + Club savedClub3 = clubRepository.save(club3); + + Feed feed1 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub1) + .set("thumbnailUrl", "클럽 1 올드 url") + .sample(); + Feed feed2 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub1) + .set("thumbnailUrl", "클럽 1 최신 url") + .sample(); + Feed feed3 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub2) + .set("thumbnailUrl", "클럽 2 올드 url") + .sample(); + Feed feed4 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub2) + .set("thumbnailUrl", "클럽 2 최신 url") + .sample(); + Feed feed5 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub3) + .set("thumbnailUrl", "클럽 3 올드 url") + .sample(); + Feed feed6 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub3) + .set("thumbnailUrl", "클럽 3 최신 url") + .sample(); + feedRepository.saveAll(List.of(feed1, feed2, feed3, feed4, feed5, feed6)); + + // when + List newestFeeds = feedRepository.findNewestAll(); + + // then + Assertions.assertThat(newestFeeds.size()).isEqualTo(3); + Assertions.assertThat(newestFeeds.get(0).getId()).isEqualTo(6L); + Assertions.assertThat(newestFeeds.get(1).getId()).isEqualTo(4L); + Assertions.assertThat(newestFeeds.get(2).getId()).isEqualTo(2L); + } +} diff --git a/src/test/java/ddingdong/ddingdongBE/domain/feed/service/FacadeFeedServiceTest.java b/src/test/java/ddingdong/ddingdongBE/domain/feed/service/FacadeFeedServiceTest.java new file mode 100644 index 00000000..e24866d4 --- /dev/null +++ b/src/test/java/ddingdong/ddingdongBE/domain/feed/service/FacadeFeedServiceTest.java @@ -0,0 +1,190 @@ +package ddingdong.ddingdongBE.domain.feed.service; + +import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileDomainCategory.CLUB_PROFILE; +import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileTypeCategory.IMAGE; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.tuple; +import static org.mockito.BDDMockito.given; + +import com.navercorp.fixturemonkey.FixtureMonkey; +import ddingdong.ddingdongBE.common.support.FixtureMonkeyFactory; +import ddingdong.ddingdongBE.common.support.TestContainerSupport; +import ddingdong.ddingdongBE.domain.club.entity.Club; +import ddingdong.ddingdongBE.domain.club.repository.ClubRepository; +import ddingdong.ddingdongBE.domain.feed.entity.Feed; +import ddingdong.ddingdongBE.domain.feed.entity.FeedType; +import ddingdong.ddingdongBE.domain.feed.repository.FeedRepository; +import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedListQuery; +import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedQuery; +import ddingdong.ddingdongBE.domain.fileinformation.service.FileInformationService; +import ddingdong.ddingdongBE.domain.scorehistory.entity.Score; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; + +@SpringBootTest +class FacadeFeedServiceTest extends TestContainerSupport { + + @Autowired + private ClubRepository clubRepository; + + @Autowired + private FeedRepository feedRepository; + + @Autowired + private FacadeFeedService facadeFeedService; + + @MockBean + private FileInformationService fileInformationService; + + private final FixtureMonkey fixture = FixtureMonkeyFactory.getNotNullBuilderIntrospectorMonkey(); + + @DisplayName("모든 사용자는 피드를 조회할 수 있다.") + @Test + void getAllFeed() { + // given + Club club = fixture.giveMeBuilder(Club.class) + .set("name", "카우") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .sample(); + Club savedClub = clubRepository.save(club); + + Feed feed1 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub) + .set("thumbnailUrl", "썸네일1") + .set("feedType", FeedType.IMAGE) + .sample(); + Feed feed2 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub) + .set("thumbnailUrl", "썸네일2") + .set("feedType", FeedType.VIDEO) + .sample(); + Feed feed3 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub) + .set("thumbnailUrl", "썸네일3") + .set("feedType", FeedType.IMAGE) + .sample(); + feedRepository.saveAll(List.of(feed1, feed2, feed3)); + + // when + List infos = facadeFeedService.getAllByClubId(1L); + + // then + assertThat(infos).hasSize(3); + assertThat(infos) + .extracting("id", "thumbnailUrl", "feedType") + .containsExactly( + tuple(3L, "썸네일3", "IMAGE"), + tuple(2L, "썸네일2", "VIDEO"), + tuple(1L, "썸네일1", "IMAGE") + ); + } + + @DisplayName("모든 사용자는 전체 동아리의 최신 피드를 조회할 수 있다.") + @Test + void getNewestAll() { + // given + Club club1 = fixture.giveMeBuilder(Club.class) + .set("name", "카우1") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .sample(); + Club club2 = fixture.giveMeBuilder(Club.class) + .set("name", "카우2") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .sample(); + Club club3 = fixture.giveMeBuilder(Club.class) + .set("name", "카우3") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .sample(); + Club savedClub1 = clubRepository.save(club1); + Club savedClub2 = clubRepository.save(club2); + Club savedClub3 = clubRepository.save(club3); + + Feed feed1 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub1) + .set("thumbnailUrl", "클럽 1 올드 url") + .sample(); + Feed feed2 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub1) + .set("thumbnailUrl", "클럽 1 최신 url") + .sample(); + Feed feed3 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub2) + .set("thumbnailUrl", "클럽 2 올드 url") + .sample(); + Feed feed4 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub2) + .set("thumbnailUrl", "클럽 2 최신 url") + .sample(); + Feed feed5 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub3) + .set("thumbnailUrl", "클럽 3 올드 url") + .sample(); + Feed feed6 = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub3) + .set("thumbnailUrl", "클럽 3 최신 url") + .sample(); + feedRepository.saveAll(List.of(feed1, feed2, feed3, feed4, feed5, feed6)); + + // when + List infos = facadeFeedService.getNewestAll(); + + // then + assertThat(infos).hasSize(3); + assertThat(infos.get(0).thumbnailUrl()).isEqualTo(feed6.getThumbnailUrl()); + assertThat(infos.get(0).id()).isEqualTo(feed6.getId()); + assertThat(infos.get(1).thumbnailUrl()).isEqualTo(feed4.getThumbnailUrl()); + assertThat(infos.get(1).id()).isEqualTo(feed4.getId()); + assertThat(infos.get(2).thumbnailUrl()).isEqualTo(feed2.getThumbnailUrl()); + assertThat(infos.get(2).id()).isEqualTo(feed2.getId()); + } + + @DisplayName("모든 사용자는 동아리 피드에 대해 상세 조회할 수 있다.") + @Test + void getFeedById() { + // given + Club club = fixture.giveMeBuilder(Club.class) + .set("name", "카우") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .sample(); + Club savedClub = clubRepository.save(club); + + given(fileInformationService.getImageUrls(IMAGE.getFileType() + CLUB_PROFILE.getFileDomain() + savedClub.getId())) + .willReturn(new ArrayList<>()); + + LocalDateTime now = LocalDateTime.now(); + Feed feed = fixture.giveMeBuilder(Feed.class) + .set("club", savedClub) + .set("activityContent", "카우 활동내역") + .set("fileUrl", "feed url") + .set("feedType", FeedType.IMAGE) + .set("createdAt", now) + .sample(); + Feed savedFeed = feedRepository.save(feed); + + // when + FeedQuery info = facadeFeedService.getById(savedFeed.getId()); + + // then + assertThat(info).isNotNull(); + assertThat(info.id()).isEqualTo(savedFeed.getId()); + assertThat(info.clubProfileQuery().name()).isEqualTo(savedClub.getName()); + assertThat(info.activityContent()).isEqualTo(savedFeed.getActivityContent()); + assertThat(info.feedType()).isEqualTo(savedFeed.getFeedType().toString()); + assertThat(info.clubProfileQuery().profileImageUrl()).isEqualTo(null); + assertThat(info.fileUrl()).isEqualTo(savedFeed.getFileUrl()); + assertThat(info.createdDate()).isEqualTo(LocalDate.from(now)); + } +} diff --git a/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/AdminScoreHistoryControllerUnitTest.java b/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/AdminScoreHistoryControllerUnitTest.java index c14ae701..31f90fab 100644 --- a/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/AdminScoreHistoryControllerUnitTest.java +++ b/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/AdminScoreHistoryControllerUnitTest.java @@ -16,6 +16,7 @@ import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreHistory; import ddingdong.ddingdongBE.common.support.WebApiUnitTestSupport; import ddingdong.ddingdongBE.common.support.WithMockAuthenticatedUser; +import java.math.BigDecimal; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -29,16 +30,16 @@ void findAllScoreHistories() throws Exception { //given Club club = Club.builder() .id(1L) - .score(Score.from(55)).build(); + .score(Score.from(new BigDecimal(55))).build(); List scoreHistories = List.of(ScoreHistory.builder() .club(club) .scoreCategory(CARRYOVER_SCORE) - .amount(5) + .amount(new BigDecimal(5)) .reason("reasonA").build(), ScoreHistory.builder() .club(club) .scoreCategory(ACTIVITY_REPORT) - .amount(5) + .amount(new BigDecimal(5)) .reason("reasonB").build()); when(clubService.getByClubId(anyLong())).thenReturn(club); when(scoreHistoryService.findAllByClubId(club.getId())).thenReturn(scoreHistories); diff --git a/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryControllerUnitTest.java b/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryControllerUnitTest.java index 0842131f..74ee0d5d 100644 --- a/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryControllerUnitTest.java +++ b/src/test/java/ddingdong/ddingdongBE/domain/scorehistory/controller/ClubScoreHistoryControllerUnitTest.java @@ -16,6 +16,7 @@ import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreHistory; import ddingdong.ddingdongBE.common.support.WebApiUnitTestSupport; import ddingdong.ddingdongBE.common.support.WithMockAuthenticatedUser; +import java.math.BigDecimal; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -23,25 +24,25 @@ class ClubScoreHistoryControllerUnitTest extends WebApiUnitTestSupport { @WithMockAuthenticatedUser(role = "CLUB") - @DisplayName("동아리- 내 점수 내역 조회 요청을 수행한다.") + @DisplayName("동아리 - 내 점수 내역 조회 요청을 수행한다.") @Test void getScoreHistories() throws Exception { //given Club club = Club.builder() .id(1L) - .score(Score.from(55)).build(); + .score(Score.from(new BigDecimal(55))).build(); List scoreHistories = List.of(ScoreHistory.builder() .club(club) .scoreCategory(CARRYOVER_SCORE) - .amount(5) + .amount(new BigDecimal(5)) .reason("reasonA").build(), ScoreHistory.builder() .club(club) .scoreCategory(ACTIVITY_REPORT) - .amount(5) + .amount(new BigDecimal(5)) .reason("reasonB").build()); when(clubService.getByUserId(anyLong())).thenReturn(club); - when(scoreHistoryService.findAllByUserId(club.getId())).thenReturn(scoreHistories); + when(scoreHistoryService.findAllByClubId(club.getId())).thenReturn(scoreHistories); //when //then mockMvc.perform(get("/server/club/my/score")