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
1 change: 1 addition & 0 deletions src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ include::dailytodo/daily-todo-v1.adoc[]
include::dailytodo/daily-todo-v2.adoc[]
include::dailytodocertification/daily-todo-certification-v1.adoc[]
include::memberactivity/member-activity-v1.adoc[]
include::memberactivity/member-activity-v2.adoc[]
include::reminder/reminder-v1.adoc[]
include::notification/notification-v1.adoc[]
include::s3/s3-v1.adoc[]
Expand Down
68 changes: 68 additions & 0 deletions src/docs/asciidoc/memberactivity/member-activity-v2.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
[[member-activity-v2-api]]
== [V2] 사용자 활동 API

[[get-my-challenge-group-activity-summary-v2]]
=== 참여중인 특정 챌린지 그룹 활동 요약 조회 API

==== 개발 상태
|===
| 환경 | 구현 여부

| 개발
| O

| 운영
| X
|===

==== HTTP Request
include::{snippets}/member-activity-controller-v2-docs-test/get-my-challenge-group-activity-summary-v2/http-request.adoc[]
include::{snippets}/member-activity-controller-v2-docs-test/get-my-challenge-group-activity-summary-v2/path-parameters.adoc[]

==== HTTP Response
include::{snippets}/member-activity-controller-v2-docs-test/get-my-challenge-group-activity-summary-v2/http-response.adoc[]
include::{snippets}/member-activity-controller-v2-docs-test/get-my-challenge-group-activity-summary-v2/response-fields.adoc[]

[[get-my-certifications-v2]]
=== 사용자 인증 목록 전체 조회 API

==== 개발 상태
|===
| 환경 | 구현 여부

| 개발
| O

| 운영
| X
|===

==== HTTP Request
include::{snippets}/member-activity-controller-v2-docs-test/get-my-certifications-v2/http-request.adoc[]
include::{snippets}/member-activity-controller-v2-docs-test/get-my-certifications-v2/query-parameters.adoc[]

==== HTTP Response
include::{snippets}/member-activity-controller-v2-docs-test/get-my-certifications-v2/http-response.adoc[]
include::{snippets}/member-activity-controller-v2-docs-test/get-my-certifications-v2/response-fields.adoc[]

[[get-my-certification-stats-v2]]
=== 사용자 인증 통계 조회 API

==== 개발 상태
|===
| 환경 | 구현 여부

| 개발
| O

| 운영
| X
|===

==== HTTP Request
include::{snippets}/member-activity-controller-v2-docs-test/get-my-certification-stats-v2/http-request.adoc[]
include::{snippets}/member-activity-controller-v2-docs-test/get-my-certification-stats-v2/query-parameters.adoc[]

==== HTTP Response
include::{snippets}/member-activity-controller-v2-docs-test/get-my-certification-stats-v2/http-response.adoc[]
include::{snippets}/member-activity-controller-v2-docs-test/get-my-certification-stats-v2/response-fields.adoc[]
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,11 @@
import site.dogether.memberactivity.controller.v1.dto.response.GetMyProfileApiResponseV1;
import site.dogether.memberactivity.service.MemberActivityService;
import site.dogether.memberactivity.service.dto.CertificationPeriodDto;
import site.dogether.memberactivity.service.dto.CertificationsGroupedByCertificatedAtDto;
import site.dogether.memberactivity.service.dto.CertificationsGroupedByGroupCreatedAtDto;
import site.dogether.memberactivity.service.dto.ChallengeGroupInfoDto;
import site.dogether.memberactivity.service.dto.DailyTodoCertificationActivityDto;
import site.dogether.memberactivity.service.dto.FindMyProfileDto;
import site.dogether.memberactivity.service.dto.GroupedCertificationsDto;
import site.dogether.memberactivity.service.dto.MyCertificationStatsDto;
import site.dogether.memberactivity.service.dto.MyCertificationStatsInChallengeGroupDto;
import site.dogether.memberactivity.service.dto.MyRankInChallengeGroupDto;

import java.util.List;
Expand All @@ -46,7 +44,7 @@ public ResponseEntity<ApiResponse<GetMyChallengeGroupActivityStatsApiResponseV1>
final ChallengeGroupInfoDto challengeGroupInfo = memberActivityService.getChallengeGroupInfo(memberId, groupId);
final List<CertificationPeriodDto> certificationPeriods = memberActivityService.getCertificationPeriods(memberId, groupId);
final MyRankInChallengeGroupDto myRankInChallengeGroup = memberActivityService.getMyRankInChallengeGroup(memberId, groupId);
final MyCertificationStatsInChallengeGroupDto myCertificationStatsInChallengeGroup = memberActivityService.getMyCertificationStatsInChallengeGroup(memberId, groupId);
final MyCertificationStatsDto myCertificationStatsInChallengeGroup = memberActivityService.getMyCertificationStatsInChallengeGroup(memberId, groupId);

return ResponseEntity.ok(success(new GetMyChallengeGroupActivityStatsApiResponseV1(
GetMyChallengeGroupActivityStatsApiResponseV1.ChallengeGroupInfo.from(challengeGroupInfo),
Expand All @@ -63,12 +61,11 @@ public ResponseEntity<ApiResponse<GetMyActivityStatsAndCertificationsApiResponse
@RequestParam(required = false) final String status,
@PageableDefault(size = 50) final Pageable pageable
) {
final MyCertificationStatsDto myCertificationStats = memberActivityService.getMyCertificationStats(memberId);
final MyCertificationStatsDto myCertificationStats = memberActivityService.getMyTotalCertificationStats(memberId);
final Slice<DailyTodoCertification> certifications = memberActivityService.getCertificationsByStatus(memberId, status, pageable);

// TODO: 추후 v2 올릴 때 'TODO_COMPLETED_AT'가 아닌 'CERTIFICATED_AT'으로 변경 필요
if (sortBy.equals("TODO_COMPLETED_AT")) {
final List<CertificationsGroupedByCertificatedAtDto> groupedCertifications = memberActivityService.certificationsGroupedByCertificatedAt(certifications.getContent());
final List<GroupedCertificationsDto> groupedCertifications = memberActivityService.certificationsGroupedByCertificatedAt(certifications.getContent());

return ResponseEntity.ok(success(new GetMyActivityStatsAndCertificationsApiResponseV1(
GetMyActivityStatsAndCertificationsApiResponseV1.MyCertificationStats.from(myCertificationStats),
Expand All @@ -79,7 +76,7 @@ public ResponseEntity<ApiResponse<GetMyActivityStatsAndCertificationsApiResponse
}

// sortBy = GROUP_CREATED_AT
final List<CertificationsGroupedByGroupCreatedAtDto> groupedCertifications = memberActivityService.certificationsGroupedByGroupCreatedAt(certifications.getContent());
final List<GroupedCertificationsDto> groupedCertifications = memberActivityService.certificationsGroupedByGroupCreatedAt(certifications.getContent());

return ResponseEntity.ok(success(new GetMyActivityStatsAndCertificationsApiResponseV1(
GetMyActivityStatsAndCertificationsApiResponseV1.MyCertificationStats.from(myCertificationStats),
Expand All @@ -96,7 +93,6 @@ public ResponseEntity<ApiResponse<GetMyGroupCertificationsApiResponseV1>> getMyG
@RequestParam final String sortBy,
@RequestParam(required = false) final String status
) {
// TODO: 추후 v2 올릴 때 'TODO_COMPLETED_AT'가 아닌 'CERTIFICATED_AT'으로 변경 필요
if (sortBy.equals("TODO_COMPLETED_AT")) {
final List<DailyTodoCertificationActivityDto> dailyTodoCertificationActivity = memberActivityService.getMyGroupCertificationsByCertificatedAt(memberId, todoId, status);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,15 @@

import com.fasterxml.jackson.annotation.JsonInclude;
import org.springframework.data.domain.Slice;
import site.dogether.memberactivity.service.dto.CertificationsGroupedByCertificatedAtDto;
import site.dogether.memberactivity.service.dto.CertificationsGroupedByGroupCreatedAtDto;
import site.dogether.memberactivity.service.dto.DailyTodoCertificationInfoDto;
import site.dogether.memberactivity.service.dto.GroupedCertificationsDto;
import site.dogether.memberactivity.service.dto.MyCertificationStatsDto;

import java.util.List;

public record GetMyActivityStatsAndCertificationsApiResponseV1(
MyCertificationStats dailyTodoStats,

// TODO: 추후 v2 올릴 때 'TodoCompletedAt'가 아닌 'CertificatedAt'으로 변경 필요
@JsonInclude(JsonInclude.Include.NON_NULL)
List<CertificationsGroupedByCertificatedAt> certificationsGroupedByTodoCompletedAt,

Expand All @@ -29,9 +27,9 @@ public record MyCertificationStats(
) {
public static MyCertificationStats from(final MyCertificationStatsDto dto) {
return new MyCertificationStats(
dto.totalCertificatedCount(),
dto.totalApprovedCount(),
dto.totalRejectedCount()
dto.certificatedCount(),
dto.approvedCount(),
dto.rejectedCount()
);
}
}
Expand All @@ -40,15 +38,15 @@ public record CertificationsGroupedByCertificatedAt(
String createdAt,
List<DailyTodoCertificationInfo> certificationInfo
) {
public static List<CertificationsGroupedByCertificatedAt> fromList(final List<CertificationsGroupedByCertificatedAtDto> dtoList) {
public static List<CertificationsGroupedByCertificatedAt> fromList(final List<GroupedCertificationsDto> dtoList) {
return dtoList.stream()
.map(CertificationsGroupedByCertificatedAt::from)
.toList();
}

private static CertificationsGroupedByCertificatedAt from(final CertificationsGroupedByCertificatedAtDto dto) {
private static CertificationsGroupedByCertificatedAt from(final GroupedCertificationsDto dto) {
return new CertificationsGroupedByCertificatedAt(
dto.createdAt(),
dto.groupedBy(),
dto.certificationInfo().stream()
.map(DailyTodoCertificationInfo::from)
.toList()
Expand All @@ -60,15 +58,15 @@ public record CertificationsGroupedByGroupCreatedAt(
String groupName,
List<DailyTodoCertificationInfo> certificationInfo
) {
public static List<CertificationsGroupedByGroupCreatedAt> fromList(final List<CertificationsGroupedByGroupCreatedAtDto> dtoList) {
public static List<CertificationsGroupedByGroupCreatedAt> fromList(final List<GroupedCertificationsDto> dtoList) {
return dtoList.stream()
.map(CertificationsGroupedByGroupCreatedAt::from)
.toList();
}

private static CertificationsGroupedByGroupCreatedAt from(final CertificationsGroupedByGroupCreatedAtDto dto) {
private static CertificationsGroupedByGroupCreatedAt from(final GroupedCertificationsDto dto) {
return new CertificationsGroupedByGroupCreatedAt(
dto.groupName(),
dto.groupedBy(),
dto.certificationInfo().stream()
.map(DailyTodoCertificationInfo::from)
.toList()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import site.dogether.memberactivity.service.dto.CertificationPeriodDto;
import site.dogether.memberactivity.service.dto.ChallengeGroupInfoDto;
import site.dogether.memberactivity.service.dto.MyCertificationStatsInChallengeGroupDto;
import site.dogether.memberactivity.service.dto.MyCertificationStatsDto;
import site.dogether.memberactivity.service.dto.MyRankInChallengeGroupDto;

import java.util.List;
Expand Down Expand Up @@ -67,7 +67,7 @@ public record MyCertificationStatsInChallengeGroup(
int approvedCount,
int rejectedCount
) {
public static MyCertificationStatsInChallengeGroup from(final MyCertificationStatsInChallengeGroupDto dto) {
public static MyCertificationStatsInChallengeGroup from(final MyCertificationStatsDto dto) {
return new MyCertificationStatsInChallengeGroup(
dto.certificatedCount(),
dto.approvedCount(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package site.dogether.memberactivity.controller.v2;

import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
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 site.dogether.auth.resolver.Authenticated;
import site.dogether.common.controller.dto.response.ApiResponse;
import site.dogether.memberactivity.controller.v2.dto.response.GetMyCertificationStatsApiResponseV2;
import site.dogether.memberactivity.controller.v2.dto.response.GetMyCertificationsApiResponseV2;
import site.dogether.memberactivity.controller.v2.dto.response.GetMyChallengeGroupActivitySummaryApiResponseV2;
import site.dogether.memberactivity.service.MemberActivityService;
import site.dogether.memberactivity.service.dto.CertificationPeriodDto;
import site.dogether.memberactivity.service.dto.ChallengeGroupInfoDto;
import site.dogether.memberactivity.service.dto.GroupedCertificationsResultDto;
import site.dogether.memberactivity.service.dto.MyCertificationStatsDto;
import site.dogether.memberactivity.service.dto.MyRankInChallengeGroupDto;

import java.util.List;

import static site.dogether.common.controller.dto.response.ApiResponse.success;

@RequiredArgsConstructor
@RequestMapping("/api/v2/my")
@RestController
public class MemberActivityControllerV2 {

private final MemberActivityService memberActivityService;

@GetMapping("/groups/{groupId}/activity-summary")
public ResponseEntity<ApiResponse<GetMyChallengeGroupActivitySummaryApiResponseV2>> getMyChallengeGroupActivitySummary(
@Authenticated final Long memberId, @PathVariable final Long groupId
) {
final ChallengeGroupInfoDto challengeGroupInfo = memberActivityService.getChallengeGroupInfo(memberId, groupId);
final List<CertificationPeriodDto> certificationPeriods = memberActivityService.getCertificationPeriods(memberId, groupId);
final MyRankInChallengeGroupDto myRankInChallengeGroup = memberActivityService.getMyRankInChallengeGroup(memberId, groupId);

return ResponseEntity.ok(success(GetMyChallengeGroupActivitySummaryApiResponseV2.of(
challengeGroupInfo,
certificationPeriods,
myRankInChallengeGroup
)));
}

@GetMapping("/certifications")
public ResponseEntity<ApiResponse<GetMyCertificationsApiResponseV2>> getMyCertifications(
@Authenticated final Long memberId,
@RequestParam final String sortBy,
@RequestParam(required = false) final String status,
@PageableDefault(size = 50) final Pageable pageable
) {
final GroupedCertificationsResultDto certifications = memberActivityService.getCertifications(memberId, sortBy, status, pageable);

return ResponseEntity.ok(success(GetMyCertificationsApiResponseV2.of(certifications)));
}

@GetMapping("/certification-stats")
public ResponseEntity<ApiResponse<GetMyCertificationStatsApiResponseV2>> getMyCertificationStats(
@Authenticated final Long memberId,
@RequestParam(required = false) final Long groupId
) {
final MyCertificationStatsDto myCertificationStats = memberActivityService.getMyCertificationStats(memberId, groupId);

return ResponseEntity.ok(success(GetMyCertificationStatsApiResponseV2.of(myCertificationStats)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package site.dogether.memberactivity.controller.v2.dto.response;

import site.dogether.memberactivity.service.dto.MyCertificationStatsDto;

public record GetMyCertificationStatsApiResponseV2(
int certificatedCount,
int approvedCount,
int rejectedCount
) {

public static GetMyCertificationStatsApiResponseV2 of(
final MyCertificationStatsDto dto
) {
return new GetMyCertificationStatsApiResponseV2(
dto.certificatedCount(),
dto.approvedCount(),
dto.rejectedCount()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package site.dogether.memberactivity.controller.v2.dto.response;

import org.springframework.data.domain.Slice;
import site.dogether.memberactivity.service.dto.DailyTodoCertificationInfoDto;
import site.dogether.memberactivity.service.dto.GroupedCertificationsDto;
import site.dogether.memberactivity.service.dto.GroupedCertificationsResultDto;

import java.util.List;

public record GetMyCertificationsApiResponseV2(
List<Certification> certifications,
PageInfo pageInfo
) {

public static GetMyCertificationsApiResponseV2 of(
final GroupedCertificationsResultDto dto
) {
return new GetMyCertificationsApiResponseV2(
Certification.fromList(dto.certifications()),
PageInfo.from(dto.page())
);
}

public record Certification(
String groupedBy,
List<CertificationInfo> certificationInfo
) {
public static List<Certification> fromList(final List<GroupedCertificationsDto> dtoList) {
return dtoList.stream()
.map(Certification::from)
.toList();
}

private static Certification from(final GroupedCertificationsDto dto) {
return new Certification(
dto.groupedBy(),
dto.certificationInfo().stream()
.map(CertificationInfo::from)
.toList()
);
}
}

public record CertificationInfo(
Long id,
String content,
String status,
String certificationContent,
String certificationMediaUrl,
String reviewFeedback
) {
public static CertificationInfo from(final DailyTodoCertificationInfoDto dto) {
return new CertificationInfo(
dto.id(),
dto.content(),
dto.status(),
dto.certificationContent(),
dto.certificationMediaUrl(),
dto.reviewFeedback()
);
}
}

public record PageInfo(
int recentPageNumber,
boolean hasNext
) {
public static PageInfo from(final Slice<?> slice) {
return new PageInfo(
slice.getPageable().getPageNumber(),
slice.hasNext()
);
}
}
}
Loading
Loading