package org.ei.drishti.web.controller; import ch.lambdaj.function.convert.Converter; import org.ei.drishti.dto.form.FormSubmissionDTO; import org.ei.drishti.event.FormSubmissionEvent; import org.ei.drishti.form.domain.FormSubmission; import org.ei.drishti.form.service.FormSubmissionConverter; import org.ei.drishti.form.service.FormSubmissionService; import org.motechproject.scheduler.gateway.OutboundEventGateway; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; import static ch.lambdaj.collection.LambdaCollections.with; import static java.text.MessageFormat.format; import static org.springframework.http.HttpStatus.*; import static org.springframework.web.bind.annotation.RequestMethod.GET; import static org.springframework.web.bind.annotation.RequestMethod.POST; @Controller public class FormSubmissionController { private static Logger logger = LoggerFactory.getLogger(FormSubmissionController.class.toString()); private FormSubmissionService formSubmissionService; private OutboundEventGateway gateway; @Autowired public FormSubmissionController(FormSubmissionService formSubmissionService, OutboundEventGateway gateway) { this.formSubmissionService = formSubmissionService; this.gateway = gateway; } @RequestMapping(method = GET, value = "/form-submissions") @ResponseBody private List<FormSubmissionDTO> getNewSubmissionsForANM(@RequestParam("anm-id") String anmIdentifier, @RequestParam("timestamp") Long timeStamp, @RequestParam(value = "batch-size", required = false) Integer batchSize) { List<FormSubmission> newSubmissionsForANM = formSubmissionService .getNewSubmissionsForANM(anmIdentifier, timeStamp, batchSize); return with(newSubmissionsForANM).convert(new Converter<FormSubmission, FormSubmissionDTO>() { @Override public FormSubmissionDTO convert(FormSubmission submission) { return FormSubmissionConverter.from(submission); } }); } @RequestMapping(method = GET, value="/all-form-submissions") @ResponseBody private List<FormSubmissionDTO> getAllFormSubmissions(@RequestParam("timestamp") Long timeStamp, @RequestParam(value = "batch-size", required = false) Integer batchSize) { List<FormSubmission> allSubmissions = formSubmissionService .getAllSubmissions(timeStamp, batchSize); return with(allSubmissions).convert(new Converter<FormSubmission, FormSubmissionDTO>() { @Override public FormSubmissionDTO convert(FormSubmission submission) { return FormSubmissionConverter.from(submission); } }); } @RequestMapping(headers = {"Accept=application/json"}, method = POST, value = "/form-submissions") public ResponseEntity<HttpStatus> submitForms(@RequestBody List<FormSubmissionDTO> formSubmissionsDTO) { try { if (formSubmissionsDTO.isEmpty()) { return new ResponseEntity<>(BAD_REQUEST); } gateway.sendEventMessage(new FormSubmissionEvent(formSubmissionsDTO).toEvent()); logger.debug(format("Added Form submissions to queue.\nSubmissions: {0}", formSubmissionsDTO)); } catch (Exception e) { logger.error(format("Form submissions processing failed with exception {0}.\nSubmissions: {1}", e, formSubmissionsDTO)); return new ResponseEntity<>(INTERNAL_SERVER_ERROR); } return new ResponseEntity<>(CREATED); } }