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

Last change on this file since 2198 was 2198, checked in by work@…, 10 years ago
  • added getAssayData api call
  • disable validation on development and ci
File size: 4.0 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
64     * @return
65     */
66    def flattenDomainData(List 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                item['token'] = it.getToken()
77            } else {
78                item['id'] = it.id
79            }
80
81            // add subject field values
82            fields.each { field ->
83                def value = it.getFieldValue( field.name )
84
85                if (value.hasProperty('name')) {
86                    item[ field.name ] = value.name
87                } else {
88                    item[ field.name ] = value
89                }
90            }
91
92            items[ items.size() ] = item
93        }
94
95        return items
96    }
97
98    def getMeasurements(Assay assay, SecUser user) {
99        def serviceURL = "${assay.module.url}/rest/getMeasurements"
100        def serviceArguments = "assayToken=${assay.assayUUID}"
101
102        // call module method
103        def json = moduleCommunicationService.callModuleMethod(
104                assay.module.url,
105                serviceURL,
106                serviceArguments,
107                "POST",
108                user
109        );
110
111        return json
112    }
113
114    def getMeasurementData(Assay assay, SecUser user) {
115        def serviceURL = "${assay.module.url}/rest/getMeasurementData"
116        def serviceArguments = "assayToken=${assay.assayUUID}&verbose=true"
117
118        // call module method
119        def json = moduleCommunicationService.callModuleMethod(
120                assay.module.url,
121                serviceURL,
122                serviceArguments,
123                "POST",
124                user
125        );
126
127        return json
128    }
129
130    def getMeasurementMetaData(Assay assay, SecUser user) {
131        def serviceURL = "${assay.module.url}/rest/getMeasurementMetaData"
132        def serviceArguments = "assayToken=${assay.assayUUID}"
133
134        // call module method
135        def json = moduleCommunicationService.callModuleMethod(
136                assay.module.url,
137                serviceURL,
138                serviceArguments,
139                "POST",
140                user
141        );
142
143        return json
144    }
145}
Note: See TracBrowser for help on using the repository browser.