95 lines
2.4 KiB
JavaScript
95 lines
2.4 KiB
JavaScript
"use strict";
|
|
const db = require("../../models/index");
|
|
const sequelize = require("sequelize");
|
|
const Op = sequelize.Op;
|
|
const { NO_CHECK_UP_DAYS } = require("../../config/appConfig");
|
|
|
|
const findRealEstatesForSearchRequest = async searchRequestId => {
|
|
const query = {
|
|
searchRequestId
|
|
};
|
|
|
|
const realEstatesModel = { model: db.RealEstate, as: "realEstates" };
|
|
const order = [[realEstatesModel, "updatedAt", "desc"]];
|
|
const include = [realEstatesModel];
|
|
|
|
const matches = await db.SearchRequestMatch.findAll({
|
|
where: query,
|
|
include,
|
|
order
|
|
});
|
|
|
|
const matchingRealEstates = [];
|
|
for (const match of matches) {
|
|
matchingRealEstates.push(...match.realEstates);
|
|
}
|
|
|
|
return matchingRealEstates;
|
|
};
|
|
|
|
const findNotNotifiedMatches = async () => {
|
|
const query = {
|
|
notified: false
|
|
};
|
|
|
|
const searchRequestsModel = { model: db.SearchRequest, as: "searchRequests" };
|
|
const realEstateModel = { model: db.RealEstate, as: "realEstates" };
|
|
const include = [searchRequestsModel, realEstateModel];
|
|
|
|
const matchingRecords = await db.SearchRequestMatch.findAll({
|
|
where: query,
|
|
include
|
|
});
|
|
|
|
return matchingRecords;
|
|
};
|
|
const findAllRequestsForCheckUp = async () => {
|
|
//First we find IDs of search request that don't need to be emailed for check up - to EXCLUDE
|
|
//The ones that received notification for real estate NO_CHECK_UP_DAYS days from now
|
|
const date = new Date();
|
|
const checkUpDate = date.getDate() - NO_CHECK_UP_DAYS;
|
|
date.setDate(checkUpDate);
|
|
const dateQuery = {
|
|
createdAt: {
|
|
[Op.gte]: date
|
|
}
|
|
};
|
|
|
|
const excludedMatches = await db.SearchRequestMatch.findAll({
|
|
attributes: ["searchRequestId"],
|
|
where: dateQuery,
|
|
order: [["searchRequestId", "ASC"]]
|
|
});
|
|
|
|
const excludedRequestsAll = excludedMatches.map(match => {
|
|
return match.dataValues.searchRequestId;
|
|
});
|
|
//Removing duplicate search request id-s for optimization
|
|
const excludedRequests = [...new Set(excludedRequestsAll)];
|
|
|
|
const query = {
|
|
subscribed: true,
|
|
id: {
|
|
[Op.notIn]: excludedRequests
|
|
}
|
|
};
|
|
const allRequestsForCheckUp = await db.SearchRequest.findAll({
|
|
where: query
|
|
});
|
|
|
|
return allRequestsForCheckUp;
|
|
};
|
|
|
|
const addMatches = async matchingRecords => {
|
|
return await db.SearchRequestMatch.bulkCreate(matchingRecords, {
|
|
ignoreDuplicates: true
|
|
});
|
|
};
|
|
|
|
module.exports = {
|
|
findRealEstatesForSearchRequest,
|
|
addMatches,
|
|
findNotNotifiedMatches,
|
|
findAllRequestsForCheckUp
|
|
};
|