Skip to content

Commit

Permalink
Merge branch 'master' into tmp-release-1.4.2
Browse files Browse the repository at this point in the history
  • Loading branch information
OleksiiKuzminov authored Aug 19, 2024
2 parents dde9bc9 + 6381cb8 commit ba78c2d
Show file tree
Hide file tree
Showing 25 changed files with 1,279 additions and 34 deletions.
50 changes: 48 additions & 2 deletions descriptors/ModuleDescriptor-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@
{
"id": "inventory",
"version": "13.0"
},
{
"id": "roles",
"version": "1.1"
},
{
"id": "policies",
"version": "1.1"
}
],
"optional": [
Expand Down Expand Up @@ -360,6 +368,26 @@
"consortia.sharing-policies.item.delete"
],
"modulePermissions": []
},
{
"methods": [
"POST"
],
"pathPattern": "/consortia/{consortiumId}/sharing/roles",
"permissionsRequired": [
"consortia.sharing-roles.item.post"
],
"modulePermissions": []
},
{
"methods": [
"DELETE"
],
"pathPattern": "/consortia/{consortiumId}/sharing/roles/{rolesId}",
"permissionsRequired": [
"consortia.sharing-roles.item.delete"
],
"modulePermissions": []
}
]
},
Expand Down Expand Up @@ -433,7 +461,9 @@
"consortia.sharing-settings.item.post",
"consortia.sharing-settings.item.delete",
"consortia.sharing-policies.item.post",
"consortia.sharing-policies.item.delete"
"consortia.sharing-policies.item.delete",
"consortia.sharing-roles.item.post",
"consortia.sharing-roles.item.delete"
]
},
{
Expand Down Expand Up @@ -572,6 +602,16 @@
"permissionName": "consortia.sharing-policies.item.delete",
"displayName": "delete sharing policy",
"description": "Delete sharing policy"
},
{
"permissionName": "consortia.sharing-roles.item.post",
"displayName": "post sharing role",
"description": "Create sharing roles"
},
{
"permissionName": "consortia.sharing-roles.item.delete",
"displayName": "delete sharing role",
"description": "Delete sharing role"
}
],
"metadata": {
Expand Down Expand Up @@ -667,7 +707,13 @@
"user-settings.custom-fields.item.post",
"user-settings.custom-fields.collection.get",
"ui-users.editperms",
"capabilities.collection.get"
"capabilities.collection.get",
"roles.item.post",
"roles.item.put",
"roles.item.delete",
"policies.item.post",
"policies.item.put",
"policies.item.delete"
]
}
},
Expand Down
28 changes: 28 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@
<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>
<sharing_policies.yaml.file>${project.basedir}/src/main/resources/swagger.api/sharing_policies.yaml</sharing_policies.yaml.file>
<sharing_roles.yaml.file>${project.basedir}/src/main/resources/swagger.api/sharing_roles.yaml</sharing_roles.yaml.file>


<!-- runtime dependencies -->
<folio-spring-base.version>8.1.2</folio-spring-base.version>
Expand Down Expand Up @@ -559,6 +561,32 @@
</configOptions>
</configuration>
</execution>
<execution>
<id>sharing roles</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${sharing_roles.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
@@ -0,0 +1,39 @@
package org.folio.consortia.controller;

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

import java.util.UUID;

import lombok.RequiredArgsConstructor;
import org.folio.consortia.domain.dto.SharingRoleDeleteResponse;
import org.folio.consortia.domain.dto.SharingRoleRequest;
import org.folio.consortia.domain.dto.SharingRoleResponse;
import org.folio.consortia.rest.resource.RolesApi;
import org.folio.consortia.service.impl.SharingRoleService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/consortia/{consortiumId}/sharing")
@RequiredArgsConstructor
public class SharingRoleController implements RolesApi {

private final SharingRoleService sharingRoleService;

@Override
public ResponseEntity<SharingRoleResponse> startSharingRole(UUID consortiumId, SharingRoleRequest sharingRoleRequest) {
return ResponseEntity
.status(CREATED)
.body(sharingRoleService.start(consortiumId, sharingRoleRequest));
}

@Override
public ResponseEntity<SharingRoleDeleteResponse> deleteSharingRole(UUID consortiumId, UUID roleId,
SharingRoleRequest sharingRoleRequest) {
return ResponseEntity
.status(OK)
.body(sharingRoleService.delete(consortiumId, roleId, sharingRoleRequest));
}
}
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;
import org.folio.consortia.domain.entity.base.AuditableEntity;

@Getter
@Setter
@ToString
@RequiredArgsConstructor
@Entity
@Table(name = "sharing_role")
public class SharingRoleEntity extends AuditableEntity {
@Id
private UUID id;
private UUID roleId;
private String tenantId;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SharingRoleEntity that = (SharingRoleEntity) o;
return Objects.equals(id, that.id)
&& Objects.equals(roleId, that.roleId)
&& Objects.equals(tenantId, that.tenantId);
}

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

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

import org.folio.consortia.domain.entity.SharingRoleEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

public interface SharingRoleRepository extends JpaRepository<SharingRoleEntity, UUID> {

@Query("SELECT sr.tenantId FROM SharingRoleEntity sr WHERE sr.roleId = ?1")
Set<String> findTenantsByRoleId(UUID roleId);

boolean existsByRoleId(UUID roleId);

@Modifying
@Query("DELETE FROM SharingRoleEntity sr WHERE sr.roleId = ?1")
void deleteByRoleId(UUID roleId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.TextNode;

import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
Expand Down Expand Up @@ -40,7 +39,6 @@
@Log4j2
@RequiredArgsConstructor
public abstract class BaseSharingService<TRequest, TResponse, TDeleteResponse, TEntity> {
private static final String SOURCE = "source";

@Value("${folio.sharing.config.interval:200}")
private int interval;
Expand All @@ -52,7 +50,7 @@ public abstract class BaseSharingService<TRequest, TResponse, TDeleteResponse, T
private final SystemUserScopedExecutionService systemUserScopedExecutionService;
private final PublicationService publicationService;
private final FolioExecutionContext folioExecutionContext;
private final ObjectMapper objectMapper;
protected final ObjectMapper objectMapper;
private final TaskExecutor asyncTaskExecutor;

@Transactional
Expand Down Expand Up @@ -81,7 +79,7 @@ public TResponse start(UUID consortiumId, TRequest sharingConfigRequest) {
publicationPostRequest.setPayload(updatedPayload);
publicationPutRequest.setPayload(updatedPayload);
log.info("start:: set source as '{}' in payload of {}: {}",
updatedPayload.get(SOURCE), configName, configId);
updatedPayload.get(SourceValues.CONSORTIUM.getValue()), configName, configId);

// create PC request with POST and PUT Http method to create configs, using 'consortia-system-user'
return systemUserScopedExecutionService.executeSystemUserScoped(folioExecutionContext.getTenantId(), () -> {
Expand Down Expand Up @@ -130,11 +128,6 @@ private String getClassName(TRequest sharingConfigRequest) {
return sharingConfigRequest.getClass().getName();
}

private ObjectNode updatePayload(TRequest sharingConfigRequest, String sourceValue) {
JsonNode payload = objectMapper.convertValue(getPayload(sharingConfigRequest), JsonNode.class);
return ((ObjectNode) payload).set(SOURCE, new TextNode(sourceValue));
}

private void checkEqualsOfPayloadIdWithConfigId(TRequest sharingConfigRequest) {
String sharingConfigId = String.valueOf(getConfigId(sharingConfigRequest));
JsonNode payloadNode = objectMapper.convertValue(getPayload(sharingConfigRequest), JsonNode.class);
Expand Down Expand Up @@ -300,5 +293,6 @@ private void updateFailedConfigsToLocalSource(UUID consortiumId, TRequest sharin
protected abstract TEntity createSharingConfigEntityFromRequest(TRequest sharingConfigRequest, String tenantId);
protected abstract TResponse createSharingConfigResponse(UUID createConfigsPcId, UUID updateConfigsPcId);
protected abstract TDeleteResponse createSharingConfigResponse(UUID publishRequestId);
protected abstract ObjectNode updatePayload(TRequest sharingConfigRequest, String sourceValue);

}
40 changes: 36 additions & 4 deletions src/main/java/org/folio/consortia/service/FolioTenantService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package org.folio.consortia.service;

import java.sql.ResultSet;
import java.util.Map;
import liquibase.exception.LiquibaseException;
import liquibase.exception.UnexpectedLiquibaseException;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.ObjectUtils;
Expand All @@ -9,6 +12,7 @@
import org.folio.consortia.domain.dto.CustomField;
import org.folio.consortia.domain.dto.CustomFieldType;
import org.folio.spring.FolioExecutionContext;
import org.folio.spring.exception.TenantUpgradeException;
import org.folio.spring.liquibase.FolioSpringLiquibase;
import org.folio.spring.service.PrepareSystemUserService;
import org.folio.spring.service.SystemUserScopedExecutionService;
Expand All @@ -26,7 +30,8 @@
@Primary
public class FolioTenantService extends TenantService {

private static final String EXIST_SQL = "SELECT EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?)";
private static final String EXIST_SQL =
"SELECT EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?)";

private final KafkaService kafkaService;
private final CustomFieldService customFieldService;
Expand All @@ -36,6 +41,7 @@ public class FolioTenantService extends TenantService {
private final CustomFieldsRetryProperties customFieldsRetryProperties;

private static final String ORIGINAL_TENANT_ID_NAME = "originalTenantId";
private static final String TENANT_NAME_PARAMETER = "tenantname";
private static final CustomField ORIGINAL_TENANT_ID_CUSTOM_FIELD = CustomField.builder()
.name(ORIGINAL_TENANT_ID_NAME)
.entityType("user")
Expand All @@ -62,6 +68,31 @@ public FolioTenantService(JdbcTemplate jdbcTemplate,
this.customFieldsRetryProperties = customFieldsRetryProperties;
}

/*
* Because of the liquibase.Scope implementation for the SpringLiquibase it is not possible to run several
* SpringLiquibase executions simultaneously. That is why this method must be synchronized.
*/
@Override
public synchronized void createOrUpdateTenant(TenantAttributes tenantAttributes) {
if (folioSpringLiquibase != null) {
var params = Map.of(TENANT_NAME_PARAMETER, folioExecutionContext.getTenantId());
folioSpringLiquibase.setChangeLogParameters(params);
log.info("Set ChangeLog parameters: {}", params);

folioSpringLiquibase.setDefaultSchema(getSchemaName());
log.info("About to start liquibase update for tenant [{}]", context.getTenantId());

try {
folioSpringLiquibase.performLiquibaseUpdate();
} catch (LiquibaseException | UnexpectedLiquibaseException e) {
throw new TenantUpgradeException(e);
}
log.info("Liquibase update for tenant [{}] executed successfully", context.getTenantId());
}

afterTenantUpdate(tenantAttributes);
}

@Override
protected void afterTenantUpdate(TenantAttributes tenantAttributes) {
try {
Expand All @@ -75,8 +106,8 @@ protected void afterTenantUpdate(TenantAttributes tenantAttributes) {
}

/**
* Implemented by HSQLDB way
* Check if the tenant exists (by way of its database schema)
* Implemented by HSQLDB way. Check if the tenant exists (by way of its database schema)
*
* @return if the tenant's database schema exists
*/
@Override
Expand All @@ -92,7 +123,8 @@ protected boolean tenantExists() {
private void createOriginalTenantIdCustomField() {
systemUserScopedExecutionService.executeAsyncSystemUserScoped(folioExecutionContext.getTenantId(), () -> {
if (ObjectUtils.isNotEmpty(customFieldService.getCustomFieldByName(ORIGINAL_TENANT_ID_NAME))) {
log.info("createOriginalTenantIdCustomField:: custom-field already available in tenant {} with name {}", folioExecutionContext.getTenantId(), ORIGINAL_TENANT_ID_NAME);
log.info("createOriginalTenantIdCustomField:: custom-field already available in tenant {} with name {}",
folioExecutionContext.getTenantId(), ORIGINAL_TENANT_ID_NAME);
} else {
createCustomFieldsWithRetry();
}
Expand Down
Loading

0 comments on commit ba78c2d

Please sign in to comment.