package module.webservice.api; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import org.fenixedu.bennu.core.rest.BennuRestResource; import org.fenixedu.bennu.oauth.annotation.OAuthEndpoint; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import module.mission.domain.Mission; import module.mission.presentationTier.dto.SearchMissionsDTO; import module.webservice.api.json.AbbreviatedMissionAdapter; @Path("mission/v1") public class MissionResource extends BennuRestResource { public final static String SCHEDULE_SCOPE = "EXPENDITURE"; @GET @Path("search") @Produces(MediaType.APPLICATION_JSON) @OAuthEndpoint(SCHEDULE_SCOPE) public JsonElement index(@Context HttpServletRequest request, @QueryParam(value = "page") final String pageStr) { // parse page number int page; try { page = (pageStr == null) ? 0 : Integer.parseInt(pageStr); if (page < 0) { page = 0; } } catch (final NumberFormatException e) { throw new WebApplicationException(400); } final SearchMissionsDTO searchMissions = new SearchMissionsDTO(request); final List<Mission> missions = searchMissions.sortedSearch(); final int ipp = 10; int skip = page * ipp; final int total = missions.size(); final int totalPages = (total + ipp - 1) / ipp; //CEIL TOTAL PAGES if (page >= totalPages && totalPages > 0) { // load last page instead page = totalPages - 1; skip = page * ipp; } final JsonObject json; if (missions.isEmpty()) { json = super.view(missions, "missions", AbbreviatedMissionAdapter.class).getAsJsonObject(); } else { json = super.viewPaginated(missions, "missions", AbbreviatedMissionAdapter.class, skip, ipp).getAsJsonObject(); } json.addProperty("totalPages", totalPages); json.addProperty("currentPage", page); json.addProperty("itemsPerPage", ipp); json.addProperty("sortBy", request.getParameter("sortBy")); return json; } @GET @Produces(MediaType.APPLICATION_JSON) @OAuthEndpoint(SCHEDULE_SCOPE) public JsonElement view(@QueryParam("processNumber") String processNumber) { if (processNumber == null || processNumber.isEmpty()) { throw new WebApplicationException(400); } List<Mission> missions; try { final SearchMissionsDTO searchMissions = new SearchMissionsDTO(); searchMissions.setProcessNumber(processNumber); missions = searchMissions.sortedSearch(); } catch (final Exception e) { throw new WebApplicationException(404); } if (missions.isEmpty() || missions.size() > 1) { throw new WebApplicationException(404); } final Mission mission = missions.get(0); return super.view(mission).getAsJsonObject(); } }