diff --git a/backend/src/components/utils.js b/backend/src/components/utils.js index 7100612..8d5d816 100644 --- a/backend/src/components/utils.js +++ b/backend/src/components/utils.js @@ -239,7 +239,18 @@ function addDistrictLabels(jsonData, districtList) { return data.filter(item => !valuesToExclude.includes(item[field])); } - + function filterByPubliclyAvailableCodes(jsonArray, fieldName, publicCodes) { + // Filter the array based on the condition + const filteredArray = jsonArray.filter(item => { + // Extract the field value (or use an empty string if the field is not present) + const fieldValue = item[fieldName] || ''; + + // Check if the fieldValue exactly matches any string from the stringsToRemove array + return publicCodes.includes(fieldValue); + }); + + return filteredArray; + } function filterByField(jsonArray, fieldName, stringsToRemove) { // Filter the array based on the condition const filteredArray = jsonArray.filter(item => { @@ -257,7 +268,9 @@ function addDistrictLabels(jsonData, districtList) { return data.filter(item => { const expiryDate = item.expiryDate ? new Date(item.expiryDate) : null; - return expiryDate === null || currentDate < expiryDate; + const effectiveDate = item.effectiveDate ? new Date(item.effectiveDate) : null; + + return expiryDate === null && currentDate > effectiveDate || currentDate < expiryDate && currentDate > effectiveDate ; }); } function getArrayofNonPubliclyAvailableCodes(codes, field) { @@ -272,6 +285,18 @@ function addDistrictLabels(jsonData, districtList) { return nonPubliclyAvailableCodes; } + function getArrayofPubliclyAvailableCodes(codes, field) { + if (!Array.isArray(codes)) { + throw new Error('Invalid input. Expecting an array of objects.'); + } + + // Filter out objects where "publiclyAvailable" is true + const publiclyAvailableCodes = codes + .filter(item => item && item.publiclyAvailable === true) + .map(item => item[field]); + + return publiclyAvailableCodes; + } function createSchoolCache(schoolData, schoolGrades) { // Preload convertedGrades with schoolGrades.schoolGradeCode and set the value to "N" @@ -363,4 +388,4 @@ function addDistrictLabels(jsonData, districtList) { return school; }); } - module.exports = {filterByExpiryDate, filterRemoveByField, sortByProperty,getArrayofNonPubliclyAvailableCodes,filterByField,appendMailingAddressDetailsAndRemoveAddresses,sortJSONBySchoolCode,sortJSONByDistrictNumber,normalizeJsonObject, removeFieldsByCriteria, createList, isSafeFilePath,isAllowedSchoolCategory, addDistrictLabels, districtNumberSort, createSchoolCache, formatGrades, rearrangeAndRelabelObjectProperties}; \ No newline at end of file + module.exports = {filterByPubliclyAvailableCodes, getArrayofPubliclyAvailableCodes, filterByExpiryDate, filterRemoveByField, sortByProperty,getArrayofNonPubliclyAvailableCodes,filterByField,appendMailingAddressDetailsAndRemoveAddresses,sortJSONBySchoolCode,sortJSONByDistrictNumber,normalizeJsonObject, removeFieldsByCriteria, createList, isSafeFilePath,isAllowedSchoolCategory, addDistrictLabels, districtNumberSort, createSchoolCache, formatGrades, rearrangeAndRelabelObjectProperties}; \ No newline at end of file diff --git a/backend/src/routes/district-router.js b/backend/src/routes/district-router.js index aeb09d1..90da53a 100644 --- a/backend/src/routes/district-router.js +++ b/backend/src/routes/district-router.js @@ -137,6 +137,7 @@ async function getAllDistrictContacts(req, res) { "server:instituteAPIURL" )}/institute/district/contact/paginated?pageSize=4000&searchCriteriaList=${encodedParams}` try { + const districtContactResponse = await axios.get(url, { headers: { Authorization: `Bearer ${req.accessToken}` }, }); @@ -169,9 +170,6 @@ async function getAllDistrictContacts(req, res) { }); let sortedData = sortJSONByDistrictNumber(filteredData) const validDistricts = filterRemoveByField(sortedData,"District Number", ["098","102","103"]) - - - res.json(validDistricts); //res.json(districtContactsReorderedAndRelabeled ); } catch (e) { @@ -179,7 +177,6 @@ async function getAllDistrictContacts(req, res) { } } - async function getAllDistrictMailing(req, res) { const districtList = await listCache.get("districtlist") const contactTypeCodes= await listCache.get("codesList") @@ -201,9 +198,7 @@ async function getAllDistrictMailing(req, res) { { property: "physicalCountryCode", label: "Courier Country" }, { property: "website", label: "Web Address" }, { property: "phoneNumber", label: "Phone" }, - { property: "faxNumber", label: "Fax" }, - - + { property: "faxNumber", label: "Fax" }, ]; const params = [ @@ -291,7 +286,7 @@ async function getDistrict(req, res) { const districtSchoolsUrl = `${config.get( "server:instituteAPIURL" )}/institute/school/paginated?pageNumber=0&pageSize=500&searchCriteriaList=${encodedParams}`; - + try { const districtDataResponse = await axios.get(url, { headers: { Authorization: `Bearer ${req.accessToken}` }, diff --git a/backend/src/routes/institute-router.js b/backend/src/routes/institute-router.js index 5c32ebf..2fe299e 100644 --- a/backend/src/routes/institute-router.js +++ b/backend/src/routes/institute-router.js @@ -89,9 +89,56 @@ async function getContactTypeCodes(req, res) { } } async function getOffshoreSchoolList(req, res) { + + let currentDate = new Date().toISOString().substring(0, 19) + const params = [ + { + condition: 'AND', + searchCriteriaList: [ + { + key: 'schoolCategoryCode', + operation: 'eq', + value: "OFFSHORE", + valueType: 'STRING', + condition: 'AND' + }, + { + key: 'openedDate', + operation: 'lte', + value: currentDate, + valueType: 'DATE_TIME', + condition: 'AND' + } + ] + }, + { + condition: 'AND', + searchCriteriaList: [ + { + key: 'closedDate', + operation: 'eq', + value: null, + valueType: 'STRING', + condition: 'OR' + }, + { + key: 'closedDate', + operation: 'gte', + value: currentDate, + valueType: 'DATE_TIME', + condition: 'OR' + } + ] + } + ]; + + const jsonString = JSON.stringify(params) + const encodedParams = encodeURIComponent(jsonString) + + if (await !listCache.has("offshoreschoollist")) { - const url = `${config.get("server:instituteAPIURL")}/institute/school/paginated?pageSize=100&pageNumber=0&searchCriteriaList=%5B%7B%22condition%22%3Anull%2C%22searchCriteriaList%22%3A%5B%7B%22key%22%3A%22schoolCategoryCode%22%2C%22operation%22%3A%22eq%22%2C%22value%22%3A%22OFFSHORE%22%2C%22valueType%22%3A%22STRING%22%2C%22condition%22%3A%22AND%22%7D%2C%7B%22key%22%3A%22openedDate%22%2C%22operation%22%3A%22lte%22%2C%22value%22%3A%222023-09-27T17%3A57%3A46%22%2C%22valueType%22%3A%22DATE_TIME%22%2C%22condition%22%3A%22AND%22%7D%2C%7B%22key%22%3A%22closedDate%22%2C%22operation%22%3A%22eq%22%2C%22value%22%3Anull%2C%22valueType%22%3A%22STRING%22%2C%22condition%22%3A%22AND%22%7D%5D%7D%5D`; // Update the URL according to your API endpoint + const url = `${config.get('server:instituteAPIURL')}/institute/school/paginated?pageSize=1000&pageNumber=0&searchCriteriaList=${encodedParams}`; axios .get(url, { headers: { Authorization: `Bearer ${req.accessToken}` } }) .then((response) => { diff --git a/backend/src/routes/school-router.js b/backend/src/routes/school-router.js index 18a9ab8..dfd22cb 100644 --- a/backend/src/routes/school-router.js +++ b/backend/src/routes/school-router.js @@ -4,7 +4,7 @@ const log = require("../components/logger"); const config = require("../config/index"); const axios = require("axios"); -const { filterByField, getArrayofNonPubliclyAvailableCodes, normalizeJsonObject, createSchoolCache, addDistrictLabels, formatGrades, sortJSONBySchoolCode, rearrangeAndRelabelObjectProperties} = require("../components/utils"); +const { filterByField, filterByExpiryDate, getArrayofPubliclyAvailableCodes, normalizeJsonObject, createSchoolCache, addDistrictLabels, formatGrades, sortJSONBySchoolCode, rearrangeAndRelabelObjectProperties, filterByPubliclyAvailableCodes} = require("../components/utils"); const { checkToken } = require("../components/auth"); const { schoolCache, listCache, codeCache } = require("../components/cache"); @@ -27,7 +27,9 @@ async function getSchool(req, res) { const schoolData = response.data; const includedFields = ['schoolContactTypeCode', 'label', 'description']; schoolData.contacts = normalizeJsonObject(schoolData.contacts, contactTypeCodes.codesList.schoolContactTypeCodes, 'schoolContactTypeCode', (info) => info.publiclyAvailable === true, includedFields); - schoolData.contacts = filterByField(schoolData.contacts, "schoolContactTypeCode", ["STUDREGIS"]) + + schoolData.contacts = filterByPubliclyAvailableCodes(schoolData.contacts, "schoolContactTypeCode", getArrayofPubliclyAvailableCodes(contactTypeCodes.codesList.schoolContactTypeCodes, "schoolContactTypeCode")) + schoolData.contacts = filterByExpiryDate(schoolData.contacts) const formattedGrades = formatGrades(schoolData.grades, schoolGrades); const schoolWithFormattedGrades = { ...schoolData, ...formattedGrades }; res.json(schoolWithFormattedGrades);