From eba31f6d06631f152d4cf045f8c40fe4545f8711 Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Tue, 28 Aug 2018 12:54:41 +0200 Subject: [PATCH 1/2] dev documentation updated --- README.md | 656 ++++++------------------------------------------------ 1 file changed, 64 insertions(+), 592 deletions(-) diff --git a/README.md b/README.md index b568921a6..0f06b593e 100644 --- a/README.md +++ b/README.md @@ -1,636 +1,108 @@ [![build status](https://git-r3lab.uni.lu/piotr.gawron/minerva/badges/master/build.svg)](https://git-r3lab.uni.lu/piotr.gawron/minerva/commits/master) -# Rest API (version 11) +# For users +Documentation for minerva can be found here: https://minerva.pages.uni.lu/doc/ -## Introduction +# For developers -Rest API is located in /api/ path of the deployed application. For instance, Rest API of pdmap project that can be browsed using http://pdmap.uni.lu/minerva/ will be located here: http://pdmap.uni.lu/minerva/api/ +## Installation -Rest API tries to follow [API Design Guide](https://cloud.google.com/apis/design/) by Google. - -All API calls (except login) must include MINERVA_AUTH_TOKEN obtained due login process. - -## Quickstart guide - -To use API first we need to login: -`curl -X POST -c - --data "login=anonymous&password=" http://pg-sandbox.uni.lu/minerva/api/doLogin` +After cloning repo you need to install following tools: +* postgresql (>=9.1) +* tomcat (tested on tomcat7) +* Java8 - works on both OpenJDK 8 and Oracle Java 8 +* maven +* ant +* node.js + npm +You need to create user and database: ``` - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed -100 55 0 55 0 0 1774 0 --:--:-- --:--:-- --:--:-- 1774{"info":"Login successful. TOKEN returned as a cookie"}# Netscape HTTP Cookie File -# https://curl.haxx.se/docs/http-cookies.html -# This file was generated by libcurl! Edit at your own risk. - -localhost FALSE / FALSE 1496934071 MINERVA_AUTH_TOKEN xxxxxxxx +username: map_viewer +password: 123qweasdzxc +dbname: map_viewer ``` -The response creates an authentication token and puts it into a cookie `MINERVA_AUTH_TOKEN=xxxxxxxx`. When using console curl command this cookie must be attached to every query that follows. -When we have authentication token we can access information about december release of PD map project: -` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/ -` -## Specification +If you want to use different credentials or your database in not hosted locally you can configure it by creating file `/etc/minerva/db.properties`. Template of the file can be found here: https://git-r3lab.uni.lu/minerva/core/blob/master/persist/src/main/resources/db.properties -### Authentication -* Login: - * URL: `/doLogin` - * Method: POST - * Parameters: - * `login` - user login, 'anonymous' can be used for accessing api with guest account access level - * `password` - user passwod, for guest account this field is optional - * Output. If login operation is successfull then `MINERVA_AUTH_TOKEN` cookie will be created with authentication token. If credentails are invalid response with `403` status code will be returned. Token will be valid for the next 120 minutes. - * Example: -``` -curl -X POST -c - --data "login=anonymous&password=" http://pg-sandbox.uni.lu/minerva/api/doLogin -``` +Database schema is managed automatically by [flyway](https://flywaydb.org/), so there is no need to populate the database with anything. -* Logout: - * URL: `/doLogout` - * Method: POST - * Parameters: *NONE* - * Example: +Now your dev environment is configured and ready to use. To test it you can run unit tests: +* back-end - go to one of the Java modules (ie 'persist') and call mvn test: ``` -curl -X POST -c - http://pg-sandbox.uni.lu/minerva/api/doLogout +cd ~/workspace/minerva/commons/ +mvn test ``` - - -### Configuration -* URL: `/configuration/` -* Method: GET -* Parameters: *NONE* -* Output: List of all minerva configuration details. -* Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/configuration/ +* front-end - go to module with front-end, install all npm dependencies and run tests: ``` - -### Genomics -* URL: `/genomics/taxonomies/{organismId}/genomeTypes/{type}/versions/{version}/` -* Method: GET -* Parameters: - * `organismId` - identifier of the organism in taxonomy db - * `type` - type of genome (database from which reference genome should be used), for now only UCSC is supported - * `version` - version of the reference genome -* Example: +cd ~/workspace/minerva/frontend-js/ +npm install +npm test ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/genomics/taxonomies/9606/genomeTypes/UCSC/versions/hg19/ -``` -### Projects +## Build -* Project data: - * URL: `/projects/{projectId}/` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/ -``` - -* Source file: - * URL: `/projects/{projectId}:downloadSource` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_jun16:downloadSource --output some.file -``` - -#### (sub)Maps -* List of (sub)maps in a project - * URL: `/projects/{projectId}/models/` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" "http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/models/" -``` - -* Download map as a model file (ie. in CellDesigner format) - * URL: `/projects/{projectId}/models/{modelId}:downloadModel` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project - * `handlerClass` - class preparing model file. For list of all possible values check `/configuration/` response. - * `polygonString` (\*) - polygon defining part of the model for downloading - * See also `/configuration/` query to get list of possible formats - * Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" "http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/models/15305:downloadModel?handlerClass=lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser" --output some.file -``` - -* Download map as an image - * URL: `/projects/{projectId}/models/{modelId}:downloadImage` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project - * `handlerClass` - class preparing image file. For list of all possible values check `/configuration/` response. - * `backgroundOverlayId` (\*) - identifier of the overlay used as a background overlay when creating image - * `overlayIds` (\*) - comma separated list of overlay identifiers that should be included in the image - * `zoomLevel` (\*) - zoom level at which image should be generated (min value used by default) - * `polygonString` (\*) - polygon defining part of the model for downloading - * See also `/configuration/` query to get list of possible formats - * Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" "http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/models/15305:downloadImage?handlerClass=lcsb.mapviewer.converter.graphics.PngImageGenerator" --output some.file -``` - -* Elements: - * URL: `/projects/{projectId}/models/{modelId}/bioEntities/elements/` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project or wildcard '*' character - * `columns` (\*) - set of columns (optional). Possible values are: id, modelId, name, type, description, symbol, complexId, compartmentId, fullName, abbreviation, formula, name, synonyms, formerSymbols, references, bounds, hierarchyVisibilityLevel, - * `ids` (\*)- set of database ids (optional) - * Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/models/*/bioEntities/elements/?columns=id,name,type -``` - -* Reactions: - * URL: `/projects/{projectId}/models/{modelId}/bioEntities/reactions/` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project or wildcard '*' character - * `columns` (\*) - set of columns. Possible values are: id, reactionId, modelId, type, lines, centerPoint, products, reactants, modifiers, hierarchyVisibilityLevel, notes - * `ids` (\*) - set of database ids - * `participantId` (\*) - identifier of the element that should be part of the reaction - * Example: +To build `*.war` file that can be deployed on tomcat you need to call ant maven-build task: ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/models/*/bioEntities/reactions/?columns=id,name,type -``` - -* Search: - * URL: `/projects/{projectId}/models/{modelId}/bioEntities:search` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project or wildcard '*' character - * `query` (\*) - search term identifing bioEntity - * `coordinates` (\*) - coordinates where bioEntity should be located - * `count` (\*) - max number of bioEntities to return - * `perfectMatch` (\*) - true when true query must be matched exactly, if false similar results are also acceptable - * Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/models/*/bioEntities:search?query=SNCA -``` - -* Suggested search queries: - * URL: `/projects/{projectId}/models/{modelId}/bioEntities/suggestedQueryList` - * Method: GET - * Output: List of suggested queries for search mechanism. - * Parameters: - * `projectId` - identifier of the project - * Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/models/*/bioEntities/suggestedQueryList -``` - - -#### Chemicals -* URL: `/projects/{projectId}/chemicals:search` -* Method: GET -* Parameters: - * `projectId` - identifier of the project - * `columns` (\*) - set of columns for each result. Possible values are: name, references, description, directEvidenceReferences, directEvidence, synonyms, id, targets, - * `query` (\*) - chemical name - * `target` (\*) - target for which we are lookig for chemicals. Target is defined as TYPE:ID. For example "ALIAS:534" is searching for chemicals that target Alias with id=534. -* Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" "http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/chemicals:search?query=rotenone" -``` - -#### Comments -* List comments - * URL: `/projects/{projectId}/comments/models/{modelId}/` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project or wildcard '*' character - * `columns` (\*) - set of columns for each result. Possible values are: title, type, content, removed, coord, modelId, elementId, id, pinned, author, email, - * `removed` (\*) - if defined then removed paramter must match. - * Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" "http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/comments/models/*/" -``` - -* Reaction comments - * URL: `/projects/{projectId}/comments/models/{modelId}/bioEntities/reactions/{reactionId}` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project or wildcard '*' character - * `reactionId` - identifier of the reaction - * `columns` (\*) - set of columns for each result. Possible values are: title, type, content, removed, coord, modelId, elementId, id, pinned, author, email, - * `removed` (\*) - if defined then removed paramter must match. - * Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/comments/models/15305/bioEntities/reactions/187811/ -``` - -* Element comments - * URL: `/projects/{projectId}/comments/models/{modelId}/bioEntities/elements/{elementId}` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project or wildcard '*' character - * `elementId` - identifier of the element - * `columns` (\*) - set of columns for each result. Possible values are: title, type, content, removed, coord, modelId, elementId, id, pinned, author, email, - * `removed` (\*) - if defined then removed paramter must match. - * Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/comments/models/15305/bioEntities/elements/431868/ -``` - -* Point comments - * URL: `/projects/{projectId}/comments/models/{modelId}/points/{coordinates}` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project or wildcard '*' character - * `coordinates` - coordinates of the point on (sub)map - * `columns` (\*) - set of columns for each result. Possible values are: title, type, content, removed, coord, modelId, elementId, id, pinned, author, email, - * `removed` (\*) - if defined then removed paramter must match. - * Example: TODO - -* Create element comment - * URL: `/projects/{projectId}/comments/models/{modelId}/bioEntities/elements/{elementId}` - * Method: POST - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project - * `elementId` - identifier of the element to be commented - * `name` - name of the author - * `email` - email of the author - * `content` - content of the comment - * `pinned` (\*) - when true comment will be visible for others, if false then nobody except of admin will see it - * `coordinates` - coordinates where comment is placed - * Example: -``` -curl -X POST --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" --data "name=testComment&email=a@a.pl&content=someCont&coordinates=1,2" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/comments/models/15305/bioEntities/elements/431868/ -``` - -* Create reaction comment - * URL: `/projects/{projectId}/comments/models/{modelId}/bioEntities/reactions/{reactionId}` - * Method: POST - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project - * `reactionId` - identifier of the reaction - * `name` - name of the author - * `email` - email of the author - * `content` - content of the comment - * `pinned` (\*) - when true comment will be visible for others, if false then nobody except of admin will see it - * `coordinates` - coordinates where comment is placed - * Example: -``` -curl -X POST --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" --data "name=testComment&email=a@a.pl&content=someCont&coordinates=1,2" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/comments/models/15305/bioEntities/reactions/187811 -``` - - -* Create coordinates comment - * URL: `/projects/{projectId}/comments/models/{modelId}/points/{coordinates}` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project - * `name` - name of the author - * `email` - email of the author - * `content` - content of the comment - * `pinned` (\*) - when true comment will be visible for others, if false then nobody except of admin will see it - * `coordinates` - coordinates where comment is placed - * Example: -``` -curl -X POST --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" --data "name=testComment&email=a@a.pl&content=someCont" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/comments/models/15305/points/1.00,2.00 -``` - -#### Drugs -* URL: `/projects/{projectId}/drugs:search` -* Method: GET -* Parameters: - * `projectId` - identifier of the project - * `columns` (\*) - set of columns for each result. Possible values are: name, references, description, bloodBrainBarrier, brandNames, synonyms, id, targets, - * `query` (\*) - drug name or synonym - * `target` (\*) - target for which we are lookig for drugs. Target is defined as TYPE:ID. For example "ALIAS:534" is searching for drugs that target Alias with id=534. -* Example: +cd ~/workspace/minerva/ +ant maven-build ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/drugs:search?query=aspirin -``` - -#### MiRNAs - -* URL: `/projects/{projectId}/miRnas:search` -* Method: GET -* Parameters: - * `projectId` - identifier of the project - * `columns` (\*) - set of columns for each result. Possible values are: name, id, targets, - * `query` (\*) - mirna id - * `target` (\*) - target for which we are lookig for drugs. Target is defined as TYPE:ID. For example "ALIAS:534" is searching for drugs that target Alias with id=534. -* Example: +This will create `~/workspace/minerva/web/target/web-1.0.war` file which can be deployed on tomcat: ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/miRnas:search?query=hsa-miR-125a-3p -``` - - -#### Publications - -* URL: `/projects/{projectId}/models/{modelId}/publications/` -* Method: GET -* Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project or wildcard '\*' character - * `start` (\*) - first element to be return when pagination is on (default 0) - * `length` (\*) - how many publication we want to retrieve (default 10) - -* Example: +cp ~/workspace/minerva/web/target/web-1.0.war $CATALINA_HOME/webapps/minerva.war ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/models/*/publications/ -``` -#### Data overlays -* List user data overlays - * URL: `/projects/{projectId}/overlays/` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * Example: +After starting tomcat you can access minerva using http://localhost:8080/minerva/. +Default credentials are: ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/overlays/ -``` - -* Add overlay - * URL: `/projects/{projectId}/overlays/` - * Method: POST - * Parameters: - * `projectId` - identifier of the project - * `name` - name of the data overlay - * `content` - content of the file that is uploaded with definition what should be visible where - * `description` - short desription of the data overlay - * `filename` - name of the file that should be used when downloading the source - * Example: +login: admin +password: admin ``` -curl -X POST --data "content=name%09color%0ACAPN1%09%2300FF00%0APARK7%09%23AC0000&description=test%20desc&filename=test.txt&name=test%20nam" --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/overlays/ -``` -* Update overlay - * URL: `/projects/{projectId}/overlays/{overlayId}/` - * Method: PATCH - * Parameters: - * `projectId` - identifier of the project - * `overlayId` - identifier of data overlay - * Body: json with updated overlay +## Deployment and release +Before making new release update [changelog file](https://git-r3lab.uni.lu/minerva/core/blob/master/CHANGELOG). -{ -  "overlay": { -    "name" : name, -    "description" : description -  } -} - - * Example: +### Debian packages +When all the changes are ready tag commit and push it to the repository. Gitlab ci will execute unit tests and prepare distribution files that can be released. For now we release minerva using debian repository. Therefore gitlab ci creates a deb package (for instance: https://git-r3lab.uni.lu/minerva/core/-/jobs/29918). This package should be uploaded to our repository: ``` -curl -X PATCH --data "{\"overlay\":{\"name\":\"test\", \"description\":\"test2\"}}" --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/overlays/3203/ -``` - -* Remove overlay - * URL: `/projects/{projectId}/overlays/{overlayId}/` - * Method: DELETE - * Parameters: - * `projectId` - identifier of the project - * `overlayId` - identifier of data overlay - * Example: +echo 'PUT minerva_12.0.3_amd64.deb'| sftp -P 8022 repo-r3lab.lcsb.uni.lu +ssh repo 'sudo reprepro -b /var/www/html/debian includedeb test minerva_12.0.3_amd64.deb' ``` -curl -X DELETE --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/overlays/3203/ -``` -* Download source - * URL: `/projects/{projectId}/overlays/{overlayId}:downloadSource` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `overlayId` - identifier of data overlay - * Example: -``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/overlays/3203:downloadSource -``` +Remember to use proper repository: +* stable - for production ready debian packages +* test - for packages that are ready to test and probably will be moved to stable soon +* experimental - for packages that might crash, can be unstable are created during development process (anything that has `alpha`, `beta` in the version number should be put here) -* Data overlay details - * URL: `/projects/{projectId}/overlays/{overlayId}/` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `overlayId` - identifier of data overlay - * Example: +Moreover we store all debian packages on webdav: ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/overlays/3203/ -``` - -* bioEntities (Elements and reactions) - * URL: `/projects/{projectId}/overlays/{overlayId}/models/{modelId}/bioEntities/` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `overlayId` - identifier of data overlay - * Example: +echo 'put minerva_12.0.3_amd64.deb' | cadaver https://webdav-r3lab.uni.lu/public/minerva/ ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/overlays/3203/models/*/bioEntities/ -``` -* Reaction - * URL: `/projects/{projectId}/overlays/{overlayId}/models/{modelId}/bioEntities/reactions/{reactionId}/` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project - * `overlayId` - identifier of data overlay - * `reactionId` - identifier of the reaction - * Example: +### Docker image +There is [Dockerfile]( https://git-r3lab.uni.lu/minerva/core/blob/master/Docker/Dockerfile) that allows to build Docker image from currently released debian package. After releasing debian package crete a Docker image and deploy it: ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/overlays/3203/models/15305/bioEntities/reactions/187811/ -``` - -* Element - * URL: `/projects/{projectId}/overlays/{overlayId}/models/{modelId}/bioEntities/elements/{elementId}/` - * Method: GET - * Parameters: - * `projectId` - identifier of the project - * `modelId` - identifier of the (sub)map in the project - * `overlayId` - identifier of data overlay - * `elementId` - identifier of the element - * Example: +cd ~/workspace/minerva/Docker/ +docker build --no-cache -t minerva . ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/projects/pdmap_dec15/overlays/3203/models/15305/bioEntities/elements/431433/ -``` - -### Users -* User data - * URL: `/users/{login}/` - * Method: GET - * Parameters: - * `login` - user login - * Example: +Check list of docker images to find DOCKER ID ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/users/testAdmin -``` - -### Conversion - -Conversion API provides access to MINERVA's ability convert between different systems biology -network formats and to export of layouts to different graphical formats. +docker images -* Conversion to systems biology formats - * List available formats - * URL: `/convert/` - * Method: GET or POST - * Example: - * Output: List of input and output format identifiers which can be used as values for the `sourceFormat` and `targetFormat` parameters in other convert API calls +REPOSITORY TAG IMAGE ID CREATED SIZE +minerva latest 26a9534e37ff About an hour ago 1.223 GB +debian jessie bb5d89f9b6cb 13 days ago 125.1 MB ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/convert/ -``` - - * Convert network from an input format to an output format - * URL: `/convert/{sourceFromat}:{tagetFormat}/` - * Method: POST - * Parameters: - * `sourceFromat` - input format (list of available formats be obtained from the `/convert/` API) - * `tagetFormat` - input format (list of available formats be obtained from the `/convert/` API) - * Body: the input file to be converted - * Example: +Tag docker image (assume that your docker ID is "26a9534e37ff" and version is 9999) and push it to repo: ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" --data-binary @cell_designer.xml -H "Content-Type: text/plain" http://pg-sandbox.uni.lu/minerva/api/convert/CellDesigner_SBML:SBML -``` - -* Conversion to image - * List available formats - * URL: `/convert/image/` - * Method: GET or POST - * Output: List of input and output format identifiers which can be used as values for the `sourceFormat` and `targetFormat` parameters in other convert API calls - * Example: +docker tag 26a9534e37ff docker-r3lab.uni.lu/minerva/minerva:9999 +docker login https://docker-r3lab.uni.lu/ +docker push docker-r3lab.uni.lu/minerva/minerva ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" http://pg-sandbox.uni.lu/minerva/api/convert/image/ -``` - * Convert network from an input format to an output image - * URL: `/convert/image/{sourceFromat}:{tagetFormat}/` - * Method: POST - * Parameters: - * `sourceFromat` - input format (list of available formats be obtained from the `/convert/image/` API) - * `tagetFormat` - input format (list of available formats be obtained from the `/convert/image/` API) - * Body: the input file to be converted - * Example: +### VirtualBox images +We provide also VirtualBox images with minerva installed on it. Just create a new debian virtual box image and upload it to webdav: ``` -curl -X GET --cookie "MINERVA_AUTH_TOKEN=xxxxxxxx" --data-binary @cell_designer.xml -H "Content-Type: text/plain" http://pg-sandbox.uni.lu/minerva/api/convert/image/CellDesigner_SBML:SVG +echo 'put minerva-12.0.1_release.ova' | cadaver https://webdav-r3lab.uni.lu/public/minerva/ ``` -# JavaScript API. Unstable dev API. - -Minerva visualization is created by including `minerva.js` and calling `minerva.create({element:divElement})` method. This method returns a Promise which will resolve to the object that allows custom JS manipulation. - -## Specification - -* `getVisibleDataOverlays()` - * Description: Returns a Promise with list of visible overlays - * Arguments: *NONE* - * Example: -``` -customMap.getVisibleDataOverlays().then(function(overlays){console.log(overlays);}); -``` -* `addListener({dbOverlayName, type, callback})` - * Description: Adds a listener to database connector like drug database. - * Arguments: - * dbOverlayName - string representing database for which we want to register listener, available databases are: `search`, `drug`, `chemical`, `mirna`, `comment` - * type - type of the event, supported db Events are: `onSearch` - * callback - callback method - * Example -``` -customMap.addListener({dbOverlayName:"search",type:"onSearch", callback:function(res){console.log(res);}}); -``` -* `getHighlightedBioEntities(dbOverlayName)` - * Description: returns a promise with list of elements that are currently highlight by the specufuc database - * Arguments: dbOverlayName - string representing database for which we want to register listener, available databases are: `search`, `drug`, `chemical`, `mirna`, `comment` - * Example: -``` -customMap.getHighlightedBioEntities("search").then(function(elements){console.log(elements);}); -``` -* `getProject()` - * Description: Returns object with information about visualized disease map project. - * Arguments: NONE - * Example: -``` -customMap.getProject() -``` -* `getConfiguration()` - * Description: Returns a promise with configuration information obtained from server. Configuration information include configuration options (like default visible map), supported formats, etc. - * Arguments: NONE - * Example: -``` -customMap.getConfiguration().then(function(configuration){console.log(configuration);}); -``` -* `getAllBioEntities()` - * Arguments: NONE - * Example: -``` -customMap.getAllBioEntities().then(function(bioEntities){console.log(bioEntities);}); -``` -* `getBioEntityById({id, modelId, type})` - * Arguments: TODO - * Example: -``` -TODO -``` - -* `getReactionsWithElement(element)` - * Arguments: TODO - * Example: -``` -TODO -``` - -* `showBioEntity({element, type, options})` - * Arguments: - * element - object identifying the element, it should contain three fields: id, type, model; where id is the element id, type is type of the element ('ALIAS', 'REACTION'), and model define submap on which it's defined - * type - how do you want to visualize BioEntity: 'ICON', 'SURFACE' - * options - set of visualization options: color, opacity, lineColor, lineWeight, lineOpacity - * Example: -``` -customMap.showBioEntity({element:{id:18306,type:"ALIAS", modelId:5}, type: "SURFACE", options:{color:"#FF0000"}}); -``` - -* `hideBioEntity({element, type})` - * Arguments: - * element - object identifying the element, it should contain three fields: id, type, model; where id is the element id, type is type of the element ('ALIAS', 'REACTION'), and model define submap on which it's defined - * type - which visualization of BioEntity you want to hide: 'ICON', 'SURFACE' - * Example: -``` -customMap.hideBioEntity({element:{id:18306,type:"ALIAS", modelId:5}, type: "SURFACE"}); -``` - -* `setCenter({modelId, x, y})` - * Arguments: TODO - * Example: -``` -TODO -``` - -* `fitBounds({modelId, x1, y1, x2, y2})` - * Arguments: TODO - * Example: -``` -TODO -``` - -* `setCenter({modelId, x, y})` - * Arguments: TODO - * Example: -``` -TODO -``` - +Image should have root account with `123qweasdzxc` password. It should also expose port 8080 on the host. -- GitLab From e9c408cc5654289fd269189ed0007aa8ffa88443 Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Wed, 14 Nov 2018 15:09:44 +0100 Subject: [PATCH 2/2] old doc files removed --- doc/description.txt | 3 -- doc/general.vsd | Bin 125440 -> 0 bytes doc/installation.txt | 99 ------------------------------------------- 3 files changed, 102 deletions(-) delete mode 100644 doc/description.txt delete mode 100644 doc/general.vsd delete mode 100644 doc/installation.txt diff --git a/doc/description.txt b/doc/description.txt deleted file mode 100644 index c0335cd3b..000000000 --- a/doc/description.txt +++ /dev/null @@ -1,3 +0,0 @@ -MINERVA (Molecular Mnteraction NEtwoRk VisuAlization) platform is a standalone webserver for visualization, exploration and management of molecular networks encoded in SBGN-compliant format. After installation, the resource is used and managed via a webbrowser, under the default address 'http://localhost:8080/minerva/'. You can configure your Tomcat server later to change the address. - - diff --git a/doc/general.vsd b/doc/general.vsd deleted file mode 100644 index 04328b72263876148969ace37181b2c39215e2d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125440 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 HNs<2nrtVvk diff --git a/doc/installation.txt b/doc/installation.txt deleted file mode 100644 index eaf346084..000000000 --- a/doc/installation.txt +++ /dev/null @@ -1,99 +0,0 @@ -Here is a short description how to install the software. Example commands are designed for Debian. - -1. Requirements - a) java (at least 1.8, but it must be oracle implementation, with sun implementation there are some problems): - > echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list - > echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list - > apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886 apt-get update - > apt-get update - > apt-get install oracle-java8-installer - - b) tomcat (7.x): - > wget http://apache.mirrors.pair.com/tomcat/tomcat-7/v7.0.61/bin/apache-tomcat-7.0.61.tar.gz - > tar -zxf apache-tomcat-7.0.61.tar.gz - > mv apache-tomcat-7.0.61 /opt/ - > chown -R localadmin:localadmin /opt/apache-tomcat-7.0.61 - - c) postgres (9.3 or higher): - > echo deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main >/etc/apt/sources.list.d/pgdg.list - > wget https://www.postgresql.org/media/keys/ACCC4CF8.asc - > apt-key add ACCC4CF8.asc - > apt-get update - > apt-get install postgresql - -2. Installation - a) Setup database. Let assume that we have a dump of empty db in the default directory: ~/map_viewer.sql. - Dump of current version can be found in repository: MapViewer/script/db/map_viewer_date.rar. - We need user 'map_viewer' with password '123qweasdzxc' and a database map_viewer. - - > #create user and db - > su - postgres - > createuser -d -r -s map_viewer - > echo "ALTER USER map_viewer WITH PASSWORD '123qweasdzxc';"| psql - > - > #create db - > createdb -O map_viewer map_viewer - > exit - > - > #change hba_conf: - > cp /etc/postgresql/9.4/main/pg_hba.conf /etc/postgresql/9.4/main/pg_hba.conf.bac - > cat /etc/postgresql/9.4/main/pg_hba.conf.bac |grep -v "all[ \t]*peer" >/etc/postgresql/9.4/main/pg_hba.conf - > printf "local all all md5\n" >>/etc/postgresql/9.4/main/pg_hba.conf - > /etc/init.d/postgresql restart - > - > echo "localhost:5432:*:map_viewer:123qweasdzxc" > .pgpass - > chmod 0600 .pgpass - > #unrar db schema - > rar x map_viewer_2014_07_22.rar - > #and copy it into db - > psql -U map_viewer -f map_viewer.sql map_viewer - - b) copy of MapViewer.war deploy file into tomcat webapps - > cp MapViewer.war /opt/apache-tomcat-7.0.57/webapps/ - - c) start tomcat - > /opt/apache-tomcat-7.0.57/bin/startup.sh - - This will setup the software on the machine on the port 8080 (default tomcat port) inthe MapViewer folder. Assuming that you use localhost the url should be something like this: - http://localhost:8080/MapViewer/. - - There is one more thing. Generatnig map requires some libraries for awt that are missing by default installation. Therefore we need to modify catalina.sh scritp in tomcat and add this option: - CATALINA_OPTS="$CATALINA_OPTS -Djava.awt.headless=true" - -3. Installataion of ajp connector for apache (to be able to connect to the map from default 80 port): - - a) install apache - > apt-get install apache2 - - b) install mod_jk - > apt-get install libapache2-mod-jk - - c) configure module if necessary: - > #vi /etc/libapache2-mod-jk/workers.properties - - d) remove xhtml from mod_mime mapping: - > vi /etc/apache2/sites-available/default - - add line like this: - - RemoveType xhtml - - e) add mounting tomcat to the directories - - > vi /etc/apache2/sites-available/default - - add lines: - - JkMount /map_images/ ajp13_worker - JkMount /map_images/* ajp13_worker - JkMount /MapViewer/ ajp13_worker - JkMount /MapViewer ajp13_worker - JkMount /MapViewer/* ajp13_worker - - f) turn on the module - > a2enmod jk - - g) restart apache - > /etc/init.d/apache2 restart - - \ No newline at end of file -- GitLab