Hide model validation methods in API docs

This commit is contained in:
Jon Chambers 2025-06-06 12:03:54 -04:00 committed by Jon Chambers
parent 1a7a446150
commit ca6e5fb0a8
10 changed files with 16 additions and 0 deletions

View File

@ -5,6 +5,7 @@
package org.whispersystems.textsecuregcm.configuration; package org.whispersystems.textsecuregcm.configuration;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
@ -57,6 +58,7 @@ public record CloudflareTurnConfiguration(@NotNull SecretString apiToken,
} }
@AssertTrue @AssertTrue
@Schema(hidden = true)
public boolean isClientTtlShorterThanRequestedTtl() { public boolean isClientTtlShorterThanRequestedTtl() {
return clientCredentialTtl.compareTo(requestedCredentialTtl) <= 0; return clientCredentialTtl.compareTo(requestedCredentialTtl) <= 0;
} }

View File

@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Size;
import java.util.Optional; import java.util.Optional;
@ -137,6 +138,7 @@ public class AccountAttributes {
} }
@AssertTrue @AssertTrue
@Schema(hidden = true)
public boolean isEachRegistrationIdValid() { public boolean isEachRegistrationIdValid() {
return validRegistrationId(registrationId) && validRegistrationId(phoneNumberIdentityRegistrationId); return validRegistrationId(registrationId) && validRegistrationId(phoneNumberIdentityRegistrationId);
} }

View File

@ -76,6 +76,7 @@ public record ChangeNumberRequest(
} }
@AssertTrue @AssertTrue
@Schema(hidden = true)
public boolean isEachPniRegistrationIdValid() { public boolean isEachPniRegistrationIdValid() {
return pniRegistrationIds == null || pniRegistrationIds.values().stream().allMatch(RegistrationIdValidator::validRegistrationId); return pniRegistrationIds == null || pniRegistrationIds.values().stream().allMatch(RegistrationIdValidator::validRegistrationId);
} }

View File

@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import com.webauthn4j.converter.jackson.deserializer.json.ByteArrayBase64Deserializer; import com.webauthn4j.converter.jackson.deserializer.json.ByteArrayBase64Deserializer;
import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.Metrics;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.AssertTrue;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@ -69,6 +70,7 @@ public record IncomingMessage(int type,
} }
@AssertTrue @AssertTrue
@Schema(hidden = true)
public boolean isValidEnvelopeType() { public boolean isValidEnvelopeType() {
if (type() == MessageProtos.Envelope.Type.SERVER_DELIVERY_RECEIPT_VALUE || if (type() == MessageProtos.Envelope.Type.SERVER_DELIVERY_RECEIPT_VALUE ||
MessageProtos.Envelope.Type.forNumber(type()) == null) { MessageProtos.Envelope.Type.forNumber(type()) == null) {

View File

@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.Metrics;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Max;
@ -46,6 +47,7 @@ public record IncomingMessageList(@NotNull
} }
@AssertTrue @AssertTrue
@Schema(hidden = true)
public boolean hasNoDuplicateRecipients() { public boolean hasNoDuplicateRecipients() {
final boolean valid = messages.stream() final boolean valid = messages.stream()
.filter(Objects::nonNull) .filter(Objects::nonNull)

View File

@ -54,6 +54,7 @@ public record KeyTransparencySearchRequest(
@Positive long distinguishedTreeHeadSize @Positive long distinguishedTreeHeadSize
) { ) {
@AssertTrue @AssertTrue
@Schema(hidden = true)
public boolean isUnidentifiedAccessKeyProvidedWithE164() { public boolean isUnidentifiedAccessKeyProvidedWithE164() {
return unidentifiedAccessKey.isPresent() == e164.isPresent(); return unidentifiedAccessKey.isPresent() == e164.isPresent();
} }

View File

@ -42,6 +42,7 @@ public record LinkDeviceRequest(@Schema(requiredMode = Schema.RequiredMode.REQUI
} }
@AssertTrue @AssertTrue
@Schema(hidden = true)
public boolean hasExactlyOneMessageDeliveryChannel() { public boolean hasExactlyOneMessageDeliveryChannel() {
if (accountAttributes.getFetchesMessages()) { if (accountAttributes.getFetchesMessages()) {
return deviceActivationRequest().apnToken().isEmpty() && deviceActivationRequest().gcmToken().isEmpty(); return deviceActivationRequest().apnToken().isEmpty() && deviceActivationRequest().gcmToken().isEmpty();

View File

@ -7,6 +7,7 @@ package org.whispersystems.textsecuregcm.entities;
import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.StringUtils.isNotBlank;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.AssertTrue;
import jakarta.ws.rs.ClientErrorException; import jakarta.ws.rs.ClientErrorException;
import java.util.Base64; import java.util.Base64;
@ -25,6 +26,7 @@ public interface PhoneVerificationRequest {
// for the @AssertTrue to work with bean validation, method name must follow 'isSmth()'/'getSmth()' naming convention // for the @AssertTrue to work with bean validation, method name must follow 'isSmth()'/'getSmth()' naming convention
@AssertTrue @AssertTrue
@Schema(hidden = true)
default boolean isValid() { default boolean isValid() {
// checking that exactly one of sessionId/recoveryPassword is non-empty // checking that exactly one of sessionId/recoveryPassword is non-empty
return isNotBlank(sessionId()) ^ (recoveryPassword() != null && recoveryPassword().length > 0); return isNotBlank(sessionId()) ^ (recoveryPassword() != null && recoveryPassword().length > 0);

View File

@ -111,6 +111,7 @@ public record RegistrationRequest(@Schema(requiredMode = Schema.RequiredMode.NOT
@VisibleForTesting @VisibleForTesting
@AssertTrue @AssertTrue
@Schema(hidden = true)
boolean hasExactlyOneMessageDeliveryChannel() { boolean hasExactlyOneMessageDeliveryChannel() {
if (accountAttributes.getFetchesMessages()) { if (accountAttributes.getFetchesMessages()) {
return deviceActivationRequest().apnToken().isEmpty() && deviceActivationRequest().gcmToken().isEmpty(); return deviceActivationRequest().apnToken().isEmpty() && deviceActivationRequest().gcmToken().isEmpty();

View File

@ -5,6 +5,7 @@
package org.whispersystems.textsecuregcm.limits; package org.whispersystems.textsecuregcm.limits;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.AssertTrue;
import java.time.Duration; import java.time.Duration;
@ -15,6 +16,7 @@ public record RateLimiterConfig(int bucketSize, Duration permitRegenerationDurat
} }
@AssertTrue @AssertTrue
@Schema(hidden = true)
public boolean hasPositiveRegenerationRate() { public boolean hasPositiveRegenerationRate() {
try { try {
return permitRegenerationDuration.toNanos() > 0; return permitRegenerationDuration.toNanos() > 0;