ResourceInjector.java
6.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package com.infoloop.tianting.intercepter;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.strategy.SaStrategy;
import cn.hutool.core.convert.Convert;
import com.infoloop.tianting.constant.PathVariableResourceConstants;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.exception.ClientEndExceptions;
import com.infoloop.tianting.service.client.ClientInventoryServiceRpcClient;
import com.infoloop.tianting.service.client.MealOrderServiceRpcClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.NonNull;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.HandlerMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ResourceInjector implements HandlerInterceptor {
private final MealOrderServiceRpcClient mealOrderServiceRpcClient;
private final ClientInventoryServiceRpcClient clientInventoryServiceRpcClient;
@Override
@SuppressWarnings("unchecked")
public boolean preHandle(@NonNull final HttpServletRequest httpServletRequest, @NonNull final HttpServletResponse httpServletResponse, @NonNull final Object handler) {
boolean isHandler = handler instanceof HandlerMethod;
if (!isHandler) {
return true;
}
final var method = ((HandlerMethod) handler).getMethod();
if (SaStrategy.instance.isAnnotationPresent.apply(method, SaIgnore.class)) {
return true;
}
final var pathVariables = (Map<String, Object>) httpServletRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
if (pathVariables == null) {
return true;
}
/*
注入MpAccount
*/
if (pathVariables.containsKey(PathVariableResourceConstants.MP_ACCOUNT_ID_PATH_VARIABLE)) {
final var idStr = pathVariables.get(PathVariableResourceConstants.MP_ACCOUNT_ID_PATH_VARIABLE);
final var id = Convert.toInt(idStr, 0);
if (id <= 0) {
throw ClientEndExceptions.ResourceNotFound.build("小程序用户不存在");
}
final var response = mealOrderServiceRpcClient.getMpAccountById(LoginContextHolder.getEnterpriseId(), id);
if (response == null) {
log.info("Resource not found; id:{}", id);
throw ClientEndExceptions.ResourceNotFound.build("小程序用户不存在");
}
httpServletRequest.setAttribute(PathVariableResourceConstants.INJECTED_MP_ACCOUNT, response);
}
/*
注入Client
*/
if (pathVariables.containsKey(PathVariableResourceConstants.CLIENT_ID_PATH_VARIABLE)) {
final var idStr = pathVariables.get(PathVariableResourceConstants.CLIENT_ID_PATH_VARIABLE);
final var id = Convert.toInt(idStr, 0);
if (id <= 0) {
throw ClientEndExceptions.ResourceNotFound.build("项目点不存在");
}
final var response = clientInventoryServiceRpcClient.getClientById(LoginContextHolder.getEnterpriseId(), id);
if (response == null) {
log.info("Resource not found; id:{}", id);
throw ClientEndExceptions.ResourceNotFound.build("项目点不存在");
}
httpServletRequest.setAttribute(PathVariableResourceConstants.INJECTED_CLIENT, response.getClient());
}
/*
注入Diner
*/
if (pathVariables.containsKey(PathVariableResourceConstants.DINER_ID_PATH_VARIABLE)) {
final var idStr = pathVariables.get(PathVariableResourceConstants.DINER_ID_PATH_VARIABLE);
final var id = Convert.toInt(idStr, 0);
if (id <= 0) {
throw ClientEndExceptions.ResourceNotFound.build("就餐人不存在");
}
final var response = mealOrderServiceRpcClient.getDinerById(LoginContextHolder.getEnterpriseId(), id);
if (response == null) {
log.info("Resource not found; id:{}", id);
throw ClientEndExceptions.ResourceNotFound.build("就餐人不存在");
}
httpServletRequest.setAttribute(PathVariableResourceConstants.INJECTED_DINER, response);
}
/*
注入GradeClass
*/
if (pathVariables.containsKey(PathVariableResourceConstants.GRADE_CLASS_ID_PATH_VARIABLE)) {
final var idStr = pathVariables.get(PathVariableResourceConstants.GRADE_CLASS_ID_PATH_VARIABLE);
final var id = Convert.toInt(idStr, 0);
if (id <= 0) {
throw ClientEndExceptions.ResourceNotFound.build("年级班级不存在");
}
final var response = mealOrderServiceRpcClient.getGradeClassById(LoginContextHolder.getEnterpriseId(), id);
if (response == null) {
log.info("Resource not found; id:{}", id);
throw ClientEndExceptions.ResourceNotFound.build("年级班级不存在");
}
httpServletRequest.setAttribute(PathVariableResourceConstants.INJECTED_GRADE_CLASS, response);
}
/*
注入MealOrder
*/
if (pathVariables.containsKey(PathVariableResourceConstants.MEAL_ORDER_ID_PATH_VARIABLE)) {
final var idStr = pathVariables.get(PathVariableResourceConstants.MEAL_ORDER_ID_PATH_VARIABLE);
final var id = Convert.toInt(idStr, 0);
if (id <= 0) {
throw ClientEndExceptions.ResourceNotFound.build("订餐记录不存在");
}
final var response = mealOrderServiceRpcClient.getMealOrderById(LoginContextHolder.getEnterpriseId(), id);
if (response == null) {
log.info("Resource not found; id:{}", id);
throw ClientEndExceptions.ResourceNotFound.build("订餐记录不存在");
}
httpServletRequest.setAttribute(PathVariableResourceConstants.INJECTED_MEAL_ORDER, response);
}
return true;
}
}