Skip to content
45 changes: 43 additions & 2 deletions src/main/java/com/thoughtworks/rslist/api/RsController.java
Original file line number Diff line number Diff line change
@@ -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<String> rsList = Arrays.asList("第一条事件", "第二条事件", "第三条事件");

@Autowired
RsService rsService;


@GetMapping("/lists")
@ResponseBody
public RsEventResponse<List<RsEvent>> getRsList(@RequestParam(required = false) Integer start,
@RequestParam(required = false) Integer end) {
return rsService.getRsList(start, end);
}

@GetMapping("/lists/{eventId}")
@ResponseBody
public RsEventResponse<RsEvent> getRsListByEventId(@PathVariable Integer eventId) {
return rsService.getRsListByEventId(eventId);
}

@PostMapping("/lists")
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public RsEventResponse<RsEvent> createRsList(@RequestBody RsEvent rsEvent) {
return rsService.createRsList(rsEvent);
}

@PutMapping("/lists/{eventId}")
@ResponseBody
public RsEventResponse<RsEvent> updateRsList(@PathVariable Integer eventId, @RequestBody RsEvent rsEvent) {
return rsService.updateRsListByEventId(eventId, rsEvent);
}

@DeleteMapping("/lists/{eventId}")
@ResponseBody
public RsEventResponse<RsEvent> deleleRsList(@PathVariable Integer eventId) {
return rsService.deleteRsLIstByEventId(eventId);
}
}
11 changes: 11 additions & 0 deletions src/main/java/com/thoughtworks/rslist/dto/ErrorDTO.java
Original file line number Diff line number Diff line change
@@ -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;
}
13 changes: 13 additions & 0 deletions src/main/java/com/thoughtworks/rslist/dto/RsEventResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.thoughtworks.rslist.dto;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class RsEventResponse<T> {

private Integer code;
private String message;
private T data;
}
18 changes: 18 additions & 0 deletions src/main/java/com/thoughtworks/rslist/entity/RsEvent.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.thoughtworks.rslist.exception;

public class NullPointException extends RuntimeException {
public NullPointException(String message) {
super(message);
}
}
98 changes: 98 additions & 0 deletions src/main/java/com/thoughtworks/rslist/service/RsService.java
Original file line number Diff line number Diff line change
@@ -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<RsEvent> tempRsList = initRsList();

private static List<RsEvent> initRsList() {
List<RsEvent> rsList = new ArrayList<>();
rsList.add(new RsEvent("第一条事件","无分类"));
rsList.add(new RsEvent("第二条事件","无分类"));
rsList.add(new RsEvent("第三条事件","无分类"));
return rsList;
}


public RsEventResponse<List<RsEvent>> getRsList(Integer start, Integer end) {
RsEventResponse<List<RsEvent>> 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<RsEvent> getRsListByEventId(Integer eventId) {
verifyEventId(eventId);
RsEventResponse<RsEvent> reListResponse = new RsEventResponse<>();
reListResponse.setCode(200);
reListResponse.setMessage("get rs list by id success!");
reListResponse.setData(tempRsList.get(eventId - 1));

return reListResponse;
}

public RsEventResponse<RsEvent> createRsList(RsEvent rsEvent) {
tempRsList.add(rsEvent);
RsEventResponse<RsEvent> rsListResponse = new RsEventResponse<>();
rsListResponse.setCode(201);
rsListResponse.setMessage("create rs list success!");
rsListResponse.setData(rsEvent);

return rsListResponse;
}

public RsEventResponse<RsEvent> 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<RsEvent> rsListResponse = new RsEventResponse<>();
rsListResponse.setCode(200);
rsListResponse.setMessage("update rs list by event id success!");
rsListResponse.setData(rsEvent);

return rsListResponse;

}

public RsEventResponse<RsEvent> deleteRsLIstByEventId(Integer eventId) {
verifyEventId(eventId);
RsEvent currentRsEvent = tempRsList.get(eventId - 1);
tempRsList.remove(eventId - 1);

RsEventResponse<RsEvent> 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");
}
}


}
66 changes: 66 additions & 0 deletions src/test/java/com/thoughtworks/rslist/api/RsControllerTests.java
Original file line number Diff line number Diff line change
@@ -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());
}



}
57 changes: 57 additions & 0 deletions src/test/java/com/thoughtworks/rslist/service/RsServiceTests.java
Original file line number Diff line number Diff line change
@@ -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<List<RsEvent>> 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<List<RsEvent>> 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<RsEvent> 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<RsEvent> 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<RsEvent> 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<RsEvent> response = rsService.deleteRsLIstByEventId(1);
assertEquals("delete rs list by event id success!", response.getMessage());
}
}