MIFOSX-2135: Create new endpoints and the User interface for managing credentials to external services.
This commit is contained in:
@@ -2395,6 +2395,16 @@
|
|||||||
<td></td>
|
<td></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><a href="#external_services">External Services</a></td>
|
||||||
|
<td>externalservice/{servicename}</td>
|
||||||
|
<td></td>
|
||||||
|
<td><a href="#configs_externalService_retrieve">Retrieve
|
||||||
|
a external service configuration</a></td>
|
||||||
|
<td><a href="#configs_externalService_update">Update
|
||||||
|
external service Configuration</a></td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -16556,6 +16566,94 @@ POST scheduler?command=stop
|
|||||||
</code>
|
</code>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<a id="external_services" name="external_services" class="old-syle-anchor"> </a>
|
||||||
|
<div class="method-section">
|
||||||
|
<div class="method-description">
|
||||||
|
<h3>External Services</h3>
|
||||||
|
<p>External Services Configuration related to set of supported configurations for third party services like Amazon S3 and SMTP:</p>
|
||||||
|
<ol>
|
||||||
|
<li><b>S3 (Amazon S3):</b></li>
|
||||||
|
<li><b>s3_access_key</b> - </li>
|
||||||
|
<li><b>s3_bucket_name</b> - </li>
|
||||||
|
<li><b>s3_secret_key</b> - </li>
|
||||||
|
<br><br>
|
||||||
|
<li><b>SMTP (Email Service):</b></li>
|
||||||
|
<li><b>username</b> - </li>
|
||||||
|
<li><b>password</b> - </li>
|
||||||
|
<li><b>host</b> - </li>
|
||||||
|
<li><b>port</b> - </li>
|
||||||
|
<li><b>useTLS</b> - </li>
|
||||||
|
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a id="configs_externalService_retrieve" name="configs_externalService_retrieve" class="old-syle-anchor"> </a>
|
||||||
|
<div class="method-section">
|
||||||
|
<div class="method-description">
|
||||||
|
<h4>Retrieve External Services Configuration</h4>
|
||||||
|
<p>Returns a external Service configurations based on the Service Name.</p>
|
||||||
|
<p>Service Names supported are S3 and SMTP.</p>
|
||||||
|
<p>Example Requests:</p>
|
||||||
|
<div class=apiClick>externalservice/SMTP</div>
|
||||||
|
</div>
|
||||||
|
<div class="method-example">
|
||||||
|
<code class="method-declaration">
|
||||||
|
GET https://DomainName/api/v1/externalservice/{serviceName}
|
||||||
|
</code>
|
||||||
|
<code class="method-response">
|
||||||
|
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "username",
|
||||||
|
"value": "test@mifos.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "password",
|
||||||
|
"value": "XXXX"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "host",
|
||||||
|
"value": "smtp.gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "port",
|
||||||
|
"value": "25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "useTLS",
|
||||||
|
"value": "true"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
</code>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a id="config_externalService_update" name="config_externalService_update"
|
||||||
|
class="old-syle-anchor"> </a>
|
||||||
|
<div class="method-section">
|
||||||
|
<div class="method-description">
|
||||||
|
<h4>Update External Service</h4>
|
||||||
|
<p>Updates the external Service Configuration for a Service Name.</p>
|
||||||
|
</div>
|
||||||
|
<div class="method-example">
|
||||||
|
<code class="method-declaration">
|
||||||
|
PUT https://DomainName/api/v1/externalservice/{serviceName}
|
||||||
|
</code>
|
||||||
|
<code class="method-request">
|
||||||
|
PUT externalservice/S3
|
||||||
|
Content-Type: application/json
|
||||||
|
{
|
||||||
|
"username" : "test@mifos.org"
|
||||||
|
"password" : "XXXX"
|
||||||
|
}
|
||||||
|
</code>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Fund starts here -->
|
<!-- Fund starts here -->
|
||||||
<a id="funds" name="funds" class="old-syle-anchor"> </a>
|
<a id="funds" name="funds" class="old-syle-anchor"> </a>
|
||||||
|
|||||||
+96
@@ -0,0 +1,96 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.integrationtests;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mifosplatform.integrationtests.common.ExternalServicesConfigurationHelper;
|
||||||
|
import org.mifosplatform.integrationtests.common.Utils;
|
||||||
|
|
||||||
|
import com.jayway.restassured.builder.RequestSpecBuilder;
|
||||||
|
import com.jayway.restassured.builder.ResponseSpecBuilder;
|
||||||
|
import com.jayway.restassured.http.ContentType;
|
||||||
|
import com.jayway.restassured.specification.RequestSpecification;
|
||||||
|
import com.jayway.restassured.specification.ResponseSpecification;
|
||||||
|
|
||||||
|
@SuppressWarnings({ "rawtypes", "unchecked", "static-access" })
|
||||||
|
public class ExternalServicesConfigurationTest {
|
||||||
|
|
||||||
|
private ResponseSpecification responseSpec;
|
||||||
|
private RequestSpecification requestSpec;
|
||||||
|
private ExternalServicesConfigurationHelper externalServicesConfigurationHelper;
|
||||||
|
private ResponseSpecification httpStatusForidden;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
Utils.initializeRESTAssured();
|
||||||
|
this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
|
||||||
|
this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
|
||||||
|
this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
|
||||||
|
this.httpStatusForidden = new ResponseSpecBuilder().expectStatusCode(403).build();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExternalServicesConfiguration() {
|
||||||
|
this.externalServicesConfigurationHelper = new ExternalServicesConfigurationHelper(this.requestSpec, this.responseSpec);
|
||||||
|
|
||||||
|
// Checking for S3
|
||||||
|
String configName = "s3_access_key";
|
||||||
|
ArrayList<HashMap> externalServicesConfig = this.externalServicesConfigurationHelper
|
||||||
|
.getExternalServicesConfigurationByServiceName(requestSpec, responseSpec, "S3");
|
||||||
|
Assert.assertNotNull(externalServicesConfig);
|
||||||
|
for (Integer configIndex = 0; configIndex < (externalServicesConfig.size()); configIndex++) {
|
||||||
|
String name = (String) externalServicesConfig.get(configIndex).get("name");
|
||||||
|
String value = null;
|
||||||
|
if (name.equals(configName)) {
|
||||||
|
value = (String) externalServicesConfig.get(configIndex).get("value");
|
||||||
|
String newValue = "test";
|
||||||
|
System.out.println(name + ":" + value);
|
||||||
|
HashMap arrayListValue = this.externalServicesConfigurationHelper.updateValueForExternaServicesConfiguration(requestSpec,
|
||||||
|
responseSpec, "S3", name, newValue);
|
||||||
|
Assert.assertNotNull(arrayListValue.get("value"));
|
||||||
|
Assert.assertEquals(arrayListValue.get("value"), newValue);
|
||||||
|
HashMap arrayListValue1 = this.externalServicesConfigurationHelper.updateValueForExternaServicesConfiguration(requestSpec,
|
||||||
|
responseSpec, "S3", name, value);
|
||||||
|
Assert.assertNotNull(arrayListValue1.get("value"));
|
||||||
|
Assert.assertEquals(arrayListValue1.get("value"), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Checking for SMTP:
|
||||||
|
|
||||||
|
configName = "username";
|
||||||
|
externalServicesConfig = this.externalServicesConfigurationHelper.getExternalServicesConfigurationByServiceName(requestSpec,
|
||||||
|
responseSpec, "SMTP");
|
||||||
|
Assert.assertNotNull(externalServicesConfig);
|
||||||
|
for (Integer configIndex = 0; configIndex < (externalServicesConfig.size()); configIndex++) {
|
||||||
|
String name = (String) externalServicesConfig.get(configIndex).get("name");
|
||||||
|
String value = null;
|
||||||
|
if (name.equals(configName)) {
|
||||||
|
value = (String) externalServicesConfig.get(configIndex).get("value");
|
||||||
|
String newValue = "test";
|
||||||
|
System.out.println(name + ":" + value);
|
||||||
|
HashMap arrayListValue = this.externalServicesConfigurationHelper.updateValueForExternaServicesConfiguration(requestSpec,
|
||||||
|
responseSpec, "SMTP", name, newValue);
|
||||||
|
Assert.assertNotNull(arrayListValue.get("value"));
|
||||||
|
Assert.assertEquals(arrayListValue.get("value"), newValue);
|
||||||
|
HashMap arrayListValue1 = this.externalServicesConfigurationHelper.updateValueForExternaServicesConfiguration(requestSpec,
|
||||||
|
responseSpec, "SMTP", name, value);
|
||||||
|
Assert.assertNotNull(arrayListValue1.get("value"));
|
||||||
|
Assert.assertEquals(arrayListValue1.get("value"), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.integrationtests.common;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.jayway.restassured.specification.RequestSpecification;
|
||||||
|
import com.jayway.restassured.specification.ResponseSpecification;
|
||||||
|
|
||||||
|
public class ExternalServicesConfigurationHelper {
|
||||||
|
|
||||||
|
private final RequestSpecification requestSpec;
|
||||||
|
private final ResponseSpecification responseSpec;
|
||||||
|
|
||||||
|
public ExternalServicesConfigurationHelper(final RequestSpecification requestSpec, final ResponseSpecification responseSpec) {
|
||||||
|
this.requestSpec = requestSpec;
|
||||||
|
this.responseSpec = responseSpec;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ArrayList<HashMap> getExternalServicesConfigurationByServiceName(final RequestSpecification requestSpec,
|
||||||
|
final ResponseSpecification responseSpec, final String serviceName) {
|
||||||
|
final String GET_EXTERNAL_SERVICES_CONFIG_BY_SERVICE_NAME_URL = "/mifosng-provider/api/v1/externalservice/" + serviceName + "?"
|
||||||
|
+ Utils.TENANT_IDENTIFIER;
|
||||||
|
System.out.println("------------------------ RETRIEVING GLOBAL CONFIGURATION BY ID -------------------------");
|
||||||
|
return Utils.performServerGet(requestSpec, responseSpec, GET_EXTERNAL_SERVICES_CONFIG_BY_SERVICE_NAME_URL, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HashMap updateValueForExternaServicesConfiguration(final RequestSpecification requestSpec,
|
||||||
|
final ResponseSpecification responseSpec, final String serviceName, final String name, final String value) {
|
||||||
|
final String EXTERNAL_SERVICES_CONFIG_UPDATE_URL = "/mifosng-provider/api/v1/externalservice/" + serviceName + "?"
|
||||||
|
+ Utils.TENANT_IDENTIFIER;
|
||||||
|
System.out.println("---------------------------------UPDATE VALUE FOR GLOBAL CONFIG---------------------------------------------");
|
||||||
|
HashMap map = Utils.performServerPut(requestSpec, responseSpec, EXTERNAL_SERVICES_CONFIG_UPDATE_URL,
|
||||||
|
updateExternalServicesConfigUpdateValueAsJSON(name, value), "");
|
||||||
|
|
||||||
|
return (HashMap) map.get("changes");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String updateExternalServicesConfigUpdateValueAsJSON(final String name, final String value) {
|
||||||
|
final HashMap<String, String> map = new HashMap<>();
|
||||||
|
map.put(name, value);
|
||||||
|
System.out.println("map : " + map);
|
||||||
|
return new Gson().toJson(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+13
-3
@@ -29,8 +29,8 @@ public class CommandWrapperBuilder {
|
|||||||
private Long templateId;
|
private Long templateId;
|
||||||
|
|
||||||
public CommandWrapper build() {
|
public CommandWrapper build() {
|
||||||
return new CommandWrapper(this.officeId, this.groupId, this.clientId, this.loanId, this.savingsId, this.actionName,
|
return new CommandWrapper(this.officeId, this.groupId, this.clientId, this.loanId, this.savingsId, this.actionName, this.entityName,
|
||||||
this.entityName, this.entityId, this.subentityId, this.href, this.json, this.transactionId, this.productId, this.templateId);
|
this.entityId, this.subentityId, this.href, this.json, this.transactionId, this.productId, this.templateId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CommandWrapperBuilder withLoanId(final Long withLoanId) {
|
public CommandWrapperBuilder withLoanId(final Long withLoanId) {
|
||||||
@@ -1813,7 +1813,8 @@ public class CommandWrapperBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CommandWrapperBuilder saveOrUpdateAttendance(final Long entityId, final String supportedEntityType, final Long supportedEntityId) {
|
public CommandWrapperBuilder saveOrUpdateAttendance(final Long entityId, final String supportedEntityType,
|
||||||
|
final Long supportedEntityId) {
|
||||||
this.actionName = "SAVEORUPDATEATTENDANCE";
|
this.actionName = "SAVEORUPDATEATTENDANCE";
|
||||||
this.entityName = "MEETING";
|
this.entityName = "MEETING";
|
||||||
this.entityId = entityId;
|
this.entityId = entityId;
|
||||||
@@ -2394,4 +2395,13 @@ public class CommandWrapperBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CommandWrapperBuilder updateExternalServiceProperties(final String externalServiceName) {
|
||||||
|
this.actionName = "UPDATE";
|
||||||
|
this.entityName = "EXTERNALSERVICES";
|
||||||
|
this.transactionId = externalServiceName;
|
||||||
|
|
||||||
|
this.href = "/externalservices/" + externalServiceName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.api;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class ExternalServiceConfigurationApiConstant {
|
||||||
|
|
||||||
|
public static final String NAME = "name";
|
||||||
|
public static final String VALUE = "value";
|
||||||
|
public static final String EXTERNAL_SERVICE_RESOURCE_NAME = "externalServiceConfiguration";
|
||||||
|
|
||||||
|
public static final Set<String> EXTERNAL_SERVICE_CONFIGURATION_DATA_PARAMETERS = new HashSet<>(Arrays.asList(NAME, VALUE));
|
||||||
|
}
|
||||||
+93
@@ -0,0 +1,93 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.api;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.PUT;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
|
import javax.ws.rs.core.Context;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.UriInfo;
|
||||||
|
|
||||||
|
import org.mifosplatform.commands.domain.CommandWrapper;
|
||||||
|
import org.mifosplatform.commands.service.CommandWrapperBuilder;
|
||||||
|
import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformService;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.data.ExternalServicesData;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.data.ExternalServicesPropertiesData;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.service.ExternalServicesPropertiesReadPlatformService;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.service.ExternalServicesReadPlatformService;
|
||||||
|
import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
||||||
|
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
|
||||||
|
import org.mifosplatform.infrastructure.core.serialization.ToApiJsonSerializer;
|
||||||
|
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.annotation.Scope;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Path("/externalservice")
|
||||||
|
@Component
|
||||||
|
@Scope("singleton")
|
||||||
|
public class ExternalServicesConfigurationApiResource {
|
||||||
|
|
||||||
|
private final PlatformSecurityContext context;
|
||||||
|
private final ExternalServicesPropertiesReadPlatformService externalServicePropertiesReadPlatformService;
|
||||||
|
private final ExternalServicesReadPlatformService externalServiceReadPlatformService;
|
||||||
|
private final ToApiJsonSerializer<ExternalServicesPropertiesData> toApiJsonSerializer;
|
||||||
|
// private final ToApiJsonSerializer<S3CredentialsData>
|
||||||
|
// s3ToApiJsonSerializer;
|
||||||
|
private final ApiRequestParameterHelper apiRequestParameterHelper;
|
||||||
|
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public ExternalServicesConfigurationApiResource(final PlatformSecurityContext context,
|
||||||
|
final ExternalServicesPropertiesReadPlatformService readPlatformService,
|
||||||
|
final ExternalServicesReadPlatformService externalServicesReadPlatformService,
|
||||||
|
final ToApiJsonSerializer<ExternalServicesPropertiesData> toApiJsonSerializer,
|
||||||
|
final ApiRequestParameterHelper apiRequestParameterHelper,
|
||||||
|
final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) {
|
||||||
|
this.context = context;
|
||||||
|
this.externalServicePropertiesReadPlatformService = readPlatformService;
|
||||||
|
this.toApiJsonSerializer = toApiJsonSerializer;
|
||||||
|
this.externalServiceReadPlatformService = externalServicesReadPlatformService;
|
||||||
|
// this.s3ToApiJsonSerializer = s3ToApiJsonSerializer;
|
||||||
|
this.apiRequestParameterHelper = apiRequestParameterHelper;
|
||||||
|
this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("{servicename}")
|
||||||
|
@Consumes({ MediaType.APPLICATION_JSON })
|
||||||
|
@Produces({ MediaType.APPLICATION_JSON })
|
||||||
|
public String retrieveOne(@PathParam("servicename") final String serviceName, @Context final UriInfo uriInfo) {
|
||||||
|
this.context.authenticatedUser().validateHasReadPermission(ExternalServiceConfigurationApiConstant.EXTERNAL_SERVICE_RESOURCE_NAME);
|
||||||
|
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
|
||||||
|
final Collection<ExternalServicesPropertiesData> externalServiceNVPs = this.externalServicePropertiesReadPlatformService
|
||||||
|
.retrieveOne(serviceName);
|
||||||
|
return this.toApiJsonSerializer.serialize(settings, externalServiceNVPs,
|
||||||
|
ExternalServiceConfigurationApiConstant.EXTERNAL_SERVICE_CONFIGURATION_DATA_PARAMETERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PUT
|
||||||
|
@Path("{servicename}")
|
||||||
|
@Consumes({ MediaType.APPLICATION_JSON })
|
||||||
|
@Produces({ MediaType.APPLICATION_JSON })
|
||||||
|
public String updateExternalServiceProperties(@PathParam("servicename") final String serviceName, final String apiRequestBodyAsJson) {
|
||||||
|
// ExternalServicesData external =
|
||||||
|
// this.externalServiceReadPlatformService.getExternalServiceDetailsByServiceName(serviceName);
|
||||||
|
final CommandWrapper commandRequest = new CommandWrapperBuilder().updateExternalServiceProperties(serviceName)
|
||||||
|
.withJson(apiRequestBodyAsJson).build();
|
||||||
|
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
||||||
|
return this.toApiJsonSerializer.serialize(result);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.data;
|
||||||
|
|
||||||
|
public class ExternalServicesData {
|
||||||
|
|
||||||
|
private final Long id;
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
public ExternalServicesData(final Long id, final String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class ExternalServicesPropertiesData implements Serializable {
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final String value;
|
||||||
|
|
||||||
|
public ExternalServicesPropertiesData(final String name, final String value) {
|
||||||
|
this.name = name;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+44
@@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.data;
|
||||||
|
|
||||||
|
public class SMTPCredentialsData {
|
||||||
|
|
||||||
|
private final String username;
|
||||||
|
private final String password;
|
||||||
|
private final String host;
|
||||||
|
private final String port;
|
||||||
|
private final boolean useTLS;
|
||||||
|
|
||||||
|
public SMTPCredentialsData(final String username, final String password, final String host, final String port, final boolean useTLS) {
|
||||||
|
this.username = username;
|
||||||
|
this.password = password;
|
||||||
|
this.host = host;
|
||||||
|
this.port = port;
|
||||||
|
this.useTLS = useTLS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHost() {
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isUseTLS() {
|
||||||
|
return useTLS;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+24
-8
@@ -1,5 +1,11 @@
|
|||||||
package org.mifosplatform.infrastructure.configuration.domain;
|
package org.mifosplatform.infrastructure.configuration.domain;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.persistence.CascadeType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
@@ -8,29 +14,39 @@ package org.mifosplatform.infrastructure.configuration.domain;
|
|||||||
|
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.FetchType;
|
||||||
|
import javax.persistence.OneToMany;
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
import javax.persistence.UniqueConstraint;
|
import javax.persistence.UniqueConstraint;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
||||||
import org.springframework.data.jpa.domain.AbstractPersistable;
|
import org.springframework.data.jpa.domain.AbstractPersistable;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "c_external_service", uniqueConstraints = { @UniqueConstraint(columnNames = "name") })
|
@Table(name = "c_external_service", uniqueConstraints = { @UniqueConstraint(columnNames = { "name" }, name = "name_UNIQUE") })
|
||||||
public class ExternalService extends AbstractPersistable<Long> {
|
public class ExternalService extends AbstractPersistable<Long> {
|
||||||
|
|
||||||
@Column(name = "name", nullable = false)
|
@Column(name = "name", length = 50)
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@Column(name = "value", nullable = false)
|
// @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy =
|
||||||
private String value;
|
// "externalServicePropertiesPK.externalService", orphanRemoval = true)
|
||||||
|
// private Set<ExternalServicesProperties> values;
|
||||||
|
|
||||||
public ExternalService(final String name, final String value) {
|
public static ExternalService fromJson(final JsonCommand command) {
|
||||||
|
final String name = command.stringValueOfParameterNamed("name");
|
||||||
|
return new ExternalService(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ExternalService(final String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.value = value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ExternalService() {}
|
protected ExternalService() {}
|
||||||
|
|
||||||
public String getValue() {
|
public String name() {
|
||||||
return this.value;
|
return this.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.domain;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Embeddable;
|
||||||
|
import javax.persistence.JoinColumn;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
|
||||||
|
import org.springframework.data.annotation.Id;
|
||||||
|
|
||||||
|
@Embeddable
|
||||||
|
public class ExternalServicePropertiesPK implements Serializable {
|
||||||
|
|
||||||
|
@Column(name = "name", length = 150)
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Column(name = "external_service_id")
|
||||||
|
private Long externalServiceId;
|
||||||
|
|
||||||
|
public ExternalServicePropertiesPK() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExternalServicePropertiesPK(Long externalServiceId, String name) {
|
||||||
|
this.externalServiceId = externalServiceId;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getExternalService() {
|
||||||
|
return externalServiceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+76
@@ -0,0 +1,76 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.domain;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Embeddable;
|
||||||
|
import javax.persistence.Embedded;
|
||||||
|
import javax.persistence.EmbeddedId;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.JoinColumn;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.data.ExternalServicesPropertiesData;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.service.ExternalServicesConstants.EXTERNALSERVICEPROPERTIES_JSON_INPUT_PARAMS;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.service.ExternalServicesConstants.SMTP_JSON_INPUT_PARAMS;
|
||||||
|
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
||||||
|
import org.springframework.data.annotation.Id;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "c_external_service_properties")
|
||||||
|
public class ExternalServicesProperties {
|
||||||
|
|
||||||
|
@EmbeddedId
|
||||||
|
ExternalServicePropertiesPK externalServicePropertiesPK;
|
||||||
|
|
||||||
|
@Column(name = "value", length = 250)
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
protected ExternalServicesProperties() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private ExternalServicesProperties(final ExternalServicePropertiesPK externalServicePropertiesPK, final String value) {
|
||||||
|
this.externalServicePropertiesPK = externalServicePropertiesPK;
|
||||||
|
|
||||||
|
this.value = value;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExternalServicesProperties fromJson(final ExternalService externalService, final JsonCommand command) {
|
||||||
|
final String name = command.stringValueOfParameterNamed(EXTERNALSERVICEPROPERTIES_JSON_INPUT_PARAMS.NAME.getValue());
|
||||||
|
final String value = command.stringValueOfParameterNamed(EXTERNALSERVICEPROPERTIES_JSON_INPUT_PARAMS.VALUE.getValue());
|
||||||
|
return new ExternalServicesProperties(new ExternalServicePropertiesPK(externalService.getId(), name), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Object> update(final JsonCommand command, String paramName) {
|
||||||
|
final Map<String, Object> actualChanges = new LinkedHashMap<>(2);
|
||||||
|
|
||||||
|
final String valueParamName = EXTERNALSERVICEPROPERTIES_JSON_INPUT_PARAMS.VALUE.getValue();
|
||||||
|
if (command.isChangeInStringParameterNamed(paramName, this.value)) {
|
||||||
|
final String newValue = command.stringValueOfParameterNamed(paramName);
|
||||||
|
if (paramName.equals(SMTP_JSON_INPUT_PARAMS.PASSWORD.getValue()) && newValue.equals("XXXX")) {
|
||||||
|
// If Param Name is Password and ParamValue is XXXX that means
|
||||||
|
// the password has not been changed.
|
||||||
|
} else {
|
||||||
|
actualChanges.put(valueParamName, newValue);
|
||||||
|
}
|
||||||
|
this.value = StringUtils.defaultIfEmpty(newValue, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
return actualChanges;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExternalServicesPropertiesData toData() {
|
||||||
|
return new ExternalServicesPropertiesData(this.externalServicePropertiesPK.getName(), this.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+3
-2
@@ -8,7 +8,8 @@ package org.mifosplatform.infrastructure.configuration.domain;
|
|||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||||
|
|
||||||
public interface ExternalServiceRepository extends JpaRepository<ExternalService, Long>, JpaSpecificationExecutor<ExternalService> {
|
public interface ExternalServicesPropertiesRepository extends JpaRepository<ExternalServicesProperties, ExternalServicePropertiesPK>,
|
||||||
|
JpaSpecificationExecutor<ExternalServicesProperties> {
|
||||||
|
|
||||||
ExternalService findOneByName(String name);
|
ExternalServicesProperties findOneByExternalServicePropertiesPK(ExternalServicePropertiesPK externalServicesProptiesPK);
|
||||||
}
|
}
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.domain;
|
||||||
|
|
||||||
|
import org.mifosplatform.infrastructure.configuration.exception.ExternalServiceConfigurationNotFoundException;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ExternalServicesPropertiesRepositoryWrapper {
|
||||||
|
|
||||||
|
private final ExternalServicesPropertiesRepository repository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public ExternalServicesPropertiesRepositoryWrapper(final ExternalServicesPropertiesRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExternalServicesProperties findOneByIdAndName(Long id, String name, String externalServiceName) {
|
||||||
|
final ExternalServicesProperties externalServicesProperties = this.repository
|
||||||
|
.findOneByExternalServicePropertiesPK(new ExternalServicePropertiesPK(id, name));
|
||||||
|
if (externalServicesProperties == null) throw new ExternalServiceConfigurationNotFoundException(externalServiceName, name);
|
||||||
|
return externalServicesProperties;
|
||||||
|
}
|
||||||
|
}
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.exception;
|
||||||
|
|
||||||
|
import org.mifosplatform.infrastructure.core.exception.AbstractPlatformResourceNotFoundException;
|
||||||
|
|
||||||
|
public class ExternalServiceConfigurationNotFoundException extends AbstractPlatformResourceNotFoundException {
|
||||||
|
|
||||||
|
public ExternalServiceConfigurationNotFoundException(final String serviceName) {
|
||||||
|
super("error.msg.externalservice.servicename.invalid", "Service Name`" + serviceName + "` does not exist", serviceName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExternalServiceConfigurationNotFoundException(final String externalServiceName, final String name) {
|
||||||
|
super("error.msg.externalservice.property.invalid",
|
||||||
|
"Parameter`" + name + "` does not exist for the ServiceName `" + externalServiceName + "`", name, externalServiceName);
|
||||||
|
}
|
||||||
|
}
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.handler;
|
||||||
|
|
||||||
|
import org.mifosplatform.commands.annotation.CommandType;
|
||||||
|
import org.mifosplatform.commands.handler.NewCommandSourceHandler;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.service.ExternalServiceWritePlatformService;
|
||||||
|
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@CommandType(entity = "EXTERNALSERVICES", action = "UPDATE")
|
||||||
|
public class UpdateExternalServiceConfigurationCommandHandler implements NewCommandSourceHandler {
|
||||||
|
|
||||||
|
private final ExternalServiceWritePlatformService writePlatformService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public UpdateExternalServiceConfigurationCommandHandler(final ExternalServiceWritePlatformService writePlatformService) {
|
||||||
|
this.writePlatformService = writePlatformService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@Override
|
||||||
|
public CommandProcessingResult processCommand(final JsonCommand command) {
|
||||||
|
return this.writePlatformService.updateExternalServicesProperties(command.getTransactionId(), command);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+72
@@ -0,0 +1,72 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.serialization;
|
||||||
|
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.exception.ExternalServiceConfigurationNotFoundException;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.service.ExternalServicesConstants;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.service.ExternalServicesConstants.EXTERNALSERVICEPROPERTIES_JSON_INPUT_PARAMS;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.service.ExternalServicesConstants.S3_JSON_INPUT_PARAMS;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.service.ExternalServicesConstants.SMTP_JSON_INPUT_PARAMS;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.ApiParameterError;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.DataValidatorBuilder;
|
||||||
|
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
|
||||||
|
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ExternalServicesPropertiesCommandFromApiJsonDeserializer {
|
||||||
|
|
||||||
|
private final Set<String> supportedParameters = EXTERNALSERVICEPROPERTIES_JSON_INPUT_PARAMS.getAllValues();
|
||||||
|
private final Set<String> S3SupportedParameters = S3_JSON_INPUT_PARAMS.getAllValues();
|
||||||
|
private final Set<String> SMTPSupportedParameters = SMTP_JSON_INPUT_PARAMS.getAllValues();
|
||||||
|
private final FromJsonHelper fromApiJsonHelper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public ExternalServicesPropertiesCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper) {
|
||||||
|
this.fromApiJsonHelper = fromApiJsonHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void validateForUpdate(final String json, final String externalServiceName) {
|
||||||
|
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
|
||||||
|
|
||||||
|
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
|
||||||
|
switch (externalServiceName) {
|
||||||
|
case "S3":
|
||||||
|
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.S3SupportedParameters);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "SMTP":
|
||||||
|
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.SMTPSupportedParameters);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new ExternalServiceConfigurationNotFoundException(externalServiceName);
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
|
||||||
|
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("external.service");
|
||||||
|
final JsonElement element = this.fromApiJsonHelper.parse(json);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getNameKeys(final String json) {
|
||||||
|
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
|
||||||
|
Map<String, String> jsonMap = this.fromApiJsonHelper.extractDataMap(typeOfMap, json);
|
||||||
|
Set<String> keyNames = jsonMap.keySet();
|
||||||
|
return keyNames;
|
||||||
|
}
|
||||||
|
}
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.service;
|
||||||
|
|
||||||
|
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
||||||
|
|
||||||
|
public interface ExternalServiceWritePlatformService {
|
||||||
|
|
||||||
|
CommandProcessingResult updateExternalServicesProperties(String externalServiceName, JsonCommand command);
|
||||||
|
|
||||||
|
}
|
||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.service;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.mifosplatform.infrastructure.configuration.data.ExternalServicesData;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.domain.ExternalServicesProperties;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.domain.ExternalServicesPropertiesRepository;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.domain.ExternalServicesPropertiesRepositoryWrapper;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.serialization.ExternalServicesPropertiesCommandFromApiJsonDeserializer;
|
||||||
|
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
||||||
|
import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder;
|
||||||
|
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ExternalServiceWritePlatformServiceJpaRepositoryImpl implements ExternalServiceWritePlatformService {
|
||||||
|
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(ExternalServiceWritePlatformServiceJpaRepositoryImpl.class);
|
||||||
|
|
||||||
|
private final PlatformSecurityContext context;
|
||||||
|
private final ExternalServicesPropertiesRepositoryWrapper repositoryWrapper;
|
||||||
|
private final ExternalServicesPropertiesRepository repository;
|
||||||
|
private final ExternalServicesPropertiesCommandFromApiJsonDeserializer fromApiJsonDeserializer;
|
||||||
|
private final ExternalServicesReadPlatformService readPlatformService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public ExternalServiceWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context,
|
||||||
|
final ExternalServicesPropertiesRepositoryWrapper repositoryWrapper, final ExternalServicesPropertiesRepository repository,
|
||||||
|
final ExternalServicesPropertiesCommandFromApiJsonDeserializer fromApiJsonDeserializer,
|
||||||
|
final ExternalServicesReadPlatformService readPlatformService) {
|
||||||
|
|
||||||
|
this.context = context;
|
||||||
|
this.repositoryWrapper = repositoryWrapper;
|
||||||
|
this.repository = repository;
|
||||||
|
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
|
||||||
|
this.readPlatformService = readPlatformService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@Override
|
||||||
|
public CommandProcessingResult updateExternalServicesProperties(String externalServiceName, JsonCommand command) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
this.context.authenticatedUser();
|
||||||
|
this.fromApiJsonDeserializer.validateForUpdate(command.json(), externalServiceName);
|
||||||
|
Set<String> keyName = this.fromApiJsonDeserializer.getNameKeys(command.json());
|
||||||
|
ExternalServicesData external = this.readPlatformService.getExternalServiceDetailsByServiceName(externalServiceName);
|
||||||
|
Long externalServiceId = external.getId();
|
||||||
|
Iterator<String> it = keyName.iterator();
|
||||||
|
Map<String, Object> changesList = new LinkedHashMap<>();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
String name = it.next();
|
||||||
|
final ExternalServicesProperties externalServicesProperties = this.repositoryWrapper.findOneByIdAndName(externalServiceId, name,
|
||||||
|
externalServiceName);
|
||||||
|
final Map<String, Object> changes = externalServicesProperties.update(command, name);
|
||||||
|
changesList.putAll(changes);
|
||||||
|
if (!changes.isEmpty()) {
|
||||||
|
this.repository.saveAndFlush(externalServicesProperties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new CommandProcessingResultBuilder() //
|
||||||
|
.withCommandId(command.commandId()).withEntityId(externalServiceId).with(changesList).build();
|
||||||
|
//
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+106
@@ -5,10 +5,116 @@
|
|||||||
*/
|
*/
|
||||||
package org.mifosplatform.infrastructure.configuration.service;
|
package org.mifosplatform.infrastructure.configuration.service;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.mifosplatform.infrastructure.codes.CodeConstants.CODEVALUE_JSON_INPUT_PARAMS;
|
||||||
|
|
||||||
public class ExternalServicesConstants {
|
public class ExternalServicesConstants {
|
||||||
|
|
||||||
|
public static final String S3_SERVICE_NAME = "S3";
|
||||||
public static final String S3_BUCKET_NAME = "s3_bucket_name";
|
public static final String S3_BUCKET_NAME = "s3_bucket_name";
|
||||||
public static final String S3_ACCESS_KEY = "s3_access_key";
|
public static final String S3_ACCESS_KEY = "s3_access_key";
|
||||||
public static final String S3_SECRET_KEY = "s3_secret_key";
|
public static final String S3_SECRET_KEY = "s3_secret_key";
|
||||||
|
|
||||||
|
public static final String SMTP_SERVICE_NAME = "SMTP_Email_Account";
|
||||||
|
public static final String SMTP_USERNAME = "username";
|
||||||
|
public static final String SMTP_PASSWORD = "password";
|
||||||
|
public static final String SMTP_HOST = "host";
|
||||||
|
public static final String SMTP_PORT = "port";
|
||||||
|
public static final String SMTP_USE_TLS = "useTLS";
|
||||||
|
|
||||||
|
public static enum EXTERNALSERVICEPROPERTIES_JSON_INPUT_PARAMS {
|
||||||
|
EXTERNAL_SERVICE_ID("external_service_id"), NAME("name"), VALUE("value");
|
||||||
|
|
||||||
|
private final String value;
|
||||||
|
|
||||||
|
private EXTERNALSERVICEPROPERTIES_JSON_INPUT_PARAMS(final String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Set<String> values = new HashSet<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
for (final EXTERNALSERVICEPROPERTIES_JSON_INPUT_PARAMS type : EXTERNALSERVICEPROPERTIES_JSON_INPUT_PARAMS.values()) {
|
||||||
|
values.add(type.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<String> getAllValues() {
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return name().toString().replaceAll("_", " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static enum SMTP_JSON_INPUT_PARAMS {
|
||||||
|
USERNAME("username"), PASSWORD("password"), HOST("host"), PORT("port"), USETLS("useTLS");
|
||||||
|
|
||||||
|
private final String value;
|
||||||
|
|
||||||
|
private SMTP_JSON_INPUT_PARAMS(final String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Set<String> values = new HashSet<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
for (final SMTP_JSON_INPUT_PARAMS type : SMTP_JSON_INPUT_PARAMS.values()) {
|
||||||
|
values.add(type.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<String> getAllValues() {
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return name().toString().replaceAll("_", " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static enum S3_JSON_INPUT_PARAMS {
|
||||||
|
S3_ACCESS_KEY("s3_access_key"), S3_BUCKET_NAME("s3_bucket_name"), S3_SECRET_KEY("s3_secret_key");
|
||||||
|
|
||||||
|
private final String value;
|
||||||
|
|
||||||
|
private S3_JSON_INPUT_PARAMS(final String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Set<String> values = new HashSet<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
for (final S3_JSON_INPUT_PARAMS type : S3_JSON_INPUT_PARAMS.values()) {
|
||||||
|
values.add(type.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<String> getAllValues() {
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return name().toString().replaceAll("_", " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.service;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.mifosplatform.infrastructure.configuration.data.ExternalServicesPropertiesData;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.data.S3CredentialsData;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.data.SMTPCredentialsData;
|
||||||
|
|
||||||
|
public interface ExternalServicesPropertiesReadPlatformService {
|
||||||
|
|
||||||
|
S3CredentialsData getS3Credentials();
|
||||||
|
|
||||||
|
SMTPCredentialsData getSMTPCredentials();
|
||||||
|
|
||||||
|
Collection<ExternalServicesPropertiesData> retrieveOne(String serviceName);
|
||||||
|
|
||||||
|
}
|
||||||
+137
@@ -0,0 +1,137 @@
|
|||||||
|
/**
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
package org.mifosplatform.infrastructure.configuration.service;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.mifosplatform.infrastructure.configuration.data.ExternalServicesPropertiesData;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.data.S3CredentialsData;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.data.SMTPCredentialsData;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.exception.ExternalServiceConfigurationNotFoundException;
|
||||||
|
import org.mifosplatform.infrastructure.core.service.RoutingDataSource;
|
||||||
|
import org.mifosplatform.infrastructure.documentmanagement.data.DocumentData;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.dao.DataAccessException;
|
||||||
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
|
import org.springframework.jdbc.core.ResultSetExtractor;
|
||||||
|
import org.springframework.jdbc.core.RowMapper;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ExternalServicesPropertiesReadPlatformServiceImpl implements ExternalServicesPropertiesReadPlatformService {
|
||||||
|
|
||||||
|
private final JdbcTemplate jdbcTemplate;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public ExternalServicesPropertiesReadPlatformServiceImpl(final RoutingDataSource dataSource) {
|
||||||
|
this.jdbcTemplate = new JdbcTemplate(dataSource);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class S3CredentialsDataExtractor implements ResultSetExtractor<S3CredentialsData> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public S3CredentialsData extractData(final ResultSet rs) throws SQLException, DataAccessException {
|
||||||
|
String accessKey = null;
|
||||||
|
String bucketName = null;
|
||||||
|
String secretKey = null;
|
||||||
|
while (rs.next()) {
|
||||||
|
if (rs.getString("name").equalsIgnoreCase(ExternalServicesConstants.S3_ACCESS_KEY)) {
|
||||||
|
accessKey = rs.getString("value");
|
||||||
|
} else if (rs.getString("name").equalsIgnoreCase(ExternalServicesConstants.S3_BUCKET_NAME)) {
|
||||||
|
bucketName = rs.getString("value");
|
||||||
|
} else if (rs.getString("name").equalsIgnoreCase(ExternalServicesConstants.S3_SECRET_KEY)) {
|
||||||
|
secretKey = rs.getString("value");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new S3CredentialsData(bucketName, accessKey, secretKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class SMTPCredentialsDataExtractor implements ResultSetExtractor<SMTPCredentialsData> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SMTPCredentialsData extractData(final ResultSet rs) throws SQLException, DataAccessException {
|
||||||
|
String username = null;
|
||||||
|
String password = null;
|
||||||
|
String host = null;
|
||||||
|
String port = "25";
|
||||||
|
boolean useTLS = false;
|
||||||
|
|
||||||
|
while (rs.next()) {
|
||||||
|
if (rs.getString("name").equalsIgnoreCase(ExternalServicesConstants.SMTP_USERNAME)) {
|
||||||
|
username = rs.getString("value");
|
||||||
|
} else if (rs.getString("name").equalsIgnoreCase(ExternalServicesConstants.SMTP_PASSWORD)) {
|
||||||
|
password = rs.getString("value");
|
||||||
|
} else if (rs.getString("name").equalsIgnoreCase(ExternalServicesConstants.SMTP_HOST)) {
|
||||||
|
host = rs.getString("value");
|
||||||
|
} else if (rs.getString("name").equalsIgnoreCase(ExternalServicesConstants.SMTP_PORT)) {
|
||||||
|
port = rs.getString("value");
|
||||||
|
} else if (rs.getString("name").equalsIgnoreCase(ExternalServicesConstants.SMTP_USE_TLS)) {
|
||||||
|
useTLS = Boolean.parseBoolean(rs.getString("value"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new SMTPCredentialsData(username, password, host, port, useTLS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class ExternalServiceMapper implements RowMapper<ExternalServicesPropertiesData> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ExternalServicesPropertiesData mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
final String name = rs.getString("name");
|
||||||
|
String value = rs.getString("value");
|
||||||
|
// Masking the password as we should not send the password back
|
||||||
|
if (name != null && "password".equalsIgnoreCase(name)) {
|
||||||
|
value = "XXXX";
|
||||||
|
}
|
||||||
|
return new ExternalServicesPropertiesData(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public S3CredentialsData getS3Credentials() {
|
||||||
|
final ResultSetExtractor<S3CredentialsData> resultSetExtractor = new S3CredentialsDataExtractor();
|
||||||
|
final String sql = "SELECT esp.name, esp.value FROM c_external_service_properties esp inner join c_external_service es on esp.external_service_id = es.id where es.name = '"
|
||||||
|
+ ExternalServicesConstants.S3_SERVICE_NAME + "'";
|
||||||
|
final S3CredentialsData s3CredentialsData = this.jdbcTemplate.query(sql, resultSetExtractor, new Object[] {});
|
||||||
|
return s3CredentialsData;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SMTPCredentialsData getSMTPCredentials() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
final ResultSetExtractor<SMTPCredentialsData> resultSetExtractor = new SMTPCredentialsDataExtractor();
|
||||||
|
final String sql = "SELECT esp.name, esp.value FROM c_external_service_properties esp inner join c_external_service es on esp.external_service_id = es.id where es.name = '"
|
||||||
|
+ ExternalServicesConstants.SMTP_SERVICE_NAME + "'";
|
||||||
|
final SMTPCredentialsData smtpCredentialsData = this.jdbcTemplate.query(sql, resultSetExtractor, new Object[] {});
|
||||||
|
return smtpCredentialsData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<ExternalServicesPropertiesData> retrieveOne(String serviceName) {
|
||||||
|
String serviceNameToUse = null;
|
||||||
|
switch (serviceName) {
|
||||||
|
case "S3":
|
||||||
|
serviceNameToUse = ExternalServicesConstants.S3_SERVICE_NAME;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "SMTP":
|
||||||
|
serviceNameToUse = ExternalServicesConstants.SMTP_SERVICE_NAME;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new ExternalServiceConfigurationNotFoundException(serviceName);
|
||||||
|
}
|
||||||
|
final ExternalServiceMapper mapper = new ExternalServiceMapper();
|
||||||
|
final String sql = "SELECT esp.name, esp.value FROM c_external_service_properties esp inner join c_external_service es on esp.external_service_id = es.id where es.name = '"
|
||||||
|
+ serviceNameToUse + "'";
|
||||||
|
return this.jdbcTemplate.query(sql, mapper, new Object[] {});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
-3
@@ -5,10 +5,10 @@
|
|||||||
*/
|
*/
|
||||||
package org.mifosplatform.infrastructure.configuration.service;
|
package org.mifosplatform.infrastructure.configuration.service;
|
||||||
|
|
||||||
import org.mifosplatform.infrastructure.configuration.data.S3CredentialsData;
|
import org.mifosplatform.infrastructure.configuration.data.ExternalServicesData;
|
||||||
|
|
||||||
public interface ExternalServicesReadPlatformService {
|
public interface ExternalServicesReadPlatformService {
|
||||||
|
|
||||||
S3CredentialsData getS3Credentials();
|
ExternalServicesData getExternalServiceDetailsByServiceName(String serviceName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+34
-21
@@ -8,7 +8,8 @@ package org.mifosplatform.infrastructure.configuration.service;
|
|||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
import org.mifosplatform.infrastructure.configuration.data.S3CredentialsData;
|
import org.mifosplatform.infrastructure.configuration.data.ExternalServicesData;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.exception.ExternalServiceConfigurationNotFoundException;
|
||||||
import org.mifosplatform.infrastructure.core.service.RoutingDataSource;
|
import org.mifosplatform.infrastructure.core.service.RoutingDataSource;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.dao.DataAccessException;
|
import org.springframework.dao.DataAccessException;
|
||||||
@@ -26,31 +27,43 @@ public class ExternalServicesReadPlatformServiceImpl implements ExternalServices
|
|||||||
this.jdbcTemplate = new JdbcTemplate(dataSource);
|
this.jdbcTemplate = new JdbcTemplate(dataSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class S3CredentialsDataExtractor implements ResultSetExtractor<S3CredentialsData> {
|
@Override
|
||||||
|
public ExternalServicesData getExternalServiceDetailsByServiceName(String serviceName) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
final ResultSetExtractor<ExternalServicesData> resultSetExtractor = new ExternalServicesDetailsDataExtractor();
|
||||||
|
String serviceNameToUse = null;
|
||||||
|
switch (serviceName) {
|
||||||
|
case "S3":
|
||||||
|
serviceNameToUse = ExternalServicesConstants.S3_SERVICE_NAME;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "SMTP":
|
||||||
|
serviceNameToUse = ExternalServicesConstants.SMTP_SERVICE_NAME;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new ExternalServiceConfigurationNotFoundException(serviceName);
|
||||||
|
}
|
||||||
|
final String sql = "SELECT es.name as name, es.id as id FROM c_external_service es where es.name='" + serviceNameToUse + "'";
|
||||||
|
final ExternalServicesData externalServicesData = this.jdbcTemplate.query(sql, resultSetExtractor, new Object[] {});
|
||||||
|
return externalServicesData;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class ExternalServicesDetailsDataExtractor implements ResultSetExtractor<ExternalServicesData> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public S3CredentialsData extractData(final ResultSet rs) throws SQLException, DataAccessException {
|
public ExternalServicesData extractData(ResultSet rs) throws SQLException, DataAccessException {
|
||||||
String accessKey = null;
|
// TODO Auto-generated method stub
|
||||||
String bucketName = null;
|
Long id = (long) 0;
|
||||||
String secretKey = null;
|
String name = null;
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
if (rs.getString("name").equalsIgnoreCase(ExternalServicesConstants.S3_ACCESS_KEY)) {
|
name = rs.getString("name");
|
||||||
accessKey = rs.getString("value");
|
id = rs.getLong("id");
|
||||||
} else if (rs.getString("name").equalsIgnoreCase(ExternalServicesConstants.S3_BUCKET_NAME)) {
|
|
||||||
bucketName = rs.getString("value");
|
|
||||||
} else if (rs.getString("name").equalsIgnoreCase(ExternalServicesConstants.S3_SECRET_KEY)) {
|
|
||||||
secretKey = rs.getString("value");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return new S3CredentialsData(bucketName, accessKey, secretKey);
|
|
||||||
|
return new ExternalServicesData(id, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public S3CredentialsData getS3Credentials() {
|
|
||||||
final ResultSetExtractor<S3CredentialsData> resultSetExtractor = new S3CredentialsDataExtractor();
|
|
||||||
final String sql = "SELECT es.name, es.value FROM c_external_service es where es.name in('s3_bucket_name','s3_access_key','s3_secret_key')";
|
|
||||||
final S3CredentialsData s3CredentialsData = this.jdbcTemplate.query(sql, resultSetExtractor, new Object[] {});
|
|
||||||
return s3CredentialsData;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-7
@@ -9,28 +9,41 @@ import org.apache.commons.mail.DefaultAuthenticator;
|
|||||||
import org.apache.commons.mail.Email;
|
import org.apache.commons.mail.Email;
|
||||||
import org.apache.commons.mail.EmailException;
|
import org.apache.commons.mail.EmailException;
|
||||||
import org.apache.commons.mail.SimpleEmail;
|
import org.apache.commons.mail.SimpleEmail;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.data.S3CredentialsData;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.data.SMTPCredentialsData;
|
||||||
|
import org.mifosplatform.infrastructure.configuration.service.ExternalServicesPropertiesReadPlatformService;
|
||||||
import org.mifosplatform.infrastructure.core.domain.EmailDetail;
|
import org.mifosplatform.infrastructure.core.domain.EmailDetail;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class GmailBackedPlatformEmailService implements PlatformEmailService {
|
public class GmailBackedPlatformEmailService implements PlatformEmailService {
|
||||||
|
|
||||||
|
private final ExternalServicesPropertiesReadPlatformService externalServicesReadPlatformService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public GmailBackedPlatformEmailService(final ExternalServicesPropertiesReadPlatformService externalServicesReadPlatformService){
|
||||||
|
this.externalServicesReadPlatformService = externalServicesReadPlatformService;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendToUserAccount(final EmailDetail emailDetail, final String unencodedPassword) {
|
public void sendToUserAccount(final EmailDetail emailDetail, final String unencodedPassword) {
|
||||||
final Email email = new SimpleEmail();
|
final Email email = new SimpleEmail();
|
||||||
|
final SMTPCredentialsData smtpCredentialsData = this.externalServicesReadPlatformService.getSMTPCredentials();
|
||||||
|
final String authuserName = smtpCredentialsData.getUsername();
|
||||||
|
|
||||||
final String authuserName = "support@cloudmicrofinance.com";
|
final String authuser = smtpCredentialsData.getUsername();
|
||||||
|
final String authpwd = smtpCredentialsData.getPassword();
|
||||||
final String authuser = "support@cloudmicrofinance.com";
|
|
||||||
final String authpwd = "support80";
|
|
||||||
|
|
||||||
// Very Important, Don't use email.setAuthentication()
|
// Very Important, Don't use email.setAuthentication()
|
||||||
email.setAuthenticator(new DefaultAuthenticator(authuser, authpwd));
|
email.setAuthenticator(new DefaultAuthenticator(authuser, authpwd));
|
||||||
email.setDebug(false); // true if you want to debug
|
email.setDebug(false); // true if you want to debug
|
||||||
email.setHostName("smtp.gmail.com");
|
email.setHostName(smtpCredentialsData.getHost());
|
||||||
try {
|
try {
|
||||||
email.getMailSession().getProperties().put("mail.smtp.starttls.enable", "true");
|
if(smtpCredentialsData.isUseTLS()){
|
||||||
email.setFrom(authuser, authuserName);
|
email.getMailSession().getProperties().put("mail.smtp.starttls.enable", "true");
|
||||||
|
}
|
||||||
|
email.setFrom(authuser, authuserName);
|
||||||
|
|
||||||
final StringBuilder subjectBuilder = new StringBuilder().append("MifosX Prototype Demo: ").append(emailDetail.getContactName())
|
final StringBuilder subjectBuilder = new StringBuilder().append("MifosX Prototype Demo: ").append(emailDetail.getContactName())
|
||||||
.append(" user account creation.");
|
.append(" user account creation.");
|
||||||
|
|||||||
+3
-3
@@ -7,7 +7,7 @@ package org.mifosplatform.infrastructure.documentmanagement.contentrepository;
|
|||||||
|
|
||||||
import org.mifosplatform.infrastructure.configuration.data.S3CredentialsData;
|
import org.mifosplatform.infrastructure.configuration.data.S3CredentialsData;
|
||||||
import org.mifosplatform.infrastructure.configuration.domain.ConfigurationDomainService;
|
import org.mifosplatform.infrastructure.configuration.domain.ConfigurationDomainService;
|
||||||
import org.mifosplatform.infrastructure.configuration.service.ExternalServicesReadPlatformService;
|
import org.mifosplatform.infrastructure.configuration.service.ExternalServicesPropertiesReadPlatformService;
|
||||||
import org.mifosplatform.infrastructure.documentmanagement.domain.StorageType;
|
import org.mifosplatform.infrastructure.documentmanagement.domain.StorageType;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
@@ -17,11 +17,11 @@ import org.springframework.stereotype.Component;
|
|||||||
public class ContentRepositoryFactory {
|
public class ContentRepositoryFactory {
|
||||||
|
|
||||||
private final ApplicationContext applicationContext;
|
private final ApplicationContext applicationContext;
|
||||||
private final ExternalServicesReadPlatformService externalServicesReadPlatformService;
|
private final ExternalServicesPropertiesReadPlatformService externalServicesReadPlatformService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public ContentRepositoryFactory(final ApplicationContext applicationContext,
|
public ContentRepositoryFactory(final ApplicationContext applicationContext,
|
||||||
final ExternalServicesReadPlatformService externalServicesReadPlatformService) {
|
final ExternalServicesPropertiesReadPlatformService externalServicesReadPlatformService) {
|
||||||
this.applicationContext = applicationContext;
|
this.applicationContext = applicationContext;
|
||||||
this.externalServicesReadPlatformService = externalServicesReadPlatformService;
|
this.externalServicesReadPlatformService = externalServicesReadPlatformService;
|
||||||
}
|
}
|
||||||
|
|||||||
+48
@@ -0,0 +1,48 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
alter table c_external_service drop index name;
|
||||||
|
|
||||||
|
Rename table c_external_service to c_external_service_properties;
|
||||||
|
|
||||||
|
CREATE TABLE `c_external_service` (
|
||||||
|
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` VARCHAR(100) NULL DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `name_UNIQUE` (`name`)
|
||||||
|
)
|
||||||
|
COLLATE='utf8_general_ci'
|
||||||
|
ENGINE=InnoDB;
|
||||||
|
|
||||||
|
insert into `c_external_service` ( `name`) values( 'S3');
|
||||||
|
|
||||||
|
Alter table c_external_service_properties
|
||||||
|
ADD COLUMN `external_service_id` BIGINT(20) NULL DEFAULT NULL;
|
||||||
|
|
||||||
|
update c_external_service_properties set external_service_id = (select id from c_external_service where name = 'S3');
|
||||||
|
|
||||||
|
ALTER TABLE `c_external_service_properties`
|
||||||
|
CHANGE COLUMN `external_service_id` `external_service_id` BIGINT(20) NOT NULL;
|
||||||
|
|
||||||
|
ALTER TABLE `c_external_service_properties`
|
||||||
|
ADD CONSTRAINT `FK_c_external_service_properties_c_external_service` FOREIGN KEY (`external_service_id`) REFERENCES `c_external_service` (`id`);
|
||||||
|
|
||||||
|
|
||||||
|
insert into `c_external_service` ( `name`) values( 'SMTP_Email_Account');
|
||||||
|
|
||||||
|
insert into c_external_service_properties (`name`, `value`, `external_service_id`) values('username', 'support@cloudmicrofinance.com', (select id from c_external_service where name = 'Gmail_Email_Account'));
|
||||||
|
|
||||||
|
insert into c_external_service_properties (`name`, `value`, `external_service_id`) values('password', 'support80', (select id from c_external_service where name = 'Gmail_Email_Account'));
|
||||||
|
|
||||||
|
insert into c_external_service_properties (`name`, `value`, `external_service_id`) values('host', 'smtp.gmail.com', (select id from c_external_service where name = 'Gmail_Email_Account'));
|
||||||
|
|
||||||
|
insert into c_external_service_properties (`name`, `value`, `external_service_id`) values('port', '25', (select id from c_external_service where name = 'Gmail_Email_Account'));
|
||||||
|
|
||||||
|
insert into c_external_service_properties (`name`, `value`, `external_service_id`) values('useTLS', 'true', (select id from c_external_service where name = 'Gmail_Email_Account'));
|
||||||
|
|
||||||
|
insert into m_permission(grouping, code, entity_name, action_name, can_maker_checker) values('externalservices', 'UPDATE_EXTERNALSERVICES', 'EXTERNALSERVICES', 'UPDATE', 0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
commit;
|
||||||
|
|
||||||
Reference in New Issue
Block a user