wikibase-edit
Version:
Edit Wikibase from NodeJS
94 lines • 4.1 kB
JavaScript
import { isGuid, isPropertyId, isHash, getEntityIdFromGuid } from 'wikibase-sdk';
import { findClaimByGuid } from '../claim/helpers.js';
import { propertiesDatatypesDontMatch } from '../claim/move_commons.js';
import { newError } from '../error.js';
import { getEntityClaims } from '../get_entity.js';
export async function moveQualifier(params, config, API) {
const { guid, oldProperty, newProperty, hash } = params;
if (!guid)
throw newError('missing claim guid', 400, params);
if (!isGuid(guid))
throw newError('invalid claim guid', 400, params);
if (!oldProperty)
throw newError('missing old property', 400, params);
if (!isPropertyId(oldProperty))
throw newError('invalid old property', 400, params);
if (!newProperty)
throw newError('missing new property', 400, params);
if (!isPropertyId(newProperty))
throw newError('invalid new property', 400, params);
if (hash != null && !isHash(hash))
throw newError('invalid hash', 400, params);
const currentEntityId = getEntityIdFromGuid(guid);
const claims = await getEntityClaims(currentEntityId, config);
const claim = findClaimByGuid(claims, guid);
if (!claim)
throw newError('claim not found', 400, params);
if (!claim.qualifiers[oldProperty]) {
throw newError('no qualifiers found for this property', 400, {
...params,
foundQualifiers: Object.keys(claim.qualifiers),
});
}
const originDatatype = config.properties[oldProperty];
const targetDatatype = config.properties[newProperty];
function recoverDatatypesMismatch(movedSnaks) {
if (originDatatype !== targetDatatype) {
propertiesDatatypesDontMatch({
movedSnaks,
originDatatype,
originPropertyId: oldProperty,
targetDatatype,
targetPropertyId: newProperty,
instance: config.instance,
});
}
}
if (hash) {
const qualifier = claim.qualifiers[oldProperty].find(findByHash(hash));
if (!qualifier) {
throw newError('qualifier not found', 400, {
...params,
foundHashes: claim.qualifiers[oldProperty].map(qualifier => qualifier.hash),
});
}
recoverDatatypesMismatch([qualifier]);
claim.qualifiers[newProperty] = claim.qualifiers[newProperty] || [];
claim.qualifiers[newProperty].push(changeProperty(newProperty, qualifier));
claim.qualifiers[oldProperty] = claim.qualifiers[oldProperty].filter(filterOutByHash(hash));
if (claim.qualifiers[oldProperty].length === 0)
delete claim.qualifiers[oldProperty];
}
else {
claim.qualifiers[newProperty] = claim.qualifiers[oldProperty]
.map(changeProperty.bind(null, newProperty));
recoverDatatypesMismatch(claim.qualifiers[newProperty]);
delete claim.qualifiers[oldProperty];
}
const { statementsKey } = config;
const entityData = {
rawMode: true,
id: currentEntityId,
[statementsKey]: [claim],
summary: 'summary' in params ? params.summary : (config.summary || generateSummary(guid, oldProperty, newProperty, hash)),
baserevid: 'baserevid' in params ? params.baserevid : config.baserevid,
};
const res = await API.entity._rawEdit(entityData, config);
const updatedClaim = findClaimByGuid(res.entity[statementsKey], guid);
return { claim: updatedClaim };
}
const findByHash = hash => qualifier => qualifier.hash === hash;
const filterOutByHash = hash => qualifier => qualifier.hash !== hash;
function changeProperty(newProperty, qualifier) {
qualifier.property = newProperty;
return qualifier;
}
function generateSummary(guid, oldProperty, newProperty, hash) {
if (hash) {
return `moving a ${oldProperty} qualifier of ${guid} to ${newProperty}`;
}
else {
return `moving ${guid} ${oldProperty} qualifiers to ${newProperty}`;
}
}
//# sourceMappingURL=move.js.map