package com.flipkart.m3.selfserve.api.request.campaign;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.flipkart.m3.banner.group.CostModel;
import com.flipkart.m3.banner.group.targeting.TargetingExpression;
import com.flipkart.m3.campaign.CampaignType;
import com.flipkart.m3.common.Channel;
import com.flipkart.m3.common.SherlockStore;
import com.flipkart.m3.selfserve.api.validator.CompliantCampaignName;
import com.flipkart.m3.serde.CustomDateDeserializer;
import com.flipkart.m3.serde.CustomDateSerializer;
import com.flipkart.rome.datatypes.request.marketplace.MarketplaceId;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.SuperBuilder;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.ws.rs.DefaultValue;
import java.util.Date;
import java.util.List;
import java.util.Set;
@Getter
@ToString
@SuperBuilder
@JsonIgnoreProperties(ignoreUnknown = true)
public class BrandMerchCampaignAPIRequest extends CampaignAPIRequest {
@JsonProperty("campaignInfo")
@NotNull
@Valid
private final CampaignInfo campaignInfo;
@JsonProperty("adGroups")
@Size(min = 1, message = "At least 1 ad group is required if the key is not null")
@Valid
private final List<BrandMerchCampaignAPIRequest.AdGroup> adGroups;
@JsonCreator
public BrandMerchCampaignAPIRequest(@JsonProperty("campaignInfo") @NotNull @Valid CampaignInfo campaignInfo,
@JsonProperty("adGroups") @NotEmpty @Valid List<AdGroup> adGroups) {
super(CampaignType.BRAND_MERCHANDISING);
this.campaignInfo = campaignInfo;
this.adGroups = adGroups;
}
@AllArgsConstructor
@Getter
@NoArgsConstructor
@Builder
@ToString
public static class CampaignInfo {
@NotBlank(message = "Campaign name cannot be blank")
@JsonProperty("name")
@CompliantCampaignName
private String campaignName;
@NotEmpty(message = "Campaign type cannot be blank")
@JsonProperty("type")
private String campaignType;
@JsonProperty("marketplace")
@DefaultValue("FLIPKART")
private MarketplaceId marketplaceId;
}
@NoArgsConstructor
@Builder(toBuilder = true)
@AllArgsConstructor
@Getter
@ToString
public static class AdGroup implements AdGroupRequest {
private String id;
@NotBlank(message = "cannot be blank")
private String name;
@DefaultValue("vCPM")
private CostModel costModel;
@DefaultValue("GD")
private String deliveryType;
@JsonProperty("channels")
private Set<Channel> channels;
@JsonDeserialize(using = CustomDateDeserializer.class)
@JsonSerialize(using = CustomDateSerializer.class)
@NotNull
private Date startDate;
@JsonDeserialize(using = CustomDateDeserializer.class)
@JsonSerialize(using = CustomDateSerializer.class)
private Date endDate;
@JsonProperty("targetingExpression")
private BrandMerchCampaignAPIRequest.AdGroup.Targeting targeting;
@NoArgsConstructor
@Builder(toBuilder = true)
@AllArgsConstructor
@Getter
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Targeting {
@Setter
@JsonProperty("contextTargetingExpression")
private List<TargetingExpression> contextExpression;
}
@JsonProperty("pageId")
public String pageId;
@JsonProperty("slotId")
public String slotId;
@Override
public String campaignType() {
return CampaignType.BRAND_MERCHANDISING;
}
@JsonProperty("contents")
@Valid
@NotEmpty(message = "A Brand Merch ad group must have at least 1 content")
private List<BrandMerchCampaignAPIRequest.AdGroup.Content> contents;
@NoArgsConstructor
@Builder(toBuilder = true)
@AllArgsConstructor
@Getter
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Content {
@JsonProperty("contentId")
private String contentId;
@JsonProperty("name")
@NotBlank(message = "A Brand Merch Ads content cannot have a blank name")
private String name;
@JsonProperty("isUrlSystemCreated")
@NotNull
private Boolean isSystemURL;
@JsonProperty("creativeTemplateId")
@NotNull
private String creativeTemplateId;
@JsonProperty("landingPageUrl")
@Setter
private String landingPageUrl;
@JsonProperty("brands")
private List<String> brands;
@JsonProperty("brandIds")
private List<String> brandIds;
@JsonProperty("stores")
private List<SherlockStore> stores;
@JsonProperty("themes")
private List<String> themes;
@JsonProperty("creatives")
@NotEmpty(message = "A Brand Merch Ads content cannot be created without at least 1 creative")
private List<Creative> creatives;
}
}
}