Show
Ignore:
Timestamp:
05-05-11 13:01:04 (3 years ago)
Author:
robert@…
Message:

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

Files:
1 modified

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}