Changeset 1001

Show
Ignore:
Timestamp:
27-10-10 15:29:30 (3 years ago)
Author:
j.saito@…
Message:

Ticket 57. Merged getSample and getSamples into one REST resource.
getSamples can now be called with zero, one, or more than one sampleTokens
to be returned.

Files:
1 modified

Legend:

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

    r996 r1001  
    173173        } 
    174174 
    175  
    176         /** 
    177          * REST resource for data modules. 
    178          * Username and password should be supplied via HTTP Basic Authentication. 
     175        /** 
     176         * REST resource for data modules. 
    179177         * Provide all samples of a given Assay. The result is an enriched list with additional information for each sample. 
    180178         * 
    181179         * @param       assayToken      String (assayToken of some Assay in GSCF) 
     180         * @param       sampleToken Optional parameter. One or more sampleTokens to specify what sample to give exectly.  
     181         *                      If not given, return all samples for specified assay. 
    182182         * @param       consumer        consumer name of the calling module 
    183183         * @param       token           token for the authenticated user (e.g. session_id) 
     
    188188         * @return 'event' (the name of the template of the SamplingEvent describing the sampling) 
    189189         * @return 'startTime' (the time the sample was taken relative to the start of the study, as a string) 
     190         *  
     191         *  
     192         *  
     193         * Example 1: no sampleTokens given. 
     194         * Query:  
     195         * http://localhost:8080/gscf/rest/getSamples/query?assayToken=PPSH-Glu-A 
     196         *  
     197         * Result:  
     198         * [{"sampleToken":"5_A","material":"blood plasma","subject":"5","event":"Blood extraction","startTime":"4 days, 6 hours"}, 
     199         * {"sampleToken":"6_A","material":"blood plasma","subject":"6","event":"Blood extraction","startTime":"4 days, 6 hours"}, 
     200         * {"sampleToken":"10_A","material":"blood plasma","subject":"10","event":"Blood extraction","startTime":"4 days, 6 hours"}, 
     201         * {"sampleToken":"2_A","material":"blood plasma","subject":"2","event":"Blood extraction","startTime":"4 days, 6 hours"}, 
     202         * {"sampleToken":"11_A","material":"blood plasma","subject":"11","event":"Blood extraction","startTime":"4 days, 6 hours"}, 
     203         * {"sampleToken":"1_A","material":"blood plasma","subject":"1","event":"Blood extraction","startTime":"4 days, 6 hours"}, 
     204         * {"sampleToken":"9_A","material":"blood plasma","subject":"9","event":"Blood extraction","startTime":"4 days, 6 hours"}, 
     205         * {"sampleToken":"4_A","material":"blood plasma","subject":"4","event":"Blood extraction","startTime":"4 days, 6 hours"}, 
     206         * {"sampleToken":"8_A","material":"blood plasma","subject":"8","event":"Blood extraction","startTime":"4 days, 6 hours"}, 
     207         * {"sampleToken":"7_A","material":"blood plasma","subject":"7","event":"Blood extraction","startTime":"4 days, 6 hours"}, 
     208         * {"sampleToken":"3_A","material":"blood plasma","subject":"3","event":"Blood extraction","startTime":"4 days, 6 hours"}] 
     209         *  
     210         *  
     211         *  
     212         * Example 2: one sampleToken given. 
     213         * Query:  
     214         * http://localhost:8080/gscf/rest/getSamples/query?assayToken=PPSH-Glu-A&sampleToken=5_A 
     215         *  
     216         * Result:  
     217         * [{"sampleToken":"5_A","material":"blood plasma","subject":"5","event":"Blood extraction","startTime":"4 days, 6 hours"}] 
     218         *  
     219         *  
     220         *  
     221         * Example 3: two sampleTokens given. 
     222         * Query:  
     223         * http://localhost:8080/gscf/rest/getSamples/query?assayToken=PPSH-Glu-A&sampleToken=5_A 
     224         *  
     225         * Result:  
     226         * [{"sampleToken":"5_A","material":"blood plasma","subject":"5","event":"Blood extraction","startTime":"4 days, 6 hours"}, 
     227         *  {"sampleToken":"6_A","material":"blood plasma","subject":"6","event":"Blood extraction","startTime":"4 days, 6 hours"}] 
    190228         */ 
    191229        def getSamples = { 
     
    194232                        def assay = Assay.find( "from Assay as a where externalAssayID=?",[params.assayToken]) 
    195233                        if( assay )  { 
    196                                 assay.getSamples().each { sample -> 
    197                                         def item = [  
    198                                                 'sampleToken' : sample.name, 
    199                                                 'material'        : sample.material?.name, 
    200                                                 'subject'         : sample.parentSubject?.name, 
    201                                                 'event'           : sample.parentEvent?.template?.name, 
    202                                                 'startTime'       : sample.parentEvent?.getStartTimeString() 
    203                                         ] 
    204                                         items.push item  
     234                                if( params.sampleToken ) { 
     235                                        def sampleTokens = (params.sampleToken instanceof String) ?  
     236                                                [params.sampleToken] : params.sampleToken 
     237                                                assay.getSamples().each { sample -> 
     238                                                if( sampleTokens.find{ it == sample.name } ) { 
     239                                                        println "adding" 
     240                                                        def item = [  
     241                                                                'sampleToken' : sample.name, 
     242                                                                'material'        : sample.material?.name, 
     243                                                                'subject'         : sample.parentSubject?.name, 
     244                                                                'event'           : sample.parentEvent?.template?.name, 
     245                                                                'startTime'       : sample.parentEvent?.getStartTimeString() 
     246                                                        ] 
     247                                                        items.push item  
     248                                                } 
     249                                        } 
     250                                } 
     251                                else { 
     252                                        assay.getSamples().each { sample -> 
     253                                                def item = [  
     254                                                        'sampleToken' : sample.name, 
     255                                                        'material'        : sample.material?.name, 
     256                                                        'subject'         : sample.parentSubject?.name, 
     257                                                        'event'           : sample.parentEvent?.template?.name, 
     258                                                        'startTime'       : sample.parentEvent?.getStartTimeString() 
     259                                                ] 
     260                                                items.push item  
     261                                        } 
    205262                                } 
    206263                        } 
     
    287344 
    288345        /** 
    289          * REST resource for data modules. 
    290          * Username and password should be supplied via HTTP Basic Authentication. 
    291          * One specific sample of a given Assay. 
    292          * 
    293          * @param       assayToken      String (id of some Assay in GSCF) 
    294          * @param       consumer        consumer name of the calling module 
    295          * @param       token           token for the authenticated user (e.g. session_id) 
    296          * @return As a JSON object list, for each sample in that assay: 
    297          * @return 'name' (Sample name, which is unique) 
    298          * @return 'material' (Sample material) 
    299          * @return 'subject' (The name of the subject from which the sample was taken) 
    300          * @return 'event' (the name of the template of the SamplingEvent describing the sampling) 
    301          * @return 'startTime' (the time the sample was taken relative to the start of the study, as a string) 
    302          * 
    303          * Example REST call (without authentication): 
    304      * http://localhost:8080/gscf/rest/getSample/sam?assayToken=PPS3_SAM&sampleToken=A30_B 
    305      * 
    306          * Returns the JSON object: 
    307          * {"subject":"A30","event":"Liver extraction","startTime":"1 week, 1 hour", 
    308          * "sampleToken":"A30_B","material":{"class":"dbnp.data.Term","id":6,"accession":"BTO:0000131", 
    309          * "name":"blood plasma","ontology":{"class":"Ontology","id":2}},"Remarks":null, 
    310          * "Text on vial":"T70.91709057820039","Sample measured volume":null} 
    311          */ 
    312         def getSample = { 
    313                 def items = [:] 
    314                 if( params.assayToken && params.sampleToken ) { 
    315                         def assay = Assay.find( "from Assay as a where externalAssayID=?",[params.assayToken]) 
    316                         if(assay) { 
    317                                 assay.getSamples().each { sample -> 
    318                                         if( sample.name == params.sampleToken ) { 
    319                                                         items = [  
    320                                                         'subject'             : sample.parentSubject.name, 
    321                                                         'event'               : sample.parentEvent.template.name, 
    322                                                         'startTime'           : sample.parentEvent.getStartTimeString() 
    323                                                         ] 
    324                                                         sample.giveFields().each { field -> 
    325                                                         def name = field.name 
    326                                                         def value = sample.getFieldValue( name ) 
    327                                                         items[name] = value 
    328                                 } 
    329                                         } 
    330                                 } 
    331                         } 
    332                 } 
    333                 render items as JSON 
    334         } 
    335  
    336         /** 
    337346         * Returns the authorization level the user has for a given study. 
    338347         *