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.

90 lines
2.2 KiB
JavaScript

3 years ago
"use strict";
const Promise = require("bluebird");
const express = require("express");
const path = require("path");
2 years ago
const defaultValue = require("default-value");
const moize = require("moize");
3 years ago
const knex = require("knex")(require("../knexfile"));
2 years ago
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
};
} else {
console.warn(`[warn] Item does not have a URL: ${item.id}`);
return null;
}
});
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
3 years ago
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) => {
2 years ago
return Promise.try(() => {
return getDatasheetCount();
}).then((datasheetCount) => {
res.render("datasheets/index", {
datasheetCount: datasheetCount
});
});
3 years ago
});
app.post("/search", (req, res) => {
return Promise.try(() => {
2 years ago
// 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() + "%"
// });
3 years ago
return knex.raw(`
2 years ago
SELECT * FROM datasheets_products WHERE
lower(name) LIKE :query
3 years ago
ORDER BY name
LIMIT 20
`, {
query: req.query.query.toLowerCase() + "%"
});
}).then((result) => {
res.json({ results: result.rows });
});
});
module.exports = app;