92 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
		
		
			
		
	
	
			92 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| 
								 | 
							
								package controllers;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import com.fasterxml.jackson.databind.JsonNode;
							 | 
						||
| 
								 | 
							
								import com.fasterxml.jackson.databind.ObjectMapper;
							 | 
						||
| 
								 | 
							
								import model.Student;
							 | 
						||
| 
								 | 
							
								import play.libs.Json;
							 | 
						||
| 
								 | 
							
								import play.libs.concurrent.HttpExecutionContext;
							 | 
						||
| 
								 | 
							
								import play.mvc.Controller;
							 | 
						||
| 
								 | 
							
								import play.mvc.Http;
							 | 
						||
| 
								 | 
							
								import play.mvc.Result;
							 | 
						||
| 
								 | 
							
								import store.StudentStore;
							 | 
						||
| 
								 | 
							
								import utils.Util;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import javax.inject.Inject;
							 | 
						||
| 
								 | 
							
								import java.util.Optional;
							 | 
						||
| 
								 | 
							
								import java.util.Set;
							 | 
						||
| 
								 | 
							
								import java.util.concurrent.CompletionStage;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import static java.util.concurrent.CompletableFuture.supplyAsync;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public class StudentController extends Controller {
							 | 
						||
| 
								 | 
							
								    private HttpExecutionContext ec;
							 | 
						||
| 
								 | 
							
								    private StudentStore studentStore;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @Inject
							 | 
						||
| 
								 | 
							
								    public StudentController(HttpExecutionContext ec, StudentStore studentStore) {
							 | 
						||
| 
								 | 
							
								        this.studentStore = studentStore;
							 | 
						||
| 
								 | 
							
								        this.ec = ec;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public CompletionStage<Result> create(Http.Request request) {
							 | 
						||
| 
								 | 
							
								        JsonNode json = request.body().asJson();
							 | 
						||
| 
								 | 
							
								        return supplyAsync(() -> {
							 | 
						||
| 
								 | 
							
								            if (json == null) {
							 | 
						||
| 
								 | 
							
								                return badRequest(Util.createResponse("Expecting Json data", false));
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Optional<Student> studentOptional = studentStore.addStudent(Json.fromJson(json, Student.class));
							 | 
						||
| 
								 | 
							
								            return studentOptional.map(student -> {
							 | 
						||
| 
								 | 
							
								                JsonNode jsonObject = Json.toJson(student);
							 | 
						||
| 
								 | 
							
								                return created(Util.createResponse(jsonObject, true));
							 | 
						||
| 
								 | 
							
								            }).orElse(internalServerError(Util.createResponse("Could not create data.", false)));
							 | 
						||
| 
								 | 
							
								        }, ec.current());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public CompletionStage<Result> listStudents() {
							 | 
						||
| 
								 | 
							
								        return supplyAsync(() -> {
							 | 
						||
| 
								 | 
							
								            Set<Student> result = studentStore.getAllStudents();
							 | 
						||
| 
								 | 
							
								            ObjectMapper mapper = new ObjectMapper();
							 | 
						||
| 
								 | 
							
								            JsonNode jsonData = mapper.convertValue(result, JsonNode.class);
							 | 
						||
| 
								 | 
							
								            return ok(Util.createResponse(jsonData, true));
							 | 
						||
| 
								 | 
							
								        }, ec.current());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public CompletionStage<Result> retrieve(int id) {
							 | 
						||
| 
								 | 
							
								        return supplyAsync(() -> {
							 | 
						||
| 
								 | 
							
								            final Optional<Student> studentOptional = studentStore.getStudent(id);
							 | 
						||
| 
								 | 
							
								            return studentOptional.map(student -> {
							 | 
						||
| 
								 | 
							
								                JsonNode jsonObjects = Json.toJson(student);
							 | 
						||
| 
								 | 
							
								                return ok(Util.createResponse(jsonObjects, true));
							 | 
						||
| 
								 | 
							
								            }).orElse(notFound(Util.createResponse("Student with id:" + id + " not found", false)));
							 | 
						||
| 
								 | 
							
								        }, ec.current());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public CompletionStage<Result> update(Http.Request request) {
							 | 
						||
| 
								 | 
							
								        JsonNode json = request.body().asJson();
							 | 
						||
| 
								 | 
							
								        return supplyAsync(() -> {
							 | 
						||
| 
								 | 
							
								            if (json == null) {
							 | 
						||
| 
								 | 
							
								                return badRequest(Util.createResponse("Expecting Json data", false));
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            Optional<Student> studentOptional = studentStore.updateStudent(Json.fromJson(json, Student.class));
							 | 
						||
| 
								 | 
							
								            return studentOptional.map(student -> {
							 | 
						||
| 
								 | 
							
								                if (student == null) {
							 | 
						||
| 
								 | 
							
								                    return notFound(Util.createResponse("Student not found", false));
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                JsonNode jsonObject = Json.toJson(student);
							 | 
						||
| 
								 | 
							
								                return ok(Util.createResponse(jsonObject, true));
							 | 
						||
| 
								 | 
							
								            }).orElse(internalServerError(Util.createResponse("Could not create data.", false)));
							 | 
						||
| 
								 | 
							
								        }, ec.current());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public CompletionStage<Result> delete(int id) {
							 | 
						||
| 
								 | 
							
								        return supplyAsync(() -> {
							 | 
						||
| 
								 | 
							
								            boolean status = studentStore.deleteStudent(id);
							 | 
						||
| 
								 | 
							
								            if (!status) {
							 | 
						||
| 
								 | 
							
								                return notFound(Util.createResponse("Student with id:" + id + " not found", false));
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return ok(Util.createResponse("Student with id:" + id + " deleted", true));
							 | 
						||
| 
								 | 
							
								        }, ec.current());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |