Skip to content

Commit

Permalink
[MODORG-54] - Added bankingInformation API
Browse files Browse the repository at this point in the history
  • Loading branch information
Dzmitry_Butramyou committed Oct 30, 2023
1 parent 426feee commit 93f35ad
Show file tree
Hide file tree
Showing 13 changed files with 465 additions and 39 deletions.
2 changes: 1 addition & 1 deletion ramls/acq-models
Submodule acq-models updated 30 files
+4 −0 mod-finance/examples/fund.sample
+4 −0 mod-finance/examples/fund_collection.sample
+4 −0 mod-finance/examples/fund_details.sample
+8 −0 mod-finance/schemas/fund.json
+2 −2 mod-orders-storage/examples/piece_collection.sample
+1 −1 mod-orders-storage/examples/piece_post.sample
+4 −0 mod-orders-storage/examples/po_line_collection.sample
+4 −0 mod-orders-storage/examples/po_line_get.sample
+4 −0 mod-orders-storage/examples/po_line_post.sample
+5 −1 mod-orders-storage/schemas/piece.json
+8 −0 mod-orders-storage/schemas/po_line.json
+4 −0 mod-orders/examples/composite_po_line.sample
+8 −0 mod-orders/schemas/composite_po_line.json
+35 −0 mod-orgs/examples/banking_information_collection.sample
+15 −0 mod-orgs/examples/banking_information_get.sample
+9 −0 mod-orgs/examples/banking_information_post.sample
+3 −0 mod-orgs/examples/organization_collection.sample
+3 −0 mod-orgs/examples/organization_get.sample
+3 −0 mod-orgs/examples/organization_post.sample
+3 −0 mod-orgs/examples/organization_put.sample
+23 −0 mod-orgs/examples/setting_collection.sample
+9 −0 mod-orgs/examples/setting_get.sample
+4 −0 mod-orgs/examples/setting_post.sample
+57 −0 mod-orgs/schemas/banking_information.json
+25 −0 mod-orgs/schemas/banking_information_collection.json
+4 −0 mod-orgs/schemas/contact.json
+8 −0 mod-orgs/schemas/organization.json
+4 −0 mod-orgs/schemas/organization_type.json
+33 −0 mod-orgs/schemas/setting.json
+25 −0 mod-orgs/schemas/setting_collection.json
66 changes: 66 additions & 0 deletions ramls/banking_information.raml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#%RAML 1.0

title: Banking information
baseUri: https://github.com/folio-org/mod-organizations
version: v1.0
protocols: [ HTTP, HTTPS ]

documentation:
- title: Banking information Logic API
content: <b>API for banking information</b>

types:
banking_information: !include acq-models/mod-orgs/schemas/banking_information.json
banking_information_collection: !include acq-models/mod-orgs/schemas/banking_information_collection.json
errors: !include raml-util/schemas/errors.schema
UUID:
type: string
pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$

traits:
pageable: !include raml-util/traits/pageable.raml
searchable: !include raml-util/traits/searchable.raml
validate: !include raml-util/traits/validation.raml

resourceTypes:
collection: !include raml-util/rtypes/collection-with-json-response.raml
collection-item: !include raml-util/rtypes/item-collection-with-json-response.raml

/organizations/banking-information:
type:
collection:
exampleCollection: !include acq-models/mod-orgs/examples/banking_information_collection.sample
exampleItem: !include acq-models/mod-orgs/examples/banking_information_post.sample
schemaCollection: banking_information_collection
schemaItem: banking_information
is: [validate]
get:
description: Get a list of banking information
is: [
searchable: { description: "CQL query", example: "bankName=TRC" },
pageable
]
post:
description: Create a banking information
is: [ validate ]
/{id}:
uriParameters:
id:
description: The UUID of a banking information
type: UUID
type:
collection-item:
exampleItem: !include acq-models/mod-orgs/examples/banking_information_get.sample
schema: banking_information
is: [validate]
put:
description: Update a banking information by id
body:
application/json:
example:
strict: false
value: !include acq-models/mod-orgs/examples/banking_information_post.sample
type: banking_information
delete:
description: Delete a banking information by id
is: [ validate ]
12 changes: 10 additions & 2 deletions src/main/java/org/folio/config/ApplicationConfig.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package org.folio.config;

import org.folio.rest.client.RestClient;
import org.folio.service.organization.BankingInformationService;
import org.folio.service.organization.BankingInformationServiceImpl;
import org.folio.service.organization.OrganizationService;
import org.folio.service.organization.OrganizationStorageService;
import org.folio.service.protection.AcquisitionsUnitsService;
Expand All @@ -13,8 +15,14 @@
@Configuration
public class ApplicationConfig {
@Bean
public OrganizationService organizationService() {
return new OrganizationStorageService();
public OrganizationService organizationService(ProtectionService protectionService, RestClient restClient,
AcquisitionsUnitsService acquisitionUnitsService) {
return new OrganizationStorageService(protectionService, restClient, acquisitionUnitsService);
}

@Bean
public BankingInformationService bankingInformationService(RestClient restClient) {
return new BankingInformationServiceImpl(restClient);
}

@Bean
Expand Down
73 changes: 73 additions & 0 deletions src/main/java/org/folio/rest/impl/BankingInformationAPI.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package org.folio.rest.impl;

import io.vertx.core.AsyncResult;
import io.vertx.core.Context;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import org.apache.logging.log4j.LogManager;
import org.folio.rest.jaxrs.model.BankingInformation;
import org.folio.rest.jaxrs.resource.OrganizationsBankingInformation;

import javax.ws.rs.core.Response;
import java.util.Map;
import org.apache.logging.log4j.Logger;
import org.folio.service.organization.BankingInformationService;
import org.folio.spring.SpringContextUtil;
import org.springframework.beans.factory.annotation.Autowired;

import static io.vertx.core.Future.succeededFuture;
import static org.folio.config.Constants.OKAPI_URL;

public class BankingInformationAPI extends BaseApi implements OrganizationsBankingInformation {

private static final Logger logger = LogManager.getLogger(BankingInformationAPI.class);
private static final String BANKING_INFORMATION_LOCATION_PREFIX = "/organizations/banking-information/%s";

@Autowired
private BankingInformationService bankingInformationService;

public BankingInformationAPI() {
SpringContextUtil.autowireDependencies(this, Vertx.currentContext());
}

@Override
public void getOrganizationsBankingInformation(String query, String totalRecords, int offset, int limit, Map<String, String> okapiHeaders, Handler<AsyncResult<Response>> asyncResultHandler, Context vertxContext) {
bankingInformationService.getBankingInformationCollection(offset, limit, query, vertxContext, okapiHeaders)
.onSuccess(bankingInformation -> asyncResultHandler.handle(succeededFuture(buildOkResponse(bankingInformation))))
.onFailure(t -> handleErrorResponse(asyncResultHandler, t));
}

@Override
public void postOrganizationsBankingInformation(BankingInformation entity, Map<String, String> okapiHeaders,
Handler<AsyncResult<Response>> asyncResultHandler, Context vertxContext) {
logger.debug("Trying to create banking information with id: {}", entity.getId());
bankingInformationService.createBankingInformation(entity, vertxContext, okapiHeaders)
.onSuccess(bankingInformation -> asyncResultHandler.handle(succeededFuture(buildResponseWithLocation(okapiHeaders.get(OKAPI_URL),
String.format(BANKING_INFORMATION_LOCATION_PREFIX, bankingInformation.getId()), bankingInformation))))
.onFailure(t -> handleErrorResponse(asyncResultHandler, t));
}

@Override
public void putOrganizationsBankingInformationById(String id, BankingInformation entity, Map<String, String> okapiHeaders, Handler<AsyncResult<Response>> asyncResultHandler, Context vertxContext) {
logger.debug("Trying to update banking information with id: {}", id);
bankingInformationService.updateBankingInformation(id, entity, vertxContext, okapiHeaders)
.onSuccess(vVoid -> asyncResultHandler.handle(succeededFuture(buildNoContentResponse())))
.onFailure(t -> handleErrorResponse(asyncResultHandler, t));
}

@Override
public void deleteOrganizationsBankingInformationById(String id, Map<String, String> okapiHeaders, Handler<AsyncResult<Response>> asyncResultHandler, Context vertxContext) {
logger.debug("Trying to delete banking information by id: {}", id);
bankingInformationService.deleteBankingInformation(id, vertxContext, okapiHeaders)
.onSuccess(vVoid -> asyncResultHandler.handle(succeededFuture(buildNoContentResponse())))
.onFailure(t -> handleErrorResponse(asyncResultHandler, t));
}

@Override
public void getOrganizationsBankingInformationById(String id, Map<String, String> okapiHeaders, Handler<AsyncResult<Response>> asyncResultHandler, Context vertxContext) {
logger.debug("Trying to get banking information with id: {}", id);
bankingInformationService.getBankingInformationById(id, vertxContext, okapiHeaders)
.onSuccess(bankingInformation -> asyncResultHandler.handle(succeededFuture(buildOkResponse(bankingInformation))))
.onFailure(t -> handleErrorResponse(asyncResultHandler, t));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package org.folio.service.organization;

import io.vertx.core.Context;
import io.vertx.core.Future;
import org.folio.rest.jaxrs.model.BankingInformation;
import org.folio.rest.jaxrs.model.BankingInformationCollection;

import java.util.Map;

public interface BankingInformationService {

/**
* This method creates {@link BankingInformation}
*
* @param bankingInformation bankingInformation
* @param context Vert.X context
* @param headers OKAPI headers
* @return created {@link BankingInformation}
*/
Future<BankingInformation> createBankingInformation(BankingInformation bankingInformation, Context context, Map<String, String> headers);

/**
* This method returns {@link BankingInformation} by ID
*
* @param id bankingInformation's id
* @param context Vert.X context
* @param headers OKAPI headers
* @return {@link BankingInformation}
*/
Future<BankingInformation> getBankingInformationById(String id, Context context, Map<String, String> headers);

/**
* This method returns {@link BankingInformationCollection} by query
*
* @param offset offset
* @param limit limit
* @param query query
* @param context Vert.X context
* @param headers OKAPI headers
* @return collection of bankingInformation {@link BankingInformationCollection}
*/
Future<BankingInformationCollection> getBankingInformationCollection(int offset, int limit, String query,
Context context, Map<String, String> headers);

/**
* This method updates {@link BankingInformation} by ID
* @param id updated bankingInformation's id
* @param entity updated {@link BankingInformation} entity
* @param context Vert.X context
* @param headers OKAPI headers
* @return void future
*/
Future<Void> updateBankingInformation (String id, BankingInformation entity, Context context, Map<String, String> headers);

/**
* This method deletes {@link BankingInformation} by ID
* @param id deleted bankingInformation's id
* @param context Vert.X context
* @param headers OKAPI headers
* @return void future
*/
Future<Void> deleteBankingInformation (String id, Context context, Map<String, String> headers);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package org.folio.service.organization;

import io.vertx.core.Context;
import io.vertx.core.Future;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.folio.HttpStatus;
import org.folio.exception.HttpException;
import org.folio.rest.client.RequestContext;
import org.folio.rest.client.RestClient;
import org.folio.rest.jaxrs.model.BankingInformation;
import org.folio.rest.jaxrs.model.BankingInformationCollection;
import org.springframework.stereotype.Service;

import java.util.Map;

import static org.apache.commons.lang3.StringUtils.isEmpty;
import static org.folio.exception.ErrorCodes.MISMATCH_BETWEEN_ID_IN_PATH_AND_BODY;
import static org.folio.util.ResourcePathResolver.*;
import static org.folio.util.ResourcePathResolver.resourceByIdPath;
import static org.folio.util.RestUtils.*;

@Service
public class BankingInformationServiceImpl implements BankingInformationService {

private static final Logger logger = LogManager.getLogger(BankingInformationServiceImpl.class);
public static final String GET_BANKING_INFORMATION_BY_QUERY = resourcesPath(BANKING_INFORMATION) + SEARCH_PARAMS;

private final RestClient restClient;

public BankingInformationServiceImpl(RestClient restClient) {
this.restClient = restClient;
}

@Override
public Future<BankingInformation> createBankingInformation(BankingInformation bankingInformation, Context context, Map<String, String> headers) {
logger.debug("createBankingInformation:: Trying to create banking information with id: {}", bankingInformation.getId());
RequestContext requestContext = new RequestContext(context, headers);
return restClient.post(bankingInformation, resourcesPath(BANKING_INFORMATION), BankingInformation.class, requestContext);
}

@Override
public Future<BankingInformation> getBankingInformationById(String id, Context context, Map<String, String> headers) {
logger.debug("getBankingInformationById:: Trying to get banking information by id: {}", id);
RequestContext requestContext = new RequestContext(context, headers);
return restClient.get(resourceByIdPath(BANKING_INFORMATION, id), BankingInformation.class, requestContext);
}

@Override
public Future<BankingInformationCollection> getBankingInformationCollection(int offset, int limit, String query, Context context, Map<String, String> headers) {
logger.debug("getBankingInformationCollection:: Trying to get banking information collection with query: {}, offset: {}, limit: {}", query, offset, limit);
RequestContext requestContext = new RequestContext(context, headers);
String endpoint = String.format(GET_BANKING_INFORMATION_BY_QUERY, limit, offset, buildQuery(query));
return restClient.get(endpoint, BankingInformationCollection.class, requestContext);
}

@Override
public Future<Void> updateBankingInformation(String id, BankingInformation updatedBankingInformation, Context context, Map<String, String> headers) {
logger.debug("updateBankingInformation:: Trying to update banking information with id: {}", id);
RequestContext requestContext = new RequestContext(context, headers);
if (isEmpty(updatedBankingInformation.getId())) {
updatedBankingInformation.setId(id);
} else if (!id.equals(updatedBankingInformation.getId())) {
logger.warn("updateBankingInformation:: Mismatch between id '{}' in path and request body '{}'", id, updatedBankingInformation.getId());
return Future.failedFuture(new HttpException(HttpStatus.HTTP_UNPROCESSABLE_ENTITY.toInt(), MISMATCH_BETWEEN_ID_IN_PATH_AND_BODY.toError()));
}
return restClient.put(resourceByIdPath(BANKING_INFORMATION, updatedBankingInformation.getId()), updatedBankingInformation, requestContext);
}

@Override
public Future<Void> deleteBankingInformation(String id, Context context, Map<String, String> headers) {
logger.debug("deleteBankingInformation:: Trying to banking information by id: {}", id);
RequestContext requestContext = new RequestContext(context, headers);
return restClient.delete(resourceByIdPath(BANKING_INFORMATION, id), requestContext);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
import org.folio.rest.jaxrs.model.OrganizationCollection;
import org.folio.service.protection.AcquisitionsUnitsService;
import org.folio.service.protection.ProtectionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import io.vertx.core.Context;
Expand All @@ -40,10 +39,16 @@ public class OrganizationStorageService implements OrganizationService {
private static final Logger logger = LogManager.getLogger(OrganizationStorageService.class);
public static final String GET_ORGANIZATIONS_BY_QUERY = resourcesPath(ORGANIZATIONS) + SEARCH_PARAMS;

private ProtectionService protectionService;
private final ProtectionService protectionService;

private RestClient restClient;
private AcquisitionsUnitsService acquisitionsUnitsService;
private final RestClient restClient;
private final AcquisitionsUnitsService acquisitionsUnitsService;

public OrganizationStorageService(ProtectionService protectionService, RestClient restClient, AcquisitionsUnitsService acquisitionsUnitsService) {
this.protectionService = protectionService;
this.restClient = restClient;
this.acquisitionsUnitsService = acquisitionsUnitsService;
}

@Override
public Future<Organization> createOrganization(Organization organization, Context context, Map<String, String> headers) {
Expand Down Expand Up @@ -121,19 +126,4 @@ public Future<Void> deleteOrganizationById(String id, Context context, Map<Strin
RequestContext requestContext = new RequestContext(context, headers);
return restClient.delete(resourceByIdPath(ORGANIZATIONS, id), requestContext);
}

@Autowired
public void setProtectionService(ProtectionService protectionService) {
this.protectionService = protectionService;
}

@Autowired
public void setRestClient(RestClient restClient) {
this.restClient = restClient;
}

@Autowired
public void setAcquisitionsUnitsService(AcquisitionsUnitsService acquisitionsUnitsService) {
this.acquisitionsUnitsService = acquisitionsUnitsService;
}
}
2 changes: 2 additions & 0 deletions src/main/java/org/folio/util/ResourcePathResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,14 @@ public class ResourcePathResolver {
public static final String ACQUISITIONS_MEMBERSHIPS = "acquisitionsMemberships";
public static final Pattern CQL_SORT_BY_PATTERN = Pattern.compile("(.*)(\\ssortBy\\s.*)", Pattern.CASE_INSENSITIVE);
public static final String ORGANIZATIONS = "organizations";
public static final String BANKING_INFORMATION = "bankingInformation";
private static final Map<String, String> SUB_OBJECT_ITEM_APIS;
private static final Map<String, String> SUB_OBJECT_COLLECTION_APIS;

static {
Map<String, String> apis = new HashMap<>();
apis.put(ORGANIZATIONS, "/organizations-storage/organizations");
apis.put(BANKING_INFORMATION, "/organizations-storage/banking-information");
apis.put(ACQUISITIONS_UNITS, "/acquisitions-units-storage/units");
apis.put(ACQUISITIONS_MEMBERSHIPS, "/acquisitions-units-storage/memberships");

Expand Down
Loading

0 comments on commit 93f35ad

Please sign in to comment.