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
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.process.clash.adapter.web.compete.rival.rival.dto;

import com.process.clash.application.compete.rival.rival.data.GetMyRivalActingData;
import com.process.clash.application.profile.data.EquippedItemsData;
import com.process.clash.application.realtime.data.UserActivityStatus;

import java.util.List;
Expand All @@ -24,7 +25,8 @@ public static Response from(GetMyRivalActingData.Result result) {
data.usingApp(),
data.isStudying(),
data.status(),
data.tier()
data.tier(),
data.equippedItems()
))
.toList()
);
Expand All @@ -41,6 +43,7 @@ private record MyRival(
String usingApp,
Boolean isStudying,
UserActivityStatus status,
String tier
String tier,
EquippedItemsData equippedItems
) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ public interface RankingControllerDocument {
"point": 1200,
"tier": "AURA",
"equippedItems": {
"insigma": {
"insignia": {
"id": 1,
"name": "기본 인시그니아",
"name": "기본 휘장",
"image": "https://cdn.example.com/items/insignia.png"
},
"nameplate": null,
Expand All @@ -58,7 +58,7 @@ public interface RankingControllerDocument {
"point": 980,
"tier": "GOLD",
"equippedItems": {
"insigma": null,
"insignia": null,
"nameplate": null,
"banner": null
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ public static class UserRankingDoc {
@Schema(name = "EquippedItems", description = "장착 아이템 정보")
public static class EquippedItemsDoc {

@Schema(description = "인시그니아")
private EquippedItemDoc insigma;
@Schema(description = "휘장")
private EquippedItemDoc insignia;

@Schema(description = "네임플레이트")
private EquippedItemDoc nameplate;
Expand All @@ -73,7 +73,7 @@ public static class EquippedItemDoc {
@Schema(description = "아이템 ID", example = "1")
private Long id;

@Schema(description = "아이템 이름", example = "기본 인시그니아")
@Schema(description = "아이템 이름", example = "기본 휘장")
private String name;

@Schema(description = "아이템 이미지 URL", example = "https://cdn.example.com/items/insignia.png")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public class GetMyItemDocument {
@Schema(description = "아이템 ID", example = "1")
public Long id;

@Schema(description = "아이템 제목", example = "기본 인시그니아")
@Schema(description = "아이템 제목", example = "기본 휘장")
public String title;

@Schema(description = "아이템 이미지 URL", example = "https://cdn.example.com/items/insignia.png")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"items": [
{
"id": 1,
"title": "기본 인시그니아",
"title": "기본 휘장",
"image": "https://cdn.example.com/items/insignia.png",
"description": "기본 아이템",
"category": "INSIGNIA",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ public class GetMyProfileDataDocument {

@Schema(description = "장착 아이템")
public static class EquippedItemsDocument {
@Schema(description = "인시그니아")
public EquippedItemDocument insigma;
@Schema(description = "휘장")
public EquippedItemDocument insignia;

@Schema(description = "네임플레이트")
public EquippedItemDocument nameplate;
Expand All @@ -73,7 +73,7 @@ public static class EquippedItemDocument {
@Schema(description = "아이템 ID", example = "1")
public Long id;

@Schema(description = "아이템 이름", example = "기본 인시그니아")
@Schema(description = "아이템 이름", example = "기본 휘장")
public String name;

@Schema(description = "아이템 이미지 URL", example = "https://cdn.example.com/items/insignia.png")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
"githubLinked": true,
"activityStatus": "ONLINE",
"equippedItems": {
"insigma": {
"insignia": {
"id": 1,
"name": "기본 인시그니아",
"name": "기본 휘장",
"image": "https://cdn.example.com/items/insignia.png"
},
"nameplate": null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
public class EquippedItemsDto {

public record Response(
Item insigma,
Item insignia,
Item nameplate,
Item banner
) {
Expand All @@ -14,7 +14,7 @@ public static Response from(EquippedItemsData data) {
return new Response(null, null, null);
}
return new Response(
Item.from(data.insigma()),
Item.from(data.insignia()),
Item.from(data.nameplate()),
Item.from(data.banner())
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.process.clash.application.compete.rival.rival.data;

import com.process.clash.application.common.actor.Actor;
import com.process.clash.application.profile.data.EquippedItemsData;
import com.process.clash.application.realtime.data.UserActivityStatus;
import com.process.clash.domain.user.user.entity.User;

Expand Down Expand Up @@ -38,7 +39,8 @@ public record MyRival(
String usingApp,
Boolean isStudying,
UserActivityStatus status,
String tier
String tier,
EquippedItemsData equippedItems
Comment thread
redjungi09 marked this conversation as resolved.
) {

public static MyRival of(
Expand All @@ -47,7 +49,8 @@ public static MyRival of(
Long activeTime,
String usingApp,
Boolean isStudying,
UserActivityStatus status
UserActivityStatus status,
EquippedItemsData equippedItems
) {
return new MyRival(
rivalId,
Expand All @@ -59,7 +62,8 @@ public static MyRival of(
usingApp,
isStudying,
status,
user.tier()
user.tier(),
equippedItems
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.process.clash.application.compete.rival.rival.data.GetMyRivalActingData;
import com.process.clash.application.compete.rival.rival.port.in.GetMyRivalActingUseCase;
import com.process.clash.application.compete.rival.rival.port.out.RivalRepositoryPort;
import com.process.clash.application.profile.data.EquippedItemsData;
import com.process.clash.application.profile.service.EquippedItemsAssembler;
import com.process.clash.application.realtime.data.UserActivityStatus;
import com.process.clash.application.realtime.port.out.UserPresencePort;
import com.process.clash.application.record.v2.port.out.RecordSessionV2RepositoryPort;
Expand Down Expand Up @@ -37,6 +39,7 @@ public class GetMyRivalActingService implements GetMyRivalActingUseCase {
private final UserPresencePort userPresencePort;
private final RecordProperties recordProperties;
private final ZoneId recordZoneId;
private final EquippedItemsAssembler equippedItemsAssembler;

@Override
public GetMyRivalActingData.Result execute(GetMyRivalActingData.Command command) {
Expand Down Expand Up @@ -86,6 +89,11 @@ public GetMyRivalActingData.Result execute(GetMyRivalActingData.Command command)

Map<Long, UserActivityStatus> activityStatusByUserId = userPresencePort.getStatuses(opponentIds);

List<Long> rivalIds = opponentIds.stream()
.filter(id -> !id.equals(command.actor().id()))
.toList();
Map<Long, EquippedItemsData> equippedItemsMap = equippedItemsAssembler.loadByUserIds(rivalIds);

Long myId = command.actor().id();

List<GetMyRivalActingData.MyRival> myRivals = rivals.stream()
Expand All @@ -112,13 +120,16 @@ public GetMyRivalActingData.Result execute(GetMyRivalActingData.Command command)
String usingApp = resolveUsingApp(activeSession);
boolean isStudying = activeSession != null;

EquippedItemsData equippedItems = equippedItemsMap.getOrDefault(opponentId, EquippedItemsData.empty());

return GetMyRivalActingData.MyRival.of(
rival.id(),
opponent,
activeTime,
usingApp,
isStudying,
activityStatus
activityStatus,
equippedItems
);
})
.toList();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.process.clash.application.profile.data;

public record EquippedItemsData(
EquippedItemData insigma,
EquippedItemData insignia,
EquippedItemData nameplate,
EquippedItemData banner
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ private EquippedItemsData toEquippedItems(
List<UserEquippedItem> userEquippedItems,
Map<Long, Product> productById
) {
EquippedItemsData.EquippedItemData insigma = null;
EquippedItemsData.EquippedItemData insignia = null;
EquippedItemsData.EquippedItemData nameplate = null;
EquippedItemsData.EquippedItemData banner = null;

Expand All @@ -87,14 +87,14 @@ private EquippedItemsData toEquippedItems(
);

if (userEquippedItem.category() == ProductCategory.INSIGNIA) {
insigma = summary;
insignia = summary;
} else if (userEquippedItem.category() == ProductCategory.NAMEPLATE) {
nameplate = summary;
} else if (userEquippedItem.category() == ProductCategory.BANNER) {
banner = summary;
}
}

return new EquippedItemsData(insigma, nameplate, banner);
return new EquippedItemsData(insignia, nameplate, banner);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.process.clash.application.common.actor.Actor;
import com.process.clash.application.compete.rival.rival.data.GetMyRivalActingData;
import com.process.clash.application.compete.rival.rival.port.out.RivalRepositoryPort;
import com.process.clash.application.profile.data.EquippedItemsData;
import com.process.clash.application.profile.service.EquippedItemsAssembler;
import com.process.clash.application.realtime.data.UserActivityStatus;
import com.process.clash.application.realtime.port.out.UserPresencePort;
import com.process.clash.application.record.v2.port.out.RecordSessionV2RepositoryPort;
Expand Down Expand Up @@ -51,6 +53,8 @@ class GetMyRivalActingServiceTest {
private UserPresencePort userPresencePort;

private GetMyRivalActingService getMyRivalActingService;
@Mock
private EquippedItemsAssembler equippedItemsAssembler;

@BeforeEach
void setUp() {
Expand All @@ -59,8 +63,11 @@ void setUp() {
recordSessionRepositoryPort,
userRepositoryPort,
userPresencePort,

new RecordProperties("UTC", 0),
ZoneId.of("UTC")
ZoneId.of("UTC"),

equippedItemsAssembler
);
}

Expand Down Expand Up @@ -116,6 +123,7 @@ void execute_returnsRivalsWithActivityStatus() {
));
when(userPresencePort.getStatuses(anyList()))
.thenReturn(Map.of(2L, UserActivityStatus.ONLINE, 3L, UserActivityStatus.AWAY, 1L, UserActivityStatus.ONLINE));
when(equippedItemsAssembler.loadByUserIds(anyList())).thenReturn(Map.of());
Comment thread
redjungi09 marked this conversation as resolved.

GetMyRivalActingData.Result result = getMyRivalActingService.execute(command);

Expand Down Expand Up @@ -147,6 +155,7 @@ void execute_returnsTierAsExpTier_whenRankTierIsNone() {
.thenReturn(Map.of());
when(recordSessionRepositoryPort.findAllActiveSessionsByUserIds(anyList())).thenReturn(List.of());
when(userPresencePort.getStatuses(anyList())).thenReturn(Map.of(2L, UserActivityStatus.OFFLINE));
when(equippedItemsAssembler.loadByUserIds(anyList())).thenReturn(Map.of());

GetMyRivalActingData.Result result = getMyRivalActingService.execute(
new GetMyRivalActingData.Command(actor));
Expand All @@ -170,6 +179,7 @@ void execute_returnsTierAsRankTier_whenRankTierIsNotNone() {
.thenReturn(Map.of());
when(recordSessionRepositoryPort.findAllActiveSessionsByUserIds(anyList())).thenReturn(List.of());
when(userPresencePort.getStatuses(anyList())).thenReturn(Map.of(2L, UserActivityStatus.OFFLINE));
when(equippedItemsAssembler.loadByUserIds(anyList())).thenReturn(Map.of());

GetMyRivalActingData.Result result = getMyRivalActingService.execute(
new GetMyRivalActingData.Command(actor));
Expand All @@ -189,6 +199,41 @@ void execute_returnsEmptyList_whenNoRivals() {
assertThat(result.myRivals()).isEmpty();
}

@Test
@DisplayName("라이벌의 equippedItems가 응답에 올바르게 포함된다")
void execute_returnsEquippedItems() {
Actor actor = new Actor(1L);
Rival rival = new Rival(100L, Instant.now().minusSeconds(86_400), Instant.now(),
RivalLinkingStatus.ACCEPTED, 1L, 2L);

User rivalUser = createUser(2L, "rivalA", "Rival A");

EquippedItemsData equippedItemsData = new EquippedItemsData(
new EquippedItemsData.EquippedItemData(1L, "배지이름", "badge.png"),
new EquippedItemsData.EquippedItemData(2L, "닉네임판", "nameplate.png"),
null
);

when(rivalRepositoryPort.findAllByUserId(actor.id())).thenReturn(List.of(rival));
when(userRepositoryPort.findAllByIds(anyList()))
.thenReturn(List.of(rivalUser, createUser(1L, "me", "Me")));
when(recordSessionRepositoryPort.getTotalStudyTimeInSecondsByUserIds(anyList(), any(), any()))
.thenReturn(Map.of());
when(recordSessionRepositoryPort.findAllActiveSessionsByUserIds(anyList())).thenReturn(List.of());
when(userPresencePort.getStatuses(anyList())).thenReturn(Map.of(2L, UserActivityStatus.OFFLINE));
when(equippedItemsAssembler.loadByUserIds(anyList()))
.thenReturn(Map.of(2L, equippedItemsData));

GetMyRivalActingData.Result result = getMyRivalActingService.execute(
new GetMyRivalActingData.Command(actor));

EquippedItemsData actual = result.myRivals().get(0).equippedItems();
assertThat(actual.insignia().id()).isEqualTo(1L);
assertThat(actual.insignia().name()).isEqualTo("배지이름");
assertThat(actual.nameplate().id()).isEqualTo(2L);
assertThat(actual.banner()).isNull();
}

private User createUser(Long id, String username, String name) {
return createUser(id, username, name, RankTier.NONE, ExpTier.UNRANKED);
}
Expand Down
Loading