root/trunk/grails-app/controllers/api/ApiController.groovy @ 2181

Revision 2181, 3.9 KB (checked in by work@…, 2 years ago)

- adding initial version of the API controller (which external applications can use to interface with gscf)

Line 
1/**
2 * ApiController Controler
3 *
4 * Description of my controller
5 *
6 * @author  your email (+name?)
7 * @since       2010mmdd
8 * @package     ???
9 *
10 * Revision information:
11 * $Rev$
12 * $Author$
13 * $Date$
14 */
15package api
16
17import grails.plugins.springsecurity.Secured
18import grails.converters.JSON
19import dbnp.studycapturing.Study
20import dbnp.authentication.SecUser
21
22class ApiController {
23    def authenticationService
24    def ApiService
25
26        /**
27         * index closure
28         */
29    def index = {
30        render(view:'index')
31    }
32
33    @Secured(['ROLE_CLIENT', 'ROLE_ADMIN'])
34    def authenticate = {
35        println "api::authenticate: ${params}"
36
37        // see if we already have a token on file for this device id
38        def token = Token.findByDeviceID(params.deviceID)
39
40        // generate a new token if we don't have a token on file
41        def result = [:]
42        try {
43            if (!token) {
44                // generate a token for this device
45                token = new Token(
46                        deviceID: params.deviceID,
47                        deviceToken: UUID.randomUUID().toString(),
48                        sequence: 0
49                ).save(failOnError: true)
50            }
51
52            result = ['token':token.deviceToken,'sequence':token.sequence]
53
54            // set output headers
55            response.status = 200
56        } catch (Exception e) {
57            // caught an error
58            response.status = 500
59            result = ['error':e.getMessage()]
60        }
61
62        response.contentType = 'application/json;charset=UTF-8'
63
64        if (params.containsKey('callback')) {
65            render "${params.callback}(${result as JSON})"
66        } else {
67            render result as JSON
68        }
69    }
70
71    @Secured(['ROLE_CLIENT', 'ROLE_ADMIN'])
72    def getStudies = {
73        String deviceID = (params.containsKey('deviceID')) ? params.deviceID : ''
74        String validation = (params.containsKey('validation')) ? params.validation : ''
75
76        // check
77        if (!apiService.validateRequest(deviceID,validation)) {
78            response.sendError(401, 'Unauthorized')
79        } else {
80            def user = authenticationService.getLoggedInUser()
81            def readableStudies = Study.giveReadableStudies(user)
82            def studies = []
83           
84            // iterate through studies and define resultset
85            readableStudies.each { study ->
86                // get result data
87                studies[ studies.size() ] = [
88                        'title'                 : study.title,
89                        'description'           : study.description,
90                        'subjects'              : study.subjects.size(),
91                        'species'               : study.subjects.species.collect { it.name }.unique(),
92                        'assays'                : study.assays.collect { it.module.name }.unique(),
93                        'events'                : study.events.size(),
94                        'uniqueEvents'          : study.events.collect { it.toString() }.unique(),
95                        'samplingEvents'        : study.samplingEvents.size(),
96                        'uniqueSamplingEvents'  : study.samplingEvents.collect { it.toString() }.unique(),
97                        'eventGroups'           : study.eventGroups.size(),
98                        'uniqueEventGroups'     : study.eventGroups.collect { it.name }.unique(),
99                        'samples'               : study.samples.size()
100                ]
101            }
102           
103
104            def result = [
105                    'count'     : studies.size(),
106                    'studies'   : studies
107            ]
108
109            // set output headers
110            response.status = 200
111            response.contentType = 'application/json;charset=UTF-8'
112
113            if (params.containsKey('callback')) {
114                render "${params.callback}(${result as JSON})"
115            } else {
116                render result as JSON
117            }
118        }
119    }
120}
Note: See TracBrowser for help on using the browser.