Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MODCON - 65] - Implement endpoint to save shared setting uuid in all tenants #69

Merged
merged 14 commits into from
Jul 24, 2023
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion descriptors/ModuleDescriptor-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,16 @@
"consortia.sharing-instances.collection.get"
],
"modulePermissions": []
},
{
"methods": [
"POST"
],
"pathPattern": "/consortia/{consortiumId}/sharing/settings",
"permissionsRequired": [
"consortia.sharing-settings.item.post"
],
"modulePermissions": []
}
]
},
Expand Down Expand Up @@ -337,7 +347,8 @@
"consortia.publications.item.post",
"consortia.publications.item.get",
"consortia.publications.item.delete",
"consortia.publications-results.item.get"
"consortia.publications-results.item.get",
"consortia.sharing-settings.item.post"
]
},
{
Expand Down Expand Up @@ -439,6 +450,11 @@
"permissionName": "consortia.sharing-instances.collection.get",
"displayName": "get sharing instances",
"description": "Get List of sharing instances"
},
{
"permissionName": "consortia.sharing-settings.item.post",
"displayName": "post sharing setting",
"description": "create sharing setting"
}
],
"launchDescriptor": {
Expand Down
31 changes: 29 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@
<user_events.yaml.file>${project.basedir}/src/main/resources/swagger.api/kafka_message_schemas.yaml</user_events.yaml.file>
<consortia_configuration.yaml.file>${project.basedir}/src/main/resources/swagger.api/consortia_configuration.yaml</consortia_configuration.yaml.file>
<publish_coordinator.yaml.file>${project.basedir}/src/main/resources/swagger.api/publications.yaml</publish_coordinator.yaml.file>
<sharing_instances.yaml.file>${project.basedir}/src/main/resources/swagger.api/sharing_instance.yaml</sharing_instances.yaml.file>
<sharing_instances.yaml.file>${project.basedir}/src/main/resources/swagger.api/sharing_instances.yaml</sharing_instances.yaml.file>
<sharing_settings.yaml.file>${project.basedir}/src/main/resources/swagger.api/sharing_settings.yaml</sharing_settings.yaml.file>
<!-- runtime dependencies -->
<folio-spring-base.version>7.1.2</folio-spring-base.version>
<openapi-generator.version>6.2.1</openapi-generator.version>
Expand Down Expand Up @@ -449,7 +450,7 @@
</configuration>
</execution>
<execution>
<id>sharing instance</id>
<id>sharing instances</id>
<goals>
<goal>generate</goal>
</goals>
Expand All @@ -474,6 +475,32 @@
</configOptions>
</configuration>
</execution>
<execution>
<id>sharing settings</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${sharing_settings.yaml.file}</inputSpec>
<output>${project.build.directory}/generated-sources</output>
<generatorName>spring</generatorName>
<modelPackage>${project.groupId}.consortia.domain.dto</modelPackage>
<apiPackage>${project.groupId}.consortia.rest.resource</apiPackage>
<generateApis>true</generateApis>
<generateApiTests>true</generateApiTests>
<generateApiDocumentation>true</generateApiDocumentation>
<generateModels>true</generateModels>
<generateModelTests>false</generateModelTests>
<generateSupportingFiles>true</generateSupportingFiles>
<supportingFilesToGenerate>ApiUtil.java</supportingFilesToGenerate>
<generateModelDocumentation>true</generateModelDocumentation>
<configOptions>
<dateLibrary>java</dateLibrary>
<interfaceOnly>true</interfaceOnly>
<useSpringBoot3>true</useSpringBoot3>
</configOptions>
</configuration>
</execution>
<execution>
<id>publish_coordinator</id>
<goals>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import org.folio.consortia.domain.dto.SharingInstance;
import org.folio.consortia.domain.dto.SharingInstanceCollection;
import org.folio.consortia.domain.dto.Status;
import org.folio.consortia.rest.resource.SharingApi;
import org.folio.consortia.rest.resource.InstancesApi;
import org.folio.consortia.service.SharingInstanceService;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
Expand All @@ -18,15 +18,15 @@
import lombok.extern.log4j.Log4j2;

@RestController
@RequestMapping("/consortia/{consortiumId}")
@RequestMapping("/consortia/{consortiumId}/sharing")
@Log4j2
@RequiredArgsConstructor
public class SharingInstanceController implements SharingApi {
public class SharingInstanceController implements InstancesApi {

private final SharingInstanceService sharingInstanceService;

@Override
public ResponseEntity<SharingInstance> start(UUID consortiumId, @Validated SharingInstance sharingInstance) {
public ResponseEntity<SharingInstance> startSharingInstance(UUID consortiumId, @Validated SharingInstance sharingInstance) {
return ResponseEntity.status(CREATED).body(sharingInstanceService.start(consortiumId, sharingInstance));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.folio.consortia.controller;

import static org.springframework.http.HttpStatus.CREATED;

import java.util.UUID;

import org.folio.consortia.domain.dto.SharingSettingRequest;
import org.folio.consortia.domain.dto.SharingSettingResponse;
import org.folio.consortia.rest.resource.SettingsApi;
import org.folio.consortia.service.SharingSettingService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;

@RestController
@RequestMapping("/consortia/{consortiumId}/sharing")
@Log4j2
@RequiredArgsConstructor
public class SharingSettingController implements SettingsApi{
SerhiiNosko marked this conversation as resolved.
Show resolved Hide resolved

private final SharingSettingService sharingSettingService;

@Override
public ResponseEntity<SharingSettingResponse> startSharingSetting(UUID consortiumId, SharingSettingRequest sharingSettingRequest) {
return ResponseEntity.status(CREATED).body(sharingSettingService.start(consortiumId, sharingSettingRequest));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package org.folio.consortia.domain.entity;

import java.util.Objects;
import java.util.UUID;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@RequiredArgsConstructor
@Entity
@Table(name = "sharing_setting")
public class SharingSettingEntity {
SerhiiNosko marked this conversation as resolved.
Show resolved Hide resolved
@Id
private UUID id;
private UUID settingId;
private String tenantId;

@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof SharingSettingEntity that))
return false;
return Objects.equals(id, that.id)
&& Objects.equals(settingId, that.settingId)
&& Objects.equals(tenantId, that.tenantId);
}

@Override
public int hashCode() {
return Objects.hash(id, settingId, tenantId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.folio.consortia.repository;

import java.util.Set;
import java.util.UUID;

import org.folio.consortia.domain.entity.SharingSettingEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

@Repository
public interface SharingSettingRepository extends JpaRepository<SharingSettingEntity, UUID>{
@Query("SELECT st.tenantId FROM SharingSettingEntity st WHERE st.settingId = ?1")
Set<String> findTenantsBySettingId(UUID settingId);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.folio.consortia.repository;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

Expand All @@ -14,6 +15,7 @@
public interface TenantRepository extends JpaRepository<TenantEntity, String> {

Page<TenantEntity> findByConsortiumId(UUID consortiumId, Pageable pageable);
List<TenantEntity> findByConsortiumId(UUID consortiumId);

@Query("SELECT t FROM TenantEntity t where t.isCentral = true")
Optional<TenantEntity> findCentralTenant();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.folio.consortia.service;

import java.util.UUID;

import org.folio.consortia.domain.dto.SharingSettingRequest;
import org.folio.consortia.domain.dto.SharingSettingResponse;

public interface SharingSettingService {

/**
* Start sharing setting
* @param consortiumId UUID of consortium entity
* @param sharingSettingRequest the sharingSettingDTO (data transfer object)
* @return SharingInstanceDto
*/
SharingSettingResponse start(UUID consortiumId, SharingSettingRequest sharingSettingRequest);

}
7 changes: 7 additions & 0 deletions src/main/java/org/folio/consortia/service/TenantService.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ public interface TenantService {
*/
TenantCollection get(UUID consortiumId, Integer offset, Integer limit);

/**
* Gets all tenant collection based on consortiumId.
*
* @return tenant collection
*/
TenantCollection getAll(UUID consortiumId);

/**
* Inserts single tenant based on consortiumId.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.folio.consortia.service.impl;

import static org.folio.consortia.repository.SharingInstanceRepository.Specifications.constructSpecification;
import static org.folio.consortia.utils.HelperUtils.setSourceAsConsortium;
import static org.folio.consortia.utils.TenantContextUtils.prepareContextForTenant;

import java.util.Objects;
Expand All @@ -25,7 +26,6 @@
import org.springframework.stereotype.Service;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
Expand All @@ -35,9 +35,6 @@
@Log4j2
@RequiredArgsConstructor
public class SharingInstanceServiceImpl implements SharingInstanceService {
private static final String FOLIO_SOURCE_VALUE = "folio";
private static final String CONSORTIUM_FOLIO = "CONSORTIUM-FOLIO";
private static final String CONSORTIUM_MARK = "CONSORTIUM-MARC";
private static final String GET_INSTANCE_EXCEPTION_MSG = "Failed to get inventory instance with reason: %s";
private static final String POST_INSTANCE_EXCEPTION_MSG = "Failed to post inventory instance with reason: %s";

Expand Down Expand Up @@ -80,8 +77,7 @@ public SharingInstance start(UUID consortiumId, SharingInstance sharingInstance)
}

try (var context = new FolioExecutionContextSetter(prepareContextForTenant(targetTenantId, folioModuleMetadata, folioExecutionContext))) {
String source = FOLIO_SOURCE_VALUE.equalsIgnoreCase(inventoryInstance.get("source").asText()) ? CONSORTIUM_FOLIO : CONSORTIUM_MARK;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure if it still stands but it should be CONSORTIUM_MARC not CONSORTIUM_MARK.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

var updatedInventoryInstance = ((ObjectNode) inventoryInstance).put("source", source);
var updatedInventoryInstance = setSourceAsConsortium(inventoryInstance);
inventoryService.saveInstance(updatedInventoryInstance);
} catch (Exception ex) {
log.error("start:: error when posting instance with id: {}", sharingInstance.getInstanceIdentifier(), ex);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package org.folio.consortia.service.impl;

import static org.folio.consortia.utils.HelperUtils.setSourceAsConsortium;

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

import org.folio.consortia.config.FolioExecutionContextHelper;
import org.folio.consortia.domain.dto.PublicationRequest;
import org.folio.consortia.domain.dto.SharingSettingRequest;
import org.folio.consortia.domain.dto.SharingSettingResponse;
import org.folio.consortia.domain.dto.Tenant;
import org.folio.consortia.domain.dto.TenantCollection;
import org.folio.consortia.repository.SharingSettingRepository;
import org.folio.consortia.service.ConsortiumService;
import org.folio.consortia.service.PublicationService;
import org.folio.consortia.service.SharingSettingService;
import org.folio.consortia.service.TenantService;
import org.folio.spring.FolioExecutionContext;
import org.folio.spring.scope.FolioExecutionContextSetter;
import org.springframework.stereotype.Service;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;

@Service
@Log4j2
@RequiredArgsConstructor
public class SharingSettingServiceImpl implements SharingSettingService {

private final SharingSettingRepository sharingSettingRepository;
private final TenantService tenantService;
private final ConsortiumService consortiumService;
private final FolioExecutionContextHelper contextHelper;
private final PublicationService publicationService;
private final FolioExecutionContext folioExecutionContext;

@Override
public SharingSettingResponse start(UUID consortiumId, SharingSettingRequest sharingSettingRequest) {
log.debug("start:: Trying to share setting with consortiumId: {}, sharing settingId: {}", consortiumId, sharingSettingRequest.getSettingId());
consortiumService.checkConsortiumExistsOrThrow(consortiumId);
Set<String> tenantsAssociationWithSetting = sharingSettingRepository.findTenantsBySettingId(sharingSettingRequest.getSettingId());
TenantCollection tenantCollection = tenantService.getAll(consortiumId);
SerhiiNosko marked this conversation as resolved.
Show resolved Hide resolved

PublicationRequest publicationRequestPostMethod = createPublicationRequestForSetting(sharingSettingRequest, "POST");
PublicationRequest publicationRequestPutMethod = createPublicationRequestForSetting(sharingSettingRequest, "PUT");
SerhiiNosko marked this conversation as resolved.
Show resolved Hide resolved

// By traverse through all tenants in db,
// we add tenant to put method publication tenant list, if it exists in setting tenant associations
// otherwise, we add it to post method publication tenant list
for (Tenant tenant : tenantCollection.getTenants()) {
if (tenantsAssociationWithSetting.contains(tenant.getId())) {
publicationRequestPutMethod.getTenants().add(tenant.getId());
} else {
publicationRequestPostMethod.getTenants().add(tenant.getId());
}
}
log.info("start:: tenants with size: {} successfully added to appropriate publication request", tenantCollection.getTotalRecords());
SerhiiNosko marked this conversation as resolved.
Show resolved Hide resolved

ObjectMapper objectMapper = new ObjectMapper();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should be a class field

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved to class field

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This field exists in application context, so can be injected

JsonNode payload = objectMapper.convertValue(sharingSettingRequest.getPayload(), JsonNode.class);
var updatedPayload = setSourceAsConsortium(payload);
publicationRequestPostMethod.setPayload(updatedPayload);
publicationRequestPutMethod.setPayload(updatedPayload);
log.info("start:: set source as a consortium");
SerhiiNosko marked this conversation as resolved.
Show resolved Hide resolved

// we create PC request with POST and PUT Http method to create settings as a consortia-system-user
try (var ignored = new FolioExecutionContextSetter(contextHelper.getSystemUserFolioExecutionContext(folioExecutionContext.getTenantId()))) {
UUID createSettingsPcId = publishRequest(consortiumId, publicationRequestPostMethod);
UUID updateSettingsPcId = publishRequest(consortiumId, publicationRequestPutMethod);
return new SharingSettingResponse().createSettingsPCId(createSettingsPcId).updateSettingsPCId(updateSettingsPcId);
}
}

private PublicationRequest createPublicationRequestForSetting(SharingSettingRequest sharingSettingRequest, String httpMethod) {
PublicationRequest publicationRequest = new PublicationRequest();
publicationRequest.setMethod(httpMethod);
publicationRequest.setUrl(sharingSettingRequest.getUrl());
publicationRequest.setPayload(sharingSettingRequest.getPayload());
publicationRequest.setTenants(new HashSet<>());
return publicationRequest;
}

private UUID publishRequest(UUID consortiumId, PublicationRequest publicationRequest) {
if (!publicationRequest.getTenants().isEmpty()) {
SerhiiNosko marked this conversation as resolved.
Show resolved Hide resolved
return publicationService.publishRequest(consortiumId, publicationRequest).getId();
}
log.info("publishRequest:: Tenant list of publishing for http method: {} is empty", publicationRequest.getMethod());
return null;
}
}
Loading