You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.2 KiB
99 lines
3.2 KiB
import { parseRdf } from "@ldo/ldo";
|
|
import { namedNode, quad as createQuad } from "@rdfjs/data-model";
|
|
import { DataResult } from "../requester/requestResults/DataResult";
|
|
import { TurtleFormattingError } from "../requester/requestResults/DataResult";
|
|
import type { Dataset } from "@rdfjs/types";
|
|
import { isContainerUri } from "./uriTypes";
|
|
|
|
const ldpContains = namedNode("http://www.w3.org/ns/ldp#contains");
|
|
const rdfType = namedNode("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
|
|
const ldpResource = namedNode("http://www.w3.org/ns/ldp#Resource");
|
|
const ldpContainer = namedNode("http://www.w3.org/ns/ldp#Container");
|
|
const ldpBasicContainer = namedNode("http://www.w3.org/ns/ldp#BasicContainer");
|
|
|
|
export function getParentUri(uri: string): string | undefined {
|
|
const urlObject = new URL(uri);
|
|
const pathItems = urlObject.pathname.split("/");
|
|
if (
|
|
pathItems.length < 2 ||
|
|
(pathItems.length === 2 && pathItems[1].length === 0)
|
|
) {
|
|
return undefined;
|
|
}
|
|
if (pathItems[pathItems.length - 1] === "") {
|
|
pathItems.pop();
|
|
}
|
|
pathItems.pop();
|
|
urlObject.pathname = `${pathItems.join("/")}/`;
|
|
return urlObject.toString();
|
|
}
|
|
|
|
export function getSlug(uri: string): string {
|
|
const urlObject = new URL(uri);
|
|
const pathItems = urlObject.pathname.split("/");
|
|
return pathItems[pathItems.length - 1];
|
|
}
|
|
|
|
export function deleteResourceRdfFromContainer(
|
|
resourceUri: string,
|
|
dataset: Dataset,
|
|
) {
|
|
const parentUri = getParentUri(resourceUri);
|
|
if (parentUri) {
|
|
const parentNode = namedNode(parentUri);
|
|
const resourceNode = namedNode(resourceUri);
|
|
dataset.delete(
|
|
createQuad(parentNode, ldpContains, resourceNode, parentNode),
|
|
);
|
|
dataset.deleteMatches(resourceNode, undefined, undefined, parentNode);
|
|
}
|
|
}
|
|
|
|
export function addResourceRdfToContainer(
|
|
resourceUri: string,
|
|
dataset: Dataset,
|
|
) {
|
|
const parentUri = getParentUri(resourceUri);
|
|
if (parentUri) {
|
|
const parentNode = namedNode(parentUri);
|
|
const resourceNode = namedNode(resourceUri);
|
|
dataset.add(createQuad(parentNode, ldpContains, resourceNode, parentNode));
|
|
dataset.add(createQuad(resourceNode, rdfType, ldpResource, parentNode));
|
|
if (isContainerUri(resourceUri)) {
|
|
dataset.add(
|
|
createQuad(resourceNode, rdfType, ldpBasicContainer, parentNode),
|
|
);
|
|
dataset.add(createQuad(resourceNode, rdfType, ldpContainer, parentNode));
|
|
}
|
|
addResourceRdfToContainer(parentUri, dataset);
|
|
}
|
|
}
|
|
|
|
export async function addRawTurtleToDataset(
|
|
rawTurtle: string,
|
|
dataset: Dataset,
|
|
baseUri: string,
|
|
): Promise<DataResult | TurtleFormattingError> {
|
|
let loadedDataset: Dataset;
|
|
try {
|
|
loadedDataset = await parseRdf(rawTurtle, {
|
|
baseIRI: baseUri,
|
|
});
|
|
} catch (err) {
|
|
return new TurtleFormattingError(
|
|
baseUri,
|
|
err instanceof Error ? err.message : "Failed to parse rdf",
|
|
);
|
|
}
|
|
|
|
const graphNode = namedNode(baseUri);
|
|
// Destroy all triples that were once a part of this resouce
|
|
dataset.deleteMatches(undefined, undefined, undefined, graphNode);
|
|
// Add the triples from the fetched item
|
|
dataset.addAll(
|
|
loadedDataset.map((quad) =>
|
|
createQuad(quad.subject, quad.predicate, quad.object, graphNode),
|
|
),
|
|
);
|
|
return new DataResult(baseUri);
|
|
}
|
|
|