feat: validate consumer scenario journey ordering
parent
4f4798c42d
commit
a936b92da5
@ -0,0 +1,15 @@
|
|||||||
|
package com.sztzjy.linkCommerce.entity.dto;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ConsumerScenarioStepOneValidationRequest {
|
||||||
|
private List<String> stageOrder;
|
||||||
|
|
||||||
|
public List<String> getStageOrder() {
|
||||||
|
return stageOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStageOrder(List<String> stageOrder) {
|
||||||
|
this.stageOrder = stageOrder;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
package com.sztzjy.linkCommerce.entity.dto;
|
||||||
|
|
||||||
|
public class ConsumerScenarioStepOneValidationResult {
|
||||||
|
private boolean valid;
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
public boolean isValid() {
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValid(boolean valid) {
|
||||||
|
this.valid = valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessage(String message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
package com.sztzjy.linkCommerce.service;
|
||||||
|
|
||||||
|
import com.sztzjy.linkCommerce.config.security.JwtUser;
|
||||||
|
import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepOneValidationRequest;
|
||||||
|
import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepOneValidationResult;
|
||||||
|
|
||||||
|
public interface ConsumerScenarioStepOneService {
|
||||||
|
ConsumerScenarioStepOneValidationResult validate(ConsumerScenarioStepOneValidationRequest request, JwtUser user);
|
||||||
|
}
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
package com.sztzjy.linkCommerce.service.impl;
|
||||||
|
|
||||||
|
import com.sztzjy.linkCommerce.config.exception.handler.ServiceException;
|
||||||
|
import com.sztzjy.linkCommerce.config.security.JwtUser;
|
||||||
|
import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepOneValidationRequest;
|
||||||
|
import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepOneValidationResult;
|
||||||
|
import com.sztzjy.linkCommerce.service.ConsumerScenarioStepOneService;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ConsumerScenarioStepOneServiceImpl implements ConsumerScenarioStepOneService {
|
||||||
|
private static final List<String> STANDARD_ORDER = Arrays.asList(
|
||||||
|
"problem-awareness",
|
||||||
|
"information-search",
|
||||||
|
"evaluation-decision",
|
||||||
|
"purchase-conversion",
|
||||||
|
"post-purchase"
|
||||||
|
);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConsumerScenarioStepOneValidationResult validate(ConsumerScenarioStepOneValidationRequest request, JwtUser user) {
|
||||||
|
requireStudent(user);
|
||||||
|
List<String> stageOrder = request == null ? null : request.getStageOrder();
|
||||||
|
if (stageOrder == null || stageOrder.size() != STANDARD_ORDER.size()
|
||||||
|
|| stageOrder.stream().distinct().count() != STANDARD_ORDER.size()
|
||||||
|
|| !stageOrder.containsAll(STANDARD_ORDER)) {
|
||||||
|
throw badRequest("提交的购买旅程阶段不完整,请重新排序");
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean valid = STANDARD_ORDER.equals(stageOrder);
|
||||||
|
ConsumerScenarioStepOneValidationResult result = new ConsumerScenarioStepOneValidationResult();
|
||||||
|
result.setValid(valid);
|
||||||
|
result.setMessage(valid ? "排序正确,可以进入下一步。" : "排序还不正确,请根据消费者购买旅程再次调整。");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void requireStudent(JwtUser user) {
|
||||||
|
if (user == null || StringUtils.isBlank(user.getUserId())) {
|
||||||
|
throw new ServiceException(HttpStatus.UNAUTHORIZED, "请先登录后再提交");
|
||||||
|
}
|
||||||
|
if (user.getRoleId() != 4) {
|
||||||
|
throw new ServiceException(HttpStatus.FORBIDDEN, "仅学生可以提交实训答案");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ServiceException badRequest(String message) {
|
||||||
|
return new ServiceException(HttpStatus.BAD_REQUEST, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
package com.sztzjy.linkCommerce.service.impl;
|
||||||
|
|
||||||
|
import com.sztzjy.linkCommerce.config.exception.handler.ServiceException;
|
||||||
|
import com.sztzjy.linkCommerce.config.security.JwtUser;
|
||||||
|
import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepOneValidationRequest;
|
||||||
|
import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepOneValidationResult;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
class ConsumerScenarioStepOneServiceImplTest {
|
||||||
|
@Test
|
||||||
|
void acceptsTheStandardJourneyOrder() {
|
||||||
|
ConsumerScenarioStepOneValidationResult result = new ConsumerScenarioStepOneServiceImpl().validate(request(
|
||||||
|
"problem-awareness", "information-search", "evaluation-decision", "purchase-conversion", "post-purchase"), student());
|
||||||
|
|
||||||
|
assertTrue(result.isValid());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void returnsAnIncorrectResultForAnUnorderedJourney() {
|
||||||
|
ConsumerScenarioStepOneValidationResult result = new ConsumerScenarioStepOneServiceImpl().validate(request(
|
||||||
|
"information-search", "problem-awareness", "evaluation-decision", "purchase-conversion", "post-purchase"), student());
|
||||||
|
|
||||||
|
assertFalse(result.isValid());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void rejectsIncompleteJourneyData() {
|
||||||
|
assertThrows(ServiceException.class, () -> new ConsumerScenarioStepOneServiceImpl().validate(request(
|
||||||
|
"problem-awareness", "information-search"), student()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void rejectsNonStudent() {
|
||||||
|
JwtUser teacher = new JwtUser();
|
||||||
|
teacher.setRoleId(2);
|
||||||
|
assertThrows(ServiceException.class, () -> new ConsumerScenarioStepOneServiceImpl().validate(request(
|
||||||
|
"problem-awareness", "information-search", "evaluation-decision", "purchase-conversion", "post-purchase"), teacher));
|
||||||
|
}
|
||||||
|
|
||||||
|
private ConsumerScenarioStepOneValidationRequest request(String... stageOrder) {
|
||||||
|
ConsumerScenarioStepOneValidationRequest request = new ConsumerScenarioStepOneValidationRequest();
|
||||||
|
request.setStageOrder(Arrays.asList(stageOrder));
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JwtUser student() {
|
||||||
|
JwtUser user = new JwtUser();
|
||||||
|
user.setUserId("stu-1");
|
||||||
|
user.setRoleId(4);
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue