/**
* @file LinkedArtHelpers
* @author Adam Brin, Pamela Lam, Nabil Kashyap
* @module ObjectHelpers
* @category Files
* @description This file contains convenience helpers for working with LinkedArt objects
*/
import {
getFieldPartSubfield,
getFieldValuesByClassifications,
getClassifiedAs,
getClassified,
getValueOrContent,
getClassifiedAsWithClassification
} from "./LinkedArtHelpers";
import { normalizeFieldToArray } from "./BasicHelpers";
import aat from "../data/aat.json";
import {
CARRIED_OUT_BY,
IDENTIFIED_BY,
PRODUCED_BY,
REFERRED_TO_BY,
TIMESPAN,
REPRESENTATION,
SUBJECT_TO,
CLASSIFIED_AS,
OR
} from "../data/constants.json";
/**
* @description Gets descriptive statement(s) about the physical extent of an object if available.
* @param {Object} submittedResource - JSON-LD object
* @param {Object} options - additional options
* @param {String|Array} options.requestedClassifications - AAT dimensions description (default: {@link http://vocab.getty.edu/aat/300435430 | aat.DIMENSIONS_DESCRIPTION})
* @param {String} options.language - limits the results to just a specific language (or leave undefined for all results)
* @param {Object} options.languageOptions - any additional options when working with language(s) @see LanguageHelpers.doesObjectLanguageMatch
*
* @example getDimensionsDescriptions(object) // gets dimensions descriptions using defaults
* @example getDimensionsDescriptions(object, {language:'cy'}) // gets dimensions descriptions in Welsh
* @example getDimensionsDescriptions(object, {requestedClassifications: 'http://vocab.getty.edu/aat/300266036'}) // gets dimensions descriptions using a different AAT term
*
* @returns {Array} content of AAT dimensions descriptions
*/
export function getDimensionsDescriptions(
submittedResource,
{
requestedClassifications = aat.DIMENSIONS_DESCRIPTION,
language,
languageOptions = {}
} = {}
) {
return getFieldValuesByClassifications(
submittedResource,
REFERRED_TO_BY,
requestedClassifications,
{ language, languageOptions }
);
}
/**
* @description Gets accession number(s) associated with an object if available.
* @param {Object} submittedResource - JSON-LD object
* @param {Object} options - additional options
* @param {String|Array} options.requestedClassifications - AAT accession numbers (default: {@link http://vocab.getty.edu/aat/300312355 | aat.ACCESSION_NUMBERS})
* @param {String} options.language - limits the results to just a specific language (or leave undefined for all results)
* @param {Object} options.languageOptions - any additional options when working with language(s) @see LanguageHelpers.doesObjectLanguageMatch
*
* @example getAccessionNumbers(object) // gets accession numbers using defaults
* @example getAccessionNumbers(object, {language:'hi'}) // gets accession numbers in Hindi
* @example getAccessionNumbers(object, {requestedClassifications: 'http://vocab.getty.edu/aat/300444185'}) // gets accession numbers using a different AAT term
*
* @returns {Array} content of AAT accession numbers
*/
export function getAccessionNumbers(
submittedResource,
{
requestedClassifications = aat.ACCESSION_NUMBERS,
language,
languageOptions = {}
} = {}
) {
return getFieldValuesByClassifications(
submittedResource,
IDENTIFIED_BY,
requestedClassifications,
{ language, languageOptions }
);
}
/**
* Gets the carried out by object(s) that are referenced in the productions and returns them.
*
* @description
* gets the creator from the JSON-LD (produced_by / carried_out_by ) and returns the result. This is likely an object which
* is a reference to a Person or Group (Id, Type, and Label with nothing else), but could simply be an ID reference as well.
*
* @param {Object} object - the JSON-LD Object to look in
* @param {String} field - the field to look for the `carried_out_by` in. For art this will often be "produced_by", but it may also include
* "encountered_by" or other terms
*
* @example gets creator object/reference regardless of whether the production has a part or not
* getCarriedOutBy({produced_by: { part: [{carried_out_by: {id:123}}}]}), would return an array with one item [{id:123}]
*
* @returns {Array} - an array of the references
*/
export function getCarriedOutBy(object, field = PRODUCED_BY) {
return getFieldPartSubfield(object, field, CARRIED_OUT_BY);
}
/**
* @description Gets the culture(s) associated with an object if available.
* @param {Object} submittedResource - JSON-LD object
* @param {Object} options - additional options
* @param {String|Array} options.requestedClassifications - AAT culture (default: {@link http://vocab.getty.edu/aat/300055768 | aat.CULTURE})
* @param {String} options.language - limits the results to just a specific language (or leave undefined for all results)
* @param {Object} options.languageOptions - any additional options when working with language(s) @see LanguageHelpers.doesObjectLanguageMatch
*
* @example getCultures(object) // gets culture(s) using defaults
* @example getCultures(object, {language:'fr'}) // gets culture(s) in French
*
* @returns {Array} content of AAT culture(s)
*/
export function getCultures(
submittedResource,
{
requestedClassifications = aat.CULTURE,
language,
languageOptions = {}
} = {}
) {
return getFieldValuesByClassifications(
submittedResource,
REFERRED_TO_BY,
requestedClassifications,
{ language, languageOptions }
);
}
/**
* @description Gets URLs for digital images associated with an object if available.
* @param {Object} submittedResource - JSON-LD object
* @param {Object} options - additional options
* @param {String|Array} options.requestedClassifications - AAT digital images (default: {@link http://vocab.getty.edu/aat/300215302 | aat.DIGITAL_IMAGES})
*
* @example getDigitalImages(object) // gets digital images using defaults
*
* @returns {Array} urls of AAT digital images
*/
export function getDigitalImages(
submittedResource,
{ requestedClassifications = aat.DIGITAL_IMAGES } = {}
) {
const representations = normalizeFieldToArray(
submittedResource,
REPRESENTATION
);
let digitalImages = getClassifiedAs(
representations,
requestedClassifications
);
// return the digital image ids
return digitalImages.map((img) => img.id);
}
/**
* @description Gets rights statements associated with an object if available. Returns values from objects classified as "legal concepts" or "rights".
* @param {Object} submittedResource
* @param {Object} options - additional options
* @param {String|Array} options.requestedClassifications - AAT legal concepts OR AAT rights (legal concept) (default: [{@link http://vocab.getty.edu/aat/300055547 | aat.LEGAL_CONCEPTS}, {@link http://vocab.getty.edu/aat/300417696 aat.RIGHTS}])
* @param {String} options.language - limits the results to just a specific language (or leave undefined for all results)
* @param {Object} options.languageOptions - any additional options when working with language(s) @see LanguageHelpers.doesObjectLanguageMatch
*
* @example getRightsStatements(object) // gets rights statements using defaults
* @example getRightsStatements(object, {language:'ca'}) // gets rights statements in Catalan
* @example getRightsStatements(object, {requestedClassifications: 'http://vocab.getty.edu/aat/300055617'}) // gets rights statements using a different AAT term
*
* @returns {Array} array of rights statements
*/
export function getRightsStatements(
submittedResource,
{
requestedClassifications = [aat.LEGAL_CONCEPTS, aat.RIGHTS],
language,
languageOptions = {}
} = {}
) {
const referredToBy = normalizeFieldToArray(submittedResource, REFERRED_TO_BY);
const rights = getClassified(referredToBy, requestedClassifications, {
classificationField: CLASSIFIED_AS,
language,
languageOptions,
operator: OR
});
return rights.map((right) => getValueOrContent(right));
}
/**
* @description Gets copyright or licensing statements associated with an object if available.
* @param {Object} submittedResource
* @param {Object} options - additional options
* @param {String|Array} options.requestedClassifications - AAT copyright (default: {@link http://vocab.getty.edu/aat/300435434 | aat.COPYRIGHT})
* @param {String} options.language - limits the results to just a specific language (or leave undefined for all results)
* @param {Object} options.languageOptions - any additional options when working with language(s) @see LanguageHelpers.doesObjectLanguageMatch
*
* @example getCopyright(object) // gets copyright using defaults
* @example getCopyright(object, {language:'ca'}) // gets copyright in Catalan
* @example getCopyright(object, {requestedClassifications: 'http://vocab.getty.edu/aat/300055617'}) // gets copyright using a different AAT term
*
* @returns {Array} array of copyright objects
*/
export function getCopyrightStatements(
submittedResource,
{
requestedClassifications = aat.COPYRIGHT,
language,
languageOptions = {}
} = {}
) {
return getFieldValuesByClassifications(
submittedResource,
REFERRED_TO_BY,
requestedClassifications,
{ language, languageOptions }
);
}
/**
* @description Gets URLs for rights assertions an object is subject to if available.
* @param {Object} submittedResource
*
* @example getRightsAssertions(object) // gets rights assertions
*
* @returns {Array} array of urls of assertions of rights the resource is subject to
*/
export function getRightsAssertions(submittedResource) {
const subjectTo = normalizeFieldToArray(submittedResource, SUBJECT_TO);
// get array of rights assertion objects
let rightsAssertions = [];
subjectTo.forEach((obj) => {
rightsAssertions = rightsAssertions.concat(obj[CLASSIFIED_AS]);
});
// return rights assertion ids
return rightsAssertions.map((d) => d.id);
}
/**
* @description Gets the acknowledgement statement associated with an object if available.
* @param {Object} submittedResource
* @param {Object} options - additional options
* @param {String|Array} options.requestedClassifications - AAT acknowledgement statement (default: {@link http://vocab.getty.edu/aat/300026687 | aat.ACKNOWLEDGEMENT})
* @param {String} options.language - limits the results to just a specific language (or leave undefined for all results)
* @param {Object} options.languageOptions - any additional options when working with language(s) @see LanguageHelpers.doesObjectLanguageMatch
*
* @example getAcknowledgementStatements(object) // gets acknowledgements using defaults
* @example getAcknowledgementStatements(object, {language:'ca'}) // gets acknowledgements in Catalan
* @example getAcknowledgementStatements(object, {requestedClassifications: 'http://vocab.getty.edu/aat/300055617'}) // gets acknowledgement using a different AAT term
*
* @returns {Array} array of acknowledgement statements
*/
export function getAcknowledgementStatements(
submittedResource,
{
requestedClassifications = aat.ACKNOWLEDGEMENT,
language,
languageOptions = {}
} = {}
) {
return getFieldValuesByClassifications(
submittedResource,
REFERRED_TO_BY,
requestedClassifications,
{ language, languageOptions }
);
}
/**
* @description Gets the material statement(s) associated with an object if available.
* @param {Object} submittedResource
* @param {Object} options - additional options
* @param {String|Array} options.requestedClassifications - AAT materials/technique description (default: {@link http://vocab.getty.edu/aat/300435429 |aat.MATERIALS_DESCRIPTION})
* @param {String} options.language - limits the results to just a specific language (or leave undefined for all results)
* @param {Object} options.languageOptions - any additional options when working with language(s) @see LanguageHelpers.doesObjectLanguageMatch
*
* @example getMaterialStatements(object) // gets the material statement(s) using defaults
* @example getMaterialStatements(object, {language:'ca'}) // gets the material statement(s) in Catalan
* @example getMaterialsStatements(object, {requestedClassifications: 'http://vocab.getty.edu/aat/300010358'}) // gets the material statement(s) using a different AAT term
*
* @returns {Array} array of material statement(s)
*/
export function getMaterialStatements(
submittedResource,
{
requestedClassifications = aat.MATERIALS_DESCRIPTION,
language,
languageOptions = {}
} = {}
) {
return getFieldValuesByClassifications(
submittedResource,
REFERRED_TO_BY,
requestedClassifications,
{ language, languageOptions }
);
}
/**
* Gets the timespan(s) for a production
*
* @description This gets the timespan object(s) for the production information regardless of whether the production has parts or not.
*
* @param {Object} object - a JSON-LD Object
*
* @example gets the timespan
* getProductionTimespan({produced_by: { "timespan": {
"id": "https://data.getty.edu/museum/collection/object/c88b3df0-de91-4f5b-a9ef-7b2b9a6d8abb/production/timespan",
"type": "TimeSpan",
"begin_of_the_begin": "1889-01-01T00:00:00",
"end_of_the_end": "1889-12-31T23:59:59"
},
}}}) returns [{"id": "https://data.getty.edu/museum/collection/object/c88b3df0-de91-4f5b-a9ef-7b2b9a6d8abb/production/timespan",
"type": "TimeSpan",
"begin_of_the_begin": "1889-01-01T00:00:00",
"end_of_the_end": "1889-12-31T23:59:59"
}]
*
* @returns {Array} - an array of LinkedArt timespan objects
*/
export function getProductionTimespans(object) {
return getFieldPartSubfield(object, PRODUCED_BY, TIMESPAN);
}
/**
* @description Gets the kind(s) of object or work associated with an object if available.
* @param {Object} submittedResource
* @param {Object} options - additional options
* @param {String|Array} options.requestedClassifications - AAT object/work type (default: {@link http://vocab.getty.edu/aat/300435443 | aat.WORK_TYPE})
* @param {String} options.language - limits the results to just a specific language (or leave undefined for all results)
* @param {Object} options.languageOptions - any additional options when working with language(s) @see LanguageHelpers.doesObjectLanguageMatch
*
* @example getWorkTypes(object) // gets types using defaults
* @example getWorkTypes(object, {language:'mk'}) // gets types in Macedonian
* @example getWorkTypes(object, {requestedClassifications: 'http://vocab.getty.edu/aat/300375701'}) // gets types using a different AAT term
*
* @returns {Array} array of work types
*/
export function getWorkTypes(
submittedResource,
{
requestedClassifications = aat.WORK_TYPE,
language,
languageOptions = {}
} = {}
) {
let workTypes = getClassifiedAsWithClassification(
submittedResource,
requestedClassifications,
{ language, languageOptions }
);
return workTypes;
}
/**
* @description Gets the classification(s) associated with an object if available.
* @param {Object} submittedResource
* @param {Object} options - additional options
* @param {String|Array} options.requestedClassifications - AAT classification (default: {@link http://vocab.getty.edu/aat/300435444 | aat.CLASSIFICATION})
* @param {String} options.language - limits the results to just a specific language (or leave undefined for all results)
* @param {Object} options.languageOptions - any additional options when working with language(s) @see LanguageHelpers.doesObjectLanguageMatch
*
* @example getClassifications(object) // gets classifications using defaults
* @example getClassifications(object, {language:'hu'}) // gets classifications in Magyar
* @example getClassifications(object, {requestedClassifications: 'http://vocab.getty.edu/aat/300375701'}) // gets classifications using a different AAT term
*
* @returns {Array} array of classification objects
*/
export function getClassifications(
submittedResource,
{
requestedClassifications = aat.CLASSIFICATION,
language,
languageOptions = {}
} = {}
) {
let classifications = getClassifiedAsWithClassification(
submittedResource,
requestedClassifications,
{ language, languageOptions }
);
return classifications;
}
Source