source: trunk/grails-app/services/api/ApiService.groovy @ 2199

Last change on this file since 2199 was 2199, checked in by work@…, 10 years ago
  • implemented getSamplesForAssay api call
File size: 4.3 KB
Line 
1/**
2 * ApiService Service
3 *
4 * Description of my service
5 *
6 * @author  your email (+name?)
7 * @since       2010mmdd
8 * @package     ???
9 *
10 * Revision information:
11 * $Rev: 1430 $
12 * $Author: work@osx.eu $
13 * $Date: 2011-01-21 21:05:36 +0100 (Fri, 21 Jan 2011) $
14 */
15package api
16
17import java.security.MessageDigest
18import dbnp.studycapturing.Assay
19import dbnp.authentication.SecUser
20
21class ApiService implements Serializable {
22    // the shared secret used to validate api calls
23    static final String API_SECRET = "th!s_sH0uld^Pr0bab7y_m0v3_t%_th3_uSeR_d0Ma!n_ins7ead!"
24    static transactional = false
25    def moduleCommunicationService
26
27    /**
28     * validate a client request by checking the validation checksum
29     * @param deviceID
30     * @param validation
31     * @return
32     */
33    def validateRequest(String deviceID, String validation) {
34        // disable validation check on development and ci
35        if (['development', 'ci'].contains(grails.util.GrailsUtil.environment)) {
36            return true
37        }
38
39        // get token for this device ID
40        Token token = Token.findByDeviceID(deviceID)
41
42        // increase sequence
43        if (token) {
44            token.sequence = token.sequence+1
45            token.save()
46
47            // generate the validation checksum
48            MessageDigest digest = MessageDigest.getInstance("MD5")
49            String validationSum = new BigInteger(1,digest.digest("${token.deviceToken}${token.sequence}${API_SECRET}".getBytes())).toString(16).padLeft(32,"0")
50
51            // check if the validation confirms
52            return (validation == validationSum)
53        } else {
54            // no such token, re-authenticate
55            return false
56        }
57    }
58
59    /**
60     * flatten domain data to relevant data to return in an api
61     * call and not to expose domain internals
62     *
63     * @param elements (List or Set)
64     * @return
65     */
66    def flattenDomainData(elements) {
67        def items = []
68
69        // iterate through elements
70        elements.each {
71            def fields  = it.giveFields()
72            def item    = [:]
73
74            // add token
75            if (it.respondsTo('getToken')) {
76                // some domain methods implement getToken...
77                item['token'] = it.getToken()
78            } else if (it.respondsTo('giveUUID')) {
79                // ...while other implement giveUUID
80                item['token'] = it.giveUUID()
81            } else {
82                // and others don't at all... :S
83                item['id'] = it.id
84            }
85
86            // add subject field values
87            fields.each { field ->
88                def value = it.getFieldValue( field.name )
89
90                if (value.hasProperty('name')) {
91                    item[ field.name ] = value.name
92                } else {
93                    item[ field.name ] = value
94                }
95            }
96
97            items[ items.size() ] = item
98        }
99
100        return items
101    }
102
103    def getMeasurements(Assay assay, SecUser user) {
104        def serviceURL = "${assay.module.url}/rest/getMeasurements"
105        def serviceArguments = "assayToken=${assay.assayUUID}"
106
107        // call module method
108        def json = moduleCommunicationService.callModuleMethod(
109                assay.module.url,
110                serviceURL,
111                serviceArguments,
112                "POST",
113                user
114        );
115
116        return json
117    }
118
119    def getMeasurementData(Assay assay, SecUser user) {
120        def serviceURL = "${assay.module.url}/rest/getMeasurementData"
121        def serviceArguments = "assayToken=${assay.assayUUID}&verbose=true"
122
123        // call module method
124        def json = moduleCommunicationService.callModuleMethod(
125                assay.module.url,
126                serviceURL,
127                serviceArguments,
128                "POST",
129                user
130        );
131
132        return json
133    }
134
135    def getMeasurementMetaData(Assay assay, SecUser user) {
136        def serviceURL = "${assay.module.url}/rest/getMeasurementMetaData"
137        def serviceArguments = "assayToken=${assay.assayUUID}"
138
139        // call module method
140        def json = moduleCommunicationService.callModuleMethod(
141                assay.module.url,
142                serviceURL,
143                serviceArguments,
144                "POST",
145                user
146        );
147
148        return json
149    }
150}
Note: See TracBrowser for help on using the repository browser.