Summary Table

Categories Total Count
PII 0
URL 0
DNS 0
EKL 0
IP 0
PORT 0
VsID 0
CF 0
AI 0
VPD 0
PL 0
Other 0

File Content

package gov.va.med.pbm.ampl.controller;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Optional;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import gov.va.med.pbm.ampl.asset.mock.AllergyData;
import gov.va.med.pbm.ampl.asset.mock.AppointmentData;
import gov.va.med.pbm.ampl.asset.mock.ConsultsData;
import gov.va.med.pbm.ampl.asset.mock.ImmunizationData;
import gov.va.med.pbm.ampl.asset.mock.MeasurementData;
import gov.va.med.pbm.ampl.asset.mock.PatientData;
import gov.va.med.pbm.ampl.asset.mock.ProblemData;
import gov.va.med.pbm.ampl.asset.mock.ProgressNoteData;
import gov.va.med.pbm.ampl.constant.AmplConstants;
import gov.va.med.pbm.ampl.constant.MockDataConstants;
import gov.va.med.pbm.ampl.constant.RestUriConstants;
import gov.va.med.pbm.ampl.model.Allergy;
import gov.va.med.pbm.ampl.model.Appointment;
import gov.va.med.pbm.ampl.model.Consult;
import gov.va.med.pbm.ampl.model.Immunization;
import gov.va.med.pbm.ampl.model.Measurement;
import gov.va.med.pbm.ampl.model.Problem;
import gov.va.med.pbm.ampl.model.ProgressNote;
import gov.va.med.pbm.ampl.model.patientdemographics.PatientDetails;
import gov.va.med.pbm.ampl.utility.ESAPIValidationType;
import gov.va.med.pbm.ampl.utility.ESAPIValidator;
import gov.va.med.pbm.ampl.utility.NumberUtility;
import gov.va.med.pbm.ampl.utility.operations.PagingOperation;
import gov.va.med.pbm.ampl.utility.operations.SearchOperation;
import gov.va.med.pbm.ampl.utility.operations.SortOperation;
import gov.va.med.pbm.ampl.utility.operations.comparator.AmplComparator;

/**
*
* This Controller class consists exclusively of methods that support the RESTful service for a patient.
*
* @author Asli Goncer
* @author AJ Magdub
* @author Ian Meinert
* @author David Overstreet
* @since 1.0
*
*/
@RestController
@RequestMapping(value = "/int/v1/patients", produces = { "application/json" })
public class EnvironmentInternalController implements IBaseController {

/**
* Get method mapped end point to return a {@link PatientDetails}.
*
* @param patientId ID of patient to return
* @param sort comma-delimited list of field[value] pairs to filter results
* @param search comma-delimited list of field, {@link AmplComparator}, value string to filter results
* @param size number of results to return per page. Default is 1
* @param page for paging, the page of size results to return. default is 1.
* @return
*/
@Override
@GetMapping(RestUriConstants.GET_ROOT)
public ResponseEntity<Object> getPatientById(@PathVariable("patientId") String patientId,
@RequestParam("sort") Optional<String> sort, @RequestParam("search") Optional<String> search,
@RequestParam("size") Optional<Integer> size, @RequestParam("page") Optional<Integer> page) {

PatientDetails patientDetails = new PatientDetails();

PatientData data = new PatientData(ESAPIValidator.validateStringInput(patientId,ESAPIValidationType.CROSS_SITE_SCRIPTING_REFLECTED));
patientDetails = data.testPatient();

return ResponseEntity.status(HttpStatus.OK).body(patientDetails);
}

/**
* Get method mapped to return a collection of {@link PatientAllergy} for a {@link PatientDetails}.
*
* @param patientId ID of patient to return
* @param sort comma-delimited list of field[value] pairs to filter results
* @param search comma-delimited list of field, {@link AmplComparator}, value string to filter results
* @param size size number of results to return per page. Default is 25
* @param page for paging, the page of size results to return. default is 1.
* @return
*/
@Override
@GetMapping(RestUriConstants.GET_ALLERGIES)
public ResponseEntity<Object> getAllergiesByPatientId(@PathVariable("patientId") String patientId,
@RequestParam("sort") Optional<String> sort, @RequestParam("search") Optional<String> search,
@RequestParam("size") Optional<Integer> size, @RequestParam("page") Optional<Integer> page) {

Collection<Allergy> allergies = new ArrayList<Allergy>();
SearchOperation<Allergy> searchOperation = new SearchOperation<Allergy>();
SortOperation<Allergy> sortOperation = new SortOperation<Allergy>();
PagingOperation<Allergy> pagingOperation = new PagingOperation<Allergy>();

searchOperation.setSearchParams(search.isPresent() ? search.get() : new String());
sortOperation.setSortParams(sort.isPresent() ? sort.get() : new String());

if (!size.isPresent()) {
size = Optional.of(AmplConstants.DEFAULT_PAGE_SIZE);
}

pagingOperation.setPage(!page.isPresent() ? 1 : page.get());
pagingOperation.setSize(size.get());

AllergyData data = new AllergyData(ESAPIValidator.validateStringInput(patientId,ESAPIValidationType.CROSS_SITE_SCRIPTING_REFLECTED));
allergies = data.testAllergiesForPatient(NumberUtility.randomBetween(0, MockDataConstants.FIFTEEN));
allergies = searchOperation.search(allergies);
allergies = sortOperation.sort(allergies);
allergies = data.sortAllergyAssessments(allergies);

allergies = pagingOperation.paginate(allergies);

return ResponseEntity.status(HttpStatus.OK).body(allergies);
}

/**
* Get method mapped to return a collection of {@link ProgressNote} for a {@link PatientDetails}.
*
* @param patientId ID of patient to return
* @param sort comma-delimited list of field[value] pairs to filter results
* @param search comma-delimited list of field, {@link AmplComparator}, value string to filter results
* @param size number of results to return per page. Default is 25
* @param page for paging, the page of size results to return. default is 1.
* @return
*/
@Override
@GetMapping(RestUriConstants.GET_PROGRESS_NOTES)
public ResponseEntity<Object> getProgressNotesByPatientId(@PathVariable("patientId") String patientId,
@RequestParam("sort") Optional<String> sort, @RequestParam("search") Optional<String> search,
@RequestParam("size") Optional<Integer> size, @RequestParam("page") Optional<Integer> page) {

Collection<ProgressNote> progressNotes = new ArrayList<ProgressNote>();
SearchOperation<ProgressNote> searchOperation = new SearchOperation<ProgressNote>();
SortOperation<ProgressNote> sortOperation = new SortOperation<ProgressNote>();
PagingOperation<ProgressNote> pagingOperation = new PagingOperation<ProgressNote>();

searchOperation.setSearchParams(search.isPresent() ? search.get() : new String());
sortOperation.setSortParams(sort.isPresent() ? sort.get() : new String());

if (!size.isPresent()) {
size = Optional.of(AmplConstants.DEFAULT_PAGE_SIZE);
}

pagingOperation.setPage(!page.isPresent() ? 1 : page.get());
pagingOperation.setSize(size.get());

ProgressNoteData data = new ProgressNoteData(ESAPIValidator.validateStringInput(patientId,ESAPIValidationType.CROSS_SITE_SCRIPTING_REFLECTED));
progressNotes = searchOperation
.search(data.testProgressNotesForPatient(NumberUtility.randomBetween(0, MockDataConstants.ONE_HUNDRED)));
progressNotes = sortOperation.sort(progressNotes);
progressNotes = pagingOperation.paginate(progressNotes);

return ResponseEntity.status(HttpStatus.OK).body(progressNotes);
}

/**
* Get method mapped to return a collection of {@link Consult} for a {@link PatientDetails}.
*
* @param patientId ID of patient to return
* @param sort comma-delimited list of field[value] pairs to filter results
* @param search comma-delimited list of field, {@link AmplComparator}, value string to filter results
* @param size number of results to return per page. Default is 25
* @param page for paging, the page of size results to return. default is 1.
* @return
*/
@Override
@GetMapping(RestUriConstants.GET_CONSULTS)
public ResponseEntity<Object> getConsultsByPatientId(@PathVariable("patientId") String patientId,
@RequestParam("sort") Optional<String> sort, @RequestParam("search") Optional<String> search,
@RequestParam("size") Optional<Integer> size, @RequestParam("page") Optional<Integer> page) {

Collection<Consult> consults = new ArrayList<Consult>();
SearchOperation<Consult> searchOperation = new SearchOperation<Consult>();
SortOperation<Consult> sortOperation = new SortOperation<Consult>();
PagingOperation<Consult> pagingOperation = new PagingOperation<Consult>();

searchOperation.setSearchParams(search.isPresent() ? search.get() : new String());
sortOperation.setSortParams(sort.isPresent() ? sort.get() : new String());

if (!size.isPresent()) {
size = Optional.of(AmplConstants.DEFAULT_PAGE_SIZE);
}

pagingOperation.setPage(!page.isPresent() ? 1 : page.get());
pagingOperation.setSize(size.get());

ConsultsData data = new ConsultsData(ESAPIValidator.validateStringInput(patientId,ESAPIValidationType.CROSS_SITE_SCRIPTING_REFLECTED));
consults = searchOperation
.search(data.testConsultsForPatient(NumberUtility.randomBetween(0, MockDataConstants.ONE_HUNDRED)));
consults = sortOperation.sort(consults);
consults = pagingOperation.paginate(consults);

return ResponseEntity.status(HttpStatus.OK).body(consults);
}

/**
* Get method mapped to return a collection of {@link Immunization} for a {@link PatientDetails}.
*
* @param patientId ID of patient to return
* @param sort comma-delimited list of field[value] pairs to filter results
* @param search comma-delimited list of field, {@link AmplComparator}, value string to filter results
* @param size number of results to return per page. Default is 25
* @param page for paging, the page of size results to return. default is 1.
* @return
*/
@Override
@GetMapping(RestUriConstants.GET_IMMUNIZATIONS)
public ResponseEntity<Object> getImmunizationsByPatientId(@PathVariable("patientId") String patientId,
@RequestParam("sort") Optional<String> sort, @RequestParam("search") Optional<String> search,
@RequestParam("size") Optional<Integer> size, @RequestParam("page") Optional<Integer> page) {

Collection<Immunization> immunizations = new ArrayList<Immunization>();
SearchOperation<Immunization> searchOperation = new SearchOperation<Immunization>();
SortOperation<Immunization> sortOperation = new SortOperation<Immunization>();
PagingOperation<Immunization> pagingOperation = new PagingOperation<Immunization>();

searchOperation.setSearchParams(search.isPresent() ? search.get() : new String());
sortOperation.setSortParams(sort.isPresent() ? sort.get() : new String());

if (!size.isPresent()) {
size = Optional.of(AmplConstants.DEFAULT_PAGE_SIZE);
}

pagingOperation.setPage(!page.isPresent() ? 1 : page.get());
pagingOperation.setSize(size.get());

ImmunizationData data = new ImmunizationData(ESAPIValidator.validateStringInput(patientId,ESAPIValidationType.CROSS_SITE_SCRIPTING_REFLECTED));

immunizations = searchOperation.search(
data.testImmunizationsForPatient(NumberUtility.randomBetween(MockDataConstants.ZERO, MockDataConstants.SEVEN)));
immunizations = sortOperation.sort(immunizations);
immunizations = pagingOperation.paginate(immunizations);

return ResponseEntity.status(HttpStatus.OK).body(immunizations);
}

/**
* Get method mapped to return a collection of {@link Problem} for a {@link PatientDetails}.
*
* @param patientId ID of patient to return
* @param sort comma-delimited list of field[value] pairs to filter results
* @param search comma-delimited list of field, {@link AmplComparator}, value string to filter results
* @param size number of results to return per page. Default is 25
* @param page for paging, the page of size results to return. default is 1.
* @return
*/
@Override
@GetMapping(RestUriConstants.GET_PROBLEM_LIST)
public ResponseEntity<Object> getProblemListByPatientId(@PathVariable("patientId") String patientId,
@RequestParam("sort") Optional<String> sort, @RequestParam("search") Optional<String> search,
@RequestParam("size") Optional<Integer> size, @RequestParam("page") Optional<Integer> page) {

Collection<Problem> problem = new ArrayList<Problem>();

SortOperation<Problem> sortOperation = new SortOperation<Problem>();
PagingOperation<Problem> pagingOperation = new PagingOperation<Problem>();

sortOperation.setSortParams(sort.isPresent() ? sort.get() : new String());

if (!size.isPresent()) {
size = Optional.of(AmplConstants.DEFAULT_PAGE_SIZE);
}

pagingOperation.setPage(!page.isPresent() ? 1 : page.get());
pagingOperation.setSize(size.get());

ProblemData data = new ProblemData(ESAPIValidator.validateStringInput(patientId,ESAPIValidationType.CROSS_SITE_SCRIPTING_REFLECTED));
problem = data.searchProblems(search);

problem = sortOperation.sort(problem);
problem = data.sortCommentsByDateDesc(problem);
problem = pagingOperation.paginate(problem);

return ResponseEntity.status(HttpStatus.OK).body(problem);
}


/**
* Get method mapped to return a collection of {@link Appointment} for a {@link PatientDetails}.
*
* @param patientId ID of patient to return
* @param sort comma-delimited list of field[value] pairs to filter results
* @param search comma-delimited list of field, {@link AmplComparator}, value string to filter results
* @param size number of results to return per page. Default is 25
* @param page for paging, the page of size results to return. default is 1.
* @return
*/
@Override
@GetMapping(RestUriConstants.GET_APPOINTMENTS)
public ResponseEntity<Object> getAppointmentsByPatientId(@PathVariable("patientId") String patientId,
@RequestParam("sort") Optional<String> sort, @RequestParam("search") Optional<String> search,
@RequestParam("size") Optional<Integer> size, @RequestParam("page") Optional<Integer> page) {

Collection<Appointment> appointment = new ArrayList<Appointment>();
SearchOperation<Appointment> searchOperation = new SearchOperation<Appointment>();
SortOperation<Appointment> sortOperation = new SortOperation<Appointment>();
PagingOperation<Appointment> pagingOperation = new PagingOperation<Appointment>();

searchOperation.setSearchParams(search.isPresent() ? search.get() : new String());
sortOperation.setSortParams(sort.isPresent() ? sort.get() : new String());

if (!size.isPresent()) {
size = Optional.of(AmplConstants.DEFAULT_PAGE_SIZE);
}

pagingOperation.setPage(!page.isPresent() ? 1 : page.get());
pagingOperation.setSize(size.get());

AppointmentData data = new AppointmentData(ESAPIValidator.validateStringInput(patientId,ESAPIValidationType.CROSS_SITE_SCRIPTING_REFLECTED));
appointment = searchOperation
.search(data.testAppointmentsForPatient(NumberUtility.randomBetween(0, MockDataConstants.ONE_HUNDRED)));
appointment = sortOperation.sort(appointment);
appointment = pagingOperation.paginate(appointment);

return ResponseEntity.status(HttpStatus.OK).body(appointment);
}

/**
* Get method mapped to return a collection of {@link Measurement} for a {@link PatientDetails}.
*
* @param patientId ID of patient to return
* @param sort comma-delimited list of field[value] pairs to filter results
* @param search comma-delimited list of field, {@link AmplComparator}, value string to filter results
* @param size number of results to return per page. Default is 25
* @param page for paging, the page of size results to return. default is 1.
* @return
*/
@Override
@GetMapping(RestUriConstants.GET_MEASUREMENTS)
public ResponseEntity<Object> getMeasurementsByPatientId(@PathVariable("patientId") String patientId,
@RequestParam("sort") Optional<String> sort, @RequestParam("search") Optional<String> search,
@RequestParam("size") Optional<Integer> size, @RequestParam("page") Optional<Integer> page) {

Collection<Measurement> measurements = new ArrayList<Measurement>();
SearchOperation<Measurement> searchOperation = new SearchOperation<Measurement>();
SortOperation<Measurement> sortOperation = new SortOperation<Measurement>();
PagingOperation<Measurement> pagingOperation = new PagingOperation<Measurement>();

String searchParams = search.isPresent() ? search.get() : new String();

searchOperation.setSearchParams(searchParams);
sortOperation.setSortParams(sort.isPresent() ? sort.get() : new String());

if (!size.isPresent()) {
size = Optional.of(AmplConstants.DEFAULT_PAGE_SIZE);
}

pagingOperation.setPage(!page.isPresent() ? 1 : page.get());
pagingOperation.setSize(size.get());

MeasurementData data = new MeasurementData(ESAPIValidator.validateStringInput(patientId,ESAPIValidationType.CROSS_SITE_SCRIPTING_REFLECTED));
measurements = searchOperation.search(data.testMeasurementsForPatient(MockDataConstants.ONE_HUNDRED));
measurements = sortOperation.sort(measurements);
measurements = pagingOperation.paginate(measurements);

return ResponseEntity.status(HttpStatus.OK).body(measurements);
}

/**
* Get method mapped to return a collection of {@link Measurement} for a {@link PatientDetails}.
*
* @param patientId ID of patient to return
* @param search the searchable field, {@link AmplComparator}, value
* @return ResponseEntity
*/
@Override
@GetMapping(RestUriConstants.GET_LAST_MEASURES)
public ResponseEntity<Object> getMeasurementsLastMeasureByPatientId(String patientId,
@RequestParam("search") Optional<String> search) {

Collection<Measurement> measurements = new ArrayList<Measurement>();
SearchOperation<Measurement> searchOperation = new SearchOperation<Measurement>();

if (!search.isPresent()) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Missing required parameters");
}

searchOperation.setSearchParams(search.get());

MeasurementData data = new MeasurementData(ESAPIValidator.validateStringInput(patientId,ESAPIValidationType.CROSS_SITE_SCRIPTING_REFLECTED));
measurements = searchOperation.search(data.testMeasurementsForPatient(MockDataConstants.ONE_HUNDRED));

return ResponseEntity.status(HttpStatus.OK).body(data.getMeasuresLast(measurements));
}
}