move routes to separated file; stop running crawler in main loop
This commit is contained in:
187
index.js
187
index.js
@@ -1,45 +1,16 @@
|
|||||||
require("dotenv").config();
|
require("dotenv").config();
|
||||||
const { APP_PORT } = require("./app/config/appConfig");
|
|
||||||
|
|
||||||
const welcome = require("./app/controllers/welcome").getWelcome;
|
const express = require("express");
|
||||||
const {
|
|
||||||
getRealEstateTypes,
|
|
||||||
postRealEstateTypes
|
|
||||||
} = require("./app/controllers/realEstateTypes");
|
|
||||||
const { getSize, postSize } = require("./app/controllers/sizes");
|
|
||||||
const {
|
|
||||||
getGardenSize,
|
|
||||||
postGardenSize
|
|
||||||
} = require("./app/controllers/gardenSizes");
|
|
||||||
const { getPrice, postPrice } = require("./app/controllers/prices");
|
|
||||||
const {
|
|
||||||
getQueryReview,
|
|
||||||
postQueryReview
|
|
||||||
} = require("./app/controllers/queryReview");
|
|
||||||
const {
|
|
||||||
getQuerySubmit,
|
|
||||||
postQuerySubmit
|
|
||||||
} = require("./app/controllers/querySubmit");
|
|
||||||
const { getGoAgain } = require("./app/controllers/goAgain");
|
|
||||||
const { getLocation, postLocation } = require("./app/controllers/location");
|
|
||||||
const { getUnsubscribe } = require("./app/controllers/unsubscribe");
|
|
||||||
const { getRealEstates } = require("./app/controllers/realEstates");
|
|
||||||
const { redirect } = require("./app/controllers/redirect");
|
|
||||||
const schedule = require("node-schedule");
|
|
||||||
const crawlAll = require("./app/services/crawlerService");
|
|
||||||
const processNotifications = require("./app/services/notificationService");
|
|
||||||
|
|
||||||
let express = require("express");
|
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const bodyParser = require("body-parser");
|
const bodyParser = require("body-parser");
|
||||||
const MarketAlert = require("./app/models/marketalert");
|
|
||||||
const sendNotification = require("./app/lib/sendNotification");
|
|
||||||
const scrapTheItems = require("./app/lib/scrapTheItems");
|
|
||||||
const sequelize = require("./app/models/index").sequelize;
|
|
||||||
const Twocheckout = require("2checkout-node");
|
|
||||||
const layout = require("express-layout");
|
const layout = require("express-layout");
|
||||||
|
const compression = require("compression");
|
||||||
|
|
||||||
|
const { APP_PORT } = require("./app/config/appConfig");
|
||||||
|
const routes = require("./app/routes");
|
||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
|
|
||||||
app.use(bodyParser.json());
|
app.use(bodyParser.json());
|
||||||
app.use(bodyParser.urlencoded({ extended: true }));
|
app.use(bodyParser.urlencoded({ extended: true }));
|
||||||
|
|
||||||
@@ -47,155 +18,11 @@ app.set("views", path.join(__dirname, "/app/views"));
|
|||||||
app.set("view engine", "ejs");
|
app.set("view engine", "ejs");
|
||||||
app.use(layout());
|
app.use(layout());
|
||||||
|
|
||||||
const compression = require("compression");
|
|
||||||
app.use(compression());
|
app.use(compression());
|
||||||
|
app.use("/", routes);
|
||||||
app.get("/api/sendnotifications", async (req, res) => {
|
|
||||||
let marketAlerts = await MarketAlert.findAll();
|
|
||||||
|
|
||||||
let lastDateUpdate = await Promise.all(
|
|
||||||
marketAlerts
|
|
||||||
.map(marketAlert => {
|
|
||||||
const { id, email, olx_url, last_date } = marketAlert.dataValues;
|
|
||||||
return { id, email, olx_url, last_date };
|
|
||||||
})
|
|
||||||
.map(sendNotification)
|
|
||||||
);
|
|
||||||
lastDateUpdate = lastDateUpdate.filter(Boolean(dateUpdate));
|
|
||||||
lastDateUpdate.length &&
|
|
||||||
lastDateUpdate.forEach(dateUpdate =>
|
|
||||||
MarketAlert.update(
|
|
||||||
{ last_date: dateUpdate.date },
|
|
||||||
{ where: { id: dateUpdate.id } }
|
|
||||||
)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
app.get("/api/items/:url", async (req, res) => {
|
|
||||||
let url =
|
|
||||||
"https://www.olx.ba/pretraga?" +
|
|
||||||
req.params.url +
|
|
||||||
"&sort_order=desc&sort_po=datum";
|
|
||||||
let appts = await scrapTheItems(url);
|
|
||||||
res.json({
|
|
||||||
last_date: appts[0] && appts[0].date,
|
|
||||||
items: appts
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
app.post("/api/marketalerts", (req, res) => {
|
|
||||||
const { email, last_date, olx_url } = req.body;
|
|
||||||
console.log(email, last_date, olx_url);
|
|
||||||
sequelize.sync().then(() => {
|
|
||||||
MarketAlert.create({
|
|
||||||
olx_url,
|
|
||||||
last_date,
|
|
||||||
email
|
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
res.json({ message: "Market Alert Created!" });
|
|
||||||
})
|
|
||||||
.catch(e => console.error(e));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
app.post("/api/payforalert", (req, res) => {
|
|
||||||
let tco = new Twocheckout({
|
|
||||||
sellerId: "901402692",
|
|
||||||
privateKey: "A28DCE5F-9292-405C-8161-F84D8BB83AFC",
|
|
||||||
sandbox: true
|
|
||||||
});
|
|
||||||
|
|
||||||
let params = {
|
|
||||||
merchantOrderId: "123",
|
|
||||||
token: req.body.token,
|
|
||||||
currency: "USD",
|
|
||||||
total: "2.00",
|
|
||||||
billingAddr: {
|
|
||||||
name: "Testing Tester",
|
|
||||||
addrLine1: "123 Test St",
|
|
||||||
city: "Sarajevo",
|
|
||||||
state: "BiH",
|
|
||||||
zipCode: "71000",
|
|
||||||
country: "BiH",
|
|
||||||
email: req.body.email,
|
|
||||||
phoneNumber: "5555555555"
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
tco.checkout.authorize(params, function(error, data) {
|
|
||||||
if (error) {
|
|
||||||
res.send(error.message);
|
|
||||||
} else {
|
|
||||||
res.send(data.response.responseMsg);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
app.get("/", welcome);
|
|
||||||
app.get("/vrstanekretnine/:request_id", getRealEstateTypes);
|
|
||||||
app.get("/vrstanekretnine", getRealEstateTypes);
|
|
||||||
|
|
||||||
app.post("/vrstanekretnine/:request_id", postRealEstateTypes);
|
|
||||||
app.post("/vrstanekretnine", postRealEstateTypes);
|
|
||||||
|
|
||||||
app.get("/lokacija/:request_id", getLocation);
|
|
||||||
app.post("/lokacija/:request_id", postLocation);
|
|
||||||
|
|
||||||
app.get("/povrsina/:request_id", getSize);
|
|
||||||
app.post("/povrsina/:request_id", postSize);
|
|
||||||
|
|
||||||
app.get("/okucnica/:request_id", getGardenSize);
|
|
||||||
app.post("/okucnica/:request_id", postGardenSize);
|
|
||||||
|
|
||||||
app.get("/cijena/:request_id", getPrice);
|
|
||||||
app.post("/cijena/:request_id", postPrice);
|
|
||||||
|
|
||||||
app.get("/pregled/:request_id", getQueryReview);
|
|
||||||
app.post("/pregled/:request_id", postQueryReview);
|
|
||||||
|
|
||||||
app.get("/posalji/:request_id", getQuerySubmit);
|
|
||||||
app.post("/posalji/:request_id", postQuerySubmit);
|
|
||||||
|
|
||||||
app.get("/odjava/:request_id", getUnsubscribe);
|
|
||||||
|
|
||||||
app.get("/ponovo", getGoAgain);
|
|
||||||
|
|
||||||
app.get("/nekretnine/:request_id", getRealEstates);
|
|
||||||
|
|
||||||
app.get("/redirect/:id", redirect);
|
|
||||||
|
|
||||||
app.use("/assets", express.static("./app/public"));
|
app.use("/assets", express.static("./app/public"));
|
||||||
|
|
||||||
app.listen(APP_PORT, () =>
|
app.listen(APP_PORT, () =>
|
||||||
console.log(`Example app listening on port ${APP_PORT}!`)
|
console.log(`Example app listening on port ${APP_PORT}!`)
|
||||||
);
|
);
|
||||||
|
|
||||||
//TODO: based on node-schedule package author, setInterval is better suited for this kind of the job
|
|
||||||
const rule = new schedule.RecurrenceRule();
|
|
||||||
rule.second = 1;
|
|
||||||
schedule.scheduleJob(rule, async function() {
|
|
||||||
console.log(new Date(), "Crawler service started");
|
|
||||||
await crawlAll();
|
|
||||||
console.log(
|
|
||||||
new Date(),
|
|
||||||
"Crawler service finished, starting Notification service"
|
|
||||||
);
|
|
||||||
await processNotifications();
|
|
||||||
console.log(new Date(), "Notification service finished");
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add flat method to Array
|
|
||||||
*/
|
|
||||||
Object.defineProperty(Array.prototype, "flat", {
|
|
||||||
value: function(depth = 1) {
|
|
||||||
return this.reduce(function(flat, toFlatten) {
|
|
||||||
return flat.concat(
|
|
||||||
Array.isArray(toFlatten) && depth > 1
|
|
||||||
? toFlatten.flat(depth - 1)
|
|
||||||
: toFlatten
|
|
||||||
);
|
|
||||||
}, []);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|||||||
Reference in New Issue
Block a user