forked from seekseek/ui
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.8 KiB
JavaScript
118 lines
2.8 KiB
JavaScript
"use strict";
|
|
|
|
const Promise = require("bluebird");
|
|
const express = require("express");
|
|
const path = require("path");
|
|
const defaultValue = require("default-value");
|
|
const moize = require("moize");
|
|
|
|
const config = require("../config.json");
|
|
const knex = require("knex")(require("../knexfile"));
|
|
|
|
let state = {
|
|
knex: knex,
|
|
scrapingHost: config.scrapingHost
|
|
};
|
|
|
|
const createSynchronizer = require("./sync")(state);
|
|
|
|
createSynchronizer("datasheets_products", "datasheet:", (item) => {
|
|
if (item.data.url != null) {
|
|
return {
|
|
id: item.id,
|
|
manufacturer: item.data.manufacturer,
|
|
name: item.data.name,
|
|
description: item.data.description,
|
|
source: defaultValue(item.data.source, "unknown"), // FIXME: Temporary workaround for old data
|
|
url: item.data.url,
|
|
last_updated: item.updatedAt
|
|
};
|
|
} else {
|
|
console.warn(`[warn] Item does not have a URL: ${item.id}`);
|
|
return null;
|
|
}
|
|
}, {
|
|
getLastTimestamp: function () {
|
|
return Promise.try(() => {
|
|
return knex("datasheets_products")
|
|
.orderBy("last_updated", "DESC")
|
|
.limit(1);
|
|
}).then((results) => {
|
|
console.log({results});
|
|
if (results.length > 0) {
|
|
return results[0].last_updated;
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
const getDatasheetCount = moize(() => {
|
|
return Promise.try(() => {
|
|
return knex("datasheets_products").count("url");
|
|
}).then((result) => {
|
|
return result[0].count;
|
|
});
|
|
}, { maxAge: 1000 * 60 * 1 }); // 1 minute cache
|
|
|
|
let app = express();
|
|
|
|
app.set("views", path.join(__dirname, "views"));
|
|
app.set("view engine", "jsx");
|
|
app.engine("jsx", require("@joepie91/express-react-views").createEngine());
|
|
|
|
app.use(express.static(path.join(__dirname, "../public")));
|
|
|
|
app.get("/", (req, res) => {
|
|
res.redirect("/datasheets");
|
|
});
|
|
|
|
app.get("/datasheets", (req, res) => {
|
|
return Promise.try(() => {
|
|
return getDatasheetCount();
|
|
}).then((datasheetCount) => {
|
|
res.render("datasheets/index", {
|
|
datasheetCount: datasheetCount
|
|
});
|
|
});
|
|
});
|
|
|
|
app.post("/datasheets/search", (req, res) => {
|
|
return Promise.try(() => {
|
|
// return knex.raw(`
|
|
// SELECT
|
|
// data->>'manufacturer' AS manufacturer,
|
|
// data->>'name' AS name,
|
|
// data->>'url' AS url,
|
|
// data->>'description' AS description,
|
|
// data->>'source' AS source
|
|
// FROM srap_items WHERE
|
|
// id LIKE 'datasheet:%'
|
|
// AND lower(data->>'name') LIKE :query
|
|
// ORDER BY name
|
|
// LIMIT 20
|
|
// `, {
|
|
// query: req.query.query.toLowerCase() + "%"
|
|
// });
|
|
return knex.raw(`
|
|
SELECT * FROM datasheets_products WHERE
|
|
lower(name) LIKE :query
|
|
ORDER BY name
|
|
LIMIT 20
|
|
`, {
|
|
query: req.query.query.toLowerCase() + "%"
|
|
});
|
|
}).then((result) => {
|
|
res.json({ results: result.rows });
|
|
});
|
|
});
|
|
|
|
app.get("/contact", (req, res) => {
|
|
res.render("contact");
|
|
});
|
|
|
|
app.get("/technology", (req, res) => {
|
|
res.render("technology");
|
|
});
|
|
|
|
module.exports = app;
|