From d271a2db3d5280208fbe9768388b25904cf991ec Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Mon, 2 Mar 2026 00:26:18 +0100 Subject: [PATCH 01/22] Add OpenAPIDocs --- README.md | 13 +++++ build.gradle.kts | 9 ++++ gradle/libs.versions.toml | 4 ++ .../signal/json/JsonOpenApiController.java | 21 ++++++++ .../asamk/signal/json/JsonSchemaCatalog.java | 53 +++++++++++++++++++ .../OpenApiDocumentationApplication.java | 26 +++++++++ 6 files changed, 126 insertions(+) create mode 100644 src/main/java/org/asamk/signal/json/JsonOpenApiController.java create mode 100644 src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java create mode 100644 src/main/java/org/asamk/signal/openapi/OpenApiDocumentationApplication.java diff --git a/README.md b/README.md index 1d192bb3..43387d1d 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,19 @@ version installed, you can replace `./gradlew` with `gradle` in the following st ./gradlew run --args="--help" ``` +### Documentation + +1. Run OpenAPI documentation server for JSON models (`src/main/java/org/asamk/signal/json`): + + ```sh + ./gradlew openApiDocs + ``` + +2. Open: + + - `http://localhost:8080/swagger-ui/index.html` (Swagger UI) + - `http://localhost:8080/v3/api-docs/json-models` (OpenAPI JSON) + ### Building a native binary with GraalVM (EXPERIMENTAL) It is possible to build a native binary with [GraalVM](https://www.graalvm.org). This is still experimental and will not diff --git a/build.gradle.kts b/build.gradle.kts index d8e36ea4..09d6f597 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -90,6 +90,8 @@ dependencies { implementation(libs.slf4j.jul) implementation(libs.logback) implementation(libs.zxing) + implementation(libs.spring.boot.starter.web) + implementation(libs.springdoc.openapi.starter.webmvc.ui) implementation(project(":libsignal-cli")) } @@ -138,3 +140,10 @@ tasks.register("fatJar", type = Jar::class) { } with(tasks.jar.get()) } + +tasks.register("openApiDocs") { + group = "application" + description = "Run OpenAPI documentation server for JSON models" + classpath = sourceSets["main"].runtimeClasspath + mainClass.set("org.asamk.signal.openapi.OpenApiDocumentationApplication") +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3df9835e..cb99bbc8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,8 @@ [versions] slf4j = "2.0.17" junit = "6.0.2" +spring-boot = "3.5.0" +springdoc = "2.8.13" [libraries] bouncycastle = "org.bouncycastle:bcprov-jdk18on:1.83" @@ -8,6 +10,8 @@ jackson-databind = "com.fasterxml.jackson.core:jackson-databind:2.20.2" argparse4j = "net.sourceforge.argparse4j:argparse4j:0.9.0" dbusjava = "com.github.hypfvieh:dbus-java-transport-native-unixsocket:5.0.0" zxing = "com.google.zxing:core:3.5.4" +spring-boot-starter-web = { module = "org.springframework.boot:spring-boot-starter-web", version.ref = "spring-boot" } +springdoc-openapi-starter-webmvc-ui = { module = "org.springdoc:springdoc-openapi-starter-webmvc-ui", version.ref = "springdoc" } slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } slf4j-jul = { module = "org.slf4j:jul-to-slf4j", version.ref = "slf4j" } logback = "ch.qos.logback:logback-classic:1.5.32" diff --git a/src/main/java/org/asamk/signal/json/JsonOpenApiController.java b/src/main/java/org/asamk/signal/json/JsonOpenApiController.java new file mode 100644 index 00000000..9b8a6565 --- /dev/null +++ b/src/main/java/org/asamk/signal/json/JsonOpenApiController.java @@ -0,0 +1,21 @@ +package org.asamk.signal.json; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/openapi/json") +class JsonOpenApiController { + + @GetMapping("/models") + @Operation(summary = "Signal JSON model schema catalog") + @ApiResponse(responseCode = "200", description = "Catalog of Signal JSON model schemas", content = @Content(mediaType = "application/json", schema = @Schema(implementation = JsonSchemaCatalog.class))) + JsonSchemaCatalog getModels() { + return new JsonSchemaCatalog(); + } +} diff --git a/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java b/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java new file mode 100644 index 00000000..1ff4d141 --- /dev/null +++ b/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java @@ -0,0 +1,53 @@ +package org.asamk.signal.json; + +import java.util.List; + +public class JsonSchemaCatalog { + + public JsonAdminDelete adminDelete; + public JsonAttachment attachment; + public JsonAttachmentData attachmentData; + public JsonCallMessage callMessage; + public JsonContact contact; + public JsonContactAddress contactAddress; + public JsonContactAvatar contactAvatar; + public JsonContactEmail contactEmail; + public JsonContactName contactName; + public JsonContactPhone contactPhone; + public JsonDataMessage dataMessage; + public JsonEditMessage editMessage; + public JsonError error; + public JsonGroupInfo groupInfo; + public JsonMention mention; + public JsonMessageEnvelope messageEnvelope; + public JsonPayment payment; + public JsonPinMessage pinMessage; + public JsonPollCreate pollCreate; + public JsonPollTerminate pollTerminate; + public JsonPollVote pollVote; + public JsonPreview preview; + public JsonQuote quote; + public JsonQuotedAttachment quotedAttachment; + public JsonReaction reaction; + public JsonReceiptMessage receiptMessage; + public JsonRecipientAddress recipientAddress; + public JsonRemoteDelete remoteDelete; + public JsonSendMessageResult sendMessageResult; + public JsonSharedContact sharedContact; + public JsonSticker sticker; + public JsonStoryContext storyContext; + public JsonStoryMessage storyMessage; + public JsonSyncDataMessage syncDataMessage; + public JsonSyncMessage syncMessage; + public JsonSyncReadMessage syncReadMessage; + public JsonSyncStoryMessage syncStoryMessage; + public JsonTextStyle textStyle; + public JsonTypingMessage typingMessage; + public JsonUnpinMessage unpinMessage; + + public List attachments; + public List mentions; + public List previews; + public List contacts; + public List textStyles; +} diff --git a/src/main/java/org/asamk/signal/openapi/OpenApiDocumentationApplication.java b/src/main/java/org/asamk/signal/openapi/OpenApiDocumentationApplication.java new file mode 100644 index 00000000..74dfb164 --- /dev/null +++ b/src/main/java/org/asamk/signal/openapi/OpenApiDocumentationApplication.java @@ -0,0 +1,26 @@ +package org.asamk.signal.openapi; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.info.Info; +import org.springdoc.core.models.GroupedOpenApi; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +@SpringBootApplication(scanBasePackages = "org.asamk.signal") +@OpenAPIDefinition(info = @Info(title = "signal-cli JSON Models", version = "v1")) +public class OpenApiDocumentationApplication { + + public static void main(String[] args) { + SpringApplication.run(OpenApiDocumentationApplication.class, args); + } + + @Bean + GroupedOpenApi jsonModelsOpenApi() { + return GroupedOpenApi.builder() + .group("json-models") + .packagesToScan("org.asamk.signal.json") + .pathsToMatch("/openapi/json/models") + .build(); + } +} From a65c228c9b66b54093b5f7dd9f3b43ca18cad4ba Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Mon, 2 Mar 2026 00:30:12 +0100 Subject: [PATCH 02/22] Remove the json prefix from the names --- src/main/java/org/asamk/signal/json/JsonAdminDelete.java | 2 ++ src/main/java/org/asamk/signal/json/JsonAttachment.java | 2 ++ src/main/java/org/asamk/signal/json/JsonAttachmentData.java | 3 +++ src/main/java/org/asamk/signal/json/JsonCallMessage.java | 2 ++ src/main/java/org/asamk/signal/json/JsonContact.java | 4 ++++ src/main/java/org/asamk/signal/json/JsonContactAddress.java | 2 ++ src/main/java/org/asamk/signal/json/JsonContactAvatar.java | 2 ++ src/main/java/org/asamk/signal/json/JsonContactEmail.java | 2 ++ src/main/java/org/asamk/signal/json/JsonContactName.java | 2 ++ src/main/java/org/asamk/signal/json/JsonContactPhone.java | 2 ++ src/main/java/org/asamk/signal/json/JsonDataMessage.java | 2 ++ src/main/java/org/asamk/signal/json/JsonEditMessage.java | 2 ++ src/main/java/org/asamk/signal/json/JsonError.java | 3 +++ src/main/java/org/asamk/signal/json/JsonGroupInfo.java | 2 ++ src/main/java/org/asamk/signal/json/JsonMention.java | 2 ++ src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java | 2 ++ src/main/java/org/asamk/signal/json/JsonPayment.java | 2 ++ src/main/java/org/asamk/signal/json/JsonPinMessage.java | 2 ++ src/main/java/org/asamk/signal/json/JsonPollCreate.java | 2 ++ src/main/java/org/asamk/signal/json/JsonPollTerminate.java | 2 ++ src/main/java/org/asamk/signal/json/JsonPollVote.java | 2 ++ src/main/java/org/asamk/signal/json/JsonPreview.java | 2 ++ src/main/java/org/asamk/signal/json/JsonQuote.java | 2 ++ src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java | 2 ++ src/main/java/org/asamk/signal/json/JsonReaction.java | 2 ++ src/main/java/org/asamk/signal/json/JsonReceiptMessage.java | 2 ++ src/main/java/org/asamk/signal/json/JsonRecipientAddress.java | 2 ++ src/main/java/org/asamk/signal/json/JsonRemoteDelete.java | 3 +++ src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java | 2 ++ .../java/org/asamk/signal/json/JsonSendMessageResult.java | 2 ++ src/main/java/org/asamk/signal/json/JsonSharedContact.java | 2 ++ src/main/java/org/asamk/signal/json/JsonSticker.java | 2 ++ src/main/java/org/asamk/signal/json/JsonStoryContext.java | 2 ++ src/main/java/org/asamk/signal/json/JsonStoryMessage.java | 2 ++ src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java | 2 ++ src/main/java/org/asamk/signal/json/JsonSyncMessage.java | 3 +++ src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java | 2 ++ src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java | 2 ++ src/main/java/org/asamk/signal/json/JsonTextStyle.java | 2 ++ src/main/java/org/asamk/signal/json/JsonTypingMessage.java | 2 ++ src/main/java/org/asamk/signal/json/JsonUnpinMessage.java | 2 ++ 41 files changed, 88 insertions(+) diff --git a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java index 60ab45bd..af95b231 100644 --- a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java +++ b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; +@Schema(name = "AdminDelete") public record JsonAdminDelete( @Deprecated String targetAuthor, String targetAuthorNumber, String targetAuthorUuid, long targetSentTimestamp ) { diff --git a/src/main/java/org/asamk/signal/json/JsonAttachment.java b/src/main/java/org/asamk/signal/json/JsonAttachment.java index c75b3987..8ff72712 100644 --- a/src/main/java/org/asamk/signal/json/JsonAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachment.java @@ -1,7 +1,9 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; +@Schema(name = "Attachment") record JsonAttachment( String contentType, String filename, diff --git a/src/main/java/org/asamk/signal/json/JsonAttachmentData.java b/src/main/java/org/asamk/signal/json/JsonAttachmentData.java index 05a90c21..ba76dec7 100644 --- a/src/main/java/org/asamk/signal/json/JsonAttachmentData.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachmentData.java @@ -1,5 +1,8 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(name = "AttachmentData") public record JsonAttachmentData( String data ) {} diff --git a/src/main/java/org/asamk/signal/json/JsonCallMessage.java b/src/main/java/org/asamk/signal/json/JsonCallMessage.java index 1b1bc2ba..bf11917c 100644 --- a/src/main/java/org/asamk/signal/json/JsonCallMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonCallMessage.java @@ -1,12 +1,14 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.Base64; import java.util.List; +@Schema(name = "CallMessage") record JsonCallMessage( @JsonInclude(JsonInclude.Include.NON_NULL) Offer offerMessage, @JsonInclude(JsonInclude.Include.NON_NULL) Answer answerMessage, diff --git a/src/main/java/org/asamk/signal/json/JsonContact.java b/src/main/java/org/asamk/signal/json/JsonContact.java index 71f05c8d..e302eaaf 100644 --- a/src/main/java/org/asamk/signal/json/JsonContact.java +++ b/src/main/java/org/asamk/signal/json/JsonContact.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; +@Schema(name = "Contact") public record JsonContact( String number, String uuid, @@ -25,6 +27,7 @@ public record JsonContact( @JsonInclude(JsonInclude.Include.NON_NULL) JsonInternal internal ) { + @Schema(name = "Profile") public record JsonProfile( long lastUpdateTimestamp, String givenName, @@ -35,6 +38,7 @@ public record JsonContact( String mobileCoinAddress ) {} + @Schema(name = "Internal") public record JsonInternal( List capabilities, String unidentifiedAccessMode, diff --git a/src/main/java/org/asamk/signal/json/JsonContactAddress.java b/src/main/java/org/asamk/signal/json/JsonContactAddress.java index 7184f532..7f9c8587 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactAddress.java +++ b/src/main/java/org/asamk/signal/json/JsonContactAddress.java @@ -1,8 +1,10 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Util; +@Schema(name = "ContactAddress") public record JsonContactAddress( String type, String label, diff --git a/src/main/java/org/asamk/signal/json/JsonContactAvatar.java b/src/main/java/org/asamk/signal/json/JsonContactAvatar.java index 56b1a4e3..c4a28721 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactAvatar.java +++ b/src/main/java/org/asamk/signal/json/JsonContactAvatar.java @@ -1,7 +1,9 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; +@Schema(name = "ContactAvatar") public record JsonContactAvatar(JsonAttachment attachment, boolean isProfile) { static JsonContactAvatar from(MessageEnvelope.Data.SharedContact.Avatar avatar) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactEmail.java b/src/main/java/org/asamk/signal/json/JsonContactEmail.java index 7db600db..58be643f 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactEmail.java +++ b/src/main/java/org/asamk/signal/json/JsonContactEmail.java @@ -1,8 +1,10 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Util; +@Schema(name = "ContactEmail") public record JsonContactEmail(String value, String type, String label) { static JsonContactEmail from(MessageEnvelope.Data.SharedContact.Email email) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactName.java b/src/main/java/org/asamk/signal/json/JsonContactName.java index 4d8c2327..71aa0a73 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactName.java +++ b/src/main/java/org/asamk/signal/json/JsonContactName.java @@ -1,8 +1,10 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Util; +@Schema(name = "ContactName") public record JsonContactName( String nickname, String given, String family, String prefix, String suffix, String middle ) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactPhone.java b/src/main/java/org/asamk/signal/json/JsonContactPhone.java index 5da482ff..ad726bcd 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactPhone.java +++ b/src/main/java/org/asamk/signal/json/JsonContactPhone.java @@ -1,8 +1,10 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Util; +@Schema(name = "ContactPhone") public record JsonContactPhone(String value, String type, String label) { static JsonContactPhone from(MessageEnvelope.Data.SharedContact.Phone phone) { diff --git a/src/main/java/org/asamk/signal/json/JsonDataMessage.java b/src/main/java/org/asamk/signal/json/JsonDataMessage.java index 44f7f936..ec8265cb 100644 --- a/src/main/java/org/asamk/signal/json/JsonDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonDataMessage.java @@ -1,12 +1,14 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; +@Schema(name = "DataMessage") record JsonDataMessage( long timestamp, String message, diff --git a/src/main/java/org/asamk/signal/json/JsonEditMessage.java b/src/main/java/org/asamk/signal/json/JsonEditMessage.java index ef61e343..fb31d4ba 100644 --- a/src/main/java/org/asamk/signal/json/JsonEditMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonEditMessage.java @@ -1,8 +1,10 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; +@Schema(name = "EditMessage") record JsonEditMessage(long targetSentTimestamp, JsonDataMessage dataMessage) { static JsonEditMessage from(MessageEnvelope.Edit editMessage, Manager m) { diff --git a/src/main/java/org/asamk/signal/json/JsonError.java b/src/main/java/org/asamk/signal/json/JsonError.java index 07f8a431..d6ab7b2d 100644 --- a/src/main/java/org/asamk/signal/json/JsonError.java +++ b/src/main/java/org/asamk/signal/json/JsonError.java @@ -1,5 +1,8 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(name = "Error") public record JsonError(String message, String type) { public static JsonError from(Throwable exception) { diff --git a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java index c370d1e2..0296f274 100644 --- a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java +++ b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java @@ -1,8 +1,10 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; +@Schema(name = "GroupInfo") record JsonGroupInfo(String groupId, String groupName, int revision, String type) { static JsonGroupInfo from(MessageEnvelope.Data.GroupContext groupContext, Manager m) { diff --git a/src/main/java/org/asamk/signal/json/JsonMention.java b/src/main/java/org/asamk/signal/json/JsonMention.java index c4c962a0..70728523 100644 --- a/src/main/java/org/asamk/signal/json/JsonMention.java +++ b/src/main/java/org/asamk/signal/json/JsonMention.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; +@Schema(name = "Mention") public record JsonMention(@Deprecated String name, String number, String uuid, int start, int length) { static JsonMention from(MessageEnvelope.Data.Mention mention) { diff --git a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java index 8ab8ea83..857c7fad 100644 --- a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -1,6 +1,7 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; @@ -10,6 +11,7 @@ import org.asamk.signal.manager.api.UntrustedIdentityException; import java.util.UUID; +@Schema(name = "MessageEnvelope") public record JsonMessageEnvelope( @Deprecated String source, String sourceNumber, diff --git a/src/main/java/org/asamk/signal/json/JsonPayment.java b/src/main/java/org/asamk/signal/json/JsonPayment.java index d3e5c483..957df083 100644 --- a/src/main/java/org/asamk/signal/json/JsonPayment.java +++ b/src/main/java/org/asamk/signal/json/JsonPayment.java @@ -1,7 +1,9 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; +@Schema(name = "Payment") public record JsonPayment(String note, byte[] receipt) { static JsonPayment from(MessageEnvelope.Data.Payment payment) { diff --git a/src/main/java/org/asamk/signal/json/JsonPinMessage.java b/src/main/java/org/asamk/signal/json/JsonPinMessage.java index 137805af..419b4fda 100644 --- a/src/main/java/org/asamk/signal/json/JsonPinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonPinMessage.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; +@Schema(name = "PinMessage") public record JsonPinMessage( @Deprecated String targetAuthor, String targetAuthorNumber, diff --git a/src/main/java/org/asamk/signal/json/JsonPollCreate.java b/src/main/java/org/asamk/signal/json/JsonPollCreate.java index 2c36c4ca..335a8d17 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollCreate.java +++ b/src/main/java/org/asamk/signal/json/JsonPollCreate.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; +@Schema(name = "PollCreate") public record JsonPollCreate( String question, boolean allowMultiple, List options ) { diff --git a/src/main/java/org/asamk/signal/json/JsonPollTerminate.java b/src/main/java/org/asamk/signal/json/JsonPollTerminate.java index 0642559f..eb3483ee 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollTerminate.java +++ b/src/main/java/org/asamk/signal/json/JsonPollTerminate.java @@ -1,7 +1,9 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; +@Schema(name = "PollTerminate") public record JsonPollTerminate(long targetSentTimestamp) { static JsonPollTerminate from(MessageEnvelope.Data.PollTerminate pollTerminate) { diff --git a/src/main/java/org/asamk/signal/json/JsonPollVote.java b/src/main/java/org/asamk/signal/json/JsonPollVote.java index 520a838e..aab9e47c 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollVote.java +++ b/src/main/java/org/asamk/signal/json/JsonPollVote.java @@ -1,10 +1,12 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; import java.util.UUID; +@Schema(name = "PollVote") public record JsonPollVote( @Deprecated String author, String authorNumber, diff --git a/src/main/java/org/asamk/signal/json/JsonPreview.java b/src/main/java/org/asamk/signal/json/JsonPreview.java index c5e0d49e..03467b20 100644 --- a/src/main/java/org/asamk/signal/json/JsonPreview.java +++ b/src/main/java/org/asamk/signal/json/JsonPreview.java @@ -1,7 +1,9 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; +@Schema(name = "Preview") public record JsonPreview(String url, String title, String description, JsonAttachment image) { static JsonPreview from(MessageEnvelope.Data.Preview preview) { diff --git a/src/main/java/org/asamk/signal/json/JsonQuote.java b/src/main/java/org/asamk/signal/json/JsonQuote.java index 514f3db9..5e62de6f 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuote.java +++ b/src/main/java/org/asamk/signal/json/JsonQuote.java @@ -1,12 +1,14 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; import java.util.UUID; +@Schema(name = "Quote") public record JsonQuote( long id, @Deprecated String author, diff --git a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java index e5022798..29373e19 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; +@Schema(name = "QuotedAttachment") public record JsonQuotedAttachment( String contentType, String filename, @JsonInclude(JsonInclude.Include.NON_NULL) JsonAttachment thumbnail ) { diff --git a/src/main/java/org/asamk/signal/json/JsonReaction.java b/src/main/java/org/asamk/signal/json/JsonReaction.java index 71da4df5..2c5ea996 100644 --- a/src/main/java/org/asamk/signal/json/JsonReaction.java +++ b/src/main/java/org/asamk/signal/json/JsonReaction.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; +@Schema(name = "Reaction") public record JsonReaction( String emoji, @Deprecated String targetAuthor, diff --git a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java index ec61b2f1..30c05ad3 100644 --- a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; +@Schema(name = "ReceiptMessage") record JsonReceiptMessage(long when, boolean isDelivery, boolean isRead, boolean isViewed, List timestamps) { static JsonReceiptMessage from(MessageEnvelope.Receipt receiptMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java b/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java index 0d9fc8cd..5533a767 100644 --- a/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java +++ b/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.RecipientAddress; import java.util.UUID; +@Schema(name = "RecipientAddress") public record JsonRecipientAddress(String uuid, String number, String username) { public static JsonRecipientAddress from(RecipientAddress address) { diff --git a/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java b/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java index 5a5727e5..270d8354 100644 --- a/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java +++ b/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java @@ -1,3 +1,6 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(name = "RemoteDelete") record JsonRemoteDelete(long timestamp) {} diff --git a/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java b/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java index 1ff4d141..a2ecace5 100644 --- a/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java +++ b/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java @@ -1,7 +1,9 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; +@Schema(name = "SchemaCatalog") public class JsonSchemaCatalog { public JsonAdminDelete adminDelete; diff --git a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java index f9ca8f86..e1c4e1d5 100644 --- a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java +++ b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java @@ -1,10 +1,12 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.GroupId; import org.asamk.signal.manager.api.SendMessageResult; +@Schema(name = "SendMessageResult") public record JsonSendMessageResult( JsonRecipientAddress recipientAddress, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId, diff --git a/src/main/java/org/asamk/signal/json/JsonSharedContact.java b/src/main/java/org/asamk/signal/json/JsonSharedContact.java index d898c63f..c58e2b93 100644 --- a/src/main/java/org/asamk/signal/json/JsonSharedContact.java +++ b/src/main/java/org/asamk/signal/json/JsonSharedContact.java @@ -1,11 +1,13 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; +@Schema(name = "SharedContact") public record JsonSharedContact( JsonContactName name, @JsonInclude(JsonInclude.Include.NON_NULL) JsonContactAvatar avatar, diff --git a/src/main/java/org/asamk/signal/json/JsonSticker.java b/src/main/java/org/asamk/signal/json/JsonSticker.java index 720130ef..889855ac 100644 --- a/src/main/java/org/asamk/signal/json/JsonSticker.java +++ b/src/main/java/org/asamk/signal/json/JsonSticker.java @@ -1,8 +1,10 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Hex; +@Schema(name = "Sticker") public record JsonSticker(String packId, int stickerId) { static JsonSticker from(MessageEnvelope.Data.Sticker sticker) { diff --git a/src/main/java/org/asamk/signal/json/JsonStoryContext.java b/src/main/java/org/asamk/signal/json/JsonStoryContext.java index e2cc0c55..f5798093 100644 --- a/src/main/java/org/asamk/signal/json/JsonStoryContext.java +++ b/src/main/java/org/asamk/signal/json/JsonStoryContext.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; +@Schema(name = "StoryContext") record JsonStoryContext( String authorNumber, String authorUuid, long sentTimestamp ) { diff --git a/src/main/java/org/asamk/signal/json/JsonStoryMessage.java b/src/main/java/org/asamk/signal/json/JsonStoryMessage.java index c1ca6144..90e3e485 100644 --- a/src/main/java/org/asamk/signal/json/JsonStoryMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonStoryMessage.java @@ -1,6 +1,7 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.Color; import org.asamk.signal.manager.api.GroupId; @@ -8,6 +9,7 @@ import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; +@Schema(name = "StoryMessage") record JsonStoryMessage( boolean allowsReplies, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId, diff --git a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java index 4c2cd6ab..fd1a105d 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java @@ -2,6 +2,7 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonUnwrapped; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; @@ -9,6 +10,7 @@ import org.asamk.signal.manager.api.RecipientAddress; import java.util.UUID; +@Schema(name = "SyncDataMessage") record JsonSyncDataMessage( @Deprecated String destination, String destinationNumber, diff --git a/src/main/java/org/asamk/signal/json/JsonSyncMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncMessage.java index 072b2e3b..3447a526 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncMessage.java @@ -9,12 +9,15 @@ import org.asamk.signal.manager.api.RecipientAddress; import java.util.List; +import io.swagger.v3.oas.annotations.media.Schema; + enum JsonSyncMessageType { CONTACTS_SYNC, GROUPS_SYNC, REQUEST_SYNC } +@Schema(name = "SyncMessage") record JsonSyncMessage( @JsonInclude(JsonInclude.Include.NON_NULL) JsonSyncDataMessage sentMessage, @JsonInclude(JsonInclude.Include.NON_NULL) JsonSyncStoryMessage sentStoryMessage, diff --git a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java index 50c6ecee..a7bc41e3 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; +@Schema(name = "SyncReadMessage") record JsonSyncReadMessage( @Deprecated String sender, String senderNumber, String senderUuid, long timestamp ) { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java index 6b435223..4438c803 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java @@ -1,11 +1,13 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonUnwrapped; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; +@Schema(name = "SyncStoryMessage") record JsonSyncStoryMessage( String destinationNumber, String destinationUuid, @JsonUnwrapped JsonStoryMessage dataMessage ) { diff --git a/src/main/java/org/asamk/signal/json/JsonTextStyle.java b/src/main/java/org/asamk/signal/json/JsonTextStyle.java index 898e7db6..becd1b3c 100644 --- a/src/main/java/org/asamk/signal/json/JsonTextStyle.java +++ b/src/main/java/org/asamk/signal/json/JsonTextStyle.java @@ -1,7 +1,9 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.TextStyle; +@Schema(name = "TextStyle") public record JsonTextStyle(String style, int start, int length) { static JsonTextStyle from(TextStyle textStyle) { diff --git a/src/main/java/org/asamk/signal/json/JsonTypingMessage.java b/src/main/java/org/asamk/signal/json/JsonTypingMessage.java index 79a66d34..4680ae70 100644 --- a/src/main/java/org/asamk/signal/json/JsonTypingMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonTypingMessage.java @@ -1,10 +1,12 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.GroupId; import org.asamk.signal.manager.api.MessageEnvelope; +@Schema(name = "TypingMessage") record JsonTypingMessage( String action, long timestamp, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId ) { diff --git a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java index dad137c5..09936752 100644 --- a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; +import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; +@Schema(name = "UnpinMessage") public record JsonUnpinMessage( @Deprecated String targetAuthor, String targetAuthorNumber, String targetAuthorUuid, long targetSentTimestamp ) { From cab77e0c08de37d5e45cd30e112de365771ea75b Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Mon, 2 Mar 2026 00:51:51 +0100 Subject: [PATCH 03/22] Format file --- .../java/org/asamk/signal/json/JsonOpenApiController.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/asamk/signal/json/JsonOpenApiController.java b/src/main/java/org/asamk/signal/json/JsonOpenApiController.java index 9b8a6565..6c4cb84e 100644 --- a/src/main/java/org/asamk/signal/json/JsonOpenApiController.java +++ b/src/main/java/org/asamk/signal/json/JsonOpenApiController.java @@ -14,7 +14,13 @@ class JsonOpenApiController { @GetMapping("/models") @Operation(summary = "Signal JSON model schema catalog") - @ApiResponse(responseCode = "200", description = "Catalog of Signal JSON model schemas", content = @Content(mediaType = "application/json", schema = @Schema(implementation = JsonSchemaCatalog.class))) + @ApiResponse( + responseCode = "200", description = "Catalog of Signal JSON model schemas", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = JsonSchemaCatalog.class) + ) + ) JsonSchemaCatalog getModels() { return new JsonSchemaCatalog(); } From 9580ab077793dce0904f9ad57a3120018812bd72 Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Mon, 2 Mar 2026 01:13:56 +0100 Subject: [PATCH 04/22] Rename models to schemas --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 43387d1d..307e79d3 100644 --- a/README.md +++ b/README.md @@ -148,9 +148,9 @@ version installed, you can replace `./gradlew` with `gradle` in the following st ./gradlew run --args="--help" ``` -### Documentation +### JSON-RPC schemas -1. Run OpenAPI documentation server for JSON models (`src/main/java/org/asamk/signal/json`): +1. Run documentation server for all the JSON-RPC schemas (`src/main/java/org/asamk/signal/json`): ```sh ./gradlew openApiDocs From 04b7b1e47dd8bea6910754c016fd45b7c6c92d1a Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Mon, 2 Mar 2026 01:37:19 +0100 Subject: [PATCH 05/22] Add required = true to all the required attributes --- .../asamk/signal/json/JsonAdminDelete.java | 5 +++- .../org/asamk/signal/json/JsonAttachment.java | 16 ++++++------- .../asamk/signal/json/JsonCallMessage.java | 24 +++++++++++++++---- .../asamk/signal/json/JsonContactAddress.java | 18 +++++++------- .../asamk/signal/json/JsonContactAvatar.java | 5 +++- .../asamk/signal/json/JsonContactEmail.java | 6 ++++- .../asamk/signal/json/JsonContactName.java | 7 +++++- .../asamk/signal/json/JsonContactPhone.java | 6 ++++- .../asamk/signal/json/JsonDataMessage.java | 6 ++--- .../asamk/signal/json/JsonEditMessage.java | 5 +++- .../org/asamk/signal/json/JsonGroupInfo.java | 7 +++++- .../org/asamk/signal/json/JsonMention.java | 8 ++++++- .../org/asamk/signal/json/JsonPayment.java | 5 +++- .../org/asamk/signal/json/JsonPinMessage.java | 10 ++++---- .../org/asamk/signal/json/JsonPollCreate.java | 4 +++- .../asamk/signal/json/JsonPollTerminate.java | 2 +- .../org/asamk/signal/json/JsonPollVote.java | 12 +++++----- .../org/asamk/signal/json/JsonPreview.java | 7 +++++- .../java/org/asamk/signal/json/JsonQuote.java | 12 +++++----- .../signal/json/JsonQuotedAttachment.java | 4 +++- .../org/asamk/signal/json/JsonReaction.java | 12 +++++----- .../asamk/signal/json/JsonReceiptMessage.java | 8 ++++++- .../signal/json/JsonRecipientAddress.java | 6 ++++- .../asamk/signal/json/JsonRemoteDelete.java | 2 +- .../signal/json/JsonSendMessageResult.java | 4 ++-- .../asamk/signal/json/JsonSharedContact.java | 4 ++-- .../org/asamk/signal/json/JsonSticker.java | 5 +++- .../asamk/signal/json/JsonStoryContext.java | 4 +++- .../asamk/signal/json/JsonStoryMessage.java | 10 +++++--- .../signal/json/JsonSyncDataMessage.java | 8 +++---- .../signal/json/JsonSyncStoryMessage.java | 4 +++- .../org/asamk/signal/json/JsonTextStyle.java | 6 ++++- .../asamk/signal/json/JsonUnpinMessage.java | 5 +++- 33 files changed, 167 insertions(+), 80 deletions(-) diff --git a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java index af95b231..d0dc47c8 100644 --- a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java +++ b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java @@ -7,7 +7,10 @@ import java.util.UUID; @Schema(name = "AdminDelete") public record JsonAdminDelete( - @Deprecated String targetAuthor, String targetAuthorNumber, String targetAuthorUuid, long targetSentTimestamp + @Schema(required = true) @Deprecated String targetAuthor, + @Schema(required = true) String targetAuthorNumber, + @Schema(required = true) String targetAuthorUuid, + @Schema(required = true) long targetSentTimestamp ) { static JsonAdminDelete from(MessageEnvelope.Data.AdminDelete adminDelete) { diff --git a/src/main/java/org/asamk/signal/json/JsonAttachment.java b/src/main/java/org/asamk/signal/json/JsonAttachment.java index 8ff72712..c60d545b 100644 --- a/src/main/java/org/asamk/signal/json/JsonAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachment.java @@ -5,14 +5,14 @@ import org.asamk.signal.manager.api.MessageEnvelope; @Schema(name = "Attachment") record JsonAttachment( - String contentType, - String filename, - String id, - Long size, - Integer width, - Integer height, - String caption, - Long uploadTimestamp + @Schema(required = true) String contentType, + @Schema(required = true) String filename, + @Schema(required = true) String id, + @Schema(required = true) Long size, + @Schema(required = true) Integer width, + @Schema(required = true) Integer height, + @Schema(required = true) String caption, + @Schema(required = true) Long uploadTimestamp ) { static JsonAttachment from(MessageEnvelope.Data.Attachment attachment) { diff --git a/src/main/java/org/asamk/signal/json/JsonCallMessage.java b/src/main/java/org/asamk/signal/json/JsonCallMessage.java index bf11917c..a76478e2 100644 --- a/src/main/java/org/asamk/signal/json/JsonCallMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonCallMessage.java @@ -25,35 +25,49 @@ record JsonCallMessage( callMessage.iceUpdate().stream().map(IceUpdate::from).toList()); } - record Offer(long id, String type, String opaque) { + record Offer( + @Schema(required = true) long id, + @Schema(required = true) String type, + @Schema(required = true) String opaque + ) { public static Offer from(final MessageEnvelope.Call.Offer offer) { return new Offer(offer.id(), offer.type().name(), Base64.getEncoder().encodeToString(offer.opaque())); } } - public record Answer(long id, String opaque) { + public record Answer( + @Schema(required = true) long id, + @Schema(required = true) String opaque + ) { public static Answer from(final MessageEnvelope.Call.Answer answer) { return new Answer(answer.id(), Base64.getEncoder().encodeToString(answer.opaque())); } } - public record Busy(long id) { + public record Busy(@Schema(required = true) long id) { public static Busy from(final MessageEnvelope.Call.Busy busy) { return new Busy(busy.id()); } } - public record Hangup(long id, String type, int deviceId) { + public record Hangup( + @Schema(required = true) long id, + @Schema(required = true) String type, + @Schema(required = true) int deviceId + ) { public static Hangup from(final MessageEnvelope.Call.Hangup hangup) { return new Hangup(hangup.id(), hangup.type().name(), hangup.deviceId()); } } - public record IceUpdate(long id, String opaque) { + public record IceUpdate( + @Schema(required = true) long id, + @Schema(required = true) String opaque + ) { public static IceUpdate from(final MessageEnvelope.Call.IceUpdate iceUpdate) { return new IceUpdate(iceUpdate.id(), Base64.getEncoder().encodeToString(iceUpdate.opaque())); diff --git a/src/main/java/org/asamk/signal/json/JsonContactAddress.java b/src/main/java/org/asamk/signal/json/JsonContactAddress.java index 7f9c8587..935ed816 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactAddress.java +++ b/src/main/java/org/asamk/signal/json/JsonContactAddress.java @@ -6,15 +6,15 @@ import org.asamk.signal.util.Util; @Schema(name = "ContactAddress") public record JsonContactAddress( - String type, - String label, - String street, - String pobox, - String neighborhood, - String city, - String region, - String postcode, - String country + @Schema(required = true) String type, + @Schema(required = true) String label, + @Schema(required = true) String street, + @Schema(required = true) String pobox, + @Schema(required = true) String neighborhood, + @Schema(required = true) String city, + @Schema(required = true) String region, + @Schema(required = true) String postcode, + @Schema(required = true) String country ) { static JsonContactAddress from(MessageEnvelope.Data.SharedContact.Address address) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactAvatar.java b/src/main/java/org/asamk/signal/json/JsonContactAvatar.java index c4a28721..4477228b 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactAvatar.java +++ b/src/main/java/org/asamk/signal/json/JsonContactAvatar.java @@ -4,7 +4,10 @@ import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; @Schema(name = "ContactAvatar") -public record JsonContactAvatar(JsonAttachment attachment, boolean isProfile) { +public record JsonContactAvatar( + @Schema(required = true) JsonAttachment attachment, + @Schema(required = true) boolean isProfile +) { static JsonContactAvatar from(MessageEnvelope.Data.SharedContact.Avatar avatar) { return new JsonContactAvatar(JsonAttachment.from(avatar.attachment()), avatar.isProfile()); diff --git a/src/main/java/org/asamk/signal/json/JsonContactEmail.java b/src/main/java/org/asamk/signal/json/JsonContactEmail.java index 58be643f..2dc829dd 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactEmail.java +++ b/src/main/java/org/asamk/signal/json/JsonContactEmail.java @@ -5,7 +5,11 @@ import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Util; @Schema(name = "ContactEmail") -public record JsonContactEmail(String value, String type, String label) { +public record JsonContactEmail( + @Schema(required = true) String value, + @Schema(required = true) String type, + @Schema(required = true) String label +) { static JsonContactEmail from(MessageEnvelope.Data.SharedContact.Email email) { return new JsonContactEmail(email.value(), email.type().name(), Util.getStringIfNotBlank(email.label())); diff --git a/src/main/java/org/asamk/signal/json/JsonContactName.java b/src/main/java/org/asamk/signal/json/JsonContactName.java index 71aa0a73..db08918b 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactName.java +++ b/src/main/java/org/asamk/signal/json/JsonContactName.java @@ -6,7 +6,12 @@ import org.asamk.signal.util.Util; @Schema(name = "ContactName") public record JsonContactName( - String nickname, String given, String family, String prefix, String suffix, String middle + @Schema(required = true) String nickname, + @Schema(required = true) String given, + @Schema(required = true) String family, + @Schema(required = true) String prefix, + @Schema(required = true) String suffix, + @Schema(required = true) String middle ) { static JsonContactName from(MessageEnvelope.Data.SharedContact.Name name) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactPhone.java b/src/main/java/org/asamk/signal/json/JsonContactPhone.java index ad726bcd..960232a0 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactPhone.java +++ b/src/main/java/org/asamk/signal/json/JsonContactPhone.java @@ -5,7 +5,11 @@ import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Util; @Schema(name = "ContactPhone") -public record JsonContactPhone(String value, String type, String label) { +public record JsonContactPhone( + @Schema(required = true) String value, + @Schema(required = true) String type, + @Schema(required = true) String label +) { static JsonContactPhone from(MessageEnvelope.Data.SharedContact.Phone phone) { return new JsonContactPhone(phone.value(), phone.type().name(), Util.getStringIfNotBlank(phone.label())); diff --git a/src/main/java/org/asamk/signal/json/JsonDataMessage.java b/src/main/java/org/asamk/signal/json/JsonDataMessage.java index ec8265cb..27681ecc 100644 --- a/src/main/java/org/asamk/signal/json/JsonDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonDataMessage.java @@ -10,9 +10,9 @@ import java.util.List; @Schema(name = "DataMessage") record JsonDataMessage( - long timestamp, - String message, - Integer expiresInSeconds, + @Schema(required = true) long timestamp, + @Schema(required = true) String message, + @Schema(required = true) Integer expiresInSeconds, @JsonInclude(JsonInclude.Include.NON_NULL) Boolean isExpirationUpdate, @JsonInclude(JsonInclude.Include.NON_NULL) Boolean viewOnce, @JsonInclude(JsonInclude.Include.NON_NULL) JsonReaction reaction, diff --git a/src/main/java/org/asamk/signal/json/JsonEditMessage.java b/src/main/java/org/asamk/signal/json/JsonEditMessage.java index fb31d4ba..0d58e793 100644 --- a/src/main/java/org/asamk/signal/json/JsonEditMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonEditMessage.java @@ -5,7 +5,10 @@ import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; @Schema(name = "EditMessage") -record JsonEditMessage(long targetSentTimestamp, JsonDataMessage dataMessage) { +record JsonEditMessage( + @Schema(required = true) long targetSentTimestamp, + @Schema(required = true) JsonDataMessage dataMessage +) { static JsonEditMessage from(MessageEnvelope.Edit editMessage, Manager m) { return new JsonEditMessage(editMessage.targetSentTimestamp(), diff --git a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java index 0296f274..f14e524d 100644 --- a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java +++ b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java @@ -5,7 +5,12 @@ import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; @Schema(name = "GroupInfo") -record JsonGroupInfo(String groupId, String groupName, int revision, String type) { +record JsonGroupInfo( + @Schema(required = true) String groupId, + @Schema(required = true) String groupName, + @Schema(required = true) int revision, + @Schema(required = true) String type +) { static JsonGroupInfo from(MessageEnvelope.Data.GroupContext groupContext, Manager m) { return new JsonGroupInfo(groupContext.groupId().toBase64(), diff --git a/src/main/java/org/asamk/signal/json/JsonMention.java b/src/main/java/org/asamk/signal/json/JsonMention.java index 70728523..f1577678 100644 --- a/src/main/java/org/asamk/signal/json/JsonMention.java +++ b/src/main/java/org/asamk/signal/json/JsonMention.java @@ -6,7 +6,13 @@ import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; @Schema(name = "Mention") -public record JsonMention(@Deprecated String name, String number, String uuid, int start, int length) { +public record JsonMention( + @Schema(required = true) @Deprecated String name, + @Schema(required = true) String number, + @Schema(required = true) String uuid, + @Schema(required = true) int start, + @Schema(required = true) int length +) { static JsonMention from(MessageEnvelope.Data.Mention mention) { final var address = mention.recipient(); diff --git a/src/main/java/org/asamk/signal/json/JsonPayment.java b/src/main/java/org/asamk/signal/json/JsonPayment.java index 957df083..4f88abbf 100644 --- a/src/main/java/org/asamk/signal/json/JsonPayment.java +++ b/src/main/java/org/asamk/signal/json/JsonPayment.java @@ -4,7 +4,10 @@ import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; @Schema(name = "Payment") -public record JsonPayment(String note, byte[] receipt) { +public record JsonPayment( + @Schema(required = true) String note, + @Schema(required = true) byte[] receipt +) { static JsonPayment from(MessageEnvelope.Data.Payment payment) { return new JsonPayment(payment.note(), payment.receipt()); diff --git a/src/main/java/org/asamk/signal/json/JsonPinMessage.java b/src/main/java/org/asamk/signal/json/JsonPinMessage.java index 419b4fda..5e0582f4 100644 --- a/src/main/java/org/asamk/signal/json/JsonPinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonPinMessage.java @@ -7,11 +7,11 @@ import java.util.UUID; @Schema(name = "PinMessage") public record JsonPinMessage( - @Deprecated String targetAuthor, - String targetAuthorNumber, - String targetAuthorUuid, - long targetSentTimestamp, - long pinDurationSeconds + @Schema(required = true) @Deprecated String targetAuthor, + @Schema(required = true) String targetAuthorNumber, + @Schema(required = true) String targetAuthorUuid, + @Schema(required = true) long targetSentTimestamp, + @Schema(required = true) long pinDurationSeconds ) { static JsonPinMessage from(MessageEnvelope.Data.PinMessage pinMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonPollCreate.java b/src/main/java/org/asamk/signal/json/JsonPollCreate.java index 335a8d17..26ceca0b 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollCreate.java +++ b/src/main/java/org/asamk/signal/json/JsonPollCreate.java @@ -7,7 +7,9 @@ import java.util.List; @Schema(name = "PollCreate") public record JsonPollCreate( - String question, boolean allowMultiple, List options + @Schema(required = true) String question, + @Schema(required = true) boolean allowMultiple, + @Schema(required = true) List options ) { static JsonPollCreate from(MessageEnvelope.Data.PollCreate pollCreate) { diff --git a/src/main/java/org/asamk/signal/json/JsonPollTerminate.java b/src/main/java/org/asamk/signal/json/JsonPollTerminate.java index eb3483ee..09430d0c 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollTerminate.java +++ b/src/main/java/org/asamk/signal/json/JsonPollTerminate.java @@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; @Schema(name = "PollTerminate") -public record JsonPollTerminate(long targetSentTimestamp) { +public record JsonPollTerminate(@Schema(required = true) long targetSentTimestamp) { static JsonPollTerminate from(MessageEnvelope.Data.PollTerminate pollTerminate) { final var targetSentTimestamp = pollTerminate.targetSentTimestamp(); diff --git a/src/main/java/org/asamk/signal/json/JsonPollVote.java b/src/main/java/org/asamk/signal/json/JsonPollVote.java index aab9e47c..911102f2 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollVote.java +++ b/src/main/java/org/asamk/signal/json/JsonPollVote.java @@ -8,12 +8,12 @@ import java.util.UUID; @Schema(name = "PollVote") public record JsonPollVote( - @Deprecated String author, - String authorNumber, - String authorUuid, - long targetSentTimestamp, - List optionIndexes, - int voteCount + @Schema(required = true) @Deprecated String author, + @Schema(required = true) String authorNumber, + @Schema(required = true) String authorUuid, + @Schema(required = true) long targetSentTimestamp, + @Schema(required = true) List optionIndexes, + @Schema(required = true) int voteCount ) { static JsonPollVote from(MessageEnvelope.Data.PollVote pollVote) { diff --git a/src/main/java/org/asamk/signal/json/JsonPreview.java b/src/main/java/org/asamk/signal/json/JsonPreview.java index 03467b20..b6147433 100644 --- a/src/main/java/org/asamk/signal/json/JsonPreview.java +++ b/src/main/java/org/asamk/signal/json/JsonPreview.java @@ -4,7 +4,12 @@ import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.MessageEnvelope; @Schema(name = "Preview") -public record JsonPreview(String url, String title, String description, JsonAttachment image) { +public record JsonPreview( + @Schema(required = true) String url, + @Schema(required = true) String title, + @Schema(required = true) String description, + @Schema(required = true) JsonAttachment image +) { static JsonPreview from(MessageEnvelope.Data.Preview preview) { return new JsonPreview(preview.url(), diff --git a/src/main/java/org/asamk/signal/json/JsonQuote.java b/src/main/java/org/asamk/signal/json/JsonQuote.java index 5e62de6f..68a76be6 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuote.java +++ b/src/main/java/org/asamk/signal/json/JsonQuote.java @@ -10,13 +10,13 @@ import java.util.UUID; @Schema(name = "Quote") public record JsonQuote( - long id, - @Deprecated String author, - String authorNumber, - String authorUuid, - String text, + @Schema(required = true) long id, + @Schema(required = true) @Deprecated String author, + @Schema(required = true) String authorNumber, + @Schema(required = true) String authorUuid, + @Schema(required = true) String text, @JsonInclude(JsonInclude.Include.NON_NULL) List mentions, - List attachments, + @Schema(required = true) List attachments, @JsonInclude(JsonInclude.Include.NON_NULL) List textStyles ) { diff --git a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java index 29373e19..a2120106 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java @@ -7,7 +7,9 @@ import org.asamk.signal.manager.api.MessageEnvelope; @Schema(name = "QuotedAttachment") public record JsonQuotedAttachment( - String contentType, String filename, @JsonInclude(JsonInclude.Include.NON_NULL) JsonAttachment thumbnail + @Schema(required = true) String contentType, + @Schema(required = true) String filename, + @JsonInclude(JsonInclude.Include.NON_NULL) JsonAttachment thumbnail ) { static JsonQuotedAttachment from(MessageEnvelope.Data.Attachment quotedAttachment) { diff --git a/src/main/java/org/asamk/signal/json/JsonReaction.java b/src/main/java/org/asamk/signal/json/JsonReaction.java index 2c5ea996..baaa2c1f 100644 --- a/src/main/java/org/asamk/signal/json/JsonReaction.java +++ b/src/main/java/org/asamk/signal/json/JsonReaction.java @@ -7,12 +7,12 @@ import java.util.UUID; @Schema(name = "Reaction") public record JsonReaction( - String emoji, - @Deprecated String targetAuthor, - String targetAuthorNumber, - String targetAuthorUuid, - long targetSentTimestamp, - boolean isRemove + @Schema(required = true) String emoji, + @Schema(required = true) @Deprecated String targetAuthor, + @Schema(required = true) String targetAuthorNumber, + @Schema(required = true) String targetAuthorUuid, + @Schema(required = true) long targetSentTimestamp, + @Schema(required = true) boolean isRemove ) { static JsonReaction from(MessageEnvelope.Data.Reaction reaction) { diff --git a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java index 30c05ad3..d0ea0a49 100644 --- a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java @@ -6,7 +6,13 @@ import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; @Schema(name = "ReceiptMessage") -record JsonReceiptMessage(long when, boolean isDelivery, boolean isRead, boolean isViewed, List timestamps) { +record JsonReceiptMessage( + @Schema(required = true) long when, + @Schema(required = true) boolean isDelivery, + @Schema(required = true) boolean isRead, + @Schema(required = true) boolean isViewed, + @Schema(required = true) List timestamps +) { static JsonReceiptMessage from(MessageEnvelope.Receipt receiptMessage) { final var when = receiptMessage.when(); diff --git a/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java b/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java index 5533a767..200b6ece 100644 --- a/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java +++ b/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java @@ -6,7 +6,11 @@ import org.asamk.signal.manager.api.RecipientAddress; import java.util.UUID; @Schema(name = "RecipientAddress") -public record JsonRecipientAddress(String uuid, String number, String username) { +public record JsonRecipientAddress( + @Schema(required = true) String uuid, + @Schema(required = true) String number, + @Schema(required = true) String username +) { public static JsonRecipientAddress from(RecipientAddress address) { return new JsonRecipientAddress(address.uuid().map(UUID::toString).orElse(null), diff --git a/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java b/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java index 270d8354..58c572db 100644 --- a/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java +++ b/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java @@ -3,4 +3,4 @@ package org.asamk.signal.json; import io.swagger.v3.oas.annotations.media.Schema; @Schema(name = "RemoteDelete") -record JsonRemoteDelete(long timestamp) {} +record JsonRemoteDelete(@Schema(required = true) long timestamp) {} diff --git a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java index e1c4e1d5..dff92811 100644 --- a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java +++ b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java @@ -8,9 +8,9 @@ import org.asamk.signal.manager.api.SendMessageResult; @Schema(name = "SendMessageResult") public record JsonSendMessageResult( - JsonRecipientAddress recipientAddress, + @Schema(required = true) JsonRecipientAddress recipientAddress, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId, - Type type, + @Schema(required = true) Type type, @JsonInclude(JsonInclude.Include.NON_NULL) String token, @JsonInclude(JsonInclude.Include.NON_NULL) Long retryAfterSeconds ) { diff --git a/src/main/java/org/asamk/signal/json/JsonSharedContact.java b/src/main/java/org/asamk/signal/json/JsonSharedContact.java index c58e2b93..5e55efb9 100644 --- a/src/main/java/org/asamk/signal/json/JsonSharedContact.java +++ b/src/main/java/org/asamk/signal/json/JsonSharedContact.java @@ -9,12 +9,12 @@ import java.util.List; @Schema(name = "SharedContact") public record JsonSharedContact( - JsonContactName name, + @Schema(required = true) JsonContactName name, @JsonInclude(JsonInclude.Include.NON_NULL) JsonContactAvatar avatar, @JsonInclude(JsonInclude.Include.NON_NULL) List phone, @JsonInclude(JsonInclude.Include.NON_NULL) List email, @JsonInclude(JsonInclude.Include.NON_NULL) List address, - String organization + @Schema(required = true) String organization ) { static JsonSharedContact from(MessageEnvelope.Data.SharedContact contact) { diff --git a/src/main/java/org/asamk/signal/json/JsonSticker.java b/src/main/java/org/asamk/signal/json/JsonSticker.java index 889855ac..aac10a03 100644 --- a/src/main/java/org/asamk/signal/json/JsonSticker.java +++ b/src/main/java/org/asamk/signal/json/JsonSticker.java @@ -5,7 +5,10 @@ import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Hex; @Schema(name = "Sticker") -public record JsonSticker(String packId, int stickerId) { +public record JsonSticker( + @Schema(required = true) String packId, + @Schema(required = true) int stickerId +) { static JsonSticker from(MessageEnvelope.Data.Sticker sticker) { final var packId = Hex.toStringCondensed(sticker.packId().serialize()); diff --git a/src/main/java/org/asamk/signal/json/JsonStoryContext.java b/src/main/java/org/asamk/signal/json/JsonStoryContext.java index f5798093..ddbfc5b0 100644 --- a/src/main/java/org/asamk/signal/json/JsonStoryContext.java +++ b/src/main/java/org/asamk/signal/json/JsonStoryContext.java @@ -7,7 +7,9 @@ import java.util.UUID; @Schema(name = "StoryContext") record JsonStoryContext( - String authorNumber, String authorUuid, long sentTimestamp + @Schema(required = true) String authorNumber, + @Schema(required = true) String authorUuid, + @Schema(required = true) long sentTimestamp ) { static JsonStoryContext from(MessageEnvelope.Data.StoryContext storyContext) { diff --git a/src/main/java/org/asamk/signal/json/JsonStoryMessage.java b/src/main/java/org/asamk/signal/json/JsonStoryMessage.java index 90e3e485..38613c9d 100644 --- a/src/main/java/org/asamk/signal/json/JsonStoryMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonStoryMessage.java @@ -11,7 +11,7 @@ import java.util.List; @Schema(name = "StoryMessage") record JsonStoryMessage( - boolean allowsReplies, + @Schema(required = true) boolean allowsReplies, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId, @JsonInclude(JsonInclude.Include.NON_NULL) JsonAttachment fileAttachment, @JsonInclude(JsonInclude.Include.NON_NULL) TextAttachment textAttachment @@ -25,7 +25,7 @@ record JsonStoryMessage( } public record TextAttachment( - String text, + @Schema(required = true) String text, @JsonInclude(JsonInclude.Include.NON_NULL) String style, @JsonInclude(JsonInclude.Include.NON_NULL) String textForegroundColor, @JsonInclude(JsonInclude.Include.NON_NULL) String textBackgroundColor, @@ -45,7 +45,11 @@ record JsonStoryMessage( } public record Gradient( - String startColor, String endColor, List colors, List positions, Integer angle + @Schema(required = true) String startColor, + @Schema(required = true) String endColor, + @Schema(required = true) List colors, + @Schema(required = true) List positions, + @Schema(required = true) Integer angle ) { static Gradient from(MessageEnvelope.Story.TextAttachment.Gradient gradient) { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java index fd1a105d..6c7be047 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java @@ -12,11 +12,11 @@ import java.util.UUID; @Schema(name = "SyncDataMessage") record JsonSyncDataMessage( - @Deprecated String destination, - String destinationNumber, - String destinationUuid, + @Schema(required = true) @Deprecated String destination, + @Schema(required = true) String destinationNumber, + @Schema(required = true) String destinationUuid, @JsonInclude(JsonInclude.Include.NON_NULL) JsonEditMessage editMessage, - @JsonUnwrapped JsonDataMessage dataMessage + @Schema(required = true) @JsonUnwrapped JsonDataMessage dataMessage ) { static JsonSyncDataMessage from(MessageEnvelope.Sync.Sent transcriptMessage, Manager m) { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java index 4438c803..832b3ea1 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java @@ -9,7 +9,9 @@ import java.util.UUID; @Schema(name = "SyncStoryMessage") record JsonSyncStoryMessage( - String destinationNumber, String destinationUuid, @JsonUnwrapped JsonStoryMessage dataMessage + @Schema(required = true) String destinationNumber, + @Schema(required = true) String destinationUuid, + @Schema(required = true) @JsonUnwrapped JsonStoryMessage dataMessage ) { static JsonSyncStoryMessage from(MessageEnvelope.Sync.Sent transcriptMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonTextStyle.java b/src/main/java/org/asamk/signal/json/JsonTextStyle.java index becd1b3c..eecee099 100644 --- a/src/main/java/org/asamk/signal/json/JsonTextStyle.java +++ b/src/main/java/org/asamk/signal/json/JsonTextStyle.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.media.Schema; import org.asamk.signal.manager.api.TextStyle; @Schema(name = "TextStyle") -public record JsonTextStyle(String style, int start, int length) { +public record JsonTextStyle( + @Schema(required = true) String style, + @Schema(required = true) int start, + @Schema(required = true) int length +) { static JsonTextStyle from(TextStyle textStyle) { return new JsonTextStyle(textStyle.style().name(), textStyle.start(), textStyle.length()); diff --git a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java index 09936752..c544c1f1 100644 --- a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java @@ -7,7 +7,10 @@ import java.util.UUID; @Schema(name = "UnpinMessage") public record JsonUnpinMessage( - @Deprecated String targetAuthor, String targetAuthorNumber, String targetAuthorUuid, long targetSentTimestamp + @Schema(required = true) @Deprecated String targetAuthor, + @Schema(required = true) String targetAuthorNumber, + @Schema(required = true) String targetAuthorUuid, + @Schema(required = true) long targetSentTimestamp ) { static JsonUnpinMessage from(MessageEnvelope.Data.UnpinMessage unpinMessage) { From a38b7edbdfce3a8bf52cc14f7c37066f37a7baac Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Mon, 2 Mar 2026 02:04:24 +0100 Subject: [PATCH 06/22] Add missing required = true schemas --- .../asamk/signal/json/JsonAttachmentData.java | 2 +- .../org/asamk/signal/json/JsonContact.java | 56 +++++++++---------- .../java/org/asamk/signal/json/JsonError.java | 2 +- .../signal/json/JsonMessageEnvelope.java | 16 +++--- .../signal/json/JsonSyncReadMessage.java | 5 +- .../asamk/signal/json/JsonTypingMessage.java | 4 +- 6 files changed, 45 insertions(+), 40 deletions(-) diff --git a/src/main/java/org/asamk/signal/json/JsonAttachmentData.java b/src/main/java/org/asamk/signal/json/JsonAttachmentData.java index ba76dec7..1315353a 100644 --- a/src/main/java/org/asamk/signal/json/JsonAttachmentData.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachmentData.java @@ -4,5 +4,5 @@ import io.swagger.v3.oas.annotations.media.Schema; @Schema(name = "AttachmentData") public record JsonAttachmentData( - String data + @Schema(required = true) String data ) {} diff --git a/src/main/java/org/asamk/signal/json/JsonContact.java b/src/main/java/org/asamk/signal/json/JsonContact.java index e302eaaf..4c0c2106 100644 --- a/src/main/java/org/asamk/signal/json/JsonContact.java +++ b/src/main/java/org/asamk/signal/json/JsonContact.java @@ -7,42 +7,42 @@ import java.util.List; @Schema(name = "Contact") public record JsonContact( - String number, - String uuid, - String username, - String name, - String givenName, - String familyName, - String nickName, - String nickGivenName, - String nickFamilyName, - String note, - String color, - boolean isBlocked, - boolean isHidden, - int messageExpirationTime, - boolean profileSharing, - boolean unregistered, - JsonProfile profile, + @Schema(required = true) String number, + @Schema(required = true) String uuid, + @Schema(required = true) String username, + @Schema(required = true) String name, + @Schema(required = true) String givenName, + @Schema(required = true) String familyName, + @Schema(required = true) String nickName, + @Schema(required = true) String nickGivenName, + @Schema(required = true) String nickFamilyName, + @Schema(required = true) String note, + @Schema(required = true) String color, + @Schema(required = true) boolean isBlocked, + @Schema(required = true) boolean isHidden, + @Schema(required = true) int messageExpirationTime, + @Schema(required = true) boolean profileSharing, + @Schema(required = true) boolean unregistered, + @Schema(required = true) JsonProfile profile, @JsonInclude(JsonInclude.Include.NON_NULL) JsonInternal internal ) { @Schema(name = "Profile") public record JsonProfile( - long lastUpdateTimestamp, - String givenName, - String familyName, - String about, - String aboutEmoji, - boolean hasAvatar, - String mobileCoinAddress + @Schema(required = true) long lastUpdateTimestamp, + @Schema(required = true) String givenName, + @Schema(required = true) String familyName, + @Schema(required = true) String about, + @Schema(required = true) String aboutEmoji, + @Schema(required = true) boolean hasAvatar, + @Schema(required = true) String mobileCoinAddress ) {} @Schema(name = "Internal") public record JsonInternal( - List capabilities, - String unidentifiedAccessMode, - Boolean sharesPhoneNumber, - Boolean discoverableByPhonenumber + @Schema(required = true) List capabilities, + @Schema(required = true) String unidentifiedAccessMode, + @Schema(required = true) Boolean sharesPhoneNumber, + @Schema(required = true) Boolean discoverableByPhonenumber ) {} } diff --git a/src/main/java/org/asamk/signal/json/JsonError.java b/src/main/java/org/asamk/signal/json/JsonError.java index d6ab7b2d..f404d1af 100644 --- a/src/main/java/org/asamk/signal/json/JsonError.java +++ b/src/main/java/org/asamk/signal/json/JsonError.java @@ -3,7 +3,7 @@ package org.asamk.signal.json; import io.swagger.v3.oas.annotations.media.Schema; @Schema(name = "Error") -public record JsonError(String message, String type) { +public record JsonError(@Schema(required = true) String message, @Schema(required = true) String type) { public static JsonError from(Throwable exception) { return new JsonError(exception.getMessage(), exception.getClass().getSimpleName()); diff --git a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java index 857c7fad..b39c0c71 100644 --- a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -13,14 +13,14 @@ import java.util.UUID; @Schema(name = "MessageEnvelope") public record JsonMessageEnvelope( - @Deprecated String source, - String sourceNumber, - String sourceUuid, - String sourceName, - Integer sourceDevice, - long timestamp, - long serverReceivedTimestamp, - long serverDeliveredTimestamp, + @Schema(required = true) @Deprecated String source, + @Schema(required = true) String sourceNumber, + @Schema(required = true) String sourceUuid, + @Schema(required = true) String sourceName, + @Schema(required = true) Integer sourceDevice, + @Schema(required = true) long timestamp, + @Schema(required = true) long serverReceivedTimestamp, + @Schema(required = true) long serverDeliveredTimestamp, @JsonInclude(JsonInclude.Include.NON_NULL) JsonDataMessage dataMessage, @JsonInclude(JsonInclude.Include.NON_NULL) JsonEditMessage editMessage, @JsonInclude(JsonInclude.Include.NON_NULL) JsonStoryMessage storyMessage, diff --git a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java index a7bc41e3..187c9ed6 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java @@ -7,7 +7,10 @@ import java.util.UUID; @Schema(name = "SyncReadMessage") record JsonSyncReadMessage( - @Deprecated String sender, String senderNumber, String senderUuid, long timestamp + @Schema(required = true) @Deprecated String sender, + @Schema(required = true) String senderNumber, + @Schema(required = true) String senderUuid, + @Schema(required = true) long timestamp ) { static JsonSyncReadMessage from(MessageEnvelope.Sync.Read readMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonTypingMessage.java b/src/main/java/org/asamk/signal/json/JsonTypingMessage.java index 4680ae70..a4a9346f 100644 --- a/src/main/java/org/asamk/signal/json/JsonTypingMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonTypingMessage.java @@ -8,7 +8,9 @@ import org.asamk.signal.manager.api.MessageEnvelope; @Schema(name = "TypingMessage") record JsonTypingMessage( - String action, long timestamp, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId + @Schema(required = true) String action, + @Schema(required = true) long timestamp, + @JsonInclude(JsonInclude.Include.NON_NULL) String groupId ) { static JsonTypingMessage from(MessageEnvelope.Typing typingMessage) { From 3f15de094694aa46856d313a04bd449cd1c5388b Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Fri, 6 Mar 2026 21:07:10 +0100 Subject: [PATCH 07/22] Deprecated fields are not required --- src/main/java/org/asamk/signal/json/JsonAdminDelete.java | 2 +- src/main/java/org/asamk/signal/json/JsonMention.java | 2 +- src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java | 2 +- src/main/java/org/asamk/signal/json/JsonPinMessage.java | 2 +- src/main/java/org/asamk/signal/json/JsonPollVote.java | 2 +- src/main/java/org/asamk/signal/json/JsonQuote.java | 2 +- src/main/java/org/asamk/signal/json/JsonReaction.java | 2 +- src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java | 2 +- src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java | 2 +- src/main/java/org/asamk/signal/json/JsonUnpinMessage.java | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java index d0dc47c8..6ac9b625 100644 --- a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java +++ b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java @@ -7,7 +7,7 @@ import java.util.UUID; @Schema(name = "AdminDelete") public record JsonAdminDelete( - @Schema(required = true) @Deprecated String targetAuthor, + @Deprecated String targetAuthor, @Schema(required = true) String targetAuthorNumber, @Schema(required = true) String targetAuthorUuid, @Schema(required = true) long targetSentTimestamp diff --git a/src/main/java/org/asamk/signal/json/JsonMention.java b/src/main/java/org/asamk/signal/json/JsonMention.java index f1577678..6178f9c9 100644 --- a/src/main/java/org/asamk/signal/json/JsonMention.java +++ b/src/main/java/org/asamk/signal/json/JsonMention.java @@ -7,7 +7,7 @@ import java.util.UUID; @Schema(name = "Mention") public record JsonMention( - @Schema(required = true) @Deprecated String name, + @Deprecated String name, @Schema(required = true) String number, @Schema(required = true) String uuid, @Schema(required = true) int start, diff --git a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java index b39c0c71..f1455500 100644 --- a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -13,7 +13,7 @@ import java.util.UUID; @Schema(name = "MessageEnvelope") public record JsonMessageEnvelope( - @Schema(required = true) @Deprecated String source, + @Deprecated String source, @Schema(required = true) String sourceNumber, @Schema(required = true) String sourceUuid, @Schema(required = true) String sourceName, diff --git a/src/main/java/org/asamk/signal/json/JsonPinMessage.java b/src/main/java/org/asamk/signal/json/JsonPinMessage.java index 5e0582f4..f4810283 100644 --- a/src/main/java/org/asamk/signal/json/JsonPinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonPinMessage.java @@ -7,7 +7,7 @@ import java.util.UUID; @Schema(name = "PinMessage") public record JsonPinMessage( - @Schema(required = true) @Deprecated String targetAuthor, + @Deprecated String targetAuthor, @Schema(required = true) String targetAuthorNumber, @Schema(required = true) String targetAuthorUuid, @Schema(required = true) long targetSentTimestamp, diff --git a/src/main/java/org/asamk/signal/json/JsonPollVote.java b/src/main/java/org/asamk/signal/json/JsonPollVote.java index 911102f2..a151af41 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollVote.java +++ b/src/main/java/org/asamk/signal/json/JsonPollVote.java @@ -8,7 +8,7 @@ import java.util.UUID; @Schema(name = "PollVote") public record JsonPollVote( - @Schema(required = true) @Deprecated String author, + @Deprecated String author, @Schema(required = true) String authorNumber, @Schema(required = true) String authorUuid, @Schema(required = true) long targetSentTimestamp, diff --git a/src/main/java/org/asamk/signal/json/JsonQuote.java b/src/main/java/org/asamk/signal/json/JsonQuote.java index 68a76be6..f659c435 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuote.java +++ b/src/main/java/org/asamk/signal/json/JsonQuote.java @@ -11,7 +11,7 @@ import java.util.UUID; @Schema(name = "Quote") public record JsonQuote( @Schema(required = true) long id, - @Schema(required = true) @Deprecated String author, + @Deprecated String author, @Schema(required = true) String authorNumber, @Schema(required = true) String authorUuid, @Schema(required = true) String text, diff --git a/src/main/java/org/asamk/signal/json/JsonReaction.java b/src/main/java/org/asamk/signal/json/JsonReaction.java index baaa2c1f..ceffcc29 100644 --- a/src/main/java/org/asamk/signal/json/JsonReaction.java +++ b/src/main/java/org/asamk/signal/json/JsonReaction.java @@ -8,7 +8,7 @@ import java.util.UUID; @Schema(name = "Reaction") public record JsonReaction( @Schema(required = true) String emoji, - @Schema(required = true) @Deprecated String targetAuthor, + @Deprecated String targetAuthor, @Schema(required = true) String targetAuthorNumber, @Schema(required = true) String targetAuthorUuid, @Schema(required = true) long targetSentTimestamp, diff --git a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java index 6c7be047..4ce140df 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java @@ -12,7 +12,7 @@ import java.util.UUID; @Schema(name = "SyncDataMessage") record JsonSyncDataMessage( - @Schema(required = true) @Deprecated String destination, + @Deprecated String destination, @Schema(required = true) String destinationNumber, @Schema(required = true) String destinationUuid, @JsonInclude(JsonInclude.Include.NON_NULL) JsonEditMessage editMessage, diff --git a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java index 187c9ed6..cd453327 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java @@ -7,7 +7,7 @@ import java.util.UUID; @Schema(name = "SyncReadMessage") record JsonSyncReadMessage( - @Schema(required = true) @Deprecated String sender, + @Deprecated String sender, @Schema(required = true) String senderNumber, @Schema(required = true) String senderUuid, @Schema(required = true) long timestamp diff --git a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java index c544c1f1..020c9a45 100644 --- a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java @@ -7,7 +7,7 @@ import java.util.UUID; @Schema(name = "UnpinMessage") public record JsonUnpinMessage( - @Schema(required = true) @Deprecated String targetAuthor, + @Deprecated String targetAuthor, @Schema(required = true) String targetAuthorNumber, @Schema(required = true) String targetAuthorUuid, @Schema(required = true) long targetSentTimestamp From cde6fff3364bc06dd90a561600e841a8a9216a63 Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Fri, 6 Mar 2026 22:50:15 +0100 Subject: [PATCH 08/22] switch to micronout json generation --- README.md | 9 ++- build.gradle.kts | 24 +++++-- gradle/libs.versions.toml | 10 +-- .../asamk/signal/json/JsonAdminDelete.java | 11 ++-- .../org/asamk/signal/json/JsonAttachment.java | 22 ++++--- .../asamk/signal/json/JsonAttachmentData.java | 8 ++- .../asamk/signal/json/JsonCallMessage.java | 27 ++++---- .../org/asamk/signal/json/JsonContact.java | 66 ++++++++++--------- .../asamk/signal/json/JsonContactAddress.java | 24 +++---- .../asamk/signal/json/JsonContactAvatar.java | 10 +-- .../asamk/signal/json/JsonContactEmail.java | 12 ++-- .../asamk/signal/json/JsonContactName.java | 18 ++--- .../asamk/signal/json/JsonContactPhone.java | 12 ++-- .../asamk/signal/json/JsonDataMessage.java | 12 ++-- .../asamk/signal/json/JsonEditMessage.java | 10 +-- .../java/org/asamk/signal/json/JsonError.java | 8 ++- .../org/asamk/signal/json/JsonGroupInfo.java | 14 ++-- .../org/asamk/signal/json/JsonMention.java | 14 ++-- .../signal/json/JsonMessageEnvelope.java | 20 +++--- .../signal/json/JsonOpenApiController.java | 27 -------- .../org/asamk/signal/json/JsonPayment.java | 10 +-- .../org/asamk/signal/json/JsonPinMessage.java | 14 ++-- .../org/asamk/signal/json/JsonPollCreate.java | 12 ++-- .../asamk/signal/json/JsonPollTerminate.java | 8 ++- .../org/asamk/signal/json/JsonPollVote.java | 16 +++-- .../org/asamk/signal/json/JsonPreview.java | 14 ++-- .../java/org/asamk/signal/json/JsonQuote.java | 15 +++-- .../signal/json/JsonQuotedAttachment.java | 9 +-- .../org/asamk/signal/json/JsonReaction.java | 16 +++-- .../asamk/signal/json/JsonReceiptMessage.java | 16 +++-- .../signal/json/JsonRecipientAddress.java | 12 ++-- .../asamk/signal/json/JsonRemoteDelete.java | 7 +- .../asamk/signal/json/JsonSchemaCatalog.java | 5 +- .../signal/json/JsonSendMessageResult.java | 9 +-- .../asamk/signal/json/JsonSharedContact.java | 9 +-- .../org/asamk/signal/json/JsonSticker.java | 10 +-- .../asamk/signal/json/JsonStoryContext.java | 12 ++-- .../asamk/signal/json/JsonStoryMessage.java | 19 +++--- .../signal/json/JsonSyncDataMessage.java | 11 ++-- .../asamk/signal/json/JsonSyncMessage.java | 5 +- .../signal/json/JsonSyncReadMessage.java | 12 ++-- .../signal/json/JsonSyncStoryMessage.java | 11 ++-- .../org/asamk/signal/json/JsonTextStyle.java | 12 ++-- .../asamk/signal/json/JsonTypingMessage.java | 9 +-- .../asamk/signal/json/JsonUnpinMessage.java | 12 ++-- .../OpenApiDocumentationApplication.java | 26 -------- 46 files changed, 348 insertions(+), 321 deletions(-) delete mode 100644 src/main/java/org/asamk/signal/json/JsonOpenApiController.java delete mode 100644 src/main/java/org/asamk/signal/openapi/OpenApiDocumentationApplication.java diff --git a/README.md b/README.md index 307e79d3..4c3e24f2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +https://sdkman.io/usage/ + # signal-cli signal-cli is a commandline interface for the [Signal messenger](https://signal.org/). @@ -153,13 +155,10 @@ version installed, you can replace `./gradlew` with `gradle` in the following st 1. Run documentation server for all the JSON-RPC schemas (`src/main/java/org/asamk/signal/json`): ```sh - ./gradlew openApiDocs + ./gradlew genJsonSchemas ``` -2. Open: - - - `http://localhost:8080/swagger-ui/index.html` (Swagger UI) - - `http://localhost:8080/v3/api-docs/json-models` (OpenAPI JSON) +2. Check the json schemas files in the following folder: ### Building a native binary with GraalVM (EXPERIMENTAL) diff --git a/build.gradle.kts b/build.gradle.kts index 09d6f597..8154425e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -82,6 +82,9 @@ dependencies { } } + annotationProcessor(libs.micronaut.json.schema.processor) + annotationProcessor(libs.micronaut.inject.java) + implementation(libs.bouncycastle) implementation(libs.jackson.databind) implementation(libs.argparse4j) @@ -90,8 +93,8 @@ dependencies { implementation(libs.slf4j.jul) implementation(libs.logback) implementation(libs.zxing) - implementation(libs.spring.boot.starter.web) - implementation(libs.springdoc.openapi.starter.webmvc.ui) + implementation(libs.micronaut.json.schema.annotations) + implementation(libs.micronaut.json.schema.generator) implementation(project(":libsignal-cli")) } @@ -107,8 +110,16 @@ tasks.withType().configureEach { isReproducibleFileOrder = true } -tasks.withType { +tasks.withType().configureEach { options.encoding = "UTF-8" + options.compilerArgs.addAll( + listOf( + "-Amicronaut.processing.group=org.asamk", + "-Amicronaut.processing.module=signal-cli", + "-Amicronaut.processing.annotations=org.asamk.signal.json.*", + "-Amicronaut.jsonschema.baseUri=https://example.com/schemas", + ) + ) } tasks.withType { @@ -141,9 +152,8 @@ tasks.register("fatJar", type = Jar::class) { with(tasks.jar.get()) } -tasks.register("openApiDocs") { +tasks.register("genJsonSchemas") { group = "application" - description = "Run OpenAPI documentation server for JSON models" - classpath = sourceSets["main"].runtimeClasspath - mainClass.set("org.asamk.signal.openapi.OpenApiDocumentationApplication") + description = "Generate JSON schemas using annotation processing" + dependsOn(tasks.compileJava) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cb99bbc8..2fa3f68e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,8 +1,8 @@ [versions] slf4j = "2.0.17" junit = "6.0.2" -spring-boot = "3.5.0" -springdoc = "2.8.13" +micronaut-json-schema = "1.7.2" +micronaut-core = "4.9.3" [libraries] bouncycastle = "org.bouncycastle:bcprov-jdk18on:1.83" @@ -10,8 +10,10 @@ jackson-databind = "com.fasterxml.jackson.core:jackson-databind:2.20.2" argparse4j = "net.sourceforge.argparse4j:argparse4j:0.9.0" dbusjava = "com.github.hypfvieh:dbus-java-transport-native-unixsocket:5.0.0" zxing = "com.google.zxing:core:3.5.4" -spring-boot-starter-web = { module = "org.springframework.boot:spring-boot-starter-web", version.ref = "spring-boot" } -springdoc-openapi-starter-webmvc-ui = { module = "org.springdoc:springdoc-openapi-starter-webmvc-ui", version.ref = "springdoc" } +micronaut-json-schema-annotations = { module = "io.micronaut.jsonschema:micronaut-json-schema-annotations", version.ref = "micronaut-json-schema" } +micronaut-json-schema-processor = { module = "io.micronaut.jsonschema:micronaut-json-schema-processor", version.ref = "micronaut-json-schema" } +micronaut-json-schema-generator = { module = "io.micronaut.jsonschema:micronaut-json-schema-generator", version.ref = "micronaut-json-schema" } +micronaut-inject-java = { module = "io.micronaut:micronaut-inject-java", version.ref = "micronaut-core" } slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } slf4j-jul = { module = "org.slf4j:jul-to-slf4j", version.ref = "slf4j" } logback = "ch.qos.logback:logback-classic:1.5.32" diff --git a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java index 6ac9b625..aa815456 100644 --- a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java +++ b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java @@ -1,16 +1,17 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; -@Schema(name = "AdminDelete") +@JsonSchema(title = "AdminDelete") public record JsonAdminDelete( @Deprecated String targetAuthor, - @Schema(required = true) String targetAuthorNumber, - @Schema(required = true) String targetAuthorUuid, - @Schema(required = true) long targetSentTimestamp + @JsonProperty(required = true) String targetAuthorNumber, + @JsonProperty(required = true) String targetAuthorUuid, + @JsonProperty(required = true) long targetSentTimestamp ) { static JsonAdminDelete from(MessageEnvelope.Data.AdminDelete adminDelete) { diff --git a/src/main/java/org/asamk/signal/json/JsonAttachment.java b/src/main/java/org/asamk/signal/json/JsonAttachment.java index c60d545b..a7580c6e 100644 --- a/src/main/java/org/asamk/signal/json/JsonAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachment.java @@ -1,18 +1,20 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; -@Schema(name = "Attachment") +@JsonSchema(title = "Attachment") record JsonAttachment( - @Schema(required = true) String contentType, - @Schema(required = true) String filename, - @Schema(required = true) String id, - @Schema(required = true) Long size, - @Schema(required = true) Integer width, - @Schema(required = true) Integer height, - @Schema(required = true) String caption, - @Schema(required = true) Long uploadTimestamp + @JsonProperty(required = true) String contentType, + @JsonProperty(required = true) String filename, + @JsonProperty(required = true) String id, + @JsonProperty(required = true) Long size, + @JsonProperty(required = true) Integer width, + @JsonProperty(required = true) Integer height, + @JsonProperty(required = true) String caption, + @JsonProperty(required = true) Long uploadTimestamp ) { static JsonAttachment from(MessageEnvelope.Data.Attachment attachment) { diff --git a/src/main/java/org/asamk/signal/json/JsonAttachmentData.java b/src/main/java/org/asamk/signal/json/JsonAttachmentData.java index 1315353a..e0ffcc08 100644 --- a/src/main/java/org/asamk/signal/json/JsonAttachmentData.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachmentData.java @@ -1,8 +1,10 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; -@Schema(name = "AttachmentData") + +@JsonSchema(title = "AttachmentData") public record JsonAttachmentData( - @Schema(required = true) String data + @JsonProperty(required = true) String data ) {} diff --git a/src/main/java/org/asamk/signal/json/JsonCallMessage.java b/src/main/java/org/asamk/signal/json/JsonCallMessage.java index a76478e2..6170d1df 100644 --- a/src/main/java/org/asamk/signal/json/JsonCallMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonCallMessage.java @@ -1,14 +1,15 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.Base64; import java.util.List; -@Schema(name = "CallMessage") +@JsonSchema(title = "CallMessage") record JsonCallMessage( @JsonInclude(JsonInclude.Include.NON_NULL) Offer offerMessage, @JsonInclude(JsonInclude.Include.NON_NULL) Answer answerMessage, @@ -26,9 +27,9 @@ record JsonCallMessage( } record Offer( - @Schema(required = true) long id, - @Schema(required = true) String type, - @Schema(required = true) String opaque + @JsonProperty(required = true) long id, + @JsonProperty(required = true) String type, + @JsonProperty(required = true) String opaque ) { public static Offer from(final MessageEnvelope.Call.Offer offer) { @@ -37,8 +38,8 @@ record JsonCallMessage( } public record Answer( - @Schema(required = true) long id, - @Schema(required = true) String opaque + @JsonProperty(required = true) long id, + @JsonProperty(required = true) String opaque ) { public static Answer from(final MessageEnvelope.Call.Answer answer) { @@ -46,7 +47,7 @@ record JsonCallMessage( } } - public record Busy(@Schema(required = true) long id) { + public record Busy(@JsonProperty(required = true) long id) { public static Busy from(final MessageEnvelope.Call.Busy busy) { return new Busy(busy.id()); @@ -54,9 +55,9 @@ record JsonCallMessage( } public record Hangup( - @Schema(required = true) long id, - @Schema(required = true) String type, - @Schema(required = true) int deviceId + @JsonProperty(required = true) long id, + @JsonProperty(required = true) String type, + @JsonProperty(required = true) int deviceId ) { public static Hangup from(final MessageEnvelope.Call.Hangup hangup) { @@ -65,8 +66,8 @@ record JsonCallMessage( } public record IceUpdate( - @Schema(required = true) long id, - @Schema(required = true) String opaque + @JsonProperty(required = true) long id, + @JsonProperty(required = true) String opaque ) { public static IceUpdate from(final MessageEnvelope.Call.IceUpdate iceUpdate) { diff --git a/src/main/java/org/asamk/signal/json/JsonContact.java b/src/main/java/org/asamk/signal/json/JsonContact.java index 4c0c2106..108706e7 100644 --- a/src/main/java/org/asamk/signal/json/JsonContact.java +++ b/src/main/java/org/asamk/signal/json/JsonContact.java @@ -1,48 +1,50 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import java.util.List; -@Schema(name = "Contact") +@JsonSchema(title = "Contact") public record JsonContact( - @Schema(required = true) String number, - @Schema(required = true) String uuid, - @Schema(required = true) String username, - @Schema(required = true) String name, - @Schema(required = true) String givenName, - @Schema(required = true) String familyName, - @Schema(required = true) String nickName, - @Schema(required = true) String nickGivenName, - @Schema(required = true) String nickFamilyName, - @Schema(required = true) String note, - @Schema(required = true) String color, - @Schema(required = true) boolean isBlocked, - @Schema(required = true) boolean isHidden, - @Schema(required = true) int messageExpirationTime, - @Schema(required = true) boolean profileSharing, - @Schema(required = true) boolean unregistered, - @Schema(required = true) JsonProfile profile, + @JsonProperty(required = true) String number, + @JsonProperty(required = true) String uuid, + @JsonProperty(required = true) String username, + @JsonProperty(required = true) String name, + @JsonProperty(required = true) String givenName, + @JsonProperty(required = true) String familyName, + @JsonProperty(required = true) String nickName, + @JsonProperty(required = true) String nickGivenName, + @JsonProperty(required = true) String nickFamilyName, + @JsonProperty(required = true) String note, + @JsonProperty(required = true) String color, + @JsonProperty(required = true) boolean isBlocked, + @JsonProperty(required = true) boolean isHidden, + @JsonProperty(required = true) int messageExpirationTime, + @JsonProperty(required = true) boolean profileSharing, + @JsonProperty(required = true) boolean unregistered, + @JsonProperty(required = true) JsonProfile profile, @JsonInclude(JsonInclude.Include.NON_NULL) JsonInternal internal ) { - @Schema(name = "Profile") + @JsonSchema(title = "Profile") public record JsonProfile( - @Schema(required = true) long lastUpdateTimestamp, - @Schema(required = true) String givenName, - @Schema(required = true) String familyName, - @Schema(required = true) String about, - @Schema(required = true) String aboutEmoji, - @Schema(required = true) boolean hasAvatar, - @Schema(required = true) String mobileCoinAddress + @JsonProperty(required = true) long lastUpdateTimestamp, + @JsonProperty(required = true) String givenName, + @JsonProperty(required = true) String familyName, + @JsonProperty(required = true) String about, + @JsonProperty(required = true) String aboutEmoji, + @JsonProperty(required = true) boolean hasAvatar, + @JsonProperty(required = true) String mobileCoinAddress ) {} - @Schema(name = "Internal") + @JsonSchema(title = "Internal") public record JsonInternal( - @Schema(required = true) List capabilities, - @Schema(required = true) String unidentifiedAccessMode, - @Schema(required = true) Boolean sharesPhoneNumber, - @Schema(required = true) Boolean discoverableByPhonenumber + @JsonProperty(required = true) List capabilities, + @JsonProperty(required = true) String unidentifiedAccessMode, + @JsonProperty(required = true) Boolean sharesPhoneNumber, + @JsonProperty(required = true) Boolean discoverableByPhonenumber ) {} } diff --git a/src/main/java/org/asamk/signal/json/JsonContactAddress.java b/src/main/java/org/asamk/signal/json/JsonContactAddress.java index 935ed816..8c86c318 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactAddress.java +++ b/src/main/java/org/asamk/signal/json/JsonContactAddress.java @@ -1,20 +1,22 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Util; -@Schema(name = "ContactAddress") +@JsonSchema(title = "ContactAddress") public record JsonContactAddress( - @Schema(required = true) String type, - @Schema(required = true) String label, - @Schema(required = true) String street, - @Schema(required = true) String pobox, - @Schema(required = true) String neighborhood, - @Schema(required = true) String city, - @Schema(required = true) String region, - @Schema(required = true) String postcode, - @Schema(required = true) String country + @JsonProperty(required = true) String type, + @JsonProperty(required = true) String label, + @JsonProperty(required = true) String street, + @JsonProperty(required = true) String pobox, + @JsonProperty(required = true) String neighborhood, + @JsonProperty(required = true) String city, + @JsonProperty(required = true) String region, + @JsonProperty(required = true) String postcode, + @JsonProperty(required = true) String country ) { static JsonContactAddress from(MessageEnvelope.Data.SharedContact.Address address) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactAvatar.java b/src/main/java/org/asamk/signal/json/JsonContactAvatar.java index 4477228b..56a92c08 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactAvatar.java +++ b/src/main/java/org/asamk/signal/json/JsonContactAvatar.java @@ -1,12 +1,14 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; -@Schema(name = "ContactAvatar") +@JsonSchema(title = "ContactAvatar") public record JsonContactAvatar( - @Schema(required = true) JsonAttachment attachment, - @Schema(required = true) boolean isProfile + @JsonProperty(required = true) JsonAttachment attachment, + @JsonProperty(required = true) boolean isProfile ) { static JsonContactAvatar from(MessageEnvelope.Data.SharedContact.Avatar avatar) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactEmail.java b/src/main/java/org/asamk/signal/json/JsonContactEmail.java index 2dc829dd..e995f4e5 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactEmail.java +++ b/src/main/java/org/asamk/signal/json/JsonContactEmail.java @@ -1,14 +1,16 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Util; -@Schema(name = "ContactEmail") +@JsonSchema(title = "ContactEmail") public record JsonContactEmail( - @Schema(required = true) String value, - @Schema(required = true) String type, - @Schema(required = true) String label + @JsonProperty(required = true) String value, + @JsonProperty(required = true) String type, + @JsonProperty(required = true) String label ) { static JsonContactEmail from(MessageEnvelope.Data.SharedContact.Email email) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactName.java b/src/main/java/org/asamk/signal/json/JsonContactName.java index db08918b..02124807 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactName.java +++ b/src/main/java/org/asamk/signal/json/JsonContactName.java @@ -1,17 +1,19 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Util; -@Schema(name = "ContactName") +@JsonSchema(title = "ContactName") public record JsonContactName( - @Schema(required = true) String nickname, - @Schema(required = true) String given, - @Schema(required = true) String family, - @Schema(required = true) String prefix, - @Schema(required = true) String suffix, - @Schema(required = true) String middle + @JsonProperty(required = true) String nickname, + @JsonProperty(required = true) String given, + @JsonProperty(required = true) String family, + @JsonProperty(required = true) String prefix, + @JsonProperty(required = true) String suffix, + @JsonProperty(required = true) String middle ) { static JsonContactName from(MessageEnvelope.Data.SharedContact.Name name) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactPhone.java b/src/main/java/org/asamk/signal/json/JsonContactPhone.java index 960232a0..6f567892 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactPhone.java +++ b/src/main/java/org/asamk/signal/json/JsonContactPhone.java @@ -1,14 +1,16 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Util; -@Schema(name = "ContactPhone") +@JsonSchema(title = "ContactPhone") public record JsonContactPhone( - @Schema(required = true) String value, - @Schema(required = true) String type, - @Schema(required = true) String label + @JsonProperty(required = true) String value, + @JsonProperty(required = true) String type, + @JsonProperty(required = true) String label ) { static JsonContactPhone from(MessageEnvelope.Data.SharedContact.Phone phone) { diff --git a/src/main/java/org/asamk/signal/json/JsonDataMessage.java b/src/main/java/org/asamk/signal/json/JsonDataMessage.java index 27681ecc..4f922089 100644 --- a/src/main/java/org/asamk/signal/json/JsonDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonDataMessage.java @@ -1,18 +1,20 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; -@Schema(name = "DataMessage") +@JsonSchema(title = "DataMessage") record JsonDataMessage( - @Schema(required = true) long timestamp, - @Schema(required = true) String message, - @Schema(required = true) Integer expiresInSeconds, + @JsonProperty(required = true) long timestamp, + @JsonProperty(required = true) String message, + @JsonProperty(required = true) Integer expiresInSeconds, @JsonInclude(JsonInclude.Include.NON_NULL) Boolean isExpirationUpdate, @JsonInclude(JsonInclude.Include.NON_NULL) Boolean viewOnce, @JsonInclude(JsonInclude.Include.NON_NULL) JsonReaction reaction, diff --git a/src/main/java/org/asamk/signal/json/JsonEditMessage.java b/src/main/java/org/asamk/signal/json/JsonEditMessage.java index 0d58e793..7367a3fa 100644 --- a/src/main/java/org/asamk/signal/json/JsonEditMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonEditMessage.java @@ -1,13 +1,15 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; -@Schema(name = "EditMessage") +@JsonSchema(title = "EditMessage") record JsonEditMessage( - @Schema(required = true) long targetSentTimestamp, - @Schema(required = true) JsonDataMessage dataMessage + @JsonProperty(required = true) long targetSentTimestamp, + @JsonProperty(required = true) JsonDataMessage dataMessage ) { static JsonEditMessage from(MessageEnvelope.Edit editMessage, Manager m) { diff --git a/src/main/java/org/asamk/signal/json/JsonError.java b/src/main/java/org/asamk/signal/json/JsonError.java index f404d1af..feb75095 100644 --- a/src/main/java/org/asamk/signal/json/JsonError.java +++ b/src/main/java/org/asamk/signal/json/JsonError.java @@ -1,9 +1,11 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; -@Schema(name = "Error") -public record JsonError(@Schema(required = true) String message, @Schema(required = true) String type) { + +@JsonSchema(title = "Error") +public record JsonError(@JsonProperty(required = true) String message, @JsonProperty(required = true) String type) { public static JsonError from(Throwable exception) { return new JsonError(exception.getMessage(), exception.getClass().getSimpleName()); diff --git a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java index f14e524d..c3120e9f 100644 --- a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java +++ b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java @@ -1,15 +1,17 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; -@Schema(name = "GroupInfo") +@JsonSchema(title = "GroupInfo") record JsonGroupInfo( - @Schema(required = true) String groupId, - @Schema(required = true) String groupName, - @Schema(required = true) int revision, - @Schema(required = true) String type + @JsonProperty(required = true) String groupId, + @JsonProperty(required = true) String groupName, + @JsonProperty(required = true) int revision, + @JsonProperty(required = true) String type ) { static JsonGroupInfo from(MessageEnvelope.Data.GroupContext groupContext, Manager m) { diff --git a/src/main/java/org/asamk/signal/json/JsonMention.java b/src/main/java/org/asamk/signal/json/JsonMention.java index 6178f9c9..91320e5d 100644 --- a/src/main/java/org/asamk/signal/json/JsonMention.java +++ b/src/main/java/org/asamk/signal/json/JsonMention.java @@ -1,17 +1,19 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; -@Schema(name = "Mention") +@JsonSchema(title = "Mention") public record JsonMention( @Deprecated String name, - @Schema(required = true) String number, - @Schema(required = true) String uuid, - @Schema(required = true) int start, - @Schema(required = true) int length + @JsonProperty(required = true) String number, + @JsonProperty(required = true) String uuid, + @JsonProperty(required = true) int start, + @JsonProperty(required = true) int length ) { static JsonMention from(MessageEnvelope.Data.Mention mention) { diff --git a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java index f1455500..afdfed91 100644 --- a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -1,7 +1,9 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; @@ -11,16 +13,16 @@ import org.asamk.signal.manager.api.UntrustedIdentityException; import java.util.UUID; -@Schema(name = "MessageEnvelope") +@JsonSchema(title = "MessageEnvelope") public record JsonMessageEnvelope( @Deprecated String source, - @Schema(required = true) String sourceNumber, - @Schema(required = true) String sourceUuid, - @Schema(required = true) String sourceName, - @Schema(required = true) Integer sourceDevice, - @Schema(required = true) long timestamp, - @Schema(required = true) long serverReceivedTimestamp, - @Schema(required = true) long serverDeliveredTimestamp, + @JsonProperty(required = true) String sourceNumber, + @JsonProperty(required = true) String sourceUuid, + @JsonProperty(required = true) String sourceName, + @JsonProperty(required = true) Integer sourceDevice, + @JsonProperty(required = true) long timestamp, + @JsonProperty(required = true) long serverReceivedTimestamp, + @JsonProperty(required = true) long serverDeliveredTimestamp, @JsonInclude(JsonInclude.Include.NON_NULL) JsonDataMessage dataMessage, @JsonInclude(JsonInclude.Include.NON_NULL) JsonEditMessage editMessage, @JsonInclude(JsonInclude.Include.NON_NULL) JsonStoryMessage storyMessage, diff --git a/src/main/java/org/asamk/signal/json/JsonOpenApiController.java b/src/main/java/org/asamk/signal/json/JsonOpenApiController.java deleted file mode 100644 index 6c4cb84e..00000000 --- a/src/main/java/org/asamk/signal/json/JsonOpenApiController.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.asamk.signal.json; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/openapi/json") -class JsonOpenApiController { - - @GetMapping("/models") - @Operation(summary = "Signal JSON model schema catalog") - @ApiResponse( - responseCode = "200", description = "Catalog of Signal JSON model schemas", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = JsonSchemaCatalog.class) - ) - ) - JsonSchemaCatalog getModels() { - return new JsonSchemaCatalog(); - } -} diff --git a/src/main/java/org/asamk/signal/json/JsonPayment.java b/src/main/java/org/asamk/signal/json/JsonPayment.java index 4f88abbf..685b2e8f 100644 --- a/src/main/java/org/asamk/signal/json/JsonPayment.java +++ b/src/main/java/org/asamk/signal/json/JsonPayment.java @@ -1,12 +1,14 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; -@Schema(name = "Payment") +@JsonSchema(title = "Payment") public record JsonPayment( - @Schema(required = true) String note, - @Schema(required = true) byte[] receipt + @JsonProperty(required = true) String note, + @JsonProperty(required = true) byte[] receipt ) { static JsonPayment from(MessageEnvelope.Data.Payment payment) { diff --git a/src/main/java/org/asamk/signal/json/JsonPinMessage.java b/src/main/java/org/asamk/signal/json/JsonPinMessage.java index f4810283..5559550d 100644 --- a/src/main/java/org/asamk/signal/json/JsonPinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonPinMessage.java @@ -1,17 +1,19 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; -@Schema(name = "PinMessage") +@JsonSchema(title = "PinMessage") public record JsonPinMessage( @Deprecated String targetAuthor, - @Schema(required = true) String targetAuthorNumber, - @Schema(required = true) String targetAuthorUuid, - @Schema(required = true) long targetSentTimestamp, - @Schema(required = true) long pinDurationSeconds + @JsonProperty(required = true) String targetAuthorNumber, + @JsonProperty(required = true) String targetAuthorUuid, + @JsonProperty(required = true) long targetSentTimestamp, + @JsonProperty(required = true) long pinDurationSeconds ) { static JsonPinMessage from(MessageEnvelope.Data.PinMessage pinMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonPollCreate.java b/src/main/java/org/asamk/signal/json/JsonPollCreate.java index 26ceca0b..c4fe927c 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollCreate.java +++ b/src/main/java/org/asamk/signal/json/JsonPollCreate.java @@ -1,15 +1,17 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; -@Schema(name = "PollCreate") +@JsonSchema(title = "PollCreate") public record JsonPollCreate( - @Schema(required = true) String question, - @Schema(required = true) boolean allowMultiple, - @Schema(required = true) List options + @JsonProperty(required = true) String question, + @JsonProperty(required = true) boolean allowMultiple, + @JsonProperty(required = true) List options ) { static JsonPollCreate from(MessageEnvelope.Data.PollCreate pollCreate) { diff --git a/src/main/java/org/asamk/signal/json/JsonPollTerminate.java b/src/main/java/org/asamk/signal/json/JsonPollTerminate.java index 09430d0c..a2bed429 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollTerminate.java +++ b/src/main/java/org/asamk/signal/json/JsonPollTerminate.java @@ -1,10 +1,12 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; -@Schema(name = "PollTerminate") -public record JsonPollTerminate(@Schema(required = true) long targetSentTimestamp) { +@JsonSchema(title = "PollTerminate") +public record JsonPollTerminate(@JsonProperty(required = true) long targetSentTimestamp) { static JsonPollTerminate from(MessageEnvelope.Data.PollTerminate pollTerminate) { final var targetSentTimestamp = pollTerminate.targetSentTimestamp(); diff --git a/src/main/java/org/asamk/signal/json/JsonPollVote.java b/src/main/java/org/asamk/signal/json/JsonPollVote.java index a151af41..9ae8fc07 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollVote.java +++ b/src/main/java/org/asamk/signal/json/JsonPollVote.java @@ -1,19 +1,21 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; import java.util.UUID; -@Schema(name = "PollVote") +@JsonSchema(title = "PollVote") public record JsonPollVote( @Deprecated String author, - @Schema(required = true) String authorNumber, - @Schema(required = true) String authorUuid, - @Schema(required = true) long targetSentTimestamp, - @Schema(required = true) List optionIndexes, - @Schema(required = true) int voteCount + @JsonProperty(required = true) String authorNumber, + @JsonProperty(required = true) String authorUuid, + @JsonProperty(required = true) long targetSentTimestamp, + @JsonProperty(required = true) List optionIndexes, + @JsonProperty(required = true) int voteCount ) { static JsonPollVote from(MessageEnvelope.Data.PollVote pollVote) { diff --git a/src/main/java/org/asamk/signal/json/JsonPreview.java b/src/main/java/org/asamk/signal/json/JsonPreview.java index b6147433..1e471afd 100644 --- a/src/main/java/org/asamk/signal/json/JsonPreview.java +++ b/src/main/java/org/asamk/signal/json/JsonPreview.java @@ -1,14 +1,16 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; -@Schema(name = "Preview") +@JsonSchema(title = "Preview") public record JsonPreview( - @Schema(required = true) String url, - @Schema(required = true) String title, - @Schema(required = true) String description, - @Schema(required = true) JsonAttachment image + @JsonProperty(required = true) String url, + @JsonProperty(required = true) String title, + @JsonProperty(required = true) String description, + @JsonProperty(required = true) JsonAttachment image ) { static JsonPreview from(MessageEnvelope.Data.Preview preview) { diff --git a/src/main/java/org/asamk/signal/json/JsonQuote.java b/src/main/java/org/asamk/signal/json/JsonQuote.java index f659c435..45213777 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuote.java +++ b/src/main/java/org/asamk/signal/json/JsonQuote.java @@ -1,22 +1,23 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; import java.util.UUID; -@Schema(name = "Quote") +@JsonSchema(title = "Quote") public record JsonQuote( - @Schema(required = true) long id, + @JsonProperty(required = true) long id, @Deprecated String author, - @Schema(required = true) String authorNumber, - @Schema(required = true) String authorUuid, - @Schema(required = true) String text, + @JsonProperty(required = true) String authorNumber, + @JsonProperty(required = true) String authorUuid, + @JsonProperty(required = true) String text, @JsonInclude(JsonInclude.Include.NON_NULL) List mentions, - @Schema(required = true) List attachments, + @JsonProperty(required = true) List attachments, @JsonInclude(JsonInclude.Include.NON_NULL) List textStyles ) { diff --git a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java index a2120106..d33dbcf7 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java @@ -1,14 +1,15 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; -@Schema(name = "QuotedAttachment") +@JsonSchema(title = "QuotedAttachment") public record JsonQuotedAttachment( - @Schema(required = true) String contentType, - @Schema(required = true) String filename, + @JsonProperty(required = true) String contentType, + @JsonProperty(required = true) String filename, @JsonInclude(JsonInclude.Include.NON_NULL) JsonAttachment thumbnail ) { diff --git a/src/main/java/org/asamk/signal/json/JsonReaction.java b/src/main/java/org/asamk/signal/json/JsonReaction.java index ceffcc29..d1fb6c18 100644 --- a/src/main/java/org/asamk/signal/json/JsonReaction.java +++ b/src/main/java/org/asamk/signal/json/JsonReaction.java @@ -1,18 +1,20 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; -@Schema(name = "Reaction") +@JsonSchema(title = "Reaction") public record JsonReaction( - @Schema(required = true) String emoji, + @JsonProperty(required = true) String emoji, @Deprecated String targetAuthor, - @Schema(required = true) String targetAuthorNumber, - @Schema(required = true) String targetAuthorUuid, - @Schema(required = true) long targetSentTimestamp, - @Schema(required = true) boolean isRemove + @JsonProperty(required = true) String targetAuthorNumber, + @JsonProperty(required = true) String targetAuthorUuid, + @JsonProperty(required = true) long targetSentTimestamp, + @JsonProperty(required = true) boolean isRemove ) { static JsonReaction from(MessageEnvelope.Data.Reaction reaction) { diff --git a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java index d0ea0a49..d019c0d4 100644 --- a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java @@ -1,17 +1,19 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; -@Schema(name = "ReceiptMessage") +@JsonSchema(title = "ReceiptMessage") record JsonReceiptMessage( - @Schema(required = true) long when, - @Schema(required = true) boolean isDelivery, - @Schema(required = true) boolean isRead, - @Schema(required = true) boolean isViewed, - @Schema(required = true) List timestamps + @JsonProperty(required = true) long when, + @JsonProperty(required = true) boolean isDelivery, + @JsonProperty(required = true) boolean isRead, + @JsonProperty(required = true) boolean isViewed, + @JsonProperty(required = true) List timestamps ) { static JsonReceiptMessage from(MessageEnvelope.Receipt receiptMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java b/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java index 200b6ece..7a5c5e70 100644 --- a/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java +++ b/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java @@ -1,15 +1,17 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.RecipientAddress; import java.util.UUID; -@Schema(name = "RecipientAddress") +@JsonSchema(title = "RecipientAddress") public record JsonRecipientAddress( - @Schema(required = true) String uuid, - @Schema(required = true) String number, - @Schema(required = true) String username + @JsonProperty(required = true) String uuid, + @JsonProperty(required = true) String number, + @JsonProperty(required = true) String username ) { public static JsonRecipientAddress from(RecipientAddress address) { diff --git a/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java b/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java index 58c572db..f29c961e 100644 --- a/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java +++ b/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java @@ -1,6 +1,7 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; -@Schema(name = "RemoteDelete") -record JsonRemoteDelete(@Schema(required = true) long timestamp) {} +@JsonSchema(title = "RemoteDelete") +record JsonRemoteDelete(@JsonProperty(required = true) long timestamp) {} diff --git a/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java b/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java index a2ecace5..8f711f8b 100644 --- a/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java +++ b/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java @@ -1,9 +1,10 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import io.micronaut.jsonschema.JsonSchema; + import java.util.List; -@Schema(name = "SchemaCatalog") +@JsonSchema(title = "SchemaCatalog") public class JsonSchemaCatalog { public JsonAdminDelete adminDelete; diff --git a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java index dff92811..4ad591cd 100644 --- a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java +++ b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java @@ -1,16 +1,17 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.GroupId; import org.asamk.signal.manager.api.SendMessageResult; -@Schema(name = "SendMessageResult") +@JsonSchema(title = "SendMessageResult") public record JsonSendMessageResult( - @Schema(required = true) JsonRecipientAddress recipientAddress, + @JsonProperty(required = true) JsonRecipientAddress recipientAddress, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId, - @Schema(required = true) Type type, + @JsonProperty(required = true) Type type, @JsonInclude(JsonInclude.Include.NON_NULL) String token, @JsonInclude(JsonInclude.Include.NON_NULL) Long retryAfterSeconds ) { diff --git a/src/main/java/org/asamk/signal/json/JsonSharedContact.java b/src/main/java/org/asamk/signal/json/JsonSharedContact.java index 5e55efb9..677f38ea 100644 --- a/src/main/java/org/asamk/signal/json/JsonSharedContact.java +++ b/src/main/java/org/asamk/signal/json/JsonSharedContact.java @@ -1,20 +1,21 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; -@Schema(name = "SharedContact") +@JsonSchema(title = "SharedContact") public record JsonSharedContact( - @Schema(required = true) JsonContactName name, + @JsonProperty(required = true) JsonContactName name, @JsonInclude(JsonInclude.Include.NON_NULL) JsonContactAvatar avatar, @JsonInclude(JsonInclude.Include.NON_NULL) List phone, @JsonInclude(JsonInclude.Include.NON_NULL) List email, @JsonInclude(JsonInclude.Include.NON_NULL) List address, - @Schema(required = true) String organization + @JsonProperty(required = true) String organization ) { static JsonSharedContact from(MessageEnvelope.Data.SharedContact contact) { diff --git a/src/main/java/org/asamk/signal/json/JsonSticker.java b/src/main/java/org/asamk/signal/json/JsonSticker.java index aac10a03..2e800b5e 100644 --- a/src/main/java/org/asamk/signal/json/JsonSticker.java +++ b/src/main/java/org/asamk/signal/json/JsonSticker.java @@ -1,13 +1,15 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Hex; -@Schema(name = "Sticker") +@JsonSchema(title = "Sticker") public record JsonSticker( - @Schema(required = true) String packId, - @Schema(required = true) int stickerId + @JsonProperty(required = true) String packId, + @JsonProperty(required = true) int stickerId ) { static JsonSticker from(MessageEnvelope.Data.Sticker sticker) { diff --git a/src/main/java/org/asamk/signal/json/JsonStoryContext.java b/src/main/java/org/asamk/signal/json/JsonStoryContext.java index ddbfc5b0..8bd7d972 100644 --- a/src/main/java/org/asamk/signal/json/JsonStoryContext.java +++ b/src/main/java/org/asamk/signal/json/JsonStoryContext.java @@ -1,15 +1,17 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; -@Schema(name = "StoryContext") +@JsonSchema(title = "StoryContext") record JsonStoryContext( - @Schema(required = true) String authorNumber, - @Schema(required = true) String authorUuid, - @Schema(required = true) long sentTimestamp + @JsonProperty(required = true) String authorNumber, + @JsonProperty(required = true) String authorUuid, + @JsonProperty(required = true) long sentTimestamp ) { static JsonStoryContext from(MessageEnvelope.Data.StoryContext storyContext) { diff --git a/src/main/java/org/asamk/signal/json/JsonStoryMessage.java b/src/main/java/org/asamk/signal/json/JsonStoryMessage.java index 38613c9d..ec082589 100644 --- a/src/main/java/org/asamk/signal/json/JsonStoryMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonStoryMessage.java @@ -1,7 +1,8 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.Color; import org.asamk.signal.manager.api.GroupId; @@ -9,9 +10,9 @@ import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; -@Schema(name = "StoryMessage") +@JsonSchema(title = "StoryMessage") record JsonStoryMessage( - @Schema(required = true) boolean allowsReplies, + @JsonProperty(required = true) boolean allowsReplies, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId, @JsonInclude(JsonInclude.Include.NON_NULL) JsonAttachment fileAttachment, @JsonInclude(JsonInclude.Include.NON_NULL) TextAttachment textAttachment @@ -25,7 +26,7 @@ record JsonStoryMessage( } public record TextAttachment( - @Schema(required = true) String text, + @JsonProperty(required = true) String text, @JsonInclude(JsonInclude.Include.NON_NULL) String style, @JsonInclude(JsonInclude.Include.NON_NULL) String textForegroundColor, @JsonInclude(JsonInclude.Include.NON_NULL) String textBackgroundColor, @@ -45,11 +46,11 @@ record JsonStoryMessage( } public record Gradient( - @Schema(required = true) String startColor, - @Schema(required = true) String endColor, - @Schema(required = true) List colors, - @Schema(required = true) List positions, - @Schema(required = true) Integer angle + @JsonProperty(required = true) String startColor, + @JsonProperty(required = true) String endColor, + @JsonProperty(required = true) List colors, + @JsonProperty(required = true) List positions, + @JsonProperty(required = true) Integer angle ) { static Gradient from(MessageEnvelope.Story.TextAttachment.Gradient gradient) { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java index 4ce140df..f6623a0a 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java @@ -1,8 +1,9 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonUnwrapped; -import io.swagger.v3.oas.annotations.media.Schema; +import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; @@ -10,13 +11,13 @@ import org.asamk.signal.manager.api.RecipientAddress; import java.util.UUID; -@Schema(name = "SyncDataMessage") +@JsonSchema(title = "SyncDataMessage") record JsonSyncDataMessage( @Deprecated String destination, - @Schema(required = true) String destinationNumber, - @Schema(required = true) String destinationUuid, + @JsonProperty(required = true) String destinationNumber, + @JsonProperty(required = true) String destinationUuid, @JsonInclude(JsonInclude.Include.NON_NULL) JsonEditMessage editMessage, - @Schema(required = true) @JsonUnwrapped JsonDataMessage dataMessage + @JsonProperty(required = true) @JsonUnwrapped JsonDataMessage dataMessage ) { static JsonSyncDataMessage from(MessageEnvelope.Sync.Sent transcriptMessage, Manager m) { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncMessage.java index 3447a526..edd2ae6f 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncMessage.java @@ -9,7 +9,8 @@ import org.asamk.signal.manager.api.RecipientAddress; import java.util.List; -import io.swagger.v3.oas.annotations.media.Schema; +import io.micronaut.jsonschema.JsonSchema; + enum JsonSyncMessageType { CONTACTS_SYNC, @@ -17,7 +18,7 @@ enum JsonSyncMessageType { REQUEST_SYNC } -@Schema(name = "SyncMessage") +@JsonSchema(title = "SyncMessage") record JsonSyncMessage( @JsonInclude(JsonInclude.Include.NON_NULL) JsonSyncDataMessage sentMessage, @JsonInclude(JsonInclude.Include.NON_NULL) JsonSyncStoryMessage sentStoryMessage, diff --git a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java index cd453327..3aad9e55 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java @@ -1,16 +1,18 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; -@Schema(name = "SyncReadMessage") +@JsonSchema(title = "SyncReadMessage") record JsonSyncReadMessage( @Deprecated String sender, - @Schema(required = true) String senderNumber, - @Schema(required = true) String senderUuid, - @Schema(required = true) long timestamp + @JsonProperty(required = true) String senderNumber, + @JsonProperty(required = true) String senderUuid, + @JsonProperty(required = true) long timestamp ) { static JsonSyncReadMessage from(MessageEnvelope.Sync.Read readMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java index 832b3ea1..c8835ee9 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java @@ -1,17 +1,18 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonUnwrapped; -import io.swagger.v3.oas.annotations.media.Schema; +import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; -@Schema(name = "SyncStoryMessage") +@JsonSchema(title = "SyncStoryMessage") record JsonSyncStoryMessage( - @Schema(required = true) String destinationNumber, - @Schema(required = true) String destinationUuid, - @Schema(required = true) @JsonUnwrapped JsonStoryMessage dataMessage + @JsonProperty(required = true) String destinationNumber, + @JsonProperty(required = true) String destinationUuid, + @JsonProperty(required = true) @JsonUnwrapped JsonStoryMessage dataMessage ) { static JsonSyncStoryMessage from(MessageEnvelope.Sync.Sent transcriptMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonTextStyle.java b/src/main/java/org/asamk/signal/json/JsonTextStyle.java index eecee099..780b8418 100644 --- a/src/main/java/org/asamk/signal/json/JsonTextStyle.java +++ b/src/main/java/org/asamk/signal/json/JsonTextStyle.java @@ -1,13 +1,15 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.TextStyle; -@Schema(name = "TextStyle") +@JsonSchema(title = "TextStyle") public record JsonTextStyle( - @Schema(required = true) String style, - @Schema(required = true) int start, - @Schema(required = true) int length + @JsonProperty(required = true) String style, + @JsonProperty(required = true) int start, + @JsonProperty(required = true) int length ) { static JsonTextStyle from(TextStyle textStyle) { diff --git a/src/main/java/org/asamk/signal/json/JsonTypingMessage.java b/src/main/java/org/asamk/signal/json/JsonTypingMessage.java index a4a9346f..ef371b67 100644 --- a/src/main/java/org/asamk/signal/json/JsonTypingMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonTypingMessage.java @@ -1,15 +1,16 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.GroupId; import org.asamk.signal.manager.api.MessageEnvelope; -@Schema(name = "TypingMessage") +@JsonSchema(title = "TypingMessage") record JsonTypingMessage( - @Schema(required = true) String action, - @Schema(required = true) long timestamp, + @JsonProperty(required = true) String action, + @JsonProperty(required = true) long timestamp, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId ) { diff --git a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java index 020c9a45..dca17847 100644 --- a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java @@ -1,16 +1,18 @@ package org.asamk.signal.json; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.jsonschema.JsonSchema; + import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; -@Schema(name = "UnpinMessage") +@JsonSchema(title = "UnpinMessage") public record JsonUnpinMessage( @Deprecated String targetAuthor, - @Schema(required = true) String targetAuthorNumber, - @Schema(required = true) String targetAuthorUuid, - @Schema(required = true) long targetSentTimestamp + @JsonProperty(required = true) String targetAuthorNumber, + @JsonProperty(required = true) String targetAuthorUuid, + @JsonProperty(required = true) long targetSentTimestamp ) { static JsonUnpinMessage from(MessageEnvelope.Data.UnpinMessage unpinMessage) { diff --git a/src/main/java/org/asamk/signal/openapi/OpenApiDocumentationApplication.java b/src/main/java/org/asamk/signal/openapi/OpenApiDocumentationApplication.java deleted file mode 100644 index 74dfb164..00000000 --- a/src/main/java/org/asamk/signal/openapi/OpenApiDocumentationApplication.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.asamk.signal.openapi; - -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.annotations.info.Info; -import org.springdoc.core.models.GroupedOpenApi; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; - -@SpringBootApplication(scanBasePackages = "org.asamk.signal") -@OpenAPIDefinition(info = @Info(title = "signal-cli JSON Models", version = "v1")) -public class OpenApiDocumentationApplication { - - public static void main(String[] args) { - SpringApplication.run(OpenApiDocumentationApplication.class, args); - } - - @Bean - GroupedOpenApi jsonModelsOpenApi() { - return GroupedOpenApi.builder() - .group("json-models") - .packagesToScan("org.asamk.signal.json") - .pathsToMatch("/openapi/json/models") - .build(); - } -} From 5f9fb1da8850df31f86ab3d78e28fe096d63c8a9 Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Fri, 6 Mar 2026 23:29:29 +0100 Subject: [PATCH 09/22] Fix generator for JsonUnwrapped files --- build.gradle.kts | 53 +++++++-- .../asamk/signal/json/JsonSchemaCatalog.java | 56 --------- .../schemas/sync-data-message.schema.json | 111 ++++++++++++++++++ .../META-INF/schemas/sync-message.schema.json | 40 +++++++ .../schemas/sync-story-message.schema.json | 57 +++++++++ 5 files changed, 250 insertions(+), 67 deletions(-) delete mode 100644 src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java create mode 100644 src/main/resources/META-INF/schemas/sync-data-message.schema.json create mode 100644 src/main/resources/META-INF/schemas/sync-message.schema.json create mode 100644 src/main/resources/META-INF/schemas/sync-story-message.schema.json diff --git a/build.gradle.kts b/build.gradle.kts index 357fb3b0..fb27dfe4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -72,6 +72,11 @@ val excludePatterns = mapOf( ) ) +val schemaAnnotationProcessor by configurations.creating { + isCanBeConsumed = false + isCanBeResolved = true +} + dependencies { registerTransform(JarFileExcluder::class) { from.attribute(minified, false).attribute(artifactType, "jar") @@ -82,8 +87,8 @@ dependencies { } } - annotationProcessor(libs.micronaut.json.schema.processor) - annotationProcessor(libs.micronaut.inject.java) + schemaAnnotationProcessor(libs.micronaut.json.schema.processor) + schemaAnnotationProcessor(libs.micronaut.inject.java) implementation(libs.bouncycastle) implementation(libs.jackson.databind) @@ -112,14 +117,6 @@ tasks.withType().configureEach { tasks.withType().configureEach { options.encoding = "UTF-8" - options.compilerArgs.addAll( - listOf( - "-Amicronaut.processing.group=org.asamk", - "-Amicronaut.processing.module=signal-cli", - "-Amicronaut.processing.annotations=org.asamk.signal.json.*", - "-Amicronaut.jsonschema.baseUri=https://example.com/schemas", - ) - ) } tasks.withType { @@ -152,8 +149,42 @@ tasks.register("fatJar", type = Jar::class) { with(tasks.jar.get()) } +val compileJsonSchemas by tasks.registering(JavaCompile::class) { + dependsOn(tasks.compileJava) + + source = sourceSets.main.get().java + include("org/asamk/signal/json/**/*.java") + + // Exclude files with @JsonUnwrapped and files that reference them + exclude("org/asamk/signal/json/JsonSyncDataMessage.java") + exclude("org/asamk/signal/json/JsonSyncStoryMessage.java") + exclude("org/asamk/signal/json/JsonSyncMessage.java") + + classpath = sourceSets.main.get().compileClasspath + files(sourceSets.main.get().java.destinationDirectory) + destinationDirectory.set(layout.buildDirectory.dir("classes/java/schemas")) + + options.annotationProcessorPath = schemaAnnotationProcessor + options.compilerArgs.addAll( + listOf( + "-Amicronaut.processing.group=org.asamk", + "-Amicronaut.processing.module=signal-cli", + "-Amicronaut.processing.annotations=org.asamk.signal.json.*", + "-Amicronaut.jsonschema.baseUri=https://example.com/schemas", + ) + ) + + doLast { + // Copy manual schemas for classes with @JsonUnwrapped + copy { + from("src/main/resources/META-INF/schemas") + into(destinationDirectory.get().dir("META-INF/schemas")) + include("*.schema.json") + } + } +} + tasks.register("genJsonSchemas") { group = "application" description = "Generate JSON schemas using annotation processing" - dependsOn(tasks.compileJava) + dependsOn(compileJsonSchemas) } diff --git a/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java b/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java deleted file mode 100644 index 8f711f8b..00000000 --- a/src/main/java/org/asamk/signal/json/JsonSchemaCatalog.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.asamk.signal.json; - -import io.micronaut.jsonschema.JsonSchema; - -import java.util.List; - -@JsonSchema(title = "SchemaCatalog") -public class JsonSchemaCatalog { - - public JsonAdminDelete adminDelete; - public JsonAttachment attachment; - public JsonAttachmentData attachmentData; - public JsonCallMessage callMessage; - public JsonContact contact; - public JsonContactAddress contactAddress; - public JsonContactAvatar contactAvatar; - public JsonContactEmail contactEmail; - public JsonContactName contactName; - public JsonContactPhone contactPhone; - public JsonDataMessage dataMessage; - public JsonEditMessage editMessage; - public JsonError error; - public JsonGroupInfo groupInfo; - public JsonMention mention; - public JsonMessageEnvelope messageEnvelope; - public JsonPayment payment; - public JsonPinMessage pinMessage; - public JsonPollCreate pollCreate; - public JsonPollTerminate pollTerminate; - public JsonPollVote pollVote; - public JsonPreview preview; - public JsonQuote quote; - public JsonQuotedAttachment quotedAttachment; - public JsonReaction reaction; - public JsonReceiptMessage receiptMessage; - public JsonRecipientAddress recipientAddress; - public JsonRemoteDelete remoteDelete; - public JsonSendMessageResult sendMessageResult; - public JsonSharedContact sharedContact; - public JsonSticker sticker; - public JsonStoryContext storyContext; - public JsonStoryMessage storyMessage; - public JsonSyncDataMessage syncDataMessage; - public JsonSyncMessage syncMessage; - public JsonSyncReadMessage syncReadMessage; - public JsonSyncStoryMessage syncStoryMessage; - public JsonTextStyle textStyle; - public JsonTypingMessage typingMessage; - public JsonUnpinMessage unpinMessage; - - public List attachments; - public List mentions; - public List previews; - public List contacts; - public List textStyles; -} diff --git a/src/main/resources/META-INF/schemas/sync-data-message.schema.json b/src/main/resources/META-INF/schemas/sync-data-message.schema.json new file mode 100644 index 00000000..d3cb4a50 --- /dev/null +++ b/src/main/resources/META-INF/schemas/sync-data-message.schema.json @@ -0,0 +1,111 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://example.com/schemas/sync-data-message.schema.json", + "title": "SyncDataMessage", + "type": "object", + "properties": { + "adminDelete": { + "$ref": "https://example.com/schemas/admin-delete.schema.json" + }, + "attachments": { + "type": "array", + "items": { + "$ref": "https://example.com/schemas/attachment.schema.json" + } + }, + "contacts": { + "type": "array", + "items": { + "$ref": "https://example.com/schemas/shared-contact.schema.json" + } + }, + "destination": { + "type": "string" + }, + "destinationNumber": { + "type": "string" + }, + "destinationUuid": { + "type": "string" + }, + "editMessage": { + "$ref": "https://example.com/schemas/edit-message.schema.json" + }, + "expiresInSeconds": { + "type": "integer" + }, + "groupInfo": { + "$ref": "https://example.com/schemas/group-info.schema.json" + }, + "isExpirationUpdate": { + "type": "boolean" + }, + "mentions": { + "type": "array", + "items": { + "$ref": "https://example.com/schemas/mention.schema.json" + } + }, + "message": { + "type": "string" + }, + "payment": { + "$ref": "https://example.com/schemas/payment.schema.json" + }, + "pinMessage": { + "$ref": "https://example.com/schemas/pin-message.schema.json" + }, + "pollCreate": { + "$ref": "https://example.com/schemas/poll-create.schema.json" + }, + "pollTerminate": { + "$ref": "https://example.com/schemas/poll-terminate.schema.json" + }, + "pollVote": { + "$ref": "https://example.com/schemas/poll-vote.schema.json" + }, + "previews": { + "type": "array", + "items": { + "$ref": "https://example.com/schemas/preview.schema.json" + } + }, + "quote": { + "$ref": "https://example.com/schemas/quote.schema.json" + }, + "reaction": { + "$ref": "https://example.com/schemas/reaction.schema.json" + }, + "remoteDelete": { + "$ref": "https://example.com/schemas/remote-delete.schema.json" + }, + "sticker": { + "$ref": "https://example.com/schemas/sticker.schema.json" + }, + "storyContext": { + "$ref": "https://example.com/schemas/story-context.schema.json" + }, + "textStyles": { + "type": "array", + "items": { + "$ref": "https://example.com/schemas/text-style.schema.json" + } + }, + "timestamp": { + "type": "integer" + }, + "unpinMessage": { + "$ref": "https://example.com/schemas/unpin-message.schema.json" + }, + "viewOnce": { + "type": "boolean" + } + }, + "required": [ + "destinationNumber", + "destinationUuid", + "message", + "expiresInSeconds", + "timestamp" + ] +} diff --git a/src/main/resources/META-INF/schemas/sync-message.schema.json b/src/main/resources/META-INF/schemas/sync-message.schema.json new file mode 100644 index 00000000..26b2a1c7 --- /dev/null +++ b/src/main/resources/META-INF/schemas/sync-message.schema.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://example.com/schemas/sync-message.schema.json", + "title": "SyncMessage", + "type": "object", + "properties": { + "blockedGroupIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "blockedNumbers": { + "type": "array", + "items": { + "type": "string" + } + }, + "readMessages": { + "type": "array", + "items": { + "$ref": "https://example.com/schemas/sync-read-message.schema.json" + } + }, + "sentMessage": { + "$ref": "https://example.com/schemas/sync-data-message.schema.json" + }, + "sentStoryMessage": { + "$ref": "https://example.com/schemas/sync-story-message.schema.json" + }, + "type": { + "type": "string", + "enum": [ + "CONTACTS_SYNC", + "GROUPS_SYNC", + "REQUEST_SYNC" + ] + } + } +} diff --git a/src/main/resources/META-INF/schemas/sync-story-message.schema.json b/src/main/resources/META-INF/schemas/sync-story-message.schema.json new file mode 100644 index 00000000..d17a775c --- /dev/null +++ b/src/main/resources/META-INF/schemas/sync-story-message.schema.json @@ -0,0 +1,57 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://example.com/schemas/sync-story-message.schema.json", + "title": "SyncStoryMessage", + "type": "object", + "properties": { + "allowsReplies": { + "type": "boolean" + }, + "destinationNumber": { + "type": "string" + }, + "destinationUuid": { + "type": "string" + }, + "fileAttachment": { + "$ref": "https://example.com/schemas/attachment.schema.json" + }, + "groupId": { + "type": "string" + }, + "textAttachment": { + "type": "object", + "properties": { + "backgroundColor": { + "type": "string" + }, + "backgroundGradient": { + "type": "object" + }, + "preview": { + "$ref": "https://example.com/schemas/preview.schema.json" + }, + "style": { + "type": "string" + }, + "text": { + "type": "string" + }, + "textBackgroundColor": { + "type": "string" + }, + "textForegroundColor": { + "type": "string" + } + }, + "required": [ + "text" + ] + } + }, + "required": [ + "destinationNumber", + "destinationUuid", + "allowsReplies" + ] +} From a215294c6846ba57f3f0e320af818255899d473f Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Fri, 6 Mar 2026 23:40:26 +0100 Subject: [PATCH 10/22] Fix layout of manual schemas --- .../schemas/sync-data-message.schema.json | 26 +++---- .../META-INF/schemas/sync-message.schema.json | 76 +++++++++---------- .../schemas/sync-story-message.schema.json | 38 ++++++++-- 3 files changed, 80 insertions(+), 60 deletions(-) diff --git a/src/main/resources/META-INF/schemas/sync-data-message.schema.json b/src/main/resources/META-INF/schemas/sync-data-message.schema.json index d3cb4a50..f61c33a5 100644 --- a/src/main/resources/META-INF/schemas/sync-data-message.schema.json +++ b/src/main/resources/META-INF/schemas/sync-data-message.schema.json @@ -4,6 +4,18 @@ "title": "SyncDataMessage", "type": "object", "properties": { + "destination": { + "type": "string" + }, + "destinationNumber": { + "type": "string" + }, + "destinationUuid": { + "type": "string" + }, + "editMessage": { + "$ref": "https://example.com/schemas/edit-message.schema.json" + }, "adminDelete": { "$ref": "https://example.com/schemas/admin-delete.schema.json" }, @@ -19,18 +31,6 @@ "$ref": "https://example.com/schemas/shared-contact.schema.json" } }, - "destination": { - "type": "string" - }, - "destinationNumber": { - "type": "string" - }, - "destinationUuid": { - "type": "string" - }, - "editMessage": { - "$ref": "https://example.com/schemas/edit-message.schema.json" - }, "expiresInSeconds": { "type": "integer" }, @@ -104,8 +104,6 @@ "required": [ "destinationNumber", "destinationUuid", - "message", - "expiresInSeconds", "timestamp" ] } diff --git a/src/main/resources/META-INF/schemas/sync-message.schema.json b/src/main/resources/META-INF/schemas/sync-message.schema.json index 26b2a1c7..5dc499f7 100644 --- a/src/main/resources/META-INF/schemas/sync-message.schema.json +++ b/src/main/resources/META-INF/schemas/sync-message.schema.json @@ -1,40 +1,40 @@ { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://example.com/schemas/sync-message.schema.json", - "title": "SyncMessage", - "type": "object", - "properties": { - "blockedGroupIds": { - "type": "array", - "items": { - "type": "string" - } - }, - "blockedNumbers": { - "type": "array", - "items": { - "type": "string" - } - }, - "readMessages": { - "type": "array", - "items": { - "$ref": "https://example.com/schemas/sync-read-message.schema.json" - } - }, - "sentMessage": { - "$ref": "https://example.com/schemas/sync-data-message.schema.json" - }, - "sentStoryMessage": { - "$ref": "https://example.com/schemas/sync-story-message.schema.json" - }, - "type": { - "type": "string", - "enum": [ - "CONTACTS_SYNC", - "GROUPS_SYNC", - "REQUEST_SYNC" - ] + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://example.com/schemas/sync-message.schema.json", + "title": "SyncMessage", + "type": "object", + "properties": { + "blockedGroupIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "blockedNumbers": { + "type": "array", + "items": { + "type": "string" + } + }, + "readMessages": { + "type": "array", + "items": { + "$ref": "https://example.com/schemas/sync-read-message.schema.json" + } + }, + "sentMessage": { + "$ref": "https://example.com/schemas/sync-data-message.schema.json" + }, + "sentStoryMessage": { + "$ref": "https://example.com/schemas/sync-story-message.schema.json" + }, + "type": { + "type": "string", + "enum": [ + "CONTACTS_SYNC", + "GROUPS_SYNC", + "REQUEST_SYNC" + ] + } } - } -} +} \ No newline at end of file diff --git a/src/main/resources/META-INF/schemas/sync-story-message.schema.json b/src/main/resources/META-INF/schemas/sync-story-message.schema.json index d17a775c..6dcfec8f 100644 --- a/src/main/resources/META-INF/schemas/sync-story-message.schema.json +++ b/src/main/resources/META-INF/schemas/sync-story-message.schema.json @@ -4,15 +4,15 @@ "title": "SyncStoryMessage", "type": "object", "properties": { - "allowsReplies": { - "type": "boolean" - }, "destinationNumber": { "type": "string" }, "destinationUuid": { "type": "string" }, + "allowsReplies": { + "type": "boolean" + }, "fileAttachment": { "$ref": "https://example.com/schemas/attachment.schema.json" }, @@ -20,13 +20,38 @@ "type": "string" }, "textAttachment": { + "title": "JsonStoryMessage.TextAttachment", "type": "object", "properties": { "backgroundColor": { "type": "string" }, "backgroundGradient": { - "type": "object" + "title": "JsonStoryMessage.TextAttachment.Gradient", + "type": "object", + "properties": { + "angle": { + "type": "integer" + }, + "colors": { + "type": "array", + "items": { + "type": "string" + } + }, + "endColor": { + "type": "string" + }, + "positions": { + "type": "array", + "items": { + "type": "number" + } + }, + "startColor": { + "type": "string" + } + } }, "preview": { "$ref": "https://example.com/schemas/preview.schema.json" @@ -43,10 +68,7 @@ "textForegroundColor": { "type": "string" } - }, - "required": [ - "text" - ] + } } }, "required": [ From 1b3c898415d79a8253d8d7d620f15e39ae76340f Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Sat, 7 Mar 2026 00:10:43 +0100 Subject: [PATCH 11/22] Pretty print the json files --- build.gradle.kts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index fb27dfe4..5f5b7781 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,5 @@ +import groovy.json.JsonOutput + plugins { java application @@ -155,7 +157,8 @@ val compileJsonSchemas by tasks.registering(JavaCompile::class) { source = sourceSets.main.get().java include("org/asamk/signal/json/**/*.java") - // Exclude files with @JsonUnwrapped and files that reference them + // Exclude files with @JsonUnwrapped and files that reference them as that breaks + // the annotation generator exclude("org/asamk/signal/json/JsonSyncDataMessage.java") exclude("org/asamk/signal/json/JsonSyncStoryMessage.java") exclude("org/asamk/signal/json/JsonSyncMessage.java") @@ -174,12 +177,18 @@ val compileJsonSchemas by tasks.registering(JavaCompile::class) { ) doLast { - // Copy manual schemas for classes with @JsonUnwrapped copy { from("src/main/resources/META-INF/schemas") into(destinationDirectory.get().dir("META-INF/schemas")) include("*.schema.json") } + + fileTree(destinationDirectory.get().dir("META-INF/schemas").asFile) { + include("*.schema.json") + }.forEach { schemaFile -> + val prettyJson = JsonOutput.prettyPrint(schemaFile.readText()) + schemaFile.writeText("$prettyJson\n") + } } } From 6135dae3013433c7191a4437905e372533ba3064 Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Sat, 7 Mar 2026 00:30:36 +0100 Subject: [PATCH 12/22] Remove @JsonProperty(required = true) --- .../asamk/signal/json/JsonAdminDelete.java | 6 +- .../org/asamk/signal/json/JsonAttachment.java | 16 ++--- .../asamk/signal/json/JsonAttachmentData.java | 2 +- .../asamk/signal/json/JsonCallMessage.java | 22 +++---- .../org/asamk/signal/json/JsonContact.java | 58 +++++++++---------- .../asamk/signal/json/JsonContactAddress.java | 18 +++--- .../asamk/signal/json/JsonContactAvatar.java | 4 +- .../asamk/signal/json/JsonContactEmail.java | 6 +- .../asamk/signal/json/JsonContactName.java | 12 ++-- .../asamk/signal/json/JsonContactPhone.java | 6 +- .../asamk/signal/json/JsonDataMessage.java | 6 +- .../asamk/signal/json/JsonEditMessage.java | 4 +- .../java/org/asamk/signal/json/JsonError.java | 2 +- .../org/asamk/signal/json/JsonGroupInfo.java | 8 +-- .../org/asamk/signal/json/JsonMention.java | 8 +-- .../signal/json/JsonMessageEnvelope.java | 14 ++--- .../org/asamk/signal/json/JsonPayment.java | 4 +- .../org/asamk/signal/json/JsonPinMessage.java | 8 +-- .../org/asamk/signal/json/JsonPollCreate.java | 6 +- .../asamk/signal/json/JsonPollTerminate.java | 2 +- .../org/asamk/signal/json/JsonPollVote.java | 10 ++-- .../org/asamk/signal/json/JsonPreview.java | 8 +-- .../java/org/asamk/signal/json/JsonQuote.java | 10 ++-- .../signal/json/JsonQuotedAttachment.java | 4 +- .../org/asamk/signal/json/JsonReaction.java | 10 ++-- .../asamk/signal/json/JsonReceiptMessage.java | 10 ++-- .../signal/json/JsonRecipientAddress.java | 6 +- .../asamk/signal/json/JsonRemoteDelete.java | 2 +- .../signal/json/JsonSendMessageResult.java | 4 +- .../asamk/signal/json/JsonSharedContact.java | 4 +- .../org/asamk/signal/json/JsonSticker.java | 4 +- .../asamk/signal/json/JsonStoryContext.java | 6 +- .../asamk/signal/json/JsonStoryMessage.java | 14 ++--- .../signal/json/JsonSyncDataMessage.java | 6 +- .../signal/json/JsonSyncReadMessage.java | 6 +- .../signal/json/JsonSyncStoryMessage.java | 6 +- .../org/asamk/signal/json/JsonTextStyle.java | 6 +- .../asamk/signal/json/JsonTypingMessage.java | 4 +- .../asamk/signal/json/JsonUnpinMessage.java | 6 +- 39 files changed, 169 insertions(+), 169 deletions(-) diff --git a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java index aa815456..4f2aa4b5 100644 --- a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java +++ b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java @@ -9,9 +9,9 @@ import java.util.UUID; @JsonSchema(title = "AdminDelete") public record JsonAdminDelete( @Deprecated String targetAuthor, - @JsonProperty(required = true) String targetAuthorNumber, - @JsonProperty(required = true) String targetAuthorUuid, - @JsonProperty(required = true) long targetSentTimestamp + String targetAuthorNumber, + String targetAuthorUuid, + long targetSentTimestamp ) { static JsonAdminDelete from(MessageEnvelope.Data.AdminDelete adminDelete) { diff --git a/src/main/java/org/asamk/signal/json/JsonAttachment.java b/src/main/java/org/asamk/signal/json/JsonAttachment.java index a7580c6e..a6b9c224 100644 --- a/src/main/java/org/asamk/signal/json/JsonAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachment.java @@ -7,14 +7,14 @@ import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "Attachment") record JsonAttachment( - @JsonProperty(required = true) String contentType, - @JsonProperty(required = true) String filename, - @JsonProperty(required = true) String id, - @JsonProperty(required = true) Long size, - @JsonProperty(required = true) Integer width, - @JsonProperty(required = true) Integer height, - @JsonProperty(required = true) String caption, - @JsonProperty(required = true) Long uploadTimestamp + String contentType, + String filename, + String id, + Long size, + Integer width, + Integer height, + String caption, + Long uploadTimestamp ) { static JsonAttachment from(MessageEnvelope.Data.Attachment attachment) { diff --git a/src/main/java/org/asamk/signal/json/JsonAttachmentData.java b/src/main/java/org/asamk/signal/json/JsonAttachmentData.java index e0ffcc08..cb1ac7e1 100644 --- a/src/main/java/org/asamk/signal/json/JsonAttachmentData.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachmentData.java @@ -6,5 +6,5 @@ import io.micronaut.jsonschema.JsonSchema; @JsonSchema(title = "AttachmentData") public record JsonAttachmentData( - @JsonProperty(required = true) String data + String data ) {} diff --git a/src/main/java/org/asamk/signal/json/JsonCallMessage.java b/src/main/java/org/asamk/signal/json/JsonCallMessage.java index 6170d1df..2debbfb7 100644 --- a/src/main/java/org/asamk/signal/json/JsonCallMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonCallMessage.java @@ -27,9 +27,9 @@ record JsonCallMessage( } record Offer( - @JsonProperty(required = true) long id, - @JsonProperty(required = true) String type, - @JsonProperty(required = true) String opaque + long id, + String type, + String opaque ) { public static Offer from(final MessageEnvelope.Call.Offer offer) { @@ -38,8 +38,8 @@ record JsonCallMessage( } public record Answer( - @JsonProperty(required = true) long id, - @JsonProperty(required = true) String opaque + long id, + String opaque ) { public static Answer from(final MessageEnvelope.Call.Answer answer) { @@ -47,7 +47,7 @@ record JsonCallMessage( } } - public record Busy(@JsonProperty(required = true) long id) { + public record Busy(long id) { public static Busy from(final MessageEnvelope.Call.Busy busy) { return new Busy(busy.id()); @@ -55,9 +55,9 @@ record JsonCallMessage( } public record Hangup( - @JsonProperty(required = true) long id, - @JsonProperty(required = true) String type, - @JsonProperty(required = true) int deviceId + long id, + String type, + int deviceId ) { public static Hangup from(final MessageEnvelope.Call.Hangup hangup) { @@ -66,8 +66,8 @@ record JsonCallMessage( } public record IceUpdate( - @JsonProperty(required = true) long id, - @JsonProperty(required = true) String opaque + long id, + String opaque ) { public static IceUpdate from(final MessageEnvelope.Call.IceUpdate iceUpdate) { diff --git a/src/main/java/org/asamk/signal/json/JsonContact.java b/src/main/java/org/asamk/signal/json/JsonContact.java index 7bc0174f..a401362d 100644 --- a/src/main/java/org/asamk/signal/json/JsonContact.java +++ b/src/main/java/org/asamk/signal/json/JsonContact.java @@ -9,43 +9,43 @@ import java.util.List; @JsonSchema(title = "Contact") public record JsonContact( - @JsonProperty(required = true) String number, - @JsonProperty(required = true) String uuid, - @JsonProperty(required = true) String username, - @JsonProperty(required = true) String name, - @JsonProperty(required = true) String givenName, - @JsonProperty(required = true) String familyName, - @JsonProperty(required = true) String nickName, - @JsonProperty(required = true) String nickGivenName, - @JsonProperty(required = true) String nickFamilyName, - @JsonProperty(required = true) String note, - @JsonProperty(required = true) String color, - @JsonProperty(required = true) boolean isArchived, - @JsonProperty(required = true) boolean isBlocked, - @JsonProperty(required = true) boolean isHidden, - @JsonProperty(required = true) int messageExpirationTime, - @JsonProperty(required = true) boolean profileSharing, - @JsonProperty(required = true) boolean unregistered, - @JsonProperty(required = true) JsonProfile profile, + String number, + String uuid, + String username, + String name, + String givenName, + String familyName, + String nickName, + String nickGivenName, + String nickFamilyName, + String note, + String color, + boolean isArchived, + boolean isBlocked, + boolean isHidden, + int messageExpirationTime, + boolean profileSharing, + boolean unregistered, + JsonProfile profile, @JsonInclude(JsonInclude.Include.NON_NULL) JsonInternal internal ) { @JsonSchema(title = "Profile") public record JsonProfile( - @JsonProperty(required = true) long lastUpdateTimestamp, - @JsonProperty(required = true) String givenName, - @JsonProperty(required = true) String familyName, - @JsonProperty(required = true) String about, - @JsonProperty(required = true) String aboutEmoji, - @JsonProperty(required = true) boolean hasAvatar, - @JsonProperty(required = true) String mobileCoinAddress + long lastUpdateTimestamp, + String givenName, + String familyName, + String about, + String aboutEmoji, + boolean hasAvatar, + String mobileCoinAddress ) {} @JsonSchema(title = "Internal") public record JsonInternal( - @JsonProperty(required = true) List capabilities, - @JsonProperty(required = true) String unidentifiedAccessMode, - @JsonProperty(required = true) Boolean sharesPhoneNumber, - @JsonProperty(required = true) Boolean discoverableByPhonenumber + List capabilities, + String unidentifiedAccessMode, + Boolean sharesPhoneNumber, + Boolean discoverableByPhonenumber ) {} } diff --git a/src/main/java/org/asamk/signal/json/JsonContactAddress.java b/src/main/java/org/asamk/signal/json/JsonContactAddress.java index 8c86c318..acc2d9d6 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactAddress.java +++ b/src/main/java/org/asamk/signal/json/JsonContactAddress.java @@ -8,15 +8,15 @@ import org.asamk.signal.util.Util; @JsonSchema(title = "ContactAddress") public record JsonContactAddress( - @JsonProperty(required = true) String type, - @JsonProperty(required = true) String label, - @JsonProperty(required = true) String street, - @JsonProperty(required = true) String pobox, - @JsonProperty(required = true) String neighborhood, - @JsonProperty(required = true) String city, - @JsonProperty(required = true) String region, - @JsonProperty(required = true) String postcode, - @JsonProperty(required = true) String country + String type, + String label, + String street, + String pobox, + String neighborhood, + String city, + String region, + String postcode, + String country ) { static JsonContactAddress from(MessageEnvelope.Data.SharedContact.Address address) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactAvatar.java b/src/main/java/org/asamk/signal/json/JsonContactAvatar.java index 56a92c08..9adc6d1d 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactAvatar.java +++ b/src/main/java/org/asamk/signal/json/JsonContactAvatar.java @@ -7,8 +7,8 @@ import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "ContactAvatar") public record JsonContactAvatar( - @JsonProperty(required = true) JsonAttachment attachment, - @JsonProperty(required = true) boolean isProfile + JsonAttachment attachment, + boolean isProfile ) { static JsonContactAvatar from(MessageEnvelope.Data.SharedContact.Avatar avatar) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactEmail.java b/src/main/java/org/asamk/signal/json/JsonContactEmail.java index e995f4e5..330e58af 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactEmail.java +++ b/src/main/java/org/asamk/signal/json/JsonContactEmail.java @@ -8,9 +8,9 @@ import org.asamk.signal.util.Util; @JsonSchema(title = "ContactEmail") public record JsonContactEmail( - @JsonProperty(required = true) String value, - @JsonProperty(required = true) String type, - @JsonProperty(required = true) String label + String value, + String type, + String label ) { static JsonContactEmail from(MessageEnvelope.Data.SharedContact.Email email) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactName.java b/src/main/java/org/asamk/signal/json/JsonContactName.java index 02124807..0cc59c13 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactName.java +++ b/src/main/java/org/asamk/signal/json/JsonContactName.java @@ -8,12 +8,12 @@ import org.asamk.signal.util.Util; @JsonSchema(title = "ContactName") public record JsonContactName( - @JsonProperty(required = true) String nickname, - @JsonProperty(required = true) String given, - @JsonProperty(required = true) String family, - @JsonProperty(required = true) String prefix, - @JsonProperty(required = true) String suffix, - @JsonProperty(required = true) String middle + String nickname, + String given, + String family, + String prefix, + String suffix, + String middle ) { static JsonContactName from(MessageEnvelope.Data.SharedContact.Name name) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactPhone.java b/src/main/java/org/asamk/signal/json/JsonContactPhone.java index 6f567892..908593e0 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactPhone.java +++ b/src/main/java/org/asamk/signal/json/JsonContactPhone.java @@ -8,9 +8,9 @@ import org.asamk.signal.util.Util; @JsonSchema(title = "ContactPhone") public record JsonContactPhone( - @JsonProperty(required = true) String value, - @JsonProperty(required = true) String type, - @JsonProperty(required = true) String label + String value, + String type, + String label ) { static JsonContactPhone from(MessageEnvelope.Data.SharedContact.Phone phone) { diff --git a/src/main/java/org/asamk/signal/json/JsonDataMessage.java b/src/main/java/org/asamk/signal/json/JsonDataMessage.java index 4f922089..b796af8d 100644 --- a/src/main/java/org/asamk/signal/json/JsonDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonDataMessage.java @@ -12,9 +12,9 @@ import java.util.List; @JsonSchema(title = "DataMessage") record JsonDataMessage( - @JsonProperty(required = true) long timestamp, - @JsonProperty(required = true) String message, - @JsonProperty(required = true) Integer expiresInSeconds, + long timestamp, + String message, + Integer expiresInSeconds, @JsonInclude(JsonInclude.Include.NON_NULL) Boolean isExpirationUpdate, @JsonInclude(JsonInclude.Include.NON_NULL) Boolean viewOnce, @JsonInclude(JsonInclude.Include.NON_NULL) JsonReaction reaction, diff --git a/src/main/java/org/asamk/signal/json/JsonEditMessage.java b/src/main/java/org/asamk/signal/json/JsonEditMessage.java index 7367a3fa..90efaf33 100644 --- a/src/main/java/org/asamk/signal/json/JsonEditMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonEditMessage.java @@ -8,8 +8,8 @@ import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "EditMessage") record JsonEditMessage( - @JsonProperty(required = true) long targetSentTimestamp, - @JsonProperty(required = true) JsonDataMessage dataMessage + long targetSentTimestamp, + JsonDataMessage dataMessage ) { static JsonEditMessage from(MessageEnvelope.Edit editMessage, Manager m) { diff --git a/src/main/java/org/asamk/signal/json/JsonError.java b/src/main/java/org/asamk/signal/json/JsonError.java index feb75095..6c21309e 100644 --- a/src/main/java/org/asamk/signal/json/JsonError.java +++ b/src/main/java/org/asamk/signal/json/JsonError.java @@ -5,7 +5,7 @@ import io.micronaut.jsonschema.JsonSchema; @JsonSchema(title = "Error") -public record JsonError(@JsonProperty(required = true) String message, @JsonProperty(required = true) String type) { +public record JsonError(String message, String type) { public static JsonError from(Throwable exception) { return new JsonError(exception.getMessage(), exception.getClass().getSimpleName()); diff --git a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java index c3120e9f..99bee2d7 100644 --- a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java +++ b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java @@ -8,10 +8,10 @@ import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "GroupInfo") record JsonGroupInfo( - @JsonProperty(required = true) String groupId, - @JsonProperty(required = true) String groupName, - @JsonProperty(required = true) int revision, - @JsonProperty(required = true) String type + String groupId, + String groupName, + int revision, + String type ) { static JsonGroupInfo from(MessageEnvelope.Data.GroupContext groupContext, Manager m) { diff --git a/src/main/java/org/asamk/signal/json/JsonMention.java b/src/main/java/org/asamk/signal/json/JsonMention.java index 91320e5d..0884b014 100644 --- a/src/main/java/org/asamk/signal/json/JsonMention.java +++ b/src/main/java/org/asamk/signal/json/JsonMention.java @@ -10,10 +10,10 @@ import java.util.UUID; @JsonSchema(title = "Mention") public record JsonMention( @Deprecated String name, - @JsonProperty(required = true) String number, - @JsonProperty(required = true) String uuid, - @JsonProperty(required = true) int start, - @JsonProperty(required = true) int length + String number, + String uuid, + int start, + int length ) { static JsonMention from(MessageEnvelope.Data.Mention mention) { diff --git a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java index afdfed91..f3581d1f 100644 --- a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -16,13 +16,13 @@ import java.util.UUID; @JsonSchema(title = "MessageEnvelope") public record JsonMessageEnvelope( @Deprecated String source, - @JsonProperty(required = true) String sourceNumber, - @JsonProperty(required = true) String sourceUuid, - @JsonProperty(required = true) String sourceName, - @JsonProperty(required = true) Integer sourceDevice, - @JsonProperty(required = true) long timestamp, - @JsonProperty(required = true) long serverReceivedTimestamp, - @JsonProperty(required = true) long serverDeliveredTimestamp, + String sourceNumber, + String sourceUuid, + String sourceName, + Integer sourceDevice, + long timestamp, + long serverReceivedTimestamp, + long serverDeliveredTimestamp, @JsonInclude(JsonInclude.Include.NON_NULL) JsonDataMessage dataMessage, @JsonInclude(JsonInclude.Include.NON_NULL) JsonEditMessage editMessage, @JsonInclude(JsonInclude.Include.NON_NULL) JsonStoryMessage storyMessage, diff --git a/src/main/java/org/asamk/signal/json/JsonPayment.java b/src/main/java/org/asamk/signal/json/JsonPayment.java index 685b2e8f..1d3dbf27 100644 --- a/src/main/java/org/asamk/signal/json/JsonPayment.java +++ b/src/main/java/org/asamk/signal/json/JsonPayment.java @@ -7,8 +7,8 @@ import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "Payment") public record JsonPayment( - @JsonProperty(required = true) String note, - @JsonProperty(required = true) byte[] receipt + String note, + byte[] receipt ) { static JsonPayment from(MessageEnvelope.Data.Payment payment) { diff --git a/src/main/java/org/asamk/signal/json/JsonPinMessage.java b/src/main/java/org/asamk/signal/json/JsonPinMessage.java index 5559550d..cd1a86dc 100644 --- a/src/main/java/org/asamk/signal/json/JsonPinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonPinMessage.java @@ -10,10 +10,10 @@ import java.util.UUID; @JsonSchema(title = "PinMessage") public record JsonPinMessage( @Deprecated String targetAuthor, - @JsonProperty(required = true) String targetAuthorNumber, - @JsonProperty(required = true) String targetAuthorUuid, - @JsonProperty(required = true) long targetSentTimestamp, - @JsonProperty(required = true) long pinDurationSeconds + String targetAuthorNumber, + String targetAuthorUuid, + long targetSentTimestamp, + long pinDurationSeconds ) { static JsonPinMessage from(MessageEnvelope.Data.PinMessage pinMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonPollCreate.java b/src/main/java/org/asamk/signal/json/JsonPollCreate.java index c4fe927c..bfef255c 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollCreate.java +++ b/src/main/java/org/asamk/signal/json/JsonPollCreate.java @@ -9,9 +9,9 @@ import java.util.List; @JsonSchema(title = "PollCreate") public record JsonPollCreate( - @JsonProperty(required = true) String question, - @JsonProperty(required = true) boolean allowMultiple, - @JsonProperty(required = true) List options + String question, + boolean allowMultiple, + List options ) { static JsonPollCreate from(MessageEnvelope.Data.PollCreate pollCreate) { diff --git a/src/main/java/org/asamk/signal/json/JsonPollTerminate.java b/src/main/java/org/asamk/signal/json/JsonPollTerminate.java index a2bed429..0e003de2 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollTerminate.java +++ b/src/main/java/org/asamk/signal/json/JsonPollTerminate.java @@ -6,7 +6,7 @@ import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "PollTerminate") -public record JsonPollTerminate(@JsonProperty(required = true) long targetSentTimestamp) { +public record JsonPollTerminate(long targetSentTimestamp) { static JsonPollTerminate from(MessageEnvelope.Data.PollTerminate pollTerminate) { final var targetSentTimestamp = pollTerminate.targetSentTimestamp(); diff --git a/src/main/java/org/asamk/signal/json/JsonPollVote.java b/src/main/java/org/asamk/signal/json/JsonPollVote.java index 9ae8fc07..4a9af3e1 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollVote.java +++ b/src/main/java/org/asamk/signal/json/JsonPollVote.java @@ -11,11 +11,11 @@ import java.util.UUID; @JsonSchema(title = "PollVote") public record JsonPollVote( @Deprecated String author, - @JsonProperty(required = true) String authorNumber, - @JsonProperty(required = true) String authorUuid, - @JsonProperty(required = true) long targetSentTimestamp, - @JsonProperty(required = true) List optionIndexes, - @JsonProperty(required = true) int voteCount + String authorNumber, + String authorUuid, + long targetSentTimestamp, + List optionIndexes, + int voteCount ) { static JsonPollVote from(MessageEnvelope.Data.PollVote pollVote) { diff --git a/src/main/java/org/asamk/signal/json/JsonPreview.java b/src/main/java/org/asamk/signal/json/JsonPreview.java index 1e471afd..5bcb9290 100644 --- a/src/main/java/org/asamk/signal/json/JsonPreview.java +++ b/src/main/java/org/asamk/signal/json/JsonPreview.java @@ -7,10 +7,10 @@ import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "Preview") public record JsonPreview( - @JsonProperty(required = true) String url, - @JsonProperty(required = true) String title, - @JsonProperty(required = true) String description, - @JsonProperty(required = true) JsonAttachment image + String url, + String title, + String description, + JsonAttachment image ) { static JsonPreview from(MessageEnvelope.Data.Preview preview) { diff --git a/src/main/java/org/asamk/signal/json/JsonQuote.java b/src/main/java/org/asamk/signal/json/JsonQuote.java index 45213777..b5619ea2 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuote.java +++ b/src/main/java/org/asamk/signal/json/JsonQuote.java @@ -11,13 +11,13 @@ import java.util.UUID; @JsonSchema(title = "Quote") public record JsonQuote( - @JsonProperty(required = true) long id, + long id, @Deprecated String author, - @JsonProperty(required = true) String authorNumber, - @JsonProperty(required = true) String authorUuid, - @JsonProperty(required = true) String text, + String authorNumber, + String authorUuid, + String text, @JsonInclude(JsonInclude.Include.NON_NULL) List mentions, - @JsonProperty(required = true) List attachments, + List attachments, @JsonInclude(JsonInclude.Include.NON_NULL) List textStyles ) { diff --git a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java index d33dbcf7..6e32e4bc 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java @@ -8,8 +8,8 @@ import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "QuotedAttachment") public record JsonQuotedAttachment( - @JsonProperty(required = true) String contentType, - @JsonProperty(required = true) String filename, + String contentType, + String filename, @JsonInclude(JsonInclude.Include.NON_NULL) JsonAttachment thumbnail ) { diff --git a/src/main/java/org/asamk/signal/json/JsonReaction.java b/src/main/java/org/asamk/signal/json/JsonReaction.java index d1fb6c18..3d0e63ff 100644 --- a/src/main/java/org/asamk/signal/json/JsonReaction.java +++ b/src/main/java/org/asamk/signal/json/JsonReaction.java @@ -9,12 +9,12 @@ import java.util.UUID; @JsonSchema(title = "Reaction") public record JsonReaction( - @JsonProperty(required = true) String emoji, + String emoji, @Deprecated String targetAuthor, - @JsonProperty(required = true) String targetAuthorNumber, - @JsonProperty(required = true) String targetAuthorUuid, - @JsonProperty(required = true) long targetSentTimestamp, - @JsonProperty(required = true) boolean isRemove + String targetAuthorNumber, + String targetAuthorUuid, + long targetSentTimestamp, + boolean isRemove ) { static JsonReaction from(MessageEnvelope.Data.Reaction reaction) { diff --git a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java index d019c0d4..5e08c540 100644 --- a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java @@ -9,11 +9,11 @@ import java.util.List; @JsonSchema(title = "ReceiptMessage") record JsonReceiptMessage( - @JsonProperty(required = true) long when, - @JsonProperty(required = true) boolean isDelivery, - @JsonProperty(required = true) boolean isRead, - @JsonProperty(required = true) boolean isViewed, - @JsonProperty(required = true) List timestamps + long when, + boolean isDelivery, + boolean isRead, + boolean isViewed, + List timestamps ) { static JsonReceiptMessage from(MessageEnvelope.Receipt receiptMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java b/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java index 7a5c5e70..0a82d83d 100644 --- a/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java +++ b/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java @@ -9,9 +9,9 @@ import java.util.UUID; @JsonSchema(title = "RecipientAddress") public record JsonRecipientAddress( - @JsonProperty(required = true) String uuid, - @JsonProperty(required = true) String number, - @JsonProperty(required = true) String username + String uuid, + String number, + String username ) { public static JsonRecipientAddress from(RecipientAddress address) { diff --git a/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java b/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java index f29c961e..bf619f5b 100644 --- a/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java +++ b/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java @@ -4,4 +4,4 @@ import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; @JsonSchema(title = "RemoteDelete") -record JsonRemoteDelete(@JsonProperty(required = true) long timestamp) {} +record JsonRemoteDelete(long timestamp) {} diff --git a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java index 4ad591cd..0203df52 100644 --- a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java +++ b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java @@ -9,9 +9,9 @@ import org.asamk.signal.manager.api.SendMessageResult; @JsonSchema(title = "SendMessageResult") public record JsonSendMessageResult( - @JsonProperty(required = true) JsonRecipientAddress recipientAddress, + JsonRecipientAddress recipientAddress, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId, - @JsonProperty(required = true) Type type, + Type type, @JsonInclude(JsonInclude.Include.NON_NULL) String token, @JsonInclude(JsonInclude.Include.NON_NULL) Long retryAfterSeconds ) { diff --git a/src/main/java/org/asamk/signal/json/JsonSharedContact.java b/src/main/java/org/asamk/signal/json/JsonSharedContact.java index 677f38ea..823f6c8a 100644 --- a/src/main/java/org/asamk/signal/json/JsonSharedContact.java +++ b/src/main/java/org/asamk/signal/json/JsonSharedContact.java @@ -10,12 +10,12 @@ import java.util.List; @JsonSchema(title = "SharedContact") public record JsonSharedContact( - @JsonProperty(required = true) JsonContactName name, + JsonContactName name, @JsonInclude(JsonInclude.Include.NON_NULL) JsonContactAvatar avatar, @JsonInclude(JsonInclude.Include.NON_NULL) List phone, @JsonInclude(JsonInclude.Include.NON_NULL) List email, @JsonInclude(JsonInclude.Include.NON_NULL) List address, - @JsonProperty(required = true) String organization + String organization ) { static JsonSharedContact from(MessageEnvelope.Data.SharedContact contact) { diff --git a/src/main/java/org/asamk/signal/json/JsonSticker.java b/src/main/java/org/asamk/signal/json/JsonSticker.java index 2e800b5e..5ddf834d 100644 --- a/src/main/java/org/asamk/signal/json/JsonSticker.java +++ b/src/main/java/org/asamk/signal/json/JsonSticker.java @@ -8,8 +8,8 @@ import org.asamk.signal.util.Hex; @JsonSchema(title = "Sticker") public record JsonSticker( - @JsonProperty(required = true) String packId, - @JsonProperty(required = true) int stickerId + String packId, + int stickerId ) { static JsonSticker from(MessageEnvelope.Data.Sticker sticker) { diff --git a/src/main/java/org/asamk/signal/json/JsonStoryContext.java b/src/main/java/org/asamk/signal/json/JsonStoryContext.java index 8bd7d972..e3f5c42e 100644 --- a/src/main/java/org/asamk/signal/json/JsonStoryContext.java +++ b/src/main/java/org/asamk/signal/json/JsonStoryContext.java @@ -9,9 +9,9 @@ import java.util.UUID; @JsonSchema(title = "StoryContext") record JsonStoryContext( - @JsonProperty(required = true) String authorNumber, - @JsonProperty(required = true) String authorUuid, - @JsonProperty(required = true) long sentTimestamp + String authorNumber, + String authorUuid, + long sentTimestamp ) { static JsonStoryContext from(MessageEnvelope.Data.StoryContext storyContext) { diff --git a/src/main/java/org/asamk/signal/json/JsonStoryMessage.java b/src/main/java/org/asamk/signal/json/JsonStoryMessage.java index ec082589..51da1a8b 100644 --- a/src/main/java/org/asamk/signal/json/JsonStoryMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonStoryMessage.java @@ -12,7 +12,7 @@ import java.util.List; @JsonSchema(title = "StoryMessage") record JsonStoryMessage( - @JsonProperty(required = true) boolean allowsReplies, + boolean allowsReplies, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId, @JsonInclude(JsonInclude.Include.NON_NULL) JsonAttachment fileAttachment, @JsonInclude(JsonInclude.Include.NON_NULL) TextAttachment textAttachment @@ -26,7 +26,7 @@ record JsonStoryMessage( } public record TextAttachment( - @JsonProperty(required = true) String text, + String text, @JsonInclude(JsonInclude.Include.NON_NULL) String style, @JsonInclude(JsonInclude.Include.NON_NULL) String textForegroundColor, @JsonInclude(JsonInclude.Include.NON_NULL) String textBackgroundColor, @@ -46,11 +46,11 @@ record JsonStoryMessage( } public record Gradient( - @JsonProperty(required = true) String startColor, - @JsonProperty(required = true) String endColor, - @JsonProperty(required = true) List colors, - @JsonProperty(required = true) List positions, - @JsonProperty(required = true) Integer angle + String startColor, + String endColor, + List colors, + List positions, + Integer angle ) { static Gradient from(MessageEnvelope.Story.TextAttachment.Gradient gradient) { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java index f6623a0a..b76d1624 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java @@ -14,10 +14,10 @@ import java.util.UUID; @JsonSchema(title = "SyncDataMessage") record JsonSyncDataMessage( @Deprecated String destination, - @JsonProperty(required = true) String destinationNumber, - @JsonProperty(required = true) String destinationUuid, + String destinationNumber, + String destinationUuid, @JsonInclude(JsonInclude.Include.NON_NULL) JsonEditMessage editMessage, - @JsonProperty(required = true) @JsonUnwrapped JsonDataMessage dataMessage + @JsonUnwrapped JsonDataMessage dataMessage ) { static JsonSyncDataMessage from(MessageEnvelope.Sync.Sent transcriptMessage, Manager m) { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java index 3aad9e55..be2ba5dd 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java @@ -10,9 +10,9 @@ import java.util.UUID; @JsonSchema(title = "SyncReadMessage") record JsonSyncReadMessage( @Deprecated String sender, - @JsonProperty(required = true) String senderNumber, - @JsonProperty(required = true) String senderUuid, - @JsonProperty(required = true) long timestamp + String senderNumber, + String senderUuid, + long timestamp ) { static JsonSyncReadMessage from(MessageEnvelope.Sync.Read readMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java index c8835ee9..1d2f2aeb 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java @@ -10,9 +10,9 @@ import java.util.UUID; @JsonSchema(title = "SyncStoryMessage") record JsonSyncStoryMessage( - @JsonProperty(required = true) String destinationNumber, - @JsonProperty(required = true) String destinationUuid, - @JsonProperty(required = true) @JsonUnwrapped JsonStoryMessage dataMessage + String destinationNumber, + String destinationUuid, + @JsonUnwrapped JsonStoryMessage dataMessage ) { static JsonSyncStoryMessage from(MessageEnvelope.Sync.Sent transcriptMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonTextStyle.java b/src/main/java/org/asamk/signal/json/JsonTextStyle.java index 780b8418..61083515 100644 --- a/src/main/java/org/asamk/signal/json/JsonTextStyle.java +++ b/src/main/java/org/asamk/signal/json/JsonTextStyle.java @@ -7,9 +7,9 @@ import org.asamk.signal.manager.api.TextStyle; @JsonSchema(title = "TextStyle") public record JsonTextStyle( - @JsonProperty(required = true) String style, - @JsonProperty(required = true) int start, - @JsonProperty(required = true) int length + String style, + int start, + int length ) { static JsonTextStyle from(TextStyle textStyle) { diff --git a/src/main/java/org/asamk/signal/json/JsonTypingMessage.java b/src/main/java/org/asamk/signal/json/JsonTypingMessage.java index ef371b67..9153f76b 100644 --- a/src/main/java/org/asamk/signal/json/JsonTypingMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonTypingMessage.java @@ -9,8 +9,8 @@ import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "TypingMessage") record JsonTypingMessage( - @JsonProperty(required = true) String action, - @JsonProperty(required = true) long timestamp, + String action, + long timestamp, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId ) { diff --git a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java index dca17847..4d87e591 100644 --- a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java @@ -10,9 +10,9 @@ import java.util.UUID; @JsonSchema(title = "UnpinMessage") public record JsonUnpinMessage( @Deprecated String targetAuthor, - @JsonProperty(required = true) String targetAuthorNumber, - @JsonProperty(required = true) String targetAuthorUuid, - @JsonProperty(required = true) long targetSentTimestamp + String targetAuthorNumber, + String targetAuthorUuid, + long targetSentTimestamp ) { static JsonUnpinMessage from(MessageEnvelope.Data.UnpinMessage unpinMessage) { From c6ac4b2692a1b91e0657189f55f769e08bb376de Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Sat, 7 Mar 2026 01:37:31 +0100 Subject: [PATCH 13/22] Make references local --- build.gradle.kts | 7 +++- .../schemas/sync-data-message.schema.json | 40 +++++++++---------- .../META-INF/schemas/sync-message.schema.json | 8 ++-- .../schemas/sync-story-message.schema.json | 6 +-- 4 files changed, 32 insertions(+), 29 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5f5b7781..e0976735 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -154,6 +154,8 @@ tasks.register("fatJar", type = Jar::class) { val compileJsonSchemas by tasks.registering(JavaCompile::class) { dependsOn(tasks.compileJava) + val schemaBaseUri = "http://localhost:8080/schemas/" + source = sourceSets.main.get().java include("org/asamk/signal/json/**/*.java") @@ -172,7 +174,7 @@ val compileJsonSchemas by tasks.registering(JavaCompile::class) { "-Amicronaut.processing.group=org.asamk", "-Amicronaut.processing.module=signal-cli", "-Amicronaut.processing.annotations=org.asamk.signal.json.*", - "-Amicronaut.jsonschema.baseUri=https://example.com/schemas", + "-Amicronaut.jsonschema.baseUri=$schemaBaseUri", ) ) @@ -186,7 +188,8 @@ val compileJsonSchemas by tasks.registering(JavaCompile::class) { fileTree(destinationDirectory.get().dir("META-INF/schemas").asFile) { include("*.schema.json") }.forEach { schemaFile -> - val prettyJson = JsonOutput.prettyPrint(schemaFile.readText()) + val normalized = schemaFile.readText().replace("\"$schemaBaseUri/", "\"") + val prettyJson = JsonOutput.prettyPrint(normalized) schemaFile.writeText("$prettyJson\n") } } diff --git a/src/main/resources/META-INF/schemas/sync-data-message.schema.json b/src/main/resources/META-INF/schemas/sync-data-message.schema.json index f61c33a5..265f5453 100644 --- a/src/main/resources/META-INF/schemas/sync-data-message.schema.json +++ b/src/main/resources/META-INF/schemas/sync-data-message.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://example.com/schemas/sync-data-message.schema.json", + "$id": "sync-data-message.schema.json", "title": "SyncDataMessage", "type": "object", "properties": { @@ -14,28 +14,28 @@ "type": "string" }, "editMessage": { - "$ref": "https://example.com/schemas/edit-message.schema.json" + "$ref": "edit-message.schema.json" }, "adminDelete": { - "$ref": "https://example.com/schemas/admin-delete.schema.json" + "$ref": "admin-delete.schema.json" }, "attachments": { "type": "array", "items": { - "$ref": "https://example.com/schemas/attachment.schema.json" + "$ref": "attachment.schema.json" } }, "contacts": { "type": "array", "items": { - "$ref": "https://example.com/schemas/shared-contact.schema.json" + "$ref": "shared-contact.schema.json" } }, "expiresInSeconds": { "type": "integer" }, "groupInfo": { - "$ref": "https://example.com/schemas/group-info.schema.json" + "$ref": "group-info.schema.json" }, "isExpirationUpdate": { "type": "boolean" @@ -43,59 +43,59 @@ "mentions": { "type": "array", "items": { - "$ref": "https://example.com/schemas/mention.schema.json" + "$ref": "mention.schema.json" } }, "message": { "type": "string" }, "payment": { - "$ref": "https://example.com/schemas/payment.schema.json" + "$ref": "payment.schema.json" }, "pinMessage": { - "$ref": "https://example.com/schemas/pin-message.schema.json" + "$ref": "pin-message.schema.json" }, "pollCreate": { - "$ref": "https://example.com/schemas/poll-create.schema.json" + "$ref": "poll-create.schema.json" }, "pollTerminate": { - "$ref": "https://example.com/schemas/poll-terminate.schema.json" + "$ref": "poll-terminate.schema.json" }, "pollVote": { - "$ref": "https://example.com/schemas/poll-vote.schema.json" + "$ref": "poll-vote.schema.json" }, "previews": { "type": "array", "items": { - "$ref": "https://example.com/schemas/preview.schema.json" + "$ref": "preview.schema.json" } }, "quote": { - "$ref": "https://example.com/schemas/quote.schema.json" + "$ref": "quote.schema.json" }, "reaction": { - "$ref": "https://example.com/schemas/reaction.schema.json" + "$ref": "reaction.schema.json" }, "remoteDelete": { - "$ref": "https://example.com/schemas/remote-delete.schema.json" + "$ref": "remote-delete.schema.json" }, "sticker": { - "$ref": "https://example.com/schemas/sticker.schema.json" + "$ref": "sticker.schema.json" }, "storyContext": { - "$ref": "https://example.com/schemas/story-context.schema.json" + "$ref": "story-context.schema.json" }, "textStyles": { "type": "array", "items": { - "$ref": "https://example.com/schemas/text-style.schema.json" + "$ref": "text-style.schema.json" } }, "timestamp": { "type": "integer" }, "unpinMessage": { - "$ref": "https://example.com/schemas/unpin-message.schema.json" + "$ref": "unpin-message.schema.json" }, "viewOnce": { "type": "boolean" diff --git a/src/main/resources/META-INF/schemas/sync-message.schema.json b/src/main/resources/META-INF/schemas/sync-message.schema.json index 5dc499f7..3e4a7fa6 100644 --- a/src/main/resources/META-INF/schemas/sync-message.schema.json +++ b/src/main/resources/META-INF/schemas/sync-message.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://example.com/schemas/sync-message.schema.json", + "$id": "sync-message.schema.json", "title": "SyncMessage", "type": "object", "properties": { @@ -19,14 +19,14 @@ "readMessages": { "type": "array", "items": { - "$ref": "https://example.com/schemas/sync-read-message.schema.json" + "$ref": "sync-read-message.schema.json" } }, "sentMessage": { - "$ref": "https://example.com/schemas/sync-data-message.schema.json" + "$ref": "sync-data-message.schema.json" }, "sentStoryMessage": { - "$ref": "https://example.com/schemas/sync-story-message.schema.json" + "$ref": "sync-story-message.schema.json" }, "type": { "type": "string", diff --git a/src/main/resources/META-INF/schemas/sync-story-message.schema.json b/src/main/resources/META-INF/schemas/sync-story-message.schema.json index 6dcfec8f..25643d52 100644 --- a/src/main/resources/META-INF/schemas/sync-story-message.schema.json +++ b/src/main/resources/META-INF/schemas/sync-story-message.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://example.com/schemas/sync-story-message.schema.json", + "$id": "sync-story-message.schema.json", "title": "SyncStoryMessage", "type": "object", "properties": { @@ -14,7 +14,7 @@ "type": "boolean" }, "fileAttachment": { - "$ref": "https://example.com/schemas/attachment.schema.json" + "$ref": "attachment.schema.json" }, "groupId": { "type": "string" @@ -54,7 +54,7 @@ } }, "preview": { - "$ref": "https://example.com/schemas/preview.schema.json" + "$ref": "preview.schema.json" }, "style": { "type": "string" From d7c0c7000f090d00b9c603be1d0d35beb44d6238 Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Sat, 7 Mar 2026 01:40:03 +0100 Subject: [PATCH 14/22] Updated the readme --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4c3e24f2..42760f17 100644 --- a/README.md +++ b/README.md @@ -150,15 +150,16 @@ version installed, you can replace `./gradlew` with `gradle` in the following st ./gradlew run --args="--help" ``` -### JSON-RPC schemas +### JSON Schemeas for the JSON-RPC mode -1. Run documentation server for all the JSON-RPC schemas (`src/main/java/org/asamk/signal/json`): +1. Generate [JSON Schema](https://json-schema.org/) files for all the JSON-RPC data classes (`src/main/java/org/asamk/signal/json`): ```sh ./gradlew genJsonSchemas ``` -2. Check the json schemas files in the following folder: +2. The generated files can be found in the `build/classes/java/schemas/META-INF/schemas` folder. + ### Building a native binary with GraalVM (EXPERIMENTAL) From 8376d1f4777be12cc44b58fba4b08596b4819bfa Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Sat, 7 Mar 2026 01:42:17 +0100 Subject: [PATCH 15/22] Removed uneeded import --- src/main/java/org/asamk/signal/json/JsonAdminDelete.java | 1 - src/main/java/org/asamk/signal/json/JsonAttachment.java | 1 - src/main/java/org/asamk/signal/json/JsonAttachmentData.java | 1 - src/main/java/org/asamk/signal/json/JsonCallMessage.java | 1 - src/main/java/org/asamk/signal/json/JsonContact.java | 1 - src/main/java/org/asamk/signal/json/JsonContactAddress.java | 1 - src/main/java/org/asamk/signal/json/JsonContactAvatar.java | 1 - src/main/java/org/asamk/signal/json/JsonContactEmail.java | 1 - src/main/java/org/asamk/signal/json/JsonContactName.java | 1 - src/main/java/org/asamk/signal/json/JsonContactPhone.java | 1 - src/main/java/org/asamk/signal/json/JsonDataMessage.java | 1 - src/main/java/org/asamk/signal/json/JsonEditMessage.java | 1 - src/main/java/org/asamk/signal/json/JsonError.java | 1 - src/main/java/org/asamk/signal/json/JsonGroupInfo.java | 1 - src/main/java/org/asamk/signal/json/JsonMention.java | 1 - src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java | 1 - src/main/java/org/asamk/signal/json/JsonPayment.java | 1 - src/main/java/org/asamk/signal/json/JsonPinMessage.java | 1 - src/main/java/org/asamk/signal/json/JsonPollCreate.java | 1 - src/main/java/org/asamk/signal/json/JsonPollTerminate.java | 1 - src/main/java/org/asamk/signal/json/JsonPollVote.java | 1 - src/main/java/org/asamk/signal/json/JsonPreview.java | 1 - src/main/java/org/asamk/signal/json/JsonQuote.java | 1 - src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java | 1 - src/main/java/org/asamk/signal/json/JsonReaction.java | 1 - src/main/java/org/asamk/signal/json/JsonReceiptMessage.java | 1 - src/main/java/org/asamk/signal/json/JsonRecipientAddress.java | 1 - src/main/java/org/asamk/signal/json/JsonRemoteDelete.java | 1 - src/main/java/org/asamk/signal/json/JsonSendMessageResult.java | 1 - src/main/java/org/asamk/signal/json/JsonSharedContact.java | 1 - src/main/java/org/asamk/signal/json/JsonSticker.java | 1 - src/main/java/org/asamk/signal/json/JsonStoryContext.java | 1 - src/main/java/org/asamk/signal/json/JsonStoryMessage.java | 1 - src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java | 1 - src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java | 1 - src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java | 1 - src/main/java/org/asamk/signal/json/JsonTextStyle.java | 1 - src/main/java/org/asamk/signal/json/JsonTypingMessage.java | 1 - src/main/java/org/asamk/signal/json/JsonUnpinMessage.java | 1 - 39 files changed, 39 deletions(-) diff --git a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java index 4f2aa4b5..f1165ca3 100644 --- a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java +++ b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonAttachment.java b/src/main/java/org/asamk/signal/json/JsonAttachment.java index a6b9c224..eb320ba2 100644 --- a/src/main/java/org/asamk/signal/json/JsonAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachment.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonAttachmentData.java b/src/main/java/org/asamk/signal/json/JsonAttachmentData.java index cb1ac7e1..628234e8 100644 --- a/src/main/java/org/asamk/signal/json/JsonAttachmentData.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachmentData.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; diff --git a/src/main/java/org/asamk/signal/json/JsonCallMessage.java b/src/main/java/org/asamk/signal/json/JsonCallMessage.java index 2debbfb7..33f8c27d 100644 --- a/src/main/java/org/asamk/signal/json/JsonCallMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonCallMessage.java @@ -1,7 +1,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonContact.java b/src/main/java/org/asamk/signal/json/JsonContact.java index a401362d..037f90cd 100644 --- a/src/main/java/org/asamk/signal/json/JsonContact.java +++ b/src/main/java/org/asamk/signal/json/JsonContact.java @@ -1,7 +1,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; diff --git a/src/main/java/org/asamk/signal/json/JsonContactAddress.java b/src/main/java/org/asamk/signal/json/JsonContactAddress.java index acc2d9d6..763d6bd7 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactAddress.java +++ b/src/main/java/org/asamk/signal/json/JsonContactAddress.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonContactAvatar.java b/src/main/java/org/asamk/signal/json/JsonContactAvatar.java index 9adc6d1d..dcd5d5ba 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactAvatar.java +++ b/src/main/java/org/asamk/signal/json/JsonContactAvatar.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonContactEmail.java b/src/main/java/org/asamk/signal/json/JsonContactEmail.java index 330e58af..2cb9fa2d 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactEmail.java +++ b/src/main/java/org/asamk/signal/json/JsonContactEmail.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonContactName.java b/src/main/java/org/asamk/signal/json/JsonContactName.java index 0cc59c13..d4d961fb 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactName.java +++ b/src/main/java/org/asamk/signal/json/JsonContactName.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonContactPhone.java b/src/main/java/org/asamk/signal/json/JsonContactPhone.java index 908593e0..2e306486 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactPhone.java +++ b/src/main/java/org/asamk/signal/json/JsonContactPhone.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonDataMessage.java b/src/main/java/org/asamk/signal/json/JsonDataMessage.java index b796af8d..e9655cea 100644 --- a/src/main/java/org/asamk/signal/json/JsonDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonDataMessage.java @@ -1,7 +1,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; diff --git a/src/main/java/org/asamk/signal/json/JsonEditMessage.java b/src/main/java/org/asamk/signal/json/JsonEditMessage.java index 90efaf33..81537b32 100644 --- a/src/main/java/org/asamk/signal/json/JsonEditMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonEditMessage.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.Manager; diff --git a/src/main/java/org/asamk/signal/json/JsonError.java b/src/main/java/org/asamk/signal/json/JsonError.java index 6c21309e..606eb71d 100644 --- a/src/main/java/org/asamk/signal/json/JsonError.java +++ b/src/main/java/org/asamk/signal/json/JsonError.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; diff --git a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java index 99bee2d7..9dcb306b 100644 --- a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java +++ b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.Manager; diff --git a/src/main/java/org/asamk/signal/json/JsonMention.java b/src/main/java/org/asamk/signal/json/JsonMention.java index 0884b014..2a3bb872 100644 --- a/src/main/java/org/asamk/signal/json/JsonMention.java +++ b/src/main/java/org/asamk/signal/json/JsonMention.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java index f3581d1f..25f4ea0f 100644 --- a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -1,7 +1,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; diff --git a/src/main/java/org/asamk/signal/json/JsonPayment.java b/src/main/java/org/asamk/signal/json/JsonPayment.java index 1d3dbf27..f4450e86 100644 --- a/src/main/java/org/asamk/signal/json/JsonPayment.java +++ b/src/main/java/org/asamk/signal/json/JsonPayment.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonPinMessage.java b/src/main/java/org/asamk/signal/json/JsonPinMessage.java index cd1a86dc..eebd23d5 100644 --- a/src/main/java/org/asamk/signal/json/JsonPinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonPinMessage.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonPollCreate.java b/src/main/java/org/asamk/signal/json/JsonPollCreate.java index bfef255c..f388c27a 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollCreate.java +++ b/src/main/java/org/asamk/signal/json/JsonPollCreate.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonPollTerminate.java b/src/main/java/org/asamk/signal/json/JsonPollTerminate.java index 0e003de2..8e2c3e8a 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollTerminate.java +++ b/src/main/java/org/asamk/signal/json/JsonPollTerminate.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonPollVote.java b/src/main/java/org/asamk/signal/json/JsonPollVote.java index 4a9af3e1..8a911f4c 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollVote.java +++ b/src/main/java/org/asamk/signal/json/JsonPollVote.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonPreview.java b/src/main/java/org/asamk/signal/json/JsonPreview.java index 5bcb9290..781a926c 100644 --- a/src/main/java/org/asamk/signal/json/JsonPreview.java +++ b/src/main/java/org/asamk/signal/json/JsonPreview.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonQuote.java b/src/main/java/org/asamk/signal/json/JsonQuote.java index b5619ea2..a212f33f 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuote.java +++ b/src/main/java/org/asamk/signal/json/JsonQuote.java @@ -1,7 +1,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java index 6e32e4bc..7972d441 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java @@ -1,7 +1,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonReaction.java b/src/main/java/org/asamk/signal/json/JsonReaction.java index 3d0e63ff..db7f4086 100644 --- a/src/main/java/org/asamk/signal/json/JsonReaction.java +++ b/src/main/java/org/asamk/signal/json/JsonReaction.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java index 5e08c540..e8b29c02 100644 --- a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java b/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java index 0a82d83d..e8b11675 100644 --- a/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java +++ b/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.RecipientAddress; diff --git a/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java b/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java index bf619f5b..b1def8e8 100644 --- a/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java +++ b/src/main/java/org/asamk/signal/json/JsonRemoteDelete.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; @JsonSchema(title = "RemoteDelete") diff --git a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java index 0203df52..4ad78bfd 100644 --- a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java +++ b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java @@ -1,7 +1,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.GroupId; diff --git a/src/main/java/org/asamk/signal/json/JsonSharedContact.java b/src/main/java/org/asamk/signal/json/JsonSharedContact.java index 823f6c8a..351f9c9b 100644 --- a/src/main/java/org/asamk/signal/json/JsonSharedContact.java +++ b/src/main/java/org/asamk/signal/json/JsonSharedContact.java @@ -1,7 +1,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonSticker.java b/src/main/java/org/asamk/signal/json/JsonSticker.java index 5ddf834d..d4cdb876 100644 --- a/src/main/java/org/asamk/signal/json/JsonSticker.java +++ b/src/main/java/org/asamk/signal/json/JsonSticker.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonStoryContext.java b/src/main/java/org/asamk/signal/json/JsonStoryContext.java index e3f5c42e..09be4053 100644 --- a/src/main/java/org/asamk/signal/json/JsonStoryContext.java +++ b/src/main/java/org/asamk/signal/json/JsonStoryContext.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonStoryMessage.java b/src/main/java/org/asamk/signal/json/JsonStoryMessage.java index 51da1a8b..808d1f10 100644 --- a/src/main/java/org/asamk/signal/json/JsonStoryMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonStoryMessage.java @@ -1,7 +1,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.Color; diff --git a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java index b76d1624..5563056f 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java @@ -1,7 +1,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonUnwrapped; import io.micronaut.jsonschema.JsonSchema; diff --git a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java index be2ba5dd..76663964 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java index 1d2f2aeb..737b7870 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonUnwrapped; import io.micronaut.jsonschema.JsonSchema; diff --git a/src/main/java/org/asamk/signal/json/JsonTextStyle.java b/src/main/java/org/asamk/signal/json/JsonTextStyle.java index 61083515..05d1c33e 100644 --- a/src/main/java/org/asamk/signal/json/JsonTextStyle.java +++ b/src/main/java/org/asamk/signal/json/JsonTextStyle.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.TextStyle; diff --git a/src/main/java/org/asamk/signal/json/JsonTypingMessage.java b/src/main/java/org/asamk/signal/json/JsonTypingMessage.java index 9153f76b..f97abfbc 100644 --- a/src/main/java/org/asamk/signal/json/JsonTypingMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonTypingMessage.java @@ -1,7 +1,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.GroupId; diff --git a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java index 4d87e591..5ea65aa4 100644 --- a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java @@ -1,6 +1,5 @@ package org.asamk.signal.json; -import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; From 0f83b784e977b5dc15d14375e937510e90b91ca6 Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Sat, 7 Mar 2026 01:45:09 +0100 Subject: [PATCH 16/22] Remove extra empty lines --- src/main/java/org/asamk/signal/json/JsonAttachmentData.java | 1 - src/main/java/org/asamk/signal/json/JsonContact.java | 1 - src/main/java/org/asamk/signal/json/JsonDataMessage.java | 1 - src/main/java/org/asamk/signal/json/JsonError.java | 1 - src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java | 1 - src/main/java/org/asamk/signal/json/JsonSyncMessage.java | 1 - 6 files changed, 6 deletions(-) diff --git a/src/main/java/org/asamk/signal/json/JsonAttachmentData.java b/src/main/java/org/asamk/signal/json/JsonAttachmentData.java index 628234e8..a9d91078 100644 --- a/src/main/java/org/asamk/signal/json/JsonAttachmentData.java +++ b/src/main/java/org/asamk/signal/json/JsonAttachmentData.java @@ -2,7 +2,6 @@ package org.asamk.signal.json; import io.micronaut.jsonschema.JsonSchema; - @JsonSchema(title = "AttachmentData") public record JsonAttachmentData( String data diff --git a/src/main/java/org/asamk/signal/json/JsonContact.java b/src/main/java/org/asamk/signal/json/JsonContact.java index 037f90cd..07e026d4 100644 --- a/src/main/java/org/asamk/signal/json/JsonContact.java +++ b/src/main/java/org/asamk/signal/json/JsonContact.java @@ -3,7 +3,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; import io.micronaut.jsonschema.JsonSchema; - import java.util.List; @JsonSchema(title = "Contact") diff --git a/src/main/java/org/asamk/signal/json/JsonDataMessage.java b/src/main/java/org/asamk/signal/json/JsonDataMessage.java index e9655cea..a4c3f5d0 100644 --- a/src/main/java/org/asamk/signal/json/JsonDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonDataMessage.java @@ -3,7 +3,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; import io.micronaut.jsonschema.JsonSchema; - import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; diff --git a/src/main/java/org/asamk/signal/json/JsonError.java b/src/main/java/org/asamk/signal/json/JsonError.java index 606eb71d..d881c0b7 100644 --- a/src/main/java/org/asamk/signal/json/JsonError.java +++ b/src/main/java/org/asamk/signal/json/JsonError.java @@ -2,7 +2,6 @@ package org.asamk.signal.json; import io.micronaut.jsonschema.JsonSchema; - @JsonSchema(title = "Error") public record JsonError(String message, String type) { diff --git a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java index 25f4ea0f..f2df7e0a 100644 --- a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -3,7 +3,6 @@ package org.asamk.signal.json; import com.fasterxml.jackson.annotation.JsonInclude; import io.micronaut.jsonschema.JsonSchema; - import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.manager.api.RecipientAddress; diff --git a/src/main/java/org/asamk/signal/json/JsonSyncMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncMessage.java index edd2ae6f..ac87e6ca 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncMessage.java @@ -11,7 +11,6 @@ import java.util.List; import io.micronaut.jsonschema.JsonSchema; - enum JsonSyncMessageType { CONTACTS_SYNC, GROUPS_SYNC, From b6e895b47e8407ce0b540aee41ea6b67f6029297 Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Sat, 7 Mar 2026 01:50:06 +0100 Subject: [PATCH 17/22] Clean readme --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 42760f17..1b9147f8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -https://sdkman.io/usage/ - # signal-cli signal-cli is a commandline interface for the [Signal messenger](https://signal.org/). @@ -160,7 +158,6 @@ version installed, you can replace `./gradlew` with `gradle` in the following st 2. The generated files can be found in the `build/classes/java/schemas/META-INF/schemas` folder. - ### Building a native binary with GraalVM (EXPERIMENTAL) It is possible to build a native binary with [GraalVM](https://www.graalvm.org). This is still experimental and will not From afc3c458a907dcfc96ffb410b9f40aa868c655ab Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Sat, 7 Mar 2026 02:06:23 +0100 Subject: [PATCH 18/22] Add docs depedency only when needed --- build.gradle.kts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index e0976735..5da77916 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -101,7 +101,9 @@ dependencies { implementation(libs.logback) implementation(libs.zxing) implementation(libs.micronaut.json.schema.annotations) - implementation(libs.micronaut.json.schema.generator) + if (gradle.startParameter.taskNames.any { it.contains("genJsonSchemas") }) { + implementation(libs.micronaut.json.schema.generator) + } implementation(project(":libsignal-cli")) } @@ -117,7 +119,7 @@ tasks.withType().configureEach { isReproducibleFileOrder = true } -tasks.withType().configureEach { +tasks.withType() { options.encoding = "UTF-8" } From 6810877b4dc23e7a95a8d8386dfc96a1fd04bef7 Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Sat, 7 Mar 2026 02:13:31 +0100 Subject: [PATCH 19/22] Revert uneeded changes --- .../asamk/signal/json/JsonAdminDelete.java | 5 +---- .../asamk/signal/json/JsonCallMessage.java | 22 ++++--------------- .../asamk/signal/json/JsonContactAvatar.java | 5 +---- .../asamk/signal/json/JsonContactEmail.java | 6 +---- .../asamk/signal/json/JsonContactName.java | 7 +----- .../asamk/signal/json/JsonContactPhone.java | 6 +---- .../org/asamk/signal/json/JsonGroupInfo.java | 7 +----- .../org/asamk/signal/json/JsonMention.java | 8 +------ .../org/asamk/signal/json/JsonPollCreate.java | 4 +--- .../signal/json/JsonQuotedAttachment.java | 4 +--- .../asamk/signal/json/JsonReceiptMessage.java | 8 +------ .../signal/json/JsonRecipientAddress.java | 6 +---- .../asamk/signal/json/JsonStoryMessage.java | 6 +---- .../signal/json/JsonSyncReadMessage.java | 5 +---- .../signal/json/JsonSyncStoryMessage.java | 4 +--- .../org/asamk/signal/json/JsonTextStyle.java | 6 +---- .../asamk/signal/json/JsonTypingMessage.java | 4 +--- .../asamk/signal/json/JsonUnpinMessage.java | 5 +---- 18 files changed, 21 insertions(+), 97 deletions(-) diff --git a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java index f1165ca3..db7a9915 100644 --- a/src/main/java/org/asamk/signal/json/JsonAdminDelete.java +++ b/src/main/java/org/asamk/signal/json/JsonAdminDelete.java @@ -7,10 +7,7 @@ import java.util.UUID; @JsonSchema(title = "AdminDelete") public record JsonAdminDelete( - @Deprecated String targetAuthor, - String targetAuthorNumber, - String targetAuthorUuid, - long targetSentTimestamp + @Deprecated String targetAuthor, String targetAuthorNumber, String targetAuthorUuid, long targetSentTimestamp ) { static JsonAdminDelete from(MessageEnvelope.Data.AdminDelete adminDelete) { diff --git a/src/main/java/org/asamk/signal/json/JsonCallMessage.java b/src/main/java/org/asamk/signal/json/JsonCallMessage.java index 33f8c27d..6cd94a92 100644 --- a/src/main/java/org/asamk/signal/json/JsonCallMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonCallMessage.java @@ -25,21 +25,14 @@ record JsonCallMessage( callMessage.iceUpdate().stream().map(IceUpdate::from).toList()); } - record Offer( - long id, - String type, - String opaque - ) { + record Offer(long id, String type, String opaque) { public static Offer from(final MessageEnvelope.Call.Offer offer) { return new Offer(offer.id(), offer.type().name(), Base64.getEncoder().encodeToString(offer.opaque())); } } - public record Answer( - long id, - String opaque - ) { + public record Answer(long id, String opaque) { public static Answer from(final MessageEnvelope.Call.Answer answer) { return new Answer(answer.id(), Base64.getEncoder().encodeToString(answer.opaque())); @@ -53,21 +46,14 @@ record JsonCallMessage( } } - public record Hangup( - long id, - String type, - int deviceId - ) { + public record Hangup(long id, String type, int deviceId) { public static Hangup from(final MessageEnvelope.Call.Hangup hangup) { return new Hangup(hangup.id(), hangup.type().name(), hangup.deviceId()); } } - public record IceUpdate( - long id, - String opaque - ) { + public record IceUpdate(long id, String opaque) { public static IceUpdate from(final MessageEnvelope.Call.IceUpdate iceUpdate) { return new IceUpdate(iceUpdate.id(), Base64.getEncoder().encodeToString(iceUpdate.opaque())); diff --git a/src/main/java/org/asamk/signal/json/JsonContactAvatar.java b/src/main/java/org/asamk/signal/json/JsonContactAvatar.java index dcd5d5ba..ff686f1a 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactAvatar.java +++ b/src/main/java/org/asamk/signal/json/JsonContactAvatar.java @@ -5,10 +5,7 @@ import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "ContactAvatar") -public record JsonContactAvatar( - JsonAttachment attachment, - boolean isProfile -) { +public record JsonContactAvatar(JsonAttachment attachment, boolean isProfile) { static JsonContactAvatar from(MessageEnvelope.Data.SharedContact.Avatar avatar) { return new JsonContactAvatar(JsonAttachment.from(avatar.attachment()), avatar.isProfile()); diff --git a/src/main/java/org/asamk/signal/json/JsonContactEmail.java b/src/main/java/org/asamk/signal/json/JsonContactEmail.java index 2cb9fa2d..4967f29f 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactEmail.java +++ b/src/main/java/org/asamk/signal/json/JsonContactEmail.java @@ -6,11 +6,7 @@ import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Util; @JsonSchema(title = "ContactEmail") -public record JsonContactEmail( - String value, - String type, - String label -) { +public record JsonContactEmail(String value, String type, String label) { static JsonContactEmail from(MessageEnvelope.Data.SharedContact.Email email) { return new JsonContactEmail(email.value(), email.type().name(), Util.getStringIfNotBlank(email.label())); diff --git a/src/main/java/org/asamk/signal/json/JsonContactName.java b/src/main/java/org/asamk/signal/json/JsonContactName.java index d4d961fb..b9d85a99 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactName.java +++ b/src/main/java/org/asamk/signal/json/JsonContactName.java @@ -7,12 +7,7 @@ import org.asamk.signal.util.Util; @JsonSchema(title = "ContactName") public record JsonContactName( - String nickname, - String given, - String family, - String prefix, - String suffix, - String middle + String nickname, String given, String family, String prefix, String suffix, String middle ) { static JsonContactName from(MessageEnvelope.Data.SharedContact.Name name) { diff --git a/src/main/java/org/asamk/signal/json/JsonContactPhone.java b/src/main/java/org/asamk/signal/json/JsonContactPhone.java index 2e306486..186e4e51 100644 --- a/src/main/java/org/asamk/signal/json/JsonContactPhone.java +++ b/src/main/java/org/asamk/signal/json/JsonContactPhone.java @@ -6,11 +6,7 @@ import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Util; @JsonSchema(title = "ContactPhone") -public record JsonContactPhone( - String value, - String type, - String label -) { +public record JsonContactPhone(String value, String type, String label) { static JsonContactPhone from(MessageEnvelope.Data.SharedContact.Phone phone) { return new JsonContactPhone(phone.value(), phone.type().name(), Util.getStringIfNotBlank(phone.label())); diff --git a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java index 9dcb306b..69297d0c 100644 --- a/src/main/java/org/asamk/signal/json/JsonGroupInfo.java +++ b/src/main/java/org/asamk/signal/json/JsonGroupInfo.java @@ -6,12 +6,7 @@ import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "GroupInfo") -record JsonGroupInfo( - String groupId, - String groupName, - int revision, - String type -) { +record JsonGroupInfo(String groupId, String groupName, int revision, String type) { static JsonGroupInfo from(MessageEnvelope.Data.GroupContext groupContext, Manager m) { return new JsonGroupInfo(groupContext.groupId().toBase64(), diff --git a/src/main/java/org/asamk/signal/json/JsonMention.java b/src/main/java/org/asamk/signal/json/JsonMention.java index 2a3bb872..0d88e736 100644 --- a/src/main/java/org/asamk/signal/json/JsonMention.java +++ b/src/main/java/org/asamk/signal/json/JsonMention.java @@ -7,13 +7,7 @@ import org.asamk.signal.manager.api.MessageEnvelope; import java.util.UUID; @JsonSchema(title = "Mention") -public record JsonMention( - @Deprecated String name, - String number, - String uuid, - int start, - int length -) { +public record JsonMention(@Deprecated String name, String number, String uuid, int start, int length) { static JsonMention from(MessageEnvelope.Data.Mention mention) { final var address = mention.recipient(); diff --git a/src/main/java/org/asamk/signal/json/JsonPollCreate.java b/src/main/java/org/asamk/signal/json/JsonPollCreate.java index f388c27a..25b8d884 100644 --- a/src/main/java/org/asamk/signal/json/JsonPollCreate.java +++ b/src/main/java/org/asamk/signal/json/JsonPollCreate.java @@ -8,9 +8,7 @@ import java.util.List; @JsonSchema(title = "PollCreate") public record JsonPollCreate( - String question, - boolean allowMultiple, - List options + String question, boolean allowMultiple, List options ) { static JsonPollCreate from(MessageEnvelope.Data.PollCreate pollCreate) { diff --git a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java index 7972d441..9d98bf86 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java +++ b/src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java @@ -7,9 +7,7 @@ import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "QuotedAttachment") public record JsonQuotedAttachment( - String contentType, - String filename, - @JsonInclude(JsonInclude.Include.NON_NULL) JsonAttachment thumbnail + String contentType, String filename, @JsonInclude(JsonInclude.Include.NON_NULL) JsonAttachment thumbnail ) { static JsonQuotedAttachment from(MessageEnvelope.Data.Attachment quotedAttachment) { diff --git a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java index e8b29c02..26a4aca5 100644 --- a/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonReceiptMessage.java @@ -7,13 +7,7 @@ import org.asamk.signal.manager.api.MessageEnvelope; import java.util.List; @JsonSchema(title = "ReceiptMessage") -record JsonReceiptMessage( - long when, - boolean isDelivery, - boolean isRead, - boolean isViewed, - List timestamps -) { +record JsonReceiptMessage(long when, boolean isDelivery, boolean isRead, boolean isViewed, List timestamps) { static JsonReceiptMessage from(MessageEnvelope.Receipt receiptMessage) { final var when = receiptMessage.when(); diff --git a/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java b/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java index e8b11675..5236461f 100644 --- a/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java +++ b/src/main/java/org/asamk/signal/json/JsonRecipientAddress.java @@ -7,11 +7,7 @@ import org.asamk.signal.manager.api.RecipientAddress; import java.util.UUID; @JsonSchema(title = "RecipientAddress") -public record JsonRecipientAddress( - String uuid, - String number, - String username -) { +public record JsonRecipientAddress(String uuid, String number, String username) { public static JsonRecipientAddress from(RecipientAddress address) { return new JsonRecipientAddress(address.uuid().map(UUID::toString).orElse(null), diff --git a/src/main/java/org/asamk/signal/json/JsonStoryMessage.java b/src/main/java/org/asamk/signal/json/JsonStoryMessage.java index 808d1f10..5b7495c3 100644 --- a/src/main/java/org/asamk/signal/json/JsonStoryMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonStoryMessage.java @@ -45,11 +45,7 @@ record JsonStoryMessage( } public record Gradient( - String startColor, - String endColor, - List colors, - List positions, - Integer angle + String startColor, String endColor, List colors, List positions, Integer angle ) { static Gradient from(MessageEnvelope.Story.TextAttachment.Gradient gradient) { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java index 76663964..e2c4a6e9 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java @@ -8,10 +8,7 @@ import java.util.UUID; @JsonSchema(title = "SyncReadMessage") record JsonSyncReadMessage( - @Deprecated String sender, - String senderNumber, - String senderUuid, - long timestamp + @Deprecated String sender, String senderNumber, String senderUuid, long timestamp ) { static JsonSyncReadMessage from(MessageEnvelope.Sync.Read readMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java index 737b7870..b8254a8f 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncStoryMessage.java @@ -9,9 +9,7 @@ import java.util.UUID; @JsonSchema(title = "SyncStoryMessage") record JsonSyncStoryMessage( - String destinationNumber, - String destinationUuid, - @JsonUnwrapped JsonStoryMessage dataMessage + String destinationNumber, String destinationUuid, @JsonUnwrapped JsonStoryMessage dataMessage ) { static JsonSyncStoryMessage from(MessageEnvelope.Sync.Sent transcriptMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonTextStyle.java b/src/main/java/org/asamk/signal/json/JsonTextStyle.java index 05d1c33e..87591c2b 100644 --- a/src/main/java/org/asamk/signal/json/JsonTextStyle.java +++ b/src/main/java/org/asamk/signal/json/JsonTextStyle.java @@ -5,11 +5,7 @@ import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.TextStyle; @JsonSchema(title = "TextStyle") -public record JsonTextStyle( - String style, - int start, - int length -) { +public record JsonTextStyle(String style, int start, int length) { static JsonTextStyle from(TextStyle textStyle) { return new JsonTextStyle(textStyle.style().name(), textStyle.start(), textStyle.length()); diff --git a/src/main/java/org/asamk/signal/json/JsonTypingMessage.java b/src/main/java/org/asamk/signal/json/JsonTypingMessage.java index f97abfbc..dae86d74 100644 --- a/src/main/java/org/asamk/signal/json/JsonTypingMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonTypingMessage.java @@ -8,9 +8,7 @@ import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "TypingMessage") record JsonTypingMessage( - String action, - long timestamp, - @JsonInclude(JsonInclude.Include.NON_NULL) String groupId + String action, long timestamp, @JsonInclude(JsonInclude.Include.NON_NULL) String groupId ) { static JsonTypingMessage from(MessageEnvelope.Typing typingMessage) { diff --git a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java index 5ea65aa4..6b5ffa5c 100644 --- a/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonUnpinMessage.java @@ -8,10 +8,7 @@ import java.util.UUID; @JsonSchema(title = "UnpinMessage") public record JsonUnpinMessage( - @Deprecated String targetAuthor, - String targetAuthorNumber, - String targetAuthorUuid, - long targetSentTimestamp + @Deprecated String targetAuthor, String targetAuthorNumber, String targetAuthorUuid, long targetSentTimestamp ) { static JsonUnpinMessage from(MessageEnvelope.Data.UnpinMessage unpinMessage) { From 11ee28a2e1bae142734f37e635ef54a857c4a394 Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Sat, 7 Mar 2026 02:14:25 +0100 Subject: [PATCH 20/22] Revert more changes --- src/main/java/org/asamk/signal/json/JsonEditMessage.java | 5 +---- src/main/java/org/asamk/signal/json/JsonPayment.java | 5 +---- src/main/java/org/asamk/signal/json/JsonPreview.java | 7 +------ src/main/java/org/asamk/signal/json/JsonSticker.java | 5 +---- src/main/java/org/asamk/signal/json/JsonStoryContext.java | 4 +--- 5 files changed, 5 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/asamk/signal/json/JsonEditMessage.java b/src/main/java/org/asamk/signal/json/JsonEditMessage.java index 81537b32..922c4716 100644 --- a/src/main/java/org/asamk/signal/json/JsonEditMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonEditMessage.java @@ -6,10 +6,7 @@ import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "EditMessage") -record JsonEditMessage( - long targetSentTimestamp, - JsonDataMessage dataMessage -) { +record JsonEditMessage(long targetSentTimestamp, JsonDataMessage dataMessage) { static JsonEditMessage from(MessageEnvelope.Edit editMessage, Manager m) { return new JsonEditMessage(editMessage.targetSentTimestamp(), diff --git a/src/main/java/org/asamk/signal/json/JsonPayment.java b/src/main/java/org/asamk/signal/json/JsonPayment.java index f4450e86..7d7addd4 100644 --- a/src/main/java/org/asamk/signal/json/JsonPayment.java +++ b/src/main/java/org/asamk/signal/json/JsonPayment.java @@ -5,10 +5,7 @@ import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "Payment") -public record JsonPayment( - String note, - byte[] receipt -) { +public record JsonPayment(String note, byte[] receipt) { static JsonPayment from(MessageEnvelope.Data.Payment payment) { return new JsonPayment(payment.note(), payment.receipt()); diff --git a/src/main/java/org/asamk/signal/json/JsonPreview.java b/src/main/java/org/asamk/signal/json/JsonPreview.java index 781a926c..9fd0a37a 100644 --- a/src/main/java/org/asamk/signal/json/JsonPreview.java +++ b/src/main/java/org/asamk/signal/json/JsonPreview.java @@ -5,12 +5,7 @@ import io.micronaut.jsonschema.JsonSchema; import org.asamk.signal.manager.api.MessageEnvelope; @JsonSchema(title = "Preview") -public record JsonPreview( - String url, - String title, - String description, - JsonAttachment image -) { +public record JsonPreview(String url, String title, String description, JsonAttachment image) { static JsonPreview from(MessageEnvelope.Data.Preview preview) { return new JsonPreview(preview.url(), diff --git a/src/main/java/org/asamk/signal/json/JsonSticker.java b/src/main/java/org/asamk/signal/json/JsonSticker.java index d4cdb876..5723a1c4 100644 --- a/src/main/java/org/asamk/signal/json/JsonSticker.java +++ b/src/main/java/org/asamk/signal/json/JsonSticker.java @@ -6,10 +6,7 @@ import org.asamk.signal.manager.api.MessageEnvelope; import org.asamk.signal.util.Hex; @JsonSchema(title = "Sticker") -public record JsonSticker( - String packId, - int stickerId -) { +public record JsonSticker(String packId, int stickerId) { static JsonSticker from(MessageEnvelope.Data.Sticker sticker) { final var packId = Hex.toStringCondensed(sticker.packId().serialize()); diff --git a/src/main/java/org/asamk/signal/json/JsonStoryContext.java b/src/main/java/org/asamk/signal/json/JsonStoryContext.java index 09be4053..31e1dfff 100644 --- a/src/main/java/org/asamk/signal/json/JsonStoryContext.java +++ b/src/main/java/org/asamk/signal/json/JsonStoryContext.java @@ -8,9 +8,7 @@ import java.util.UUID; @JsonSchema(title = "StoryContext") record JsonStoryContext( - String authorNumber, - String authorUuid, - long sentTimestamp + String authorNumber, String authorUuid, long sentTimestamp ) { static JsonStoryContext from(MessageEnvelope.Data.StoryContext storyContext) { From cafced7a670241badeeab5c54e0550621e398655 Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Sat, 7 Mar 2026 02:18:45 +0100 Subject: [PATCH 21/22] Better formatting --- src/main/java/org/asamk/signal/json/JsonContact.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asamk/signal/json/JsonContact.java b/src/main/java/org/asamk/signal/json/JsonContact.java index 07e026d4..4d49bdbb 100644 --- a/src/main/java/org/asamk/signal/json/JsonContact.java +++ b/src/main/java/org/asamk/signal/json/JsonContact.java @@ -28,7 +28,7 @@ public record JsonContact( @JsonInclude(JsonInclude.Include.NON_NULL) JsonInternal internal ) { - @JsonSchema(title = "Profile") + @JsonSchema(title = "Profile") public record JsonProfile( long lastUpdateTimestamp, String givenName, @@ -39,7 +39,7 @@ public record JsonContact( String mobileCoinAddress ) {} - @JsonSchema(title = "Internal") + @JsonSchema(title = "Internal") public record JsonInternal( List capabilities, String unidentifiedAccessMode, From 14b48e4784c4b7ad38fb59a92636667bc932a921 Mon Sep 17 00:00:00 2001 From: Era Dorta Date: Sat, 7 Mar 2026 02:19:25 +0100 Subject: [PATCH 22/22] Simplified name --- README.md | 2 +- build.gradle.kts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1b9147f8..494d6006 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,7 @@ version installed, you can replace `./gradlew` with `gradle` in the following st 1. Generate [JSON Schema](https://json-schema.org/) files for all the JSON-RPC data classes (`src/main/java/org/asamk/signal/json`): ```sh - ./gradlew genJsonSchemas + ./gradlew jsonSchemas ``` 2. The generated files can be found in the `build/classes/java/schemas/META-INF/schemas` folder. diff --git a/build.gradle.kts b/build.gradle.kts index 5da77916..550f3f81 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -101,7 +101,7 @@ dependencies { implementation(libs.logback) implementation(libs.zxing) implementation(libs.micronaut.json.schema.annotations) - if (gradle.startParameter.taskNames.any { it.contains("genJsonSchemas") }) { + if (gradle.startParameter.taskNames.any { it.contains("jsonSchemas") }) { implementation(libs.micronaut.json.schema.generator) } implementation(project(":libsignal-cli")) @@ -119,7 +119,7 @@ tasks.withType().configureEach { isReproducibleFileOrder = true } -tasks.withType() { +tasks.withType { options.encoding = "UTF-8" } @@ -197,7 +197,7 @@ val compileJsonSchemas by tasks.registering(JavaCompile::class) { } } -tasks.register("genJsonSchemas") { +tasks.register("jsonSchemas") { group = "application" description = "Generate JSON schemas using annotation processing" dependsOn(compileJsonSchemas)