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.

108 lines
2.6 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 knex = require("knex")(require("../knexfile"));
const createSynchronizer = require("./sync")({ knex: knex });
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");
});
module.exports = app;