"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 }; } 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 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("/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 }); }); }); module.exports = app;