Created
February 4, 2021 17:22
-
-
Save krushndayshmookh/37e27f3dd8dedcdd1f7457b3175438e5 to your computer and use it in GitHub Desktop.
Search Services Under Business with Population of other services if matches are less than limit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const Service = require('../models/service').model | |
const Business = require('../models/business').model | |
exports.search_get = async (req, res) => { | |
const { searchQuery } = req.query | |
let query = {} | |
if (searchQuery) { | |
query.name = { $regex: searchQuery, $options: 'i' } | |
} | |
try { | |
let matchServices = await Service.find(query) | |
.limit(15) | |
.populate([{ path: 'business', select: 'name image address rating' }]) | |
.lean() | |
let matchBusinesses = await Business.find(query) | |
.select('name image address rating') | |
.limit(15) | |
.lean() | |
let matchBusinessesIds = matchBusinesses.map(b => b._id) | |
console.log(matchBusinessesIds) | |
// create list of all businesses linked to services | |
let serviceBusinesses = [ | |
...new Set( | |
matchServices | |
.map(s => s.business) | |
.filter(b => !matchBusinessesIds.includes(b._id)) | |
) | |
] | |
// merge found businesses and service-linked businesses | |
let businesses = [...matchBusinesses, ...serviceBusinesses] | |
businesses.forEach(b => (b.services = [])) | |
let businessesIds = businesses.map(b => b._id) | |
// fill all services in respective businesses | |
matchServices.forEach(s => { | |
let b = s.business._id | |
if (businessesIds.indexOf(b) != -1) { | |
delete s.business | |
businesses[businessesIds.indexOf(b)].services.push(s) | |
} | |
}) | |
for (let i = 0; i < businesses.length; i++) { | |
// populate empty places with rest of the services | |
let diff = 5 - businesses[i].services.length | |
if (diff > 0) { | |
let existing = businesses[i].services.map(s => s._id) | |
let extraServices = await Service.find({ | |
business: businesses[i]._id, | |
_id: { | |
$nin: existing | |
} | |
}) | |
.limit(diff) | |
.lean() | |
businesses[i].services = businesses[i].services.concat(extraServices) | |
} | |
// set business ids on services for handling in cart | |
businesses[i].services.forEach( | |
s => (s.business = { _id: businesses[i]._id }) | |
) | |
} | |
return res.send(businesses) | |
} catch (err) { | |
console.error(err) | |
return res.status(500).send(err) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment