Untitled

 avatar
unknown
plain_text
2 years ago
5.8 kB
2
Indexable
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;

        }
    }
}