Skip to content

Commit 0f8a002

Browse files
authored
merge: admin 행사 티켓 라운드+타입 상세 조회 API - #139
feat: admin 행사 티켓 라운드+타입 상세 조회 API - #139
2 parents a9db902 + 05180db commit 0f8a002

File tree

10 files changed

+191
-6
lines changed

10 files changed

+191
-6
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.permitseoul.permitserver.domain.admin.ticket.api.controller;
2+
3+
import com.permitseoul.permitserver.domain.admin.ticket.api.service.AdminTicketService;
4+
import com.permitseoul.permitserver.global.response.ApiResponseUtil;
5+
import com.permitseoul.permitserver.global.response.BaseResponse;
6+
import com.permitseoul.permitserver.global.response.code.SuccessCode;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.PathVariable;
11+
import org.springframework.web.bind.annotation.RequestMapping;
12+
import org.springframework.web.bind.annotation.RestController;
13+
14+
@RestController
15+
@RequestMapping("/api/admin/tickets")
16+
@RequiredArgsConstructor
17+
public class AdminTicketController {
18+
private final AdminTicketService adminTicketService;
19+
20+
//admin 행사 티켓 라운드+타입 상세 조회 API
21+
@GetMapping("/details/{ticketRoundId}")
22+
public ResponseEntity<BaseResponse<?>> getTicketRoundAndTypeDetails(
23+
@PathVariable("ticketRoundId") long ticketRoundId
24+
) {
25+
return ApiResponseUtil.success(SuccessCode.OK, adminTicketService.getTicketRoundAndTypeDetails(ticketRoundId));
26+
}
27+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.permitseoul.permitserver.domain.admin.ticket.api.dto.res;
2+
3+
import com.permitseoul.permitserver.domain.ticketround.core.domain.TicketRound;
4+
5+
import java.math.BigDecimal;
6+
import java.util.List;
7+
8+
public record TicketRoundAndTypeDetailRes(
9+
long ticketRoundId,
10+
String ticketRoundName,
11+
String ticketRoundSalesStartDate, // yyyy.MM.dd
12+
String ticketRoundSalesStartTime, // HH:mm
13+
String ticketRoundSalesEndDate, // yyyy.MM.dd
14+
String ticketRoundSalesEndTime, // HH:mm
15+
List<TicketTypeInfo> ticketTypes
16+
) {
17+
18+
public static TicketRoundAndTypeDetailRes of(final long ticketRoundId,
19+
final String ticketRoundName,
20+
final String ticketRoundSalesStartDate,
21+
final String ticketRoundSalesStartTime,
22+
final String ticketRoundSalesEndDate,
23+
final String ticketRoundSalesEndTime,
24+
final List<TicketTypeInfo> ticketTypes) {
25+
return new TicketRoundAndTypeDetailRes(
26+
ticketRoundId,
27+
ticketRoundName,
28+
ticketRoundSalesStartDate,
29+
ticketRoundSalesStartTime,
30+
ticketRoundSalesEndDate,
31+
ticketRoundSalesEndTime,
32+
ticketTypes
33+
);
34+
}
35+
36+
public record TicketTypeInfo(
37+
long ticketTypeId,
38+
String ticketTypeName,
39+
BigDecimal ticketTypePrice,
40+
int ticketTypeCount,
41+
String ticketTypeStartDate, // yyyy.MM.dd
42+
String ticketTypeStartTime, // HH:mm
43+
String ticketTypeEndDate, // yyyy.MM.dd
44+
String ticketTypeEndTime // HH:mm
45+
) {
46+
public static TicketTypeInfo of(final long ticketTypeId,
47+
final String ticketTypeName,
48+
final BigDecimal ticketTypePrice,
49+
final int ticketTypeCount,
50+
final String ticketTypeStartDate,
51+
final String ticketTypeStartTime,
52+
final String ticketTypeEndDate,
53+
final String ticketTypeEndTime) {
54+
55+
return new TicketTypeInfo(
56+
ticketTypeId,
57+
ticketTypeName,
58+
ticketTypePrice,
59+
ticketTypeCount,
60+
ticketTypeStartDate,
61+
ticketTypeStartTime,
62+
ticketTypeEndDate,
63+
ticketTypeEndTime
64+
);
65+
}
66+
67+
}
68+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.permitseoul.permitserver.domain.admin.ticket.api.service;
2+
3+
import com.permitseoul.permitserver.domain.admin.base.api.exception.AdminApiException;
4+
import com.permitseoul.permitserver.domain.admin.ticket.api.dto.res.TicketRoundAndTypeDetailRes;
5+
import com.permitseoul.permitserver.domain.admin.ticketround.core.AdminTicketRoundRetriever;
6+
import com.permitseoul.permitserver.domain.admin.ticketround.exception.AdminTicketRoundNotFoundException;
7+
import com.permitseoul.permitserver.domain.admin.tickettype.core.component.AdminTicketTypeRetriever;
8+
import com.permitseoul.permitserver.domain.ticketround.core.domain.TicketRound;
9+
import com.permitseoul.permitserver.domain.tickettype.core.domain.TicketType;
10+
import com.permitseoul.permitserver.global.response.code.ErrorCode;
11+
import com.permitseoul.permitserver.global.util.DateFormatterUtil;
12+
import lombok.RequiredArgsConstructor;
13+
import org.springframework.stereotype.Service;
14+
import org.springframework.transaction.annotation.Transactional;
15+
16+
import java.util.Comparator;
17+
import java.util.List;
18+
19+
@Service
20+
@RequiredArgsConstructor
21+
public class AdminTicketService {
22+
private final AdminTicketTypeRetriever adminTicketTypeRetriever;
23+
private final AdminTicketRoundRetriever adminTicketRoundRetriever;
24+
25+
@Transactional(readOnly = true)
26+
public TicketRoundAndTypeDetailRes getTicketRoundAndTypeDetails(final long ticketRoundId) {
27+
28+
final TicketRound ticketRound;
29+
try {
30+
ticketRound = adminTicketRoundRetriever.getTicketRoundById(ticketRoundId);
31+
} catch (AdminTicketRoundNotFoundException e) {
32+
throw new AdminApiException(ErrorCode.NOT_FOUND_TICKET_ROUND);
33+
}
34+
35+
final List<TicketType> ticketTypes = adminTicketTypeRetriever.getTicketTypesByTicketRoundId(ticketRound.getTicketRoundId());
36+
final List<TicketRoundAndTypeDetailRes.TicketTypeInfo> ticketTypeInfos = parseTicketTypeInfos(ticketTypes);
37+
38+
return TicketRoundAndTypeDetailRes.of(
39+
ticketRound.getTicketRoundId(),
40+
ticketRound.getTicketRoundTitle(),
41+
DateFormatterUtil.formatyyyyMMdd(ticketRound.getSalesStartAt()),
42+
DateFormatterUtil.formatHHmm(ticketRound.getSalesStartAt()),
43+
DateFormatterUtil.formatyyyyMMdd(ticketRound.getSalesEndAt()),
44+
DateFormatterUtil.formatHHmm(ticketRound.getSalesEndAt()),
45+
ticketTypeInfos
46+
);
47+
}
48+
49+
private List<TicketRoundAndTypeDetailRes.TicketTypeInfo> parseTicketTypeInfos(final List<TicketType> ticketTypes) {
50+
if(ticketTypes.isEmpty()) {
51+
return List.of();
52+
}
53+
return ticketTypes.stream()
54+
.sorted(Comparator.comparing(TicketType::getTicketTypeId))
55+
.map(ticketType -> TicketRoundAndTypeDetailRes.TicketTypeInfo.of(
56+
ticketType.getTicketTypeId(),
57+
ticketType.getTicketTypeName(),
58+
ticketType.getTicketPrice(),
59+
ticketType.getTotalTicketCount(),
60+
DateFormatterUtil.formatyyyyMMdd(ticketType.getTicketStartAt()),
61+
DateFormatterUtil.formatHHmm(ticketType.getTicketStartAt()),
62+
DateFormatterUtil.formatyyyyMMdd(ticketType.getTicketEndAt()),
63+
DateFormatterUtil.formatHHmm(ticketType.getTicketEndAt())
64+
)
65+
)
66+
.toList();
67+
}
68+
}

src/main/java/com/permitseoul/permitserver/domain/admin/ticketround/core/AdminTicketRoundRetriever.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.permitseoul.permitserver.domain.admin.ticketround.core;
22

3+
import com.permitseoul.permitserver.domain.admin.ticketround.exception.AdminTicketRoundNotFoundException;
34
import com.permitseoul.permitserver.domain.ticketround.core.domain.TicketRound;
45
import com.permitseoul.permitserver.domain.ticketround.core.repository.TicketRoundRepository;
56
import lombok.RequiredArgsConstructor;
@@ -19,4 +20,9 @@ public List<TicketRound> getTicketRoundsByEventIds(final List<Long> eventIds) {
1920
.map(TicketRound::fromEntity)
2021
.toList();
2122
}
23+
24+
@Transactional(readOnly = true)
25+
public TicketRound getTicketRoundById(final long ticketRoundId) {
26+
return TicketRound.fromEntity(ticketRoundRepository.findById(ticketRoundId).orElseThrow(AdminTicketRoundNotFoundException::new));
27+
}
2228
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.permitseoul.permitserver.domain.admin.ticketround.exception;
2+
3+
public abstract class AdminTicketRoundCoreException extends RuntimeException {
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.permitseoul.permitserver.domain.admin.ticketround.exception;
2+
3+
public class AdminTicketRoundNotFoundException extends AdminTicketRoundCoreException{
4+
}

src/main/java/com/permitseoul/permitserver/domain/admin/tickettype/core/component/AdminTicketTypeRetriever.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,14 @@ public class AdminTicketTypeRetriever {
1515

1616
@Transactional(readOnly = true)
1717
public List<TicketType> getTicketTypesByTicketRounds(final List<Long> ticketRoundIds) {
18-
return ticketTypeRepository.findByTicketRoundIdIn(ticketRoundIds).stream()
18+
return ticketTypeRepository.findAllByTicketRoundIdIn(ticketRoundIds).stream()
19+
.map(TicketType::fromEntity)
20+
.toList();
21+
}
22+
23+
@Transactional(readOnly = true)
24+
public List<TicketType> getTicketTypesByTicketRoundId(final Long ticketRoundId) {
25+
return ticketTypeRepository.findAllByTicketRoundId(ticketRoundId).stream()
1926
.map(TicketType::fromEntity)
2027
.toList();
2128
}

src/main/java/com/permitseoul/permitserver/domain/tickettype/core/component/TicketTypeRetriever.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public List<TicketType> findAllTicketTypeById(final List<Long> ids) {
6262

6363
@Transactional(readOnly = true)
6464
public List<TicketType> findTicketTypeListByRoundIdList(final List<Long> roundIds) {
65-
final List<TicketTypeEntity> ticketTypeEntityList = ticketTypeRepository.findByTicketRoundIdIn(roundIds);
65+
final List<TicketTypeEntity> ticketTypeEntityList = ticketTypeRepository.findAllByTicketRoundIdIn(roundIds);
6666
if (ObjectUtils.isEmpty(ticketTypeEntityList)) {
6767
throw new TicketTypeNotfoundException();
6868
}

src/main/java/com/permitseoul/permitserver/domain/tickettype/core/repository/TicketTypeRepository.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import org.springframework.data.repository.query.Param;
99
import org.springframework.stereotype.Repository;
1010

11-
import java.util.Collection;
1211
import java.util.List;
1312
import java.util.Optional;
1413

@@ -19,5 +18,7 @@ public interface TicketTypeRepository extends JpaRepository<TicketTypeEntity, Lo
1918
@Query("SELECT t FROM TicketTypeEntity t WHERE t.ticketTypeId = :ticketTypeId")
2019
Optional<TicketTypeEntity> findByIdForUpdate(@Param("ticketTypeId") long ticketTypeId);
2120

22-
List<TicketTypeEntity> findByTicketRoundIdIn(final List<Long> ticketRoundIds);
21+
List<TicketTypeEntity> findAllByTicketRoundIdIn(final List<Long> ticketRoundIds);
22+
23+
List<TicketTypeEntity> findAllByTicketRoundId(final Long ticketRoundId);
2324
}

src/main/java/com/permitseoul/permitserver/global/config/SecurityConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ public class SecurityConfig {
3333
"/api/users/reissue",
3434
"/api/events",
3535
"/api/events/detail/*",
36-
"/api/tickets/*",
3736
"/api/users/email-check",
3837
"/api/events/*/timetables",
3938
"/api/events/timetables/*"
@@ -51,7 +50,8 @@ public class SecurityConfig {
5150
"/api/payments/confirm",
5251
"/api/payments/cancel",
5352
"/api/coupons/validate/*",
54-
"/api/events/timetables/likes/*"
53+
"/api/events/timetables/likes/*",
54+
"/api/tickets/*"
5555
};
5656

5757
@Bean

0 commit comments

Comments
 (0)