Skip to content

Commit

Permalink
πŸš€ :: Api-v0.1.0
Browse files Browse the repository at this point in the history
πŸš€ :: Api-v0.1.0
  • Loading branch information
ImNM authored Feb 1, 2023
2 parents bd24a16 + 13c13b6 commit 96c2169
Show file tree
Hide file tree
Showing 171 changed files with 2,511 additions and 553 deletions.
1 change: 0 additions & 1 deletion DuDoong-Api/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springdoc:springdoc-openapi-ui:1.6.12'
implementation 'org.springframework.boot:spring-boot-starter-security'

implementation project(':DuDoong-Domain')
implementation project(':DuDoong-Common')
implementation project(':DuDoong-Infrastructure')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import band.gosrock.domain.domains.cart.exception.CartInvalidOptionAnswerException;
import band.gosrock.domain.domains.cart.exception.CartItemNotOneTypeException;
import band.gosrock.domain.domains.cart.exception.CartNotAnswerAllOptionGroupException;
import band.gosrock.domain.domains.event.exception.EventIsNotOpenStatusException;
import band.gosrock.domain.domains.event.exception.EventNotOpenException;
import band.gosrock.domain.domains.event.exception.EventTicketingTimeIsPassedException;
import band.gosrock.domain.domains.ticket_item.exception.TicketItemQuantityLackException;
import band.gosrock.domain.domains.ticket_item.exception.TicketPurchaseLimitException;
Expand All @@ -23,7 +23,7 @@ public class CreateCartExceptionDocs implements SwaggerExampleExceptions {
public DuDoongCodeException 응닡_λ‹€λŒ€λ‹΅_μ•ˆν–ˆμ„λ•Œ = CartNotAnswerAllOptionGroupException.EXCEPTION;

@ExplainError("μ΄λ²€νŠΈκ°€ μ—΄λ¦° μƒνƒœκ°€ μ•„λ‹λ•Œ")
public DuDoongCodeException 이벀트_λ‹«νž˜ = EventIsNotOpenStatusException.EXCEPTION;
public DuDoongCodeException 이벀트_λ‹«νž˜ = EventNotOpenException.EXCEPTION;

@ExplainError("이벀트 ν‹°μΌ“νŒ… μ‹œκ°„μ΄ μ§€λ‚¬μ„λ•Œ.")
public DuDoongCodeException ν‹°μΌ“νŒ…_μ‹œκ°„μ§€λ‚¨ = EventTicketingTimeIsPassedException.EXCEPTION;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package band.gosrock.api.common.aop.hostRole;


import lombok.Getter;

@Getter
public enum FindHostFrom {
HOST_ID("hostId"),
EVENT_ID("eventId");

private final String identifier;

FindHostFrom(String identifier) {
this.identifier = identifier;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package band.gosrock.api.common.aop.hostRole;


import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@RequiredArgsConstructor
@Component
public class HostCallTransactionFactory {

private final HostRoleEventTransaction hostRoleEventTransaction;
private final HostRoleHostTransaction hostRoleHostTransaction;

public HostRoleCallTransaction getCallTransaction(FindHostFrom findHostFrom) {
if (findHostFrom == FindHostFrom.HOST_ID) {
return hostRoleHostTransaction;
}
return hostRoleEventTransaction;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package band.gosrock.api.common.aop.hostRole;


import band.gosrock.domain.domains.host.domain.Host;
import java.util.function.BiConsumer;

/** 각 κΆŒν•œμ— λ§žμΆ°μ„œ host λ„λ©”μΈμ˜ κ²€μ¦λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰μ‹œν‚΅λ‹ˆλ‹€. 검증 λ©”μ†Œλ“œμ΄λ―€λ‘œ biConsumer λ₯Ό 톡해 μ‹€ν–‰ μ‹œν‚¬ ν•¨μˆ˜λ₯Ό 미리 생성해 λ‘‘λ‹ˆλ‹€. -이찬진 */
public enum HostQualification {
MASTER((userId, host) -> host.validateMasterHostUser(userId)),
MANAGER((userId, host) -> host.validateManagerHostUser(userId)),
GUEST((userId, host) -> host.validateActiveHostUser(userId));
private final BiConsumer<Long, Host> consumer;

HostQualification(BiConsumer<Long, Host> consumer) {
this.consumer = consumer;
}

/**
* 호슀트의 검증을 μˆ˜ν–‰ν•˜λŠ” λ©”μ„œλ“œ
*
* @param userId
* @param host
*/
public void validQualification(Long userId, Host host) {
consumer.accept(userId, host);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package band.gosrock.api.common.aop.hostRole;


import java.lang.reflect.Method;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.stereotype.Component;

/**
* 호슀트 κ΄€λ¦¬μž 인가λ₯Ό μœ„ν•œ aop μž…λ‹ˆλ‹€ λ©”μ†Œλ“œ λ ˆλ²¨μ—μ„œ μž‘λ™ν•˜λ©° κΆŒν•œ 정보λ₯Ό μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ λ°›κ³  eventIdλ₯Ό μΈμžμ—μ„œ 찾아와 호슀트 정보λ₯Ό λΆˆλŸ¬μ˜¨λ’€ κΆŒν•œ 검증을 ν•©λ‹ˆλ‹€.
*/
@Aspect
@Component
@RequiredArgsConstructor
@Slf4j
@ConditionalOnExpression("${ableHostRoleAop:true}")
public class HostRoleAop {
private final HostCallTransactionFactory hostCallTransactionFactory;

/**
* master 호슀트의 λ§ˆμŠ€ν„° manager 호슀트의 μˆ˜μ •,쑰회 ( ν˜ΈμŠ€νŠΈμœ μ €λ„λ©”μΈμ˜ 슈퍼 호슀트 ) guest 호슀트의 μ‘°νšŒκΆŒν•œ (ν˜ΈμŠ€νŠΈμœ μ €λ„λ©”μΈμ˜ 호슀트 )
*
* @see band.gosrock.domain.domains.host.domain.HostRole
*/
@Around("@annotation(band.gosrock.api.common.aop.hostRole.HostRolesAllowed)")
public Object aop(final ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
HostRolesAllowed annotation = method.getAnnotation(HostRolesAllowed.class);
HostQualification hostQualification = annotation.role();
// 제곡된 호슀트의 role 이 μ •μ˜λœ μ„Έκ°œμ˜ λ‘€κ³Ό 같은지 ν™•μΈν•œλ‹€.
// μ—†μœΌλ©΄ IllegalArgumentException λ°œμƒ
FindHostFrom findHostFrom = annotation.findHostFrom();
String identifier = findHostFrom.getIdentifier();

String[] parameterNames = signature.getParameterNames();
Object[] args = joinPoint.getArgs();

Long id = getId(parameterNames, args, identifier);

return hostCallTransactionFactory
.getCallTransaction(findHostFrom)
.proceed(id, hostQualification, joinPoint);
}

public Long getId(String[] parameterNames, Object[] args, String paramName) {
for (int i = 0; i < parameterNames.length; i++) {
if (parameterNames[i].equals(paramName)) {
// λ‘±νƒ€μž…μ΄λΌ κ°€μ •. μ•ˆλ˜λ©΄ classCastException ν„°νŠΈλ¦Ό
return (Long) args[i];
}
}
throw new IllegalArgumentException();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package band.gosrock.api.common.aop.hostRole;


import org.aspectj.lang.ProceedingJoinPoint;

public interface HostRoleCallTransaction {
Object proceed(Long id, HostQualification role, final ProceedingJoinPoint joinPoint)
throws Throwable;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package band.gosrock.api.common.aop.hostRole;


import band.gosrock.api.common.UserUtils;
import band.gosrock.domain.domains.event.adaptor.EventAdaptor;
import band.gosrock.domain.domains.event.domain.Event;
import band.gosrock.domain.domains.host.adaptor.HostAdaptor;
import band.gosrock.domain.domains.host.domain.Host;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/** 호슀트 정보λ₯Ό νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ μ‘°νšŒν•˜κΈ° μœ„ν•΄μ„œ λ§Œλ“  ν΄λž˜μŠ€μž…λ‹ˆλ‹€. νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μΊμ‹œ ν• μˆ˜ 있으면 μ’‹μœΌλ‹ˆ μ΄λ ‡κ²Œ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. - 이찬진 */
@Component
@RequiredArgsConstructor
@Slf4j
public class HostRoleEventTransaction implements HostRoleCallTransaction {

private final UserUtils userUtils;
private final EventAdaptor eventAdaptor;
private final HostAdaptor hostAdaptor;

@Transactional(readOnly = true)
public Object proceed(Long eventId, HostQualification role, final ProceedingJoinPoint joinPoint)
throws Throwable {
Long currentUserId = userUtils.getCurrentUserId();
Event event = eventAdaptor.findById(eventId);
Host host = hostAdaptor.findById(event.getHostId());
role.validQualification(currentUserId, host);
return joinPoint.proceed();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package band.gosrock.api.common.aop.hostRole;


import band.gosrock.api.common.UserUtils;
import band.gosrock.domain.domains.host.adaptor.HostAdaptor;
import band.gosrock.domain.domains.host.domain.Host;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/** 호슀트 정보λ₯Ό νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ μ‘°νšŒν•˜κΈ° μœ„ν•΄μ„œ λ§Œλ“  ν΄λž˜μŠ€μž…λ‹ˆλ‹€. νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μΊμ‹œ ν• μˆ˜ 있으면 μ’‹μœΌλ‹ˆ μ΄λ ‡κ²Œ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. - 이찬진 */
@Component
@RequiredArgsConstructor
@Slf4j
public class HostRoleHostTransaction implements HostRoleCallTransaction {

private final UserUtils userUtils;
private final HostAdaptor hostAdaptor;

@Transactional(readOnly = true)
public Object proceed(Long hostId, HostQualification role, final ProceedingJoinPoint joinPoint)
throws Throwable {
Long currentUserId = userUtils.getCurrentUserId();
Host host = hostAdaptor.findById(hostId);
role.validQualification(currentUserId, host);
return joinPoint.proceed();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package band.gosrock.api.common.aop.hostRole;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/** HostRoles aop λ₯Ό μ μš©ν•˜κΈ° μœ„ν•΄ λ‹€λŠ” μ–΄λ…Έν…Œμ΄μ…˜ - 이찬진 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface HostRolesAllowed {
/**
* 세가지 값을 가짐 "MASTER","MANAGER","GUEST" κΆŒν•œ μ •λ³΄λŠ”
*
* @see HostRoleAop
*/
HostQualification role();

FindHostFrom findHostFrom();
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package band.gosrock.api.config.response;


import band.gosrock.api.config.security.SecurityUtils;
import band.gosrock.api.config.slack.SlackApiProvider;
import band.gosrock.common.dto.ErrorReason;
import band.gosrock.common.dto.ErrorResponse;
import band.gosrock.common.exception.BaseErrorCode;
Expand Down Expand Up @@ -37,6 +39,7 @@
@RequiredArgsConstructor
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

private final SlackApiProvider slackApiProvider;
// /** Json λ‚ μ§œ ν˜•μ‹ νŒŒμ‹±μ— λŒ€ν•œ μ—λŸ¬ ν•Έλ“€λŸ¬ */
// @ExceptionHandler({ InvalidFormatException.class, DateTimeParseException.class})
// public ResponseEntity<ErrorResponse> JsonParseExceptionHandler(
Expand Down Expand Up @@ -163,6 +166,7 @@ public ResponseEntity<ErrorResponse> DuDoongDynamicExceptionHandler(
protected ResponseEntity<ErrorResponse> handleException(Exception e, HttpServletRequest request)
throws IOException {
final ContentCachingRequestWrapper cachingRequest = (ContentCachingRequestWrapper) request;
final Long userId = SecurityUtils.getCurrentUserId();
String url =
UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request))
.build()
Expand All @@ -176,8 +180,8 @@ protected ResponseEntity<ErrorResponse> handleException(Exception e, HttpServlet
internalServerError.getCode(),
internalServerError.getReason(),
url);
// TODO : μŠ¬λž™ 였λ₯˜ λ°œμ†‘
// slackProvider.sendError(url, cachingRequest, e);

slackApiProvider.sendError(cachingRequest, e, userId);
return ResponseEntity.status(HttpStatus.valueOf(internalServerError.getStatus()))
.body(errorResponse);
}
Expand Down
Loading

0 comments on commit 96c2169

Please sign in to comment.