Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,8 @@ application.yml
application-common.yml
application-domain.yml
application-infra.yml
application-domain-production.yml
application-domain-production.yml

### Monitoring ###
monitoring-docker-compose.yml
prometheus.yml
4 changes: 4 additions & 0 deletions api-module/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ dependencies {
implementation 'io.jsonwebtoken:jjwt-api:0.12.6'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.6'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.6'

// Prometheus Monitoring
implementation 'org.springframework.boot:spring-boot-starter-actuator'
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
}

tasks.register("prepareKotlinBuildScriptModel"){}
Original file line number Diff line number Diff line change
Expand Up @@ -70,16 +70,12 @@ public SurveyRes getSurveyQuestions() {
.build();
}

public Page<SurveyRes> getSurveyList(Long memberId, Pageable pageable) {
public Page<SurveyRes> getSurveyList(Member member, Pageable pageable) {
// Validation
if (memberId != null) {
memberRepository.findById(memberId)
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 회원입니다."));
}

// Business Logic
Page<Survey> surveys = (memberId != null)
? surveyRepository.findByMember_MemberIdOrderByCreatedAtDesc(memberId, pageable)
Page<Survey> surveys = (member.getMemberId() != null)
? surveyRepository.findByMember_MemberIdOrderByCreatedAtDesc(member.getMemberId(), pageable)
: surveyRepository.findAllByOrderByCreatedAtDesc(pageable);

// Response
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@

import hongik.triple.apimodule.application.survey.SurveyService;
import hongik.triple.apimodule.global.common.ApplicationResponse;
import hongik.triple.apimodule.global.security.PrincipalDetails;
import hongik.triple.commonmodule.dto.survey.SurveyReq;
import hongik.triple.commonmodule.dto.survey.SurveyRes;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
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.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
Expand Down Expand Up @@ -40,17 +43,61 @@ public ApplicationResponse<?> getSurveyQuestions() {
}

@PostMapping("/response")
public ApplicationResponse<?> registerSurvey(@RequestBody SurveyReq request) {
@Operation(summary = "설문조사 제출", description = "사용자가 작성한 설문조사 응답을 제출합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200",
description = "설문조사 제출 성공",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = SurveyRes.class))),
@ApiResponse(responseCode = "400",
description = "잘못된 요청 (유효하지 않은 설문조사 데이터)"),
@ApiResponse(responseCode = "500",
description = "서버 오류")
})
public ApplicationResponse<?> registerSurvey(
@io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "설문조사 응답 데이터",
required = true,
content = @Content(schema = @Schema(implementation = SurveyReq.class)))
@RequestBody SurveyReq request) {
return ApplicationResponse.ok(surveyService.registerSurvey(request));
}

@GetMapping("/list")
public ApplicationResponse<?> getSurveyList(@AuthenticationPrincipal UserDetails userDetails, @PageableDefault Pageable pageable) {
return ApplicationResponse.ok(surveyService.getSurveyList(1L, pageable)); // TODO: userDetails -> memberId 추출
@Operation(summary = "설문조사 결과 목록 조회", description = "사용자가 진행한 모든 설문조사 결과를 페이징하여 조회합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200",
description = "설문조사 목록 조회 성공",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = Page.class))),
@ApiResponse(responseCode = "401",
description = "인증되지 않은 사용자"),
@ApiResponse(responseCode = "500",
description = "서버 오류")
})
public ApplicationResponse<?> getSurveyList(
@Parameter(hidden = true) @AuthenticationPrincipal PrincipalDetails principalDetails,
@Parameter(description = "페이징 정보 (page, size, sort)",
example = "page=0&size=10&sort=createdAt,desc")
@PageableDefault Pageable pageable) {
return ApplicationResponse.ok(surveyService.getSurveyList(principalDetails.getMember(), pageable)); // TODO: userDetails -> memberId 추출
}

@GetMapping("/detail/{surveyId}")
public ApplicationResponse<?> getSurveyDetail(@PathVariable(name = "surveyId") Long surveyId) {
@Operation(summary = "특정 설문조사 상세 조회", description = "설문조사 ID로 특정 설문조사의 상세 정보를 조회합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200",
description = "설문조사 상세 조회 성공",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = SurveyRes.class))),
@ApiResponse(responseCode = "404",
description = "존재하지 않는 설문조사"),
@ApiResponse(responseCode = "500",
description = "서버 오류")
})
public ApplicationResponse<?> getSurveyDetail(
@Parameter(description = "조회할 설문조사 ID", required = true, example = "1")
@PathVariable(name = "surveyId") Long surveyId) {
return ApplicationResponse.ok(surveyService.getSurveyDetail(surveyId));
}
}
2 changes: 1 addition & 1 deletion infra-module/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ dependencies {
implementation project(":common-module")

// Redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
// implementation 'org.springframework.boot:spring-boot-starter-data-redis'

// WebClient
implementation 'org.springframework.boot:spring-boot-starter-webflux'
Expand Down