Changeset 2202

Show
Ignore:
Timestamp:
30-03-12 19:22:29 (2 years ago)
Author:
work@…
Message:

- updated api specification
- added in-code documentation
- added try/catch block to getMeasurementDataForAssay API call to check for valid module REST implementation

Location:
trunk/grails-app
Files:
2 modified

Legend:

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

    r2201 r2202  
    3131    } 
    3232 
     33    /** 
     34     * authenticate with the api using HTTP_BASIC authentication 
     35     * 
     36     * This means 
     37     * 1. the client should send the HTTP_BASIC authentication header 
     38     *    which is an md5 hash of the username + password concatenated: 
     39     * 
     40     *    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 
     41     * 
     42     * 2. the user used to authenticate with the API should have 
     43     *    the ROLE_CLIENT role 
     44     * 
     45     * @param string deviceID 
     46     */ 
    3347    @Secured(['ROLE_CLIENT', 'ROLE_ADMIN']) 
    3448    def authenticate = { 
     
    7286    } 
    7387 
     88    /** 
     89     * get all readable studies 
     90     * 
     91     * @param string deviceID 
     92     * @param string validation md5 sum 
     93     */ 
    7494    def getStudies = { 
    7595        println "api::getStudies: ${params}" 
     
    124144    } 
    125145 
     146    /** 
     147     * get all subjects for a study 
     148     * 
     149     * @param string deviceID 
     150     * @param string studyToken 
     151     * @param string validation md5 sum 
     152     */ 
    126153    def getSubjectsForStudy = { 
    127154        println "api::getSubjectsForStudy: ${params}" 
     
    163190    } 
    164191 
     192    /** 
     193     * get all assays for a study 
     194     * 
     195     * @param string deviceID 
     196     * @param string studyToken 
     197     * @param string validation md5 sum 
     198     */ 
    165199    def getAssaysForStudy = { 
    166200        println "api::getAssaysForStudy: ${params}" 
     
    202236    } 
    203237 
     238    /** 
     239     * get all samples for an assay 
     240     * 
     241     * @param string deviceID 
     242     * @param string assayToken 
     243     * @param string validation md5 sum 
     244     */ 
    204245    def getSamplesForAssay = { 
    205246        println "api::getSamplesForAssay: ${params}" 
     
    242283    } 
    243284 
     285    /** 
     286     * get all measurement data from a linked module for an assay 
     287     * 
     288     * @param string deviceID 
     289     * @param string assayToken 
     290     * @param string validation md5 sum 
     291     */ 
    244292    def getMeasurementDataForAssay = { 
    245293        println "api:getMeasurementDataForAssay: ${params}" 
     
    267315 
    268316            // iterate through measurementData and build data matrix 
    269             measurementData.each { data -> 
    270                 if (!matrix.containsKey(data.sampleToken)) matrix[ data.sampleToken ] = [:] 
    271                 matrix[ data.sampleToken ][ data.measurementToken ] = data.value 
    272             } 
    273  
    274             // define result 
    275             def result = [ 
    276                 'count'         : matrix.size(), 
    277                 'measurements'  : matrix 
    278             ] 
    279  
    280             // set output headers 
    281             response.status = 200 
    282             response.contentType = 'application/json;charset=UTF-8' 
    283  
    284             if (params.containsKey('callback')) { 
    285                 render "${params.callback}(${result as JSON})" 
    286             } else { 
    287                 render result as JSON 
     317            try { 
     318                measurementData.each { data -> 
     319                    if (!matrix.containsKey(data.sampleToken)) matrix[data.sampleToken] = [:] 
     320                    matrix[data.sampleToken][data.measurementToken] = data.value 
     321                } 
     322 
     323                // define result 
     324                def result = [ 
     325                        'count'         : matrix.size(), 
     326                        'measurements'  : matrix 
     327                ] 
     328 
     329                // set output headers 
     330                response.status = 200 
     331                response.contentType = 'application/json;charset=UTF-8' 
     332 
     333                if (params.containsKey('callback')) { 
     334                    render "${params.callback}(${result as JSON})" 
     335                } else { 
     336                    render result as JSON 
     337                } 
     338            } catch (Exception e) { 
     339                response.sendError(500, "module '${assay.module}' does not properly implement getMeasurementData REST specification (${e.getMessage()})") 
    288340            } 
    289341        } 
  • trunk/grails-app/views/api/index.gsp

    r2201 r2202  
    532532<h2>example reply</h2> 
    533533<blockquote> 
    534 ...todo... 
     534    { 
     535    "count": 
     536    14, 
     537    "measurements": 
     538    { 
     539    "07378e29-3233-4e3f-b4ea-007f9f9b1317": 
     540    { 
     541    "Fat Depot": 
     542    310 
     543    }, 
     544    "198183b1-d402-4f24-9c5a-396f79bb6a55": 
     545    { 
     546    "Fat Depot": 
     547    1918 
     548    }, 
     549    "2c719340-eb7f-4a70-8527-c64cc74dc542": 
     550    { 
     551    "Fat Depot": 
     552    1039 
     553    }, 
     554    "4861fc77-1320-4401-b18a-66b1cd67d2c8": 
     555    { 
     556    "Fat Depot": 
     557    411 
     558    }, 
     559    "4edff5ad-c3af-41da-8efe-87f5a018912a": 
     560    { 
     561    "Fat Depot": 
     562    368 
     563    }, 
     564    "6bfe2a0d-3af0-4ed8-8144-56840e934f6e": 
     565    { 
     566    "Fat Depot": 
     567    456 
     568    }, 
     569    "775666dd-05b1-4f35-ac9c-d36f8257eb1a": 
     570    { 
     571    "Fat Depot": 
     572    2075 
     573    }, 
     574    "7e9930bc-ec8c-4e74-bd2b-49d6c852eeda": 
     575    { 
     576    "Fat Depot": 
     577    945 
     578    }, 
     579    "a4d16db8-49f2-4dc2-81bb-910e574c804a": 
     580    { 
     581    "Fat Depot": 
     582    311 
     583    }, 
     584    "a556b145-dd37-4568-92f1-e3a251653276": 
     585    { 
     586    "Fat Depot": 
     587    1150 
     588    }, 
     589    "c180d727-8d6c-4673-a5fd-1c28f04b8aaa": 
     590    { 
     591    "Fat Depot": 
     592    347 
     593    }, 
     594    "e888b1b1-1dc8-45ed-8196-00338fa3b36f": 
     595    { 
     596    "Fat Depot": 
     597    1387 
     598    }, 
     599    "f7392df1-a754-4957-a1d0-c98bbb91080d": 
     600    { 
     601    "Fat Depot": 
     602    318 
     603    }, 
     604    "fc755220-b2b4-43ed-adf8-e4323fc62b55": 
     605    { 
     606    "Fat Depot": 
     607    1308 
     608    } 
     609    } 
     610    } 
    535611</blockquote> 
    536612</p>