All Downloads are FREE. Search and download functionalities are using the official Maven repository.

dev.dsf.fhir.dao.jdbc.OrganizationAffiliationDaoJdbc Maven / Gradle / Ivy

package dev.dsf.fhir.dao.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.UUID;

import javax.sql.DataSource;

import org.hl7.fhir.r4.model.OrganizationAffiliation;

import ca.uhn.fhir.context.FhirContext;
import dev.dsf.fhir.dao.OrganizationAffiliationDao;
import dev.dsf.fhir.search.filter.OrganizationAffiliationIdentityFilter;
import dev.dsf.fhir.search.parameters.OrganizationAffiliationActive;
import dev.dsf.fhir.search.parameters.OrganizationAffiliationEndpoint;
import dev.dsf.fhir.search.parameters.OrganizationAffiliationIdentifier;
import dev.dsf.fhir.search.parameters.OrganizationAffiliationParticipatingOrganization;
import dev.dsf.fhir.search.parameters.OrganizationAffiliationPrimaryOrganization;
import dev.dsf.fhir.search.parameters.OrganizationAffiliationRole;

public class OrganizationAffiliationDaoJdbc extends AbstractResourceDaoJdbc
		implements OrganizationAffiliationDao
{
	public OrganizationAffiliationDaoJdbc(DataSource dataSource, DataSource permanentDeleteDataSource,
			FhirContext fhirContext)
	{
		super(dataSource, permanentDeleteDataSource, fhirContext, OrganizationAffiliation.class,
				"organization_affiliations", "organization_affiliation", "organization_affiliation_id",
				OrganizationAffiliationIdentityFilter::new,
				List.of(factory(OrganizationAffiliationActive.PARAMETER_NAME, OrganizationAffiliationActive::new),
						factory(OrganizationAffiliationEndpoint.PARAMETER_NAME, OrganizationAffiliationEndpoint::new,
								OrganizationAffiliationEndpoint.getNameModifiers(),
								OrganizationAffiliationEndpoint::new,
								OrganizationAffiliationEndpoint.getIncludeParameterValues()),
						factory(OrganizationAffiliationIdentifier.PARAMETER_NAME,
								OrganizationAffiliationIdentifier::new,
								OrganizationAffiliationIdentifier.getNameModifiers()),
						factory(OrganizationAffiliationParticipatingOrganization.PARAMETER_NAME,
								OrganizationAffiliationParticipatingOrganization::new,
								OrganizationAffiliationParticipatingOrganization.getNameModifiers(),
								OrganizationAffiliationParticipatingOrganization::new,
								OrganizationAffiliationParticipatingOrganization.getIncludeParameterValues()),
						factory(OrganizationAffiliationPrimaryOrganization.PARAMETER_NAME,
								OrganizationAffiliationPrimaryOrganization::new,
								OrganizationAffiliationPrimaryOrganization.getNameModifiers(),
								OrganizationAffiliationPrimaryOrganization::new,
								OrganizationAffiliationPrimaryOrganization.getIncludeParameterValues()),
						factory(OrganizationAffiliationRole.PARAMETER_NAME, OrganizationAffiliationRole::new,
								OrganizationAffiliationRole.getNameModifiers())),
				List.of());
	}

	@Override
	protected OrganizationAffiliation copy(OrganizationAffiliation resource)
	{
		return resource.copy();
	}

	@Override
	public List readActiveNotDeletedByMemberOrganizationIdentifierIncludingOrganizationIdentifiersWithTransaction(
			Connection connection, String identifierValue) throws SQLException
	{
		Objects.requireNonNull(connection, "connection");
		if (identifierValue == null || identifierValue.isBlank())
			return Collections.emptyList();

		try (PreparedStatement statement = connection.prepareStatement("SELECT organization_affiliation"
				+ ",(SELECT identifiers->>'value' FROM current_organizations, jsonb_array_elements(organization->'identifier') AS identifiers "
				+ "WHERE identifiers->>'system' = 'http://dsf.dev/sid/organization-identifier' "
				+ "AND concat('Organization/', organization->>'id') = organization_affiliation->'organization'->>'reference' LIMIT 1) AS organization_identifier "
				+ "FROM current_organization_affiliations WHERE organization_affiliation->>'active' = 'true' AND "
				+ "(SELECT organization->'identifier' FROM current_organizations WHERE organization->>'active' = 'true' AND "
				+ "concat('Organization/', organization->>'id') = organization_affiliation->'participatingOrganization'->>'reference') @> ?::jsonb"))
		{
			statement.setString(1, "[{\"system\": \"http://dsf.dev/sid/organization-identifier\", \"value\": \""
					+ identifierValue + "\"}]");

			try (ResultSet result = statement.executeQuery())
			{
				List affiliations = new ArrayList<>();

				while (result.next())
				{
					OrganizationAffiliation oA = getResource(result, 1);
					String organizationIdentifier = result.getString(2);

					oA.getParticipatingOrganization().getIdentifier()
							.setSystem("http://dsf.dev/sid/organization-identifier").setValue(identifierValue);
					oA.getOrganization().getIdentifier().setSystem("http://dsf.dev/sid/organization-identifier")
							.setValue(organizationIdentifier);
					affiliations.add(oA);
				}

				return affiliations;
			}
		}
	}

	@Override
	public boolean existsNotDeletedByParentOrganizationMemberOrganizationRoleAndNotEndpointWithTransaction(
			Connection connection, UUID parentOrganization, UUID memberOrganization, String roleSystem, String roleCode,
			UUID endpoint) throws SQLException
	{
		Objects.requireNonNull(connection, "connection");
		Objects.requireNonNull(parentOrganization, "parentOrganization");
		Objects.requireNonNull(memberOrganization, "memberOrganization");
		Objects.requireNonNull(roleSystem, "roleSystem");
		Objects.requireNonNull(roleCode, "roleCode");
		Objects.requireNonNull(endpoint, "endpoint");

		try (PreparedStatement statement = connection
				.prepareStatement("SELECT count(*) FROM current_organization_affiliations "
						+ "WHERE organization_affiliation->'organization'->>'reference' = ? "
						+ "AND organization_affiliation->'participatingOrganization'->>'reference' = ? "
						+ "AND (SELECT jsonb_agg(coding) FROM jsonb_array_elements(organization_affiliation->'code') AS code, jsonb_array_elements(code->'coding') AS coding) @> ?::jsonb "
						+ "AND ? NOT IN (SELECT reference->>'reference' FROM jsonb_array_elements(organization_affiliation->'endpoint') AS reference)"))
		{
			statement.setString(1, "Organization/" + parentOrganization.toString());
			statement.setString(2, "Organization/" + memberOrganization.toString());
			statement.setString(3, "[{\"code\": \"" + roleCode + "\", \"system\": \"" + roleSystem + "\"}]");
			statement.setString(4, "Endpoint/" + endpoint.toString());

			try (ResultSet result = statement.executeQuery())
			{
				return result.next() && result.getInt(1) > 0;
			}
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy