package controllers;
import api.v1.*;
import auth.modules.TokenAuthorize;
import auth.types.PermissionType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import compositions.*;
import mapper.*;
import models.*;
import play.libs.Json;
import play.mvc.Result;
import service.CustomerService;
import service.PositionService;
import service.RecipientService;
import java.io.IOException;
import java.util.List;
@ResponseTimeLoggingComposition.ResponseTimeLogging
@NoCacheComposition.NoCache
@ErrorHandlingComposition.ErrorHandling
@RequestLoggingComposition.RequestLogging
@CorsComposition.Cors
public class CustomerControllerV1 extends PoseidonController {
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result getAll() {
CustomerService service = new CustomerService(currentApiUser().username);
List<CustomerModel> customerModels = service.findAll();
List<Customer> customers = new CustomerMapper().mapToApi(customerModels);
return ok(Json.toJson(customers));
}
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result get(Long id) {
CustomerService service = new CustomerService(currentApiUser().username);
CustomerModel customerModel = service.getById(id);
if ( customerModel == null ) return notFound();
Customer customer = new CustomerMapper().mapToApi(customerModel);
return ok(Json.toJson(customer));
}
@TokenAuthorize(requiredPermission = PermissionType.WRITE)
public Result createOrUpdate(String callback) {
JsonNode body = request().body().asJson();
ObjectMapper mapper = new ObjectMapper();
Customer apiCustomer;
try {
apiCustomer = mapper.readValue(body.toString(),Customer.class);
} catch (IOException e) {
return badRequest("json post parameter parsing failure: " + e.getMessage());
}
CustomerModel model = new CustomerService(currentApiUser().username).createOrUpdate(apiCustomer);
Customer newCustomer = new CustomerMapper().mapToApi(model);
JsonNode jsonOut = Json.toJson(newCustomer);
return ok(callback,jsonOut);
}
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result getOrders(Long customerId) {
CustomerService service = new CustomerService(currentApiUser().username);
List<OrderModel> orderModel = service.getOrdersForCustomer(customerId);
List<Order> orders= new OrderMapper().mapToApi(orderModel);
return ok(Json.toJson(orders));
}
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result getPositions(Long customerId) {
PositionService service= new PositionService(currentApiUser().username);
List<PositionModel> positionModels = service.getPositionsForCustomer(customerId);
List<Position> positions= new PositionMapper().mapToApi(positionModels);
return ok(Json.toJson(positions));
}
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result getRecipients(Long customerId) {
RecipientService service= new RecipientService(currentApiUser().username);
List<RecipientModel> recipientModels = service.getRecipientsForCustomer(customerId);
List<Recipient> recipients= new RecipientMapper().mapToApi(recipientModels);
return ok(Json.toJson(recipients));
}
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result getTags(Long customerId) {
PositionService service = new PositionService(currentApiUser().username);
List<PositionTagCount> tagModels = service.getTagsForCustomer(customerId);
List<PositionTag> tags = new PositionTagMapper().mapToApiWithCount(tagModels);
return ok(Json.toJson(tags));
}
/*
Post inn et api.v1.Customer objekt. Hvis kunden ikke finnes i poseidon eller kundedb,
returneres 404.
Hvis kunden finnes i Poseidon eller Kundedb, returneres 400 (Bad request) med tilhørende forklaring
*/
@TokenAuthorize(requiredPermission = PermissionType.READ)
public Result checkCustomerExists(String callback) {
JsonNode body = request().body().asJson();
ObjectMapper mapper = new ObjectMapper();
Customer apiCustomer;
try {
apiCustomer = mapper.readValue(body.toString(),Customer.class);
} catch (IOException e) {
return badRequest("json post parameter parsing failure: " + e.getMessage());
}
new CustomerService(currentApiUser().username).checkCustomerExists(apiCustomer);
return notFound();
}
}