Changeset 1001


Ignore:
Timestamp:
Oct 27, 2010, 3:29:30 PM (6 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.

File:
1 edited

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         *
Note: See TracChangeset for help on using the changeset viewer.