From ad82b2b388321a8ed40b584a7d56c57c4340722a Mon Sep 17 00:00:00 2001 From: Mitch Gaffigan Date: Sat, 18 Oct 2025 13:29:14 -0500 Subject: [PATCH 1/2] Add Jackson JSON as application/mirthapi+json Signed-off-by: Mitch Gaffigan --- .../lib/jackson/jackson-jaxrs-base-2.14.3.jar | Bin 0 -> 31656 bytes .../jackson-jaxrs-json-provider-2.14.3.jar | Bin 0 -> 16686 bytes ...jackson-module-jaxb-annotations-2.14.3.jar | Bin 0 -> 36785 bytes .../client/core/api/ApiContentTypes.java | 9 ++++++ .../JacksonJsonObjectMapperConfig.java | 30 ++++++++++++++++++ .../mirth/connect/server/MirthWebServer.java | 2 ++ 6 files changed, 41 insertions(+) create mode 100644 server/lib/jackson/jackson-jaxrs-base-2.14.3.jar create mode 100644 server/lib/jackson/jackson-jaxrs-json-provider-2.14.3.jar create mode 100644 server/lib/jackson/jackson-module-jaxb-annotations-2.14.3.jar create mode 100644 server/src/com/mirth/connect/client/core/api/ApiContentTypes.java create mode 100644 server/src/com/mirth/connect/client/core/api/providers/JacksonJsonObjectMapperConfig.java diff --git a/server/lib/jackson/jackson-jaxrs-base-2.14.3.jar b/server/lib/jackson/jackson-jaxrs-base-2.14.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..918d555f80c25cebf1b11e8c8d2f2e7bca7cda80 GIT binary patch literal 31656 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 literal 0 HcmV?d00001 diff --git a/server/lib/jackson/jackson-module-jaxb-annotations-2.14.3.jar b/server/lib/jackson/jackson-module-jaxb-annotations-2.14.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..471403caee02c4949944d69ddf3308dbbd836a23 GIT binary patch literal 36785 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 { + + private final ObjectMapper objectMapper; + + public JacksonJsonObjectMapperConfig() { + objectMapper = new ObjectMapper(); + // Be forward compatible with unknown properties + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + // Match the Swagger documented format for dates and null handling + objectMapper.registerModule(new JavaTimeModule()); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + } + + @Override + public ObjectMapper getContext(Class aClass) { + return objectMapper; + } +} \ No newline at end of file diff --git a/server/src/com/mirth/connect/server/MirthWebServer.java b/server/src/com/mirth/connect/server/MirthWebServer.java index b4ab2b3bbf..7f6b93e460 100644 --- a/server/src/com/mirth/connect/server/MirthWebServer.java +++ b/server/src/com/mirth/connect/server/MirthWebServer.java @@ -471,6 +471,8 @@ private void addApiServlets(HandlerList handlers, ServletContextHandler apiServl } ApiProviders apiProviders = getApiProviders(apiVersion); + apiProviders.providerClasses.add(com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider.class); + apiProviders.providerClasses.add(com.mirth.connect.client.core.api.providers.JacksonJsonObjectMapperConfig.class); // Add versioned Jersey API servlet ServletHolder jerseyVersionedServlet = apiServletContextHandler.addServlet(ServletContainer.class, "/*"); From 39c95233a430d29b9f541433795ab98b145d4173 Mon Sep 17 00:00:00 2001 From: Mitch Gaffigan Date: Sat, 18 Oct 2025 13:35:29 -0500 Subject: [PATCH 2/2] Add application/mirthapi+json to each endpoint Signed-off-by: Mitch Gaffigan --- .../api/servlets/AlertServletInterface.java | 50 +++-- .../ChannelGroupServletInterface.java | 26 ++- .../api/servlets/ChannelServletInterface.java | 53 +++-- .../ChannelStatisticsServletInterface.java | 32 +-- .../ChannelStatusServletInterface.java | 46 +++-- .../CodeTemplateServletInterface.java | 108 +++++++---- .../ConfigurationServletInterface.java | 183 +++++++++++------- .../DatabaseTaskServletInterface.java | 21 +- .../api/servlets/EngineServletInterface.java | 11 +- .../api/servlets/EventServletInterface.java | 41 ++-- .../servlets/ExtensionServletInterface.java | 51 +++-- .../api/servlets/MessageServletInterface.java | 67 ++++--- .../api/servlets/SystemServletInterface.java | 11 +- .../api/servlets/UsageServletInterface.java | 16 +- .../api/servlets/UserServletInterface.java | 49 +++-- .../DocumentConnectorServletInterface.java | 13 +- .../file/FileConnectorServletInterface.java | 27 ++- .../http/HttpConnectorServletInterface.java | 16 +- .../DatabaseConnectorServletInterface.java | 8 +- .../jms/JmsConnectorServletInterface.java | 20 +- .../smtp/SmtpConnectorServletInterface.java | 16 +- .../tcp/TcpConnectorServletInterface.java | 16 +- .../WebServiceConnectorServletInterface.java | 38 ++-- ...hboardConnectorStatusServletInterface.java | 37 ++-- .../DataPrunerServletInterface.java | 16 +- .../DirectoryResourceServletInterface.java | 13 +- .../GlobalMapServletInterface.java | 14 +- .../serverlog/ServerLogServletInterface.java | 13 +- 28 files changed, 641 insertions(+), 371 deletions(-) diff --git a/server/src/com/mirth/connect/client/core/api/servlets/AlertServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/AlertServletInterface.java index ae5742d903..08eedf0cb4 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/AlertServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/AlertServletInterface.java @@ -37,6 +37,7 @@ import com.mirth.connect.client.core.Permissions; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.Param; import com.mirth.connect.model.ChannelHeader; import com.mirth.connect.model.alert.AlertInfo; @@ -45,8 +46,8 @@ @Path("/alerts") @Tag(name = "Alerts") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface AlertServletInterface extends BaseServletInterface { @POST @@ -58,7 +59,8 @@ public void createAlert( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "alert", ref = "../apiexamples/alert_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "alert", ref = "../apiexamples/alert_json") }) }) AlertModel alertModel) + @ExampleObject(name = "alert", ref = "../apiexamples/alert_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON) }) AlertModel alertModel) throws ClientException; @GET @@ -68,7 +70,8 @@ public void createAlert( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "alert", ref = "../apiexamples/alert_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "alert", ref = "../apiexamples/alert_json") }), }) + @ExampleObject(name = "alert", ref = "../apiexamples/alert_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAlert", display = "Get alerts", permission = Permissions.ALERTS_VIEW) public AlertModel getAlert( @Param("alertId") @Parameter(description = "The ID of the alert.", required = true) @PathParam("alertId") String alertId) @@ -81,7 +84,8 @@ public AlertModel getAlert( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "alert_list", ref = "../apiexamples/alert_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "alert_list", ref = "../apiexamples/alert_list_json") }), }) + @ExampleObject(name = "alert_list", ref = "../apiexamples/alert_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAlert", display = "Get alerts", permission = Permissions.ALERTS_VIEW) public List getAlerts( @Param("alertIds") @Parameter(description = "The ID of the alert(s). If absent, all alerts will be returned.") @QueryParam("alertId") Set alertIds) @@ -94,14 +98,17 @@ public List getAlerts( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "alert_list", ref = "../apiexamples/alert_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "alert_list", ref = "../apiexamples/alert_list_json") }) }) + @ExampleObject(name = "alert_list", ref = "../apiexamples/alert_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAlert", display = "Get alerts", permission = Permissions.ALERTS_VIEW) public List getAlertsPost( @Param("alertIds") @RequestBody(description = "The ID of the alert(s). If absent, all alerts will be returned.", content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "alert_set", ref = "../apiexamples/guid_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "alert_set", ref = "../apiexamples/guid_set_json") }) }) Set alertIds) + @ExampleObject(name = "alert_set", ref = "../apiexamples/guid_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) + Set alertIds) throws ClientException; @GET @@ -111,7 +118,8 @@ public List getAlertsPost( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "alert_status_list", ref = "../apiexamples/alert_status_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "alert_status_list", ref = "../apiexamples/alert_status_list_json") }) }) + @ExampleObject(name = "alert_status_list", ref = "../apiexamples/alert_status_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAlertStatusList", display = "Get alert status list", permission = Permissions.ALERTS_VIEW, type = ExecuteType.ASYNC, auditable = false) public List getAlertStatusList() throws ClientException; @@ -122,7 +130,8 @@ public List getAlertsPost( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "alert_info", ref = "../apiexamples/alert_info_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "alert_info", ref = "../apiexamples/alert_info_json") }) }) + @ExampleObject(name = "alert_info", ref = "../apiexamples/alert_info_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAlertInfo", display = "Get alert info", permission = Permissions.ALERTS_VIEW, auditable = false) public AlertInfo getAlertInfo(// @formatter:off @Param("alertId") @Parameter(description = "The ID of the alert.", required = true) @PathParam("alertId") String alertId, @@ -130,7 +139,9 @@ public AlertInfo getAlertInfo(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channel_header_map", ref = "../apiexamples/channel_header_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channel_header_map", ref = "../apiexamples/channel_header_map_json") }) }) Map cachedChannels) + @ExampleObject(name = "channel_header_map", ref = "../apiexamples/channel_header_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) + Map cachedChannels) throws ClientException; // @formatter:on @@ -141,23 +152,28 @@ public AlertInfo getAlertInfo(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "alert_info", ref = "../apiexamples/alert_info_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "alert_info", ref = "../apiexamples/alert_info_json") }) }) + @ExampleObject(name = "alert_info", ref = "../apiexamples/alert_info_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAlertInfo", display = "Get alert info", permission = Permissions.ALERTS_VIEW) public AlertInfo getAlertInfo( @Param("cachedChannels") @RequestBody(description = "A map of ChannelHeader objects telling the server the state of the client-side channel cache.", required = true, content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channel_header_map", ref = "../apiexamples/channel_header_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channel_header_map", ref = "../apiexamples/channel_header_map_json") }) }) Map cachedChannels) + @ExampleObject(name = "channel_header_map", ref = "../apiexamples/channel_header_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) + Map cachedChannels) throws ClientException; @GET @Path("/options") @Operation(summary = "Returns all alert protocol options.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "alert_protocol_options", ref = "../apiexamples/alert_protocol_options_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "alert_protocol_options", ref = "../apiexamples/alert_protocol_options_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "alert_protocol_options", ref = "../apiexamples/alert_protocol_options_json") }) }) + @ExampleObject(name = "alert_protocol_options", ref = "../apiexamples/alert_protocol_options_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAlertProtocolOptions", display = "Get alert protocol options", permission = Permissions.ALERTS_VIEW, auditable = false) public Map> getAlertProtocolOptions() throws ClientException; @@ -171,7 +187,9 @@ public void updateAlert(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "alert", ref = "../apiexamples/alert_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "alert", ref = "../apiexamples/alert_json") }) }) AlertModel alertModel) + @ExampleObject(name = "alert", ref = "../apiexamples/alert_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) + AlertModel alertModel) throws ClientException; // @formatter:on diff --git a/server/src/com/mirth/connect/client/core/api/servlets/ChannelGroupServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/ChannelGroupServletInterface.java index f223750a21..9260e441b1 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/ChannelGroupServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/ChannelGroupServletInterface.java @@ -34,6 +34,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; import com.mirth.connect.client.core.Permissions; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -41,38 +42,43 @@ @Path("/channelgroups") @Tag(name = "Channel Groups") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface ChannelGroupServletInterface extends BaseServletInterface { @GET @Path("/") @Operation(summary = "Retrieve a list of all channel groups, or multiple channel groups by ID.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "channel_group_list", ref = "../apiexamples/channel_group_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "channel_group_list", ref = "../apiexamples/channel_group_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channel_group_list", ref = "../apiexamples/channel_group_list_json") }) }) + @ExampleObject(name = "channel_group_list", ref = "../apiexamples/channel_group_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelGroups", display = "Get channel groups", permission = Permissions.CHANNEL_GROUPS_VIEW, type = ExecuteType.ASYNC, auditable = false) public List getChannelGroups(@Param("channelGroupIds") @Parameter(description = "The IDs of the channel groups to retrieve. If absent, all groups will be retrieved.") @QueryParam("channelGroupId") Set channelGroupIds) throws ClientException; @POST @Path("/_getChannelGroups") @Operation(summary = "Retrieve a list of all channel groups, or multiple channel groups by ID. This is a POST request alternative to GET /channelgroups that may be used when there are too many channel group IDs to include in the query parameters.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "channel_group_list", ref = "../apiexamples/channel_group_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "channel_group_list", ref = "../apiexamples/channel_group_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channel_group_list", ref = "../apiexamples/channel_group_list_json") }) }) + @ExampleObject(name = "channel_group_list", ref = "../apiexamples/channel_group_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelGroups", display = "Get channel groups", permission = Permissions.CHANNEL_GROUPS_VIEW, type = ExecuteType.ASYNC, auditable = false) public List getChannelGroupsPost(@Param("channelGroupIds") @RequestBody(description = "The IDs of the channel groups to retrieve. If absent, all groups will be retrieved.", content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "group_set", ref = "../apiexamples/guid_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "group_set", ref = "../apiexamples/guid_set_json") }) }) Set channelGroupIds) throws ClientException; + @ExampleObject(name = "group_set", ref = "../apiexamples/guid_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Set channelGroupIds) throws ClientException; @POST @Path("/_bulkUpdate") @Consumes(MediaType.MULTIPART_FORM_DATA) - @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN }) + @Produces({ MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON, MediaType.TEXT_PLAIN }) @Operation(summary = "Updates all channel groups in one request. " + SWAGGER_TRY_IT_OUT_DISCLAIMER) @MirthOperation(name = "updateChannelGroups", display = "Update channel groups", permission = Permissions.CHANNELS_MANAGE) public boolean updateChannelGroups(// @formatter:off diff --git a/server/src/com/mirth/connect/client/core/api/servlets/ChannelServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/ChannelServletInterface.java index fa32cb3e42..fe2c7b4f63 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/ChannelServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/ChannelServletInterface.java @@ -38,6 +38,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; import com.mirth.connect.client.core.Permissions; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -50,33 +51,35 @@ @Path("/channels") @Tag(name = "Channels") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface ChannelServletInterface extends BaseServletInterface { @POST @Path("/") @Operation(summary = "Creates a new channel.") @MirthOperation(name = "createChannel", display = "Create channel", permission = Permissions.CHANNELS_MANAGE) - @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN }) + @Produces({ MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON, MediaType.TEXT_PLAIN }) public boolean createChannel( @Param("channel") @RequestBody(description = "The Channel object to create.", required = true, content = { @Content(mediaType = MediaType.APPLICATION_XML, schema = @Schema(implementation = Channel.class), examples = { @ExampleObject(name = "channel", ref = "../apiexamples/channel_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, schema = @Schema(implementation = Channel.class), examples = { - @ExampleObject(name = "channel", ref = "../apiexamples/channel_json") }) }) Channel channel) + @ExampleObject(name = "channel", ref = "../apiexamples/channel_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Channel channel) throws ClientException; @GET @Path("/") - @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) - @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) + @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) @Operation(summary = "Retrieve a list of all channels, or multiple channels by ID.") @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channelList", ref = "../apiexamples/channel_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelList", ref = "../apiexamples/channel_list_json") }) }) + @ExampleObject(name = "channelList", ref = "../apiexamples/channel_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannels", display = "Get channels", permission = Permissions.CHANNELS_VIEW) public List getChannels( @Param("channelIds") @Parameter(description = "The IDs of the channels to retrieve. If absent, all channels will be retrieved.") @QueryParam("channelId") Set channelIds, @@ -91,14 +94,16 @@ public List getChannels( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channel", ref = "../apiexamples/channel_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channel", ref = "../apiexamples/channel_list_json") }) }) + @ExampleObject(name = "channel", ref = "../apiexamples/channel_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannels", display = "Get channels", permission = Permissions.CHANNELS_VIEW) public List getChannelsPost( @Param("channelIds") @RequestBody(description = "The IDs of the channels to retrieve. If absent, all channels will be retrieved.", content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channelIds", ref = "../apiexamples/guid_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelIds", ref = "../apiexamples/guid_set_json") }) }) Set channelIds, + @ExampleObject(name = "channelIds", ref = "../apiexamples/guid_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Set channelIds, @Param("pollingOnly") @Parameter(description = "If true, only channels with polling source connectors will be returned.") @QueryParam("pollingOnly") boolean pollingOnly, @Param("includeCodeTemplateLibraries") @Parameter(description = "If true, code template libraries will be included in the channel.") @QueryParam("includeCodeTemplateLibraries") boolean includeCodeTemplateLibraries) throws ClientException; @@ -110,7 +115,8 @@ public List getChannelsPost( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channel", ref = "../apiexamples/channel_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channel", ref = "../apiexamples/channel_json") }) }) + @ExampleObject(name = "channel", ref = "../apiexamples/channel_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannel", display = "Get channel", permission = Permissions.CHANNELS_VIEW) public Channel getChannel( @Param("channelId") @Parameter(description = "The ID of the channel to retrieve.", required = true) @PathParam("channelId") String channelId, @@ -124,7 +130,8 @@ public Channel getChannel( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "connectorNameMap", ref = "../apiexamples/connector_name_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connectorNameMap", ref = "../apiexamples/connector_name_map_json") }) }) + @ExampleObject(name = "connectorNameMap", ref = "../apiexamples/connector_name_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getConnectorNames", display = "Get connector names", permission = Permissions.MESSAGES_VIEW, auditable = false) public Map getConnectorNames( @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId) @@ -137,7 +144,8 @@ public Map getConnectorNames( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "metadataColumnList", ref = "../apiexamples/metadatacolumn_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "metadataColumnList", ref = "../apiexamples/metadatacolumn_list_json") }) }) + @ExampleObject(name = "metadataColumnList", ref = "../apiexamples/metadatacolumn_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getMetaDataColumns", display = "Get metadata columns", permission = Permissions.MESSAGES_VIEW, auditable = false) public List getMetaDataColumns( @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId) @@ -150,7 +158,8 @@ public List getMetaDataColumns( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channelNameMap", ref = "../apiexamples/guid_to_name_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelNameMap", ref = "../apiexamples/guid_to_name_map_json") }) }) + @ExampleObject(name = "channelNameMap", ref = "../apiexamples/guid_to_name_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelIdsAndNames", display = "Get channel IDs and names", permission = Permissions.CHANNELS_VIEW, type = ExecuteType.ASYNC, auditable = false) public Map getChannelIdsAndNames() throws ClientException; @@ -162,7 +171,8 @@ public List getMetaDataColumns( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "ports_used", ref = "../apiexamples/ports_used_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "ports_used", ref = "../apiexamples/ports_used_json") }) }) + @ExampleObject(name = "ports_used", ref = "../apiexamples/ports_used_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelPortsInUse", display = "Get Ports In Use", permission = Permissions.CHANNELS_VIEW, type = ExecuteType.ASYNC, auditable = false) public List getChannelPortsInUse() throws ClientException; @@ -174,14 +184,17 @@ public List getMetaDataColumns( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channelSummaryList", ref = "../apiexamples/channel_summary_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelSummaryList", ref = "../apiexamples/channel_summary_list_json") }) }) + @ExampleObject(name = "channelSummaryList", ref = "../apiexamples/channel_summary_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelSummary", display = "Get channel summary", permission = Permissions.CHANNELS_VIEW, type = ExecuteType.ASYNC, auditable = false) public List getChannelSummary(// @formatter:off @Param("cachedChannels") @RequestBody(description = "A map of ChannelHeader objects telling the server the state of the client-side channel cache.", required = true, content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "cachedChannels", ref = "../apiexamples/channel_header_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "cachedChannels", ref = "../apiexamples/channel_header_map_json") }) }) Map cachedChannels, + @ExampleObject(name = "cachedChannels", ref = "../apiexamples/channel_header_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) + Map cachedChannels, @Param("ignoreNewChannels") @Parameter(description = "If true, summaries will only be returned for channels in the map's entry set.", required = true) @QueryParam("ignoreNewChannels") boolean ignoreNewChannels) throws ClientException; // @formatter: on @@ -236,14 +249,15 @@ public void setChannelInitialState(// @formatter:off @Path("/{channelId}") @Operation(summary = "Updates the specified channel.") @MirthOperation(name = "updateChannel", display = "Update channel", permission = Permissions.CHANNELS_MANAGE) - @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN }) + @Produces({ MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON, MediaType.TEXT_PLAIN }) public boolean updateChannel(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel to update.", required = true) @PathParam("channelId") String channelId, @Param("channel") @RequestBody(description = "The Channel object to update with.", required = true, content = { @Content(mediaType = MediaType.APPLICATION_XML, schema = @Schema(implementation = Channel.class), examples = { @ExampleObject(name = "channel", ref = "../apiexamples/channel_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, schema = @Schema(implementation = Channel.class), examples = { - @ExampleObject(name = "channel", ref = "../apiexamples/channel_json") }) }) Channel channel, + @ExampleObject(name = "channel", ref = "../apiexamples/channel_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Channel channel, @Param("override") @Parameter(description = "If true, the channel will be updated even if a different revision exists on the server.", schema = @Schema(defaultValue = "false")) @QueryParam("override") boolean override, @Param("startEdit") @Parameter(description = "Date and time starting to edit this channel. Example: 1985-10-26T09:00:00.000-0700") @QueryParam("startEdit") String startEdit) throws ClientException; @@ -274,6 +288,7 @@ public void removeChannelsPost( @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channelIds", ref = "../apiexamples/guid_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelIds", ref = "../apiexamples/guid_set_json") }) }) Set channelIds) + @ExampleObject(name = "channelIds", ref = "../apiexamples/guid_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Set channelIds) throws ClientException; } \ No newline at end of file diff --git a/server/src/com/mirth/connect/client/core/api/servlets/ChannelStatisticsServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/ChannelStatisticsServletInterface.java index a6ba58b07e..b96de4a0ba 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/ChannelStatisticsServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/ChannelStatisticsServletInterface.java @@ -34,6 +34,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Permissions; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -41,17 +42,19 @@ @Path("/channels") @Tag(name = "Channel Statistics") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface ChannelStatisticsServletInterface extends BaseServletInterface { @GET @Path("/statistics") @Operation(summary = "Returns the Statistics for all channels.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "channel_statistics_list", ref = "../apiexamples/channel_statistics_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "channel_statistics_list", ref = "../apiexamples/channel_statistics_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channel_statistics_list", ref = "../apiexamples/channel_statistics_list_json") }) }) + @ExampleObject(name = "channel_statistics_list", ref = "../apiexamples/channel_statistics_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAllStatistics", display = "Get all statistics", permission = Permissions.DASHBOARD_VIEW, auditable = false) public List getStatistics(//@formatter:off @Param("channelIds") @Parameter(description = "The IDs of the channels to retrieve. If absent, all channels will be retrieved.") @QueryParam("channelId") Set channelIds, @@ -65,10 +68,12 @@ public List getStatistics(//@formatter:off @Path("/statistics/_getStatistics") @Consumes(MediaType.MULTIPART_FORM_DATA) @Operation(summary = "Returns the Statistics for all channels. This is a POST request alternative to GET /statistics that may be used when there are too many channel IDs to include in the query parameters.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "channel_statistics_list", ref = "../apiexamples/channel_statistics_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "channel_statistics_list", ref = "../apiexamples/channel_statistics_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channel_statistics_list", ref = "../apiexamples/channel_statistics_list_json") }) }) + @ExampleObject(name = "channel_statistics_list", ref = "../apiexamples/channel_statistics_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAllStatistics", display = "Get all statistics", permission = Permissions.DASHBOARD_VIEW, auditable = false) public List getStatisticsPost(//@formatter:off @Param("channelIds") @Parameter(description = "The IDs of the channels to retrieve. If absent, all channels will be retrieved.") @FormDataParam("channelIds") Set channelIds, @@ -81,10 +86,12 @@ public List getStatisticsPost(//@formatter:off @GET @Path("/{channelId}/statistics") @Operation(summary = "Returns the Statistics for the channel with the specified id.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "channel_statistics", ref = "../apiexamples/channel_statistics_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "channel_statistics", ref = "../apiexamples/channel_statistics_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channel_statistics", ref = "../apiexamples/channel_statistics_json") }) }) + @ExampleObject(name = "channel_statistics", ref = "../apiexamples/channel_statistics_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getStatistics", display = "Get statistics", permission = Permissions.DASHBOARD_VIEW, auditable = false) public ChannelStatistics getStatistics(@Param("channelId") @Parameter(description = "The ID of the channel to retrieve statistics for.", required = true) @PathParam("channelId") String channelId) throws ClientException; @@ -98,7 +105,8 @@ public void clearStatistics(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "connector_map", ref = "../apiexamples/connector_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connector_map", ref = "../apiexamples/connector_map_json") }) }) + @ExampleObject(name = "connector_map", ref = "../apiexamples/connector_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Map> channelConnectorMap, @Param("received") @Parameter(description = "If true, received stats will be cleared.") @QueryParam("received") boolean received, diff --git a/server/src/com/mirth/connect/client/core/api/servlets/ChannelStatusServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/ChannelStatusServletInterface.java index 18e64c5b28..8db14656f7 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/ChannelStatusServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/ChannelStatusServletInterface.java @@ -35,6 +35,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; import com.mirth.connect.client.core.Permissions; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -43,27 +44,31 @@ @Path("/channels") @Tag(name = "Channel Status Operations") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface ChannelStatusServletInterface extends BaseServletInterface { @GET @Path("/{channelId}/status") @Operation(summary = "Returns the dashboard status for a single channel ID.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "dashboard_status", ref = "../apiexamples/dashboard_status_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "dashboard_status", ref = "../apiexamples/dashboard_status_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "dashboard_status", ref = "../apiexamples/dashboard_status_json") }) }) + @ExampleObject(name = "dashboard_status", ref = "../apiexamples/dashboard_status_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelStatus", display = "Get status for single channel", permission = Permissions.DASHBOARD_VIEW, type = ExecuteType.ASYNC, auditable = false) public DashboardStatus getChannelStatus(@Param("channelId") @Parameter(description = "The channel ID to return a dashboard status for.") @PathParam("channelId") String channelId) throws ClientException; @GET @Path("/statuses") @Operation(summary = "Returns all channel dashboard statuses, or multiple statuses by channel ID.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "dashboard_status_list", ref = "../apiexamples/dashboard_status_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "dashboard_status_list", ref = "../apiexamples/dashboard_status_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "dashboard_status_list", ref = "../apiexamples/dashboard_status_list_json") }) }) + @ExampleObject(name = "dashboard_status_list", ref = "../apiexamples/dashboard_status_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelStatusList", display = "Get status list for specific channels", permission = Permissions.DASHBOARD_VIEW, type = ExecuteType.ASYNC, auditable = false) public List getChannelStatusList(// @formatter:off @Param("channelIds") @Parameter(description = "The channel IDs to return dashboard statuses for. If absent, all statuses will be returned.") @QueryParam("channelId") Set channelIds, @@ -74,10 +79,12 @@ public List getChannelStatusList(// @formatter:off @POST @Path("/statuses/_getChannelStatusList") @Operation(summary = "Returns all channel dashboard statuses, or multiple statuses by channel ID. This is a POST request alternative to GET /statuses that may be used when there are too many channel IDs to include in the query parameters.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "dashboard_status_list", ref = "../apiexamples/dashboard_status_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "dashboard_status_list", ref = "../apiexamples/dashboard_status_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "dashboard_status_list", ref = "../apiexamples/dashboard_status_list_json") }) }) + @ExampleObject(name = "dashboard_status_list", ref = "../apiexamples/dashboard_status_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelStatusList", display = "Get status list for specific channels", permission = Permissions.DASHBOARD_VIEW, type = ExecuteType.ASYNC, auditable = false) public List getChannelStatusListPost(// @formatter:off @Param("channelIds") @@ -85,7 +92,8 @@ public List getChannelStatusListPost(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channel_set", ref = "../apiexamples/guid_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channel_set", ref = "../apiexamples/guid_set_json") }) }) + @ExampleObject(name = "channel_set", ref = "../apiexamples/guid_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Set channelIds, @Param("filter") @Parameter(description = "The filter string to limit dashboard statuses with.") @QueryParam("filter") String filter, @@ -95,10 +103,12 @@ public List getChannelStatusListPost(// @formatter:off @GET @Path("/statuses/initial") @Operation(summary = "Returns a DashboardChannelInfo object containing a partial channel status list and a set of remaining channel IDs.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "dashboard_channel_info", ref = "../apiexamples/dashboard_channel_info_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "dashboard_channel_info", ref = "../apiexamples/dashboard_channel_info_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "dashboard_channel_info", ref = "../apiexamples/dashboard_channel_info_json") }) }) + @ExampleObject(name = "dashboard_channel_info", ref = "../apiexamples/dashboard_channel_info_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelStatusListInitial", display = "Get initial channel status list", permission = Permissions.DASHBOARD_VIEW, type = ExecuteType.ASYNC, auditable = false) public DashboardChannelInfo getDashboardChannelInfo(// @formatter:off @Param("fetchSize") @Parameter(description = "Specifies the maximum number of statuses to return.", required = true, schema = @Schema(defaultValue = "100")) @QueryParam("fetchSize") int fetchSize, @@ -220,7 +230,8 @@ public void startConnectors(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "start_connector_map", ref = "../apiexamples/start_connector_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "start_connector_map", ref = "../apiexamples/start_connector_map_json") }) }) + @ExampleObject(name = "start_connector_map", ref = "../apiexamples/start_connector_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Map> connectorInfo, @Param("returnErrors") @Parameter(description = "If true, an error response code and the exception will be returned.") @QueryParam("returnErrors") boolean returnErrors) throws ClientException; @@ -246,7 +257,8 @@ public void stopConnectors(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "start_connector_map", ref = "../apiexamples/start_connector_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "start_connector_map", ref = "../apiexamples/start_connector_map_json") }) }) + @ExampleObject(name = "start_connector_map", ref = "../apiexamples/start_connector_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Map> connectorInfo, @Param("returnErrors") @Parameter(description = "If true, an error response code and the exception will be returned.") @QueryParam("returnErrors") boolean returnErrors) throws ClientException; diff --git a/server/src/com/mirth/connect/client/core/api/servlets/CodeTemplateServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/CodeTemplateServletInterface.java index e435436c41..89f1ac175d 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/CodeTemplateServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/CodeTemplateServletInterface.java @@ -38,6 +38,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; import com.mirth.connect.client.core.Permissions; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -48,19 +49,21 @@ @Path("/") @Tag(name = "Code Templates") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface CodeTemplateServletInterface extends BaseServletInterface { @GET @Path("/codeTemplateLibraries") @Operation(summary = "Retrieves multiple code template libraries by ID, or all libraries if not specified.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "code_template_library_list", ref = "../apiexamples/code_template_library_list_xml"), - @ExampleObject(name = "code_template_library_list_full_templates", ref = "../apiexamples/code_template_library_list_full_templates_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "code_template_library_list", ref = "../apiexamples/code_template_library_list_xml"), + @ExampleObject(name = "code_template_library_list_full_templates", ref = "../apiexamples/code_template_library_list_full_templates_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { @ExampleObject(name = "code_template_library_list", ref = "../apiexamples/code_template_library_list_json"), - @ExampleObject(name = "code_template_library_list_full_templates", ref = "../apiexamples/code_template_library_list_full_templates_json") }) }) + @ExampleObject(name = "code_template_library_list_full_templates", ref = "../apiexamples/code_template_library_list_full_templates_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getCodeTemplateLibraries", display = "Get code template libraries", permission = Permissions.CODE_TEMPLATES_VIEW, type = ExecuteType.ASYNC, auditable = false) public List getCodeTemplateLibraries(// @formatter:off @Param("libraryIds") @Parameter(description = "The ID of the library(s) to retrieve.") @QueryParam("libraryId") Set libraryIds, @@ -70,12 +73,14 @@ public List getCodeTemplateLibraries(// @formatter:off @POST @Path("/codeTemplateLibraries/_getCodeTemplateLibraries") @Operation(summary = "Retrieves multiple code template libraries by ID, or all libraries if not specified. This is a POST request alternative to GET /codeTemplateLibraries that may be used when there are too many library IDs to include in the query parameters.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "code_template_library_list", ref = "../apiexamples/code_template_library_list_xml"), - @ExampleObject(name = "code_template_library_list_full_templates", ref = "../apiexamples/code_template_library_list_full_templates_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "code_template_library_list", ref = "../apiexamples/code_template_library_list_xml"), + @ExampleObject(name = "code_template_library_list_full_templates", ref = "../apiexamples/code_template_library_list_full_templates_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { @ExampleObject(name = "code_template_library_list", ref = "../apiexamples/code_template_library_list_json"), - @ExampleObject(name = "code_template_library_list_full_templates", ref = "../apiexamples/code_template_library_list_full_templates_json") }) }) + @ExampleObject(name = "code_template_library_list_full_templates", ref = "../apiexamples/code_template_library_list_full_templates_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getCodeTemplateLibraries", display = "Get code template libraries", permission = Permissions.CODE_TEMPLATES_VIEW, type = ExecuteType.ASYNC, auditable = false) public List getCodeTemplateLibrariesPost(// @formatter:off @Param("libraryIds") @@ -83,7 +88,8 @@ public List getCodeTemplateLibrariesPost(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "code_template_library_id_set", ref = "../apiexamples/guid_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "code_template_library_id_set", ref = "../apiexamples/guid_set_json") }) }) + @ExampleObject(name = "code_template_library_id_set", ref = "../apiexamples/guid_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Set libraryIds, @Param("includeCodeTemplates") @Parameter(description = "If true, full code templates will be included inside each library.", schema = @Schema(defaultValue = "false")) @QueryParam("includeCodeTemplates") boolean includeCodeTemplates) throws ClientException; // @formatter:on @@ -91,12 +97,14 @@ public List getCodeTemplateLibrariesPost(// @formatter:off @GET @Path("/codeTemplateLibraries/{libraryId}") @Operation(summary = "Retrieves a single code template library.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "code_template_library", ref = "../apiexamples/code_template_library_xml"), - @ExampleObject(name = "code_template_library_full_templates", ref = "../apiexamples/code_template_library_full_templates_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "code_template_library", ref = "../apiexamples/code_template_library_xml"), + @ExampleObject(name = "code_template_library_full_templates", ref = "../apiexamples/code_template_library_full_templates_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { @ExampleObject(name = "code_template_library", ref = "../apiexamples/code_template_library_json"), - @ExampleObject(name = "code_template_library_full_templates", ref = "../apiexamples/code_template_library_full_templates_json") }) }) + @ExampleObject(name = "code_template_library_full_templates", ref = "../apiexamples/code_template_library_full_templates_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getCodeTemplateLibrary", display = "Get code template library", permission = Permissions.CODE_TEMPLATES_VIEW, type = ExecuteType.ASYNC) public CodeTemplateLibrary getCodeTemplateLibrary(// @formatter:off @Param("libraryId") @Parameter(description = "The ID of the library to retrieve.") @PathParam("libraryId") String libraryId, @@ -106,10 +114,12 @@ public CodeTemplateLibrary getCodeTemplateLibrary(// @formatter:off @PUT @Path("/codeTemplateLibraries") @Operation(summary = "Replaces all code template libraries.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "libraries_replaced", ref = "../apiexamples/boolean_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "libraries_replaced", ref = "../apiexamples/boolean_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "libraries_replaced", ref = "../apiexamples/boolean_json") }) }) + @ExampleObject(name = "libraries_replaced", ref = "../apiexamples/boolean_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "updateCodeTemplateLibraries", display = "Update code template libraries", permission = Permissions.CODE_TEMPLATES_MANAGE) public boolean updateCodeTemplateLibraries(// @formatter:off @Param("libraries") @@ -117,7 +127,8 @@ public boolean updateCodeTemplateLibraries(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "code_template_library_list_full_templates", ref = "../apiexamples/code_template_library_list_full_templates_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "code_template_library_list_full_templates", ref = "../apiexamples/code_template_library_list_full_templates_json") }) }) + @ExampleObject(name = "code_template_library_list_full_templates", ref = "../apiexamples/code_template_library_list_full_templates_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) List libraries, @Param("override") @Parameter(description = "If true, the code template library will be updated even if a different revision exists on the server.", schema = @Schema(defaultValue = "false")) @QueryParam("override") boolean override) throws ClientException; // @formatter:on @@ -125,60 +136,72 @@ public boolean updateCodeTemplateLibraries(// @formatter:off @GET @Path("/codeTemplates") @Operation(summary = "Retrieves multiple code templates by ID, or all templates if not specified.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "code_template_list", ref = "../apiexamples/code_template_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "code_template_list", ref = "../apiexamples/code_template_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "code_template_list", ref = "../apiexamples/code_template_list_json") }) }) + @ExampleObject(name = "code_template_list", ref = "../apiexamples/code_template_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getCodeTemplates", display = "Get code templates", permission = Permissions.CODE_TEMPLATES_VIEW) public List getCodeTemplates(@Param("codeTemplateIds") @Parameter(description = "The ID of the code template(s) to retrieve.") @QueryParam("codeTemplateId") Set codeTemplateIds) throws ClientException; @POST @Path("/codeTemplates/_getCodeTemplates") @Operation(summary = "Retrieves multiple code templates by ID, or all templates if not specified. This is a POST request alternative to GET /codeTemplates that may be used when there are too many code template IDs to include in the query parameters.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "code_template_list", ref = "../apiexamples/code_template_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "code_template_list", ref = "../apiexamples/code_template_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "code_template_list", ref = "../apiexamples/code_template_list_json") }) }) + @ExampleObject(name = "code_template_list", ref = "../apiexamples/code_template_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getCodeTemplates", display = "Get code templates", permission = Permissions.CODE_TEMPLATES_VIEW) public List getCodeTemplatesPost(@Param("codeTemplateIds") @RequestBody(description = "The ID of the code template(s) to retrieve.", content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "code_template_id_set", ref = "../apiexamples/guid_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "code_template_id_set", ref = "../apiexamples/guid_set_json") }) }) Set codeTemplateIds) throws ClientException; + @ExampleObject(name = "code_template_id_set", ref = "../apiexamples/guid_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Set codeTemplateIds) throws ClientException; @GET @Path("/codeTemplates/{codeTemplateId}") @Operation(summary = "Retrieves a single code template.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "code_template", ref = "../apiexamples/code_template_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "code_template", ref = "../apiexamples/code_template_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "code_template", ref = "../apiexamples/code_template_json") }) }) + @ExampleObject(name = "code_template", ref = "../apiexamples/code_template_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getCodeTemplates", display = "Get code templates", permission = Permissions.CODE_TEMPLATES_VIEW) public CodeTemplate getCodeTemplate(@Param("codeTemplateId") @Parameter(description = "The ID of the code template to retrieve.") @PathParam("codeTemplateId") String codeTemplateId) throws ClientException; @POST @Path("/codeTemplates/_getSummary") @Operation(summary = "Returns a list of code template summaries, indicating to a client which code templates have changed. If a code template was modified, the entire CodeTemplate object will be returned.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "code_template_summary_list", ref = "../apiexamples/code_template_summary_list_xml"), - @ExampleObject(name = "code_template_summary_list_revision_changed", ref = "../apiexamples/code_template_summary_list_revision_changed_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "code_template_summary_list", ref = "../apiexamples/code_template_summary_list_xml"), + @ExampleObject(name = "code_template_summary_list_revision_changed", ref = "../apiexamples/code_template_summary_list_revision_changed_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { @ExampleObject(name = "code_template_summary_list", ref = "../apiexamples/code_template_summary_list_json"), - @ExampleObject(name = "code_template_summary_list_revision_changed", ref = "../apiexamples/code_template_summary_list_revision_changed_json") }) }) + @ExampleObject(name = "code_template_summary_list_revision_changed", ref = "../apiexamples/code_template_summary_list_revision_changed_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getCodeTemplateSummary", display = "Get code template summary", permission = Permissions.CODE_TEMPLATES_VIEW, type = ExecuteType.ASYNC, auditable = false) public List getCodeTemplateSummary(@Param("clientRevisions") @RequestBody(description = "A map of revisions telling the server the state of the client-side code template cache.", required = true, content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "guid_to_int_map", ref = "../apiexamples/guid_to_int_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "guid_to_int_map", ref = "../apiexamples/guid_to_int_map_json") }) }) Map clientRevisions) throws ClientException; + @ExampleObject(name = "guid_to_int_map", ref = "../apiexamples/guid_to_int_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Map clientRevisions) throws ClientException; @PUT @Path("/codeTemplates/{codeTemplateId}") @Operation(summary = "Updates a single code template.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "code_template_replaced", ref = "../apiexamples/boolean_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "code_template_replaced", ref = "../apiexamples/boolean_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "code_template_replaced", ref = "../apiexamples/boolean_json") }) }) + @ExampleObject(name = "code_template_replaced", ref = "../apiexamples/boolean_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "updateCodeTemplate", display = "Update code template", permission = Permissions.CODE_TEMPLATES_MANAGE) public boolean updateCodeTemplate(// @formatter:off @Param("codeTemplateId") @Parameter(description = "The ID of the code template.", required = true) @PathParam("codeTemplateId") String codeTemplateId, @@ -188,7 +211,8 @@ public boolean updateCodeTemplate(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "code_template", ref = "../apiexamples/code_template_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "code_template", ref = "../apiexamples/code_template_json") }) }) + @ExampleObject(name = "code_template", ref = "../apiexamples/code_template_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) CodeTemplate codeTemplate, @Param("override") @Parameter(description = "If true, the code template will be updated even if a different revision exists on the server.", schema = @Schema(defaultValue = "false")) @QueryParam("override") boolean override) throws ClientException; @@ -204,10 +228,12 @@ public boolean updateCodeTemplate(// @formatter:off @Path("/codeTemplateLibraries/_bulkUpdate") @Consumes(MediaType.MULTIPART_FORM_DATA) @Operation(summary = "Updates all libraries and updates/removes selected code templates in one request. " + SWAGGER_TRY_IT_OUT_DISCLAIMER) - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "code_template_library_saved_result", ref = "../apiexamples/code_template_library_saved_result_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "code_template_library_saved_result", ref = "../apiexamples/code_template_library_saved_result_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "code_template_library_saved_result", ref = "../apiexamples/code_template_library_saved_result_json") }) }) + @ExampleObject(name = "code_template_library_saved_result", ref = "../apiexamples/code_template_library_saved_result_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "updateCodeTemplatesAndLibraries", display = "Update code templates and libraries", permission = Permissions.CODE_TEMPLATES_MANAGE) public CodeTemplateLibrarySaveResult updateLibrariesAndTemplates(// @formatter:off @Param("libraries") diff --git a/server/src/com/mirth/connect/client/core/api/servlets/ConfigurationServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/ConfigurationServletInterface.java index 9f8d391bfe..50f3c4188c 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/ConfigurationServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/ConfigurationServletInterface.java @@ -37,6 +37,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; import com.mirth.connect.client.core.Permissions; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -59,8 +60,8 @@ @Path("/server") @Tag(name = "Server Configuration") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface ConfigurationServletInterface extends BaseServletInterface { @GET @@ -91,7 +92,8 @@ public interface ConfigurationServletInterface extends BaseServletInterface { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "status", ref = "../apiexamples/integer_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "status", ref = "../apiexamples/integer_json") }) }) + @ExampleObject(name = "status", ref = "../apiexamples/integer_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getStatus", display = "Get status") public int getStatus() throws ClientException; @@ -109,7 +111,8 @@ public interface ConfigurationServletInterface extends BaseServletInterface { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "serverTime", ref = "../apiexamples/calendar_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "serverTime", ref = "../apiexamples/calendar_json") }) }) + @ExampleObject(name = "serverTime", ref = "../apiexamples/calendar_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getServerTime", display = "Get server time", auditable = false) public Calendar getServerTime() throws ClientException; @@ -127,17 +130,20 @@ public interface ConfigurationServletInterface extends BaseServletInterface { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "aboutMap", ref = "../apiexamples/generic_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "aboutMap", ref = "../apiexamples/generic_map_json") }) }) + @ExampleObject(name = "aboutMap", ref = "../apiexamples/generic_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAbout", display = "Get about information", auditable = false) public Map getAbout() throws ClientException; @GET @Path("/configuration") @Operation(summary = "Returns a ServerConfiguration object which contains all of the channels, alerts, configuration map, and properties stored on the server.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "serverConfiguration", ref = "../apiexamples/server_configuration_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "serverConfiguration", ref = "../apiexamples/server_configuration_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "serverConfiguration", ref = "../apiexamples/server_configuration_json") }) }) + @ExampleObject(name = "serverConfiguration", ref = "../apiexamples/server_configuration_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getServerConfiguration", display = "Get server configuration", permission = Permissions.SERVER_CONFIGURATION_BACKUP) public ServerConfiguration getServerConfiguration(// @formatter:off @Param("initialState") @Parameter(description = "The initial state to set all channels in the configuration to.", schema = @Schema(allowableValues = {"STARTED", "PAUSED", "STOPPED"}, type = "string")) @QueryParam("initialState") DeployedState initialState, @@ -154,7 +160,8 @@ public void setServerConfiguration(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "serverConfiguration", ref = "../apiexamples/server_configuration_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "serverConfiguration", ref = "../apiexamples/server_configuration_json") }) }) ServerConfiguration serverConfiguration, + @ExampleObject(name = "serverConfiguration", ref = "../apiexamples/server_configuration_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) ServerConfiguration serverConfiguration, @Param("deploy") @Parameter(description = "If true, all enabled channels will be deployed after the configuration is restored.", schema = @Schema(defaultValue = "false")) @QueryParam(value = "deploy") boolean deploy, @Param("overwriteConfigMap") @Parameter(description = "If true, overwrite the Configuration Map") @QueryParam(value = "overwriteConfigMap") boolean overwriteConfigMap) throws ClientException; // @formatter:on @@ -162,20 +169,24 @@ public void setServerConfiguration(// @formatter:off @GET @Path("/charsets") @Operation(summary = "Returns a List of all of the charset encodings supported by the server.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "charsetEncodings", ref = "../apiexamples/charset_encoding_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "charsetEncodings", ref = "../apiexamples/charset_encoding_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "charsetEncodings", ref = "../apiexamples/charset_encoding_list_json") }) }) + @ExampleObject(name = "charsetEncodings", ref = "../apiexamples/charset_encoding_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAvailableCharsetEncodings", display = "Get available charset encodings", auditable = false) public List getAvailableCharsetEncodings() throws ClientException; @GET @Path("/settings") @Operation(summary = "Returns a ServerSettings object with all server settings.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "serverSettings", ref = "../apiexamples/server_settings_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "serverSettings", ref = "../apiexamples/server_settings_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "serverSettings", ref = "../apiexamples/server_settings_json") }) }) + @ExampleObject(name = "serverSettings", ref = "../apiexamples/server_settings_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getServerSettings", display = "Get server settings", permission = Permissions.SERVER_SETTINGS_VIEW, auditable = false) public ServerSettings getServerSettings() throws ClientException; @@ -187,15 +198,18 @@ public void setServerSettings(@Param("settings") @RequestBody(description = "The @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "serverSettings", ref = "../apiexamples/server_settings_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "serverSettings", ref = "../apiexamples/server_settings_json") }) }) ServerSettings settings) throws ClientException; + @ExampleObject(name = "serverSettings", ref = "../apiexamples/server_settings_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) ServerSettings settings) throws ClientException; @GET @Path("/publicSettings") @Operation(summary = "Returns a PublicServerSettings object containing server settings available to all users.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "publicServerSettings", ref = "../apiexamples/public_server_settings_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "publicServerSettings", ref = "../apiexamples/public_server_settings_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "publicServerSettings", ref = "../apiexamples/public_server_settings_json") }) }) + @ExampleObject(name = "publicServerSettings", ref = "../apiexamples/public_server_settings_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getPublicServerSettings", display = "Get public server settings", auditable = false) public PublicServerSettings getPublicServerSettings() throws ClientException; @@ -212,10 +226,12 @@ public String getProperty( @GET @Path("/encryption") @Operation(summary = "Returns an EncryptionSettings object with all encryption settings.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "encryptionSettings", ref = "../apiexamples/encryption_settings_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "encryptionSettings", ref = "../apiexamples/encryption_settings_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "encryptionSettings", ref = "../apiexamples/encryption_settings_json") }) }) + @ExampleObject(name = "encryptionSettings", ref = "../apiexamples/encryption_settings_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getEncryptionSettings", display = "Get encryption settings") public EncryptionSettings getEncryptionSettings() throws ClientException; @@ -227,15 +243,18 @@ public ConnectionTestResponse sendTestEmail(@Param("properties") @RequestBody(de @Content(mediaType = MediaType.APPLICATION_XML, schema = @Schema(implementation = Properties.class), examples = { @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, schema = @Schema(implementation = Properties.class), examples = { - @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_json") }) }) Properties properties) throws ClientException; + @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Properties properties) throws ClientException; @GET @Path("/updateSettings") @Operation(summary = "Returns an UpdateSettings object with all update settings.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "updateSettings", ref = "../apiexamples/update_settings_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "updateSettings", ref = "../apiexamples/update_settings_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "updateSettings", ref = "../apiexamples/update_settings_json") }) }) + @ExampleObject(name = "updateSettings", ref = "../apiexamples/update_settings_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getUpdateSettings", display = "Get update settings", auditable = false) public UpdateSettings getUpdateSettings() throws ClientException; @@ -247,15 +266,18 @@ public void setUpdateSettings(@Param("settings") @RequestBody(description = "The @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "updateSetings", ref = "../apiexamples/update_settings_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "updateSettings", ref = "../apiexamples/update_settings_json") }) }) UpdateSettings settings) throws ClientException; + @ExampleObject(name = "updateSettings", ref = "../apiexamples/update_settings_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) UpdateSettings settings) throws ClientException; @GET @Path("/licenseInfo") @Operation(summary = "Returns a LicenseInfo object with the expiration date and other information.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "licenseInfo", ref = "../apiexamples/license_info_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "licenseInfo", ref = "../apiexamples/license_info_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "licenseInfo", ref = "../apiexamples/license_info_json") }) }) + @ExampleObject(name = "licenseInfo", ref = "../apiexamples/license_info_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getLicenseInfo", display = "Get license info", auditable = false) public LicenseInfo getLicenseInfo() throws ClientException; @@ -269,10 +291,12 @@ public void setUpdateSettings(@Param("settings") @RequestBody(description = "The @GET @Path("/globalScripts") @Operation(summary = "Returns a map containing all of the global scripts.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "globalScripts", ref = "../apiexamples/global_scripts_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "globalScripts", ref = "../apiexamples/global_scripts_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "globalScripts", ref = "../apiexamples/global_scripts_json") }) }) + @ExampleObject(name = "globalScripts", ref = "../apiexamples/global_scripts_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getGlobalScripts", display = "Get global scripts", permission = Permissions.GLOBAL_SCRIPTS_VIEW) public Map getGlobalScripts() throws ClientException; @@ -284,15 +308,18 @@ public void setGlobalScripts(@Param("scripts") @RequestBody(description = "The m @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "globalScripts", ref = "../apiexamples/global_scripts_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "globalScripts", ref = "../apiexamples/global_scripts_json") }) }) Map scripts) throws ClientException; + @ExampleObject(name = "globalScripts", ref = "../apiexamples/global_scripts_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Map scripts) throws ClientException; @GET @Path("/configurationMap") @Operation(summary = "Returns all entries in the configuration map.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "configurationMap", ref = "../apiexamples/configuration_map_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "configurationMap", ref = "../apiexamples/configuration_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "configurationMap", ref = "../apiexamples/configuration_map_json") }) }) + @ExampleObject(name = "configurationMap", ref = "../apiexamples/configuration_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getConfigurationMap", display = "Get configuration map", permission = Permissions.CONFIGURATION_MAP_VIEW) public Map getConfigurationMap() throws ClientException; @@ -304,15 +331,18 @@ public void setConfigurationMap(@Param("map") @RequestBody(description = "The ne @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "configurationMap", ref = "../apiexamples/configuration_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "configurationMap", ref = "../apiexamples/configuration_map_json") }) }) Map map) throws ClientException; + @ExampleObject(name = "configurationMap", ref = "../apiexamples/configuration_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Map map) throws ClientException; @GET @Path("/databaseDrivers") @Operation(summary = "Returns the database driver list.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "driverInfoList", ref = "../apiexamples/driver_info_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "driverInfoList", ref = "../apiexamples/driver_info_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "driverInfoList", ref = "../apiexamples/driver_info_list_json") }) }) + @ExampleObject(name = "driverInfoList", ref = "../apiexamples/driver_info_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getDatabaseDrivers", display = "Get database drivers", auditable = false, type = ExecuteType.ASYNC) public List getDatabaseDrivers() throws ClientException; @@ -324,25 +354,30 @@ public void setDatabaseDrivers(@Param("drivers") @RequestBody(description = "The @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "driverInfoList", ref = "../apiexamples/driver_info_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "driverInfoList", ref = "../apiexamples/driver_info_list_json") }) }) List drivers) throws ClientException; + @ExampleObject(name = "driverInfoList", ref = "../apiexamples/driver_info_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) List drivers) throws ClientException; @GET @Path("/passwordRequirements") @Operation(summary = "Returns all password requirements for the server.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "passwordRequirements", ref = "../apiexamples/password_requirements_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "passwordRequirements", ref = "../apiexamples/password_requirements_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "passwordRequirements", ref = "../apiexamples/password_requirements_json") }) }) + @ExampleObject(name = "passwordRequirements", ref = "../apiexamples/password_requirements_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getPasswordRequirements", display = "Get password requirements") public PasswordRequirements getPasswordRequirements() throws ClientException; @GET @Path("/resources") @Operation(summary = "Returns all resources for the server.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "resources", ref = "../apiexamples/resource_properties_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "resources", ref = "../apiexamples/resource_properties_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "resources", ref = "../apiexamples/resource_properties_list_json") }) }) + @ExampleObject(name = "resources", ref = "../apiexamples/resource_properties_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getResources", display = "Get resources", permission = Permissions.RESOURCES_VIEW, type = ExecuteType.ASYNC) public List getResources() throws ClientException; @@ -354,7 +389,8 @@ public void setResources(@Param("resources") @RequestBody(description = "The new @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "resources", ref = "../apiexamples/resource_properties_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "resources", ref = "../apiexamples/resource_properties_list_json") }) }) List resources) throws ClientException; + @ExampleObject(name = "resources", ref = "../apiexamples/resource_properties_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) List resources) throws ClientException; @POST @Path("/resources/{resourceId}/_reload") @@ -365,10 +401,12 @@ public void setResources(@Param("resources") @RequestBody(description = "The new @GET @Path("/channelDependencies") @Operation(summary = "Returns all channel dependencies for the server.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "channelDependencies", ref = "../apiexamples/channel_dependency_set_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "channelDependencies", ref = "../apiexamples/channel_dependency_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelDependencies", ref = "../apiexamples/channel_dependency_set_json") }) }) + @ExampleObject(name = "channelDependencies", ref = "../apiexamples/channel_dependency_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelDependencies", display = "Get channel dependencies", auditable = false) public Set getChannelDependencies() throws ClientException; @@ -380,15 +418,18 @@ public void setChannelDependencies(@Param("dependencies") @RequestBody(descripti @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channelDependencies", ref = "../apiexamples/channel_dependency_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelDependencies", ref = "../apiexamples/channel_dependency_set_json") }) }) Set dependencies) throws ClientException; + @ExampleObject(name = "channelDependencies", ref = "../apiexamples/channel_dependency_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Set dependencies) throws ClientException; @GET @Path("/channelMetadata") @Operation(summary = "Returns all channel metadata for the server.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "channelMetadata", ref = "../apiexamples/channel_metadata_map_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "channelMetadata", ref = "../apiexamples/channel_metadata_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelMetadata", ref = "../apiexamples/channel_metadata_map_json") }) }) + @ExampleObject(name = "channelMetadata", ref = "../apiexamples/channel_metadata_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelMetadata", display = "Get channel metadata", auditable = false) public Map getChannelMetadata() throws ClientException; @@ -400,25 +441,30 @@ public void setChannelMetadata(@Param("metadata") @RequestBody(description = "Th @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channelMetadata", ref = "../apiexamples/channel_metadata_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelMetadata", ref = "../apiexamples/channel_metadata_map_json") }) }) Map metadata) throws ClientException; + @ExampleObject(name = "channelMetadata", ref = "../apiexamples/channel_metadata_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Map metadata) throws ClientException; @GET @Path("/protocolsAndCipherSuites") @Operation(summary = "Returns a map containing all supported and enabled TLS protocols and cipher suites.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "protocolsAndCipherSuites", ref = "../apiexamples/protocols_and_cipher_suites_map_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "protocolsAndCipherSuites", ref = "../apiexamples/protocols_and_cipher_suites_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "protocolsAndCipherSuites", ref = "../apiexamples/protocols_and_cipher_suites_map_json") }) }) + @ExampleObject(name = "protocolsAndCipherSuites", ref = "../apiexamples/protocols_and_cipher_suites_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getProtocolsAndCipherSuites", display = "Get protocols and cipher suites", type = ExecuteType.ASYNC, auditable = false) public Map getProtocolsAndCipherSuites() throws ClientException; @GET @Path("/channelTags") @Operation(summary = "Returns a set containing all channel tags for the server.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "channelTags", ref = "../apiexamples/channel_tag_set_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "channelTags", ref = "../apiexamples/channel_tag_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelTags", ref = "../apiexamples/channel_tag_set_json") }) }) + @ExampleObject(name = "channelTags", ref = "../apiexamples/channel_tag_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelTags", display = "Get channel tags", permission = Permissions.TAGS_VIEW, type = ExecuteType.ASYNC, auditable = false) public Set getChannelTags() throws ClientException; @@ -430,15 +476,18 @@ public void setChannelTags(@Param("channelTags") @RequestBody(description = "The @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channelTags", ref = "../apiexamples/channel_tag_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelTags", ref = "../apiexamples/channel_tag_set_json") }) }) Set channelTags) throws ClientException; + @ExampleObject(name = "channelTags", ref = "../apiexamples/channel_tag_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Set channelTags) throws ClientException; @GET @Path("/rhinoLanguageVersion") @Operation(summary = "Returns the language version that the Rhino engine should use.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "rhinoLanguageVersion", ref = "../apiexamples/integer_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "rhinoLanguageVersion", ref = "../apiexamples/integer_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "rhinoLanguageVersion", ref = "../apiexamples/integer_json") }) }) + @ExampleObject(name = "rhinoLanguageVersion", ref = "../apiexamples/integer_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getRhinoLanguageVersion", display = "Get rhino language version", type = ExecuteType.ASYNC, auditable = false) public int getRhinoLanguageVersion() throws ClientException; } \ No newline at end of file diff --git a/server/src/com/mirth/connect/client/core/api/servlets/DatabaseTaskServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/DatabaseTaskServletInterface.java index b4715188db..557c080736 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/DatabaseTaskServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/DatabaseTaskServletInterface.java @@ -28,6 +28,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Permissions; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -35,27 +36,31 @@ @Path("/databaseTasks") @Tag(name = "Database Tasks") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface DatabaseTaskServletInterface extends BaseServletInterface { @GET @Path("/") @Operation(summary = "Retrieves all current database tasks.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "database_task_map", ref = "../apiexamples/database_task_map_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "database_task_map", ref = "../apiexamples/database_task_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "database_task_map", ref = "../apiexamples/database_task_map_json") }) }) + @ExampleObject(name = "database_task_map", ref = "../apiexamples/database_task_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getDatabaseTasks", display = "Get database tasks", permission = Permissions.DATABASE_TASKS_VIEW) public Map getDatabaseTasks() throws ClientException; @GET @Path("/{databaseTaskId}") @Operation(summary = "Retrieves a single database task.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "database_task", ref = "../apiexamples/database_task_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "database_task", ref = "../apiexamples/database_task_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "database_task", ref = "../apiexamples/database_task_json") }) }) + @ExampleObject(name = "database_task", ref = "../apiexamples/database_task_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getDatabaseTask", display = "Get database task", permission = Permissions.DATABASE_TASKS_VIEW) public DatabaseTask getDatabaseTask(@Param("databaseTaskId") @Parameter(description = "The ID of the database task.", required = true) @PathParam("databaseTaskId") String databaseTaskId) throws ClientException; diff --git a/server/src/com/mirth/connect/client/core/api/servlets/EngineServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/EngineServletInterface.java index ca5306552c..0de5bacbcb 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/EngineServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/EngineServletInterface.java @@ -22,6 +22,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; import com.mirth.connect.client.core.Permissions; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -36,8 +37,8 @@ @Path("/channels") @Tag(name = "Channel Deployment Operations") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface EngineServletInterface extends BaseServletInterface { @POST @@ -70,7 +71,8 @@ public void deployChannels(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channel_set", ref = "../apiexamples/guid_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channel_set", ref = "../apiexamples/guid_set_json") }) }) + @ExampleObject(name = "channel_set", ref = "../apiexamples/guid_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Set channelIds, @Param("returnErrors") @Parameter(description = "If true, an error response code and the exception will be returned.") @QueryParam("returnErrors") boolean returnErrors) throws ClientException; // @formatter:on @@ -94,7 +96,8 @@ public void undeployChannels(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channel_set", ref = "../apiexamples/guid_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channel_set", ref = "../apiexamples/guid_set_json") }) }) + @ExampleObject(name = "channel_set", ref = "../apiexamples/guid_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Set channelIds, @Param("returnErrors") @Parameter(description = "If true, an error response code and the exception will be returned.") @QueryParam("returnErrors") boolean returnErrors) throws ClientException; // @formatter:on diff --git a/server/src/com/mirth/connect/client/core/api/servlets/EventServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/EventServletInterface.java index 361b9ad5df..3e4c40941b 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/EventServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/EventServletInterface.java @@ -33,6 +33,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Permissions; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -43,41 +44,46 @@ @Path("/events") @Tag(name = "Events") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface EventServletInterface extends BaseServletInterface { @GET @Path("/maxEventId") @Operation(summary = "Returns the maximum event ID currently in the database.") @MirthOperation(name = "getMaxEventId", display = "Get max event ID", permission = Permissions.EVENTS_VIEW, auditable = false) - @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN }) + @Produces({ MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON, MediaType.TEXT_PLAIN }) public Integer getMaxEventId() throws ClientException; @GET @Path("/{eventId}") @Operation(summary = "Retrieves an event by ID.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "serverEvent", ref = "../apiexamples/server_event_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "serverEvent", ref = "../apiexamples/server_event_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "serverEvent", ref = "../apiexamples/server_event_json") }) }) + @ExampleObject(name = "serverEvent", ref = "../apiexamples/server_event_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getEvent", display = "Get event by ID", permission = Permissions.EVENTS_VIEW, auditable = false, abortable = true) public ServerEvent getEvent(@Param("eventId") @Parameter(description = "The ID of the event.", required = true) @PathParam("eventId") Integer eventId) throws ClientException; @POST @Path("/_search") @Operation(summary = "Search for events by specific filter criteria.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "serverEventList", ref = "../apiexamples/server_event_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "serverEventList", ref = "../apiexamples/server_event_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "serverEventList", ref = "../apiexamples/server_event_list_json") }) }) + @ExampleObject(name = "serverEventList", ref = "../apiexamples/server_event_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getEvents", display = "Get events", permission = Permissions.EVENTS_VIEW, auditable = false, abortable = true) public List getEvents(// @formatter:off @Param("filter") @RequestBody(description = "The EventFilter object to use to query events by.", required = true, content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "filter", ref = "../apiexamples/event_filter_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "filter", ref = "../apiexamples/event_filter_json") }) }) EventFilter filter, + @ExampleObject(name = "filter", ref = "../apiexamples/event_filter_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) EventFilter filter, @Param("offset") @Parameter(description = "Used for pagination, determines where to start in the search results.", schema = @Schema(defaultValue = "0")) @QueryParam("offset") Integer offset, @Param("limit") @Parameter(description = "Used for pagination, determines the maximum number of results to return.", schema = @Schema(defaultValue = "20")) @QueryParam("limit") Integer limit) throws ClientException; // @formatter:on @@ -85,10 +91,12 @@ public List getEvents(// @formatter:off @GET @Path("/") @Operation(summary = "Search for events by specific filter criteria.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "serverEventList", ref = "../apiexamples/server_event_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "serverEventList", ref = "../apiexamples/server_event_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "serverEventList", ref = "../apiexamples/server_event_list_json") }) }) + @ExampleObject(name = "serverEventList", ref = "../apiexamples/server_event_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getEvents", display = "Get events", permission = Permissions.EVENTS_VIEW, auditable = false, abortable = true) public List getEvents(// @formatter:off @Param("maxEventId") @Parameter(description = "The maximum event ID to query.") @QueryParam("maxEventId") Integer maxEventId, @@ -110,18 +118,19 @@ public List getEvents(// @formatter:off @Path("/count/_search") @Operation(summary = "Count number for events by specific filter criteria.") @MirthOperation(name = "getEventCount", display = "Get events results count", permission = Permissions.EVENTS_VIEW, auditable = false, abortable = true) - @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN }) + @Produces({ MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON, MediaType.TEXT_PLAIN }) public Long getEventCount(@Param("filter") @RequestBody(description = "The EventFilter object to use to query events by.", required = true, content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "filter", ref = "../apiexamples/event_filter_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "filter", ref = "../apiexamples/event_filter_json") }) }) EventFilter filter) throws ClientException; + @ExampleObject(name = "filter", ref = "../apiexamples/event_filter_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) EventFilter filter) throws ClientException; @GET @Path("/count") @Operation(summary = "Count number for events by specific filter criteria.") @MirthOperation(name = "getEventCount", display = "Get events results count", permission = Permissions.EVENTS_VIEW, auditable = false, abortable = true) - @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN }) + @Produces({ MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON, MediaType.TEXT_PLAIN }) public Long getEventCount(// @formatter:off @Param("maxEventId") @Parameter(description = "The maximum event ID to query.") @QueryParam("maxEventId") Integer maxEventId, @Param("minEventId") @Parameter(description = "The minimum event ID to query.") @QueryParam("minEventId") Integer minEventId, diff --git a/server/src/com/mirth/connect/client/core/api/servlets/ExtensionServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/ExtensionServletInterface.java index 6945b1297e..6094430f7e 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/ExtensionServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/ExtensionServletInterface.java @@ -37,6 +37,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Permissions; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -46,8 +47,8 @@ @Path("/extensions") @Tag(name = "Extensions") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface ExtensionServletInterface extends BaseServletInterface { // These are statically declared because extensions can choose to include them in specific permission groups. @@ -69,25 +70,30 @@ public void uninstallExtension(@Param("extensionPath") @RequestBody(description @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "extensionPath", value = "/path/to/extension") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "extensionPath", value = "/path/to/extension") }) }) String extensionPath) throws ClientException; + @ExampleObject(name = "extensionPath", value = "/path/to/extension") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) String extensionPath) throws ClientException; @GET @Path("/{extensionName}") @Operation(summary = "Returns extension metadata by name.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "metadata", ref = "../apiexamples/connector_metadata_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "metadata", ref = "../apiexamples/connector_metadata_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "metadata", ref = "../apiexamples/connector_metadata_json") }) }) + @ExampleObject(name = "metadata", ref = "../apiexamples/connector_metadata_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getMetaDataByName", display = "Get extension metadata by name", auditable = false) public MetaData getExtensionMetaData(@Param("extensionName") @Parameter(description = "The name of the extension to retrieve.", required = true) @PathParam("extensionName") String extensionName) throws ClientException; @GET @Path("/connectors") @Operation(summary = "Returns all active connector metadata.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "connectorMetaDataMap", ref = "../apiexamples/connector_metadata_map_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "connectorMetaDataMap", ref = "../apiexamples/connector_metadata_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connectorMetaDataMap", ref = "../apiexamples/connector_metadata_map_json") }) }) + @ExampleObject(name = "connectorMetaDataMap", ref = "../apiexamples/connector_metadata_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getConnectorMetaData", display = "Get connector metadata", auditable = false) public Map getConnectorMetaData() throws ClientException; @@ -95,19 +101,23 @@ public void uninstallExtension(@Param("extensionPath") @RequestBody(description @Path("/plugins") @Operation(summary = "Returns all active plugin metadata.") @MirthOperation(name = "getPluginMetaData", display = "Get plugin metadata", auditable = false) - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "pluginMetaData", ref = "../apiexamples/plugin_metadata_map_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "pluginMetaData", ref = "../apiexamples/plugin_metadata_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "pluginMetaData", ref = "../apiexamples/plugin_metadata_map_json") }) }) + @ExampleObject(name = "pluginMetaData", ref = "../apiexamples/plugin_metadata_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) public Map getPluginMetaData() throws ClientException; @GET @Path("/{extensionName}/enabled") @Operation(summary = "Returns the enabled status of an extension.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "extensionEnabled", ref = "../apiexamples/boolean_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "extensionEnabled", ref = "../apiexamples/boolean_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "extensionEnabled", ref = "../apiexamples/boolean_json") }) }) + @ExampleObject(name = "extensionEnabled", ref = "../apiexamples/boolean_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "isExtensionEnabled", display = "Check if extension is enabled", auditable = false) public boolean isExtensionEnabled(@Param("extensionName") @Parameter(description = "The name of the extension to retrieve.", required = true) @PathParam("extensionName") String extensionName) throws ClientException; @@ -123,10 +133,12 @@ public void setExtensionEnabled(// @formatter:off @GET @Path("/{extensionName}/properties") @Operation(summary = "Returns filtered properties for a specified extension.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_json") }) }) + @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = OPERATION_PLUGIN_PROPERTIES_GET, display = "Get filtered plugin properties", auditable = false) public Properties getPluginProperties(// @formatter:off @Param("extensionName") @Parameter(description = "The name of the extension to retrieve.", required = true) @PathParam("extensionName") String extensionName, @@ -141,5 +153,6 @@ public void setPluginProperties(@Param("extensionName") @RequestBody(description @Content(mediaType = MediaType.APPLICATION_XML, schema = @Schema(implementation = Properties.class), examples = { @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, schema = @Schema(implementation = Properties.class), examples = { - @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_json") }) }) Properties properties, @Param("mergeProperties") @Parameter(description = "Merge or replace properties. Defaults to replace.", required = false, schema = @Schema(defaultValue = "false")) @QueryParam("mergeProperties") boolean mergeProperties) throws ClientException; + @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Properties properties, @Param("mergeProperties") @Parameter(description = "Merge or replace properties. Defaults to replace.", required = false, schema = @Schema(defaultValue = "false")) @QueryParam("mergeProperties") boolean mergeProperties) throws ClientException; } \ No newline at end of file diff --git a/server/src/com/mirth/connect/client/core/api/servlets/MessageServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/MessageServletInterface.java index 4879f0c600..d9eedf99ff 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/MessageServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/MessageServletInterface.java @@ -38,6 +38,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; import com.mirth.connect.client.core.Permissions; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -55,8 +56,8 @@ @Path("/channels") @Tag(name = "Messages") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface MessageServletInterface extends BaseServletInterface { @POST @@ -67,7 +68,8 @@ public interface MessageServletInterface extends BaseServletInterface { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "long", ref = "../apiexamples/long_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "long", ref = "../apiexamples/long_json") }) }) + @ExampleObject(name = "long", ref = "../apiexamples/long_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "processMessages", display = "Process messages", permission = Permissions.MESSAGES_PROCESS, type = ExecuteType.ASYNC) public Long processMessage(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId, @@ -86,7 +88,8 @@ public Long processMessage(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "long", ref = "../apiexamples/long_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "long", ref = "../apiexamples/long_json") }) }) + @ExampleObject(name = "long", ref = "../apiexamples/long_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "processMessages", display = "Process messages", permission = Permissions.MESSAGES_PROCESS, type = ExecuteType.ASYNC) public Long processMessage(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId, @@ -94,7 +97,8 @@ public Long processMessage(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "rawMessage", ref = "../apiexamples/raw_message_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "rawMessage", ref = "../apiexamples/raw_message_json") }) }) RawMessage rawMessage) throws ClientException; + @ExampleObject(name = "rawMessage", ref = "../apiexamples/raw_message_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) RawMessage rawMessage) throws ClientException; // @formatter:on @GET @@ -104,7 +108,8 @@ public Long processMessage(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "message", ref = "../apiexamples/message_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "message", ref = "../apiexamples/message_json") }) }) + @ExampleObject(name = "message", ref = "../apiexamples/message_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getMessageContent", display = "Get message content", permission = Permissions.MESSAGES_VIEW, type = ExecuteType.ASYNC) public Message getMessageContent(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId, @@ -115,10 +120,12 @@ public Message getMessageContent(// @formatter:off @GET @Path("/{channelId}/messages/{messageId}/attachments") @Operation(summary = "Retrieve a list of attachments by message ID.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "attachmentList", ref = "../apiexamples/attachment_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "attachmentList", ref = "../apiexamples/attachment_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "attachmentList", ref = "../apiexamples/attachment_list_json") }) }) + @ExampleObject(name = "attachmentList", ref = "../apiexamples/attachment_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAttachmentsByMessageId", display = "Get attachments by message ID", permission = Permissions.MESSAGES_VIEW, type = ExecuteType.ASYNC, auditable = false) public List getAttachmentsByMessageId(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId, @@ -133,7 +140,8 @@ public List getAttachmentsByMessageId(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "attachment", ref = "../apiexamples/attachment_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "attachment", ref = "../apiexamples/attachment_json") }) }) + @ExampleObject(name = "attachment", ref = "../apiexamples/attachment_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAttachment", display = "Get attachment", permission = Permissions.MESSAGES_VIEW, type = ExecuteType.ASYNC) public Attachment getAttachment(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId, @@ -153,7 +161,8 @@ public String getDICOMMessage(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "connectorMessage", ref = "../apiexamples/connector_message_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connectorMessage", ref = "../apiexamples/connector_message_json") }) }) ConnectorMessage message) throws ClientException; + @ExampleObject(name = "connectorMessage", ref = "../apiexamples/connector_message_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) ConnectorMessage message) throws ClientException; // @formatter:on @GET @@ -163,7 +172,8 @@ public String getDICOMMessage(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "messageId", ref = "../apiexamples/long_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "messageId", ref = "../apiexamples/long_json") }) }) + @ExampleObject(name = "messageId", ref = "../apiexamples/long_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getMaxMessageId", display = "Get max messageId", permission = Permissions.MESSAGES_VIEW, type = ExecuteType.ASYNC, auditable = false) public Long getMaxMessageId(@Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId) throws ClientException; @@ -174,7 +184,8 @@ public String getDICOMMessage(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "messages", ref = "../apiexamples/message_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "messages", ref = "../apiexamples/message_list_json") }) }) + @ExampleObject(name = "messages", ref = "../apiexamples/message_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "searchMessages", display = "Get messages by page limit", permission = Permissions.MESSAGES_VIEW, abortable = true) public List getMessages(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId, @@ -182,7 +193,8 @@ public List getMessages(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "filter", ref = "../apiexamples/message_filter_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "filter", ref = "../apiexamples/message_filter_json") }) }) MessageFilter filter, + @ExampleObject(name = "filter", ref = "../apiexamples/message_filter_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) MessageFilter filter, @Param("includeContent") @Parameter(description = "If true, message content will be returned with the results.", schema = @Schema(defaultValue = "false")) @QueryParam("includeContent") Boolean includeContent, @Param("offset") @Parameter(description = "Used for pagination, determines where to start in the search results.", schema = @Schema(defaultValue = "0")) @QueryParam("offset") Integer offset, @Param("limit") @Parameter(description = "Used for pagination, determines the maximum number of results to return.", schema = @Schema(defaultValue = "20")) @QueryParam("limit") Integer limit) throws ClientException; @@ -195,7 +207,8 @@ public List getMessages(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "messages", ref = "../apiexamples/message_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "messages", ref = "../apiexamples/message_list_json") }) }) + @ExampleObject(name = "messages", ref = "../apiexamples/message_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "searchMessages", display = "Get messages by page limit", permission = Permissions.MESSAGES_VIEW, abortable = true) public List getMessages(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId, @@ -247,7 +260,8 @@ public List getMessages(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "messageCount", ref = "../apiexamples/long_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "messageCount", ref = "../apiexamples/long_json") }) }) + @ExampleObject(name = "messageCount", ref = "../apiexamples/long_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getSearchCount", display = "Get search results count", permission = Permissions.MESSAGES_VIEW, abortable = true) public Long getMessageCount(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId, @@ -255,7 +269,8 @@ public Long getMessageCount(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "filter", ref = "../apiexamples/message_filter_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "filter", ref = "../apiexamples/message_filter_json") }) }) MessageFilter filter) throws ClientException; + @ExampleObject(name = "filter", ref = "../apiexamples/message_filter_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) MessageFilter filter) throws ClientException; // @formatter:off @GET @@ -265,7 +280,8 @@ public Long getMessageCount(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "messageCount", ref = "../apiexamples/long_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "messageCount", ref = "../apiexamples/long_json") }) }) + @ExampleObject(name = "messageCount", ref = "../apiexamples/long_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getSearchCount", display = "Get search results count", permission = Permissions.MESSAGES_VIEW, abortable = true) public Long getMessageCount(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId, @@ -317,7 +333,8 @@ public void reprocessMessages(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "filter", ref = "../apiexamples/message_filter_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "filter", ref = "../apiexamples/message_filter_json") }) }) MessageFilter filter, + @ExampleObject(name = "filter", ref = "../apiexamples/message_filter_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) MessageFilter filter, @Param("replace") @Parameter(description = "If true, the message will overwrite the current one", schema = @Schema(defaultValue = "false")) @QueryParam("replace") boolean replace, @Param("filterDestinations") @Parameter(description = "If true, the metaDataId parameter will be used to determine which destinations to reprocess the message through.", schema = @Schema(defaultValue = "false")) @QueryParam("filterDestinations") boolean filterDestinations, @Param("reprocessMetaDataIds") @Parameter(description = "Indicates which destinations to send the message to.") @QueryParam("metaDataId") Set reprocessMetaDataIds) throws ClientException; @@ -393,7 +410,8 @@ public void removeMessages(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "filter", ref = "../apiexamples/message_filter_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "filter", ref = "../apiexamples/message_filter_json") }) }) MessageFilter filter) throws ClientException; + @ExampleObject(name = "filter", ref = "../apiexamples/message_filter_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) MessageFilter filter) throws ClientException; // @formatter:on @DELETE @@ -481,7 +499,8 @@ public void removeAllMessagesPost(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channelIds", ref = "../apiexamples/guid_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelIds", ref = "../apiexamples/guid_set_json") }) }) Set channelIds, + @ExampleObject(name = "channelIds", ref = "../apiexamples/guid_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Set channelIds, @Param("restartRunningChannels") @Parameter(description = "If true, currently running channels will be stopped and restarted as part of the remove process. Otherwise, currently running channels will not be included.", schema = @Schema(defaultValue = "false")) @QueryParam("restartRunningChannels") boolean restartRunningChannels, @Param("clearStatistics") @Parameter(description = "If true, message statistics will also be cleared.", schema = @Schema(defaultValue = "true")) @QueryParam("clearStatistics") boolean clearStatistics) throws ClientException; // @formatter:on @@ -496,7 +515,8 @@ public void importMessage(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "message", ref = "../apiexamples/message_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "message", ref = "../apiexamples/message_json") }) }) Message message) throws ClientException; + @ExampleObject(name = "message", ref = "../apiexamples/message_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Message message) throws ClientException; // @formatter:on @POST @@ -506,7 +526,8 @@ public void importMessage(// @formatter:off @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "messageImportResult", ref = "../apiexamples/message_import_result_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "messageImportResult", ref = "../apiexamples/message_import_result_json") }) }) + @ExampleObject(name = "messageImportResult", ref = "../apiexamples/message_import_result_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "importMessageServer", display = "Import messages on the server", permission = Permissions.MESSAGES_IMPORT, type = ExecuteType.ASYNC) public MessageImportResult importMessagesServer(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @PathParam("channelId") String channelId, diff --git a/server/src/com/mirth/connect/client/core/api/servlets/SystemServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/SystemServletInterface.java index f0a2de4fc8..d0ff085613 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/SystemServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/SystemServletInterface.java @@ -23,6 +23,7 @@ import javax.ws.rs.core.MediaType; import com.mirth.connect.client.core.ClientException; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.model.SystemInfo; @@ -30,8 +31,8 @@ @Path("/system") @Tag(name = "System Information and Statistics") -@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) -@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) +@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON}) +@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON}) public interface SystemServletInterface extends BaseServletInterface { @GET @Path("/info") @@ -40,7 +41,8 @@ public interface SystemServletInterface extends BaseServletInterface { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "systemInfo", ref = "../apiexamples/system_info_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "systemInfo", ref = "../apiexamples/system_info_json") }) }) + @ExampleObject(name = "systemInfo", ref = "../apiexamples/system_info_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getJVMInfo", display = "Get System Information", auditable = false) public SystemInfo getInfo() throws ClientException; @@ -51,7 +53,8 @@ public interface SystemServletInterface extends BaseServletInterface { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "systemStats", ref = "../apiexamples/system_stats_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "systemStats", ref = "../apiexamples/system_stats_json") }) }) + @ExampleObject(name = "systemStats", ref = "../apiexamples/system_stats_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getStats", display = "Get System Statistics", auditable = false) public SystemStats getStats() throws ClientException; } diff --git a/server/src/com/mirth/connect/client/core/api/servlets/UsageServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/UsageServletInterface.java index 3db8220b00..a46b15cd91 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/UsageServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/UsageServletInterface.java @@ -26,28 +26,32 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @Path("/usageData") @Tag(name = "Usage Data") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface UsageServletInterface extends BaseServletInterface { @POST @Path("/_generate") @Produces(MediaType.TEXT_PLAIN) @Operation(summary = "Generates usage document using data from both the client and server.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "purgedDocument", ref = "../apiexamples/purged_document_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "purgedDocument", ref = "../apiexamples/purged_document_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "purgedDocument", ref = "../apiexamples/purged_document_json") }) }) + @ExampleObject(name = "purgedDocument", ref = "../apiexamples/purged_document_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getUsageData", display = "Get usage data", type = ExecuteType.ASYNC, auditable = false) public String getUsageData(@Param("clientStats") @RequestBody(description = "The map of client usage data to use.", required = true, content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "clientStats", ref = "../apiexamples/generic_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "clientStats", ref = "../apiexamples/generic_map_json") }) }) Map clientStats) throws ClientException; + @ExampleObject(name = "clientStats", ref = "../apiexamples/generic_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Map clientStats) throws ClientException; } \ No newline at end of file diff --git a/server/src/com/mirth/connect/client/core/api/servlets/UserServletInterface.java b/server/src/com/mirth/connect/client/core/api/servlets/UserServletInterface.java index 906c9f4647..b1d86a901a 100644 --- a/server/src/com/mirth/connect/client/core/api/servlets/UserServletInterface.java +++ b/server/src/com/mirth/connect/client/core/api/servlets/UserServletInterface.java @@ -37,6 +37,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; import com.mirth.connect.client.core.Permissions; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -45,8 +46,8 @@ @Path("/users") @Tag(name = "Users") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface UserServletInterface extends BaseServletInterface { public static final String LOGIN_SERVER_URL_HEADER = "X-Mirth-Server-Url"; @@ -56,10 +57,13 @@ public interface UserServletInterface extends BaseServletInterface { @Path("/_login") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Operation(summary = "Logs in to the server using the specified name and password.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "loginStatus", ref = "../apiexamples/login_status_xml") }), - @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "loginStatus", ref = "../apiexamples/login_status_json") }) }) + @Content(mediaType = MediaType.APPLICATION_JSON, examples = { + @ExampleObject(name = "loginStatus", ref = "../apiexamples/login_status_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON) + }) @MirthOperation(name = "login", display = "Login") public LoginStatus login(// @formatter:off @Param("username") @Parameter(description = "The username to login with.", required = true, schema = @Schema(defaultValue = "admin")) @FormParam("username") String username, @@ -86,7 +90,8 @@ public void createUser(@Param("user") @RequestBody(description = "The User objec @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "user", ref = "../apiexamples/new_user_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "user", ref = "../apiexamples/new_user_json") }) }) User user) throws ClientException; + @ExampleObject(name = "user", ref = "../apiexamples/new_user_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) User user) throws ClientException; @GET @Path("/") @@ -95,7 +100,8 @@ public void createUser(@Param("user") @RequestBody(description = "The User objec @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "allUsers", ref = "../apiexamples/user_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "allUsers", ref = "../apiexamples/user_list_json") }) }) + @ExampleObject(name = "allUsers", ref = "../apiexamples/user_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAllUsers", display = "Get all users", permission = Permissions.USERS_MANAGE, type = ExecuteType.ASYNC, auditable = false) public List getAllUsers() throws ClientException; @@ -106,7 +112,8 @@ public void createUser(@Param("user") @RequestBody(description = "The User objec @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "user", ref = "../apiexamples/user_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "user", ref = "../apiexamples/user_json") }) }) + @ExampleObject(name = "user", ref = "../apiexamples/user_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getUser", display = "Get user", permission = Permissions.USERS_MANAGE, type = ExecuteType.ASYNC, auditable = false) public User getUser(@Param("userIdOrName") @Parameter(description = "The unique ID or username of the user to retrieve.", required = true) @PathParam("userIdOrName") String userIdOrName) throws ClientException; @@ -117,7 +124,8 @@ public void createUser(@Param("user") @RequestBody(description = "The User objec @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "user", ref = "../apiexamples/user_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "user", ref = "../apiexamples/user_json") }) }) + @ExampleObject(name = "user", ref = "../apiexamples/user_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getCurrentUser", display = "Get current user", auditable = false) public User getCurrentUser() throws ClientException; @@ -131,7 +139,8 @@ public void updateUser(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "user", ref = "../apiexamples/user_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "user", ref = "../apiexamples/user_json") }) }) User user) throws ClientException; + @ExampleObject(name = "user", ref = "../apiexamples/user_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) User user) throws ClientException; // @formatter:on @POST @@ -141,7 +150,8 @@ public void updateUser(// @formatter:off @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "passwordRequirementList", ref = "../apiexamples/password_requirement_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "passwordRequirementList", ref = "../apiexamples/password_requirement_list_json") }) }) + @ExampleObject(name = "passwordRequirementList", ref = "../apiexamples/password_requirement_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "checkUserPassword", display = "Check a password against requirements.", permission = Permissions.USERS_MANAGE) public List checkUserPassword(@Param(value = "plainPassword", excludeFromAudit = true) @Parameter(description = "The plaintext password to check.", required = true) String plainPassword) throws ClientException; @@ -149,10 +159,12 @@ public void updateUser(// @formatter:off @Path("/{userId}/password") @Consumes(MediaType.TEXT_PLAIN) @Operation(summary = "Updates a user's password.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "passwordRequirementList", ref = "../apiexamples/password_requirement_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "passwordRequirementList", ref = "../apiexamples/password_requirement_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "passwordRequirementList", ref = "../apiexamples/password_requirement_list_json") }) }) + @ExampleObject(name = "passwordRequirementList", ref = "../apiexamples/password_requirement_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "updateUserPassword", display = "Update a user's password", permission = Permissions.USERS_MANAGE) public List updateUserPassword(// @formatter:off @Param("userId") @Parameter(description = "The unique ID of the user to update the password for.", required = true) @PathParam("userId") Integer userId, @@ -172,7 +184,8 @@ public List updateUserPassword(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "loggedIn", ref = "../apiexamples/boolean_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "loggedIn", ref = "../apiexamples/boolean_json") }) }) + @ExampleObject(name = "loggedIn", ref = "../apiexamples/boolean_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "isUserLoggedIn", display = "Check if user is logged in", permission = Permissions.USERS_MANAGE) public boolean isUserLoggedIn(@Param("userId") @Parameter(description = "The unique ID of the user.", required = true) @PathParam("userId") Integer userId) throws ClientException; @@ -184,7 +197,8 @@ public List updateUserPassword(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, schema = @Schema(implementation = Properties.class), examples = { @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, schema = @Schema(implementation = Properties.class), examples = { - @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_json") }) }) + @ExampleObject(name = "propertiesObject", ref = "../apiexamples/properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) public Properties getUserPreferences(// @formatter:off @Param("userId") @Parameter(description = "The unique ID of the user.", required = true) @PathParam("userId") Integer userId, @Param("names") @Parameter(description = "An optional set of property names to filter by.") @QueryParam("name") Set names) throws ClientException; @@ -210,7 +224,8 @@ public void setUserPreferences(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, schema = @Schema(implementation = Properties.class), examples = { @ExampleObject(name = "properties", ref = "../apiexamples/properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, schema = @Schema(implementation = Properties.class), examples = { - @ExampleObject(name = "properties", ref = "../apiexamples/properties_json") }) }) Properties properties) + @ExampleObject(name = "properties", ref = "../apiexamples/properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Properties properties) throws ClientException; // @formatter:on diff --git a/server/src/com/mirth/connect/connectors/doc/DocumentConnectorServletInterface.java b/server/src/com/mirth/connect/connectors/doc/DocumentConnectorServletInterface.java index 1a45942aaa..0b64fda69b 100644 --- a/server/src/com/mirth/connect/connectors/doc/DocumentConnectorServletInterface.java +++ b/server/src/com/mirth/connect/connectors/doc/DocumentConnectorServletInterface.java @@ -26,6 +26,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -33,8 +34,8 @@ @Path("/connectors/doc") @Tag(name = "Connector Services") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface DocumentConnectorServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = "Document Connector Service"; @@ -43,10 +44,12 @@ public interface DocumentConnectorServletInterface extends BaseServletInterface @Path("/_testWrite") @Consumes(MediaType.TEXT_PLAIN) @Operation(summary = "Tests whether a file can be written to the specified directory.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "connection_test_response_file", ref = "../apiexamples/connection_test_response_file_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "connection_test_response_file", ref = "../apiexamples/connection_test_response_file_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connection_test_response_file", ref = "../apiexamples/connection_test_response_file_json") }) }) + @ExampleObject(name = "connection_test_response_file", ref = "../apiexamples/connection_test_response_file_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "testWrite", display = "Test Write", type = ExecuteType.ASYNC, auditable = false) public ConnectionTestResponse testWrite(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @QueryParam("channelId") String channelId, diff --git a/server/src/com/mirth/connect/connectors/file/FileConnectorServletInterface.java b/server/src/com/mirth/connect/connectors/file/FileConnectorServletInterface.java index 51531f8ccf..7a9dd73a2f 100644 --- a/server/src/com/mirth/connect/connectors/file/FileConnectorServletInterface.java +++ b/server/src/com/mirth/connect/connectors/file/FileConnectorServletInterface.java @@ -26,6 +26,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -33,8 +34,8 @@ @Path("/connectors/file") @Tag(name = "Connector Services") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface FileConnectorServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = "File Connector Service"; @@ -42,10 +43,12 @@ public interface FileConnectorServletInterface extends BaseServletInterface { @POST @Path("/_testRead") @Operation(summary = "Tests whether a file can be read from the specified directory.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "connection_test_response_file", ref = "../apiexamples/connection_test_response_file_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "connection_test_response_file", ref = "../apiexamples/connection_test_response_file_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connection_test_response_file", ref = "../apiexamples/connection_test_response_file_json") }) }) + @ExampleObject(name = "connection_test_response_file", ref = "../apiexamples/connection_test_response_file_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "testRead", display = "Test Read", type = ExecuteType.ASYNC, auditable = false) public ConnectionTestResponse testRead(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @QueryParam("channelId") String channelId, @@ -55,17 +58,20 @@ public ConnectionTestResponse testRead(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "file_receiver_properties", ref = "../apiexamples/file_receiver_properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "file_receiver_properties", ref = "../apiexamples/file_receiver_properties_json") }) }) + @ExampleObject(name = "file_receiver_properties", ref = "../apiexamples/file_receiver_properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) FileReceiverProperties properties) throws ClientException; // @formatter:on @POST @Path("/_testWrite") @Operation(summary = "Tests whether a file can be written to the specified directory.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "connection_test_response_file", ref = "../apiexamples/connection_test_response_file_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "connection_test_response_file", ref = "../apiexamples/connection_test_response_file_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connection_test_response_file", ref = "../apiexamples/connection_test_response_file_json") }) }) + @ExampleObject(name = "connection_test_response_file", ref = "../apiexamples/connection_test_response_file_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "testWrite", display = "Test Write", type = ExecuteType.ASYNC, auditable = false) public ConnectionTestResponse testWrite(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @QueryParam("channelId") String channelId, @@ -75,7 +81,8 @@ public ConnectionTestResponse testWrite(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "file_dispatcher_properties", ref = "../apiexamples/file_dispatcher_properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "file_dispatcher_properties", ref = "../apiexamples/file_dispatcher_properties_json") }) }) + @ExampleObject(name = "file_dispatcher_properties", ref = "../apiexamples/file_dispatcher_properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) FileDispatcherProperties properties) throws ClientException; // @formatter:on } \ No newline at end of file diff --git a/server/src/com/mirth/connect/connectors/http/HttpConnectorServletInterface.java b/server/src/com/mirth/connect/connectors/http/HttpConnectorServletInterface.java index 8d5751cdb1..4c7b01db9f 100644 --- a/server/src/com/mirth/connect/connectors/http/HttpConnectorServletInterface.java +++ b/server/src/com/mirth/connect/connectors/http/HttpConnectorServletInterface.java @@ -26,6 +26,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -33,8 +34,8 @@ @Path("/connectors/http") @Tag(name = "Connector Services") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface HttpConnectorServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = "HTTP Connector Service"; @@ -42,10 +43,12 @@ public interface HttpConnectorServletInterface extends BaseServletInterface { @POST @Path("/_testConnection") @Operation(summary = "Tests whether a connection can be successfully established to the destination endpoint.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "connection_test_response_http", ref = "../apiexamples/connection_test_response_http_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "connection_test_response_http", ref = "../apiexamples/connection_test_response_http_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connection_test_response_http", ref = "../apiexamples/connection_test_response_http_json") }) }) + @ExampleObject(name = "connection_test_response_http", ref = "../apiexamples/connection_test_response_http_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "testConnection", display = "Test HTTP Connection", type = ExecuteType.ASYNC, auditable = false) public ConnectionTestResponse testConnection(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @QueryParam("channelId") String channelId, @@ -55,7 +58,8 @@ public ConnectionTestResponse testConnection(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "http_dispatcher_properties", ref = "../apiexamples/http_dispatcher_properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "http_dispatcher_properties", ref = "../apiexamples/http_dispatcher_properties_json") }) }) + @ExampleObject(name = "http_dispatcher_properties", ref = "../apiexamples/http_dispatcher_properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) HttpDispatcherProperties properties) throws ClientException; // @formatter:on } \ No newline at end of file diff --git a/server/src/com/mirth/connect/connectors/jdbc/DatabaseConnectorServletInterface.java b/server/src/com/mirth/connect/connectors/jdbc/DatabaseConnectorServletInterface.java index 40ae6174fb..952afc1ae4 100644 --- a/server/src/com/mirth/connect/connectors/jdbc/DatabaseConnectorServletInterface.java +++ b/server/src/com/mirth/connect/connectors/jdbc/DatabaseConnectorServletInterface.java @@ -30,14 +30,15 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @Path("/connectors/jdbc") @Tag(name = "Connector Services") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface DatabaseConnectorServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = "Database Connector Service"; @@ -49,7 +50,8 @@ public interface DatabaseConnectorServletInterface extends BaseServletInterface @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "table_set", ref = "../apiexamples/table_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "table_set", ref = "../apiexamples/table_set_json") }) }) + @ExampleObject(name = "table_set", ref = "../apiexamples/table_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getTables", display = "Get Tables", type = ExecuteType.ASYNC, auditable = false) public SortedSet getTables(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @QueryParam("channelId") String channelId, diff --git a/server/src/com/mirth/connect/connectors/jms/JmsConnectorServletInterface.java b/server/src/com/mirth/connect/connectors/jms/JmsConnectorServletInterface.java index e346db5abe..0ba07a80d4 100644 --- a/server/src/com/mirth/connect/connectors/jms/JmsConnectorServletInterface.java +++ b/server/src/com/mirth/connect/connectors/jms/JmsConnectorServletInterface.java @@ -32,14 +32,15 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @Path("/connectors/jms") @Tag(name = "Connector Services") -@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) -@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) +@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON}) +@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON}) public interface JmsConnectorServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = "JMS Connector Service"; @@ -51,7 +52,8 @@ public interface JmsConnectorServletInterface extends BaseServletInterface { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "jms_connector_properties_map", ref = "../apiexamples/jms_connector_properties_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "jms_connector_properties_map", ref = "../apiexamples/jms_connector_properties_map_json") }) }) + @ExampleObject(name = "jms_connector_properties_map", ref = "../apiexamples/jms_connector_properties_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getTemplates", display = "Get JMS Templates", type = ExecuteType.ASYNC, auditable = false) public LinkedHashMap getTemplates() throws ClientException; @@ -62,7 +64,8 @@ public interface JmsConnectorServletInterface extends BaseServletInterface { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "jms_connector_properties", ref = "../apiexamples/jms_connector_properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "jms_connector_properties", ref = "../apiexamples/jms_connector_properties_json") }) }) + @ExampleObject(name = "jms_connector_properties", ref = "../apiexamples/jms_connector_properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getTemplate", display = "Get JMS Template", type = ExecuteType.ASYNC, auditable = false) public JmsConnectorProperties getTemplate(@Param("templateName") @Parameter(description = "The name of the template.", required = true) @PathParam("templateName") String templateName) throws ClientException; @@ -73,7 +76,8 @@ public interface JmsConnectorServletInterface extends BaseServletInterface { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "jms_template_name_set", ref = "../apiexamples/jms_template_name_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "jms_template_name_set", ref = "../apiexamples/jms_template_name_set_json") }) }) + @ExampleObject(name = "jms_template_name_set", ref = "../apiexamples/jms_template_name_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "saveTemplate", display = "Save JMS Template", type = ExecuteType.ASYNC, auditable = false) public Set saveTemplate(// @formatter:off @Param("templateName") @Parameter(description = "The name of the template.", required = true) @PathParam("templateName") String templateName, @@ -82,7 +86,8 @@ public Set saveTemplate(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "jms_connector_properties", ref = "../apiexamples/jms_connector_properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "jms_connector_properties", ref = "../apiexamples/jms_connector_properties_json") }) }) + @ExampleObject(name = "jms_connector_properties", ref = "../apiexamples/jms_connector_properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) JmsConnectorProperties properties) throws ClientException; // @formatter:on @@ -93,7 +98,8 @@ public Set saveTemplate(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "jms_template_name_set", ref = "../apiexamples/jms_template_name_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "jms_template_name_set", ref = "../apiexamples/jms_template_name_set_json") }) }) + @ExampleObject(name = "jms_template_name_set", ref = "../apiexamples/jms_template_name_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "saveTemplate", display = "Save JMS Template", type = ExecuteType.ASYNC, auditable = false) public Set deleteTemplate(@Param("templateName") @Parameter(description = "The name of the template.", required = true) @PathParam("templateName") String templateName) throws ClientException; } \ No newline at end of file diff --git a/server/src/com/mirth/connect/connectors/smtp/SmtpConnectorServletInterface.java b/server/src/com/mirth/connect/connectors/smtp/SmtpConnectorServletInterface.java index 1d55bc6c95..cf2335786a 100644 --- a/server/src/com/mirth/connect/connectors/smtp/SmtpConnectorServletInterface.java +++ b/server/src/com/mirth/connect/connectors/smtp/SmtpConnectorServletInterface.java @@ -26,6 +26,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -33,8 +34,8 @@ @Path("/connectors/smtp") @Tag(name = "Connector Services") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface SmtpConnectorServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = "SMTP Connector Service"; @@ -42,10 +43,12 @@ public interface SmtpConnectorServletInterface extends BaseServletInterface { @POST @Path("/_sendTestEmail") @Operation(summary = "Sends a test e-mail, replacing any connector properties first.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "connection_test_response_smtp", ref = "../apiexamples/connection_test_response_smtp_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "connection_test_response_smtp", ref = "../apiexamples/connection_test_response_smtp_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connection_test_response_smtp", ref = "../apiexamples/connection_test_response_smtp_json") }) }) + @ExampleObject(name = "connection_test_response_smtp", ref = "../apiexamples/connection_test_response_smtp_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "sendTestEmail", display = "Send Test Email", type = ExecuteType.ASYNC, auditable = false) public ConnectionTestResponse sendTestEmail(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @QueryParam("channelId") String channelId, @@ -59,7 +62,8 @@ public ConnectionTestResponse sendTestEmail(// @formatter:off @Content(mediaType = MediaType.APPLICATION_JSON, examples = { @ExampleObject(name = "smtp_dispatcher_properties", ref = "../apiexamples/smtp_dispatcher_properties_json"), @ExampleObject(name = "smtp_dispatcher_properties_ssl", ref = "../apiexamples/smtp_dispatcher_properties_ssl_json"), - @ExampleObject(name = "smtp_dispatcher_properties_tls", ref = "../apiexamples/smtp_dispatcher_properties_tls_json") }) }) + @ExampleObject(name = "smtp_dispatcher_properties_tls", ref = "../apiexamples/smtp_dispatcher_properties_tls_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) SmtpDispatcherProperties properties) throws ClientException; // @formatter:on } \ No newline at end of file diff --git a/server/src/com/mirth/connect/connectors/tcp/TcpConnectorServletInterface.java b/server/src/com/mirth/connect/connectors/tcp/TcpConnectorServletInterface.java index 01c2341e17..5aba873184 100644 --- a/server/src/com/mirth/connect/connectors/tcp/TcpConnectorServletInterface.java +++ b/server/src/com/mirth/connect/connectors/tcp/TcpConnectorServletInterface.java @@ -26,6 +26,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -33,8 +34,8 @@ @Path("/connectors/tcp") @Tag(name = "Connector Services") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface TcpConnectorServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = "HTTP Connector Service"; @@ -42,10 +43,12 @@ public interface TcpConnectorServletInterface extends BaseServletInterface { @POST @Path("/_testConnection") @Operation(summary = "Tests whether a connection can be successfully established to the destination endpoint.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "connection_test_response_tcp", ref = "../apiexamples/connection_test_response_tcp_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "connection_test_response_tcp", ref = "../apiexamples/connection_test_response_tcp_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connection_test_response_tcp", ref = "../apiexamples/connection_test_response_tcp_json") }) }) + @ExampleObject(name = "connection_test_response_tcp", ref = "../apiexamples/connection_test_response_tcp_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "testConnection", display = "Test TCP Connection", type = ExecuteType.ASYNC, auditable = false) public ConnectionTestResponse testConnection(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @QueryParam("channelId") String channelId, @@ -55,7 +58,8 @@ public ConnectionTestResponse testConnection(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "tcp_dispatcher_properties", ref = "../apiexamples/tcp_dispatcher_properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "tcp_dispatcher_properties", ref = "../apiexamples/tcp_dispatcher_properties_json") }) }) + @ExampleObject(name = "tcp_dispatcher_properties", ref = "../apiexamples/tcp_dispatcher_properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) TcpDispatcherProperties properties) throws ClientException; // @formatter:on } \ No newline at end of file diff --git a/server/src/com/mirth/connect/connectors/ws/WebServiceConnectorServletInterface.java b/server/src/com/mirth/connect/connectors/ws/WebServiceConnectorServletInterface.java index bd0d63e9ab..f257f910d9 100644 --- a/server/src/com/mirth/connect/connectors/ws/WebServiceConnectorServletInterface.java +++ b/server/src/com/mirth/connect/connectors/ws/WebServiceConnectorServletInterface.java @@ -28,6 +28,7 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @@ -35,8 +36,8 @@ @Path("/connectors/ws") @Tag(name = "Connector Services") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface WebServiceConnectorServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = "Web Service Connector Service"; @@ -44,10 +45,12 @@ public interface WebServiceConnectorServletInterface extends BaseServletInterfac @POST @Path("/_cacheWsdlFromUrl") @Operation(summary = "Downloads the WSDL at the specified URL and caches the web service definition tree.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "cache_wsdl_from_url", ref = "../apiexamples/null_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "cache_wsdl_from_url", ref = "../apiexamples/null_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "cache_wsdl_from_url", ref = "../apiexamples/null_json") }) }) + @ExampleObject(name = "cache_wsdl_from_url", ref = "../apiexamples/null_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "cacheWsdlFromUrl", display = "Download and cache WSDL", type = ExecuteType.ASYNC, auditable = false) public Object cacheWsdlFromUrl(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @QueryParam("channelId") String channelId, @@ -57,7 +60,8 @@ public Object cacheWsdlFromUrl(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "ws_dispatcher_properties", ref = "../apiexamples/ws_dispatcher_properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "ws_dispatcher_properties", ref = "../apiexamples/ws_dispatcher_properties_json") }) }) + @ExampleObject(name = "ws_dispatcher_properties", ref = "../apiexamples/ws_dispatcher_properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) WebServiceDispatcherProperties properties) throws ClientException; // @formatter:on @@ -69,7 +73,8 @@ public Object cacheWsdlFromUrl(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "is_wsdl_cached", ref = "../apiexamples/boolean_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "is_wsdl_cached", ref = "../apiexamples/boolean_json") }) }) + @ExampleObject(name = "is_wsdl_cached", ref = "../apiexamples/boolean_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "isWsdlCached", display = "Check if WSDL is cached", type = ExecuteType.ASYNC, auditable = false) public boolean isWsdlCached(// @formatter:off @Param("channelId") @@ -97,10 +102,12 @@ public boolean isWsdlCached(// @formatter:off @Path("/_getDefinition") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Operation(summary = "Retrieves the definition service map corresponding to the specified WSDL.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "definition_service_map", ref = "../apiexamples/definition_service_map_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "definition_service_map", ref = "../apiexamples/definition_service_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "definition_service_map", ref = "../apiexamples/definition_service_map_json") }) }) + @ExampleObject(name = "definition_service_map", ref = "../apiexamples/definition_service_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getDefinition", display = "Get WSDL Definition", type = ExecuteType.ASYNC, auditable = false) public DefinitionServiceMap getDefinition(// @formatter:off @Param("channelId") @@ -216,10 +223,12 @@ public String getSoapAction(// @formatter:off @POST @Path("/_testConnection") @Operation(summary = "Tests whether a connection can be successfully established to the destination endpoint.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "connection_test_response_ws", ref = "../apiexamples/connection_test_response_ws_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "connection_test_response_ws", ref = "../apiexamples/connection_test_response_ws_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connection_test_response_ws", ref = "../apiexamples/connection_test_response_ws_json") }) }) + @ExampleObject(name = "connection_test_response_ws", ref = "../apiexamples/connection_test_response_ws_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "testConnection", display = "Test Web Service Connection", type = ExecuteType.ASYNC, auditable = false) public ConnectionTestResponse testConnection(// @formatter:off @Param("channelId") @Parameter(description = "The ID of the channel.", required = true) @QueryParam("channelId") String channelId, @@ -229,7 +238,8 @@ public ConnectionTestResponse testConnection(// @formatter:off @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "ws_dispatcher_properties", ref = "../apiexamples/ws_dispatcher_properties_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "ws_dispatcher_properties", ref = "../apiexamples/ws_dispatcher_properties_json") }) }) + @ExampleObject(name = "ws_dispatcher_properties", ref = "../apiexamples/ws_dispatcher_properties_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) WebServiceDispatcherProperties properties) throws ClientException; // @formatter:on } \ No newline at end of file diff --git a/server/src/com/mirth/connect/plugins/dashboardstatus/DashboardConnectorStatusServletInterface.java b/server/src/com/mirth/connect/plugins/dashboardstatus/DashboardConnectorStatusServletInterface.java index fb6344f8ac..739039e7c5 100644 --- a/server/src/com/mirth/connect/plugins/dashboardstatus/DashboardConnectorStatusServletInterface.java +++ b/server/src/com/mirth/connect/plugins/dashboardstatus/DashboardConnectorStatusServletInterface.java @@ -30,14 +30,15 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @Path("/extensions/dashboardstatus") @Tag(name = "Extension Services") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface DashboardConnectorStatusServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = "Dashboard Connector Status Service"; @@ -46,10 +47,12 @@ public interface DashboardConnectorStatusServletInterface extends BaseServletInt @GET @Path("/connectorStates") @Operation(summary = "Retrieves all dashboard connector states.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "dashboardConnectorStateMap", ref = "../apiexamples/dashboard_connector_state_map_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "dashboardConnectorStateMap", ref = "../apiexamples/dashboard_connector_state_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "dashboardConnectorStateMap", ref = "../apiexamples/dashboard_connector_state_map_json") }) }) + @ExampleObject(name = "dashboardConnectorStateMap", ref = "../apiexamples/dashboard_connector_state_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getStates", display = "Get dashboard connector states", permission = PERMISSION_VIEW, type = ExecuteType.ASYNC, auditable = false) public Map getConnectorStateMap(// @formatter:off @Param("serverId") @Parameter(description = "The server ID to retrieve connector statuses for. Connector Statuses across all servers are retrieved is this parameter is not specified.") @QueryParam("serverId") String serverId @@ -59,10 +62,12 @@ public Map getConnectorStateMap(// @formatter:off @GET @Path("/channelStates") @Operation(summary = "Retrieves all dashboard channel states.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "dashboardChannelStateMap", ref = "../apiexamples/dashboard_channel_state_map_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "dashboardChannelStateMap", ref = "../apiexamples/dashboard_channel_state_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "dashboardChannelStateMap", ref = "../apiexamples/dashboard_channel_state_map_json") }) }) + @ExampleObject(name = "dashboardChannelStateMap", ref = "../apiexamples/dashboard_channel_state_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getChannelStates", display = "Get dashboard channel states", permission = PERMISSION_VIEW, type = ExecuteType.ASYNC, auditable = false) public Map getChannelStates() throws ClientException; @@ -76,10 +81,12 @@ public Map getConnectorStateMap(// @formatter:off @GET @Path("/connectionLogs") @Operation(summary = "Retrieves connection logs for all channels.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "connectionLogItemLinkedList", ref = "../apiexamples/connection_log_item_linked_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "connectionLogItemLinkedList", ref = "../apiexamples/connection_log_item_linked_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connectionLogItemLinkedList", ref = "../apiexamples/connection_log_item_linked_list_json") }) }) + @ExampleObject(name = "connectionLogItemLinkedList", ref = "../apiexamples/connection_log_item_linked_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getConnectionInfoLogs", display = "Get channel connection logs", permission = PERMISSION_VIEW, type = ExecuteType.ASYNC, auditable = false) public LinkedList getAllChannelLogs(//@formatter:off @Param("serverId") @Parameter(description = "The server ID to retrieve logs for. Logs for all servers are retrieved is this parameter is not specified.") @QueryParam("serverId") String serverId, @@ -90,10 +97,12 @@ public LinkedList getAllChannelLogs(//@formatter:off @GET @Path("/connectionLogs/{channelId}") @Operation(summary = "Retrieves connection logs for a specific channel.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "connectionLogItemLinkedList", ref = "../apiexamples/connection_log_item_linked_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "connectionLogItemLinkedList", ref = "../apiexamples/connection_log_item_linked_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "connectionLogItemLinkedList", ref = "../apiexamples/connection_log_item_linked_list_json") }) }) + @ExampleObject(name = "connectionLogItemLinkedList", ref = "../apiexamples/connection_log_item_linked_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getConnectionInfoLogs", display = "Get channel connection logs", permission = PERMISSION_VIEW, type = ExecuteType.ASYNC, auditable = false) public LinkedList getChannelLog(// @formatter:off @Param("serverId") @Parameter(description = "The server ID to retrieve logs for. Logs for all servers are retrieved is this parameter is not specified.") @QueryParam("serverId") String serverId, diff --git a/server/src/com/mirth/connect/plugins/datapruner/DataPrunerServletInterface.java b/server/src/com/mirth/connect/plugins/datapruner/DataPrunerServletInterface.java index 60ba7f4076..297a4f21d9 100644 --- a/server/src/com/mirth/connect/plugins/datapruner/DataPrunerServletInterface.java +++ b/server/src/com/mirth/connect/plugins/datapruner/DataPrunerServletInterface.java @@ -26,13 +26,14 @@ import javax.ws.rs.core.MediaType; import com.mirth.connect.client.core.ClientException; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; @Path("/extensions/datapruner") @Tag(name = "Extension Services") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface DataPrunerServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = "Data Pruner"; @@ -47,10 +48,12 @@ public interface DataPrunerServletInterface extends BaseServletInterface { @GET @Path("/status") @Operation(summary = "Retrieves the current data pruner status.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "dataPrunerStatusMap", ref = "../apiexamples/data_pruner_status_map_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "dataPrunerStatusMap", ref = "../apiexamples/data_pruner_status_map_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "dataPrunerStatusMap", ref = "../apiexamples/data_pruner_status_map_json") }) }) + @ExampleObject(name = "dataPrunerStatusMap", ref = "../apiexamples/data_pruner_status_map_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getDataPrunerStatusMap", display = "Get status", permission = PERMISSION_VIEW) public Map getStatusMap() throws ClientException; @@ -61,7 +64,8 @@ public interface DataPrunerServletInterface extends BaseServletInterface { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "calendar", ref = "../apiexamples/calendar_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "calendar", ref = "../apiexamples/calendar_json") }) }) + @ExampleObject(name = "calendar", ref = "../apiexamples/calendar_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "startDataPruner", display = "Start pruner", permission = PERMISSION_START_STOP) public Calendar start() throws ClientException; diff --git a/server/src/com/mirth/connect/plugins/directoryresource/DirectoryResourceServletInterface.java b/server/src/com/mirth/connect/plugins/directoryresource/DirectoryResourceServletInterface.java index 27083024b6..857fe9bac0 100644 --- a/server/src/com/mirth/connect/plugins/directoryresource/DirectoryResourceServletInterface.java +++ b/server/src/com/mirth/connect/plugins/directoryresource/DirectoryResourceServletInterface.java @@ -27,14 +27,15 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @Path("/extensions/directoryresource") @Tag(name = "Extension Services") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface DirectoryResourceServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = DirectoryResourceProperties.PLUGIN_POINT; @@ -42,10 +43,12 @@ public interface DirectoryResourceServletInterface extends BaseServletInterface @GET @Path("/resources/{resourceId}/libraries") @Operation(summary = "Retrieves all library URLs for the given directory resource.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "libraryList", ref = "../apiexamples/library_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "libraryList", ref = "../apiexamples/library_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "libraryList", ref = "../apiexamples/library_list_json") }) }) + @ExampleObject(name = "libraryList", ref = "../apiexamples/library_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getLibraries", display = "Get libraries", type = ExecuteType.ASYNC) public List getLibraries(@Param("resourceId") @Parameter(description = "The ID of the directory resource.", required = true) @PathParam("resourceId") String resourceId) throws ClientException; } \ No newline at end of file diff --git a/server/src/com/mirth/connect/plugins/globalmapviewer/GlobalMapServletInterface.java b/server/src/com/mirth/connect/plugins/globalmapviewer/GlobalMapServletInterface.java index c41fa3f3e0..f26ae0647c 100644 --- a/server/src/com/mirth/connect/plugins/globalmapviewer/GlobalMapServletInterface.java +++ b/server/src/com/mirth/connect/plugins/globalmapviewer/GlobalMapServletInterface.java @@ -31,14 +31,15 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @Path("/extensions/globalmapviewer") @Tag(name = "Extension Services") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface GlobalMapServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = "Global Maps"; @@ -51,7 +52,8 @@ public interface GlobalMapServletInterface extends BaseServletInterface { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "globalMaps", ref = "../apiexamples/global_maps_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "globalMaps", ref = "../apiexamples/global_maps_json") }) }) + @ExampleObject(name = "globalMaps", ref = "../apiexamples/global_maps_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAllMaps", display = "Get global / global channel maps", permission = PERMISSION_VIEW, type = ExecuteType.ASYNC, auditable = false) public Map>> getAllMaps(// @formatter:off @Param("channelIds") @Parameter(description = "The ID of the channel to retrieve global channel map information for.") @QueryParam("channelId") Set channelIds, @@ -65,14 +67,16 @@ public Map>> getAllMaps(// @formatter:of @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "globalMaps", ref = "../apiexamples/global_maps_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "globalMaps", ref = "../apiexamples/global_maps_json") }) }) + @ExampleObject(name = "globalMaps", ref = "../apiexamples/global_maps_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getAllMaps", display = "Get global / global channel maps", permission = PERMISSION_VIEW, type = ExecuteType.ASYNC, auditable = false) public Map>> getAllMapsPost(// @formatter:off @Param("channelIds") @RequestBody(description = "The ID of the channel to retrieve global channel map information for.", content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { @ExampleObject(name = "channelIds", ref = "../apiexamples/guid_set_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "channelIds", ref = "../apiexamples/guid_set_json") }) }) Set channelIds, + @ExampleObject(name = "channelIds", ref = "../apiexamples/guid_set_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) Set channelIds, @Param("includeGlobalMap") @Parameter(description = "If true, the global map will be returned.") @QueryParam("includeGlobalMap") boolean includeGlobalMap) throws ClientException; // @formatter:on diff --git a/server/src/com/mirth/connect/plugins/serverlog/ServerLogServletInterface.java b/server/src/com/mirth/connect/plugins/serverlog/ServerLogServletInterface.java index 4cbc0c50eb..83d6ce3279 100644 --- a/server/src/com/mirth/connect/plugins/serverlog/ServerLogServletInterface.java +++ b/server/src/com/mirth/connect/plugins/serverlog/ServerLogServletInterface.java @@ -28,14 +28,15 @@ import com.mirth.connect.client.core.ClientException; import com.mirth.connect.client.core.Operation.ExecuteType; +import com.mirth.connect.client.core.api.ApiContentTypes; import com.mirth.connect.client.core.api.BaseServletInterface; import com.mirth.connect.client.core.api.MirthOperation; import com.mirth.connect.client.core.api.Param; @Path("/extensions/serverlog") @Tag(name = "Extension Services") -@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) -@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, ApiContentTypes.APPLICATION_MIRTHAPI_JSON }) public interface ServerLogServletInterface extends BaseServletInterface { public static final String PLUGIN_POINT = "Server Log"; @@ -44,10 +45,12 @@ public interface ServerLogServletInterface extends BaseServletInterface { @GET @Path("/") @Operation(summary = "Retrieves server log entries.") - @ApiResponse(content = { @Content(mediaType = MediaType.APPLICATION_XML, examples = { - @ExampleObject(name = "serverLogList", ref = "../apiexamples/server_log_item_list_xml") }), + @ApiResponse(content = { + @Content(mediaType = MediaType.APPLICATION_XML, examples = { + @ExampleObject(name = "serverLogList", ref = "../apiexamples/server_log_item_list_xml") }), @Content(mediaType = MediaType.APPLICATION_JSON, examples = { - @ExampleObject(name = "serverLogList", ref = "../apiexamples/server_log_item_list_json") }) }) + @ExampleObject(name = "serverLogList", ref = "../apiexamples/server_log_item_list_json") }), + @Content(mediaType = ApiContentTypes.APPLICATION_MIRTHAPI_JSON), }) @MirthOperation(name = "getMirthServerLogs", display = "View Server Log", permission = PERMISSION_VIEW, type = ExecuteType.ASYNC, auditable = false) public List getServerLogs(// @formatter:off @Param("fetchSize") @Parameter(description = "Specifies the maximum number of log items to return.", required = true, schema = @Schema(defaultValue = "100")) @QueryParam("fetchSize") int fetchSize,