Commit d8eaffd0 authored by Anastasios Poimenidis's avatar Anastasios Poimenidis
Browse files

fix: introduce locking in Organization updates

parent 16b57db2
Loading
Loading
Loading
Loading
+15 −20
Original line number Diff line number Diff line
@@ -83,6 +83,18 @@ public class OrganizationService {
        }
    }

    private Organization getOrganizationByIdAndLockWrite(String id) {
        Optional<Organization> organization = organizationRepository.findByIdWithLockWrite(id);
        if (organization.isPresent()) {
            String foundMessage = String.format("Organization with id %s was found", id);
            logger.info(foundMessage);
            return organization.get();
        } else {
            String notFoundMessage = String.format("Organization with id %s not found", id);
            throw new ServiceNotFoundException(notFoundMessage);
        }
    }

    @Transactional
    public Optional<Organization> getOptionalOrganizationById(String id) {
        return organizationRepository.findById(id);
@@ -207,36 +219,19 @@ public class OrganizationService {
    @WithSpan("OrganizationService.updateOrganization")
    @Transactional
    public OrganizationResponse updateOrganization(String id, Organization newOrganization) {
        Organization oldOrganization = this.getOrganizationById(id);
        Organization oldOrganization = this.getOrganizationByIdAndLockWrite(id);
        Organization updatedOrganization =
                organizationMapper.updateOrganization(newOrganization, oldOrganization);
        organizationRepository.persist(updatedOrganization);
        return organizationMapper.organizationEntityToResponse(updatedOrganization);
    }

    @WithSpan("OrganizationService.updateOrganizationCharacteristicByName")
    @Transactional
    public void updateOrganizationCharacteristicByName(
            String name, String characteristicName, String characteristicValue) {
        Optional<Organization> optionalOrganization = organizationRepository.findByName(name);

        if (optionalOrganization.isPresent()) {
            Organization organizationRetrieved = optionalOrganization.get();
            addUpdateOrganizationCharacteristic(
                    organizationRetrieved, characteristicName, characteristicValue);
            logger.infof(
                    "Updated Organization with id %s and name %s . Characteristic with name %s changed value to %s",
                    organizationRetrieved.getId(), name, characteristicName, characteristicValue);
        } else {
            logger.errorf("No Organization with name %s was found for update", name);
        }
    }

    @WithSpan("OrganizationService.updateOrganizationCharacteristicById")
    @Transactional
    public void updateOrganizationCharacteristicById(
            String organizationId, String characteristicName, String characteristicValue) {
        Optional<Organization> optionalOrganization = organizationRepository.findById(organizationId);
        Optional<Organization> optionalOrganization =
                organizationRepository.findByIdWithLockWrite(organizationId);

        if (optionalOrganization.isPresent()) {
            Organization organizationRetrieved = optionalOrganization.get();
+0 −36
Original line number Diff line number Diff line
@@ -256,20 +256,6 @@ class OrganizationServiceTest {
        verify(organizationRepository, times(1)).delete(organization);
    }

    @Test
    void updateOrganizationCharacteristicNotExistingOrganization() {
        String organizationName = "notExistingOrganization";
        String organizationCharValue = "ACTIVE";

        when(organizationRepository.findByName(organizationName)).thenReturn(Optional.empty());

        organizationService.updateOrganizationCharacteristicByName(
                organizationName, DOMAIN_GATEWAY_STATUS, organizationCharValue);
        verify(organizationService, never())
                .addUpdateOrganizationCharacteristic(
                        any(), eq(DOMAIN_GATEWAY_STATUS), eq(organizationCharValue));
    }

    @ParameterizedTest
    @MethodSource("organizationArguments")
    void updateOrganizationCharacteristicById(Organization organization) {
@@ -298,28 +284,6 @@ class OrganizationServiceTest {
                        any(), eq(DOMAIN_GATEWAY_STATUS), eq(organizationCharValue));
    }

    @ParameterizedTest
    @MethodSource("organizationArguments")
    void updateOrganizationCharacteristic(Organization organization) {
        String organizationName = "Existing Organization";
        String organizationCharValue = "ACTIVE";

        when(organizationRepository.findByName(organizationName)).thenReturn(Optional.of(organization));

        organizationService.updateOrganizationCharacteristicByName(
                organizationName, DOMAIN_GATEWAY_STATUS, organizationCharValue);

        assertThat(organization.getPartyCharacteristic()).isNotNull().isNotEmpty();

        Optional<Characteristic> domainGatewayStatusCharacteristic =
                organization.getPartyCharacteristic().stream()
                        .filter(characteristic -> characteristic.getName().equals(DOMAIN_GATEWAY_STATUS))
                        .findFirst();
        assertThat(domainGatewayStatusCharacteristic).isNotEmpty();
        assertThat(domainGatewayStatusCharacteristic.get().getValue().getValue())
                .isEqualTo(organizationCharValue);
    }

    public static Stream<Arguments> organizationArguments() {
        Organization firstOrganization = new Organization();
        firstOrganization.setName("Existing Organization");