package keywhiz.api.automation.v2; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.auto.value.AutoValue; import com.google.common.base.MoreObjects; import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; import javax.annotation.Nullable; import java.util.Base64; import java.util.Map; /** * A request to update a secret which explicitly indicates which of its fields are * to be considered valid */ @AutoValue public abstract class PartialUpdateSecretRequestV2 { PartialUpdateSecretRequestV2() {} // prevent sub-classing public static Builder builder() { return new AutoValue_PartialUpdateSecretRequestV2.Builder() .contentPresent(false) .content("") .descriptionPresent(false) .description("") .metadataPresent(false) .metadata(ImmutableMap.of()) .expiryPresent(false) .expiry(0L) .typePresent(false) .type(""); } @AutoValue.Builder public abstract static class Builder { // intended to be package-private abstract boolean contentPresent(); abstract String content(); abstract PartialUpdateSecretRequestV2 autoBuild(); public abstract Builder contentPresent(boolean contentPresent); public abstract Builder content(String content); public abstract Builder descriptionPresent(boolean descriptionPresent); public abstract Builder description(String description); public abstract Builder metadataPresent(boolean metadataPresent); public abstract Builder metadata(ImmutableMap<String, String> metadata); public abstract Builder typePresent(boolean typePresent); public abstract Builder type(String type); public abstract Builder expiryPresent(boolean expiryPresent); public abstract Builder expiry(Long expiry); /** * @throws IllegalArgumentException if builder data is invalid. */ public PartialUpdateSecretRequestV2 build() { if (contentPresent()) { // throws IllegalArgumentException if content not valid base64. Base64.getDecoder().decode(content()); } return autoBuild(); } } /** * Static factory method used by Jackson for deserialization */ @SuppressWarnings("unused") @JsonCreator public static PartialUpdateSecretRequestV2 fromParts( @JsonProperty("contentPresent") boolean contentPresent, @JsonProperty("content") @Nullable String content, @JsonProperty("descriptionPresent") boolean descriptionPresent, @JsonProperty("description") @Nullable String description, @JsonProperty("metadataPresent") boolean metadataPresent, @JsonProperty("metadata") @Nullable Map<String, String> metadata, @JsonProperty("expiryPresent") boolean expiryPresent, @JsonProperty("expiry") @Nullable Long expiry, @JsonProperty("typePresent") boolean typePresent, @JsonProperty("type") @Nullable String type) { return builder() .contentPresent(contentPresent) .content(Strings.nullToEmpty(content)) .descriptionPresent(descriptionPresent) .description(Strings.nullToEmpty(description)) .metadataPresent(metadataPresent) .metadata(metadata == null ? ImmutableMap.of() : ImmutableMap.copyOf(metadata)) .expiryPresent(expiryPresent) .expiry(expiry == null ? Long.valueOf(0) : expiry) .typePresent(typePresent) .type(Strings.nullToEmpty(type)) .build(); } @JsonProperty("contentPresent") public abstract boolean contentPresent(); @JsonProperty("content") public abstract String content(); @JsonProperty("descriptionPresent") public abstract boolean descriptionPresent(); @JsonProperty("description") public abstract String description(); @JsonProperty("metadataPresent") public abstract boolean metadataPresent(); @JsonProperty("metadata") public abstract ImmutableMap<String, String> metadata(); @JsonProperty("expiryPresent") public abstract boolean expiryPresent(); @JsonProperty("expiry") public abstract Long expiry(); @JsonProperty("typePresent") public abstract boolean typePresent(); @JsonProperty("type") public abstract String type(); @Override public final String toString() { return MoreObjects.toStringHelper(this) .add("content", "[REDACTED]") .add("description", description()) .add("metadata", metadata()) .add("expiry", expiry()) .add("type", type()) .omitNullValues() .toString(); } }