Skip to content

Commit

Permalink
Merge pull request #113 from Happy-HOBAK/feat/#110
Browse files Browse the repository at this point in the history
[#109] ν™œλ™ μΆ”μ²œ API ꡬ좕
  • Loading branch information
KkomSang authored May 30, 2024
2 parents 2984580 + 590622d commit 378c220
Show file tree
Hide file tree
Showing 19 changed files with 220 additions and 98 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,7 @@ public interface RecordRepository extends JpaRepository<Record, Long> {
@Query("SELECT r.activity, COUNT(r) as count FROM Record r WHERE r.createdAt >= :time GROUP BY r.activity ORDER BY count DESC limit 3")
List<Object[]> findPopularActivities(@Param("time")LocalDateTime time);

@Query("SELECT r FROM Record r WHERE r.user.userId != :userId")
List<Record> findAllExceptUser(@Param("userId") Long userId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -56,49 +56,49 @@ public DataResponseDto<ReportSummaryResponseDto> getMonthlySummary(@Authenticati

@Operation(summary = "[전체] 행볡도가 높은 Top 3 ν™œλ™", description = "전체 κΈ°λ‘μ—μ„œ κ°€μž₯ 행볡도가 높은 Top 3 ν™œλ™μ„ μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/all/top-activities")
public DataResponseDto<List<ActivityHappinessDto>> getTop3AllHappiestActivities(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<ActivityHappinessResponseDto>> getTop3AllHappiestActivities(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<ActivityHappinessDto> responseDto = reportActivityRankingService.getTop3AllHappiestActivities(user);
List<ActivityHappinessResponseDto> responseDto = reportActivityRankingService.getTop3AllHappiestActivities(user);
return DataResponseDto.of(responseDto, "행볡도가 높은 Top 3 ν™œλ™(전체)을 μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[μ—°κ°„] 행볡도가 높은 Top 3 ν™œλ™", description = "이번 ν•΄ κ°€μž₯ 행볡도가 높은 Top 3 ν™œλ™μ„ μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/year/top-activities")
public DataResponseDto<List<ActivityHappinessDto>> getTop3AnnualHappiestActivities(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<ActivityHappinessResponseDto>> getTop3AnnualHappiestActivities(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<ActivityHappinessDto> responseDto = reportActivityRankingService.getTop3AnnualHappiestActivities(user);
List<ActivityHappinessResponseDto> responseDto = reportActivityRankingService.getTop3AnnualHappiestActivities(user);
return DataResponseDto.of(responseDto, "행볡도가 높은 Top 3 ν™œλ™(μ—°κ°„)을 μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[μ›”κ°„] 행볡도가 높은 Top 3 ν™œλ™", description = "이번 ν•΄ κ°€μž₯ 행볡도가 높은 Top 3 ν™œλ™μ„ μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/month/top-activities")
public DataResponseDto<List<ActivityHappinessDto>> getTop3MonthlyHappiestActivities(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<ActivityHappinessResponseDto>> getTop3MonthlyHappiestActivities(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<ActivityHappinessDto> responseDto = reportActivityRankingService.getTop3MonthlyHappiestActivities(user);
List<ActivityHappinessResponseDto> responseDto = reportActivityRankingService.getTop3MonthlyHappiestActivities(user);
return DataResponseDto.of(responseDto, "행볡도가 높은 Top 3 ν™œλ™(μ›”κ°„)을 μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[전체] 행볡도가 높은 Top 3 μœ„μΉ˜", description = "전체 κΈ°λ‘μ—μ„œ κ°€μž₯ 행볡도가 높은 Top 3 μœ„μΉ˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/all/top-locations")
public DataResponseDto<List<LocationHappinessDto>> getTop3AllHappiestLocations(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<LocationHappinessResponseDto>> getTop3AllHappiestLocations(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<LocationHappinessDto> responseDto = reportLocationRankingService.getTop3AllHappiestLocations(user);
List<LocationHappinessResponseDto> responseDto = reportLocationRankingService.getTop3AllHappiestLocations(user);
return DataResponseDto.of(responseDto, "행볡도가 높은 Top 3 μœ„μΉ˜(전체)λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[μ—°κ°„] 행볡도가 높은 Top 3 μœ„μΉ˜", description = "이번 ν•΄ κ°€μž₯ 행볡도가 높은 Top 3 μœ„μΉ˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/year/top-locations")
public DataResponseDto<List<LocationHappinessDto>> getTop3AnnualHappiestLocations(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<LocationHappinessResponseDto>> getTop3AnnualHappiestLocations(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<LocationHappinessDto> responseDto = reportLocationRankingService.getTop3AnnualHappiestLocations(user);
List<LocationHappinessResponseDto> responseDto = reportLocationRankingService.getTop3AnnualHappiestLocations(user);
return DataResponseDto.of(responseDto, "행볡도가 높은 Top 3 μœ„μΉ˜(μ—°κ°„)λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[μ›”κ°„] 행볡도가 높은 Top 3 μœ„μΉ˜", description = "이번 ν•΄ κ°€μž₯ 행볡도가 높은 Top 3 μœ„μΉ˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/month/top-locations")
public DataResponseDto<List<LocationHappinessDto>> getTop3MonthlyHappiestLocations(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<LocationHappinessResponseDto>> getTop3MonthlyHappiestLocations(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<LocationHappinessDto> responseDto = reportLocationRankingService.getTop3MonthlyHappiestLocations(user);
List<LocationHappinessResponseDto> responseDto = reportLocationRankingService.getTop3MonthlyHappiestLocations(user);
return DataResponseDto.of(responseDto, "행볡도가 높은 Top 3 μœ„μΉ˜(μ›”κ°„)λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}
@Operation(summary = "[μ—°κ°„] 행볡 κ·Έλž˜ν”„", description = "μ—°κ°„ ν–‰λ³΅μ§€μˆ˜ κ·Έλž˜ν”„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.")
Expand All @@ -118,73 +118,73 @@ public DataResponseDto<ReportGraphResponseDto> getMonthlyGraph(@AuthenticationPr

@Operation(summary = "[전체] λͺ¨λ“  ν™œλ™μ˜ 행볡도 μˆœμœ„", description = "전체 κΈ°λ‘μ—μ„œ λͺ¨λ“  ν™œλ™μ˜ 행볡도 μˆœμœ„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/all/ranking/activities")
public DataResponseDto<List<ActivityHappinessDto>> getAllActivityRankings(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<ActivityHappinessResponseDto>> getAllActivityRankings(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<ActivityHappinessDto> responseDto = reportActivityRankingService.getAllActivityRankings(user);
List<ActivityHappinessResponseDto> responseDto = reportActivityRankingService.getAllActivityRankings(user);
return DataResponseDto.of(responseDto, "전체 ν™œλ™ 행볡도 μˆœμœ„λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[μ—°κ°„] λͺ¨λ“  ν™œλ™μ˜ 행볡도 μˆœμœ„", description = "이번 ν•΄ λͺ¨λ“  ν™œλ™μ˜ 행볡도 μˆœμœ„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/year/ranking/activities")
public DataResponseDto<List<ActivityHappinessDto>> getYearlyActivityRankings(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<ActivityHappinessResponseDto>> getYearlyActivityRankings(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<ActivityHappinessDto> responseDto = reportActivityRankingService.getYearlyActivityRankings(user);
List<ActivityHappinessResponseDto> responseDto = reportActivityRankingService.getYearlyActivityRankings(user);
return DataResponseDto.of(responseDto, "μ—°κ°„ ν™œλ™ 행볡도 μˆœμœ„λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[μ›”κ°„] λͺ¨λ“  ν™œλ™μ˜ 행볡도 μˆœμœ„", description = "이번 달 λͺ¨λ“  ν™œλ™μ˜ 행볡도 μˆœμœ„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/month/ranking/activities")
public DataResponseDto<List<ActivityHappinessDto>> getMonthlyActivityRankings(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<ActivityHappinessResponseDto>> getMonthlyActivityRankings(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<ActivityHappinessDto> responseDto = reportActivityRankingService.getMonthlyActivityRankings(user);
List<ActivityHappinessResponseDto> responseDto = reportActivityRankingService.getMonthlyActivityRankings(user);
return DataResponseDto.of(responseDto, "μ›”κ°„ ν™œλ™ 행볡도 μˆœμœ„λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[전체] λͺ¨λ“  μœ„μΉ˜μ˜ 행볡도 μˆœμœ„", description = "전체 κΈ°λ‘μ—μ„œ λͺ¨λ“  μœ„μΉ˜μ˜ 행볡도 μˆœμœ„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/all/ranking/locations")
public DataResponseDto<List<LocationHappinessDto>> getAllLocationRankings(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<LocationHappinessResponseDto>> getAllLocationRankings(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<LocationHappinessDto> responseDto = reportLocationRankingService.getAllLocationRankings(user);
List<LocationHappinessResponseDto> responseDto = reportLocationRankingService.getAllLocationRankings(user);
return DataResponseDto.of(responseDto, "전체 μœ„μΉ˜ 행볡도 μˆœμœ„λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[μ—°κ°„] λͺ¨λ“  μœ„μΉ˜μ˜ 행볡도 μˆœμœ„", description = "이번 ν•΄ λͺ¨λ“  μœ„μΉ˜μ˜ 행볡도 μˆœμœ„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/year/ranking/locations")
public DataResponseDto<List<LocationHappinessDto>> getYearlyLocationRankings(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<LocationHappinessResponseDto>> getYearlyLocationRankings(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<LocationHappinessDto> responseDto = reportLocationRankingService.getYearlyLocationRankings(user);
List<LocationHappinessResponseDto> responseDto = reportLocationRankingService.getYearlyLocationRankings(user);
return DataResponseDto.of(responseDto, "μ—°κ°„ μœ„μΉ˜ 행볡도 μˆœμœ„λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[μ›”κ°„] λͺ¨λ“  μœ„μΉ˜μ˜ 행볡도 μˆœμœ„", description = "이번 달 λͺ¨λ“  μœ„μΉ˜μ˜ 행볡도 μˆœμœ„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/month/ranking/locations")
public DataResponseDto<List<LocationHappinessDto>> getMonthlyLocationRankings(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<LocationHappinessResponseDto>> getMonthlyLocationRankings(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<LocationHappinessDto> responseDto = reportLocationRankingService.getMonthlyLocationRankings(user);
List<LocationHappinessResponseDto> responseDto = reportLocationRankingService.getMonthlyLocationRankings(user);
return DataResponseDto.of(responseDto, "μ›”κ°„ μœ„μΉ˜ 행볡도 μˆœμœ„λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[전체] μ‹œκ°„λŒ€ 행볡도 μˆœμœ„", description = "전체 κΈ°λ‘μ—μ„œ μ‹œκ°„λŒ€ 행볡도 μˆœμœ„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/all/ranking/time")
public DataResponseDto<List<TimeOfDayHappinessDto>> getAllTimeOfDayRankings(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<TimeOfDayHappinessResponseDto>> getAllTimeOfDayRankings(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<TimeOfDayHappinessDto> responseDto = reportTimeOfPeriodRankingService.getAllTimeOfDayRankings(user);
List<TimeOfDayHappinessResponseDto> responseDto = reportTimeOfPeriodRankingService.getAllTimeOfDayRankings(user);
return DataResponseDto.of(responseDto, "전체 μ‹œκ°„λŒ€ 행볡도 μˆœμœ„λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[μ—°κ°„] μ‹œκ°„λŒ€ 행볡도 μˆœμœ„", description = "이번 ν•΄ μ‹œκ°„λŒ€ 행볡도 μˆœμœ„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/year/ranking/time")
public DataResponseDto<List<TimeOfDayHappinessDto>> getYearlyTimeOfDayRankings(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<TimeOfDayHappinessResponseDto>> getYearlyTimeOfDayRankings(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<TimeOfDayHappinessDto> responseDto = reportTimeOfPeriodRankingService.getYearlyTimeOfDayRankings(user);
List<TimeOfDayHappinessResponseDto> responseDto = reportTimeOfPeriodRankingService.getYearlyTimeOfDayRankings(user);
return DataResponseDto.of(responseDto, "μ—°κ°„ μ‹œκ°„λŒ€ 행볡도 μˆœμœ„λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "[μ›”κ°„] μ‹œκ°„λŒ€ 행볡도 μˆœμœ„", description = "이번 달 μ‹œκ°„λŒ€ 행볡도 μˆœμœ„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.")
@GetMapping("/month/ranking/time")
public DataResponseDto<List<TimeOfDayHappinessDto>> getMonthlyTimeOfDayRankings(@AuthenticationPrincipal UserDetails userDetails) {
public DataResponseDto<List<TimeOfDayHappinessResponseDto>> getMonthlyTimeOfDayRankings(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<TimeOfDayHappinessDto> responseDto = reportTimeOfPeriodRankingService.getMonthlyTimeOfDayRankings(user);
List<TimeOfDayHappinessResponseDto> responseDto = reportTimeOfPeriodRankingService.getMonthlyTimeOfDayRankings(user);
return DataResponseDto.of(responseDto, "μ›”κ°„ μ‹œκ°„λŒ€ 행볡도 μˆœμœ„λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}
@Operation(summary = "[전체] 평균 ν–‰λ³΅μ§€μˆ˜", description = "μœ μ € 개인의 전체기간 평균 ν–‰λ³΅μ§€μˆ˜μ™€ 그에 λ”°λ₯Έ μˆ˜μ€€μ„ νŒλ‹¨ν•©λ‹ˆλ‹€.")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
package com.hobak.happinessql.domain.report.api;

import com.hobak.happinessql.domain.report.application.AverageHappinessService;
import com.hobak.happinessql.domain.report.application.TrendPopularActivitiesService;
import com.hobak.happinessql.domain.report.application.TrendPopularActivityService;
import com.hobak.happinessql.domain.report.application.TrendRecommendService;
import com.hobak.happinessql.domain.report.dto.AverageHappinessResponseDto;
import com.hobak.happinessql.domain.report.dto.TrendPopularActivitiesResponseDto;
import com.hobak.happinessql.domain.report.dto.TrendPopularActivitiyResponseDto;
import com.hobak.happinessql.domain.report.dto.TrendRecommendActivityResponseDto;
import com.hobak.happinessql.domain.user.application.UserFindService;
import com.hobak.happinessql.domain.user.domain.User;
import com.hobak.happinessql.global.response.DataResponseDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
Expand All @@ -19,18 +25,29 @@
@RequiredArgsConstructor
@RequestMapping("api/trend")
public class TrendController {
private final UserFindService userFindService;
private final AverageHappinessService averageHappinessService;
private final TrendPopularActivitiesService trendPopularActivitiesService;
private final TrendPopularActivityService trendPopularActivityService;
private final TrendRecommendService trendRecommendService;

@Operation(summary = "λŒ€ν•œλ―Όκ΅­ 평균 ν–‰λ³΅μ§€μˆ˜", description = "전체 μœ μ €μ˜ 평균 ν–‰λ³΅μ§€μˆ˜μ™€ 그에 λ”°λ₯Έ μˆ˜μ€€μ„ νŒλ‹¨ν•©λ‹ˆλ‹€.")
@GetMapping("/happiness")
public DataResponseDto<AverageHappinessResponseDto> getHappiness() {
public DataResponseDto<AverageHappinessResponseDto> getAverageHappiness() {
AverageHappinessResponseDto responseDto = averageHappinessService.getTrendHappiness();
return DataResponseDto.of(responseDto, "λŒ€ν•œλ―Όκ΅­ 평균 ν–‰λ³΅μ§€μˆ˜λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}
@Operation(summary = "였늘의 인기 ν™œλ™ top3", description = "였늘 많이 기둝된 ν™œλ™μ˜ 이름과 기둝 횟수λ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€.")
@GetMapping("/popular")
public DataResponseDto<List<TrendPopularActivitiesResponseDto>> getPopular() {
List<TrendPopularActivitiesResponseDto> responseDto = trendPopularActivitiesService.getPopularActivities();
public DataResponseDto<List<TrendPopularActivitiyResponseDto>> getPopularActivities() {
List<TrendPopularActivitiyResponseDto> responseDto = trendPopularActivityService.getPopularActivities();
return DataResponseDto.of(responseDto, "였늘의 인기 ν™œλ™μ„ μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}

@Operation(summary = "μΆ”μ²œ ν™œλ™", description = "μΆ”μ²œ ν™œλ™μ„ μ‘°νšŒν•©λ‹ˆλ‹€. 행볡도가 5 이상인 ν™œλ™ μ€‘μ—μ„œ 랜덀으둜 ν•˜λ‚˜λ₯Ό μΆ”μ²œλ°›μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.")
@GetMapping("/recommend")
public DataResponseDto<List<TrendRecommendActivityResponseDto>> getRecommendedActivities(@AuthenticationPrincipal UserDetails userDetails) {
User user = userFindService.findByUserDetails(userDetails);
List<TrendRecommendActivityResponseDto> responseDto = trendRecommendService.getRecommendActivities(user);
return DataResponseDto.of(responseDto, "μΆ”μ²œ ν™œλ™μ„ μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμŠ΅λ‹ˆλ‹€.");
}
}
Loading

0 comments on commit 378c220

Please sign in to comment.