diff --git a/backend/src/routes/district-router.js b/backend/src/routes/district-router.js index a2d9c392..9f6751fa 100644 --- a/backend/src/routes/district-router.js +++ b/backend/src/routes/district-router.js @@ -93,7 +93,7 @@ async function getDistrictCodes(req) { return districtCodeList; } catch (e) { log.error( - "getDistrictList Error", + "getDistrictCodesList Error", e.response ? e.response.status : e.message ); } @@ -250,7 +250,6 @@ async function getAllDistrictContacts(req, res) { async function getAllDistrictMailing(req, res) { const districtList = await listCache.get("districtlist"); - const contactTypeCodes = await listCache.get("codesList"); const propertyOrder = [ { property: "districtId_districtNumber", label: "District Number" }, @@ -323,13 +322,11 @@ async function getAllDistrictMailing(req, res) { const contentByDistrict = sortJSONByDistrictNumber(content); res.json(contentByDistrict); - //res.json(districtContactsReorderedAndRelabeled ); } catch (e) { log.error("getData Error", e.response ? e.response.status : e.message); } } -//api/v1/institute/district/12342525 async function getDistrict(req, res) { const { id } = req.params; @@ -399,8 +396,9 @@ async function getDistrict(req, res) { const facilityCodes = await listCache.get("facilityCodes"); const fundingGroups = await listCache.get("fundingGroups"); const districtContactCodeTypes = await listCache.get("codesList"); - const nonPublicContactTypeCodes = - getNonPublicContactTypeCodes(contactTypeCodes); + const nonPublicContactTypeCodes = await getNonPublicContactTypeCodes( + contactTypeCodes + ); const districtDataPublic = removeContacts( districtDataResponse.data, @@ -410,36 +408,37 @@ async function getDistrict(req, res) { districtDataPublic, contactTypeCodes ); - districtDataPublicWithLabels.contacts = filterByPubliclyAvailableCodes( - districtDataPublicWithLabels.contacts, - "districtContactTypeCode", - getArrayofPubliclyAvailableCodes( - districtContactCodeTypes.codesList.districtContactTypeCodes, - "districtContactTypeCode" - ) - ); - districtDataPublicWithLabels.contacts = filterByExpiryDate( - districtDataPublicWithLabels.contacts - ); - - districtSchoolsResponse.data.content = normalizeJsonObject( - districtSchoolsResponse.data.content, - schoolCategoryCodes, - "schoolCategoryCode", - null, - ["label", "description"] - ); - districtSchoolsResponse.data.content = normalizeJsonObject( - districtSchoolsResponse.data.content, - facilityCodes, - "faciltyTypeCode", - null, - ["label", "description"] - ); - districtSchoolsResponse.data.content = addFundingGroups( - districtSchoolsResponse.data.content, - fundingGroups - ); + if (!!districtContactCodeTypes) { + districtDataPublicWithLabels.contacts = filterByPubliclyAvailableCodes( + districtDataPublicWithLabels.contacts, + "districtContactTypeCode", + getArrayofPubliclyAvailableCodes( + districtContactCodeTypes.codesList.districtContactTypeCodes, + "districtContactTypeCode" + ) + ); + districtDataPublicWithLabels.contacts = filterByExpiryDate( + districtDataPublicWithLabels.contacts + ); + districtSchoolsResponse.data.content = normalizeJsonObject( + districtSchoolsResponse.data.content, + schoolCategoryCodes, + "schoolCategoryCode", + null, + ["label", "description"] + ); + districtSchoolsResponse.data.content = normalizeJsonObject( + districtSchoolsResponse.data.content, + facilityCodes, + "faciltyTypeCode", + null, + ["label", "description"] + ); + districtSchoolsResponse.data.content = addFundingGroups( + districtSchoolsResponse.data.content, + fundingGroups + ); + } const today = new Date(); const filteredSchoolsResponse = districtSchoolsResponse.data.content.filter( diff --git a/backend/src/routes/institute-router.js b/backend/src/routes/institute-router.js index 2b0ebf95..fb7b4c2f 100644 --- a/backend/src/routes/institute-router.js +++ b/backend/src/routes/institute-router.js @@ -5,28 +5,69 @@ const config = require("../config/index"); const axios = require("axios"); const { checkToken } = require("../components/auth"); -const {filterByOpenedAndClosedDate, formatGrades, removeFieldsByCriteria, createList, addDistrictLabels, districtNumberSort, isAllowedSchoolCategory, filterRemoveByField, filterByField } = require("../components/utils"); +const { + filterByOpenedAndClosedDate, + formatGrades, + removeFieldsByCriteria, + createList, + addDistrictLabels, + districtNumberSort, + isAllowedSchoolCategory, + filterRemoveByField, + filterByField, +} = require("../components/utils"); const { listCache, codeCache } = require("../components/cache"); -const schoolListOptions = { fields: ["mincode", "displayName", "schoolId", "closedDate", "openedDate","schoolCategoryCode"], fieldToInclude: null, valueToInclude: null, sortField: "mincode" }; -const districtListOptions = { fields: ["displayName", "districtId","districtNumber", "closedDate"] ,fieldToInclude: "districtStatusCode", valueToInclude: "ACTIVE", sortField: "districtNumber"}; -const authorityListOptions = { fields: ["displayName", "authorityNumber","independentAuthorityId", "closedDate", "opendDate"], sortField: "authorityNumber" }; -const openSchoolListOptions = { fields: [ - "schoolId", - "districtId", - "mincode", - "schoolNumber", - "faxNumber", - "phoneNumber", - "email", - "website", - "displayName", - "schoolCategoryCode", - "facilityTypeCode", - "openedDate", - "closedDate", - "districtNumber" -],fieldToInclude: "closedDate", valueToInclude: null, sortField: "mincode" }; +const schoolListOptions = { + fields: [ + "mincode", + "displayName", + "schoolId", + "closedDate", + "openedDate", + "schoolCategoryCode", + ], + fieldToInclude: null, + valueToInclude: null, + sortField: "mincode", +}; +const districtListOptions = { + fields: ["displayName", "districtId", "districtNumber", "closedDate"], + fieldToInclude: "districtStatusCode", + valueToInclude: "ACTIVE", + sortField: "districtNumber", +}; +const authorityListOptions = { + fields: [ + "displayName", + "authorityNumber", + "independentAuthorityId", + "closedDate", + "opendDate", + ], + sortField: "authorityNumber", +}; +const openSchoolListOptions = { + fields: [ + "schoolId", + "districtId", + "mincode", + "schoolNumber", + "faxNumber", + "phoneNumber", + "email", + "website", + "displayName", + "schoolCategoryCode", + "facilityTypeCode", + "openedDate", + "closedDate", + "districtNumber", + ], + fieldToInclude: "closedDate", + valueToInclude: null, + sortField: "mincode", +}; //Batch Routes router.get("/contact-type-codes", checkToken, getContactTypeCodes); @@ -43,19 +84,16 @@ router.get("/*", checkToken, getInstituteAPI); async function createCache(req, res) { if (await !listCache.has("fundingGroups")) { - //const codes = []; - try { const fundingGroupsResponse = await axios.get( - `${config.get( - "server:schoolsAPIURL" - )}/schools/fundingGroups`, + `${config.get("server:schoolsAPIURL")}/schools/fundingGroups`, { headers: { Authorization: `Bearer ${req.accessToken}` }, } ); listCache.set("fundingGroups", fundingGroupsResponse.data); res.json(fundingGroupsResponse.data); + log.info("cached funding groups - ", req.url); } catch (error) { const statusCode = error.response ? error.response.status : 500; log.error("getFunding Groups Error", statusCode, error.message); @@ -65,52 +103,32 @@ async function createCache(req, res) { const cachedFundingGroupList = await listCache.get("fundingGroups"); res.json(cachedFundingGroupList); } - if (await !listCache.has("districtlist")) { - const url = `${config.get("server:instituteAPIURL")}/institute/district`; // Update the URL according to your API endpoint - axios - .get(url, { headers: { Authorization: `Bearer ${req.accessToken}` } }) - .then((response) => { - const filteredNonbBCDistrictList = response.data.filter(district => ["098","102", "103"].includes(district.districtNumber)); - const filteredDistrictList = response.data.filter(district => !["098","102", "103"].includes(district.districtNumber)); - const districtList = createList(filteredDistrictList, districtListOptions); - const nonBCdistrictList = createList(filteredNonbBCDistrictList, districtListOptions); - listCache.set("nonbcdistrictlist", nonBCdistrictList); - listCache.set("districtlist", districtList); - res.json(districtList); - log.info(req.url); - }) - .catch((e) => { - log.error( - "getDistrictList Error", - e.response ? e.response.status : e.message - ); - }); - } - if (!listCache.has("categoryCodes")) { - //const codes = []; - + if (await !listCache.has("categoryCodes")) { try { const categoryCodesResponse = await axios.get( - `${config.get( - "server:instituteAPIURL" - )}/institute/category-codes`, + `${config.get("server:instituteAPIURL")}/institute/category-codes`, { headers: { Authorization: `Bearer ${req.accessToken}` }, } ); - - categoryCodesResponse.data = filterRemoveByField(categoryCodesResponse.data,"schoolCategoryCode", ["FED_BAND","POST_SEC","YUKON"]) + + categoryCodesResponse.data = filterRemoveByField( + categoryCodesResponse.data, + "schoolCategoryCode", + ["FED_BAND", "POST_SEC", "YUKON"] + ); listCache.set("categoryCodes", categoryCodesResponse.data); - + log.info("cached category codes - ", req.url); } catch (error) { const statusCode = error.response ? error.response.status : 500; log.error("Category Code Caching Error", statusCode, error.message); res.status(statusCode).send(error.message); } - } else{ + } else { const categoryCodes = await listCache.get("categoryCodes"); - res.json(categoryCodes) + res.json(categoryCodes); + log.info("fetched category codes - ", req.url); } if (await !codeCache.has("gradelist")) { const url = `${config.get("server:instituteAPIURL")}/institute/grade-codes`; // Update the URL according to your API endpoint @@ -118,103 +136,81 @@ async function createCache(req, res) { .get(url, { headers: { Authorization: `Bearer ${req.accessToken}` } }) .then((response) => { const gradeCodes = response.data; - + codeCache.set("gradelist", gradeCodes); - log.info(req.url); + log.info("cached grade list - ", req.url); }) .catch((e) => { log.error( - "getDistrictList Error", + "getGradeList Error", e.response ? e.response.status : e.message ); }); } else { const gradeCodes = await codeCache.get("gradelist"); res.json(gradeCodes); + log.info("fetched grade list - ", req.url); } - if (!listCache.has("categoryCodes")) { - //const codes = []; - - try { - const categoryCodesResponse = await axios.get( - `${config.get( - "server:instituteAPIURL" - )}/institute/category-codes`, - { - headers: { Authorization: `Bearer ${req.accessToken}` }, - } - ); - - categoryCodesResponse.data = filterRemoveByField(categoryCodesResponse.data,"schoolCategoryCode", ["FED_BAND","POST_SEC","YUKON"]) - listCache.set("categoryCodes", categoryCodesResponse.data); - - } catch (error) { - const statusCode = error.response ? error.response.status : 500; - log.error("Category Code Caching Error", statusCode, error.message); - res.status(statusCode).send(error.message); - } - } - if (!listCache.has("facilityCodes")) { - //const codes = []; - try { const facilityCodesResponse = await axios.get( - `${config.get( - "server:instituteAPIURL" - )}/institute/facility-codes`, + `${config.get("server:instituteAPIURL")}/institute/facility-codes`, { headers: { Authorization: `Bearer ${req.accessToken}` }, } ); listCache.set("facilityCodes", facilityCodesResponse.data); + log.info("cached facility codes - ", req.url); } catch (error) { const statusCode = error.response ? error.response.status : 500; log.error("Faility Code Caching Error", statusCode, error.message); res.status(statusCode).send(error.message); } - } + } if (!listCache.has("districtAddresses")) { - //const codes = []; - try { const districtsResponse = await axios.get( - `${config.get("server:instituteAPIURL")}/institute/district/paginated?pageSize=200`, + `${config.get( + "server:instituteAPIURL" + )}/institute/district/paginated?pageSize=200`, { headers: { Authorization: `Bearer ${req.accessToken}` }, } ); - + districtsResponse.data.content.forEach((district) => { district.addresses.forEach((address) => { - if (address.addressTypeCode === "MAILING") { Object.keys(address).forEach((field) => { // Exclude the specified fields - if (![ - "createUser", - "updateUser", - "createDate", - "updateDate", - "schoolAddressId", - "schoolId", - "addressTypeCode" - ].includes(field)) { + if ( + ![ + "createUser", + "updateUser", + "createDate", + "updateDate", + "schoolAddressId", + "schoolId", + "addressTypeCode", + ].includes(field) + ) { district[`mailing_${field}`] = address[field]; } }); } else if (address.addressTypeCode === "PHYSICAL") { Object.keys(address).forEach((field) => { - if (![ - "createUser", - "updateUser", - "createDate", - "updateDate", - "schoolAddressId", - "schoolId", - "addressTypeCode" - ].includes(field)) { + if ( + ![ + "createUser", + "updateUser", + "createDate", + "updateDate", + "schoolAddressId", + "schoolId", + "addressTypeCode", + ].includes(field) + ) { district[`physical_${field}`] = address[field]; } }); @@ -222,16 +218,17 @@ async function createCache(req, res) { }); }); listCache.set("districtAddresses", districtsResponse.data.content); + log.info("cached district addresses - ", req.url); } catch (error) { const statusCode = error.response ? error.response.status : 500; log.error("District Code Caching Error", statusCode, error.message); res.status(statusCode).send(error.message); } - } - + } if (await !listCache.has("codesList")) { try { + log.info("Starting to get codes list"); //MOVE UNTIL I SEE IT const authorityContactTypeCodesResponse = await axios.get( `${config.get( "server:instituteAPIURL" @@ -260,27 +257,35 @@ async function createCache(req, res) { ); const codes = { - authorityContactTypeCodes: removeFieldsByCriteria(authorityContactTypeCodesResponse.data, [{ fieldToRemove: "publiclyAvailable", value: false }]), - districtContactTypeCodes: removeFieldsByCriteria(districtContactTypeCodesResponse.data,[{ fieldToRemove: "publiclyAvailable", value: false }]), - schoolContactTypeCodes: removeFieldsByCriteria(schoolContactTypeCodesResponse.data,[{ fieldToRemove: "publiclyAvailable", value: false }]), + authorityContactTypeCodes: removeFieldsByCriteria( + authorityContactTypeCodesResponse.data, + [{ fieldToRemove: "publiclyAvailable", value: false }] + ), + districtContactTypeCodes: removeFieldsByCriteria( + districtContactTypeCodesResponse.data, + [{ fieldToRemove: "publiclyAvailable", value: false }] + ), + schoolContactTypeCodes: removeFieldsByCriteria( + schoolContactTypeCodesResponse.data, + [{ fieldToRemove: "publiclyAvailable", value: false }] + ), }; - res.json(codes); + // res.json(codes); listCache.set("codesList", { codesList: codes }); + log.info("cached codes list - ", req.url); } catch (error) { const statusCode = error.response ? error.response.status : 500; + log.error(e); log.error("getCodesList Error", statusCode, error.message); res.status(statusCode).send(error.message); } } + // res acts like a return res.status(200).json({ success: true }); - } - async function getContactTypeCodes(req, res) { if (await !listCache.has("codesList")) { - //const codes = []; - try { const authorityContactTypeCodesResponse = await axios.get( `${config.get( @@ -310,9 +315,18 @@ async function getContactTypeCodes(req, res) { ); const codes = { - authorityContactTypeCodes: removeFieldsByCriteria(authorityContactTypeCodesResponse.data, [{ fieldToRemove: "publiclyAvailable", value: false }]), - districtContactTypeCodes: removeFieldsByCriteria(districtContactTypeCodesResponse.data,[{ fieldToRemove: "publiclyAvailable", value: false }]), - schoolContactTypeCodes: removeFieldsByCriteria(schoolContactTypeCodesResponse.data,[{ fieldToRemove: "publiclyAvailable", value: false }]), + authorityContactTypeCodes: removeFieldsByCriteria( + authorityContactTypeCodesResponse.data, + [{ fieldToRemove: "publiclyAvailable", value: false }] + ), + districtContactTypeCodes: removeFieldsByCriteria( + districtContactTypeCodesResponse.data, + [{ fieldToRemove: "publiclyAvailable", value: false }] + ), + schoolContactTypeCodes: removeFieldsByCriteria( + schoolContactTypeCodesResponse.data, + [{ fieldToRemove: "publiclyAvailable", value: false }] + ), }; listCache.set("codesList", { codesList: codes }); res.json(codes); @@ -327,67 +341,72 @@ async function getContactTypeCodes(req, res) { } } async function getOffshoreSchoolList(req, res) { - - let currentDate = new Date().toISOString().substring(0, 19) + let currentDate = new Date().toISOString().substring(0, 19); const params = [ { - condition: 'AND', + condition: "AND", searchCriteriaList: [ { - key: 'schoolCategoryCode', - operation: 'eq', + key: "schoolCategoryCode", + operation: "eq", value: "OFFSHORE", - valueType: 'STRING', - condition: 'AND' + valueType: "STRING", + condition: "AND", }, { - key: 'openedDate', - operation: 'lte', + key: "openedDate", + operation: "lte", value: currentDate, - valueType: 'DATE_TIME', - condition: 'AND' - } - ] + valueType: "DATE_TIME", + condition: "AND", + }, + ], }, { - condition: 'AND', + condition: "AND", searchCriteriaList: [ { - key: 'closedDate', - operation: 'eq', + key: "closedDate", + operation: "eq", value: null, - valueType: 'STRING', - condition: 'OR' + valueType: "STRING", + condition: "OR", }, { - key: 'closedDate', - operation: 'gte', + key: "closedDate", + operation: "gte", value: currentDate, - valueType: 'DATE_TIME', - condition: 'OR' - } - ] - } + valueType: "DATE_TIME", + condition: "OR", + }, + ], + }, ]; - const jsonString = JSON.stringify(params) - const encodedParams = encodeURIComponent(jsonString) - - + const jsonString = JSON.stringify(params); + const encodedParams = encodeURIComponent(jsonString); if (await !listCache.has("offshoreschoollist")) { - const url = `${config.get('server:instituteAPIURL')}/institute/school/paginated?pageSize=1000&pageNumber=0&searchCriteriaList=${encodedParams}`; + 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) => { const offshoreSchoolList = response.data.content; - const schoolGrades = codeCache.get("gradelist"); - + const schoolGrades = codeCache.get("gradelist"); + for (let i = 0; i < offshoreSchoolList.length; i++) { - const formattedGrades = formatGrades(offshoreSchoolList[i].grades, schoolGrades); - offshoreSchoolList[i] = { ...offshoreSchoolList[i], ...formattedGrades }; + const formattedGrades = formatGrades( + offshoreSchoolList[i].grades, + schoolGrades + ); + offshoreSchoolList[i] = { + ...offshoreSchoolList[i], + ...formattedGrades, + }; // Now you can use the updated offshoreSchoolList[i] object as needed - } + } res.json(offshoreSchoolList); listCache.set("offshoreschoollist", offshoreSchoolList); log.info(req.url); @@ -404,41 +423,44 @@ async function getOffshoreSchoolList(req, res) { } } async function getAuthorityList(req, res) { - if (await !listCache.has("authoritylist")) { - - let currentDate = new Date().toISOString().substring(0, 19) + let currentDate = new Date().toISOString().substring(0, 19); const params = [ { condition: null, searchCriteriaList: [ { - key: 'closedDate', - operation: 'eq', + key: "closedDate", + operation: "eq", value: null, - valueType: 'STRING', - condition: 'OR' + valueType: "STRING", + condition: "OR", }, { - key: 'closedDate', - operation: 'gte', + key: "closedDate", + operation: "gte", value: currentDate, - valueType: 'DATE_TIME', - condition: 'OR' - } - ] - } + valueType: "DATE_TIME", + condition: "OR", + }, + ], + }, ]; - - const jsonString = JSON.stringify(params) - const encodedParams = encodeURIComponent(jsonString) - - const url = `${config.get('server:instituteAPIURL')}/institute/authority/paginated?pageSize=1000&searchCriteriaList=${encodedParams}`; + + const jsonString = JSON.stringify(params); + const encodedParams = encodeURIComponent(jsonString); + + const url = `${config.get( + "server:instituteAPIURL" + )}/institute/authority/paginated?pageSize=1000&searchCriteriaList=${encodedParams}`; axios .get(url, { headers: { Authorization: `Bearer ${req.accessToken}` } }) .then((response) => { - const authorityList = createList(response.data.content, authorityListOptions); - + const authorityList = createList( + response.data.content, + authorityListOptions + ); + res.json(authorityList); listCache.set("authoritylist", authorityList); log.info(req.url); @@ -455,31 +477,30 @@ async function getAuthorityList(req, res) { } } async function getCategoryCodes(req, res) { - if (!listCache.has("categoryCodes")) { - //const codes = []; - try { const categoryCodesResponse = await axios.get( - `${config.get( - "server:instituteAPIURL" - )}/institute/category-codes`, + `${config.get("server:instituteAPIURL")}/institute/category-codes`, { headers: { Authorization: `Bearer ${req.accessToken}` }, } ); - - categoryCodesResponse.data = filterRemoveByField(categoryCodesResponse.data,"schoolCategoryCode", ["FED_BAND","POST_SEC","YUKON"]) + + categoryCodesResponse.data = filterRemoveByField( + categoryCodesResponse.data, + "schoolCategoryCode", + ["FED_BAND", "POST_SEC", "YUKON"] + ); listCache.set("categoryCodes", categoryCodesResponse.data); - + res.json(categoryCodesResponse.data); } catch (error) { const statusCode = error.response ? error.response.status : 500; log.error("Category Code Caching Error", statusCode, error.message); res.status(statusCode).send(error.message); } - } else{ + } else { const categoryCodes = await listCache.get("categoryCodes"); - res.json(categoryCodes) + res.json(categoryCodes); } } async function getSchoolList(req, res) { @@ -488,9 +509,24 @@ async function getSchoolList(req, res) { axios .get(url, { headers: { Authorization: `Bearer ${req.accessToken}` } }) .then((response) => { - const openSchools = filterByOpenedAndClosedDate(response.data) - const validSchoolCategories = filterByField(openSchools, "schoolCategoryCode", ["POST_SEC", "YUKON", "SUMMER", "FED_BAND"]) - const validSchoolFacilities = filterByField(validSchoolCategories, "facilityTypeCode", ['PROVINCIAL','DIST_CONT','ELEC_DELIV','POST_SEC','JUSTB4PRO','SUMMER']) + const openSchools = filterByOpenedAndClosedDate(response.data); + const validSchoolCategories = filterByField( + openSchools, + "schoolCategoryCode", + ["POST_SEC", "YUKON", "SUMMER", "FED_BAND"] + ); + const validSchoolFacilities = filterByField( + validSchoolCategories, + "facilityTypeCode", + [ + "PROVINCIAL", + "DIST_CONT", + "ELEC_DELIV", + "POST_SEC", + "JUSTB4PRO", + "SUMMER", + ] + ); const schoolList = createList(validSchoolFacilities, schoolListOptions); res.json(schoolList); listCache.set("schoollist", schoolList); @@ -514,10 +550,20 @@ async function getDistrictList(req, res) { .get(url, { headers: { Authorization: `Bearer ${req.accessToken}` } }) .then((response) => { //const districtList = response.data; - const filteredNonbBCDistrictList = response.data.filter(district => ["098","102", "103"].includes(district.districtNumber)); - const filteredDistrictList = response.data.filter(district => !["098","102", "103"].includes(district.districtNumber)); - const districtList = createList(filteredDistrictList, districtListOptions); - const nonBCdistrictList = createList(filteredNonbBCDistrictList, districtListOptions); + const filteredNonbBCDistrictList = response.data.filter((district) => + ["098", "102", "103"].includes(district.districtNumber) + ); + const filteredDistrictList = response.data.filter( + (district) => !["098", "102", "103"].includes(district.districtNumber) + ); + const districtList = createList( + filteredDistrictList, + districtListOptions + ); + const nonBCdistrictList = createList( + filteredNonbBCDistrictList, + districtListOptions + ); listCache.set("nonbcdistrictlist", nonBCdistrictList); listCache.set("districtlist", districtList); res.json(districtList); @@ -525,7 +571,7 @@ async function getDistrictList(req, res) { }) .catch((e) => { log.error( - "getDistrictList Error", + "getDistrictList Error (getDistrictList)", e.response ? e.response.status : e.message ); }); @@ -552,19 +598,21 @@ async function getDistrictContactsAPI(req, res) { const url = `${config.get("server:instituteAPIURL")}/institute` + req.url; const districtList = await listCache.get("districtlist"); - const nonBCDistrictList = await listCache.get("nonbcdistrictlist"); + const nonBCDistrictList = await listCache.get("nonbcdistrictlist"); axios .get(url, { headers: { Authorization: `Bearer ${req.accessToken}` } }) .then((response) => { if (req.url.includes("/district/contact/paginated")) { const jsonData = addDistrictLabels(response.data, districtList); - - jsonData.content = jsonData.content.filter(contact => { + + jsonData.content = jsonData.content.filter((contact) => { // Check if districtId is not undefined, empty, or null - return contact.districtNumber !== undefined - && contact.districtNumber !== "" - && contact.districtNumber !== null; - }); + return ( + contact.districtNumber !== undefined && + contact.districtNumber !== "" && + contact.districtNumber !== null + ); + }); res.json(jsonData); } else { res.json(response.data); @@ -582,7 +630,7 @@ async function getGradeCodes(req, res) { .get(url, { headers: { Authorization: `Bearer ${req.accessToken}` } }) .then((response) => { const gradeCodes = response.data; - + codeCache.set("gradelist", gradeCodes); res.json(gradeCodes); log.info(req.url); diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 64419e25..7cc84069 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -9,7 +9,7 @@ const data = ref([]) // Placeholder for the received data const appStore = useAppStore() onBeforeMount(async () => { - await appStore.setCodes() + await appStore.setCodes() //calls /create-cache await appStore.setDistricts() await appStore.setAuthorityList() await appStore.setSchoolList() diff --git a/frontend/src/services/InstituteService.ts b/frontend/src/services/InstituteService.ts index e7cbbf7d..fedcf26d 100644 --- a/frontend/src/services/InstituteService.ts +++ b/frontend/src/services/InstituteService.ts @@ -3,44 +3,44 @@ import { type AxiosResponse } from 'axios'; export default { // Districts - getDistricts(): Promise { + async getDistricts(): Promise { return ApiService.apiAxios.get('/api/v1/institute/district/list'); }, //DO NOT USE; TODO: Factor this out and use getDistrictView instead getDistrict(districtId: string): Promise { - return ApiService.apiAxios.get('/api/v1/institute/district/'+districtId); + return ApiService.apiAxios.get('/api/v1/institute/district/'+ districtId); }, // Independent Authorities - getAuthorityList(): Promise { + async getAuthorityList(): Promise { return ApiService.apiAxios.get('/api/v1/institute/authority/list'); }, - getAuthority(authorityId: string): Promise { + async getAuthority(authorityId: string): Promise { return ApiService.apiAxios.get('/api/v1/authority/'+ authorityId) }, // Schools - getSchoolList(): Promise { + async getSchoolList(): Promise { return ApiService.apiAxios.get('/api/v1/institute/school/list'); }, - getOffshoreSchoolList(): Promise { + async getOffshoreSchoolList(): Promise { return ApiService.apiAxios.get('/api/v1/institute/offshore-school/list'); }, - getSchool(schoolId: string): Promise { + async getSchool(schoolId: string): Promise { return ApiService.apiAxios.get('/api/v1/school/'+schoolId); }, // Codes - getFacilityCodes(): Promise { + async getFacilityCodes(): Promise { return ApiService.apiAxios.get('/api/v1/institute/facility-codes'); }, - getCategoryCodes(): Promise { + async getCategoryCodes(): Promise { return ApiService.apiAxios.get('/api/v1/institute/category-codes'); }, - getContactTypeCodes(): Promise { + async getContactTypeCodes(): Promise { return ApiService.apiAxios.get('/api/v1/institute/contact-type-codes'); }, - getGradeCodes(): Promise { + async getGradeCodes(): Promise { return ApiService.apiAxios.get('/api/v1/institute/grade-codes'); }, - getAddressTypeCodes(): Promise { + async getAddressTypeCodes(): Promise { return ApiService.apiAxios.get('/api/v1/institute/address-type-codes'); }, @@ -68,13 +68,13 @@ export default { } return ApiService.apiAxios.get(url); }, - getDistrictView(id: string): Promise { + getDistrictView(id: string | undefined): Promise { return ApiService.apiAxios.get(`/api/v1/district/${id}`) }, getDistrictContactTypeCodes(): Promise { return ApiService.apiAxios.get('/api/v1/institute/district-contact-type-codes'); }, - loadCache(): Promise { + async loadCache(): Promise { return ApiService.apiAxios.get('/api/v1/institute/create-cache'); }, diff --git a/frontend/src/stores/app.ts b/frontend/src/stores/app.ts index 08dad99f..04165462 100644 --- a/frontend/src/stores/app.ts +++ b/frontend/src/stores/app.ts @@ -57,8 +57,8 @@ export const useAppStore = defineStore('app', { isIndependentSchool(schoolCategoryCode: String){ return schoolCategoryCode == 'INDEPEND' }, - setDistricts(): void { - InstituteService.getDistricts() + async setDistricts(): Promise { + await InstituteService.getDistricts() .then((response) => { // Handle the response data this.districts = response.data @@ -68,8 +68,8 @@ export const useAppStore = defineStore('app', { console.error(error) }) }, - setAuthorityList(): void { - InstituteService.getAuthorityList().then((response) => { + async setAuthorityList(): Promise { + await InstituteService.getAuthorityList().then((response) => { //handle the response this.authorities = response.data }) @@ -78,7 +78,7 @@ export const useAppStore = defineStore('app', { console.error(error) }) }, - setSchoolList(): void { + async setSchoolList(): Promise { InstituteService.getSchoolList() .then((response) => { @@ -91,7 +91,7 @@ export const useAppStore = defineStore('app', { }) }, - setOffshoreSchoolList(): void { + async setOffshoreSchoolList(): Promise { InstituteService.getOffshoreSchoolList() .then((response) => { @@ -104,14 +104,14 @@ export const useAppStore = defineStore('app', { }) }, - async setCodes() { + async setCodes(): Promise { await InstituteService.loadCache().then((response) => { //console.log(response) }).catch((error) => { console.error("ERRPR LOADING CACHE" + error) }) // set category codes - InstituteService.getCategoryCodes().then((response) => { + await InstituteService.getCategoryCodes().then((response) => { const currentDate: Date = new Date() this.categoryCodes = response.data?.filter((item: any) => { const effectiveDate: Date = new Date(item.effectiveDate); @@ -127,14 +127,14 @@ export const useAppStore = defineStore('app', { }) // set facility type codes - InstituteService.getFacilityCodes().then((response) => { + await InstituteService.getFacilityCodes().then((response) => { this.facilityCodes = response.data }).catch((error) => { console.error(error) }) // set contact type codes for Districts, Authorities, and Schools - InstituteService.getContactTypeCodes().then((response) => { + await InstituteService.getContactTypeCodes().then((response) => { const currentDate: Date = new Date() @@ -178,13 +178,13 @@ export const useAppStore = defineStore('app', { }) // set address type codes for institute addresses - InstituteService.getAddressTypeCodes().then((response) => { + await InstituteService.getAddressTypeCodes().then((response) => { this.addressTypeCodes = response.data }).catch((error) => { console.error(error) }) - InstituteService.getGradeCodes().then((response) => { + await InstituteService.getGradeCodes().then((response) => { this.gradeCodes = response.data }).catch((error) => { console.error(error) diff --git a/frontend/src/utils/common.ts b/frontend/src/utils/common.ts index a3459726..f00bbbfd 100644 --- a/frontend/src/utils/common.ts +++ b/frontend/src/utils/common.ts @@ -13,3 +13,8 @@ export function useSanitizeURL(input: string | String): String { input = input.toLowerCase().replace(/^a-zA-Z0-9 ]/g, '') return input } + +/** VALIDATION FUNCTIONS */ +export function isValidDistrictNumber(input: string | String | number): boolean { + return !!input && input.toString().length === 3 && /^\d+$/.test(input.toString()); +} diff --git a/frontend/src/views/AuthorityView.vue b/frontend/src/views/AuthorityView.vue index 34c20369..0c3cbb23 100644 --- a/frontend/src/views/AuthorityView.vue +++ b/frontend/src/views/AuthorityView.vue @@ -207,9 +207,11 @@ onMounted(async () => { :items="[ { title: 'Home', href: '/' }, 'Authority', - authority.value.authorityData?.authorityNumber + - ' ' + - authority.value.authorityData?.displayName + authority.value.authorityData + ? authority.value.authorityData.authorityNumber + + ' ' + + authority.value.authorityData.displayName + : '' ]" > @@ -313,7 +315,9 @@ onMounted(async () => { - - - - + + + + diff --git a/frontend/src/views/SchoolView.vue b/frontend/src/views/SchoolView.vue index 883df15c..c71a1edb 100644 --- a/frontend/src/views/SchoolView.vue +++ b/frontend/src/views/SchoolView.vue @@ -229,7 +229,7 @@ function goToDistrict() { :items="[ { title: 'Home', href: '/' }, 'School', - { title: schoolData?.value?.displayName, href: '' } + !!schoolData.value ? { title: schoolData.value.displayName, href: '' } : '' ]" >