/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package controllers.catalog;
import static com.emc.vipr.client.core.util.ResourceUtils.uri;
import com.emc.vipr.model.catalog.ScheduledEventRestRep;
import static util.BourneUtil.getCatalogClient;
import static util.CatalogServiceUtils.getCatalogService;
import static util.OrderUtils.getOrder;
import java.net.URI;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.joda.time.DateTime;
import controllers.security.Security;
import models.datatable.ApprovalsDataTable;
import models.datatable.ApprovalsDataTable.ApprovalRequestInfo;
import play.Logger;
import play.data.validation.Required;
import play.data.validation.Validation;
import play.mvc.Controller;
import play.mvc.Util;
import play.mvc.With;
import play.mvc.results.Result;
import play.mvc.results.Unauthorized;
import util.MessagesUtils;
import util.datatable.DataTablesSupport;
import com.emc.vipr.client.ViPRCatalogClient2;
import com.emc.vipr.model.catalog.ApprovalRestRep;
import com.emc.vipr.model.catalog.ApprovalUpdateParam;
import com.emc.vipr.model.catalog.CatalogServiceRestRep;
import com.emc.vipr.model.catalog.OrderRestRep;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import controllers.Common;
import controllers.deadbolt.Restrict;
import controllers.deadbolt.Restrictions;
/**
* @author Chris Dail
*/
@With(Common.class)
@Restrictions({ @Restrict("TENANT_APPROVER") })
public class Approvals extends Controller {
public static void index() {
ApprovalsDataTable dataTable = new ApprovalsDataTable();
render(dataTable);
}
public static void approvalsJson() {
ViPRCatalogClient2 catalog = getCatalogClient();
Map<URI, OrderRestRep> orders = Maps.newHashMap();
Map<URI, CatalogServiceRestRep> catalogServices = Maps.newHashMap();
List<ApprovalRequestInfo> approvalRequestInfos = Lists.newArrayList();
List<ApprovalRestRep> approvals = catalog.approvals().getByUserTenant();
for (ApprovalRestRep approval : approvals) {
OrderRestRep order = null;
if (approval.getOrder() != null) {
if (!orders.keySet().contains(approval.getOrder().getId())) {
order = getOrder(approval.getOrder());
if (order != null) {
orders.put(order.getId(), order);
}
}
else {
order = orders.get(approval.getOrder().getId());
}
}
CatalogServiceRestRep catalogService = null;
if (order != null && order.getCatalogService() != null) {
if (!catalogServices.keySet().contains(order.getCatalogService().getId())) {
catalogService = getCatalogService(order.getCatalogService());
if (catalogService != null) {
catalogServices.put(catalogService.getId(), catalogService);
}
}
else {
catalogService = catalogServices.get(order.getCatalogService().getId());
}
}
approvalRequestInfos.add(new ApprovalRequestInfo(approval, order, catalogService));
}
renderJSON(DataTablesSupport.createJSON(approvalRequestInfos, params));
}
public static void edit(String id) {
ViPRCatalogClient2 catalog = getCatalogClient();
ApprovalRestRep approval = catalog.approvals().get(uri(id));
if (! approval.getTenant().getId().toString().equals(Security.getUserInfo().getTenant())) {
Result result = new Unauthorized( MessagesUtils.get("approval.noTenantAccess", approval.getTenant().getId()) );
renderTemplate("errors/401.html", result);
}
OrderRestRep order = null;
ScheduledEventRestRep scheduledEvent = null;
Date scheduleStartDateTime = null;
CatalogServiceRestRep service = null;
if (approval != null) {
order = getOrder(approval.getOrder());
if (order != null) {
service = getCatalogService(order.getCatalogService());
URI scheduledEventId = order.getScheduledEventId();
if (scheduledEventId != null) {
scheduledEvent = getCatalogClient().orders().getScheduledEvent(scheduledEventId);
String isoDateTimeStr = String.format("%sT%02d:%02d:00Z",
scheduledEvent.getScheduleInfo().getStartDate(),
scheduledEvent.getScheduleInfo().getHourOfDay(),
scheduledEvent.getScheduleInfo().getMinuteOfHour());
DateTime startDateTime = DateTime.parse(isoDateTimeStr);
scheduleStartDateTime = startDateTime.toDate();
}
}
}
render(approval, order, service, scheduledEvent, scheduleStartDateTime);
}
public static void submit(String id, ApprovalsForm approval) {
ViPRCatalogClient2 catalog = getCatalogClient();
ApprovalRestRep approvalRep = catalog.approvals().get(uri(id));
OrderRestRep order = getOrder(approvalRep.getOrder());
if (approvalRep.isPending()) {
approval.validate("approval");
if (Validation.hasErrors()) {
Common.handleError();
}
if (isApprove(approval.getSubmit())) {
approve(approvalRep, approval.getMessage());
flash.put("success", MessagesUtils.get("approval.approve.message", order.getSubmittedBy()));
}
else if (isReject(approval.getSubmit())) {
reject(approvalRep, approval.getMessage());
flash.put("warn", MessagesUtils.get("approval.reject.message", order.getSubmittedBy()));
}
}
else {
flash.error(MessagesUtils.get("approval.notPending.error", order.getOrderNumber()));
}
index();
}
protected static boolean isApprove(String value) {
return "approve".equals(value);
}
protected static boolean isReject(String value) {
return "reject".equals(value);
}
@Util
public static void approve(ApprovalRestRep approval, String message) {
action(approval.getId(), ApprovalRestRep.APPROVED, message);
}
@Util
public static void reject(ApprovalRestRep approval, String message) {
action(approval.getId(), ApprovalRestRep.REJECTED, message);
}
private static void action(URI approvalId, String status, String message) {
ApprovalUpdateParam updateParam = new ApprovalUpdateParam();
updateParam.setApprovalStatus(status);
updateParam.setMessage(message);
getCatalogClient().approvals().update(approvalId, updateParam);
}
public static class ApprovalsForm {
@Required
public String submit;
@Required
public String message;
public ApprovalsForm(String submit, String message) {
this.submit = submit;
this.message = message;
}
public String getSubmit() {
return this.submit;
}
public String getMessage() {
return this.message;
}
public void validate(String formName) {
Validation.valid(formName, this);
}
}
}