package com.p4square.groupsindexer; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.p4square.ccbapi.CCBAPI; import com.p4square.ccbapi.CCBAPIClient; import com.p4square.ccbapi.model.*; import com.p4square.groupsindexer.model.ErrorResponse; import com.p4square.groupsindexer.model.SearchField; import com.p4square.groupsindexer.model.StringPair; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; import java.net.URI; import java.util.*; import java.util.stream.Collectors; /** * SearchFields is an API Gateway Proxy which returns the searchable dropdown fields and their choices. * * Required (custom) environment variables: * * */ public class SearchFields implements RequestHandler { private static final long REFRESH_INTERVAL_MS = 15 * 60 * 1000; private static final Logger LOG = LogManager.getLogger(GroupsSearch.class); private static final ObjectMapper MAPPER = new ObjectMapper(); private final CCBAPI ccbClient; private List cachedFields; private long lastRefresh; public SearchFields() throws Exception { // Setup CCB Client final String CCBAPIURL = System.getenv("CCBAPIURL"); final String CCBAPIUser = System.getenv("CCBAPIUser"); final String CCBAPIPassword = System.getenv("CCBAPIPassword"); ccbClient = new CCBAPIClient(new URI(CCBAPIURL), CCBAPIUser, CCBAPIPassword); } @Override public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent event, Context context) { final APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent(); try { final List fields = getFields(); if (fields == null) { response.setStatusCode(500); response.setBody(MAPPER.writeValueAsString(new ErrorResponse("Unable to get search fields."))); return response; } response.setStatusCode(200); response.setBody(MAPPER.writeValueAsString(fields)); } catch (Exception e) { LOG.error(e.getMessage()); response.setStatusCode(500); try { response.setBody(MAPPER.writeValueAsString(new ErrorResponse(e.getMessage()))); } catch (JsonProcessingException _) { // Unexpected. } } return response; } private synchronized List getFields() { if (System.currentTimeMillis() - lastRefresh < REFRESH_INTERVAL_MS) { LOG.debug("Using cached CCB fields"); return cachedFields; } try { LOG.info("Fetching fields from CCB"); cachedFields = new ArrayList<>(); final GetCustomFieldLabelsResponse labels = ccbClient.getCustomFieldLabels(); cachedFields.add(new SearchField("groupType", "Group Type", getValues(LookupTableType.GROUP_TYPE))); // TODO fields.add(new SearchField("campusId", "Campus", ...)); cachedFields.add(new SearchField("meetingDay", "Day", getValues(LookupTableType.MEET_DAY))); for (final CustomField field : labels.getCustomFields()) { final LookupTableType type = getTypeFromString(field.getName()); if (type != null) { cachedFields.add(new SearchField(getSearchFieldIdForType(type), field.getLabel(), getValues(type))); } } cachedFields.add(new SearchField("childcare", "Childcare", Arrays.asList(StringPair.of("true", "Yes"), StringPair.of("false", "No")))); lastRefresh = System.currentTimeMillis(); return cachedFields; } catch (Exception e) { LOG.error(e.getMessage()); return null; } } private LookupTableType getTypeFromString(String name) { switch (name) { case "udf_grp_pulldown_1": return LookupTableType.UDF_GRP_PULLDOWN_1; case "udf_grp_pulldown_2": return LookupTableType.UDF_GRP_PULLDOWN_2; case "udf_grp_pulldown_3": return LookupTableType.UDF_GRP_PULLDOWN_3; default: return null; } } private String getSearchFieldIdForType(LookupTableType type) { switch (type) { case UDF_GRP_PULLDOWN_1: return "udf_1"; case UDF_GRP_PULLDOWN_2: return "udf_2"; case UDF_GRP_PULLDOWN_3: return "udf_3"; default: throw new IllegalArgumentException(); } } private List getValues(LookupTableType type) throws IOException { final GetLookupTableRequest lookupTableRequest = new GetLookupTableRequest().withType(type); final GetLookupTableResponse lookupTable = ccbClient.getLookupTable(lookupTableRequest); return lookupTable.getItems() .stream() .map(entry -> StringPair.of(String.valueOf(entry.getId()), entry.getName())) .collect(Collectors.toList()); } }