Skip to content

Commit 12e8188

Browse files
authored
✨ feat: 월별 등록된 데이트 장소 수 및 많이 찾은 키워드 집계 AOP 구현
2 parents 24653df + a6913e8 commit 12e8188

File tree

38 files changed

+1433
-2
lines changed

38 files changed

+1433
-2
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ dependencies {
6868
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
6969
testImplementation 'com.h2database:h2'
7070

71+
// MongoDB
72+
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
73+
7174
// firebase
7275
implementation 'com.google.firebase:firebase-admin:9.1.0'
7376
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,33 @@
11
package org.withtime.be.withtimebe;
22

3+
import java.util.TimeZone;
4+
35
import org.springframework.boot.SpringApplication;
46
import org.springframework.boot.autoconfigure.SpringBootApplication;
7+
import org.springframework.context.annotation.ComponentScan;
8+
import org.springframework.context.annotation.FilterType;
59
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
10+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
611
import org.springframework.scheduling.annotation.EnableScheduling;
712

13+
import jakarta.annotation.PostConstruct;
14+
15+
816
@EnableScheduling
917
@EnableJpaAuditing
18+
@EnableJpaRepositories(
19+
basePackages = {"org.withtime.be"},
20+
excludeFilters = @ComponentScan.Filter(
21+
type = FilterType.REGEX,
22+
pattern = "org\\.withtime\\.be\\.withtimebe\\.domain\\.log\\..*"
23+
))
1024
@SpringBootApplication
1125
public class WithTimeBeApplication {
1226

1327
public static void main(String[] args) {
1428
SpringApplication.run(WithTimeBeApplication.class, args);
1529
}
1630

31+
@PostConstruct
32+
public void init() { TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul")); } // JVM 기본 TimeZone 설정
1733
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.withtime.be.withtimebe.domain.date.repository;
2+
3+
import java.time.LocalDate;
4+
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.withtime.be.withtimebe.domain.date.entity.DateCourse;
7+
8+
public interface DateCourseRepository extends JpaRepository<DateCourse, Long> {
9+
Long countByCreatedAtBetween(LocalDate startTime, LocalDate endTime);
10+
Long countByMemberId(Long memberId);
11+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.withtime.be.withtimebe.domain.date.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.springframework.data.jpa.repository.Query;
5+
import org.springframework.data.repository.query.Param;
6+
import org.withtime.be.withtimebe.domain.date.entity.DatePlaceDateCourse;
7+
8+
public interface DatePlaceDateCourseRepository extends JpaRepository<DatePlaceDateCourse, Long> {
9+
@Query("""
10+
SELECT COUNT(dpc)
11+
FROM DatePlaceDateCourse dpc
12+
JOIN dpc.dateCourse dc
13+
WHERE dc.member.id = :memberId
14+
""")
15+
Long countByCreatorMemberId(@Param("memberId") Long memberId);
16+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.withtime.be.withtimebe.domain.date.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.withtime.be.withtimebe.domain.date.entity.DatePlace;
5+
6+
public interface DatePlaceRepository extends JpaRepository<DatePlace, Long> {
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.withtime.be.withtimebe.domain.date.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.withtime.be.withtimebe.domain.date.entity.PlaceCategory;
5+
6+
public interface PlaceCategoryRepository extends JpaRepository<PlaceCategory, Long> {
7+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.withtime.be.withtimebe.domain.log.datecourselog.controller;
2+
3+
import org.namul.api.payload.response.DefaultResponse;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.RequestMapping;
6+
import org.springframework.web.bind.annotation.RestController;
7+
import org.withtime.be.withtimebe.domain.date.repository.DateCourseRepository;
8+
import org.withtime.be.withtimebe.domain.log.datecourselog.dto.DateCourseLogResponseDTO;
9+
import org.withtime.be.withtimebe.domain.log.datecourselog.service.query.DateCourseLogQueryService;
10+
import org.withtime.be.withtimebe.domain.member.entity.Member;
11+
import org.withtime.be.withtimebe.global.security.annotation.AuthenticatedMember;
12+
13+
import io.swagger.v3.oas.annotations.Operation;
14+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
15+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
16+
import lombok.RequiredArgsConstructor;
17+
18+
@RestController
19+
@RequiredArgsConstructor
20+
@RequestMapping("/api/v1/logs/datecourses")
21+
public class DateCourseLogQueryController {
22+
23+
private final DateCourseLogQueryService dateCourseLogQueryService;
24+
25+
@Operation(summary = "최근 1개월 WithTime 사용자의 데이트 평균 횟수와 나의 데이트 횟수 조회 API by 피우", description = "메인 페이지의 데이트 나침반에 해당하는 API입니다. 최근 1개월 WithTime 사용자의 데이트 평균 횟수와 나의 데이트 횟수 조회하는 API입니다.")
26+
@ApiResponses(value = {
27+
@ApiResponse(responseCode = "200", description = "성공입니다.")
28+
})
29+
@GetMapping("/average")
30+
public DefaultResponse<DateCourseLogResponseDTO.FindAverageDateCourseCount> findAverageDateCourseCount(
31+
@AuthenticatedMember Member member
32+
) {
33+
DateCourseLogResponseDTO.FindAverageDateCourseCount response = dateCourseLogQueryService.findAverageDateCourseCount(member);
34+
return DefaultResponse.ok(response);
35+
}
36+
37+
@Operation(summary = "다른 사람의 내 데이트 코스 저장 횟수 조회 API by 피우", description = "나의 데이트 코스를 다른 사람이 얼마나 저장했는지 조회하는 API입니다.")
38+
@ApiResponses(value = {
39+
@ApiResponse(responseCode = "200", description = "성공입니다.")
40+
})
41+
@GetMapping("/saved-count")
42+
public DefaultResponse<DateCourseLogResponseDTO.FindSavedDateCourseCount> findSavedDateCourseCount(
43+
@AuthenticatedMember Member member
44+
) {
45+
DateCourseLogResponseDTO.FindSavedDateCourseCount response = dateCourseLogQueryService.findSavedDateCourseCount(member);
46+
return DefaultResponse.ok(response);
47+
}
48+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.withtime.be.withtimebe.domain.log.datecourselog.converter;
2+
3+
import org.withtime.be.withtimebe.domain.log.datecourselog.dto.DateCourseLogResponseDTO;
4+
5+
public class DateCourseLogConverter {
6+
7+
public static DateCourseLogResponseDTO.FindAverageDateCourseCount toFindAverageDateCourseCount(Double averageDateCount, Long myDateCount) {
8+
return DateCourseLogResponseDTO.FindAverageDateCourseCount.builder()
9+
.averageDateCount(averageDateCount)
10+
.myDateCount(myDateCount)
11+
.build();
12+
}
13+
14+
public static DateCourseLogResponseDTO.FindSavedDateCourseCount toFindSavedDateCourseCount(Long count) {
15+
return DateCourseLogResponseDTO.FindSavedDateCourseCount.builder()
16+
.count(count)
17+
.build();
18+
}
19+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.withtime.be.withtimebe.domain.log.datecourselog.dto;
2+
3+
import lombok.Builder;
4+
5+
public class DateCourseLogResponseDTO {
6+
7+
@Builder
8+
public record FindAverageDateCourseCount(
9+
Double averageDateCount,
10+
Long myDateCount
11+
) {}
12+
13+
@Builder
14+
public record FindSavedDateCourseCount(
15+
Long count
16+
) {}
17+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.withtime.be.withtimebe.domain.log.datecourselog.service.query;
2+
3+
import org.withtime.be.withtimebe.domain.log.datecourselog.dto.DateCourseLogResponseDTO;
4+
import org.withtime.be.withtimebe.domain.member.entity.Member;
5+
6+
public interface DateCourseLogQueryService {
7+
DateCourseLogResponseDTO.FindAverageDateCourseCount findAverageDateCourseCount(Member member);
8+
DateCourseLogResponseDTO.FindSavedDateCourseCount findSavedDateCourseCount(Member member);
9+
}

0 commit comments

Comments
 (0)