CinemaPress/routes/admin.js
2020-03-22 03:37:28 +02:00

1179 lines
33 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict';
/**
* Module dependencies.
*/
var CP_get = require('../lib/CP_get.min');
var CP_save = require('../lib/CP_save.min');
var CP_cache = require('../lib/CP_cache');
var CP_structure = require('../lib/CP_structure');
/**
* Configuration dependencies.
*/
var config = require('../config/production/config');
var modules = require('../config/production/modules');
/**
* Node dependencies.
*/
var express = require('express');
var sinoni = require('sinoni');
var fs = require('fs');
var exec = require('child_process').exec;
var path = require('path');
var multer = require('multer');
var async = require('async');
var Sharp = require('sharp');
var i18n = require('i18n');
var router = express.Router();
/**
* Translation module.
*/
i18n.configure({
locales: [
'ru',
'en',
'es',
'de',
'fr',
'ja',
'pt',
'it',
'zh',
'pl',
'nl',
'tr',
'cs',
'ko',
'vi',
'sv',
'hu',
'el',
'ro',
'sk',
'da',
'id',
'fi',
'th',
'bg',
'uk',
'ar',
'sq',
'lt',
'hr',
'sr',
'bn',
'sl',
'et',
'lv',
'hi',
'sw'
],
directory: path.join(
__dirname,
'..',
'themes',
'default',
'public',
'admin',
'locales'
),
updateFiles: false
});
/**
* Middleware functions.
*/
router.use(i18n.init);
/**
* Callback.
*
* @callback Callback
* @param {Object} err
* @param {Object} [result]
*/
router.get('/:type?', function(req, res) {
var c = JSON.stringify(config);
var m = JSON.stringify(modules);
var host = req.get('host');
var port =
/:[0-9]{1,5}$/.test(host) && !/:80$/.test(host) && !/:443$/.test(host)
? ':' + host.split(':')[1]
: '';
var render = {
config: JSON.parse(c),
modules: JSON.parse(m),
type: req.params.type || 'index',
url: '/' + config.urls.admin + '/' + (req.params.type || 'index'),
languages: [],
language: config.language
};
render.config.domain =
port && render.config.domain.indexOf(port) === -1
? render.config.domain + port
: render.config.domain;
render.icons = {
index: 'fa fa-database',
main: 'fa fa-cog',
publish: 'fa fa-clock',
homepage: 'fa fa-bars',
display: 'fa fa-list',
urls: 'fa fa-sitemap',
codes: 'fa fa-code',
movies: 'fa fa-film',
titles: 'fa fa-pencil-alt',
h1: 'fa fa-pen-fancy',
descriptions: 'fa fa-pen-alt',
soon: 'far fa-calendar-alt',
comments: 'fa fa-comments',
related: 'far fa-list-alt',
content: 'fa fa-pen-nib',
slider: 'fa fa-images',
abuse: 'far fa-copyright',
top: 'fa fa-chart-bar',
social: 'fab fa-facebook-f',
schema: 'fa fa-key',
continue: 'fa fa-history',
viewed: 'fa fa-eye',
player: 'fa fa-play',
blocking: 'fa fa-lock',
mobile: 'fa fa-mobile-alt',
episode: 'fa fa-hand-spock',
adv: 'fa fa-dollar-sign',
rss: 'fa fa-rss',
tv: 'fa fa-tv',
random: 'fa fa-dice',
rewrite: 'far fa-hand-rock',
app: 'fas fa-desktop',
ftp: 'fas fa-cloud-upload-alt'
};
render.icon = render.icons[render.type];
var id =
typeof req.query.id !== 'undefined' ||
typeof req.query.kp_id !== 'undefined' ||
typeof req.query.imdb_id !== 'undefined' ||
typeof req.query.tmdb_id !== 'undefined' ||
typeof req.query.douban_id !== 'undefined'
? '_add_'
: '';
var kp_id = req.query.kp_id
? req.query.kp_id.replace(/[^0-9]/g, '')
: req.query.id
? req.query.id.replace(/[^0-9]/g, '')
: '';
var imdb_id = req.query.imdb_id
? req.query.imdb_id.replace(/[^0-9]/g, '')
: '';
var tmdb_id = req.query.tmdb_id
? req.query.tmdb_id.replace(/[^0-9]/g, '')
: '';
var douban_id = req.query.douban_id
? req.query.douban_id.replace(/[^0-9]/g, '')
: '';
var comment_id = req.query.comment_id ? req.query.comment_id : null;
var url = req.query.url ? req.query.url : null;
var num = req.query.num ? parseInt(req.query.num) : 1;
var type = req.query.type ? parseInt(req.query.type) : '';
if (req.query.language) {
res.cookie('language', req.query.language, {
maxAge: 2147483647,
httpOnly: true
});
res.setLocale(req.query.language);
} else if (req.cookies.language) {
res.setLocale(req.cookies.language);
} else {
res.setLocale(config.language);
}
render.languages = res.getLocales();
render.language = res.getLocale();
switch (req.params.type) {
case 'homepage':
render.title = res.__('Главная');
res.render('admin/homepage', render);
break;
case 'movies':
render.title = res.__('Фильмы');
getMovie(function(err, render) {
res.render('admin/movies', render);
});
break;
case 'main':
render.title = res.__('Настройки');
getThemes(function(err, themes) {
if (err) return res.render('error', { message: err });
render.themes = themes;
res.render('admin/main', render);
});
break;
case 'urls':
render.title = res.__('URL');
res.render('admin/urls', render);
break;
case 'display':
render.title = res.__('Отображение');
res.render('admin/display', render);
break;
case 'titles':
render.title = res.__('Названия');
res.render('admin/titles', render);
break;
case 'h1':
render.title = res.__('H1');
res.render('admin/h1', render);
break;
case 'descriptions':
render.title = res.__('Описания');
res.render('admin/descriptions', render);
break;
case 'codes':
render.title = res.__('Коды');
res.render('admin/codes', render);
break;
case 'publish':
render.title = res.__('Автопубликация');
getCountMovies(function(err, render) {
CP_get.publishIds(function(err, ids) {
if (err) console.error(err);
render.soon_id = ids && ids.soon_id ? ids.soon_id : [];
res.render('admin/publish', render);
});
});
break;
case 'comments':
render.title = res.__('Комментарии');
getComment(function(err, render) {
res.render('admin/modules/comments', render);
});
break;
case 'related':
render.title = res.__('Связанные');
res.render('admin/modules/related', render);
break;
case 'slider':
render.title = res.__('Слайдер');
res.render('admin/modules/slider', render);
break;
case 'abuse':
render.title = res.__('Скрыть');
res.render('admin/modules/abuse', render);
break;
case 'top':
render.title = res.__('Топ');
res.render('admin/modules/top', render);
break;
case 'social':
render.title = res.__('Социальные сети');
res.render('admin/modules/social', render);
break;
case 'schema':
render.title = res.__('Микроразметка');
res.render('admin/modules/schema', render);
break;
case 'soon':
render.title = res.__('Скоро');
res.render('admin/modules/soon', render);
break;
case 'continue':
render.title = res.__('Продолжить');
res.render('admin/modules/continue', render);
break;
case 'viewed':
render.title = res.__('Просмотренные');
res.render('admin/modules/viewed', render);
break;
case 'player':
render.title = res.__('Плеер');
res.render('admin/modules/player', render);
break;
case 'blocking':
render.title = res.__('Блокировка');
res.render('admin/modules/blocking', render);
break;
case 'mobile':
render.title = res.__('Мобильная версия');
res.render('admin/modules/mobile', render);
break;
case 'episode':
render.title = res.__('Серии');
res.render('admin/modules/episode', render);
break;
case 'adv':
render.title = res.__('Реклама');
res.render('admin/modules/adv', render);
break;
case 'content':
render.title = res.__('Контент');
getContent(function(err, render) {
res.render('admin/modules/content', render);
});
break;
case 'rss':
render.title = res.__('RSS');
res.render('admin/modules/rss', render);
break;
case 'tv':
render.title = res.__('ТВ версия');
res.render('admin/modules/tv', render);
break;
case 'random':
render.title = res.__('Случайный');
res.render('admin/modules/random', render);
break;
case 'rewrite':
render.title = res.__('Рерайт');
res.render('admin/modules/rewrite', render);
break;
case 'app':
render.title = res.__('Приложение');
getApps(function(err, apps) {
if (err) return res.render('error', { message: err });
render.apps = apps;
res.render('admin/modules/app', render);
});
break;
case 'ftp':
render.title = res.__('Файловый менеджер');
res.render('admin/modules/ftp', render);
break;
case 'poster':
getMovie(function(err, render) {
res.redirect(302, render);
});
break;
default:
render.title = res.__('Панель администратора');
getCountMovies(function(err, render) {
res.render('admin/index', render);
});
break;
}
/**
* Get movie.
*
* @param {Callback} callback
*/
function getMovie(callback) {
render.num = num;
render.all = num;
render.mass = null;
render.movie = null;
render.movies = null;
render.structure = null;
if (id) {
var query = { certainly: true };
if (kp_id) {
query['query_id'] = kp_id;
} else if (imdb_id) {
query['custom.imdb_id'] = imdb_id;
} else if (tmdb_id) {
query['custom.tmdb_id'] = tmdb_id;
} else if (douban_id) {
query['custom.douban_id'] = douban_id;
} else {
render.movie = {};
render.structure = {};
return callback(null, render);
}
CP_get.movies(query, 1, 'kinopoisk-id-up', 1, false, function(
err,
movies
) {
if (err) console.error(err);
render.structure = {};
render.movie = {
kp_id: kp_id,
type: type
};
render.movie.custom = JSON.stringify({
imdb_id: imdb_id,
tmdb_id: tmdb_id,
douban_id: douban_id
});
if (movies && movies.length) {
render.movie = JSON.parse(JSON.stringify(movies[0]));
render.structure = CP_structure.movie(movies)[0];
}
if (req.params.type === 'poster') {
callback(
null,
render.structure.poster
? render.structure.poster
: config.protocol +
config.subdomain +
config.domain +
'/files/poster/no.jpg'
);
} else {
callback(null, render);
}
});
} else {
CP_get.movies(
{ from: process.env.CP_RT, certainly: true },
config.default.count,
'kinopoisk-id-up',
num,
function(err, movies) {
if (err) console.error(err);
render.movies = [];
if (movies && movies.length) {
render.next = !(movies.length % config.default.count) ? 1 : 0;
render.movies = movies;
}
callback(null, render);
}
);
}
}
/**
* Get content.
*
* @param {Callback} callback
*/
function getContent(callback) {
render.num = num;
render.all = num;
render.content = null;
render.contents = null;
if (url === '_add_') {
render.content = {};
callback(null, render);
} else if (url) {
CP_get.contents({ content_url: url }, 1, 1, false, function(
err,
contents
) {
if (err) console.error(err);
render.content = {};
render.content.content_url = url;
if (contents && contents.length) {
render.content = contents[0];
}
callback(null, render);
});
} else {
CP_get.contents({}, 50, num, false, function(err, contents) {
if (err) console.error(err);
render.contents = [];
if (contents && contents.length) {
render.next = !(contents.length % 50) ? 1 : 0;
render.contents = contents;
}
callback(null, render);
});
}
}
/**
* Get comments.
*
* @param {Callback} callback
*/
function getComment(callback) {
render.num = num;
render.all = num;
render.comment = null;
render.comments = null;
if (comment_id) {
CP_get.comments({ comment_id: comment_id }, 1, '', 1, function(
err,
comments
) {
if (err) console.error(err);
render.comment = {};
render.comment.id = comment_id;
if (comments && comments.length) {
render.comment = comments[0];
}
callback(null, render);
});
} else {
CP_get.comments({}, 10, '', num, function(err, comments) {
if (err) console.error(err);
render.comments = [];
if (comments && comments.length) {
render.next = !(comments.length % 10) ? 1 : 0;
render.comments = comments;
}
callback(null, render);
});
}
}
/**
* Get count all and publish movies in website.
*
* @param {Callback} callback
*/
function getCountMovies(callback) {
async.series(
{
all: function(callback) {
CP_get.count({ certainly: true, full: true }, function(err, count) {
if (err) return callback(err);
callback(null, count);
});
},
fil: function(callback) {
CP_get.count({ certainly: true }, function(err, count) {
if (err) return callback(err);
callback(null, count);
});
},
pub: function(callback) {
CP_get.count({}, function(err, count) {
if (err) return callback(err);
callback(null, count);
});
}
},
function(err, result) {
if (err) {
console.error(err);
result = { all: 0, fil: 0, pub: 0 };
}
render.line = { counts: result };
render.line.percent = { all: 100 };
render.line.percent.fil = render.line.counts.all
? Math.round(
(render.line.percent.all * render.line.counts.fil) /
render.line.counts.all
)
: 0;
render.line.percent.pub = render.line.counts.all
? Math.round(
(render.line.percent.all * render.line.counts.pub) /
render.line.counts.all
)
: 0;
render.line.percent.top =
render.line.counts.pub && render.line.counts.fil
? Math.round(
(render.line.percent.all * render.line.counts.pub) /
render.line.counts.fil
)
: 0;
render.line.percent.pub =
render.line.percent.top === 100 ? 100 : render.line.percent.pub;
render.line.days =
render.line.counts.fil - render.line.counts.pub &&
config.publish.every.movies &&
config.publish.every.hours
? Math.round(
(render.line.counts.fil - render.line.counts.pub) /
Math.round(
(24 * config.publish.every.movies) /
config.publish.every.hours
)
)
: 0;
callback(null, render);
}
);
}
/**
* Get themes name.
*
* @param {Callback} callback
*/
function getThemes(callback) {
var dir = path.join(path.dirname(__filename), '..', 'themes');
fs.readdir(dir, function(err, files) {
if (err) return callback(err);
var dirs = [];
for (var index = 0; index < files.length; ++index) {
var file = files[index];
if (file[0] !== '.') {
var filePath = path.join(dir, file);
fs.stat(
filePath,
function(err, stat) {
if (err) return callback(err);
if (stat.isDirectory()) {
dirs.push(this.file);
}
if (files.length === this.index + 1) {
return callback(null, dirs);
}
}.bind({ index: index, file: file })
);
}
}
});
}
/**
* Get list apps.
*
* @param {Callback} callback
*/
function getApps(callback) {
var apps = {};
var dir_win = path.join(path.dirname(__filename), '..', 'files', 'windows');
var dir_osx = path.join(path.dirname(__filename), '..', 'files', 'osx');
var dir_linux = path.join(path.dirname(__filename), '..', 'files', 'linux');
if (fs.existsSync(dir_win)) {
var files_win = fs.readdirSync(dir_win);
files_win.sort(function(a, b) {
return (
fs.statSync(dir_win + a).mtime.getTime() -
fs.statSync(dir_win + b).mtime.getTime()
);
});
apps.windows = files_win[0];
}
if (fs.existsSync(dir_osx)) {
var files_osx = fs.readdirSync(dir_osx);
files_osx.sort(function(a, b) {
return (
fs.statSync(dir_osx + a).mtime.getTime() -
fs.statSync(dir_osx + b).mtime.getTime()
);
});
apps.osx = files_osx[0];
}
if (fs.existsSync(dir_linux)) {
var files_linux = fs.readdirSync(dir_linux);
files_linux.sort(function(a, b) {
return (
fs.statSync(dir_linux + a).mtime.getTime() -
fs.statSync(dir_linux + b).mtime.getTime()
);
});
apps.linux = files_linux[0];
}
callback(null, apps);
}
});
router.post('/change', function(req, res) {
var form = req.body;
var configs = {
config: config,
modules: modules
};
if (
form.movie &&
(typeof form.movie.tmdb_id !== 'undefined' ||
typeof form.movie.imdb_id !== 'undefined' ||
typeof form.movie.douban_id !== 'undefined')
) {
try {
var custom = {};
if (form.movie.tmdb_id && form.movie.tmdb_id.replace(/[^0-9]/g, '')) {
custom.tmdb_id = form.movie.tmdb_id.replace(/[^0-9]/g, '');
}
if (form.movie.imdb_id && form.movie.imdb_id.replace(/[^0-9]/g, '')) {
custom.imdb_id = form.movie.imdb_id.replace(/[^0-9]/g, '');
}
if (form.movie.douban_id && form.movie.douban_id.replace(/[^0-9]/g, '')) {
custom.douban_id = form.movie.douban_id.replace(/[^0-9]/g, '');
delete form.movie.douban_id;
}
delete form.movie.tmdb_id;
delete form.movie.imdb_id;
delete form.movie.douban_id;
form.movie.custom = JSON.stringify(
Object.assign(JSON.parse(form.movie.custom), custom)
);
} catch (e) {
console.error(e);
}
}
async.series(
{
id: function(callback) {
if (form.movie && (form.movie.kp_id || form.movie.id)) {
var id = form.movie.id || form.movie.kp_id || '';
id = ('' + id).replace(/[^0-9]/g, '');
form.movie.id = form.movie.kp_id =
id && parseInt(id) ? parseInt(id) : 0;
}
if (form.movie && !form.movie.id) {
CP_get.movies(
{ certainly: true },
1,
'kinopoisk-id-up',
1,
false,
function(err, movies) {
if (err) console.error(err);
var id = 10000000;
form.movie.id = form.movie.kp_id =
movies && movies.length && parseInt(movies[0].id) <= id
? id + 1
: parseInt(movies[0].id) + 1;
callback(null, form.movie.id);
}
);
} else {
callback(null, 'Null');
}
},
keys: function(callback) {
if (form.movie && form.movie.id) {
var id = '' + form.movie.id;
var keys = config.index.ids.keys.split(',');
var count = config.index.ids.count;
if (keys.length) {
var i = keys.indexOf(id);
if (i + 1) keys.splice(i, 1);
}
if (!form.delete) {
keys.unshift(id);
keys = keys.slice(0, count);
}
form.config = {
index: {
ids: {
keys: keys
.filter(function(key) {
return !!key.replace(/[^0-9]/, '');
})
.join(',')
}
}
};
form.flush_memcached = true;
callback(null, 'Keys');
} else {
callback(null, 'Null');
}
},
config: function(callback) {
if (!form.config) return callback(null, 'Null');
form.flush_memcached = true;
if (
(form.config.urls &&
form.config.urls.admin &&
form.config.urls.admin !== configs.config.urls.admin &&
/^admin/.test(form.config.urls.admin)) ||
(form.config.theme && form.config.theme !== configs.config.theme) ||
(form.config.language &&
form.config.language !== configs.config.language)
) {
form.restart = true;
}
if (
form.config.urls &&
form.config.urls.admin &&
/^admin/.test(form.config.urls.admin) === false
) {
form.config.urls.admin = configs.config.urls.admin;
}
configs.config = parseData(configs.config, form.config);
CP_save.save(configs.config, 'config', function(err, result) {
return err ? callback(err) : callback(null, result);
});
},
modules: function(callback) {
if (!form.modules) return callback(null, 'Null');
form.flush_memcached = true;
configs.modules = parseData(configs.modules, form.modules);
CP_save.save(configs.modules, 'modules', function(err, result) {
return err ? callback(err) : callback(null, result);
});
},
movie: function(callback) {
if (!form.movie || !form.movie.id) return callback(null, 'Null');
form.flush_memcached = true;
form.movie.search = form.movie.title_ru
? form.movie.title_ru +
(form.movie.title_en ? ' / ' + form.movie.title_en : '')
: form.movie.title_en
? form.movie.title_en
: '';
form.movie.premiere =
form.movie.premiere &&
!isNaN(new Date(form.movie.premiere).getFullYear())
? Math.floor(
new Date(form.movie.premiere).getTime() / 1000 / 60 / 60 / 24 +
719528
) + ''
: '0';
form.movie.country = form.movie.country
? form.movie.country
.replace(/\s*,\s*/g, ',')
.replace(/\s+/g, ' ')
.replace(/(^\s*)|(\s*)$/g, '')
: '_empty';
form.movie.genre = form.movie.genre
? form.movie.genre
.replace(/\s*,\s*/g, ',')
.replace(/\s+/g, ' ')
.replace(/(^\s*)|(\s*)$/g, '')
: '_empty';
form.movie.director = form.movie.director
? form.movie.director
.replace(/\s*,\s*/g, ',')
.replace(/\s+/g, ' ')
.replace(/(^\s*)|(\s*)$/g, '')
: '_empty';
form.movie.actor = form.movie.actor
? form.movie.actor
.replace(/\s*,\s*/g, ',')
.replace(/\s+/g, ' ')
.replace(/(^\s*)|(\s*)$/g, '')
: '_empty';
form.movie.type = form.movie.type ? form.movie.type : '0';
form.movie.poster = form.movie.poster ? form.movie.poster : '';
addMovie(form.movie, function(err, result) {
return err ? callback(err) : callback(null, result);
});
},
switch: function(callback) {
if (!form.switch || !form.switch.module || !modules[form.switch.module])
return callback(null, 'Null');
form.flush_memcached = true;
configs.modules[form.switch.module].status =
form.switch.status === 'true';
CP_save.save(configs.modules, 'modules', function(err, result) {
return err ? callback(err) : callback(null, result);
});
},
content: function(callback) {
if (!form.content) return callback(null, 'Null');
form.flush_memcached = true;
if (form.delete) {
if (!form.content.id) return callback(null, 'Null');
form.content.delete = true;
}
CP_save.save(form.content, 'content', function(err, result) {
return err ? callback(err) : callback(null, result);
});
},
comment: function(callback) {
if (!form.comment) return callback(null, 'Null');
form.flush_memcached = true;
if (form.delete) {
if (!form.comment.id) return callback(null, 'Null');
form.comment.delete = true;
}
CP_save.save(form.comment, 'comment', function(err, result) {
return err ? callback(err) : callback(null, result);
});
},
pagespeed: function(callback) {
if (!form.config || typeof form.config.pagespeed === 'undefined')
return callback(null, 'Null');
exec(
'/usr/bin/cinemapress container speed ' + form.config.pagespeed,
function(err) {
setTimeout(function() {
form.flush = true;
return err ? callback(err) : callback(null, 'PageSpeed');
}, 5000);
}
);
},
protocol: function(callback) {
if (!form.config || typeof form.config.protocol === 'undefined')
return callback(null, 'Null');
exec(
'/usr/bin/cinemapress container protocol "' +
form.config.protocol +
'"',
function(err) {
setTimeout(function() {
form.flush = true;
return err ? callback(err) : callback(null, 'Protocol');
}, 5000);
}
);
},
flush: function(callback) {
if (!form.flush) return callback(null, 'Null');
form.flush_static = true;
form.flush_memcached = true;
return callback(null, 'Flush');
},
flush_static: function(callback) {
if (!form.flush_static) return callback(null, 'Null');
exec('touch /var/ngx_pagespeed_cache/cache.flush', function(err) {
process.env.CP_VER = process.env.CP_VER
? parseInt(process.env.CP_VER) + 1
: new Date().getTime().toString();
return err ? callback(err) : callback(null, 'FlushStatic');
});
},
flush_memcached: function(callback) {
if (!form.flush_memcached) return callback(null, 'Null');
CP_cache.flush(function() {
process.env.CP_VER = process.env.CP_VER
? parseInt(process.env.CP_VER) + 1
: new Date().getTime().toString();
return callback(null, 'FlushMemcached');
});
},
database: function(callback) {
if (!form.database) return callback(null, 'Null');
exec(
'nohup /usr/bin/cinemapress database ' +
config.domain +
' ' +
form.database +
' > ' +
path.join(path.dirname(__filename), '..', 'log', 'database.log') +
' &',
function(err) {
setTimeout(function() {
return err ? callback(err) : callback(null, 'Database');
}, 1000 * 60 * 9.5);
}
);
},
restart: function(callback) {
if (!form.restart) return callback(null, 'Null');
exec(
'cd /home/' +
config.domain +
' && pm2 restart process.json --update-env',
function(err) {
return err ? callback(err) : callback(null, 'Restart');
}
);
}
},
function(err, result) {
return err ? res.status(404).send(err) : res.json(result);
}
);
/**
* Determine what the configuration settings have been changed.
*
* @param {Object} config
* @param {Object} changes
* @return {Object}
*/
function parseData(config, changes) {
var originals = config;
for (var key in originals) {
if (originals.hasOwnProperty(key) && changes.hasOwnProperty(key)) {
if (Array.isArray(originals[key])) {
var arr =
typeof changes[key] === 'string'
? changes[key].split(',')
: Array.isArray(changes[key])
? changes[key]
: [];
var clear_arr = [];
arr.forEach(function(text) {
text = text
.replace(/(^\s*)|(\s*)$/g, '')
.replace(/\u2028/g, '')
.replace(/\u2029/g, '');
if (text) {
clear_arr.push(text);
}
});
originals[key] = clear_arr;
} else if (typeof originals[key] === 'string') {
originals[key] = ('' + changes[key])
.replace(/\u2028/g, '')
.replace(/\u2029/g, '');
} else if (typeof originals[key] === 'number') {
originals[key] = parseInt(changes[key]);
} else if (typeof originals[key] === 'boolean') {
originals[key] = changes[key] === 'true';
} else if (typeof originals[key] === 'object') {
originals[key] = parseData(originals[key], changes[key]);
}
}
}
return originals;
}
/**
* Add movie in rt.
*
* @param {Object} movie
* @param {Callback} callback
*/
function addMovie(movie, callback) {
if (form.delete) {
movie.delete = true;
}
CP_save.save(movie, 'rt', function(err, result) {
return err ? callback(err) : callback(null, result);
});
}
});
router.post('/upload/:renamed?', function(req, res) {
var filepath = path.join(__dirname, '..', 'files');
var filename = 'CinemaPress.png';
var fieldname = '';
var storage = multer.diskStorage({
destination: function(req, file, cb) {
fieldname =
file.fieldname === 'content_image' ? 'content' : file.fieldname;
exec(
'mkdir -p ' +
path.join(filepath, fieldname, 'original') +
' ' +
path.join(filepath, fieldname, 'medium') +
' ' +
path.join(filepath, fieldname, 'small'),
function(err) {
if (err) {
console.error(err);
return res.status(404).send('{"error": "MKDIR"}');
}
cb(null, path.join(filepath, fieldname, 'original'));
}
);
},
filename: function(req, file, cb) {
filename =
req && req.params && req.params.renamed
? req.params.renamed + path.extname(file.originalname)
: Date.now() + '-' + file.originalname;
cb(null, filename);
}
});
var upload = multer({
storage: storage,
fileFilter: function(req, file, callback) {
var ext = path.extname(file.originalname);
if (
ext !== '.png' &&
ext !== '.jpg' &&
ext !== '.gif' &&
ext !== '.jpeg'
) {
return callback('Only images are allowed', null);
}
callback(null, true);
}
}).any();
upload(req, res, function(err) {
if (err) {
console.error(err);
return res.status(404).send('{"error": "UPLOAD"}');
}
async.eachOfLimit(
['medium', 'small'],
1,
function(size, key, callback) {
Sharp.cache(false);
Sharp(path.join(filepath, fieldname, 'original', filename))
.resize({
width: size === 'medium' ? 500 : 120,
withoutEnlargement: true
})
.jpeg({ quality: 80, progressive: true, force: false })
.webp({ quality: 80, lossless: true, force: false })
.png({ quality: 80, compressionLevel: 8, force: false })
.toFile(path.join(filepath, fieldname, size, filename), function(
err
) {
callback(err);
});
},
function(err) {
if (err) {
console.error(err);
res
.status(200)
.send(
'{"file": "' +
path.join('/', 'files', fieldname, 'original', filename) +
'"}'
);
}
res
.status(200)
.send(
'{"file": "' +
path.join('/', 'files', fieldname, 'medium', filename) +
'"}'
);
}
);
});
});
router.post('/rewrite', function(req, res) {
sinoni({
token: modules.rewrite.data.token,
double: modules.rewrite.data.double,
unique: modules.rewrite.data.unique,
text: req.body.text,
lang: config.language
})
.then(function(result) {
return res.status(200).json(result);
})
.catch(function(error) {
console.error(error);
return res.status(404).json(error);
});
});
module.exports = router;