wikibase-edit
Version:
Edit Wikibase from NodeJS
54 lines • 2.29 kB
JavaScript
import { flatten, values } from 'lodash-es';
import { getEntityIdFromGuid } from 'wikibase-sdk';
import { findSnak } from '../claim/find_snak.js';
import { formatUpdatedSnakValue } from '../claim/update.js';
import { newError } from '../error.js';
import { getEntityClaims } from '../get_entity.js';
import { validateGuid, validatePropertyId, validateSnakValue } from '../validate.js';
export async function updateQualifier(params, config, API) {
const { guid, property, oldValue, newValue } = params;
validateGuid(guid);
validatePropertyId(property);
const datatype = config.properties[property];
validateSnakValue(property, datatype, oldValue);
if (oldValue === newValue) {
throw newError('same value', 400, { oldValue, newValue });
}
const qualifier = await getSnak(guid, property, oldValue, config);
const { hash } = qualifier;
const formattedNewValue = formatUpdatedSnakValue(newValue, qualifier);
validateSnakValue(property, datatype, formattedNewValue);
return API.qualifier.set({
guid,
hash,
property,
value: formattedNewValue,
summary: 'summary' in params ? params.summary : config.summary,
baserevid: params.baserevid || config.baserevid,
}, config);
}
async function getSnak(guid, property, oldValue, config) {
const entityId = getEntityIdFromGuid(guid);
const claims = await getEntityClaims(entityId, config);
const claim = findClaim(claims, guid);
if (!claim)
throw newError('claim not found', 400, { guid });
if (!claim.qualifiers)
throw newError('claim qualifiers not found', 400, { guid });
const propSnaks = claim.qualifiers[property];
const qualifier = findSnak(property, propSnaks, oldValue);
if (!qualifier) {
const actualValues = propSnaks ? propSnaks.map(getSnakValue) : null;
throw newError('qualifier not found', 400, { guid, property, expectedValue: oldValue, actualValues });
}
return qualifier;
}
function findClaim(claims, guid) {
const flattenedClaims = flatten(values(claims));
for (const claim of flattenedClaims) {
if (claim.id === guid)
return claim;
}
}
const getSnakValue = snak => snak.datavalue?.value;
//# sourceMappingURL=update.js.map