@researchdatabox/sails-hook-redbox-omero
Version:
A Sails hook to add functionality to redbox that provisions OMERO
211 lines (188 loc) • 7.09 kB
text/typescript
import { Observable } from 'rxjs/Rx';
import {Sails, Model} from 'sails';
import * as requestPromise from "request-promise";
import * as _ from 'lodash';
import { RecordsService, Services as services} from '@researchdatabox/redbox-core-types';
declare var RecordsService: RecordsService, BrandingService;
declare var sails: Sails;
declare var _this;
declare var Institution, User: Model;
export module Services {
export class OMEROService extends services.Core.Service {
protected _exportedMethods: any = [
'csrf',
'login',
'projects',
'createContainer',
'annotateMap',
'annotations',
'getCookies',
'getCookieValue',
'images'
];
constructor() {
super();
}
cookieJar(jar: any, config: any, key: string, value: string) {
const keyvalue = key + '=' + value;
const cookie = requestPromise.cookie('' + keyvalue);
jar.setCookie(cookie, config.host, function (error, cookie) {
//sails.log.debug(cookie);
});
return jar;
}
getCookies(cookies) {
const cookieJar = [];
cookies.forEach((rawcookies) => {
var cookie = requestPromise.cookie(rawcookies);
cookieJar.push({key: cookie.key, value: cookie.value, expires: cookie.expires});
});
return cookieJar;
}
getCookieValue(cookieJar, key) {
const cookie = _.find(cookieJar, {key: key});
if (cookie) {
return cookie['value'];
} else return '';
}
csrf(config: any) {
const get = requestPromise({
uri: `${config.host}/api/v0/token/`
});
return Observable.fromPromise(get);
}
login(config: any, csrf: string, user: any) {
let jar = requestPromise.jar();
jar = this.cookieJar(jar, config, 'csrftoken', csrf);
const post = requestPromise({
uri: `${config.host}/api/v0/login/`,
method: 'POST',
formData: {
username: user.username,
password: user.password,
server: config.serverId
},
resolveWithFullResponse: true,
jar: jar,
headers: {
'X-CSRFToken': csrf
}
});
return Observable.fromPromise(post);
}
projects(config: any, csrf: string, sessionid: string, sessionUuid: string, limit: number, offset: number, owner: number) {
let jar = requestPromise.jar();
jar = this.cookieJar(jar, config, 'csrftoken', csrf);
jar = this.cookieJar(jar, config, 'sessionid', sessionid);
const get = requestPromise({
uri: `${config.host}/api/v0/m/projects/?limit=${limit}&offset=${offset}&owner=${owner}`,
jar: jar,
headers: {
'X-CSRFToken': csrf,
'sessionUuid': sessionUuid
}
});
return Observable.fromPromise(get);
}
createContainer(config: any, app: any, project: any, containerType: string, groupId: number) {
let jar = requestPromise.jar();
jar = this.cookieJar(jar, config, 'csrftoken', app.csrf);
jar = this.cookieJar(jar, config, 'sessionid', app.sessionid);
const post = requestPromise({
uri: `${config.host}/api/v0/m/save/?group=${groupId}`,
method: 'POST',
jar: jar,
body: {
'Name': project.name,
'Description': project.description,
'@type': `http://www.openmicroscopy.org/Schemas/OME/2016-06#${containerType}`
},
json: true,
// formData: {
// name: encodeURIComponent(project.name),
// folder_type: project.type,
// description: encodeURIComponent(project.description),
// owner: project.owner || ''
// },
headers: {
'X-CSRFToken': app.csrf,
'sessionUuid': app.sessionUuid
}
});
return Observable.fromPromise(post);
}
annotateMap({config, app, id, annId, mapAnnotation}) {
let jar = requestPromise.jar();
jar = this.cookieJar(jar, config, 'csrftoken', app.csrf);
jar = this.cookieJar(jar, config, 'sessionid', app.sessionid);
const formData = {
project: id,
mapAnnotation: JSON.stringify(mapAnnotation)
}
if (annId) {
formData['annId'] = annId
}
const post = requestPromise({
uri: `${config.host}/webclient/annotate_map/`,
method: 'POST',
jar: jar,
formData: formData,
headers: {
'X-CSRFToken': app.csrf,
'sessionUuid': app.sessionUuid
},
resolveWithFullResponse: true
});
return Observable.fromPromise(post);
}
annotations({config, app, id}) {
//https://omero-dev.research.uts.edu.au/webclient/api/annotations/?type=map&project=2&_=1520396924499
//Return: {"annotations":
//[{"description": null, "class": "MapAnnotationI", "date": "2018-03-07T06:28:24Z", "link": {"owner": {"id": 2}, "date": "2018-03-07T06:28:24Z", "id": 5, "parent": {"id": 2, "name": "test-project", "class": "ProjectI"}, "permissions": {"canAnnotate": true, "canEdit": true, "canDelete": true, "canLink": true}}, "owner": {"id": 2}, "values": [["stash", "123123123"]], "ns": "openmicroscopy.org/omero/client/mapAnnotation", "id": 5, "permissions": {"canAnnotate": true, "canEdit": true,"canDelete": true, "canLink": true}}], "experimenters": [{"lastName": "Sacal Bonequi", "omeName": "135553", "id": 2, "firstName": "Moises"}]
//}
let jar = requestPromise.jar();
jar = this.cookieJar(jar, config, 'csrftoken', app.csrf);
jar = this.cookieJar(jar, config, 'sessionid', app.sessionid);
const get = requestPromise({
uri: `${config.host}/webclient/api/annotations/?type=map&project=${id}`,
jar: jar,
headers: {
'X-CSRFToken': app.csrf,
'sessionUuid': app.sessionUuid
}
});
return Observable.fromPromise(get);
}
images({config, app, offset, limit, owner, group, normalize}) {
let jar = requestPromise.jar();
jar = this.cookieJar(jar, config, 'csrftoken', app.csrf);
jar = this.cookieJar(jar, config, 'sessionid', app.sessionid);
const post = requestPromise({
uri: `${config.host}/api/v0/m/images/?offset=${offset}&limit=${limit}&owner=${owner}&group=${group}&normalize=${normalize}`,
method: 'GET',
jar: jar,
headers: {
'X-CSRFToken': app.csrf,
'sessionUuid': app.sessionUuid
}
});
return Observable.fromPromise(post);
}
image({config, app, imageId}) {
let jar = requestPromise.jar();
jar = this.cookieJar(jar, config, 'csrftoken', app.csrf);
jar = this.cookieJar(jar, config, 'sessionid', app.sessionid);
const post = requestPromise({
uri: `${config.host}/api/v0/m/images/${imageId}/`,
method: 'GET',
jar: jar,
headers: {
'X-CSRFToken': app.csrf,
'sessionUuid': app.sessionUuid
}
});
return Observable.fromPromise(post);
}
}
}
module.exports = new Services.OMEROService().exports();