Skip to content

Commit

Permalink
v2.5.2
Browse files Browse the repository at this point in the history
v2.5.2
  • Loading branch information
mikekks authored Jan 30, 2025
2 parents 7d12be6 + e982337 commit 6cb2637
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.sopt.makers.crew.main.entity.apply;

import java.util.List;

import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingGetAppliesQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.response.ApplyInfoDto;
import org.springframework.data.domain.Page;
Expand All @@ -9,4 +11,6 @@
public interface ApplySearchRepository {
Page<ApplyInfoDto> findApplyList(MeetingGetAppliesQueryDto queryCommand, Pageable pageable, Integer meetingId,
Integer meetingCreatorId, Integer userId);

List<Apply> findTopFastestAppliedMeetings(Integer userId, Integer limit);
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package org.sopt.makers.crew.main.entity.apply;

import static org.sopt.makers.crew.main.entity.meeting.QMeeting.*;
import static org.sopt.makers.crew.main.global.constant.CrewConst.*;
import static org.sopt.makers.crew.main.entity.apply.QApply.apply;
import static org.sopt.makers.crew.main.entity.user.QUser.user;

import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;

import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;

import lombok.RequiredArgsConstructor;

import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingGetAppliesQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.response.ApplyInfoDto;
import org.sopt.makers.crew.main.meeting.v2.dto.response.QApplicantDto;
Expand Down Expand Up @@ -63,5 +68,18 @@ private JPAQuery<Long> getCount(MeetingGetAppliesQueryDto queryCommand, Integer
apply.status.in(queryCommand.getStatus())
);

}
}

public List<Apply> findTopFastestAppliedMeetings(Integer userId, Integer limit) {
return queryFactory
.selectFrom(apply)
.innerJoin(apply.meeting, meeting)
.where(apply.userId.eq(userId))
.orderBy(
Expressions.numberTemplate(BigDecimal.class,
"{0} - {1}", apply.appliedDate, apply.meeting.startDate).asc()
)
.limit(limit)
.fetch();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package org.sopt.makers.crew.main.internal;

import org.sopt.makers.crew.main.internal.dto.ApprovedStudyCountResponseDto;
import org.sopt.makers.crew.main.internal.dto.TopFastestAppliedMeetingsResponseDto;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestParam;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
Expand All @@ -20,4 +22,12 @@ public interface InternalMeetingStatsApi {
@ApiResponse(responseCode = "404", description = "존재하지 않는 유저입니다.", content = @Content(mediaType = "application/json"))})
ResponseEntity<ApprovedStudyCountResponseDto> getApprovedStudyCountByOrgId(
@Parameter(description = "플레이그라운드 유저 ID(orgId)", example = "1") Integer orgId);

@Operation(summary = "[Internal] 특정 유저가 가장 빠르게 신청한 모임 N개 조회", description = "특정 유저가 가장 빠르게 신청한 모임 N개 조회하는 API입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "가장 빠르게 신청한 모임 조회 성공"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 유저입니다.", content = @Content(mediaType = "application/json"))})
ResponseEntity<TopFastestAppliedMeetingsResponseDto> getTopFastestAppliedMeetings(
@Parameter(description = "플레이그라운드 유저 ID(orgId)", example = "1") Integer orgId,
@RequestParam(name = "queryCount", required = false, defaultValue = "3") Integer queryCount);
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package org.sopt.makers.crew.main.internal;

import org.sopt.makers.crew.main.internal.dto.ApprovedStudyCountResponseDto;
import org.sopt.makers.crew.main.internal.dto.TopFastestAppliedMeetingsResponseDto;
import org.sopt.makers.crew.main.internal.service.InternalMeetingStatsService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;
Expand All @@ -16,11 +19,23 @@
public class InternalMeetingStatsController implements InternalMeetingStatsApi {
private final InternalMeetingStatsService internalMeetingStatsService;

@Override
@GetMapping("/approved-studies/{orgId}")
public ResponseEntity<ApprovedStudyCountResponseDto> getApprovedStudyCountByOrgId(
@PathVariable Integer orgId
) {
ApprovedStudyCountResponseDto response = internalMeetingStatsService.getApprovedStudyCountByOrgId(orgId);
return ResponseEntity.ok(response);
}

@Override
@GetMapping("/fastest-applied/{orgId}")
public ResponseEntity<TopFastestAppliedMeetingsResponseDto> getTopFastestAppliedMeetings(
@PathVariable Integer orgId,
@RequestParam(name = "query-count", required = false, defaultValue = "3") Integer queryCount) {

TopFastestAppliedMeetingsResponseDto response = internalMeetingStatsService.getTopFastestAppliedMeetings(
orgId, queryCount);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.sopt.makers.crew.main.internal.dto;

import org.sopt.makers.crew.main.entity.meeting.Meeting;

import io.swagger.v3.oas.annotations.media.Schema;

@Schema(name = "TopFastestAppliedMeetingResponseDto", description = "가장 빠르게 신청한 모임 DTO")
public record TopFastestAppliedMeetingResponseDto(
@Schema(description = "가장 빠르게 신청한 모임 id", example = "3")
Integer meetingId,
@Schema(description = "가장 빠르게 신청한 모임 이름", example = "가장 빠른 모임 1")
String title
) {
public static TopFastestAppliedMeetingResponseDto from(Meeting meeting) {
return new TopFastestAppliedMeetingResponseDto(meeting.getId(), meeting.getTitle());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.sopt.makers.crew.main.internal.dto;

import java.util.List;

import io.swagger.v3.oas.annotations.media.Schema;

@Schema(name = "TopFastestAppliedMeetingsResponseDto", description = "가장 빠르게 신청한 모임 목록 DTO")
public record TopFastestAppliedMeetingsResponseDto(
@Schema(description = "가장 빠르게 신청한 모임", example = "")
List<TopFastestAppliedMeetingResponseDto> topFastestAppliedMeetings
) {
public static TopFastestAppliedMeetingsResponseDto from(
List<TopFastestAppliedMeetingResponseDto> topFastestAppliedMeetings) {

return new TopFastestAppliedMeetingsResponseDto(topFastestAppliedMeetings);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
package org.sopt.makers.crew.main.internal.service;

import java.util.Collections;
import java.util.List;
import java.util.Optional;

import org.sopt.makers.crew.main.entity.apply.Apply;
import org.sopt.makers.crew.main.entity.apply.ApplyRepository;
import org.sopt.makers.crew.main.entity.apply.enums.EnApplyStatus;
import org.sopt.makers.crew.main.entity.meeting.enums.MeetingCategory;
import org.sopt.makers.crew.main.entity.user.User;
import org.sopt.makers.crew.main.entity.user.UserRepository;
import org.sopt.makers.crew.main.internal.dto.ApprovedStudyCountResponseDto;
import org.sopt.makers.crew.main.internal.dto.TopFastestAppliedMeetingResponseDto;
import org.sopt.makers.crew.main.internal.dto.TopFastestAppliedMeetingsResponseDto;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -30,4 +37,20 @@ public ApprovedStudyCountResponseDto getApprovedStudyCountByOrgId(Integer orgId)

return ApprovedStudyCountResponseDto.of(user.getOrgId(), approvedStudyCount);
}

public TopFastestAppliedMeetingsResponseDto getTopFastestAppliedMeetings(Integer orgId, Integer queryCount) {
Optional<User> user = userRepository.findByOrgId(orgId);

if (user.isEmpty()) {
return TopFastestAppliedMeetingsResponseDto.from(Collections.emptyList());
}

List<Apply> applies = applyRepository.findTopFastestAppliedMeetings(user.get().getId(), queryCount);

List<TopFastestAppliedMeetingResponseDto> responseDtos = applies.stream()
.map(apply -> TopFastestAppliedMeetingResponseDto.from(apply.getMeeting()))
.toList();

return TopFastestAppliedMeetingsResponseDto.from(responseDtos);
}
}

0 comments on commit 6cb2637

Please sign in to comment.