diff --git a/grails-app/controllers/org/transmartproject/rest/ExportController.groovy b/grails-app/controllers/org/transmartproject/rest/ExportController.groovy index 4fdf130..cb94575 100644 --- a/grails-app/controllers/org/transmartproject/rest/ExportController.groovy +++ b/grails-app/controllers/org/transmartproject/rest/ExportController.groovy @@ -3,9 +3,9 @@ package org.transmartproject.rest import grails.validation.Validateable import groovy.json.JsonException import groovy.json.JsonSlurper -import org.apache.commons.lang.NullArgumentException import org.springframework.beans.factory.annotation.Autowired import org.transmartproject.core.exceptions.InvalidArgumentsException +import org.transmartproject.core.exceptions.NoSuchResourceException import org.transmartproject.db.RestExportService class ExportController { @@ -26,34 +26,11 @@ class ExportController { } /**GET request on /export/datatypes - * Returns datatypes and patient number of given concepts. + * Returns datatypes and list with subjects of given concepts. * */ - def datatypes(){ - def jsonSlurper = new JsonSlurper() - if (!(params.containsKey('concepts'))){ - throw new NoSuchElementException( - "No parameter named concepts." - ) - } - def test = params.get('concepts').decodeURL() - try { - def concept_arguments = jsonSlurper.parseText(test) - if (concept_arguments==null){ - throw new NullArgumentException( - "Parameter concepts has no value." - ) - } - List datatypes = [] - concept_arguments.each { it -> - List conceptKeysList = it.conceptKeys - datatypes += restExportService.getDataTypes(conceptKeysList) - } - respond(restExportService.formatDataTypes(datatypes)) - } catch(JsonException e){ - "Given value was non valid JSON." - } - + def datatypes() throws NoSuchResourceException { + respond restExportService.retrieveDataTypes(params) } private void throwIfInvalid(command) { diff --git a/grails-app/controllers/org/transmartproject/rest/PatientSetController.groovy b/grails-app/controllers/org/transmartproject/rest/PatientSetController.groovy index 5dde00c..113cd58 100644 --- a/grails-app/controllers/org/transmartproject/rest/PatientSetController.groovy +++ b/grails-app/controllers/org/transmartproject/rest/PatientSetController.groovy @@ -34,7 +34,10 @@ class PatientSetController { * GET /patient_sets */ def index() { - respond queriesResource.getQueryResultsSummaryByUsername(currentUser.getUsername() ) + String noPatients = "There are no saved patient sets by $currentUser.username" + def patientSets = queriesResource.getQueryResultsSummaryByUsername(currentUser.getUsername() ) + patientSets = patientSets == null ? noPatients : patientSets + respond patientSets } /** diff --git a/src/groovy/org/transmartproject/rest/marshallers/DataTypeSerializationHelper.groovy b/src/groovy/org/transmartproject/rest/marshallers/DataTypeSerializationHelper.groovy new file mode 100644 index 0000000..14aa5b9 --- /dev/null +++ b/src/groovy/org/transmartproject/rest/marshallers/DataTypeSerializationHelper.groovy @@ -0,0 +1,31 @@ +package org.transmartproject.rest.marshallers + +import org.transmartproject.export.Datatypes + +class DataTypeSerializationHelper extends AbstractHalOrJsonSerializationHelper{ + + final Class targetType = Datatypes + final String collectionName = 'datatypes' + + @Override + Map convertToMap(Datatypes datatypes) { + def cohortInfoList = [] + def cohortsMap = [:] + datatypes.OntologyTermsMap.each { ID, terms -> + terms.collect { term -> + if (ID in cohortsMap.keySet()) { + cohortsMap[ID].add([subjects: term.patients.collect({ it.id }), conceptPath: term.fullName]) + } else { + cohortsMap[ID] = [[subjects: term.patients.collect({ it.id }), conceptPath: term.fullName]] + } + } + } + cohortsMap.each{ key, value -> + cohortInfoList.add([concepts:value]) + } + def datatypeMap = [dataType:datatypes.dataType, + dataTypeCode: datatypes.dataTypeCode, + cohorts:cohortInfoList] + } + +} diff --git a/test/functional/org/transmartproject/rest/ExportTests.groovy b/test/functional/org/transmartproject/rest/ExportTests.groovy index 416d5dc..ed6a604 100644 --- a/test/functional/org/transmartproject/rest/ExportTests.groovy +++ b/test/functional/org/transmartproject/rest/ExportTests.groovy @@ -1,7 +1,6 @@ package org.transmartproject.rest -import org.codehaus.groovy.grails.web.mime.MimeType - +import org.codehaus.groovy.grails.web.json.JSONArray import static org.hamcrest.MatcherAssert.assertThat import static org.hamcrest.Matchers.* @@ -10,8 +9,7 @@ class ExportTests extends ResourceTestCase{ String version = "v1" - private static final String JSON_CONCEPTS_DATATYPES_URI = "%5B%7B%22conceptKeys%22%3A+%5B%22%5C%5C%5C%5Ci2b2+main%5C%5Cfoo%5C%5Cstudy1%5C%5Cbar%5C%5C%22%5D%7D%2C+%7B%22conceptKeys%22%3A+%5B%22%5C%5C%5C%5Ci2b2+main%5C%5Cfoo%5C%5Cstudy2%5C%5Clong+path%5C%5C%22%2C+%22%5C%5C%5C%5Ci2b2+main%5C%5Cfoo%5C%5Cstudy2%5C%5Csex%5C%5C%22%5D%7D%5D" - + private static final String JSON_CONCEPTS_DATATYPES_URI = "%7B%22cohorts%22%3A%20%5B%7B%22conceptKeys%22%3A%20%5B%22%5C%5C%5C%5Ci2b2%20main%5C%5Cfoo%5C%5Cstudy1%5C%5Cbar%5C%5C%22%5D%7D%2C%20%7B%22conceptKeys%22%3A%20%5B%22%5C%5C%5C%5Ci2b2%20main%5C%5Cfoo%5C%5Cstudy2%5C%5Clong%20path%5C%5C%22%2C%20%22%5C%5C%5C%5Ci2b2%20main%5C%5Cfoo%5C%5Cstudy2%5C%5Csex%5C%5C%22%5D%7D%5D%7D" void testDataTypes() { get("${baseURL}$version/export/datatypes", { concepts=JSON_CONCEPTS_DATATYPES_URI }) assertStatus 200 @@ -22,7 +20,7 @@ class ExportTests extends ResourceTestCase{ hasEntry('dataTypeCode', 'mrna'), hasEntry(is('cohorts'), contains(allOf( hasEntry(is('concepts'), contains(allOf( - hasEntry('numOfPatients', 0), + hasEntry(is('subjects'), contains(-101)), hasEntry('conceptPath', "\\foo\\study1\\bar\\") ))) ))), @@ -31,17 +29,16 @@ class ExportTests extends ResourceTestCase{ hasEntry('dataType', 'Clinical data'), hasEntry('dataTypeCode', 'clinical'), hasEntry(is('cohorts'), contains(allOf( - hasEntry(is('concepts'), allOf( - contains( + hasEntry(is('concepts'), contains( allOf( - hasEntry('numOfPatients', 0), + hasEntry(is('subjects'), is(JSONArray.class)), hasEntry('conceptPath', "\\foo\\study2\\long path\\") ), allOf( - hasEntry('numOfPatients', 0), + hasEntry(is('subjects'), containsInAnyOrder(-201, -202)), hasEntry('conceptPath', "\\foo\\study2\\sex\\") )) - )) + ) ))), ) )))