package com.airbnb.airpal.api.queries; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import org.joda.time.DateTime; import java.util.UUID; import static com.google.common.base.Preconditions.*; public class CreateSavedQueryBuilder { @JsonProperty @Getter private String description; @JsonProperty @Getter private String query; @JsonProperty @Getter private String user; @JsonProperty @Getter private String name; @Getter private final DateTime createdAt = new DateTime(); @Getter private final boolean featured; private CreateSavedQueryBuilder(String user, String query, String name, String description, boolean featured) { this.user = user; this.query = query; this.name = name; this.description = description; this.featured = featured; } public static CreateSavedQueryBuilder featured() { return new CreateSavedQueryBuilder(null, null, null, null, true); } public static CreateSavedQueryBuilder notFeatured() { return new CreateSavedQueryBuilder(null, null, null, null, false); } public CreateSavedQueryBuilder user(String user) { this.user = checkNotNull(user, "User can not be null"); return this; } public CreateSavedQueryBuilder query(String query) { this.query = checkNotNull(query, "Query can not be null"); return this; } public CreateSavedQueryBuilder name(String name) { this.name = checkNotNull(name, "Name can not be null"); return this; } public CreateSavedQueryBuilder description(String description) { this.description = checkNotNull(description, "Description can not be null"); return this; } public SavedQuery build() { checkNotNull(user, "User can not be null"); checkNotNull(query, "Query can not be null"); checkNotNull(name, "Name can not be null"); checkNotNull(description, "Description can not be null"); final FeaturedQuery.QueryWithPlaceholders queryWithPlaceholders = checkNotNull(FeaturedQuery.QueryWithPlaceholders.fromQuery(getQuery()), "Generated query can not be null"); if (isFeatured()) { return new FeaturedQuery(queryWithPlaceholders, getUser(), getName(), getDescription(), getCreatedAt(), UUID.randomUUID(), true); } else { return new UserSavedQuery(queryWithPlaceholders, getUser(), getName(), getDescription(), getCreatedAt(), UUID.randomUUID(), false); } } }