Skip to content

Commit

Permalink
Merge branch 'master' into MODCON-61
Browse files Browse the repository at this point in the history
  • Loading branch information
bekhzodkurbonboev authored Jul 11, 2023
2 parents 2dcbd23 + c413597 commit fe82519
Show file tree
Hide file tree
Showing 9 changed files with 229 additions and 9 deletions.
19 changes: 18 additions & 1 deletion descriptors/ModuleDescriptor-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,16 @@
],
"modulePermissions": []
},
{
"methods": [
"GET"
],
"pathPattern": "/consortia/{consortiumId}/publications/{publicationId}",
"permissionsRequired": [
"consortia.publications.item.get"
],
"modulePermissions": []
},
{
"methods": [
"GET"
Expand Down Expand Up @@ -303,7 +313,9 @@
"consortia.create-primary-affiliations.item.post",
"consortia.sharing-instances.item.post",
"consortia.sharing-instances.item.get",
"consortia.sharing-instances.collection.get"
"consortia.sharing-instances.collection.get",
"consortia.publications.item.post",
"consortia.publications.item.get"
]
},
{
Expand Down Expand Up @@ -341,6 +353,11 @@
"displayName": "publish coordinator post request",
"description": "publish coordinator post request"
},
{
"permissionName": "consortia.publications.item.get",
"displayName": "publish coordinator get publication details request",
"description": "publish coordinator get publication details request"
},
{
"permissionName": "consortia.user-tenants.collection.get",
"displayName": "get user tenants",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.UUID;

import org.folio.consortia.domain.dto.PublicationDetailsResponse;
import org.folio.consortia.domain.dto.PublicationRequest;
import org.folio.consortia.domain.dto.PublicationResponse;
import org.folio.consortia.service.PublicationService;
Expand All @@ -22,4 +23,9 @@ public class PublicationController implements org.folio.consortia.rest.resource.
public ResponseEntity<PublicationResponse> publishRequests(UUID consortiumId, PublicationRequest publicationRequest) {
return ResponseEntity.ok(publishCoordinatorService.publishRequest(consortiumId, publicationRequest));
}

@Override
public ResponseEntity<PublicationDetailsResponse> getPublicationDetails(UUID consortiumId, UUID publicationId){
return ResponseEntity.ok(publishCoordinatorService.getPublicationDetails(consortiumId, publicationId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,14 @@
import java.util.UUID;

import org.folio.consortia.domain.entity.PublicationTenantRequestEntity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PublicationTenantRequestRepository extends JpaRepository<PublicationTenantRequestEntity, UUID> {

Page<PublicationTenantRequestEntity> findByPcStateId(UUID publicationId, Pageable pageable);

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import java.util.UUID;

import org.folio.consortia.domain.dto.PublicationDetailsResponse;
import org.folio.consortia.domain.dto.PublicationRequest;
import org.folio.consortia.domain.dto.PublicationResponse;

public interface PublicationService {
PublicationResponse publishRequest(UUID consortiumId, PublicationRequest publication);

PublicationDetailsResponse getPublicationDetails(UUID consortiumId, UUID publicationId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,18 @@

import org.apache.commons.collections4.CollectionUtils;
import org.apache.http.HttpException;
import org.folio.consortia.domain.dto.PublicationDetailsResponse;
import org.folio.consortia.domain.dto.PublicationRequest;
import org.folio.consortia.domain.dto.PublicationResponse;
import org.folio.consortia.domain.dto.PublicationStatus;
import org.folio.consortia.domain.dto.PublicationStatusError;
import org.folio.consortia.domain.entity.PublicationStatusEntity;
import org.folio.consortia.domain.entity.PublicationTenantRequestEntity;
import org.folio.consortia.exception.PublicationException;
import org.folio.consortia.exception.ResourceNotFoundException;
import org.folio.consortia.repository.PublicationStatusRepository;
import org.folio.consortia.repository.PublicationTenantRequestRepository;
import org.folio.consortia.service.ConsortiumService;
import org.folio.consortia.service.HttpRequestService;
import org.folio.consortia.service.PublicationService;
import org.folio.consortia.service.TenantService;
Expand All @@ -29,6 +33,8 @@
import org.folio.spring.FolioModuleMetadata;
import org.folio.spring.scope.FolioExecutionContextSetter;
import org.springframework.core.task.TaskExecutor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand Down Expand Up @@ -56,6 +62,7 @@ public class PublicationServiceImpl implements PublicationService {
private final PublicationStatusRepository publicationStatusRepository;
private final PublicationTenantRequestRepository publicationTenantRequestRepository;
private final ObjectMapper objectMapper;
private final ConsortiumService consortiumService;
private static final int MAX_ACTIVE_THREADS = 5;

@Override
Expand All @@ -69,6 +76,50 @@ public PublicationResponse publishRequest(UUID consortiumId, PublicationRequest

return buildPublicationResponse(createdPublicationEntity.getId());
}

@Override
public PublicationDetailsResponse getPublicationDetails(UUID consortiumId, UUID publicationId) {
log.debug("getPublicationDetails:: Trying to retrieve publicationDetails by consortiumId: {} and publicationId id: {}", consortiumId, publicationId);

consortiumService.checkConsortiumExistsOrThrow(consortiumId);
var publicationStatusEntity = publicationStatusRepository.findById(publicationId)
.orElseThrow(() -> new ResourceNotFoundException("publicationId", String.valueOf(publicationId)));

var ptrEntities = publicationTenantRequestRepository.findByPcStateId(publicationId, PageRequest.of(0, Integer.MAX_VALUE));
log.info("getPublicationDetails:: Found {} of {} expected tenant request records", ptrEntities.getTotalElements(), publicationStatusEntity.getTotalRecords());

var errorList = buildErrorListFromPublicationTenantRequestEntities(ptrEntities);
var tenantRequestPayload = getPayloadFromPublicationTenantRequestEntities(ptrEntities);

var pdr = new PublicationDetailsResponse()
.id(publicationStatusEntity.getId())
.status(publicationStatusEntity.getStatus())
.dateTime(publicationStatusEntity.getCreatedDate().toString())
.request(tenantRequestPayload)
.errors(errorList);
log.info("getPublicationDetails:: Prepared publication details response {}", pdr);
return pdr;
}

private String getPayloadFromPublicationTenantRequestEntities(Page<PublicationTenantRequestEntity> publicationTenantRequestEntity) {
return publicationTenantRequestEntity.getContent()
.stream()
.map(PublicationTenantRequestEntity::getRequestPayload)
.findFirst()
.orElse(null);
}

private List<PublicationStatusError> buildErrorListFromPublicationTenantRequestEntities(Page<PublicationTenantRequestEntity> publicationTenantRequestEntity) {
return publicationTenantRequestEntity.getContent()
.stream()
.filter(ptrEntity -> ptrEntity.getStatus() == PublicationStatus.ERROR)
.map(ptrEntity -> new PublicationStatusError()
.errorMessage(ptrEntity.getResponse())
.errorCode(ptrEntity.getResponseStatusCode())
.tenantId(ptrEntity.getTenantId()))
.toList();
}

void processTenantRequests(PublicationRequest publicationRequest, PublicationStatusEntity createdPublicationEntity) {
List<CompletableFuture<PublicationTenantRequestEntity>> futures = new ArrayList<>();
Semaphore semaphore = new Semaphore(MAX_ACTIVE_THREADS);
Expand Down Expand Up @@ -210,7 +261,7 @@ private void validatePublicationRequest(UUID consortiumId, PublicationRequest pu

private PublicationResponse buildPublicationResponse(UUID publicationId) {
return new PublicationResponse()
.id(publicationId.toString())
.id(publicationId)
.status(PublicationStatus.IN_PROGRESS);
}

Expand Down
28 changes: 27 additions & 1 deletion src/main/resources/swagger.api/publications.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,20 @@ paths:
$ref: '#/components/responses/InternalServerError'
requestBody:
$ref: '#/components/requestBodies/Publication'

/publications/{publicationId}:
get:
summary: Get publication details
operationId: getPublicationDetails
parameters:
- $ref: "#/components/parameters/consortiumId"
- $ref: "#/components/parameters/publicationId"
responses:
'200':
$ref: '#/components/responses/PublicationDetails'
'400':
$ref: '#/components/responses/BadRequest'
'500':
$ref: '#/components/responses/InternalServerError'
components:
requestBodies:
Publication:
Expand All @@ -42,6 +55,12 @@ components:
application/json:
schema:
$ref: "schemas/publication_schema.yaml#/PublicationResponse"
PublicationDetails:
description: Returns a publish coordinator object
content:
application/json:
schema:
$ref: "schemas/publication_schema.yaml#/PublicationDetailsResponse"
Conflict:
description: Validation errors
content:
Expand Down Expand Up @@ -85,3 +104,10 @@ components:
$ref: "schemas/common.yaml#/uuid"
required: true
description: The ID of consortium
publicationId:
in: path
name: publicationId
schema:
$ref: "schemas/common.yaml#/uuid"
required: true
description: The ID of the publication
39 changes: 38 additions & 1 deletion src/main/resources/swagger.api/schemas/publication_schema.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,50 @@ PublicationResponse:
properties:
id:
description: id of publication record
type: string
$ref: "common.yaml#/uuid"
status:
type: string
$ref: "publication_schema.yaml#/PublicationStatus"
additionalProperties: false


PublicationDetailsResponse:
type: object
title: Publication details response
properties:
id:
description: id of publication record
$ref: "common.yaml#/uuid"
status:
type: string
$ref: "publication_schema.yaml#/PublicationStatus"
dateTime:
description: the date of publication was created
type: string
request:
description: tenant request payload
type: string
errors:
description: "List of errors"
type: array
items:
type: object
$ref: "publication_schema.yaml#/PublicationStatusError"
additionalProperties: false

PublicationStatus:
description: publication status
enum: [ "IN_PROGRESS", "ERROR", "COMPLETE" ]

PublicationStatusError:
description: publication status error
properties:
tenantId:
description: tenant name which failed to execute request
type: string
errorMessage:
description: error message of failed request
type: string
errorCode:
description: error code of failed request
type: integer
Loading

0 comments on commit fe82519

Please sign in to comment.