-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
115 lines (100 loc) · 3.2 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
require('dotenv').config();
const express = require('express');
const path = require('path');
const mongodb = require('mongodb').MongoClient;
const GoogleImages = require('google-images');
const client = new GoogleImages(process.env.CSE_ID, process.env.API_KEY);
const app = express();
var db = null;
app.enable('trust proxy');
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.get('/', (req, res) => {
res.render('index', {
title: 'Image Search Abstraction Layer',
url: `${req.protocol}://${req.headers.host}`
});
});
app.get('/api/latest/imagesearch/', (req, res) => {
var offset = 0;
if (req.query.offset && req.query.offset.match(/^\d+$/)) {
offset = Number(req.query.offset);
}
db.collection('search_history').find({}, {
_id: 0
}).sort({
createdAt: 1
}).limit(10).skip(offset).toArray((err, docs) => {
if (err) throw err;
res.json(docs);
});
});
app.get('/api/imagesearch/:search_term', (req, res) => {
var offset = 0;
if (req.query.offset && req.query.offset.match(/^\d+$/)) {
offset += Number(req.query.offset);
}
offset = Math.floor((offset + 10) / 10);
db.collection('search_history').insert({
term: req.params.search_term,
when: new Date()
});
db.collection('search_results').find({
search_term: req.params.search_term,
page: offset
}).toArray((err, docs) => {
if (err) throw err;
if (docs.length) {
console.log('sending cached');
res.json(docs[0].data);
}
else {
console.log('sending fresh');
client.search(req.params.search_term, {
page: offset
}).then((images) => {
var results = [];
for (var i = 0; i < images.length; i++) {
results.push({
url: images[i].url,
snippet: images[i].description,
thumbnail: images[i].thumbnail.url,
context: images[i].parentPage,
});
}
res.json(results);
db.collection('search_results').insert({
search_term: req.params.search_term,
page: offset,
createdAt: new Date(),
data: results
}, (err) => {
if (err) throw err;
});
}).catch((err) => {
console.error(err);
res.status(500).json({
'error': err
});
});
}
});
});
app.use(express.static(path.join(__dirname, 'public')));
mongodb.connect(process.env.MONGO_URL, (err, database) => {
if (err) throw err;
db = database;
db.collection('search_results').createIndex({
createdAt: 1
}, {
expireAfterSeconds: 86400
});
db.collection('search_history').createIndex({
when: 1
}, {
expireAfterSeconds: 86400
});
var listener = app.listen(process.env.PORT || 3000, () => {
console.log(`Server listening on ${listener.address().port}`);
});
});