Skip to content

Commit

Permalink
Add city and subdivision filtering to initiative fetching logic
Browse files Browse the repository at this point in the history
  • Loading branch information
guillecro committed Feb 6, 2025
1 parent 122e03e commit e10ff5e
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 6 deletions.
8 changes: 5 additions & 3 deletions controllers/initiativeController.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ exports.fetch = async (req, res) => {
const limit = parseInt(req.query.limit) || 20;
const queryName = req.query.q || null;
let dimension = req.query.dimension || null;
const city = req.query.city || null;
const subdivision = req.query.subdivision || null;
let includeUnpublished = req.query.includeUnpublished || false;
const isAdmin = UtilsHelper.isAdmin(req.user);

Expand Down Expand Up @@ -54,13 +56,13 @@ exports.fetch = async (req, res) => {
if(dimension) {
// if it's an array of 2 dimensions, we'll use the getInitiativeIdsByTwoDimensions
if(Array.isArray(dimension) && dimension.length === 2) {
result = await InitiativeHelper.getIdsByTwoDimensions(dimension[0], dimension[1], queryName, includeUnpublished);
result = await InitiativeHelper.getIdsByTwoDimensions(dimension[0], dimension[1], queryName, includeUnpublished, city, subdivision);
}
else {
result = await InitiativeHelper.getInitiativeIdsByOneDimension(dimension, queryName, includeUnpublished);
result = await InitiativeHelper.getInitiativeIdsByOneDimension(dimension, queryName, includeUnpublished, city, subdivision);
}
} else {
result = await InitiativeHelper.getIdsWithoutFilteringByDimensions(queryName, includeUnpublished);
result = await InitiativeHelper.getIdsWithoutFilteringByDimensions(queryName, includeUnpublished, city, subdivision);
}

// get the ids from the result
Expand Down
36 changes: 33 additions & 3 deletions helpers/initiativeHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,16 @@ const { Op, QueryTypes } = require('sequelize');
const dimension = require('../models/dimension');


exports.getInitiativeIdsByOneDimension = async (dimensionId, initiativeName = null, includeUnpublished = false) => {
exports.getInitiativeIdsByOneDimension = async (dimensionId, initiativeName = null, includeUnpublished = false, cityId = null, subdivisionId = null) => {
try {
console.log(dimensionId)
console.log(initiativeName)
console.log(includeUnpublished)
let sqlQuery = `
SELECT i.id
FROM Initiatives as i
LEFT JOIN Subdivisions s on i.subdivisionId = s.id
LEFT JOIN Cities c on s.cityId = c.id
JOIN InitiativeDimensions IniDim ON i.id = IniDim.initiativeId
WHERE IniDim.dimensionId = :dimensionId AND :otherConditions
`;
Expand All @@ -24,6 +26,14 @@ exports.getInitiativeIdsByOneDimension = async (dimensionId, initiativeName = nu
otherConditionsArr.push(`i.name LIKE '%${initiativeName}%'`)
}

if(subdivisionId) {
otherConditionsArr.push(`i.subdivisionId = ${subdivisionId}`)
} else {
if(cityId) {
otherConditionsArr.push(`c.id = ${cityId}`)
}
}

if(!includeUnpublished) {
otherConditionsArr.push(`i.publishedAt IS NOT NULL`)
}
Expand All @@ -49,11 +59,13 @@ exports.getInitiativeIdsByOneDimension = async (dimensionId, initiativeName = nu
}
}

exports.getIdsByTwoDimensions = async (dimensionId1, dimensionId2, initiativeName = null, includeUnpublished = false) => {
exports.getIdsByTwoDimensions = async (dimensionId1, dimensionId2, initiativeName = null, includeUnpublished = false, cityId = null, subdivisionId = null) => {
try {
let sqlQuery = `
SELECT i.id
FROM Initiatives i
LEFT JOIN Subdivisions s on i.subdivisionId = s.id
LEFT JOIN Cities c on s.cityId = c.id
JOIN InitiativeDimensions IniDim1 ON i.id = IniDim1.initiativeId
JOIN InitiativeDimensions IniDim2 ON i.id = IniDim2.initiativeId
WHERE IniDim1.dimensionId = :dimensionId1
Expand All @@ -74,6 +86,14 @@ exports.getIdsByTwoDimensions = async (dimensionId1, dimensionId2, initiativeNam
if(initiativeName) {
otherConditionsArr.push(`i.name LIKE '%${initiativeName}%'`)
}

if(subdivisionId) {
otherConditionsArr.push(`i.subdivisionId = ${subdivisionId}`)
} else {
if(cityId) {
otherConditionsArr.push(`c.id = ${cityId}`)
}
}

if(!includeUnpublished) {
otherConditionsArr.push(`i.publishedAt IS NOT NULL`)
Expand All @@ -97,12 +117,14 @@ exports.getIdsByTwoDimensions = async (dimensionId1, dimensionId2, initiativeNam
}
}

exports.getIdsWithoutFilteringByDimensions = async (initiativeName = null, includeUnpublished = false) => {
exports.getIdsWithoutFilteringByDimensions = async (initiativeName = null, includeUnpublished = false, cityId = null, subdivisionId = null) => {

try {
let sqlQuery = `
SELECT i.id
FROM Initiatives as i
LEFT JOIN Subdivisions s on i.subdivisionId = s.id
LEFT JOIN Cities c on s.cityId = c.id
WHERE :otherConditions
`;

Expand All @@ -113,6 +135,14 @@ exports.getIdsWithoutFilteringByDimensions = async (initiativeName = null, inclu
otherConditionsArr.push(`i.name LIKE '%${initiativeName}%'`)
}

if(subdivisionId) {
otherConditionsArr.push(`i.subdivisionId = ${subdivisionId}`)
} else {
if(cityId) {
otherConditionsArr.push(`c.id = ${cityId}`)
}
}

if(!includeUnpublished) {
otherConditionsArr.push(`i.publishedAt IS NOT NULL`)
}
Expand Down
2 changes: 2 additions & 0 deletions routes/initiative.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ router.get('/',
query('limit').optional().isInt().withMessage(msg.validationError.integer),
query('dimension.*').optional().isInt().withMessage(msg.validationError.integer),
query('includeUnpublished').optional().isBoolean().withMessage(msg.validationError.string),
query('city').optional().isInt().withMessage(msg.validationError.integer),
query('subdivision').optional().isInt().withMessage(msg.validationError.string),
query('q').optional().isString().withMessage(msg.validationError.string),
],
validate,
Expand Down

0 comments on commit e10ff5e

Please sign in to comment.