/** * */ package org.ihtsdo.otf.snomed.controller; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.annotation.Resource; import org.ihtsdo.otf.refset.common.Meta; import org.ihtsdo.otf.refset.common.Result; import org.ihtsdo.otf.refset.exception.EntityNotFoundException; import org.ihtsdo.otf.snomed.domain.Concept; import org.ihtsdo.otf.snomed.service.ConceptLookupService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.wordnik.swagger.annotations.Api; import com.wordnik.swagger.annotations.ApiOperation; /** * @author Episteme Partners * */ @RestController @Api(value="Concept details look up service", description="Service to lookup concept details", position = 6) @RequestMapping("/v1.0/snomed") public class ConceptLookupController { private static final Logger logger = LoggerFactory.getLogger(ConceptLookupController.class); private static final String SUCESS = "Success"; @Resource(name = "conceptLookService") private ConceptLookupService cService; @RequestMapping( method = RequestMethod.POST, value = "/concepts", produces = MediaType.APPLICATION_JSON_VALUE , consumes = MediaType.APPLICATION_JSON_VALUE) @ApiOperation( value = "Retrieves concept details for given concept ids in good faith ie all null or empty will be ignored" ) public ResponseEntity<Result< Map<String, Object>>> getConceptDetails( @RequestBody( required = true) Set<String> conceptIds ) throws Exception { logger.debug("getConceptDetails"); Result<Map<String, Object>> response = new Result<Map<String, Object>>(); Meta m = new Meta(); m.add( linkTo( methodOn( ConceptLookupController.class ).getConceptDetails( conceptIds) ).withSelfRel() ); response.setMeta(m); Map<String, Concept> cs = cService.getConcepts(conceptIds ); Map<String, Object> data = new HashMap<String, Object>(); data.put("concepts", cs); response.setData(data); m.setMessage(SUCESS); m.setStatus(HttpStatus.OK); return new ResponseEntity<Result<Map<String,Object>>>(response, HttpStatus.OK); } @RequestMapping( method = RequestMethod.GET, value = "/concepts/{conceptId}", produces = "application/json" ) @ApiOperation( value = "Api to get details of a concept for given concept id." ) public ResponseEntity<Result< Map<String, Object>>> getConcept( @PathVariable( value = "conceptId") String conceptId ) throws Exception { logger.debug("Getting concept details for {}", conceptId); Result<Map<String, Object>> response = new Result<Map<String, Object>>(); Meta m = new Meta(); m.add( linkTo( methodOn( ConceptLookupController.class ).getConcept( conceptId ) ).withSelfRel() ); response.setMeta(m); Concept c = cService.getConcept(conceptId); if (c == null) { throw new EntityNotFoundException("No data available for given id " + conceptId); } Map<String, Object> data = new HashMap<String, Object>(); data.put("concept", c); response.setData(data); m.setMessage(SUCESS); m.setStatus(HttpStatus.OK); return new ResponseEntity<Result<Map<String,Object>>>(response, HttpStatus.OK); } @RequestMapping( method = RequestMethod.GET, value = "/concepts", produces = "application/json" ) @ApiOperation( value = "Api to get paged list of concept ids available in the systems." ) public ResponseEntity<Result< Map<String, Object>>> getConceptIds( @RequestParam( value = "page", defaultValue = "0", required = false) int page, @RequestParam( value = "size", defaultValue = "10", required = false) int size) throws Exception { logger.debug("Getting concept id list with offset as {} and limit as {}", page, size); Result<Map<String, Object>> response = new Result<Map<String, Object>>(); Meta m = new Meta(); m.add( linkTo( methodOn( ConceptLookupController.class ).getConceptIds( page, size ) ).withSelfRel() ); response.setMeta(m); Set<String> ids = cService.getConceptIds(page, size); Map<String, Object> data = new HashMap<String, Object>(); data.put("ids", ids); response.setData(data); m.setMessage(SUCESS); m.setStatus(HttpStatus.OK); return new ResponseEntity<Result<Map<String,Object>>>(response, HttpStatus.OK); } }