package controllers;
import api.v1.Position;
import api.v1.PositionSearch;
import auth.modules.TokenAuthorize;
import auth.types.PermissionType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import compositions.*;
import mapper.PositionMapper;
import models.PositionModel;
import play.libs.Json;
import play.mvc.Result;
import service.CoordinateConversionService;
import service.PositionService;
import java.io.IOException;
import java.util.List;
@ResponseTimeLoggingComposition.ResponseTimeLogging
@RequestLoggingComposition.RequestLogging
@NoCacheComposition.NoCache
@ErrorHandlingComposition.ErrorHandling
@CorsComposition.Cors
public class PositionControllerV1 extends PoseidonController {
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result getAll() {
PositionService service = new PositionService(currentApiUser().username);
List<PositionModel> positionModels = service.findAll();
List<Position> positions = new PositionMapper().mapToApi(positionModels);
return ok(Json.toJson(positions));
}
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result get(Long id) {
PositionService service = new PositionService(currentApiUser().username);
PositionModel positionModel = service.getById(id);
if ( positionModel == null ){
return notFound("Posisjon med id " + id + " ble ikke funnet");
}
Position position = new PositionMapper().mapToApi(positionModel);
return ok(Json.toJson(position));
}
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result getByName(String name) {
PositionService service = new PositionService(currentApiUser().username);
PositionModel positionModel = service.findByName(name);
if ( positionModel == null ){
return notFound("Posisjon med navn " + name + " ble ikke funnet");
}
Position position = new PositionMapper().mapToApi(positionModel);
return ok(Json.toJson(position));
}
@TokenAuthorize(requiredPermission = PermissionType.WRITE)
public Result createOrUpdate(String callback) {
JsonNode body = request().body().asJson();
ObjectMapper mapper = new ObjectMapper();
Position apiPosition;
try {
apiPosition = mapper.readValue(body.toString(),Position.class);
} catch (IOException e) {
return badRequest("json post parameter parsing failure: " + e.getMessage());
}
PositionModel model = new PositionService(currentApiUser().username).createOrUpdate(apiPosition);
Position newPosition = new PositionMapper().mapToApi(model);
JsonNode jsonOut = Json.toJson(newPosition);
return ok(callback,jsonOut);
}
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result search(String callback){
JsonNode body = request().body().asJson();
PositionSearch apiSearch;
ObjectMapper mapper = new ObjectMapper();
try {
apiSearch = body == null ? new PositionSearch() : mapper.readValue(body.toString(), PositionSearch.class);
} catch (IOException e) {
return badRequest("json post parameter parsing failure: " + e.getMessage());
}
List<PositionModel>positionModels = new PositionService(currentApiUser().username).search(apiSearch);
List<Position> searchResults = new PositionMapper().mapToApi(positionModels);
JsonNode jsonOut = Json.toJson(searchResults);
return ok(callback,jsonOut);
}
/*
Update the other coordinate fields based on the value in the field
selected by the coordinateFormat enum
*/
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result coord ( String callback){
JsonNode body = request().body().asJson();
Position apiPosition;
ObjectMapper mapper = new ObjectMapper();
try {
apiPosition = body == null ? new Position() : mapper.readValue(body.toString(), Position.class);
} catch (IOException e) {
return badRequest("json post parameter parsing failure: " + e.getMessage());
}
apiPosition = new CoordinateConversionService(currentApiUser().username).convertCoordinates(apiPosition);
JsonNode jsonOut = Json.toJson(apiPosition);
return ok(callback,jsonOut);
}
public Result deletePosition(Long id) {
PositionService positionService = new PositionService(currentApiUser().username);
PositionModel position = positionService.getById(id);
position = positionService.deletePosition(position);
Position newPosition = new PositionMapper().mapToApi(position);
JsonNode jsonOut = Json.toJson(newPosition);
return ok(jsonOut);
}
}