diff --git a/src/main/java/com/thoughtworks/rslist/api/RsController.java b/src/main/java/com/thoughtworks/rslist/api/RsController.java index 6899e4de..81d67e7b 100644 --- a/src/main/java/com/thoughtworks/rslist/api/RsController.java +++ b/src/main/java/com/thoughtworks/rslist/api/RsController.java @@ -1,11 +1,52 @@ package com.thoughtworks.rslist.api; -import org.springframework.web.bind.annotation.RestController; +import com.thoughtworks.rslist.dto.RsEventResponse; +import com.thoughtworks.rslist.entity.RsEvent; +import com.thoughtworks.rslist.service.RsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; import java.util.Arrays; import java.util.List; +@RequestMapping(path = "/rs") @RestController public class RsController { - private List rsList = Arrays.asList("第一条事件", "第二条事件", "第三条事件"); + + @Autowired + RsService rsService; + + + @GetMapping("/lists") + @ResponseBody + public RsEventResponse> getRsList(@RequestParam(required = false) Integer start, + @RequestParam(required = false) Integer end) { + return rsService.getRsList(start, end); + } + + @GetMapping("/lists/{eventId}") + @ResponseBody + public RsEventResponse getRsListByEventId(@PathVariable Integer eventId) { + return rsService.getRsListByEventId(eventId); + } + + @PostMapping("/lists") + @ResponseStatus(HttpStatus.CREATED) + @ResponseBody + public RsEventResponse createRsList(@RequestBody RsEvent rsEvent) { + return rsService.createRsList(rsEvent); + } + + @PutMapping("/lists/{eventId}") + @ResponseBody + public RsEventResponse updateRsList(@PathVariable Integer eventId, @RequestBody RsEvent rsEvent) { + return rsService.updateRsListByEventId(eventId, rsEvent); + } + + @DeleteMapping("/lists/{eventId}") + @ResponseBody + public RsEventResponse deleleRsList(@PathVariable Integer eventId) { + return rsService.deleteRsLIstByEventId(eventId); + } } diff --git a/src/main/java/com/thoughtworks/rslist/dto/ErrorDTO.java b/src/main/java/com/thoughtworks/rslist/dto/ErrorDTO.java new file mode 100644 index 00000000..dec1e441 --- /dev/null +++ b/src/main/java/com/thoughtworks/rslist/dto/ErrorDTO.java @@ -0,0 +1,11 @@ +package com.thoughtworks.rslist.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ErrorDTO { + private Integer code; + private String message; +} diff --git a/src/main/java/com/thoughtworks/rslist/dto/RsEventResponse.java b/src/main/java/com/thoughtworks/rslist/dto/RsEventResponse.java new file mode 100644 index 00000000..6bcee2cb --- /dev/null +++ b/src/main/java/com/thoughtworks/rslist/dto/RsEventResponse.java @@ -0,0 +1,13 @@ +package com.thoughtworks.rslist.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class RsEventResponse { + + private Integer code; + private String message; + private T data; +} diff --git a/src/main/java/com/thoughtworks/rslist/entity/RsEvent.java b/src/main/java/com/thoughtworks/rslist/entity/RsEvent.java new file mode 100644 index 00000000..bd2b5e01 --- /dev/null +++ b/src/main/java/com/thoughtworks/rslist/entity/RsEvent.java @@ -0,0 +1,18 @@ +package com.thoughtworks.rslist.entity; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class RsEvent { + + private String eventName; + + private String keyWord; + + public RsEvent(String eventName, String keyWord) { + this.eventName = eventName; + this.keyWord = keyWord; + } +} diff --git a/src/main/java/com/thoughtworks/rslist/exception/GlobalExceptionHandler.java b/src/main/java/com/thoughtworks/rslist/exception/GlobalExceptionHandler.java new file mode 100644 index 00000000..7a3b2116 --- /dev/null +++ b/src/main/java/com/thoughtworks/rslist/exception/GlobalExceptionHandler.java @@ -0,0 +1,27 @@ +package com.thoughtworks.rslist.exception; + + +import com.thoughtworks.rslist.dto.ErrorDTO; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import javax.servlet.http.HttpServletRequest; + +@ControllerAdvice +public class GlobalExceptionHandler { + + + @ExceptionHandler(value = NullPointException.class) + @ResponseBody + @ResponseStatus(HttpStatus.OK) + public ErrorDTO RsNullPointErrorHandler(HttpServletRequest req, NullPointException e) { + ErrorDTO r = new ErrorDTO(); + r.setMessage(e.getMessage()); + r.setCode(200); + return r; + } + +} diff --git a/src/main/java/com/thoughtworks/rslist/exception/NullPointException.java b/src/main/java/com/thoughtworks/rslist/exception/NullPointException.java new file mode 100644 index 00000000..e61e9e60 --- /dev/null +++ b/src/main/java/com/thoughtworks/rslist/exception/NullPointException.java @@ -0,0 +1,7 @@ +package com.thoughtworks.rslist.exception; + +public class NullPointException extends RuntimeException { + public NullPointException(String message) { + super(message); + } +} diff --git a/src/main/java/com/thoughtworks/rslist/service/RsService.java b/src/main/java/com/thoughtworks/rslist/service/RsService.java new file mode 100644 index 00000000..39104b69 --- /dev/null +++ b/src/main/java/com/thoughtworks/rslist/service/RsService.java @@ -0,0 +1,98 @@ +package com.thoughtworks.rslist.service; + +import com.thoughtworks.rslist.dto.RsEventResponse; +import com.thoughtworks.rslist.entity.RsEvent; +import com.thoughtworks.rslist.exception.NullPointException; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class RsService { + + static List tempRsList = initRsList(); + + private static List initRsList() { + List rsList = new ArrayList<>(); + rsList.add(new RsEvent("第一条事件","无分类")); + rsList.add(new RsEvent("第二条事件","无分类")); + rsList.add(new RsEvent("第三条事件","无分类")); + return rsList; + } + + + public RsEventResponse> getRsList(Integer start, Integer end) { + RsEventResponse> rsListResponse = new RsEventResponse<>(); + rsListResponse.setCode(200); + + if (start == null || end == null) { + rsListResponse.setMessage("get all rs list success!"); + rsListResponse.setData(tempRsList); + }else { + verifyEventId(start); + verifyEventId(end); + rsListResponse.setMessage("get rs list in range success!"); + rsListResponse.setData(tempRsList.subList(start - 1, end)); + } + return rsListResponse; + } + + public RsEventResponse getRsListByEventId(Integer eventId) { + verifyEventId(eventId); + RsEventResponse reListResponse = new RsEventResponse<>(); + reListResponse.setCode(200); + reListResponse.setMessage("get rs list by id success!"); + reListResponse.setData(tempRsList.get(eventId - 1)); + + return reListResponse; + } + + public RsEventResponse createRsList(RsEvent rsEvent) { + tempRsList.add(rsEvent); + RsEventResponse rsListResponse = new RsEventResponse<>(); + rsListResponse.setCode(201); + rsListResponse.setMessage("create rs list success!"); + rsListResponse.setData(rsEvent); + + return rsListResponse; + } + + public RsEventResponse updateRsListByEventId(Integer eventId, RsEvent rsEvent) { + verifyEventId(eventId); + RsEvent currentRsEvent = tempRsList.get(eventId - 1); + currentRsEvent.setEventName(rsEvent.getEventName().isEmpty()?currentRsEvent.getEventName(): rsEvent.getEventName()); + currentRsEvent.setKeyWord(rsEvent.getKeyWord().isEmpty()?currentRsEvent.getKeyWord(): rsEvent.getKeyWord()); + tempRsList.remove(eventId - 1); + tempRsList.add(eventId - 1, currentRsEvent); + + RsEventResponse rsListResponse = new RsEventResponse<>(); + rsListResponse.setCode(200); + rsListResponse.setMessage("update rs list by event id success!"); + rsListResponse.setData(rsEvent); + + return rsListResponse; + + } + + public RsEventResponse deleteRsLIstByEventId(Integer eventId) { + verifyEventId(eventId); + RsEvent currentRsEvent = tempRsList.get(eventId - 1); + tempRsList.remove(eventId - 1); + + RsEventResponse rsListResponse = new RsEventResponse<>(); + rsListResponse.setCode(200); + rsListResponse.setMessage("delete rs list by event id success!"); + rsListResponse.setData(currentRsEvent); + + return rsListResponse; + } + + private void verifyEventId(Integer eventId) { + if (eventId <= 0 || eventId > tempRsList.size()) { + throw new NullPointException("event id is invalid input cause null point exception"); + } + } + + +} diff --git a/src/test/java/com/thoughtworks/rslist/api/RsControllerTests.java b/src/test/java/com/thoughtworks/rslist/api/RsControllerTests.java new file mode 100644 index 00000000..8ec6a7b3 --- /dev/null +++ b/src/test/java/com/thoughtworks/rslist/api/RsControllerTests.java @@ -0,0 +1,66 @@ +package com.thoughtworks.rslist.api; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.thoughtworks.rslist.entity.RsEvent; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc +public class RsControllerTests { + + @Autowired + MockMvc mockMvc; + + @Test + void should_return_status_ok_when_get_rs_list() throws Exception { + mockMvc.perform(get("/rs/list")) + .andExpect(status().isOk()); + + mockMvc.perform(get("/rs/list?start=1&end=2")) + .andExpect(status().isOk()); + } + + @Test + void should_return_status_ok_when_get_rs_list_by_event_id() throws Exception { + mockMvc.perform(get("/rs/list/1")) + .andExpect(status().isOk()); + } + + @Test + void should_return_status_create_when_create_rs_list() throws Exception { + RsEvent rsEvent = new RsEvent("猪肉涨价啦","经济"); + ObjectMapper objectMapper = new ObjectMapper(); + String json = objectMapper.writeValueAsString(rsEvent); + mockMvc.perform(post("/rs/list") + .content(json).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()); + } + + @Test + void should_return_status_ok_when_create_rs_list() throws Exception { + RsEvent rsEvent = new RsEvent("猪肉涨价啦","经济"); + ObjectMapper objectMapper = new ObjectMapper(); + String json = objectMapper.writeValueAsString(rsEvent); + mockMvc.perform(put("/rs/list/1") + .content(json).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + + @Test + void should_return_status_ok_when_delete_rs_list() throws Exception { + mockMvc.perform(delete("/rs/list/1")) + .andExpect(status().isOk()); + } + + + +} diff --git a/src/test/java/com/thoughtworks/rslist/service/RsServiceTests.java b/src/test/java/com/thoughtworks/rslist/service/RsServiceTests.java new file mode 100644 index 00000000..d2835582 --- /dev/null +++ b/src/test/java/com/thoughtworks/rslist/service/RsServiceTests.java @@ -0,0 +1,57 @@ +package com.thoughtworks.rslist.service; + +import com.thoughtworks.rslist.dto.RsEventResponse; +import com.thoughtworks.rslist.entity.RsEvent; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@SpringBootTest +public class RsServiceTests { + + + @Autowired + RsService rsService; + + @Test + void should_return_all_rs_list_json_when_get_rs_list() { + RsEventResponse> response = rsService.getRsList(null, null); + assertEquals("get all rs list success!", response.getMessage()); + } + + @Test + void should_return_rs_list_in_range_json_when_get_rs_list() { + RsEventResponse> response = rsService.getRsList(1, 2); + assertEquals("get rs list in range success!", response.getMessage()); + } + + @Test + void should_return_rs_list_json_when_get_rs_list_by_event_id() { + RsEventResponse response = rsService.getRsListByEventId(1); + assertEquals("get rs list by id success!", response.getMessage()); + } + + @Test + void should_return_rs_list_json_when_create_rs_list() { + RsEvent rsEvent = new RsEvent("猪肉涨价啦","经济"); + RsEventResponse response = rsService.createRsList(rsEvent); + assertEquals("create rs list success!", response.getMessage()); + } + + @Test + void should_return_rs_list_json_when_update_rs_list_by_event_id() { + RsEvent rsEvent = new RsEvent("猪肉涨价啦","经济"); + RsEventResponse response = rsService.updateRsListByEventId(1, rsEvent); + assertEquals("update rs list by event id success!", response.getMessage()); + } + + @Test + void should_return_rs_list_json_when_delete_rs_list_by_event_id() { + RsEventResponse response = rsService.deleteRsLIstByEventId(1); + assertEquals("delete rs list by event id success!", response.getMessage()); + } +}