package controllers;
import api.v1.DPOrder;
import api.v1.Forecast;
import api.v1.Order;
import api.v1.OrderSearch;
import auth.modules.TokenAuthorize;
import auth.types.PermissionType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import compositions.*;
import exceptions.PoseidonException;
import mapper.DPOrderMapper;
import mapper.ForecastMapper;
import mapper.OrderMapper;
import models.ForecastModel;
import models.OrderModel;
import models.RecipientModel;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import play.libs.Json;
import play.mvc.Http;
import play.mvc.Result;
import quba.models.QubaStation;
import service.OrderService;
import service.PoseidonService;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@ResponseTimeLoggingComposition.ResponseTimeLogging
@RequestLoggingComposition.RequestLogging
@NoCacheComposition.NoCache
@ErrorHandlingComposition.ErrorHandling
@CorsComposition.Cors
public class OrderControllerV1 extends PoseidonController {
private static Logger logger = LoggerFactory.getLogger(OrderControllerV1.class);
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result getAll() {
OrderService service = new OrderService(currentApiUser().username);
List<OrderModel> orderModels = service.findAll();
List<Order> orders = new OrderMapper().mapToApi(orderModels);
return ok(Json.toJson(orders));
}
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result get(Long id) {
OrderService service = new OrderService(currentApiUser().username);
OrderModel orderModel = service.getById(id);
if (orderModel == null) return notFound();
Order order = new OrderMapper().mapToApi(orderModel);
return ok(Json.toJson(order));
}
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result getByMetref(String metref) {
OrderService service = new OrderService(currentApiUser().username);
OrderModel orderModel = service.getByMetref(metref);
if ( orderModel == null) return notFound();
Order order = new OrderMapper().mapToApi(orderModel);
return ok(Json.toJson(order));
}
@TokenAuthorize(requiredPermission = PermissionType.WRITE)
public Result createOrUpdate(String callback) {
JsonNode body = request().body().asJson();
ObjectMapper mapper = new ObjectMapper();
Order apiOrder;
try {
apiOrder = mapper.readValue(body.toString(), Order.class);
} catch (IOException e) {
return badRequest("json post parameter parsing failure: " + e.getMessage());
}
OrderModel model = new OrderService(currentApiUser().username).createOrUpdate(apiOrder);
Order newOrder = new OrderMapper().mapToApi(model);
JsonNode jsonOut = Json.toJson(newOrder);
return ok(callback, jsonOut);
}
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result search(String callback) {
JsonNode body = request().body().asJson();
ObjectMapper mapper = new ObjectMapper();
OrderSearch apiSearch;
try {
apiSearch = mapper.readValue(body.toString(), OrderSearch.class);
} catch (IOException e) {
return badRequest("json post parameter parsing failure: " + e.getMessage());
}
List<OrderModel> orderModels = new OrderService(currentApiUser().username).search(apiSearch);
List<Order> searchResults = new OrderMapper().mapToApi(orderModels);
JsonNode jsonOut = Json.toJson(searchResults);
return ok(callback, jsonOut);
}
@TokenAuthorize(requiredPermission = PermissionType.WRITE)
public Result deleteOrder(Long id) {
OrderModel orderModel = new OrderService(currentApiUser().username).deleteOrder(id);
Order order = new OrderMapper().mapToApi(orderModel);
return ok(Json.toJson(order));
}
//@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result getOffshoreOrdersDate() {
OrderService service = new OrderService(currentApiUser().username);
DateTime tomorrow = new DateTime(PoseidonService.getTimeZone());
tomorrow.plusDays(1);
List<OrderModel> orderModels = service.getOrdersForDate(tomorrow);
if (orderModels == null) throw new PoseidonException(Http.Status.INTERNAL_SERVER_ERROR, "Fann ingen ordrer");
List<DPOrder> dpOrders = new DPOrderMapper().mapToApi(orderModels);
return ok(Json.toJson(dpOrders));
}
//@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result getOffshoreOrders(Long date) {
OrderService service = new OrderService(currentApiUser().username);
DateTime tomorrow = new DateTime(date, PoseidonService.getTimeZone());
List<OrderModel> orderModels = service.getOrdersForDate(tomorrow);
if (orderModels == null) throw new PoseidonException(Http.Status.INTERNAL_SERVER_ERROR, "Fann ingen ordrer");
List<DPOrder> dpOrders = new DPOrderMapper().mapToApi(orderModels);
return ok(Json.toJson(dpOrders));
}
//@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result getActiveOrders() {
List<ForecastModel> forecasts = new OrderService(currentApiUser().username).getActiveForecastsForSms();
List<Forecast> activeForecasts = new ForecastMapper().mapToApi(forecasts);
if ( activeForecasts != null && activeForecasts.size() >0) {
for (Forecast activeForecast : activeForecasts) {
OrderModel order = OrderModel.findByMetref(activeForecast.metref);
if (order == null) throw new PoseidonException(Http.Status.INTERNAL_SERVER_ERROR, "Fant ikke bestilling");
if (order.position == null)
throw new PoseidonException(Http.Status.INTERNAL_SERVER_ERROR, "Bestilling uten posisjon: " + order.id);
if (order.position.name == null || order.position.name.isEmpty())
throw new PoseidonException(Http.Status.INTERNAL_SERVER_ERROR, "Bestilling med posisjon uten navn");
QubaStation station = QubaStation.findStationByName(order.position.name);
if (station == null) throw new PoseidonException(Http.Status.INTERNAL_SERVER_ERROR, "Fant ikke stasjon i Quba med navn " + order.position.name);
activeForecast.stationid = station.stationid;
activeForecast.latitude = order.position.latitude;
activeForecast.longitude = order.position.longitude;
activeForecast.posisjon = order.position_name != null && !order.position_name.isEmpty()?
order.position_name:order.position.name;
activeForecast.customer_name = order.customer.name;
activeForecast.recipients = new ArrayList<>();
for (RecipientModel recipient : order.recipients) {
activeForecast.recipients.add(recipient.email);
}
}
}
JsonNode jsonOut = Json.toJson(activeForecasts);
return ok(jsonOut);
}
public Result forecast(String callback) {
JsonNode body = request().body().asJson();
ObjectMapper mapper = new ObjectMapper();
Forecast apiForecast;
ForecastModel forecast = null;
try {
apiForecast = mapper.readValue(body.toString(), Forecast.class);
} catch (IOException e) {
return badRequest("json post parameter parsing failure: " + e.getMessage());
}
if ( apiForecast.id > 0){
forecast = ForecastModel.find.byId(apiForecast.id);
if ( forecast != null ) {
boolean modified = false;
if ( apiForecast.failedAt != null ){
forecast.failedAt = apiForecast.failedAt;
forecast.failureReason = apiForecast.failureReason;
modified = true;
} else{
if ( forecast.producedAt == null ) {
forecast.producedAt = apiForecast.producedAt;
forecast.failedAt = null;
modified=true;
}
}
if ( modified) {
forecast.update();
}
}
}
JsonNode jsonOut = Json.toJson(new ForecastMapper().mapToApi(forecast));
return ok(callback,jsonOut);
}
}