Changeset 901


Ignore:
Timestamp:
Sep 27, 2010, 5:04:47 PM (13 years ago)
Author:
jahn
Message:

Added and tested new Rest methods in accordance with specs.
Tested most of them. User related information is not integrated
yet. Furthermore, added new convention for refering to TemplateEntities?
by REST. For the time being, the old conventions and the new
conventions are supported in parallel. However, this should change
soon. Thus, currently externalAssayID, code, and externdaSampleID
are supported, as are assayToken, studyToken, sampleToken.

Location:
trunk/grails-app
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/controllers/RestController.groovy

    r843 r901  
    4242         */
    4343        private def auth() {
     44
    4445            credentials = BasicAuthentication.credentialsFromRequest(request)
    4546                requestUser = authService.authUser(credentials.u,credentials.p)
     
    8384        def getStudies = {
    8485                List studies = []
     86                def user = params.user
    8587                Study.findAllByOwner(requestUser).each { study ->
    86                         studies.push( [ 'externalStudyID': study.code, 'name':study.title ] )
     88                        studies.push( [ 'externalStudyID': study.code, 'name':study.title, 'studyToken':study.code ] )
    8789                }
    8890                render studies as JSON
     
    114116        * Provide a list of all assays for a given study
    115117        *
    116         * Example call of the getAssays REST resource: http://localhost:8080/gscf/rest/getAssays?externalStudyID=PPSH&moduleURL=http://localhost:8182/sam
     118        * Example call of the getAssays REST resource:
     119        * http://localhost:8080/gscf/rest/getAssays?externalStudyID=PPSH&moduleURL=http://localhost:8182/sam
    117120        *
    118121        * @param externalStudyID String The external study id (code) of the target GSCF Study object
    119122        * @param moduleURL String The base URL of the calling dbNP module
    120         * @return list of assays in the study as JSON object list, filtered to only contain assays for the specified module, with 'externalAssayID' and 'name' for each assay
     123        * @return list of assays in the study as JSON object list, filtered to only contain assays
     124        *         for the specified module, with 'externalAssayID' and 'name' for each assay
    121125        */
    122126        def getAssays = {
    123127                List assays = []
    124                 if( params.externalStudyID ) {
    125                         def study = Study.find( "from Study as s where s.code=?", [params.externalStudyID])
     128                if( params.externalStudyID || params.studyToken ) {
     129                        def id = params.studyToken ?: params.externalStudyID
     130                        def study = Study.find( "from Study as s where s.code=?", [id] )
    126131                        if(study && study.owner == requestUser) study.assays.each{ assay ->
    127132                                if (assay.module.url.equals(params.moduleURL)) {
    128                                 def map = ['name':assay.name, 'externalAssayID':assay.externalAssayID]
     133                                def map = ['name':assay.name, 'externalAssayID':assay.externalAssayID, 'assayToken':assay.externalAssayID]
    129134                                        assays.push( map )
    130135                                }
     
    167172
    168173
    169     /* this is just for testing! */
    170     /*def test = {
    171                 render( dbnp.rest.common.CommunicationManager.getQueryResultWithOperator("Insulin",">",200) )
    172     }*/
     174
     175
     176
     177        /**
     178        * REST resource for dbNP modules.
     179        *
     180        * @param studyToken String, the external identifier of the study
     181        * @return List of all fields of this study
     182        * @return
     183        *
     184        * Example REST call (without authentication):
     185    * http://localhost:8080/gscf/rest/getStudy/study?studyToken=PPSH
     186    *
     187        * Returns the JSON object:
     188        * {"title":"NuGO PPS human study","studyToken":"PPSH","startDate":"2008-01-13T23:00:00Z",
     189        * "Description":"Human study performed at RRI; centres involved: RRI, IFR, TUM, Maastricht U.",
     190        * "Objectives":null,"Consortium":null,"Cohort name":null,"Lab id":null,"Institute":null,
     191        * "Study protocol":null}
     192        */
     193        def getStudy = {
     194                def items = [:]
     195                if( params.studyToken ) {
     196                        def study = Study.find( "from Study as s where code=?",[params.studyToken])
     197                        study.giveFields().each { field ->
     198                                def name = field.name
     199                                def value = study.getFieldValue( name )
     200                                if(name=="code") { name = "studyToken" }
     201                                items[name] = value
     202                        }
     203        }
     204                render items as JSON
     205        }
     206
     207
     208
     209        /**
     210        * REST resource for dbNP modules.
     211        *
     212        * @param assayToken String, the external identifier of the study
     213        * @return List of all fields of this assay
     214        *
     215        * Example REST call (without authentication):
     216    * http://localhost:8080/gscf/rest/getAssay/assay?assayToken=PPS3_SAM
     217    *
     218        * Returns the JSON object: {"name":"Lipid profiling","module":{"class":"dbnp.studycapturing.AssayModule","id":1,
     219        * "name":"SAM module for clinical data","platform":"clinical measurements","url":"http://sam.nmcdsp.org"},
     220        * "assayToken":"PPS3_SAM","Description":null}
     221        */
     222        def getAssay = {
     223                def items = [:]
     224                if( params.assayToken ) {
     225                        def assay = Assay.find( "from Assay as a where externalAssayID=?",[params.assayToken])
     226                        assay.giveFields().each { field ->
     227                                def name = field.name
     228                                def value = assay.getFieldValue( name )
     229                                if(name=="externalAssayID") { name = "assayToken" }
     230                                items[name] = value
     231                        }
     232        }
     233                render items as JSON
     234        }
     235
     236
     237
     238        /**
     239        * REST resource for data modules.
     240        * Username and password should be supplied via HTTP Basic Authentication.
     241        * One specific sample of a given Assay.
     242        *
     243        * @param externalAssayID String (externalAssayID of some Assay in GSCF)
     244        * @return As a JSON object list, for each sample in that assay:
     245        * @return 'name' (Sample name, which is unique)
     246        * @return 'material' (Sample material)
     247        * @return 'subject' (The name of the subject from which the sample was taken)
     248        * @return 'event' (the name of the template of the SamplingEvent describing the sampling)
     249        * @return 'startTime' (the time the sample was taken relative to the start of the study, as a string)
     250        *
     251        * Example REST call (without authentication):
     252    * http://localhost:8080/gscf/rest/getSample/sam?assayToken=PPS3_SAM&sampleToken=A30_B
     253    *
     254        * Returns the JSON object:
     255        * {"subject":"A30","event":"Liver extraction","startTime":"1 week, 1 hour",
     256        * "sampleToken":"A30_B","material":{"class":"dbnp.data.Term","id":6,"accession":"BTO:0000131",
     257        * "name":"blood plasma","ontology":{"class":"Ontology","id":2}},"Remarks":null,
     258        * "Text on vial":"T70.91709057820039","Sample measured volume":null}
     259        */
     260        def getSample = {
     261                def items = [:]
     262                if( params.assayToken && params.sampleToken ) {
     263                        def assay = Assay.find( "from Assay as a where externalAssayID=?",[params.assayToken])
     264                        assay.getSamples().each { sample ->
     265                                if( sample.name == params.sampleToken ) {
     266                                        items = [
     267                                                'subject'             : sample.parentSubject.name,
     268                                                'event'               : sample.parentEvent.template.name,
     269                                                'startTime'           : sample.parentEvent.getStartTimeString()
     270                                        ]
     271                                        sample.giveFields().each { field ->
     272                                                def name = field.name
     273                                                def value = sample.getFieldValue( name )
     274                                                if(name=="name") { name = "sampleToken" }
     275                                                items[name] = value
     276                        }
     277                                }
     278                        }
     279                }
     280                render items as JSON
     281        }
    173282}
  • trunk/grails-app/domain/dbnp/studycapturing/TemplateEntity.groovy

    r897 r901  
    717717         * domain fields of this entity
    718718         */
    719         def List<TemplateField> giveFields() {
     719        def public List<TemplateField> giveFields() {
    720720                return this.giveDomainFields() + this.giveTemplateFields();
    721721        }
Note: See TracChangeset for help on using the changeset viewer.