"use strict"; const express = require("express"), fs = require("fs"), url = require("url"), config = require("config"), moment = require("moment"); let photoDB; require("../db/photos").then(function(db) { photoDB = db; }); const router = express.Router(); /* Each photos has: * locations * people * date * tags * photo info */ router.get("/memories/*", function(req, res/*, next*/) { let limit = parseInt(req.query.limit) || 50, id, cursor, index; if (req.query.next) { let parts = req.query.next.split("_"); cursor = parts[0]; id = parseInt(parts[1]); } else { cursor = ""; id = -1; } if (id == -1) { index = "strftime('%m%d',taken)=strftime('%m%d',:date)"; } else { index = "(strftime('%Y%m%d',taken)=strftime('%Y%m%d',:date) AND photos.id<"+id+ ")" + " OR (strftime('%m%d',taken)=strftime('%m%d',:date) AND strftime('%Y',taken)!=strftime('%Y',:date))"; } let date = new Date(decodeURI(req.url).replace(/\?.*$/, "")); let query = "SELECT photos.*,albums.path AS path FROM photos " + "INNER JOIN albums ON (albums.id=photos.albumId) " + "WHERE (photos.duplicate=0 AND photos.deleted=0 AND photos.scanned NOT NULL AND " + index + ") ORDER BY taken DESC,id DESC LIMIT " + (limit * 2 + 1); // console.log("Memories for " + date.toISOString().replace(/T.*/, "")); // console.log(query); return photoDB.sequelize.query(query, { replacements: { cursor: cursor, date: date }, type: photoDB.Sequelize.QueryTypes.SELECT }).then(function(photos) { photos.forEach(function(photo) { for (var key in photo) { if (photo[key] instanceof Date) { photo[key] = moment(photo[key]); } } }); if (cursor) { cursor = moment(cursor); photos = photos.filter(function(photo) { if (!cursor.isSame(photo.taken, "day")) { return true; } return photo.id < id; }); } let more = photos.length > limit; /* We queried one extra item to see if there are more than LIMIT available */ if (more) { photos.splice(limit); } let results = { items: photos }; if (more) { results.more = true; } return res.status(200).json(results); }).catch(function(error) { console.error("Query failed: " + query); return Promise.reject(error); }); }); router.get("/*", function(req, res/*, next*/) { let limit = parseInt(req.query.limit) || 50, id, cursor, index; if (req.query.next) { let parts = req.query.next.split("_"); cursor = parts[0]; id = parseInt(parts[1]); } else { cursor = ""; id = -1; } if (id == -1) { index = ""; } else { index = "AND ((strftime('%m%d',taken)=strftime('%m%d',:cursor) AND photos.id<"+id+ ") OR DATE(taken) limit; /* We queried one extra item to see if there are more than LIMIT available */ if (more) { photos.splice(limit); } let results = { items: photos }; if (more) { results.more = true; } return res.status(200).json(results); }).catch(function(error) { console.error("Query failed: " + query); return Promise.reject(error); }); }); module.exports = router;