From 95d6b8d0bbaa878ed401befd39793ffccf00f414 Mon Sep 17 00:00:00 2001 From: Patrick Hobusch Date: Fri, 9 May 2025 15:35:10 +0800 Subject: [PATCH] WIP --- .../commons/constants/BootstrAPI.java | 4 +- .../commons/model/AbstractDirectoryModel.java | 3 + .../commons/model/type/_AllModelStatus.java | 33 +++++ .../rest/AbstractDirectoriesResourceImpl.java | 2 +- .../rest/_AbstractAllResourceImpl.java | 24 ++++ .../commons/rest/api/_AllResource.java | 34 +++++ .../service/_AbstractAllServiceImpl.java | 67 ++++++++++ .../service/api/DirectoriesService.java | 6 +- .../commons/service/api/_AllService.java | 14 ++ .../commons/rest/DirectoriesResourceTest.java | 2 +- confluence/Apis/AllApi.md | 34 +++++ confluence/Models/AbstractDirectoryModel.md | 1 + confluence/Models/DirectoryCrowdModel.md | 1 + confluence/Models/DirectoryDelegatingModel.md | 1 + confluence/Models/DirectoryGenericModel.md | 1 + confluence/Models/DirectoryInternalModel.md | 1 + confluence/Models/DirectoryLdapModel.md | 1 + confluence/Models/_AllModel.md | 12 ++ confluence/Models/_AllModelStatus.md | 11 ++ confluence/README.md | 3 + .../confluence/model/_AllModel.java | 33 +++++ .../confluence/rest/_AllResourceImpl.java | 28 ++++ .../service/DirectoryServiceImpl.java | 14 +- .../service/DirectoryServiceTest.java | 6 +- crowd/Apis/AllApi.md | 34 +++++ crowd/Models/AbstractDirectoryModel.md | 1 + crowd/Models/DirectoryCrowdModel.md | 1 + crowd/Models/DirectoryDelegatingModel.md | 1 + crowd/Models/DirectoryGenericModel.md | 1 + crowd/Models/DirectoryInternalModel.md | 1 + crowd/Models/DirectoryLdapModel.md | 1 + crowd/Models/_AllModel.md | 12 ++ crowd/Models/_AllModelStatus.md | 11 ++ crowd/README.md | 3 + .../crowd/config/ServiceConfig.java | 9 ++ .../bootstrapi/crowd/model/AllModel.java | 24 ---- .../bootstrapi/crowd/model/_AllModel.java | 33 +++++ .../crowd/rest/_AllResourceImpl.java | 28 ++++ .../crowd/service/DirectoriesServiceImpl.java | 8 +- .../crowd/service/_AllServiceImpl.java | 125 ++++++++++++++++++ .../crowd/service/api/AllService.java | 10 -- .../crowd/rest/AllResourceTest.java | 64 +++++++++ .../crowd/service/DirectoriesServiceTest.java | 8 +- jira/Apis/AllApi.md | 34 +++++ jira/Models/AbstractDirectoryModel.md | 1 + jira/Models/DirectoryCrowdModel.md | 1 + jira/Models/DirectoryDelegatingModel.md | 1 + jira/Models/DirectoryGenericModel.md | 1 + jira/Models/DirectoryInternalModel.md | 1 + jira/Models/DirectoryLdapModel.md | 1 + jira/Models/_AllModel.md | 12 ++ jira/Models/_AllModelStatus.md | 11 ++ jira/README.md | 3 + .../bootstrapi/jira/model/_AllModel.java | 34 +++++ .../jira/rest/_AllResourceImpl.java | 28 ++++ .../jira/service/DirectoryServiceImpl.java | 6 +- .../jira/service/DirectoryServiceTest.java | 6 +- 57 files changed, 786 insertions(+), 65 deletions(-) create mode 100644 commons/src/main/java/com/deftdevs/bootstrapi/commons/model/type/_AllModelStatus.java create mode 100644 commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/_AbstractAllResourceImpl.java create mode 100644 commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/api/_AllResource.java create mode 100644 commons/src/main/java/com/deftdevs/bootstrapi/commons/service/_AbstractAllServiceImpl.java create mode 100644 commons/src/main/java/com/deftdevs/bootstrapi/commons/service/api/_AllService.java create mode 100644 confluence/Apis/AllApi.md create mode 100644 confluence/Models/_AllModel.md create mode 100644 confluence/Models/_AllModelStatus.md create mode 100644 confluence/src/main/java/com/deftdevs/bootstrapi/confluence/model/_AllModel.java create mode 100644 confluence/src/main/java/com/deftdevs/bootstrapi/confluence/rest/_AllResourceImpl.java create mode 100644 crowd/Apis/AllApi.md create mode 100644 crowd/Models/_AllModel.md create mode 100644 crowd/Models/_AllModelStatus.md delete mode 100644 crowd/src/main/java/com/deftdevs/bootstrapi/crowd/model/AllModel.java create mode 100644 crowd/src/main/java/com/deftdevs/bootstrapi/crowd/model/_AllModel.java create mode 100644 crowd/src/main/java/com/deftdevs/bootstrapi/crowd/rest/_AllResourceImpl.java create mode 100644 crowd/src/main/java/com/deftdevs/bootstrapi/crowd/service/_AllServiceImpl.java delete mode 100644 crowd/src/main/java/com/deftdevs/bootstrapi/crowd/service/api/AllService.java create mode 100644 crowd/src/test/java/com/deftdevs/bootstrapi/crowd/rest/AllResourceTest.java create mode 100644 jira/Apis/AllApi.md create mode 100644 jira/Models/_AllModel.md create mode 100644 jira/Models/_AllModelStatus.md create mode 100644 jira/src/main/java/com/deftdevs/bootstrapi/jira/model/_AllModel.java create mode 100644 jira/src/main/java/com/deftdevs/bootstrapi/jira/rest/_AllResourceImpl.java diff --git a/commons/src/main/java/com/deftdevs/bootstrapi/commons/constants/BootstrAPI.java b/commons/src/main/java/com/deftdevs/bootstrapi/commons/constants/BootstrAPI.java index 644ae427..0578727b 100644 --- a/commons/src/main/java/com/deftdevs/bootstrapi/commons/constants/BootstrAPI.java +++ b/commons/src/main/java/com/deftdevs/bootstrapi/commons/constants/BootstrAPI.java @@ -2,7 +2,9 @@ public class BootstrAPI { - public static final String ALL = "all"; + public static final String _ALL = "_all"; + public static final String _ROOT = "/"; + public static final String APPLICATION = "application"; public static final String APPLICATIONS = "applications"; public static final String APPLICATION_LINK = "application-link"; diff --git a/commons/src/main/java/com/deftdevs/bootstrapi/commons/model/AbstractDirectoryModel.java b/commons/src/main/java/com/deftdevs/bootstrapi/commons/model/AbstractDirectoryModel.java index 62a9dceb..96956f34 100644 --- a/commons/src/main/java/com/deftdevs/bootstrapi/commons/model/AbstractDirectoryModel.java +++ b/commons/src/main/java/com/deftdevs/bootstrapi/commons/model/AbstractDirectoryModel.java @@ -59,4 +59,7 @@ public abstract class AbstractDirectoryModel { @XmlElement private Date updatedDate; + @XmlElement + private Boolean testConnection; + } diff --git a/commons/src/main/java/com/deftdevs/bootstrapi/commons/model/type/_AllModelStatus.java b/commons/src/main/java/com/deftdevs/bootstrapi/commons/model/type/_AllModelStatus.java new file mode 100644 index 00000000..8dfcc8f0 --- /dev/null +++ b/commons/src/main/java/com/deftdevs/bootstrapi/commons/model/type/_AllModelStatus.java @@ -0,0 +1,33 @@ +package com.deftdevs.bootstrapi.commons.model.type; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.ws.rs.core.Response; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@XmlRootElement(name = "status") +public class _AllModelStatus { + + @XmlElement + private int status; + + @XmlElement + private String message; + + @XmlElement + private String details; + + public static _AllModelStatus success() { + return new _AllModelStatus(Response.Status.OK.getStatusCode(), "Success", null); + } + + public static _AllModelStatus error(Response.Status status, String message, String details) { + return new _AllModelStatus(status.getStatusCode(), message, details); + } +} diff --git a/commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/AbstractDirectoriesResourceImpl.java b/commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/AbstractDirectoriesResourceImpl.java index f6281ef6..6042c338 100644 --- a/commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/AbstractDirectoriesResourceImpl.java +++ b/commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/AbstractDirectoriesResourceImpl.java @@ -26,7 +26,7 @@ public Response setDirectories ( final boolean testConnection, final List directories) { - List directoryModels = directoriesService.setDirectories(directories, testConnection); + List directoryModels = directoriesService.setDirectories(directories); return Response.ok(directoryModels).build(); } diff --git a/commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/_AbstractAllResourceImpl.java b/commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/_AbstractAllResourceImpl.java new file mode 100644 index 00000000..c1b6d948 --- /dev/null +++ b/commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/_AbstractAllResourceImpl.java @@ -0,0 +1,24 @@ +package com.deftdevs.bootstrapi.commons.rest; + +import com.deftdevs.bootstrapi.commons.rest.api._AllResource; +import com.deftdevs.bootstrapi.commons.service.api._AllService; + +import javax.ws.rs.core.Response; + +public abstract class _AbstractAllResourceImpl<_AllModel> + implements _AllResource<_AllModel> { + + private final _AllService<_AllModel> allService; + + public _AbstractAllResourceImpl( + final _AllService<_AllModel> allService) { + + this.allService = allService; + } + + public Response setAll( + final _AllModel allModel) { + + return Response.ok(allService.setAll(allModel)).build(); + } +} diff --git a/commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/api/_AllResource.java b/commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/api/_AllResource.java new file mode 100644 index 00000000..7b548d35 --- /dev/null +++ b/commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/api/_AllResource.java @@ -0,0 +1,34 @@ +package com.deftdevs.bootstrapi.commons.rest.api; + +import com.deftdevs.bootstrapi.commons.constants.BootstrAPI; +import com.deftdevs.bootstrapi.commons.model.ErrorCollection; +import com.deftdevs.bootstrapi.commons.model.SettingsModel; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; + +import javax.validation.constraints.NotNull; +import javax.ws.rs.PUT; +import javax.ws.rs.core.Response; + +public interface _AllResource<_AllModel> { + + @PUT + @Operation( + summary = BootstrAPI._ALL, + responses = { + @ApiResponse( + responseCode = "200", content = @Content(schema = @Schema(implementation = SettingsModel.class)), + description = BootstrAPI._ALL + ), + @ApiResponse( + responseCode = "default", content = @Content(schema = @Schema(implementation = ErrorCollection.class)), + description = BootstrAPI._ALL + ), + } + ) + Response setAll( + @NotNull final _AllModel bean); + +} diff --git a/commons/src/main/java/com/deftdevs/bootstrapi/commons/service/_AbstractAllServiceImpl.java b/commons/src/main/java/com/deftdevs/bootstrapi/commons/service/_AbstractAllServiceImpl.java new file mode 100644 index 00000000..83f53598 --- /dev/null +++ b/commons/src/main/java/com/deftdevs/bootstrapi/commons/service/_AbstractAllServiceImpl.java @@ -0,0 +1,67 @@ +package com.deftdevs.bootstrapi.commons.service; + +import com.deftdevs.bootstrapi.commons.model.AbstractDirectoryModel; +import com.deftdevs.bootstrapi.commons.model.type._AllModelStatus; +import com.deftdevs.bootstrapi.commons.service.api._AllService; + +import javax.ws.rs.core.Response; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; + +public abstract class _AbstractAllServiceImpl<_A> implements _AllService<_A> { + + protected _AllModelStatus setEntity( + final T entity, + final Function updateFunction, + final Consumer resultConsumer) { + + if (entity == null) { + return null; + } + + try { + final T updatedEntity = updateFunction.apply(entity); + resultConsumer.accept(updatedEntity); + return _AllModelStatus.success(); + } catch (Exception e) { + return _AllModelStatus.error( + Response.Status.INTERNAL_SERVER_ERROR, + "Failed to apply ...", + e.getMessage() + ); + } + } + + protected _AllModelStatus setEntities( + final Map entityMap, + final Function getIdentifier, + final Function, List> updateFunction, + final Consumer> resultConsumer) { + + if (entityMap == null || entityMap.isEmpty()) { + return null; + } + + // return updateFunction.apply(new ArrayList<>(entityMap.values())); + + for (Map.Entry entityEntry : entityMap.entrySet()) { + try { + final T updatedEntity = updateFunction.apply(entityEntry.getValue()); + resultConsumer.accept(updatedEntity); + return _AllModelStatus.success(); + } catch (Exception e) { + return _AllModelStatus.error( + Response.Status.INTERNAL_SERVER_ERROR, + "Failed to apply ...", + e.getMessage() + ); + } + } + + } + +} diff --git a/commons/src/main/java/com/deftdevs/bootstrapi/commons/service/api/DirectoriesService.java b/commons/src/main/java/com/deftdevs/bootstrapi/commons/service/api/DirectoriesService.java index cbdca6b0..5d2ea054 100644 --- a/commons/src/main/java/com/deftdevs/bootstrapi/commons/service/api/DirectoriesService.java +++ b/commons/src/main/java/com/deftdevs/bootstrapi/commons/service/api/DirectoriesService.java @@ -28,13 +28,11 @@ AbstractDirectoryModel getDirectory( /** * Adds or Updates directory configurations. Any existing configurations with the same 'name' property is updated. * - * @param directories the directories - * @param testConnection whether to test connection + * @param directories the directories * @return the directories */ List setDirectories( - List directories, - boolean testConnection); + List directories); /** * Updates a single directory configuration. Any existing configuration with the same 'name' property is updated. diff --git a/commons/src/main/java/com/deftdevs/bootstrapi/commons/service/api/_AllService.java b/commons/src/main/java/com/deftdevs/bootstrapi/commons/service/api/_AllService.java new file mode 100644 index 00000000..61adc85f --- /dev/null +++ b/commons/src/main/java/com/deftdevs/bootstrapi/commons/service/api/_AllService.java @@ -0,0 +1,14 @@ +package com.deftdevs.bootstrapi.commons.service.api; + +public interface _AllService<_AllModel> { + + /** + * Apply a complete configuration. + * + * @param allModel the configuration to apply + * @return the updated configuration with status + */ + _AllModel setAll( + _AllModel allModel); + +} diff --git a/commons/src/test/java/com/deftdevs/bootstrapi/commons/rest/DirectoriesResourceTest.java b/commons/src/test/java/com/deftdevs/bootstrapi/commons/rest/DirectoriesResourceTest.java index 6ca52d26..50f6a52c 100644 --- a/commons/src/test/java/com/deftdevs/bootstrapi/commons/rest/DirectoriesResourceTest.java +++ b/commons/src/test/java/com/deftdevs/bootstrapi/commons/rest/DirectoriesResourceTest.java @@ -50,7 +50,7 @@ void testSetDirectories() { final DirectoryCrowdModel directoryModel1 = DirectoryCrowdModel.EXAMPLE_1; final DirectoryCrowdModel directoryModel2 = DirectoryCrowdModel.EXAMPLE_3; final List directoryModels = Arrays.asList(directoryModel1, directoryModel2); - doReturn(directoryModels).when(directoriesService).setDirectories(directoryModels, false); + doReturn(directoryModels).when(directoriesService).setDirectories(directoryModels); final Response response = resource.setDirectories(Boolean.FALSE, directoryModels); assertEquals(200, response.getStatus()); diff --git a/confluence/Apis/AllApi.md b/confluence/Apis/AllApi.md new file mode 100644 index 00000000..ff4f5796 --- /dev/null +++ b/confluence/Apis/AllApi.md @@ -0,0 +1,34 @@ +# AllApi + +All URIs are relative to *https://<CONFLUENCE_URL>/rest/bootstrapi/1* + +| Method | HTTP request | Description | +|------------- | ------------- | -------------| +| [**setAll**](AllApi.md#setAll) | **PUT** / | _all | + + + +# **setAll** +> SettingsModel setAll(\_AllModel) + +_all + +### Parameters + +|Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **\_AllModel** | [**_AllModel**](../Models/_AllModel.md)| | | + +### Return type + +[**SettingsModel**](../Models/SettingsModel.md) + +### Authorization + +[basicAuth](../README.md#basicAuth) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + diff --git a/confluence/Models/AbstractDirectoryModel.md b/confluence/Models/AbstractDirectoryModel.md index a025dbcf..aa13f332 100644 --- a/confluence/Models/AbstractDirectoryModel.md +++ b/confluence/Models/AbstractDirectoryModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **connector** | [**DirectoryDelegatingConnector**](DirectoryDelegatingConnector.md) | | [optional] [default to null] | | **configuration** | [**DirectoryDelegatingConfiguration**](DirectoryDelegatingConfiguration.md) | | [optional] [default to null] | diff --git a/confluence/Models/DirectoryCrowdModel.md b/confluence/Models/DirectoryCrowdModel.md index e1dad078..3d54fa5d 100644 --- a/confluence/Models/DirectoryCrowdModel.md +++ b/confluence/Models/DirectoryCrowdModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryCrowdServer**](DirectoryCrowdServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryCrowdPermissions**](DirectoryCrowdPermissions.md) | | [optional] [default to null] | diff --git a/confluence/Models/DirectoryDelegatingModel.md b/confluence/Models/DirectoryDelegatingModel.md index 2d564d80..4f3d119a 100644 --- a/confluence/Models/DirectoryDelegatingModel.md +++ b/confluence/Models/DirectoryDelegatingModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryLdapServer**](DirectoryLdapServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryPermissions**](DirectoryPermissions.md) | | [optional] [default to null] | diff --git a/confluence/Models/DirectoryGenericModel.md b/confluence/Models/DirectoryGenericModel.md index cecdeb75..0e1804d6 100644 --- a/confluence/Models/DirectoryGenericModel.md +++ b/confluence/Models/DirectoryGenericModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryLdapServer**](DirectoryLdapServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryLdapPermissions**](DirectoryLdapPermissions.md) | | [optional] [default to null] | diff --git a/confluence/Models/DirectoryInternalModel.md b/confluence/Models/DirectoryInternalModel.md index 0b983484..126e2814 100644 --- a/confluence/Models/DirectoryInternalModel.md +++ b/confluence/Models/DirectoryInternalModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryLdapServer**](DirectoryLdapServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryPermissions**](DirectoryPermissions.md) | | [optional] [default to null] | diff --git a/confluence/Models/DirectoryLdapModel.md b/confluence/Models/DirectoryLdapModel.md index 3cbf6175..4e50524e 100644 --- a/confluence/Models/DirectoryLdapModel.md +++ b/confluence/Models/DirectoryLdapModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryLdapServer**](DirectoryLdapServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryLdapPermissions**](DirectoryLdapPermissions.md) | | [optional] [default to null] | diff --git a/confluence/Models/_AllModel.md b/confluence/Models/_AllModel.md new file mode 100644 index 00000000..34153397 --- /dev/null +++ b/confluence/Models/_AllModel.md @@ -0,0 +1,12 @@ +# _AllModel +## Properties + +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +| **settings** | [**SettingsModel**](SettingsModel.md) | | [optional] [default to null] | +| **users** | [**Map**](UserModel.md) | | [optional] [default to null] | +| **groups** | [**Map**](GroupModel.md) | | [optional] [default to null] | +| **status** | [**Map**](_AllModelStatus.md) | | [optional] [default to null] | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/confluence/Models/_AllModelStatus.md b/confluence/Models/_AllModelStatus.md new file mode 100644 index 00000000..ed699765 --- /dev/null +++ b/confluence/Models/_AllModelStatus.md @@ -0,0 +1,11 @@ +# _AllModelStatus +## Properties + +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +| **status** | **Integer** | | [optional] [default to null] | +| **message** | **String** | | [optional] [default to null] | +| **details** | **String** | | [optional] [default to null] | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/confluence/README.md b/confluence/README.md index 97e3a5dd..657c914d 100644 --- a/confluence/README.md +++ b/confluence/README.md @@ -7,6 +7,7 @@ All URIs are relative to *https:///rest/bootstrapi/1* | Class | Method | HTTP request | Description | |------------ | ------------- | ------------- | -------------| +| *AllApi* | [**setAll**](Apis/AllApi.md#setall) | **PUT** / | _all | | *ApplicationLinkApi* | [**createApplicationLink**](Apis/ApplicationLinkApi.md#createapplicationlink) | **POST** /application-link | Create an application link | *ApplicationLinkApi* | [**deleteApplicationLink**](Apis/ApplicationLinkApi.md#deleteapplicationlink) | **DELETE** /application-link/{uuid} | Delete an application link | *ApplicationLinkApi* | [**getApplicationLink**](Apis/ApplicationLinkApi.md#getapplicationlink) | **GET** /application-link/{uuid} | Get an application link | @@ -94,6 +95,8 @@ All URIs are relative to *https:///rest/bootstrapi/1* - [SettingsModel](./Models/SettingsModel.md) - [SettingsSecurityModel](./Models/SettingsSecurityModel.md) - [UserModel](./Models/UserModel.md) + - [_AllModel](./Models/_AllModel.md) + - [_AllModelStatus](./Models/_AllModelStatus.md) diff --git a/confluence/src/main/java/com/deftdevs/bootstrapi/confluence/model/_AllModel.java b/confluence/src/main/java/com/deftdevs/bootstrapi/confluence/model/_AllModel.java new file mode 100644 index 00000000..60641c97 --- /dev/null +++ b/confluence/src/main/java/com/deftdevs/bootstrapi/confluence/model/_AllModel.java @@ -0,0 +1,33 @@ +package com.deftdevs.bootstrapi.confluence.model; + +import com.deftdevs.bootstrapi.commons.model.GroupModel; +import com.deftdevs.bootstrapi.commons.model.SettingsModel; +import com.deftdevs.bootstrapi.commons.model.UserModel; +import com.deftdevs.bootstrapi.commons.model.type._AllModelStatus; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@XmlRootElement(name = "all") +public class _AllModel { + + @XmlElement + private SettingsModel settings; + + @XmlElement + private Map users; + + @XmlElement + private Map groups; + + @XmlElement + private Map status; + +} diff --git a/confluence/src/main/java/com/deftdevs/bootstrapi/confluence/rest/_AllResourceImpl.java b/confluence/src/main/java/com/deftdevs/bootstrapi/confluence/rest/_AllResourceImpl.java new file mode 100644 index 00000000..8ba18e21 --- /dev/null +++ b/confluence/src/main/java/com/deftdevs/bootstrapi/confluence/rest/_AllResourceImpl.java @@ -0,0 +1,28 @@ +package com.deftdevs.bootstrapi.confluence.rest; + +import com.atlassian.plugins.rest.api.security.annotation.SystemAdminOnly; +import com.deftdevs.bootstrapi.commons.constants.BootstrAPI; +import com.deftdevs.bootstrapi.commons.rest._AbstractAllResourceImpl; +import com.deftdevs.bootstrapi.commons.service.api._AllService; +import com.deftdevs.bootstrapi.confluence.model._AllModel; +import io.swagger.v3.oas.annotations.tags.Tag; + +import javax.ws.rs.Consumes; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Path(BootstrAPI._ROOT) +@Tag(name = BootstrAPI._ALL) +@Consumes(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON) +@SystemAdminOnly +public class _AllResourceImpl extends _AbstractAllResourceImpl<_AllModel> { + + public _AllResourceImpl( + final _AllService<_AllModel> allService) { + + super(allService); + } + +} diff --git a/confluence/src/main/java/com/deftdevs/bootstrapi/confluence/service/DirectoryServiceImpl.java b/confluence/src/main/java/com/deftdevs/bootstrapi/confluence/service/DirectoryServiceImpl.java index be20e498..89d21f5e 100644 --- a/confluence/src/main/java/com/deftdevs/bootstrapi/confluence/service/DirectoryServiceImpl.java +++ b/confluence/src/main/java/com/deftdevs/bootstrapi/confluence/service/DirectoryServiceImpl.java @@ -15,6 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.validation.constraints.NotNull; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -54,7 +55,8 @@ public AbstractDirectoryModel getDirectory(long id) { } @Override - public List setDirectories(List directoryModels, boolean testConnection) { + public List setDirectories( + final List directoryModels) { final Map existingDirectoriesByName = crowdDirectoryService.findAllDirectories().stream() .collect(Collectors.toMap(Directory::getName, Function.identity())); @@ -64,9 +66,9 @@ public List setDirectories(List DirectoryCrowdModel crowdRequestModel = (DirectoryCrowdModel) directoryRequestModel; if (existingDirectoriesByName.containsKey(crowdRequestModel.getName())) { - setDirectory(existingDirectoriesByName.get(crowdRequestModel.getName()).getId(), crowdRequestModel, testConnection); + setDirectory(existingDirectoriesByName.get(crowdRequestModel.getName()).getId(), crowdRequestModel, false); } else { - addDirectory(crowdRequestModel, testConnection); + addDirectory(crowdRequestModel, false); } } else { throw new BadRequestException(format("Updating directory type '%s' is not supported (yet)", directoryRequestModel.getClass())); @@ -77,9 +79,9 @@ public List setDirectories(List @Override public AbstractDirectoryModel setDirectory( - long id, - AbstractDirectoryModel abstractDirectoryModel, - boolean testConnection) { + final long id, + final AbstractDirectoryModel abstractDirectoryModel, + final boolean testConnection) { if (abstractDirectoryModel instanceof DirectoryCrowdModel) { return setDirectoryCrowd(id, (DirectoryCrowdModel) abstractDirectoryModel, testConnection); diff --git a/confluence/src/test/java/com/deftdevs/bootstrapi/confluence/service/DirectoryServiceTest.java b/confluence/src/test/java/com/deftdevs/bootstrapi/confluence/service/DirectoryServiceTest.java index 68a37a2b..c6007133 100644 --- a/confluence/src/test/java/com/deftdevs/bootstrapi/confluence/service/DirectoryServiceTest.java +++ b/confluence/src/test/java/com/deftdevs/bootstrapi/confluence/service/DirectoryServiceTest.java @@ -88,7 +88,7 @@ void testSetDirectoriesWithoutExistingDirectory() { DirectoryCrowdModel directoryModel = (DirectoryCrowdModel) DirectoryModelUtil.toDirectoryModel(directory); directoryModel.getServer().setAppPassword("test"); - directoryService.setDirectories(Collections.singletonList(directoryModel), false); + directoryService.setDirectories(Collections.singletonList(directoryModel)); } @Test @@ -100,7 +100,7 @@ void testSetDirectoriesWithExistingDirectory() { final DirectoryCrowdModel directoryModel = (DirectoryCrowdModel) DirectoryModelUtil.toDirectoryModel(directory); directoryModel.getServer().setAppPassword("test"); - final List directoryAdded = directoryService.setDirectories(Collections.singletonList(directoryModel), false); + final List directoryAdded = directoryService.setDirectories(Collections.singletonList(directoryModel)); assertEquals(directoryAdded.iterator().next().getName(), directoryModel.getName()); } @@ -113,7 +113,7 @@ void testSetDirectoriesWithConnectionTest() { final DirectoryCrowdModel directoryModel = (DirectoryCrowdModel) DirectoryModelUtil.toDirectoryModel(directory); directoryModel.getServer().setAppPassword("test"); - List directoryAdded = directoryService.setDirectories(Collections.singletonList(directoryModel), true); + List directoryAdded = directoryService.setDirectories(Collections.singletonList(directoryModel)); assertEquals(directoryAdded.iterator().next().getName(), directoryModel.getName()); } diff --git a/crowd/Apis/AllApi.md b/crowd/Apis/AllApi.md new file mode 100644 index 00000000..f0bc9394 --- /dev/null +++ b/crowd/Apis/AllApi.md @@ -0,0 +1,34 @@ +# AllApi + +All URIs are relative to *https://<CROWD_URL>/rest/bootstrapi/1* + +| Method | HTTP request | Description | +|------------- | ------------- | -------------| +| [**setAll**](AllApi.md#setAll) | **PUT** / | _all | + + + +# **setAll** +> SettingsModel setAll(\_AllModel) + +_all + +### Parameters + +|Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **\_AllModel** | [**_AllModel**](../Models/_AllModel.md)| | | + +### Return type + +[**SettingsModel**](../Models/SettingsModel.md) + +### Authorization + +[basicAuth](../README.md#basicAuth) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + diff --git a/crowd/Models/AbstractDirectoryModel.md b/crowd/Models/AbstractDirectoryModel.md index a025dbcf..aa13f332 100644 --- a/crowd/Models/AbstractDirectoryModel.md +++ b/crowd/Models/AbstractDirectoryModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **connector** | [**DirectoryDelegatingConnector**](DirectoryDelegatingConnector.md) | | [optional] [default to null] | | **configuration** | [**DirectoryDelegatingConfiguration**](DirectoryDelegatingConfiguration.md) | | [optional] [default to null] | diff --git a/crowd/Models/DirectoryCrowdModel.md b/crowd/Models/DirectoryCrowdModel.md index e1dad078..3d54fa5d 100644 --- a/crowd/Models/DirectoryCrowdModel.md +++ b/crowd/Models/DirectoryCrowdModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryCrowdServer**](DirectoryCrowdServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryCrowdPermissions**](DirectoryCrowdPermissions.md) | | [optional] [default to null] | diff --git a/crowd/Models/DirectoryDelegatingModel.md b/crowd/Models/DirectoryDelegatingModel.md index 2d564d80..4f3d119a 100644 --- a/crowd/Models/DirectoryDelegatingModel.md +++ b/crowd/Models/DirectoryDelegatingModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryLdapServer**](DirectoryLdapServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryPermissions**](DirectoryPermissions.md) | | [optional] [default to null] | diff --git a/crowd/Models/DirectoryGenericModel.md b/crowd/Models/DirectoryGenericModel.md index cecdeb75..0e1804d6 100644 --- a/crowd/Models/DirectoryGenericModel.md +++ b/crowd/Models/DirectoryGenericModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryLdapServer**](DirectoryLdapServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryLdapPermissions**](DirectoryLdapPermissions.md) | | [optional] [default to null] | diff --git a/crowd/Models/DirectoryInternalModel.md b/crowd/Models/DirectoryInternalModel.md index 0b983484..126e2814 100644 --- a/crowd/Models/DirectoryInternalModel.md +++ b/crowd/Models/DirectoryInternalModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryLdapServer**](DirectoryLdapServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryPermissions**](DirectoryPermissions.md) | | [optional] [default to null] | diff --git a/crowd/Models/DirectoryLdapModel.md b/crowd/Models/DirectoryLdapModel.md index 3cbf6175..4e50524e 100644 --- a/crowd/Models/DirectoryLdapModel.md +++ b/crowd/Models/DirectoryLdapModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryLdapServer**](DirectoryLdapServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryLdapPermissions**](DirectoryLdapPermissions.md) | | [optional] [default to null] | diff --git a/crowd/Models/_AllModel.md b/crowd/Models/_AllModel.md new file mode 100644 index 00000000..c7e7c5d1 --- /dev/null +++ b/crowd/Models/_AllModel.md @@ -0,0 +1,12 @@ +# _AllModel +## Properties + +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +| **settings** | [**SettingsModel**](SettingsModel.md) | | [optional] [default to null] | +| **applications** | [**Map**](ApplicationModel.md) | | [optional] [default to null] | +| **directories** | [**Map**](AbstractDirectoryModel.md) | | [optional] [default to null] | +| **status** | [**Map**](_AllModelStatus.md) | | [optional] [default to null] | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/crowd/Models/_AllModelStatus.md b/crowd/Models/_AllModelStatus.md new file mode 100644 index 00000000..ed699765 --- /dev/null +++ b/crowd/Models/_AllModelStatus.md @@ -0,0 +1,11 @@ +# _AllModelStatus +## Properties + +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +| **status** | **Integer** | | [optional] [default to null] | +| **message** | **String** | | [optional] [default to null] | +| **details** | **String** | | [optional] [default to null] | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/crowd/README.md b/crowd/README.md index 1244cb01..521c8f2a 100644 --- a/crowd/README.md +++ b/crowd/README.md @@ -7,6 +7,7 @@ All URIs are relative to *https:///rest/bootstrapi/1* | Class | Method | HTTP request | Description | |------------ | ------------- | ------------- | -------------| +| *AllApi* | [**setAll**](Apis/AllApi.md#setall) | **PUT** / | _all | | *ApplicationApi* | [**createApplication**](Apis/ApplicationApi.md#createapplication) | **POST** /application | Create an application | *ApplicationApi* | [**deleteApplication**](Apis/ApplicationApi.md#deleteapplication) | **DELETE** /application/{id} | Delete an application | *ApplicationApi* | [**getApplication**](Apis/ApplicationApi.md#getapplication) | **GET** /application/{id} | Get an application | @@ -89,6 +90,8 @@ All URIs are relative to *https:///rest/bootstrapi/1* - [SettingsBrandingLoginPageModel](./Models/SettingsBrandingLoginPageModel.md) - [SettingsModel](./Models/SettingsModel.md) - [UserModel](./Models/UserModel.md) + - [_AllModel](./Models/_AllModel.md) + - [_AllModelStatus](./Models/_AllModelStatus.md) diff --git a/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/config/ServiceConfig.java b/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/config/ServiceConfig.java index b2fda085..3bdddb4d 100644 --- a/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/config/ServiceConfig.java +++ b/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/config/ServiceConfig.java @@ -1,6 +1,7 @@ package com.deftdevs.bootstrapi.crowd.config; import com.deftdevs.bootstrapi.commons.service.api.*; +import com.deftdevs.bootstrapi.crowd.model._AllModel; import com.deftdevs.bootstrapi.crowd.service.*; import com.deftdevs.bootstrapi.crowd.service.api.*; import org.springframework.beans.factory.annotation.Autowired; @@ -16,6 +17,14 @@ public class ServiceConfig { @Autowired private HelperConfig helperConfig; + @Bean + public _AllService<_AllModel> _allService() { + return new _AllServiceImpl( + crowdSettingsGeneralService(), + directoriesService(), + applicationsService()); + } + @Bean public ApplicationLinksService applicationLinksService() { return new ApplicationLinksServiceImpl( diff --git a/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/model/AllModel.java b/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/model/AllModel.java deleted file mode 100644 index dc0587be..00000000 --- a/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/model/AllModel.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.deftdevs.bootstrapi.crowd.model; - -import com.deftdevs.bootstrapi.commons.model.SettingsModel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.util.List; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@XmlRootElement(name = "all") -public class AllModel { - - @XmlElement - private SettingsModel settings; - - @XmlElement - private List applications; - -} diff --git a/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/model/_AllModel.java b/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/model/_AllModel.java new file mode 100644 index 00000000..2c2e43ff --- /dev/null +++ b/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/model/_AllModel.java @@ -0,0 +1,33 @@ +package com.deftdevs.bootstrapi.crowd.model; + +import com.deftdevs.bootstrapi.commons.constants.BootstrAPI; +import com.deftdevs.bootstrapi.commons.model.AbstractDirectoryModel; +import com.deftdevs.bootstrapi.commons.model.SettingsModel; +import com.deftdevs.bootstrapi.commons.model.type._AllModelStatus; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@XmlRootElement(name = BootstrAPI._ALL) +public class _AllModel { + + @XmlElement + private SettingsModel settings; + + @XmlElement + private Map applications; + + @XmlElement + private Map directories; + + @XmlElement + private Map status; + +} diff --git a/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/rest/_AllResourceImpl.java b/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/rest/_AllResourceImpl.java new file mode 100644 index 00000000..b2d0ee92 --- /dev/null +++ b/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/rest/_AllResourceImpl.java @@ -0,0 +1,28 @@ +package com.deftdevs.bootstrapi.crowd.rest; + +import com.atlassian.plugins.rest.api.security.annotation.SystemAdminOnly; +import com.deftdevs.bootstrapi.commons.constants.BootstrAPI; +import com.deftdevs.bootstrapi.commons.rest._AbstractAllResourceImpl; +import com.deftdevs.bootstrapi.commons.service.api._AllService; +import com.deftdevs.bootstrapi.crowd.model._AllModel; +import io.swagger.v3.oas.annotations.tags.Tag; + +import javax.ws.rs.Consumes; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Path(BootstrAPI._ROOT) +@Tag(name = BootstrAPI._ALL) +@Consumes(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON) +@SystemAdminOnly +public class _AllResourceImpl extends _AbstractAllResourceImpl<_AllModel> { + + public _AllResourceImpl( + final _AllService<_AllModel> allService) { + + super(allService); + } + +} diff --git a/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/service/DirectoriesServiceImpl.java b/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/service/DirectoriesServiceImpl.java index 9026579c..629b4606 100644 --- a/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/service/DirectoriesServiceImpl.java +++ b/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/service/DirectoriesServiceImpl.java @@ -21,7 +21,6 @@ import com.deftdevs.bootstrapi.crowd.service.api.GroupsService; import javax.annotation.Nonnull; -import javax.validation.constraints.NotNull; import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -66,8 +65,7 @@ public AbstractDirectoryModel getDirectory( @Override public List setDirectories( - final List directoryModels, - final boolean testConnection) { + final List directoryModels) { final Map existingDirectoriesByName = findAllDirectories().stream() .collect(Collectors.toMap(Directory::getName, Function.identity())); @@ -76,9 +74,9 @@ public List setDirectories( for (AbstractDirectoryModel directoryModel : directoryModels) { if (existingDirectoriesByName.containsKey(directoryModel.getName())) { - resultDirectories.add(setDirectory(existingDirectoriesByName.get(directoryModel.getName()).getId(), directoryModel, testConnection)); + resultDirectories.add(setDirectory(existingDirectoriesByName.get(directoryModel.getName()).getId(), directoryModel, false)); } else { - resultDirectories.add(addDirectory(directoryModel, testConnection)); + resultDirectories.add(addDirectory(directoryModel, false)); } } diff --git a/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/service/_AllServiceImpl.java b/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/service/_AllServiceImpl.java new file mode 100644 index 00000000..201db601 --- /dev/null +++ b/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/service/_AllServiceImpl.java @@ -0,0 +1,125 @@ +package com.deftdevs.bootstrapi.crowd.service; + +import com.deftdevs.bootstrapi.commons.model.AbstractDirectoryModel; +import com.deftdevs.bootstrapi.commons.model.type._AllModelStatus; +import com.deftdevs.bootstrapi.commons.service._AbstractAllServiceImpl; +import com.deftdevs.bootstrapi.commons.service.api.DirectoriesService; +import com.deftdevs.bootstrapi.crowd.model.ApplicationModel; +import com.deftdevs.bootstrapi.crowd.model._AllModel; +import com.deftdevs.bootstrapi.crowd.service.api.ApplicationsService; +import com.deftdevs.bootstrapi.crowd.service.api.CrowdSettingsGeneralService; + +import javax.ws.rs.core.Response; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.Function; + +public class _AllServiceImpl extends _AbstractAllServiceImpl<_AllModel> { + + private final CrowdSettingsGeneralService settingsService; + private final DirectoriesService directoriesService; + private final ApplicationsService applicationsService; + + public _AllServiceImpl( + final CrowdSettingsGeneralService settingsService, + final DirectoriesService directoriesService, + final ApplicationsService applicationsService) { + + this.settingsService = settingsService; + this.directoriesService = directoriesService; + this.applicationsService = applicationsService; + } + + @Override + public _AllModel setAll( + final _AllModel allModel) { + + final _AllModel result = new _AllModel(); + final Map status = new HashMap<>(); + + setEntity(allModel.getSettings(), settingsService::setSettingsGeneral, result::setSettings); + + setEntities(allModel.getDirectories(), AbstractDirectoryModel::getName, directoriesService::setDirectories, result::setDirectories); + + setEntities(allModel.getApplications(), ApplicationModel::getName, applicationsService::setApplications, result::setApplications); + +// // Process entities using a generic handler +// processEntities(allModel.getGroups(), "groups", GroupModel::getName, GroupsService::setGroups, result::setGroups, status); +// +// processEntities(allModel.getUsers(), "users", UserModel::getUsername, +// users -> usersService.setUsers(1L, users), result::setUsers, status); +// +// processEntities(allModel.getApplications(), "applications", ApplicationModel::getName, +// applicationsService::setApplications, result::setApplications, status); + + result.setStatus(status); + return result; + } + + private void processEntities( + Map entityMap, + String entityType, + Function getIdentifier, + Function, List> updateFunction, + BiFunction, _AllModel, _AllModel> resultSetter, + Map status) { + + if (entityMap == null || entityMap.isEmpty()) { + return; + } + + try { + // Validate entity identifiers + for (Map.Entry entry : entityMap.entrySet()) { + String key = entry.getKey(); + T entity = entry.getValue(); + String identifier = getIdentifier.apply(entity); + + if (identifier == null) { + // Try to set the key as the identifier using reflection + try { + entity.getClass().getMethod("set" + entityType.substring(0, 1).toUpperCase() + + entityType.substring(1, entityType.length() - 1), String.class) + .invoke(entity, key); + } catch (Exception e) { + // If reflection fails, report the error + status.put(entityType, _AllModelStatus.error( + Response.Status.BAD_REQUEST, + entityType + " identifier missing", + "Could not set identifier for key: " + key + )); + return; + } + } else if (!key.equals(identifier)) { + status.put(entityType, _AllModelStatus.error( + Response.Status.BAD_REQUEST, + entityType.substring(0, 1).toUpperCase() + entityType.substring(1) + " identifier mismatch", + String.format("Map key '%s' does not match %s '%s'", key, entityType.substring(0, entityType.length() - 1), identifier) + )); + return; + } + } + + if (!status.containsKey(entityType)) { + List entityList = new ArrayList<>(entityMap.values()); + List updatedEntities = updateFunction.apply(entityList); + + Map resultMap = new HashMap<>(); + for (T entity : updatedEntities) { + resultMap.put(getIdentifier.apply(entity), entity); + } + resultSetter.apply(resultMap, null); + status.put(entityType, _AllModelStatus.success()); + } + } catch (Exception e) { + status.put(entityType, _AllModelStatus.error( + Response.Status.BAD_REQUEST, + "Failed to apply " + entityType + " configuration", + e.getMessage() + )); + } + } +} diff --git a/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/service/api/AllService.java b/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/service/api/AllService.java deleted file mode 100644 index 71e5a090..00000000 --- a/crowd/src/main/java/com/deftdevs/bootstrapi/crowd/service/api/AllService.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.deftdevs.bootstrapi.crowd.service.api; - -import com.deftdevs.bootstrapi.crowd.model.AllModel; - -public interface AllService { - - void setAll( - AllModel allModel); - -} diff --git a/crowd/src/test/java/com/deftdevs/bootstrapi/crowd/rest/AllResourceTest.java b/crowd/src/test/java/com/deftdevs/bootstrapi/crowd/rest/AllResourceTest.java new file mode 100644 index 00000000..2ef1d69c --- /dev/null +++ b/crowd/src/test/java/com/deftdevs/bootstrapi/crowd/rest/AllResourceTest.java @@ -0,0 +1,64 @@ +package com.deftdevs.bootstrapi.crowd.rest; + +import com.deftdevs.bootstrapi.commons.model.SettingsModel; +import com.deftdevs.bootstrapi.crowd.model.ApplicationModel; +import com.deftdevs.bootstrapi.crowd.model._AllModel; +import com.deftdevs.bootstrapi.commons.model.type._AllModelStatus; +import com.deftdevs.bootstrapi.commons.service.api._AllService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import javax.ws.rs.core.Response; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class AllResourceTest { + + @Mock + private _AllService<_AllModel> allService; + + private _AllResourceImpl configurationResource; + + private _AllModel allModel; + + @BeforeEach + public void setup() { + configurationResource = new _AllResourceImpl(allService); + + // Setup test data + allModel = new _AllModel(); + allModel.setSettings(SettingsModel.EXAMPLE_1); + + // Setup applications map + Map applications = new HashMap<>(); + applications.put(ApplicationModel.EXAMPLE_1.getName(), ApplicationModel.EXAMPLE_1); + allModel.setApplications(applications); + + Map status = new HashMap<>(); + status.put("settings", _AllModelStatus.success()); + status.put("users", _AllModelStatus.success()); + status.put("groups", _AllModelStatus.success()); + status.put("applications", _AllModelStatus.success()); + allModel.setStatus(status); + } + + @Test + public void testSetConfiguration() { + doReturn(allModel).when(allService).setAll(any()); + + Response response = configurationResource.setAll(allModel); + assertEquals(200, response.getStatus()); + + _AllModel responseModel = (_AllModel) response.getEntity(); + assertEquals(allModel, responseModel); + + verify(allService).setAll(allModel); + } +} diff --git a/crowd/src/test/java/com/deftdevs/bootstrapi/crowd/service/DirectoriesServiceTest.java b/crowd/src/test/java/com/deftdevs/bootstrapi/crowd/service/DirectoriesServiceTest.java index 32e91ee7..b98f1ddb 100644 --- a/crowd/src/test/java/com/deftdevs/bootstrapi/crowd/service/DirectoriesServiceTest.java +++ b/crowd/src/test/java/com/deftdevs/bootstrapi/crowd/service/DirectoriesServiceTest.java @@ -78,7 +78,7 @@ public void testSetDirectoriesAddNew() { final boolean testConnection = false; doReturn(null).when(spy).addDirectory(directoryModel, testConnection); - spy.setDirectories(directoryModels, testConnection); + spy.setDirectories(directoryModels); verify(spy).addDirectory(directoryModel, testConnection); } @@ -94,7 +94,7 @@ public void testSetDirectoriesAddNewUnsupportedType() { final boolean testConnection = false; assertThrows(BadRequestException.class, () -> { - spy.setDirectories(directoryModels, testConnection); + spy.setDirectories(directoryModels); }); } @@ -109,7 +109,7 @@ public void testSetDirectoriesSetExisting() { final boolean testConnection = false; doReturn(null).when(spy).setDirectory(directory.getId(), directoryModel, testConnection); - spy.setDirectories(directoryModels, testConnection); + spy.setDirectories(directoryModels); verify(spy).setDirectory(directory.getId(), directoryModel, testConnection); } @@ -126,7 +126,7 @@ public void testSetDirectoriesSetExistingUnsupportedType() { final boolean testConnection = false; assertThrows(BadRequestException.class, () -> { - spy.setDirectories(directoryModels, testConnection); + spy.setDirectories(directoryModels); }); } diff --git a/jira/Apis/AllApi.md b/jira/Apis/AllApi.md new file mode 100644 index 00000000..1b3c108e --- /dev/null +++ b/jira/Apis/AllApi.md @@ -0,0 +1,34 @@ +# AllApi + +All URIs are relative to *https://<JIRA_URL>/rest/bootstrapi/1* + +| Method | HTTP request | Description | +|------------- | ------------- | -------------| +| [**setAll**](AllApi.md#setAll) | **PUT** / | _all | + + + +# **setAll** +> SettingsModel setAll(\_AllModel) + +_all + +### Parameters + +|Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **\_AllModel** | [**_AllModel**](../Models/_AllModel.md)| | | + +### Return type + +[**SettingsModel**](../Models/SettingsModel.md) + +### Authorization + +[basicAuth](../README.md#basicAuth) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + diff --git a/jira/Models/AbstractDirectoryModel.md b/jira/Models/AbstractDirectoryModel.md index a025dbcf..aa13f332 100644 --- a/jira/Models/AbstractDirectoryModel.md +++ b/jira/Models/AbstractDirectoryModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **connector** | [**DirectoryDelegatingConnector**](DirectoryDelegatingConnector.md) | | [optional] [default to null] | | **configuration** | [**DirectoryDelegatingConfiguration**](DirectoryDelegatingConfiguration.md) | | [optional] [default to null] | diff --git a/jira/Models/DirectoryCrowdModel.md b/jira/Models/DirectoryCrowdModel.md index e1dad078..3d54fa5d 100644 --- a/jira/Models/DirectoryCrowdModel.md +++ b/jira/Models/DirectoryCrowdModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryCrowdServer**](DirectoryCrowdServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryCrowdPermissions**](DirectoryCrowdPermissions.md) | | [optional] [default to null] | diff --git a/jira/Models/DirectoryDelegatingModel.md b/jira/Models/DirectoryDelegatingModel.md index 2d564d80..4f3d119a 100644 --- a/jira/Models/DirectoryDelegatingModel.md +++ b/jira/Models/DirectoryDelegatingModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryLdapServer**](DirectoryLdapServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryPermissions**](DirectoryPermissions.md) | | [optional] [default to null] | diff --git a/jira/Models/DirectoryGenericModel.md b/jira/Models/DirectoryGenericModel.md index cecdeb75..0e1804d6 100644 --- a/jira/Models/DirectoryGenericModel.md +++ b/jira/Models/DirectoryGenericModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryLdapServer**](DirectoryLdapServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryLdapPermissions**](DirectoryLdapPermissions.md) | | [optional] [default to null] | diff --git a/jira/Models/DirectoryInternalModel.md b/jira/Models/DirectoryInternalModel.md index 0b983484..126e2814 100644 --- a/jira/Models/DirectoryInternalModel.md +++ b/jira/Models/DirectoryInternalModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryLdapServer**](DirectoryLdapServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryPermissions**](DirectoryPermissions.md) | | [optional] [default to null] | diff --git a/jira/Models/DirectoryLdapModel.md b/jira/Models/DirectoryLdapModel.md index 3cbf6175..4e50524e 100644 --- a/jira/Models/DirectoryLdapModel.md +++ b/jira/Models/DirectoryLdapModel.md @@ -9,6 +9,7 @@ | **active** | **Boolean** | | [optional] [default to null] | | **createdDate** | **Date** | | [optional] [default to null] | | **updatedDate** | **Date** | | [optional] [default to null] | +| **testConnection** | **Boolean** | | [optional] [default to null] | | **type** | **String** | | [default to null] | | **server** | [**DirectoryLdapServer**](DirectoryLdapServer.md) | | [optional] [default to null] | | **permissions** | [**DirectoryLdapPermissions**](DirectoryLdapPermissions.md) | | [optional] [default to null] | diff --git a/jira/Models/_AllModel.md b/jira/Models/_AllModel.md new file mode 100644 index 00000000..34153397 --- /dev/null +++ b/jira/Models/_AllModel.md @@ -0,0 +1,12 @@ +# _AllModel +## Properties + +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +| **settings** | [**SettingsModel**](SettingsModel.md) | | [optional] [default to null] | +| **users** | [**Map**](UserModel.md) | | [optional] [default to null] | +| **groups** | [**Map**](GroupModel.md) | | [optional] [default to null] | +| **status** | [**Map**](_AllModelStatus.md) | | [optional] [default to null] | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/jira/Models/_AllModelStatus.md b/jira/Models/_AllModelStatus.md new file mode 100644 index 00000000..ed699765 --- /dev/null +++ b/jira/Models/_AllModelStatus.md @@ -0,0 +1,11 @@ +# _AllModelStatus +## Properties + +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +| **status** | **Integer** | | [optional] [default to null] | +| **message** | **String** | | [optional] [default to null] | +| **details** | **String** | | [optional] [default to null] | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + diff --git a/jira/README.md b/jira/README.md index c0b6dd26..daf7d729 100644 --- a/jira/README.md +++ b/jira/README.md @@ -7,6 +7,7 @@ All URIs are relative to *https:///rest/bootstrapi/1* | Class | Method | HTTP request | Description | |------------ | ------------- | ------------- | -------------| +| *AllApi* | [**setAll**](Apis/AllApi.md#setall) | **PUT** / | _all | | *ApplicationLinkApi* | [**createApplicationLink**](Apis/ApplicationLinkApi.md#createapplicationlink) | **POST** /application-link | Create an application link | *ApplicationLinkApi* | [**deleteApplicationLink**](Apis/ApplicationLinkApi.md#deleteapplicationlink) | **DELETE** /application-link/{uuid} | Delete an application link | *ApplicationLinkApi* | [**getApplicationLink**](Apis/ApplicationLinkApi.md#getapplicationlink) | **GET** /application-link/{uuid} | Get an application link | @@ -79,6 +80,8 @@ All URIs are relative to *https:///rest/bootstrapi/1* - [SettingsModel](./Models/SettingsModel.md) - [SettingsSecurityModel](./Models/SettingsSecurityModel.md) - [UserModel](./Models/UserModel.md) + - [_AllModel](./Models/_AllModel.md) + - [_AllModelStatus](./Models/_AllModelStatus.md) diff --git a/jira/src/main/java/com/deftdevs/bootstrapi/jira/model/_AllModel.java b/jira/src/main/java/com/deftdevs/bootstrapi/jira/model/_AllModel.java new file mode 100644 index 00000000..46fdfa07 --- /dev/null +++ b/jira/src/main/java/com/deftdevs/bootstrapi/jira/model/_AllModel.java @@ -0,0 +1,34 @@ +package com.deftdevs.bootstrapi.jira.model; + +import com.deftdevs.bootstrapi.commons.constants.BootstrAPI; +import com.deftdevs.bootstrapi.commons.model.GroupModel; +import com.deftdevs.bootstrapi.commons.model.SettingsModel; +import com.deftdevs.bootstrapi.commons.model.UserModel; +import com.deftdevs.bootstrapi.commons.model.type._AllModelStatus; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@XmlRootElement(name = BootstrAPI._ALL) +public class _AllModel { + + @XmlElement + private SettingsModel settings; + + @XmlElement + private Map users; + + @XmlElement + private Map groups; + + @XmlElement + private Map status; + +} diff --git a/jira/src/main/java/com/deftdevs/bootstrapi/jira/rest/_AllResourceImpl.java b/jira/src/main/java/com/deftdevs/bootstrapi/jira/rest/_AllResourceImpl.java new file mode 100644 index 00000000..0b0af18e --- /dev/null +++ b/jira/src/main/java/com/deftdevs/bootstrapi/jira/rest/_AllResourceImpl.java @@ -0,0 +1,28 @@ +package com.deftdevs.bootstrapi.jira.rest; + +import com.atlassian.plugins.rest.api.security.annotation.SystemAdminOnly; +import com.deftdevs.bootstrapi.commons.constants.BootstrAPI; +import com.deftdevs.bootstrapi.commons.rest._AbstractAllResourceImpl; +import com.deftdevs.bootstrapi.commons.service.api._AllService; +import com.deftdevs.bootstrapi.jira.model._AllModel; +import io.swagger.v3.oas.annotations.tags.Tag; + +import javax.ws.rs.Consumes; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Path(BootstrAPI._ROOT) +@Tag(name = BootstrAPI._ALL) +@Consumes(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON) +@SystemAdminOnly +public class _AllResourceImpl extends _AbstractAllResourceImpl<_AllModel> { + + public _AllResourceImpl( + final _AllService<_AllModel> allService) { + + super(allService); + } + +} diff --git a/jira/src/main/java/com/deftdevs/bootstrapi/jira/service/DirectoryServiceImpl.java b/jira/src/main/java/com/deftdevs/bootstrapi/jira/service/DirectoryServiceImpl.java index d024bf37..da5d0b26 100644 --- a/jira/src/main/java/com/deftdevs/bootstrapi/jira/service/DirectoryServiceImpl.java +++ b/jira/src/main/java/com/deftdevs/bootstrapi/jira/service/DirectoryServiceImpl.java @@ -55,7 +55,7 @@ public AbstractDirectoryModel getDirectory(long id) { @Override public List setDirectories( - List directoryModels, boolean testConnection) { + final List directoryModels) { final Map existingDirectoriesByName = crowdDirectoryService.findAllDirectories().stream() .collect(Collectors.toMap(Directory::getName, Function.identity())); @@ -65,9 +65,9 @@ public List setDirectories( DirectoryCrowdModel crowdRequestModel = (DirectoryCrowdModel) directoryRequestModel; if (existingDirectoriesByName.containsKey(crowdRequestModel.getName())) { - setDirectory(existingDirectoriesByName.get(crowdRequestModel.getName()).getId(), crowdRequestModel, testConnection); + setDirectory(existingDirectoriesByName.get(crowdRequestModel.getName()).getId(), crowdRequestModel, false); } else { - addDirectory(crowdRequestModel, testConnection); + addDirectory(crowdRequestModel, false); } } else { throw new BadRequestException(format("Updating directory type '%s' is not supported (yet)", directoryRequestModel.getClass())); diff --git a/jira/src/test/java/com/deftdevs/bootstrapi/jira/service/DirectoryServiceTest.java b/jira/src/test/java/com/deftdevs/bootstrapi/jira/service/DirectoryServiceTest.java index bfbfc895..ee01194c 100644 --- a/jira/src/test/java/com/deftdevs/bootstrapi/jira/service/DirectoryServiceTest.java +++ b/jira/src/test/java/com/deftdevs/bootstrapi/jira/service/DirectoryServiceTest.java @@ -86,7 +86,7 @@ void testSetDirectoriesWithoutExistingDirectory() { final DirectoryCrowdModel directoryModel = (DirectoryCrowdModel) DirectoryModelUtil.toDirectoryModel(directory); directoryModel.getServer().setAppPassword("test"); - directoryService.setDirectories(Collections.singletonList(directoryModel), false); + directoryService.setDirectories(Collections.singletonList(directoryModel)); assertTrue(true, "Update Successful"); } @@ -99,7 +99,7 @@ void testSetDirectoriesWithExistingDirectory() { final DirectoryCrowdModel directoryModel = (DirectoryCrowdModel) DirectoryModelUtil.toDirectoryModel(directory); directoryModel.getServer().setAppPassword("test"); - final List directoryAdded = directoryService.setDirectories(Collections.singletonList(directoryModel), false); + final List directoryAdded = directoryService.setDirectories(Collections.singletonList(directoryModel)); assertEquals(directoryAdded.iterator().next().getName(), directoryModel.getName()); } @@ -112,7 +112,7 @@ void testSetDirectoriesWithConnectionTest() { final DirectoryCrowdModel directoryModel = (DirectoryCrowdModel) DirectoryModelUtil.toDirectoryModel(directory); directoryModel.getServer().setAppPassword("test"); - final List directoryAdded = directoryService.setDirectories(Collections.singletonList(directoryModel), true); + final List directoryAdded = directoryService.setDirectories(Collections.singletonList(directoryModel)); assertEquals(directoryAdded.iterator().next().getName(), directoryModel.getName()); }