Skip to content

Commit ba4992d

Browse files
authored
Merge branch 'master' into dependabot/npm_and_yarn/validator-13.15.20
2 parents 5c3bd0d + 88609e9 commit ba4992d

13 files changed

Lines changed: 124 additions & 52 deletions

lib/actions/updateCollectionIcon.js

Lines changed: 42 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
const fs = require('fs')
33
const config = require('../config')
44
const extend = require('xtend')
5+
const path = require('path')
56

67
const getOwnedBy = require('../query/ownedBy')
78

@@ -13,41 +14,52 @@ const mkdirp = require('mkdirp')
1314

1415
module.exports = function (req, res) {
1516
const { graphUri, uri, url } = getUrisFromReq(req, res)
16-
return getOwnedBy(uri, graphUri).then((ownedBy) => {
17-
if (ownedBy.indexOf(config.get('databasePrefix') + 'user/' + req.user.username) === -1) {
18-
if (!req.accepts('text/html')) {
19-
res.status(403).type('text/plain').send('Not authorized to update this collection icon')
20-
} else {
21-
const locals = {
22-
config: config.get(),
23-
section: 'errors',
24-
user: req.user,
25-
errors: [ 'Not authorized to update this collection icon' ]
17+
if (req.method === 'GET') {
18+
const collectionIcons = config.get('collectionIcons')
19+
const iconFile = collectionIcons[uri]
20+
if (iconFile) {
21+
const dir = path.resolve(__dirname, '../../public')
22+
res.sendFile(iconFile, { root: dir })
23+
} else {
24+
res.status(403).type('text/plain').send('No icon for this collection')
25+
}
26+
} else {
27+
return getOwnedBy(uri, graphUri).then((ownedBy) => {
28+
if (ownedBy.indexOf(config.get('databasePrefix') + 'user/' + req.user.username) === -1) {
29+
if (!req.accepts('text/html')) {
30+
res.status(403).type('text/plain').send('Not authorized to update this collection icon')
31+
} else {
32+
const locals = {
33+
config: config.get(),
34+
section: 'errors',
35+
user: req.user,
36+
errors: [ 'Not authorized to update this collection icon' ]
37+
}
38+
res.status(403).send(pug.renderFile('templates/views/errors/errors.jade', locals))
2639
}
27-
res.status(403).send(pug.renderFile('templates/views/errors/errors.jade', locals))
2840
}
29-
}
3041

31-
if (req.file) {
32-
var iconFile = req.file
42+
if (req.file) {
43+
var iconFile = req.file
3344

34-
var collectionIcons = config.get('collectionIcons')
35-
const iconFilename = 'public/icons/' + iconFile.originalname
45+
var collectionIcons = config.get('collectionIcons')
46+
const iconFilename = 'public/icons/' + iconFile.originalname
3647

37-
mkdirp('public/icons').then(() => {
38-
fs.writeFileSync(iconFilename, iconFile.buffer)
39-
})
48+
mkdirp('public/icons').then(() => {
49+
fs.writeFileSync(iconFilename, iconFile.buffer)
50+
})
4051

41-
collectionIcons = extend(collectionIcons, {
42-
[uri]: '/icons/' + iconFile.originalname
43-
})
52+
collectionIcons = extend(collectionIcons, {
53+
[uri]: '/icons/' + iconFile.originalname
54+
})
4455

45-
config.set('collectionIcons', collectionIcons)
46-
}
47-
if (!req.accepts('text/html')) {
48-
res.status(200).type('text/plain').send('Success')
49-
} else {
50-
res.redirect(url)
51-
}
52-
})
56+
config.set('collectionIcons', collectionIcons)
57+
}
58+
if (!req.accepts('text/html')) {
59+
res.status(200).type('text/plain').send('Success')
60+
} else {
61+
res.redirect(url)
62+
}
63+
})
64+
}
5365
}

lib/app.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -301,26 +301,35 @@ function App () {
301301
app.get('/public/:collectionId/:displayId/:version/uses', requirePublicLogin, views.search)
302302
app.get('/public/:collectionId/:displayId/:version/similar', requirePublicLogin, views.search)
303303

304+
app.get('/public/:collectionId/:displayId/:version/twinsCount', requirePublicLogin, views.search)
305+
app.get('/public/:collectionId/:displayId/:version/usesCount', requirePublicLogin, views.search)
306+
app.get('/public/:collectionId/:displayId/:version/similarCount', requirePublicLogin, views.search)
307+
304308
app.get('/user/:userId/:collectionId/:displayId/:version/subCollections', requirePublicLogin, api.subCollections)
305309
app.get('/user/:userId/:collectionId/:displayId/:version/twins', requirePublicLogin, views.search)
306310
app.get('/user/:userId/:collectionId/:displayId/:version/uses', requirePublicLogin, views.search)
307311
app.get('/user/:userId/:collectionId/:displayId/:version/similar', requirePublicLogin, views.search)
308312

313+
app.get('/user/:userId/:collectionId/:displayId/:version/twinsCount', requirePublicLogin, views.search)
314+
app.get('/user/:userId/:collectionId/:displayId/:version/usesCount', requirePublicLogin, views.search)
315+
app.get('/user/:userId/:collectionId/:displayId/:version/similarCount', requirePublicLogin, views.search)
316+
309317
app.get('/user/:userId/:collectionId/:displayId/:version/:hash/share/subCollections', requirePublicLogin, api.subCollections)
310318
app.get('/user/:userId/:collectionId/:displayId/:version/:hash/share/twins', requirePublicLogin, views.search)
311319
app.get('/user/:userId/:collectionId/:displayId/:version/:hash/share/uses', requirePublicLogin, views.search)
312320
app.get('/user/:userId/:collectionId/:displayId/:version/:hash/share/similar', requirePublicLogin, views.search)
313321

322+
app.get('/user/:userId/:collectionId/:displayId/:version/:hash/share/twinsCount', requirePublicLogin, views.search)
323+
app.get('/user/:userId/:collectionId/:displayId/:version/:hash/share/usesCount', requirePublicLogin, views.search)
324+
app.get('/user/:userId/:collectionId/:displayId/:version/:hash/share/similarCount', requirePublicLogin, views.search)
325+
314326
app.get('/sparql', requirePublicLogin, sparql)
315327
app.post('/sparql', requirePublicLogin, bodyParser.urlencoded({ extended: true }), sparql)
316328

317329
// Manage Submissions Endpoints
318-
app.post(
319-
'/public/:collectionId/:displayId/:version/icon',
320-
requireUser,
321-
uploadToMemory.single('collectionIcon'),
322-
actions.updateCollectionIcon
323-
)
330+
app.get('/public/:collectionId/:displayId/:version/icon', actions.updateCollectionIcon)
331+
app.post('/public/:collectionId/:displayId/:version/icon', requireUser, uploadToMemory.single('collectionIcon'),
332+
actions.updateCollectionIcon)
324333

325334
app.get('/public/:collectionId/:displayId/:version/removeCollection', requireAdmin, actions.removeCollection)
326335
app.get('/public/:collectionId/:displayId/:version/remove', requireAdmin, actions.remove)

lib/attachments.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,16 +198,19 @@ function getAttachmentsFromList (graphUri, attachmentList, share) {
198198
.replace('http://purl.org/NET/mediatypes/video/', '')
199199

200200
var url = '/' + attachment.uri.toString().replace(config.get('databasePrefix'), '')
201-
202201
if (attachment.uri.toString().startsWith(config.get('databasePrefix') + 'user/') && share) {
203202
url += '/' + sha1('synbiohub_' + sha1(attachment.uri.toString()) + config.get('shareLinkSalt')) + '/share'
204203
}
204+
var source = '/' + attachment.source.toString().replace(config.get('databasePrefix'), '')
205+
if (attachment.source.toString().startsWith(config.get('databasePrefix') + 'user/') && share) {
206+
source += '/' + sha1('synbiohub_' + sha1(attachment.source.toString()) + config.get('shareLinkSalt')) + '/share'
207+
}
205208

206209
return Promise.resolve({
207210
name: attachment.name,
208211
type: format || 'Other',
209212
url: url,
210-
source: attachment.source.toString(),
213+
source: source,
211214
size: size,
212215
sizeString: size === -1 ? null : filesize(size)
213216
})

lib/search.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,10 @@ search.lucene = function lucene (value) {
136136
for (i = 0; i < values.length - 1; i++) {
137137
var query = values[i].split('=')
138138
if (query[0].indexOf(':') > -1) {
139-
criteriaStr += ' ?subject ' + query[0] + ' ' + query[1] + ' . '
139+
let predicate = query[0].startsWith('http') ? '<' + query[0] + '>' : query[0]
140+
let object = query[1].startsWith('http') ? '<' + query[1] + '>' : query[1]
141+
criteriaStr += ' ?subject ' + predicate + ' ' + object + ' . '
142+
console.log('criteriaStr=' + criteriaStr)
140143
} else if (query[0] === 'objectType') {
141144
if (query[1].includes(':')) {
142145
criteriaStr += ' ?subject a ' + query[1] + ' . '

lib/summarize/summarizeAttachment.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ function summarizeAttachment (attachment, req, sbol, remote, graphUri) {
2929

3030
var summary = {
3131
attachmentType: attachmentType,
32+
attachmentTypeUrl: attachment.format,
3233
attachmentHash: attachment.hash,
3334
attachmentName: 'Attachment',
3435
attachmentDownloadURL: attachmentDownloadURL(attachment, req),

lib/uriToUrl.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ function uriToUrl (uri, req) {
1111
uri = uri.uri
1212
}
1313

14-
if (req && req.url.toString().endsWith('/share')) {
14+
if (req && req.url.toString().endsWith('/share') && uri.toString().startsWith(config.get('databasePrefix'))) {
1515
uri += '/' + sha1('synbiohub_' + sha1(uri.toString()) + config.get('shareLinkSalt')) + '/share'
1616
}
1717

lib/views/advancedSearch.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,19 @@ function advancedSearchForm (req, res, locals, errors) {
129129

130130
function getQuery (searchPred, searchObj, filterObj, criteriaStr, queryStr, list) {
131131
if (searchPred !== 'No Filter' && (searchObj || (filterObj && filterObj !== 'No Filter'))) {
132+
if (searchPred.toString().startsWith('http')) {
133+
searchPred = '<' + searchPred + '>'
134+
}
132135
var predStr = searchPred
133136
if (!searchPred.toString().startsWith('sbol2:')) {
134137
predStr = searchPred.replace('sbol2:', '')
135138
}
136139
if (searchPred === 'a') {
137140
predStr = 'objectType'
138141
}
142+
if (searchPred.toString().startsWith('http')) {
143+
searchPred = '<' + searchPred + '>'
144+
}
139145
var objStr
140146
if (searchObj) {
141147
objStr = namespace.longName(searchObj)
@@ -315,11 +321,21 @@ function getUriList (req, graphUri) {
315321
}
316322
}
317323

324+
function fixPred (a) {
325+
let short = namespace.shortName(a)
326+
// TODO: a better check for URI would be good
327+
if (a === short && a.startsWith('http')) {
328+
return '<' + a + '>'
329+
} else {
330+
return short
331+
}
332+
}
333+
318334
return Promise.all([
319335

320336
new Promise((resolve, reject) => {
321337
if (req.body.searchPred1 && req.body.searchPred1 !== 'No Filter') {
322-
templateParams.predicate = req.body.searchPred1.includes(':') ? req.body.searchPred1 : 'sbol2:' + req.body.searchPred1
338+
templateParams.predicate = fixPred(req.body.searchPred1)
323339
var objectQuery1 = loadTemplate('sparql/searchObj.sparql', templateParams)
324340
console.debug(objectQuery1)
325341
sparql.queryJson(objectQuery1, graphUri).then((object1List) => {
@@ -338,7 +354,7 @@ function getUriList (req, graphUri) {
338354

339355
new Promise((resolve, reject) => {
340356
if (req.body.searchPred2 && req.body.searchPred2 !== 'No Filter') {
341-
templateParams.predicate = req.body.searchPred2.includes(':') ? req.body.searchPred2 : 'sbol2:' + req.body.searchPred2
357+
templateParams.predicate = fixPred(req.body.searchPred2)
342358
var objectQuery2 = loadTemplate('sparql/searchObj.sparql', templateParams)
343359
console.debug(objectQuery2)
344360
sparql.queryJson(objectQuery2, graphUri).then((object2List) => {
@@ -357,7 +373,7 @@ function getUriList (req, graphUri) {
357373

358374
new Promise((resolve, reject) => {
359375
if (req.body.searchPred3 && req.body.searchPred3 !== 'No Filter') {
360-
templateParams.predicate = req.body.searchPred3.includes(':') ? req.body.searchPred3 : 'sbol3:' + req.body.searchPred3
376+
templateParams.predicate = fixPred(req.body.searchPred3)
361377
var objectQuery3 = loadTemplate('sparql/searchObj.sparql', templateParams)
362378
console.debug(objectQuery3)
363379
sparql.queryJson(objectQuery3, graphUri).then((object3List) => {
@@ -376,7 +392,7 @@ function getUriList (req, graphUri) {
376392

377393
new Promise((resolve, reject) => {
378394
if (req.body.searchPred4 && req.body.searchPred4 !== 'No Filter') {
379-
templateParams.predicate = req.body.searchPred4.includes(':') ? req.body.searchPred4 : 'sbol4:' + req.body.searchPred4
395+
templateParams.predicate = fixPred(req.body.searchPred4)
380396
var objectQuery4 = loadTemplate('sparql/searchObj.sparql', templateParams)
381397
console.debug(objectQuery4)
382398
sparql.queryJson(objectQuery4, graphUri).then((object4List) => {
@@ -395,7 +411,7 @@ function getUriList (req, graphUri) {
395411

396412
new Promise((resolve, reject) => {
397413
if (req.body.searchPred5 && req.body.searchPred5 !== 'No Filter') {
398-
templateParams.predicate = req.body.searchPred5.includes(':') ? req.body.searchPred5 : 'sbol5:' + req.body.searchPred5
414+
templateParams.predicate = fixPred(req.body.searchPred5)
399415
var objectQuery5 = loadTemplate('sparql/searchObj.sparql', templateParams)
400416
console.debug(objectQuery5)
401417
sparql.queryJson(objectQuery5, graphUri).then((object5List) => {

lib/views/search.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ module.exports = function (req, res) {
6868
var designId
6969
var uri
7070

71-
if (req.originalUrl.toString().endsWith('/uses') || req.originalUrl.toString().includes('/uses/?offset')) {
71+
if (req.originalUrl.toString().endsWith('/uses') || req.originalUrl.toString().endsWith('/usesCount') ||
72+
req.originalUrl.toString().includes('/uses/?offset')) {
7273
if (req.params.userId) {
7374
designId = req.params.collectionId + '/' + req.params.displayId + '/' + req.params.version
7475
uri = config.get('databasePrefix') + 'user/' + encodeURIComponent(req.params.userId) + '/' + designId
@@ -84,7 +85,8 @@ module.exports = function (req, res) {
8485
)
8586
}
8687

87-
if (req.originalUrl.toString().endsWith('/twins') || req.originalUrl.toString().includes('/twins/?offset')) {
88+
if (req.originalUrl.toString().endsWith('/twins') || req.originalUrl.toString().endsWith('/twinsCount') ||
89+
req.originalUrl.toString().includes('/twins/?offset')) {
8890
if (req.params.userId) {
8991
designId = req.params.collectionId + '/' + req.params.displayId + '/' + req.params.version
9092
uri = config.get('databasePrefix') + 'user/' + encodeURIComponent(req.params.userId) + '/' + designId
@@ -103,7 +105,8 @@ module.exports = function (req, res) {
103105
)
104106
}
105107

106-
if (req.originalUrl.toString().endsWith('/similar') || req.originalUrl.toString().includes('/similar/?offset')) {
108+
if (req.originalUrl.toString().endsWith('/similar') || req.originalUrl.toString().endsWith('/similarCount') ||
109+
req.originalUrl.toString().includes('/similar/?offset')) {
107110
if (config.get('useSBOLExplorer')) {
108111
if (req.params.userId) {
109112
designId = req.params.collectionId + '/' + req.params.displayId + '/' + req.params.version
@@ -143,7 +146,10 @@ module.exports = function (req, res) {
143146
user: req.user
144147
}
145148

146-
if (req.originalUrl.indexOf('/searchCount') !== -1) {
149+
if (req.originalUrl.indexOf('/searchCount') !== -1 ||
150+
req.originalUrl.endsWith('/usesCount') ||
151+
req.originalUrl.endsWith('/twinsCount') ||
152+
req.originalUrl.endsWith('/similarCount')) {
147153
res.header('content-type', 'text/plain').send(count.toString())
148154
} else if (req.forceNoHTML || !req.accepts('text/html')) {
149155
var jsonResults = results.map(function (result) {
@@ -154,6 +160,8 @@ module.exports = function (req, res) {
154160
description: result['description'] || '',
155161
displayId: result['displayId'] || '',
156162
version: result['version'] || '',
163+
sbolType: result['sbolType'] || null,
164+
role: result['role'] || null,
157165
percentMatch: result['percentMatch'] || '',
158166
strandAlignment: result['strandAlignment'] || '',
159167
CIGAR: result['CIGAR'] || ''

lib/views/topLevelView.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ module.exports = function (req, res, type) {
227227
access = config.get('instanceUrl') + url.substring(1)
228228
}
229229

230-
const token = apiTokens.createToken(req.user)
230+
const token = req.user ? apiTokens.createToken(req.user) : ''
231231

232232
let data = {
233233
complete_sbol: access + '/sbol',
@@ -265,7 +265,7 @@ module.exports = function (req, res, type) {
265265
access = config.get('instanceUrl') + url.substring(1)
266266
}
267267

268-
const token = apiTokens.createToken(req.user)
268+
const token = req.user ? apiTokens.createToken(req.user) : ''
269269

270270
let data = {
271271
complete_sbol: access + '/sbol',
@@ -305,7 +305,8 @@ module.exports = function (req, res, type) {
305305
sparql.queryJson(getAttachmentsQuery, graphUri).then((results) => {
306306
var attachmentList = results
307307

308-
return attachments.getAttachmentsFromList(graphUri, attachmentList).then((results) => {
308+
return attachments.getAttachmentsFromList(graphUri, attachmentList,
309+
req && req.url.toString().endsWith('/share')).then((results) => {
309310
meta.attachments = results
310311
})
311312
})

sparql/search.sparql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ PREFIX cello: <http://cellocad.org/Terms/cello#>
1111
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
1212
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
1313
PREFIX purl: <http://purl.obolibrary.org/obo/>
14+
PREFIX biopax: <http://www.biopax.org/release/biopax-level3.owl#>
15+
PREFIX so: <http://identifiers.org/so/>
16+
PREFIX bench: <http://wiki.synbiohub.org/wiki/Terms/benchling#>
17+
PREFIX genbank: <http://www.ncbi.nlm.nih.gov/genbank#>
1418

1519
SELECT DISTINCT
1620
?subject
@@ -19,6 +23,8 @@ SELECT DISTINCT
1923
?name
2024
?description
2125
?type
26+
?sbolType
27+
?role
2228
$from
2329
WHERE {
2430
$criteria
@@ -29,6 +35,9 @@ WHERE {
2935
OPTIONAL { ?subject sbol2:version ?version . }
3036
OPTIONAL { ?subject dcterms:title ?name . }
3137
OPTIONAL { ?subject dcterms:description ?description . }
38+
OPTIONAL { ?subject sbol2:type ?sbolType . FILTER(STRSTARTS(str(?sbolType),'http://www.biopax.org/release/biopax-level3.owl')) }
39+
OPTIONAL { ?subject sbol2:role ?role . FILTER(STRSTARTS(str(?role),'http://identifiers.org/so/')) }
40+
3241
}
3342

3443
$limit

0 commit comments

Comments
 (0)