Ignore:
Timestamp:
May 5, 2011, 1:01:04 PM (6 years ago)
Author:
robert@…
Message:

Added possibility to ask for all assays for the given module (without specifying the studyToken). See #428.

File:
1 edited

Legend:

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

    r1781 r1813  
    2626class RestController {
    2727
    28        /**************************************************/
    29       /** Rest resources for Simple Assay Module (SAM) **/
    30      /**************************************************/
     28        /**************************************************/
     29        /** Rest resources for Simple Assay Module (SAM) **/
     30        /**************************************************/
    3131
    3232        def authenticationService
     
    9292
    9393        /**
    94          * REST resource for data modules.
    95          * Consumer and token should be supplied via URL parameters.
    96          * Provide a list of all studies owned by the supplied user.
     94         * REST resource for data modules.
     95         * Consumer and token should be supplied via URL parameters.
     96         * Provide a list of all studies owned by the supplied user.
    9797         *
    9898         * @param       studyToken  optional parameter. If no studyToken is given, all studies available to user are returned.
     
    137137        def getStudies = {
    138138
    139                 List returnStudies = [] 
    140                 List studies = [] 
     139                List returnStudies = []
     140                List studies = []
    141141
    142142                if( !params.studyToken ) {
     
    144144                }
    145145                else if( params.studyToken instanceof String ) {
    146                         def study = Study.findByStudyUUID( params.studyToken ) 
     146                        def study = Study.findByStudyUUID( params.studyToken )
    147147                        if( study ) {
    148148                                if( !study.canRead(authenticationService.getRemotelyLoggedInUser( params.consumer, params.token )) ) {
     
    150150                                        return false
    151151                                }
    152                                
    153                                 studies.push study 
     152
     153                                studies.push study
    154154                        } else {
    155155                                response.sendError(404)
    156156                                return false
    157157                        }
    158        
    159                 }
    160                 else { 
     158
     159                }
     160                else {
    161161                        params.studyToken.each{ studyToken ->
    162162                                def study = Study.findByStudyUUID( studyToken );
    163163                                if( study )
    164                                         studies.push study 
    165                         }
    166                 }
    167                
     164                                        studies.push study
     165                        }
     166                }
     167
    168168
    169169                studies.each { study ->
     
    173173                                if( study.canRead(authenticationService.getRemotelyLoggedInUser( params.consumer, params.token ))) {
    174174
    175                     def items = [studyToken:study.giveUUID()]
    176                     study.giveFields().each { field ->
    177                         def name = field.name
    178                         def value = study.getFieldValue( name )
    179                         items[name] = value
    180                     }
    181                                        
    182                                         // Add study version number 
     175                                        def items = [studyToken:study.giveUUID()]
     176                                        study.giveFields().each { field ->
     177                                                def name = field.name
     178                                                def value = study.getFieldValue( name )
     179                                                items[name] = value
     180                                        }
     181
     182                                        // Add study version number
    183183                                        items['version'] = study.version;
    184                                        
    185                     returnStudies.push items
    186                 }
     184
     185                                        returnStudies.push items
     186                                }
    187187                        }
    188188                }
     
    217217                def versionInfo = [:];
    218218                def study
    219                
     219
    220220                if( !params.studyToken || !(params.studyToken instanceof String)) {
    221221                        response.sendError(400)
     
    256256         */
    257257        def getSubjects = {
    258                 List subjects = [] 
     258                List subjects = []
    259259                if( params.studyToken ) {
    260                         def study = Study.findByStudyUUID( params.studyToken)
     260                        def study = Study.findByStudyUUID( params.studyToken)
    261261
    262262                        if(study) {
     
    292292         * @return list of assays in the study as JSON object list, filtered to only contain assays
    293293         *         for the specified module, with 'assayToken' and 'name' for each assay
    294          *
    295          *
    296          * Example 1. REST call without assayToken
    297          *            http://localhost:8080/gscf/rest/getAssays/aas?studyToken=PPSH
     294         *
     295         *
     296         * Example 1. REST call without assayToken
     297         *            http://localhost:8080/gscf/rest/getAssays/aas?studyToken=PPSH
    298298         *                              &consumer=http://localhost:8182/sam
    299          *
    300          * Result: [{"name":"Glucose assay after",
     299         *
     300         * Result: [{"name":"Glucose assay after",
    301301         *                      "module":{"class":"dbnp.studycapturing.AssayModule","id":1,"name":"SAM module for clinical data",
    302302         *                              "platform":"clinical measurements","url":"http://localhost:8182/sam"},
     
    306306         *                              "platform":"clinical measurements","url":"http://localhost:8182/sam"},
    307307         *                              "externalAssayID":"PPSH-Glu-B","Description":null,"parentStudyToken":"PPSH"}]
    308          *
    309          *
    310          * Example 2. REST call with one assayToken
    311          *                        http://localhost:8080/gscf/rest/getAssays/queryOneTokenz?studyToken=PPSH
     308         *
     309         *
     310         * Example 2. REST call with one assayToken
     311         *                        http://localhost:8080/gscf/rest/getAssays/queryOneTokenz?studyToken=PPSH
    312312         *                              &consumer=http://localhost:8182/sam&assayToken=PPSH-Glu-A
    313          *
     313         *
    314314         * Result: [{"name":"Glucose assay after","module":{"class":"dbnp.studycapturing.AssayModule","id":1,
    315315         *                      "name":"SAM module for clinical data","platform":"clinical measurements","url":"http://localhost:8182/sam"},
    316316         *                      "externalAssayID":"PPSH-Glu-A","Description":null,"parentStudyToken":"PPSH"}]
    317317         *
    318          *
    319          * Example 3. REST call with two assayTokens.
    320          *
    321          * Result: Same as result in Example 1.
     318         *
     319         * Example 3. REST call with two assayTokens.
     320         *
     321         * Result: Same as result in Example 1.
    322322         */
    323323        def getAssays = {
     
    325325                response.contentType = 'application/json'
    326326
    327                 List returnList = []    // return list of hashes each containing fields and values belonging to an assay 
    328 
    329                 // Check if required parameters are present 
    330                 def validCall = CommunicationManager.hasValidParams( params, "consumer", "studyToken" )
    331                 if( !validCall ) { 
     327                List returnList = []    // return list of hashes each containing fields and values belonging to an assay
     328
     329                // Check if required parameters are present
     330                def validCall = CommunicationManager.hasValidParams( params, "consumer" )
     331                if( !validCall ) {
    332332                        render "Error. Wrong or insufficient parameters." as JSON
    333333                        return
    334334                }
    335 
     335               
     336                def assays = []
     337               
    336338                if( params.studyToken ) {
    337339
    338                         def study = Study.findByStudyUUID(params.studyToken)
     340                        def study = Study.findByStudyUUID(params.studyToken)
    339341
    340342                        if(study) {
     
    345347                                }
    346348
    347                                 def assays = []
    348349                                if(params.assayToken==null) {
    349350                                        assays = study.assays
    350351                                }
    351                                 else if( params.assayToken instanceof String ) { 
     352                                else if( params.assayToken instanceof String ) {
    352353                                        def assay = study.assays.find{ it.giveUUID() == params.assayToken }
    353354                                        if( assay ) {
    354                                                  assays.push assay
     355                                                assays.push assay
    355356                                        }
    356357                                }
     
    364365                                }
    365366
    366                                 assays.each{ assay ->
    367                                         if (assay.module?.url && assay.module.url.equals(params.moduleURL)) {
    368                                                 if(assay) {
    369                                                         def map = [assayToken : assay.giveUUID()]
    370                                                         assay.giveFields().each { field ->
    371                                                                 def name = field.name
    372                                                                 def value = assay.getFieldValue( name )
    373                                                                 map[name] = value
    374                                                         }
    375                                                         map["parentStudyToken"] = assay.parent.giveUUID()
    376                                                         returnList.push( map )
    377                                                 }
    378                                         }
    379                                 }
    380                 } else {
     367                        } else {
    381368                                response.sendError(404)
    382369                                return false
    383370                        }
    384371
    385                 }
     372                } else {
     373                        // Return all assays for the given module
     374                        assays = Assay.list().findAll{ it.parent.canRead(authenticationService.getRemotelyLoggedInUser( params.consumer, params.token ) ) }
     375                }
     376
     377                // Create data for all assays
     378                assays.each{ assay ->
     379                        if (assay.module?.url && assay.module.url.equals(params.moduleURL)) {
     380                                if(assay) {
     381                                        def map = [assayToken : assay.giveUUID()]
     382                                        assay.giveFields().each { field ->
     383                                                def name = field.name
     384                                                def value = assay.getFieldValue( name )
     385                                                map[name] = value
     386                                        }
     387                                        map["parentStudyToken"] = assay.parent.giveUUID()
     388                                        returnList.push( map )
     389                                }
     390                        }
     391                }
     392
    386393                render returnList as JSON
    387394        }
     
    405412         * @return 'startTime' (the time the sample was taken relative to the start of the study, as a string)
    406413         * @return additional template fields are returned
    407          *
    408          *
    409          *
    410          * Example 1: no sampleTokens given.
     414         *
     415         *
     416         *
     417         * Example 1: no sampleTokens given.
    411418         * Query:
    412          * http://localhost:8080/gscf/rest/getSamples/query?assayToken=PPSH-Glu-A
    413          *
     419         * http://localhost:8080/gscf/rest/getSamples/query?assayToken=PPSH-Glu-A
     420         *
    414421         * Result:
    415          * [{"sampleToken":"5_A","material":"blood plasma","subject":"5","event":"Blood extraction","startTime":"4 days, 6 hours"},
     422         * [{"sampleToken":"5_A","material":"blood plasma","subject":"5","event":"Blood extraction","startTime":"4 days, 6 hours"},
    416423         * {"sampleToken":"6_A","material":"blood plasma","subject":"6","event":"Blood extraction","startTime":"4 days, 6 hours"},
    417424         * {"sampleToken":"10_A","material":"blood plasma","subject":"10","event":"Blood extraction","startTime":"4 days, 6 hours"},
     
    424431         * {"sampleToken":"7_A","material":"blood plasma","subject":"7","event":"Blood extraction","startTime":"4 days, 6 hours"},
    425432         * {"sampleToken":"3_A","material":"blood plasma","subject":"3","event":"Blood extraction","startTime":"4 days, 6 hours"}]
    426          *
    427          *
    428          *
    429          * Example 2: one sampleToken given.
     433         *
     434         *
     435         *
     436         * Example 2: one sampleToken given.
    430437         * Query:
    431438         * http://localhost:8080/gscf/rest/getSamples/query?assayToken=PPSH-Glu-A&sampleToken=5_A
    432          *
    433          * Result:
     439         *
     440         * Result:
    434441         * [{"sampleToken":"5_A","material":"blood plasma","subject":"5","event":"Blood extraction","startTime":"4 days, 6 hours"}]
    435          *
    436          *
    437          *
    438          * Example 3: two sampleTokens given.
     442         *
     443         *
     444         *
     445         * Example 3: two sampleTokens given.
    439446         * Query:
    440447         * http://localhost:8080/gscf/rest/getSamples/query?assayToken=PPSH-Glu-A&sampleToken=5_A&sampleToken=6_A
    441          *
    442          * Result:
     448         *
     449         * Result:
    443450         * [{"sampleToken":"5_A","material":"blood plasma","subject":"5","event":"Blood extraction","startTime":"4 days, 6 hours"},
    444451         *  {"sampleToken":"6_A","material":"blood plasma","subject":"6","event":"Blood extraction","startTime":"4 days, 6 hours"}]
    445452         *
    446453         *
    447          * Example 4: no assaytoken given
     454         * Example 4: no assaytoken given
    448455         * Query:
    449456         * http://localhost:8080/gscf/rest/getSamples/query?sampleToken=5_A&sampleToken=6_A
    450          *
    451          * Result:
     457         *
     458         * Result:
    452459         * [{"sampleToken":"5_A","material":"blood plasma","subject":"5","event":"Blood extraction","startTime":"4 days, 6 hours"},
    453460         *  {"sampleToken":"6_A","material":"blood plasma","subject":"6","event":"Blood extraction","startTime":"4 days, 6 hours"}]
     
    458465                def samples
    459466                if( params.assayToken ) {
    460                         def assay = Assay.findByAssayUUID( params.assayToken );
     467                        def assay = Assay.findByAssayUUID( params.assayToken );
    461468
    462469                        if( assay )  {
     
    466473                                        return false
    467474                                }
    468                                
     475
    469476                                samples = assay.getSamples() // on all samples
    470477                        } else {
     
    478485                        samples = studies*.getSamples().flatten();
    479486                }
    480                
     487
    481488                // Check whether only a subset of samples should be returned
    482489                if( params.sampleToken ) {
    483490                        def sampleTokens = params.list( "sampleToken" );
    484                         samples = samples.findAll { sampleTokens.contains( it.giveUUID() ) } 
     491                        samples = samples.findAll { sampleTokens.contains( it.giveUUID() ) }
    485492                }
    486493
    487494                samples.each { sample ->
    488495
    489                         def item = [ 
    490                                 'sampleToken' : sample.giveUUID(),
    491                                 'material'        : sample.material?.name,
    492                                 'subject'         : sample.parentSubject?.name,
    493                                 'event'           : sample.parentEvent?.template?.name,
    494                                 'startTime'       : sample.parentEvent?.getStartTimeString()
    495                         ]
     496                        def item = [
     497                                                'sampleToken' : sample.giveUUID(),
     498                                                'material'        : sample.material?.name,
     499                                                'subject'         : sample.parentSubject?.name,
     500                                                'event'           : sample.parentEvent?.template?.name,
     501                                                'startTime'       : sample.parentEvent?.getStartTimeString()
     502                                        ]
    496503
    497504                        sample.giveFields().each { field ->
     
    514521                                        }
    515522                                }
    516                                 item['eventObject'] = eventHash 
     523                                item['eventObject'] = eventHash
    517524                        }
    518525
     
    527534                                        }
    528535                                }
    529                                 item['subjectObject'] = subject 
    530                         }
    531 
    532                         items.push item 
     536                                item['subjectObject'] = subject
     537                        }
     538
     539                        items.push item
    533540                }
    534541
     
    552559        def getAuthorizationLevel = {
    553560                if( params.studyToken ) {
    554                         def study = Study.findByStudyUUID(params.studyToken)
     561                        def study = Study.findByStudyUUID(params.studyToken)
    555562
    556563                        if( !study ) {
     
    571578                        return false
    572579                }
    573     }
     580        }
    574581}
Note: See TracChangeset for help on using the changeset viewer.