wikibase-edit
Version:
Edit Wikibase from NodeJS
118 lines (98 loc) • 4.5 kB
text/typescript
import { isGuid, isPropertyId, isHash, getEntityIdFromGuid, type Guid, type PropertyId, type Hash, type Claim, type Qualifier, type StatementQualifier } 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'
import type { MovableEntityId } from '../claim/move.js'
import type { EditEntityRawModeParams } from '../entity/edit.js'
import type { WikibaseEditAPI } from '../index.js'
import type { BaseRevId } from '../types/common.js'
import type { SerializedConfig } from '../types/config.js'
export interface MoveQualifierParams {
guid: Guid<MovableEntityId>
oldProperty: PropertyId
newProperty: PropertyId
hash?: Hash
summary?: string
baserevid?: BaseRevId
}
export async function moveQualifier (params: MoveQualifierParams, config: SerializedConfig, API: WikibaseEditAPI) {
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<MovableEntityId>(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: EditEntityRawModeParams = {
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: PropertyId, qualifier: Qualifier | StatementQualifier) {
qualifier.property = newProperty
return qualifier
}
function generateSummary (guid: Guid, oldProperty: PropertyId, newProperty: PropertyId, hash: Hash) {
if (hash) {
return `moving a ${oldProperty} qualifier of ${guid} to ${newProperty}`
} else {
return `moving ${guid} ${oldProperty} qualifiers to ${newProperty}`
}
}
export interface MoveQualifierResponse {
claim: Claim
}