class KBA
constructor: (@noodb) ->
get_kb_with_write_capability: (capability) ->
KBA = require(‘kba’).KBA
class KBA
constructor: (@noodb) ->
get_kb_with_write_capability: (capability) ->
cap_spogi = @noodb.query([{p: ‘nrn:hasWriteCapability’, o: capability}, {g: “nrn:capabilitiesKB”}], {which: “first”})
retval = 'nrn:smurp_libnoo_issues_kb'
retval = ‘nrn:foaf20140114’
@ensure_kb_is_readable(retval)
return retval
ensure_kb_is_readable: (kb_qn) ->
@noodb.log.warning("KBA.ensure_kb_is_readable('#{kb_qn}') is an ugly hack. Permission setting should happen at the time of kb creation")
one way to achieve this is to make the kb publicly readable
@noodb.allege(kb_qn, 'nrn:readableBy', 'nrn:public', 'nrn:permissionsKB')
another way is to make the kb inherit permissions from something readable @noodb.allege(kb_qn, ‘nrn:inheritsPermissionsFrom’, ‘nrn:core’, ‘nrn:permissionsKB’)
class KBASoftwareIssue extends KBA
constructor: ->
super
try
@noodb.prefixdb.add_prefix('nrnprjiss', 'http://nooron.com/__/nrnprjiss#')
catch e
no problem if there is a collision
TODO make these into links to the resources or at least strings with _typ These are the mappings from KBASoftwareIssue to an ontological view of the data Note that these mappings would ideally be expressed in an external ontology.
Issue: 'nrnprjiss:Issue'
issueCreationDate: 'nrnprjiss:issueCreationDate'
issueKind: 'nrnprjiss:kind'
issueMilestone: 'nrnprjiss:milestone'
issuePriority: 'nrnprjiss:priority'
issueState: 'nrnprjiss:state'
issueTitle: 'dc:title'
issueUpdateDate: 'nrnprjiss:issueUpdateDate'
issueWatchers: 'nrnprjiss:watchers'
issueVotes: 'nrnprjiss:votes'
process_event_fields: (req, res, kb_qn, body, eventKey, flds) ->
subj = @get_subject(body, kb_qn, eventKey)
out = []
if eventKey is 'issue:created'
@noodb.allege(subj, 'rdf:type', @Issue, kb_qn)
for fld in flds
ont = @fld2ont[fld]
if not ont?
throw new Error("no fld2ont entry for '#{fld}'")
path = fld.split(':')
part = path.shift()
limb = body
while part
limb = limb[part]
part = path.shift and path.shift() or false
if limb?
pred = @[ont]
if pred?
if "string" is typeof limb
limb = "\"#{limb}\""
wrote = @noodb.allege(subj, pred, limb, kb_qn)
out.push(wrote)
console.log(wrote.toString())
else
throw new Error("no entry on #{this.constructor.name} for '#{ont}'")
res.send(out.join('\n') or 'no allegations generated')
return
class KBABitBucket extends KBASoftwareIssue
fld2ont: # these are the mappings from BitBucket JSON to KBASoftwareIssue
'issue:created_on': 'issueCreationDate'
'issue:kind': 'issueKind'
'issue:milestone': 'issueMilestone'
'issue:priority': 'issuePriority'
'issue:state': 'issueState'
'issue:title': 'issueTitle'
'issue:updated_on': 'issueUpdateDate'
'issue:votes': 'issueVotes'
'issue:watches': 'issueWatchers'
webhook: (req, res) =>
console.log(JSON.stringify(req.body, null, 4))
if req.params.capability
kb_qn = @get_kb_with_write_capability(req.params.capability)
res.send(JSON.stringify(req.body, null, 4))
eventKey = req.headers['x-event-key']
res.setHeader('content-type','text/plain') # not critical
if typeof req.body isnt 'object'
res.send("typeof req.body is #{typeof req.body}")
return
b = req.body
switch eventKey
when 'issue:updated', 'issue:created', 'issue:commented'
@process_event_fields(req, res, kb_qn, b, eventKey, @event2flds[eventKey])
else
res.send("X-Event-Key '#{eventKey}' not supported")
else
res.send("/kba/bitbucket/CAPABILITY")
res.send(204)
event2flds:
'issue:created': [
'issue:created_on'
'issue:kind'
'issue:milestone'
'issue:priority'
'issue:state'
'issue:title'
'issue:votes'
'issue:watches'
]
'issue:updated': [
'issue:created_on'
'issue:kind'
'issue:milestone'
'issue:priority'
'issue:state'
'issue:title'
'issue:votes'
'issue:watches'
]
'issue:commented': 'created_on updated_on votes watches state milestone title priority'.split(' ')
get_subject: (body, kb_qn, eventKey) ->
subj = body.issue.links.html.href
subj.replace(/\/[^\/]*$/, '') # remove '/a-title' https://bitbucket.org/WHO/REPO/issues/12/a-title
(exports ? this).KBABitBucket = KBABitBucket