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());
 | 
						|
    }
 | 
						|
}
 |