mirror of
https://github.com/BobbyWibowo/lolisafe.git
synced 2024-12-13 16:06:21 +00:00
3e3878b93c
Please consult the Help? button again to learn all the syntax changes! The prompt will now also have its width expanded! Updated dependency, knex: 0.20.13 -> 0.20.15. Added new dependency: search-query-parser. Updated all sub-dependencies. Critical? Admins-only API /users/edit will no longer return NEW password salt of the user when randomizing their password. Added page.escape() function to js/misc/utils.js. This will be used to escape input in upload filters input box. The same function used in utilsController.js. Pretty dates will now use / instead of - for date separator. This is due to the fact that date range key for filtering uploads can not accepts dates with - separator. To avoid inconsistency, we will now use / separator. Caching system of album public pages will now be disabled during development (yarn develop). Cleaned up domClick() function in js/dashboard.js. If using date or expiry range keys when filtering uploads, attach client's timezone offset to the API requets. This will be used by the server to calculate timezone differences. Success prompt when changing token will now auto-close. Removed ID column from Manage Users. Improved success prompt when editing users. This will properly list all of the edited fields at once, excluding user group change. Success message for user group change will require a bit more changes on the API endpoint, which is a bit annoying. Rebuilt client-side assets and bumped v1 version string.
108 lines
3.3 KiB
JavaScript
108 lines
3.3 KiB
JavaScript
const routes = require('express').Router()
|
|
const path = require('path')
|
|
const paths = require('./../controllers/pathsController')
|
|
const utils = require('./../controllers/utilsController')
|
|
const config = require('./../config')
|
|
const db = require('knex')(config.database)
|
|
|
|
routes.get('/a/:identifier', async (req, res, next) => {
|
|
const identifier = req.params.identifier
|
|
if (identifier === undefined)
|
|
return res.status(401).json({
|
|
success: false,
|
|
description: 'No identifier provided.'
|
|
})
|
|
|
|
const album = await db.table('albums')
|
|
.where({
|
|
identifier,
|
|
enabled: 1
|
|
})
|
|
.select('id', 'name', 'identifier', 'editedAt', 'download', 'public', 'description')
|
|
.first()
|
|
|
|
if (!album)
|
|
return res.status(404).sendFile(path.join(paths.errorRoot, config.errorPages[404]))
|
|
else if (album.public === 0)
|
|
return res.status(403).json({
|
|
success: false,
|
|
description: 'This album is not available for public.'
|
|
})
|
|
|
|
const nojs = req.query.nojs !== undefined
|
|
|
|
let cacheid
|
|
if (process.env.NODE_ENV !== 'development') {
|
|
// Cache ID - we initialize a separate cache for No-JS version
|
|
cacheid = nojs ? `${album.id}-nojs` : album.id
|
|
|
|
if (!utils.albumsCache[cacheid])
|
|
utils.albumsCache[cacheid] = {
|
|
cache: null,
|
|
generating: false,
|
|
// Cache will actually be deleted after the album has been updated,
|
|
// so storing this timestamp may be redundant, but just in case.
|
|
generatedAt: 0
|
|
}
|
|
|
|
if (!utils.albumsCache[cacheid].cache && utils.albumsCache[cacheid].generating)
|
|
return res.json({
|
|
success: false,
|
|
description: 'This album is still generating its public page.'
|
|
})
|
|
else if ((album.editedAt < utils.albumsCache[cacheid].generatedAt) || utils.albumsCache[cacheid].generating)
|
|
return res.send(utils.albumsCache[cacheid].cache)
|
|
|
|
// Use current timestamp to make sure cache is invalidated
|
|
// when an album is edited during this generation process.
|
|
utils.albumsCache[cacheid].generating = true
|
|
utils.albumsCache[cacheid].generatedAt = Math.floor(Date.now() / 1000)
|
|
}
|
|
|
|
const files = await db.table('files')
|
|
.select('name', 'size')
|
|
.where('albumid', album.id)
|
|
.orderBy('id', 'desc')
|
|
|
|
album.thumb = ''
|
|
album.totalSize = 0
|
|
|
|
for (const file of files) {
|
|
album.totalSize += parseInt(file.size)
|
|
|
|
file.extname = path.extname(file.name)
|
|
if (utils.mayGenerateThumb(file.extname)) {
|
|
file.thumb = `thumbs/${file.name.slice(0, -file.extname.length)}.png`
|
|
// If thumbnail for album is still not set, set it to current file's full URL.
|
|
// A potential improvement would be to let the user set a specific image as an album cover.
|
|
if (!album.thumb) album.thumb = file.name
|
|
}
|
|
}
|
|
|
|
album.downloadLink = album.download === 0
|
|
? null
|
|
: `api/album/zip/${album.identifier}?v=${album.editedAt}`
|
|
|
|
album.url = `a/${album.identifier}`
|
|
|
|
return res.render('album', {
|
|
config,
|
|
versions: utils.versionStrings,
|
|
album,
|
|
files,
|
|
nojs
|
|
}, (error, html) => {
|
|
const data = error ? null : html
|
|
if (cacheid) {
|
|
utils.albumsCache[cacheid].cache = data
|
|
utils.albumsCache[cacheid].generating = false
|
|
}
|
|
|
|
// Express should already send error to the next handler
|
|
if (error) return
|
|
return res.send(data)
|
|
})
|
|
})
|
|
|
|
module.exports = routes
|