mirror of
https://github.com/muerwre/orchidmap-front.git
synced 2025-04-25 11:06:40 +07:00
removed backend part
This commit is contained in:
parent
7bea7b9ed1
commit
dd6f163793
36 changed files with 0 additions and 1040 deletions
|
@ -1,59 +0,0 @@
|
||||||
/*
|
|
||||||
https://habr.com/company/ruvds/blog/321104/
|
|
||||||
*/
|
|
||||||
const createError = require('http-errors');
|
|
||||||
const express = require('express');
|
|
||||||
const path = require('path');
|
|
||||||
const cookieParser = require('cookie-parser');
|
|
||||||
const lessMiddleware = require('less-middleware');
|
|
||||||
const logger = require('morgan');
|
|
||||||
const bodyParser = require('body-parser');
|
|
||||||
|
|
||||||
const routeRouter = require('./routes/route');
|
|
||||||
const authRouter = require('./routes/auth');
|
|
||||||
const db = require('./config/db');
|
|
||||||
|
|
||||||
const app = express();
|
|
||||||
|
|
||||||
// view engine setup
|
|
||||||
app.set('views', path.join(__dirname, 'views'));
|
|
||||||
app.set('view engine', 'pug');
|
|
||||||
|
|
||||||
app.use(logger('dev'));
|
|
||||||
app.use(express.json());
|
|
||||||
app.use(express.urlencoded({ extended: false }));
|
|
||||||
app.use(cookieParser());
|
|
||||||
app.use(lessMiddleware(path.join(__dirname, 'public')));
|
|
||||||
app.use(express.static(path.join(__dirname, 'public')));
|
|
||||||
app.use((req, res, next) => {
|
|
||||||
res.header('Access-Control-Allow-Origin', '*');
|
|
||||||
res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, PATCH');
|
|
||||||
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
|
|
||||||
next();
|
|
||||||
});
|
|
||||||
|
|
||||||
app.use(bodyParser.json());
|
|
||||||
app.use(express.json());
|
|
||||||
|
|
||||||
// app.use('/', indexRouter);
|
|
||||||
// app.use('/users', usersRouter);
|
|
||||||
app.use('/auth', authRouter);
|
|
||||||
app.use('/route', routeRouter);
|
|
||||||
// catch 404 and forward to error handler
|
|
||||||
app.use((req, res, next) => {
|
|
||||||
next(createError(404));
|
|
||||||
});
|
|
||||||
|
|
||||||
// error handler
|
|
||||||
app.use((err, req, res, next) => {
|
|
||||||
// set locals, only providing error in development
|
|
||||||
res.locals.message = err.message;
|
|
||||||
res.locals.error = req.app.get('env') === 'development' ? err : {};
|
|
||||||
|
|
||||||
// render the error page
|
|
||||||
res.status(err.status || 500);
|
|
||||||
res.render('error');
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = app;
|
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
#!/usr/bin/env node
|
|
||||||
const { CONFIG } = require('../../config/backend');
|
|
||||||
|
|
||||||
const app = require('../app');
|
|
||||||
const fs = require('fs');
|
|
||||||
const http = require('http');
|
|
||||||
const https = require('https');
|
|
||||||
|
|
||||||
if (CONFIG.HTTP.ENABLED) {
|
|
||||||
const httpPort = CONFIG.HTTP.PORT;
|
|
||||||
// app.set('port', httpPort);
|
|
||||||
|
|
||||||
const httpServer = http.createServer(app);
|
|
||||||
httpServer.listen(httpPort);
|
|
||||||
|
|
||||||
httpServer.on('error', console.log);
|
|
||||||
httpServer.on('listening', console.log);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CONFIG.HTTPS.ENABLED) {
|
|
||||||
const sslPort = CONFIG.HTTPS.PORT;
|
|
||||||
// app.set('port', sslPort);
|
|
||||||
|
|
||||||
const key = fs.readFileSync(CONFIG.HTTPS.PRIVATE_KEY, 'utf8');
|
|
||||||
const cert = fs.readFileSync(CONFIG.HTTPS.CERTIFICATE, 'utf8');
|
|
||||||
const ca = fs.readFileSync(CONFIG.HTTPS.CA, 'utf8');
|
|
||||||
|
|
||||||
const sslServer = https.createServer({ key, cert, ca }, app);
|
|
||||||
|
|
||||||
sslServer.listen(sslPort);
|
|
||||||
sslServer.on('error', console.log);
|
|
||||||
sslServer.on('listening', console.log);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
const { CONFIG } = require('../../config/backend');
|
|
||||||
|
|
||||||
const {
|
|
||||||
DB: {
|
|
||||||
USER, PASSWORD, HOSTNAME, PORT, DATABASE
|
|
||||||
}
|
|
||||||
} = CONFIG;
|
|
||||||
|
|
||||||
const mongoose = require('mongoose');
|
|
||||||
mongoose.Promise = require('bluebird');
|
|
||||||
|
|
||||||
mongoose.connect(`mongodb://${USER}:${PASSWORD}@${HOSTNAME}:${PORT}/${DATABASE}`, { });
|
|
||||||
const database = mongoose.connection;
|
|
||||||
|
|
||||||
database.on('error', (err) => { console.error(`Database Connection Error: ${err}`); process.exit(2); });
|
|
||||||
database.on('connected', () => { console.info('Succesfully connected to MongoDB Database'); });
|
|
||||||
|
|
||||||
console.log(`DB: mongodb://${USER}:${PASSWORD}@${HOSTNAME}:${PORT}/${DATABASE}`);
|
|
|
@ -1,11 +0,0 @@
|
||||||
// export const OAUTH_FAILED_TITLE = 'Ошибка авторизации';
|
|
||||||
module.exports.STRINGS = {
|
|
||||||
OAUTH: {
|
|
||||||
ERROR_TITLE: 'Ошибка авторизации',
|
|
||||||
ERROR_HEADING: 'Ошибка',
|
|
||||||
ERROR_TEXT: 'Авторизация не удалась, попробуйте еще раз',
|
|
||||||
ERROR_CLOSE_BUTTON: 'ЗАКРЫТЬ',
|
|
||||||
|
|
||||||
SUCCESS_TITLE: 'Успешно!',
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -1,23 +0,0 @@
|
||||||
const mongoose = require('mongoose');
|
|
||||||
|
|
||||||
const { Schema } = mongoose;
|
|
||||||
|
|
||||||
const RouteSchema = new Schema({
|
|
||||||
_id: { type: String, required: true },
|
|
||||||
title: { type: String, default: '' },
|
|
||||||
version: { type: Number, default: 2 },
|
|
||||||
route: { type: Array, default: [] },
|
|
||||||
stickers: { type: Array, default: [] },
|
|
||||||
owner: { type: Schema.Types.ObjectId, ref: 'User' },
|
|
||||||
distance: { type: Number, default: 0 },
|
|
||||||
is_public: { type: Boolean, default: false },
|
|
||||||
is_starred: { type: Boolean, default: false },
|
|
||||||
is_deleted: { type: Boolean, default: false },
|
|
||||||
created_at: { type: Date, default: Date.now() },
|
|
||||||
updated_at: { type: Date, default: Date.now() },
|
|
||||||
logo: { type: String, default: 'DEFAULT' },
|
|
||||||
provider: { type: String, default: 'DEFAULT' },
|
|
||||||
description: { type: String, default: '' },
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports.RouteSchema = RouteSchema;
|
|
|
@ -1,27 +0,0 @@
|
||||||
const mongoose = require('mongoose');
|
|
||||||
const { Schema } = mongoose;
|
|
||||||
|
|
||||||
// Schemas
|
|
||||||
const UserSchema = new Schema(
|
|
||||||
{
|
|
||||||
_id: { type: String, required: true },
|
|
||||||
role: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
enum: ['admin', 'guest', 'user', 'vk'],
|
|
||||||
},
|
|
||||||
token: { type: String, required: true },
|
|
||||||
created_at: { type: Date, required: true, default: Date.now },
|
|
||||||
|
|
||||||
first_name: { type: String },
|
|
||||||
last_name: { type: String },
|
|
||||||
photo: { type: String },
|
|
||||||
version: { type: Number, default: 2 },
|
|
||||||
routes: [{ type: Schema.Types.ObjectId, ref: 'Route' }]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
module.exports.UserSchema = UserSchema;
|
|
|
@ -1,8 +0,0 @@
|
||||||
const mongoose = require('mongoose');
|
|
||||||
|
|
||||||
const { UserSchema } = require('./User');
|
|
||||||
const { RouteSchema } = require('./Route');
|
|
||||||
|
|
||||||
module.exports.User = mongoose.model('User', UserSchema);
|
|
||||||
module.exports.Route = mongoose.model('Route', RouteSchema);
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
body{background:#6d9dc8;font:14px "Lucida Grande",Helvetica,Arial,sans-serif;color:white;margin:0;font-weight:300}div#message{padding:100px;display:flex;align-items:center;justify-content:center;flex-direction:column;height:100vh;width:100vw;margin:0;position:absolute;box-sizing:border-box;text-align:left}div.bg{background:white;color:#666666;padding:20px 40px;border-radius:4px}h1{margin-bottom:10px;text-transform:uppercase}button{height:32px;padding:0 24px;color:white;border:none;box-sizing:border-box;margin-top:40px;border-radius:3px;background:#6d9dc8;font-weight:bold;float:right;cursor:pointer}
|
|
|
@ -1,47 +0,0 @@
|
||||||
body {
|
|
||||||
background: #6d9dc8;
|
|
||||||
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
|
|
||||||
color: white;
|
|
||||||
margin: 0;
|
|
||||||
font-weight: 300;
|
|
||||||
}
|
|
||||||
|
|
||||||
div#message {
|
|
||||||
padding: 100px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
flex-direction: column;
|
|
||||||
height: 100vh;
|
|
||||||
width: 100vw;
|
|
||||||
margin: 0;
|
|
||||||
position: absolute;
|
|
||||||
box-sizing: border-box;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.bg {
|
|
||||||
background: white;
|
|
||||||
color: #666666;
|
|
||||||
padding: 20px 40px;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
margin-bottom: 10px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
height: 32px;
|
|
||||||
padding: 0 24px;
|
|
||||||
color: white;
|
|
||||||
border: none;
|
|
||||||
box-sizing: border-box;
|
|
||||||
margin-top: 40px;
|
|
||||||
border-radius: 3px;
|
|
||||||
background: #6d9dc8;
|
|
||||||
font-weight: bold;
|
|
||||||
float: right;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
body{padding:50px;font:14px "Lucida Grande",Helvetica,Arial,sans-serif}a{color:#00B7FF}
|
|
|
@ -1,8 +0,0 @@
|
||||||
body {
|
|
||||||
padding: 50px;
|
|
||||||
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: #00B7FF;
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
const express = require('express');
|
|
||||||
const guest = require('./auth/guest');
|
|
||||||
const list = require('./auth/list');
|
|
||||||
const check = require('./auth/check');
|
|
||||||
const vk = require('./auth/social/vk');
|
|
||||||
const iframe_vk = require('./auth/iframe/vk');
|
|
||||||
|
|
||||||
const router = express.Router();
|
|
||||||
|
|
||||||
router.get('/', check);
|
|
||||||
// router.get('/list', list);
|
|
||||||
router.get('/guest', guest);
|
|
||||||
router.get('/social/vk', vk);
|
|
||||||
router.get('/iframe/vk', iframe_vk);
|
|
||||||
|
|
||||||
module.exports = router;
|
|
|
@ -1,24 +0,0 @@
|
||||||
const { User } = require('../../models');
|
|
||||||
const { generateGuest, generateRandomUrl } = require('./guest');
|
|
||||||
|
|
||||||
module.exports = async (req, res) => {
|
|
||||||
const { id, token } = req.query;
|
|
||||||
|
|
||||||
const user = await User.findOne({ _id: id, token });
|
|
||||||
|
|
||||||
const random_url = await generateRandomUrl();
|
|
||||||
|
|
||||||
if (user) {
|
|
||||||
return res.send({
|
|
||||||
success: true, ...user.toObject(), id: user._id, random_url
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const guest = await generateGuest();
|
|
||||||
const created = await User.create(guest).then(result => result.toObject());
|
|
||||||
|
|
||||||
return res.send({
|
|
||||||
success: false, error: 'user not found', error_code: 1231, ...created, id: created._id, random_url
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
const { genRandomSequence } = require('../../utils/gen');
|
|
||||||
const { User } = require('../../models');
|
|
||||||
|
|
||||||
const generateGuestToken = () => {
|
|
||||||
const _id = `guest:${genRandomSequence(16)}`;
|
|
||||||
|
|
||||||
return User.find({ _id }).then(user => {
|
|
||||||
if (user.length) return generateGuestToken();
|
|
||||||
|
|
||||||
return _id;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const generateUser = (_id, role = 'guest') => {
|
|
||||||
const token = `seq:${genRandomSequence(32)}`;
|
|
||||||
|
|
||||||
return { _id, token, role };
|
|
||||||
};
|
|
||||||
|
|
||||||
const saveUser = user => {
|
|
||||||
const model = new User({ ...user });
|
|
||||||
|
|
||||||
return model.save()
|
|
||||||
.then(() => model.toObject())
|
|
||||||
.catch(() => ({
|
|
||||||
...user,
|
|
||||||
success: false,
|
|
||||||
error: 'Error saving user model',
|
|
||||||
error_code: 1232,
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
|
|
||||||
const generateRandomUrl = () => Promise.resolve(genRandomSequence(16));
|
|
||||||
|
|
||||||
const generateGuest = async () => {
|
|
||||||
const user = await generateGuestToken()
|
|
||||||
.then(generateUser);
|
|
||||||
const random_url = await generateRandomUrl();
|
|
||||||
|
|
||||||
return { ...user, random_url, first_name: '', last_name: '', photo: '' };
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = async (req, res) => {
|
|
||||||
const user = await generateGuest().then(saveUser);
|
|
||||||
|
|
||||||
res.send({ success: true, ...user });
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports.generateUser = generateUser;
|
|
||||||
module.exports.generateGuest = generateGuest;
|
|
||||||
module.exports.generateGuestToken = generateGuestToken;
|
|
||||||
module.exports.generateRandomUrl = generateRandomUrl;
|
|
|
@ -1,22 +0,0 @@
|
||||||
const { User } = require('../../../models');
|
|
||||||
const { CONFIG } = require('../../../../config/backend');
|
|
||||||
const md5 = require('js-md5');
|
|
||||||
const { generateRandomUrl } = require('../guest');
|
|
||||||
|
|
||||||
module.exports = async (req, res) => {
|
|
||||||
if (!CONFIG.SOCIAL.VK_IFRAME.ENABLED) return res.send({ success: false, error: 'Unsupported Method' });
|
|
||||||
|
|
||||||
const { query: { viewer_id, auth_key } } = req;
|
|
||||||
|
|
||||||
const checksum = md5(`${CONFIG.SOCIAL.VK_IFRAME.APP_ID}_${viewer_id}_${CONFIG.SOCIAL.VK_IFRAME.SECRET}`);
|
|
||||||
|
|
||||||
if (checksum !== auth_key) return res.send({ success: false, error: 'No such user (1)' });
|
|
||||||
|
|
||||||
const user = await User.findOne({ _id: `vk:${viewer_id}` }).populate('routes');
|
|
||||||
|
|
||||||
if (!user) return res.send({ success: false, error: 'No such user (2)' });
|
|
||||||
|
|
||||||
const random_url = await generateRandomUrl();
|
|
||||||
return res.send({ success: true, user: { ...user.toObject(), id: user._id, random_url } });
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
const { User } = require('../../models');
|
|
||||||
|
|
||||||
module.exports = (req, res) => User.find((err, articles) => {
|
|
||||||
if (!err) return res.send(articles);
|
|
||||||
|
|
||||||
res.statusCode = 500;
|
|
||||||
return res.send({ error: 'Server error' });
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
const { User } = require('../../../models');
|
|
||||||
const axios = require('axios');
|
|
||||||
const { generateUser } = require('../guest');
|
|
||||||
const { STRINGS } = require('../../../config/strings');
|
|
||||||
const { CONFIG } = require('../../../../config/backend');
|
|
||||||
|
|
||||||
const fetchUserData = async (req, res) => {
|
|
||||||
const { query: { code } } = req;
|
|
||||||
const host = req.get('host');
|
|
||||||
const proto = req.connection.encrypted ? 'https' : 'http';
|
|
||||||
|
|
||||||
const { data: { access_token, user_id } } = await axios.get(
|
|
||||||
'https://oauth.vk.com/access_token',
|
|
||||||
{
|
|
||||||
params: {
|
|
||||||
client_id: CONFIG.SOCIAL.VK.APP_ID,
|
|
||||||
client_secret: CONFIG.SOCIAL.VK.SECRET,
|
|
||||||
code,
|
|
||||||
redirect_uri: `${proto}://${host}/api/auth/social/vk`,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
).catch(() => {
|
|
||||||
return res.render('social/vk_error', {
|
|
||||||
title: STRINGS.OAUTH.ERROR_TITLE,
|
|
||||||
heading: STRINGS.OAUTH.ERROR_HEADING,
|
|
||||||
reason: STRINGS.OAUTH.ERROR_TEXT,
|
|
||||||
button: STRINGS.OAUTH.ERROR_CLOSE_BUTTON,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const { data } = await axios.get(
|
|
||||||
'https://api.vk.com/method/users.get',
|
|
||||||
{
|
|
||||||
params: {
|
|
||||||
user_id,
|
|
||||||
fields: 'photo',
|
|
||||||
v: '5.67',
|
|
||||||
access_token,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
).catch(() => {
|
|
||||||
return res.render('social/vk_error', {
|
|
||||||
title: STRINGS.OAUTH.ERROR_TITLE,
|
|
||||||
heading: STRINGS.OAUTH.ERROR_HEADING,
|
|
||||||
reason: STRINGS.OAUTH.ERROR_TEXT,
|
|
||||||
button: STRINGS.OAUTH.ERROR_CLOSE_BUTTON,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return data;
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = async (req, res) => {
|
|
||||||
const { response } = await fetchUserData(req, res);
|
|
||||||
|
|
||||||
const {
|
|
||||||
first_name = '', last_name = '', photo = '', id = ''
|
|
||||||
} = response[0];
|
|
||||||
|
|
||||||
const newUser = await generateUser(`vk:${id}`, 'vk');
|
|
||||||
const name = `${first_name} ${last_name}`;
|
|
||||||
const user = {
|
|
||||||
...newUser, first_name, last_name, photo, name,
|
|
||||||
};
|
|
||||||
|
|
||||||
const auth = await User.findOne({ _id: user._id }).populate('routes');
|
|
||||||
|
|
||||||
if (auth) {
|
|
||||||
await auth.set({
|
|
||||||
first_name, last_name, name, photo
|
|
||||||
}).save();
|
|
||||||
|
|
||||||
res.render('social/success', { title: STRINGS.OAUTH.SUCCESS_TITLE, ...user, token: auth.token });
|
|
||||||
} else {
|
|
||||||
const created = await User.create(user, (err, result) => {
|
|
||||||
return result.toObject();
|
|
||||||
});
|
|
||||||
|
|
||||||
res.render('social/success', { title: STRINGS.OAUTH.SUCCESS_TITLE, ...user, ...created });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
const express = require('express');
|
|
||||||
const router = express.Router();
|
|
||||||
|
|
||||||
/* GET home page. */
|
|
||||||
router.get('/', function(req, res, next) {
|
|
||||||
res.render('index', { title: 'Express' });
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = router;
|
|
|
@ -1,18 +0,0 @@
|
||||||
const express = require('express');
|
|
||||||
const post = require('./route/post');
|
|
||||||
const get = require('./route/get');
|
|
||||||
const list = require('./route/list');
|
|
||||||
const drop = require('./route/drop');
|
|
||||||
const patch = require('./route/patch');
|
|
||||||
const star = require('./route/star');
|
|
||||||
|
|
||||||
const router = express.Router();
|
|
||||||
|
|
||||||
router.post('/star', star);
|
|
||||||
router.post('/', post);
|
|
||||||
router.get('/', get);
|
|
||||||
router.patch('/', patch);
|
|
||||||
router.delete('/', drop);
|
|
||||||
router.get('/list', list);
|
|
||||||
|
|
||||||
module.exports = router;
|
|
|
@ -1,19 +0,0 @@
|
||||||
const { User, Route } = require('../../models');
|
|
||||||
|
|
||||||
module.exports = async (req, res) => {
|
|
||||||
const { body: { id, token, address } } = req;
|
|
||||||
|
|
||||||
const owner = await User.findOne({ _id: id, token }).populate('routes');
|
|
||||||
|
|
||||||
if (!owner) return res.send({ success: false, reason: 'unauthorized' });
|
|
||||||
|
|
||||||
const exists = await Route.findOne({ _id: address }).populate('owner', '_id');
|
|
||||||
|
|
||||||
if (!exists) return res.send({ success: false, mode: 'not_exists' });
|
|
||||||
if (exists && exists.owner._id !== id) return res.send({ success: false, mode: 'not_yours' });
|
|
||||||
|
|
||||||
await exists.set({ is_deleted: true }).save();
|
|
||||||
|
|
||||||
return res.send({ success: true, address });
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
const { generateRandomUrl } = require('../auth/guest');
|
|
||||||
const { Route } = require('../../models');
|
|
||||||
|
|
||||||
module.exports = async (req, res) => {
|
|
||||||
const { query: { name } } = req;
|
|
||||||
|
|
||||||
if (!name) return res.send({ success: false, mode: 'not_found_1' });
|
|
||||||
|
|
||||||
const exists = await Route.findOne({ _id: name, is_deleted: false }).populate('owner', '_id');
|
|
||||||
|
|
||||||
if (!exists) return res.send({ success: false, mode: 'not_found_2' });
|
|
||||||
const data = exists.toObject();
|
|
||||||
const random_url = await generateRandomUrl();
|
|
||||||
|
|
||||||
return res.send({
|
|
||||||
success: true,
|
|
||||||
...data,
|
|
||||||
address: exists._id,
|
|
||||||
owner: {
|
|
||||||
...data.owner,
|
|
||||||
id: data.owner._id,
|
|
||||||
},
|
|
||||||
random_url,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,96 +0,0 @@
|
||||||
const { Route, User } = require('../../models');
|
|
||||||
|
|
||||||
module.exports = async (req, res) => {
|
|
||||||
const {
|
|
||||||
query: {
|
|
||||||
id, token, title, distance, author, step = 20, shift = 0, starred,
|
|
||||||
}
|
|
||||||
} = req;
|
|
||||||
|
|
||||||
const is_starred = parseInt(starred, 10) === 1;
|
|
||||||
const user = await User.findOne({ _id: id, token });
|
|
||||||
|
|
||||||
let criteria = { is_deleted: false };
|
|
||||||
|
|
||||||
if (title) {
|
|
||||||
criteria = {
|
|
||||||
...criteria,
|
|
||||||
$or: [
|
|
||||||
{ title: new RegExp(title.trim(), 'ig') },
|
|
||||||
{ _id: new RegExp(title.trim(), 'ig') },
|
|
||||||
],
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_starred) {
|
|
||||||
criteria = {
|
|
||||||
...criteria,
|
|
||||||
is_starred: true,
|
|
||||||
is_public: true,
|
|
||||||
};
|
|
||||||
} else if (!author || !user || (user._id !== author)) {
|
|
||||||
criteria = {
|
|
||||||
...criteria,
|
|
||||||
is_starred: false,
|
|
||||||
is_public: true,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
let list = await Route.find(
|
|
||||||
{
|
|
||||||
...criteria,
|
|
||||||
},
|
|
||||||
'_id title distance owner updated_at is_public is_deleted is_starred',
|
|
||||||
{
|
|
||||||
limit: 9000,
|
|
||||||
sort: { updated_at: -1 },
|
|
||||||
}
|
|
||||||
).populate('owner', '_id');
|
|
||||||
|
|
||||||
|
|
||||||
list = list.filter(item => !author || (item.owner && item.owner._id === author));
|
|
||||||
|
|
||||||
let limits = list.reduce(({ min, max }, { distance: dist }) => ({
|
|
||||||
min: Math.floor(Math.min(dist, min) / 25) * 25,
|
|
||||||
max: Math.ceil(Math.max(dist, max) / 25) * 25,
|
|
||||||
}), { min: 999999, max: 0 });
|
|
||||||
|
|
||||||
const minDist = parseInt(distance[0], 10);
|
|
||||||
const maxDist = parseInt(distance[1], 10) === 200 ? 99999 : parseInt(distance[1], 10);
|
|
||||||
// const maxDist = parseInt(distance[1], 10) > parseInt(distance[0], 10)
|
|
||||||
// ? parseInt(distance[1], 10)
|
|
||||||
// : 10000;
|
|
||||||
|
|
||||||
if (distance && distance.length === 2 && !(minDist === maxDist && minDist === 0)) {
|
|
||||||
list = list.filter(item => (
|
|
||||||
item.distance >= minDist &&
|
|
||||||
item.distance <= maxDist
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
const limit = list.length;
|
|
||||||
|
|
||||||
if (step) {
|
|
||||||
list = list.slice(parseInt(shift, 10), (parseInt(shift, 10) + parseInt(step, 10)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (list.length === 0) {
|
|
||||||
limits = { min: 0, max: 0 };
|
|
||||||
} else if (limits.max === 0) {
|
|
||||||
limits = { min: 0, max: 0 };
|
|
||||||
} else if (limits.min === limits.max) {
|
|
||||||
limits = { min: limits.max - 25, max: limits.max };
|
|
||||||
} else if (limits.max > 200) {
|
|
||||||
limits = { min: limits.min, max: 200 };
|
|
||||||
}
|
|
||||||
|
|
||||||
res.send({
|
|
||||||
success: true,
|
|
||||||
list,
|
|
||||||
limit,
|
|
||||||
step: parseInt(step, 10),
|
|
||||||
shift: parseInt(shift, 10),
|
|
||||||
...limits,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
const { User, Route } = require('../../models');
|
|
||||||
|
|
||||||
const { parseString } = require('../../utils/parse');
|
|
||||||
|
|
||||||
module.exports = async (req, res) => {
|
|
||||||
const { body, body: { id, token, address } } = req;
|
|
||||||
|
|
||||||
const owner = await User.findOne({ _id: id, token }).populate('routes');
|
|
||||||
|
|
||||||
if (!owner) return res.send({ success: false, reason: 'unauthorized' });
|
|
||||||
|
|
||||||
const title = parseString(body.title, 64);
|
|
||||||
const is_public = !!body.is_public;
|
|
||||||
|
|
||||||
const exists = await Route.findOne({ _id: address, is_deleted: false }).populate('owner', '_id');
|
|
||||||
|
|
||||||
if (!exists) return res.send({ success: false, mode: 'not_exists' });
|
|
||||||
if (exists && exists.owner._id !== id) return res.send({ success: false, mode: 'not_yours' });
|
|
||||||
|
|
||||||
await exists.set({ title, is_public }).save();
|
|
||||||
|
|
||||||
return res.send({ success: true, ...exists });
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,57 +0,0 @@
|
||||||
const { User, Route } = require('../../models');
|
|
||||||
|
|
||||||
const {
|
|
||||||
parseRoute, parseStickers, parseString, parseNumber, parseAddress
|
|
||||||
} = require('../../utils/parse');
|
|
||||||
|
|
||||||
module.exports = async (req, res) => {
|
|
||||||
const { body, body: { id, token, force } } = req;
|
|
||||||
|
|
||||||
const owner = await User.findOne({ _id: id, token }).populate('routes');
|
|
||||||
if (!owner) {
|
|
||||||
return res.send({
|
|
||||||
success: false, reason: 'unauthorized', id, token
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const title = parseString(body.title, 64);
|
|
||||||
const description = parseString(body.description, 256);
|
|
||||||
const address = parseAddress(body.address, 32);
|
|
||||||
const route = parseRoute(body.route);
|
|
||||||
const stickers = parseStickers(body.stickers);
|
|
||||||
const logo = parseString(body.logo, 16);
|
|
||||||
const provider = parseString(body.provider, 16) || 'DEFAULT';
|
|
||||||
const distance = parseNumber(body.distance, 0, 1000);
|
|
||||||
const is_public = !!body.is_public;
|
|
||||||
|
|
||||||
if ((!route || route.length <= 0) && (!stickers || stickers.length <= 0)) {
|
|
||||||
return res.send({ success: false, mode: 'empty' });
|
|
||||||
}
|
|
||||||
|
|
||||||
const exists = await Route.findOne({ _id: address }).populate('owner', '_id');
|
|
||||||
|
|
||||||
if (exists && exists.owner._id !== id) return res.send({ success: false, mode: 'exists' });
|
|
||||||
if (exists && !force) return res.send({ success: false, mode: 'overwriting' });
|
|
||||||
|
|
||||||
if (exists) {
|
|
||||||
await exists.set({
|
|
||||||
title, route, stickers, logo, distance, updated_at: Date.now(), provider, is_public, description,
|
|
||||||
}).save();
|
|
||||||
|
|
||||||
return res.send({
|
|
||||||
success: true, title, address, route, stickers, mode: 'overwrited', is_public, description,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const created = await Route.create({
|
|
||||||
_id: address, title, route, stickers, owner, logo, distance, provider, is_public, description,
|
|
||||||
});
|
|
||||||
|
|
||||||
await owner.routes.push(created);
|
|
||||||
await owner.save();
|
|
||||||
|
|
||||||
return res.send({
|
|
||||||
success: true, title, address, route, stickers, provider, is_public, description,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
const { User, Route } = require('../../models');
|
|
||||||
|
|
||||||
module.exports = async (req, res) => {
|
|
||||||
const { body, body: { id, token, address } } = req;
|
|
||||||
|
|
||||||
const owner = await User.findOne({ _id: id, token }).populate('routes');
|
|
||||||
|
|
||||||
if (!owner || owner.role !== 'admin') return res.send({ success: false, reason: 'unauthorized' });
|
|
||||||
|
|
||||||
const is_starred = !!body.is_starred;
|
|
||||||
|
|
||||||
const exists = await Route.findOne({ _id: address }).populate('owner', '_id');
|
|
||||||
if (!exists) return res.send({ success: false, mode: 'not_exists' });
|
|
||||||
|
|
||||||
await exists.set({ is_starred }).save();
|
|
||||||
|
|
||||||
return res.send({ success: true, ...exists });
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
var express = require('express');
|
|
||||||
var router = express.Router();
|
|
||||||
|
|
||||||
/* GET users listing. */
|
|
||||||
router.get('/', function(req, res, next) {
|
|
||||||
res.send('respond with a resource');
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = router;
|
|
|
@ -1,182 +0,0 @@
|
||||||
#!/usr/bin/env node
|
|
||||||
const mysql = require('mysql');
|
|
||||||
const { REPLACEMENT, MAPS } = require('./stickersReplacement');
|
|
||||||
const db = require('../config/db');
|
|
||||||
let total_dist = 0;
|
|
||||||
const { User, Route } = require('../models');
|
|
||||||
|
|
||||||
const con = mysql.createConnection({
|
|
||||||
host: 'vault48.org',
|
|
||||||
user: 'macos_exporter',
|
|
||||||
password: 'password',
|
|
||||||
});
|
|
||||||
|
|
||||||
const tryJSON = data => {
|
|
||||||
try {
|
|
||||||
return JSON.parse(data);
|
|
||||||
} catch (e) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function deg2rad(deg) {
|
|
||||||
return (deg * Math.PI) / 180;
|
|
||||||
}
|
|
||||||
|
|
||||||
const findDistance = (t1, n1, t2, n2) => {
|
|
||||||
// convert coordinates to radians
|
|
||||||
const lat1 = deg2rad(t1);
|
|
||||||
const lon1 = deg2rad(n1);
|
|
||||||
const lat2 = deg2rad(t2);
|
|
||||||
const lon2 = deg2rad(n2);
|
|
||||||
|
|
||||||
// find the differences between the coordinates
|
|
||||||
const dlat = lat2 - lat1;
|
|
||||||
const dlon = lon2 - lon1;
|
|
||||||
|
|
||||||
// here's the heavy lifting
|
|
||||||
const a = (Math.sin(dlat / 2) ** 2) +
|
|
||||||
(Math.cos(lat1) * Math.cos(lat2) * (Math.sin(dlon / 2) ** 2));
|
|
||||||
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); // great circle distance in radians
|
|
||||||
// const dm = c * 3961; // great circle distance in miles
|
|
||||||
const dk = c * 6373; // great circle distance in km
|
|
||||||
|
|
||||||
// round the results down to the nearest 1/1000
|
|
||||||
// const mi = round(dm);
|
|
||||||
return (Math.round(dk * 1000) / 1000);
|
|
||||||
};
|
|
||||||
|
|
||||||
const calcPolyDistance = route => {
|
|
||||||
let summ = 0;
|
|
||||||
for (let i = 1; i < route.length; i += 1) {
|
|
||||||
summ += findDistance(route[i - 1].lat, route[i - 1].lng, route[i].lat, route[i].lng);
|
|
||||||
}
|
|
||||||
|
|
||||||
total_dist += summ;
|
|
||||||
|
|
||||||
return parseFloat(Number(summ).toFixed(2));
|
|
||||||
};
|
|
||||||
|
|
||||||
const stickerAngleParser = angle => parseFloat(((Number(angle) % Math.PI) + Math.PI).toFixed(2));
|
|
||||||
|
|
||||||
const stickerStyleParser = style => (REPLACEMENT[style]
|
|
||||||
? { ...REPLACEMENT[style] }
|
|
||||||
: { set: 'base', sticker: 'chicken' });
|
|
||||||
|
|
||||||
const stickersParser = stickers => (
|
|
||||||
stickers.map(({
|
|
||||||
ang, latlng, style, text
|
|
||||||
}) => ({
|
|
||||||
angle: stickerAngleParser(ang), // todo: change it!
|
|
||||||
latlng,
|
|
||||||
text,
|
|
||||||
...stickerStyleParser(style),
|
|
||||||
}))
|
|
||||||
);
|
|
||||||
|
|
||||||
const pointParser = points => (
|
|
||||||
points.map(({ latlngs, text }) => ({
|
|
||||||
text,
|
|
||||||
latlng: latlngs[0],
|
|
||||||
set: 'base',
|
|
||||||
sticker: 'empty',
|
|
||||||
angle: 2.2,
|
|
||||||
}))
|
|
||||||
);
|
|
||||||
|
|
||||||
const mapStyleParser = style => (MAPS[style]
|
|
||||||
? MAPS[style]
|
|
||||||
: 'DEFAULT'
|
|
||||||
);
|
|
||||||
|
|
||||||
const run = async () => {
|
|
||||||
await con.connect(err => { if (err) throw err; });
|
|
||||||
await con.query('use neu_map');
|
|
||||||
|
|
||||||
const users = await new Promise(resolve => con.query('SELECT * from tokens where role = "vk"', (err, rows) => {
|
|
||||||
resolve(rows.map(({
|
|
||||||
login, token, created, role, data
|
|
||||||
}) => {
|
|
||||||
const info = tryJSON(data);
|
|
||||||
const created_at = new Date(created * 1000);
|
|
||||||
|
|
||||||
return {
|
|
||||||
_id: login,
|
|
||||||
token,
|
|
||||||
created_at,
|
|
||||||
updated_at: created_at,
|
|
||||||
name: info.name,
|
|
||||||
first_name: (info.name && info.name.split(' ')[0]) || '',
|
|
||||||
last_name: (info.name && info.name.split(' ')[1]) || '',
|
|
||||||
role,
|
|
||||||
photo: info.photo,
|
|
||||||
version: 1,
|
|
||||||
};
|
|
||||||
}));
|
|
||||||
}));
|
|
||||||
|
|
||||||
const routes = await new Promise(resolve => con.query('SELECT routes.*, tokens.login as login from routes LEFT JOIN tokens ON tokens.id = routes.id WHERE tokens.login IS NOT NULL AND tokens.role="vk"', (err, rows) => {
|
|
||||||
if (err) console.log('error', err);
|
|
||||||
|
|
||||||
resolve(rows.map(({
|
|
||||||
data, created, name, login
|
|
||||||
}) => {
|
|
||||||
const {
|
|
||||||
map_style, route, stickers, points, logo
|
|
||||||
} = tryJSON(data);
|
|
||||||
const created_at = new Date(created * 1000);
|
|
||||||
|
|
||||||
return {
|
|
||||||
_id: name,
|
|
||||||
owner: { _id: login },
|
|
||||||
created_at,
|
|
||||||
updated_at: created_at,
|
|
||||||
provider: mapStyleParser(map_style),
|
|
||||||
route: route.map(({ lat, lng }) => ({ lat: Number(lat), lng: Number(lng) })),
|
|
||||||
stickers: [
|
|
||||||
...stickersParser(stickers),
|
|
||||||
...pointParser(points)
|
|
||||||
],
|
|
||||||
logo: logo === 'default' ? 'nvs' : logo,
|
|
||||||
title: '',
|
|
||||||
version: 1,
|
|
||||||
distance: calcPolyDistance(route),
|
|
||||||
is_public: true,
|
|
||||||
};
|
|
||||||
}));
|
|
||||||
}));
|
|
||||||
|
|
||||||
console.log('ended, got users:', users.length);
|
|
||||||
console.log('ended, got routes:', routes.length);
|
|
||||||
|
|
||||||
const deletedUsers = await User.deleteMany({
|
|
||||||
// version: 1
|
|
||||||
});
|
|
||||||
const deletedRoutes = await Route.deleteMany({
|
|
||||||
// version: 1
|
|
||||||
});
|
|
||||||
console.log("dropped users", deletedUsers);
|
|
||||||
console.log("dropped routes", deletedRoutes);
|
|
||||||
console.log('inserting users');
|
|
||||||
const addedUsers = (await Promise.all(users.map(user => User.create(user))))
|
|
||||||
.reduce((obj, user) => ({ ...obj, [user._id]: user }), {});
|
|
||||||
|
|
||||||
console.log('inserting routes');
|
|
||||||
const addedRoutes = await (await Promise.all(routes.map(route => Route.create({
|
|
||||||
...route,
|
|
||||||
owner: addedUsers[route.owner._id],
|
|
||||||
}))));
|
|
||||||
|
|
||||||
await Promise.all(addedRoutes.map(async (route) => {
|
|
||||||
await addedUsers[route.owner._id].routes.push(route);
|
|
||||||
}));
|
|
||||||
|
|
||||||
await Promise.all(addedRoutes.map(route => new Promise(resolve => (
|
|
||||||
addedUsers[route.owner._id].save(() => resolve())
|
|
||||||
))));
|
|
||||||
|
|
||||||
console.log('ok');
|
|
||||||
};
|
|
||||||
|
|
||||||
run();
|
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
module.exports.REPLACEMENT = {
|
|
||||||
0: { set: 'base', sticker: 'men' },
|
|
||||||
1: { set: 'base', sticker: 'square' },
|
|
||||||
2: { set: 'base', sticker: 'bridge' },
|
|
||||||
3: { set: 'base', sticker: 'ikea' },
|
|
||||||
4: { set: 'base', sticker: 'bugr' },
|
|
||||||
5: { set: 'base', sticker: 'monum' },
|
|
||||||
6: { set: 'base', sticker: 'opera' },
|
|
||||||
7: { set: 'base', sticker: 'forest' },
|
|
||||||
8: { set: 'base', sticker: 'empty' },
|
|
||||||
9: { set: 'base', sticker: 'empty' },
|
|
||||||
10: { set: 'base', sticker: 'road' },
|
|
||||||
11: { set: 'base', sticker: 'chicken' },
|
|
||||||
12: { set: 'base', sticker: 'camp' },
|
|
||||||
13: { set: 'base', sticker: 'fastfood' },
|
|
||||||
14: { set: 'base', sticker: 'beer' },
|
|
||||||
15: { set: 'base', sticker: 'pancake' },
|
|
||||||
16: { set: 'base', sticker: 'rocks' },
|
|
||||||
17: { set: 'real', sticker: 'swamp' },
|
|
||||||
18: { set: 'real', sticker: 'skull' },
|
|
||||||
19: { set: 'base', sticker: 'crap' },
|
|
||||||
20: { set: 'pin', sticker: 'start' },
|
|
||||||
21: { set: 'pin', sticker: 'p1' },
|
|
||||||
22: { set: 'pin', sticker: 'p2' },
|
|
||||||
23: { set: 'pin', sticker: 'p3' },
|
|
||||||
24: { set: 'pin', sticker: 'p4' },
|
|
||||||
25: { set: 'pin', sticker: 'p5' },
|
|
||||||
26: { set: 'pin', sticker: 'p6' },
|
|
||||||
27: { set: 'pin', sticker: 'finish' },
|
|
||||||
29: { set: 'pin', sticker: 'danger' },
|
|
||||||
30: { set: 'pin', sticker: 'question' },
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports.MAPS = {
|
|
||||||
'watercolor': 'BLANK',
|
|
||||||
'darq': 'BLANK',
|
|
||||||
'default': 'DGIS',
|
|
||||||
'osm': 'DEFAULT',
|
|
||||||
'hot': 'HOT',
|
|
||||||
'blank': 'BLANK',
|
|
||||||
'sat': 'DEFAULT',
|
|
||||||
'ymap': 'DEFAULT',
|
|
||||||
'ysat': 'DEFAULT',
|
|
||||||
};
|
|
|
@ -1,10 +0,0 @@
|
||||||
module.exports.genRandomSequence = (length = 16) => {
|
|
||||||
let sequence = '';
|
|
||||||
const symbols = 'ABCDEFGHIJKLMOPQRSTUVXYZabcdefghijgmlopqrstuvxyz01234567890'
|
|
||||||
|
|
||||||
for (let i = 0; i < length; i += 1) {
|
|
||||||
sequence += symbols[parseInt(Math.random() * (symbols.length - 1), 10)];
|
|
||||||
}
|
|
||||||
|
|
||||||
return sequence;
|
|
||||||
};
|
|
|
@ -1,30 +0,0 @@
|
||||||
module.exports.parseRoute = route => route.filter(el => (
|
|
||||||
Object.keys(el).length === 2
|
|
||||||
&& el.lat
|
|
||||||
&& parseInt(el.lat, 10) > 0
|
|
||||||
&& parseInt(el.lat, 10) < 1000
|
|
||||||
&& el.lng
|
|
||||||
&& parseInt(el.lng, 10) > 0
|
|
||||||
&& parseInt(el.lng, 10) < 1000
|
|
||||||
));
|
|
||||||
|
|
||||||
module.exports.parseStickers = stickers => stickers.filter(el => (
|
|
||||||
Object.keys(el).length === 5
|
|
||||||
&& el.latlng
|
|
||||||
&& Object.keys(el.latlng).length === 2
|
|
||||||
&& el.latlng.lat
|
|
||||||
&& parseInt(el.latlng.lat, 10) > 0
|
|
||||||
&& parseInt(el.latlng.lat, 10) < 1000
|
|
||||||
&& el.latlng.lng
|
|
||||||
&& parseInt(el.latlng.lng, 10) > 0
|
|
||||||
&& parseInt(el.latlng.lng, 10) < 1000
|
|
||||||
));
|
|
||||||
// .map(el => ((el.text && String(el.text).substr(0, 100)) || ''));
|
|
||||||
|
|
||||||
const parseString = (value, size) => (value && String(value).substr(0, size)) || '';
|
|
||||||
module.exports.parseNumber = (value, min, max) => (value && Number(value) && Math.min(max, Math.max(min, value))) || 0;
|
|
||||||
|
|
||||||
module.exports.parseString = parseString;
|
|
||||||
module.exports.parseAddress = (value, size) => (
|
|
||||||
parseString(value, size).replace(/[^A-Za-z\-_0-9]/ig, '_').replace(/_{2,}/ig, '_')
|
|
||||||
);
|
|
|
@ -1,6 +0,0 @@
|
||||||
extends layout
|
|
||||||
|
|
||||||
block content
|
|
||||||
h1= message
|
|
||||||
h2= error.status
|
|
||||||
pre #{error.stack}
|
|
|
@ -1,5 +0,0 @@
|
||||||
extends layout
|
|
||||||
|
|
||||||
block content
|
|
||||||
h1= title
|
|
||||||
p Welcome to #{title}
|
|
|
@ -1,7 +0,0 @@
|
||||||
doctype html
|
|
||||||
html
|
|
||||||
head
|
|
||||||
title= title
|
|
||||||
link(rel='stylesheet', href='/stylesheets/style.css')
|
|
||||||
body
|
|
||||||
block content
|
|
|
@ -1,17 +0,0 @@
|
||||||
doctype html
|
|
||||||
html
|
|
||||||
body
|
|
||||||
script.
|
|
||||||
window.opener.postMessage({
|
|
||||||
type: 'oauth_login',
|
|
||||||
user: {
|
|
||||||
id: '#{_id}',
|
|
||||||
token: '#{token}',
|
|
||||||
name: '#{name}',
|
|
||||||
photo: '#{photo}',
|
|
||||||
role: '#{role}',
|
|
||||||
}
|
|
||||||
}, '*');
|
|
||||||
|
|
||||||
window.close();
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
doctype html
|
|
||||||
html
|
|
||||||
head
|
|
||||||
title Ошибка авторизации
|
|
||||||
link(rel='stylesheet', href='/stylesheets/social/vk.css')
|
|
||||||
|
|
||||||
body
|
|
||||||
block content
|
|
||||||
div#message
|
|
||||||
div.bg
|
|
||||||
h1=heading
|
|
||||||
div=reason
|
|
||||||
button(onclick='window.close()')=button
|
|
|
@ -42,7 +42,6 @@
|
||||||
"identity-obj-proxy": "^3.0.0",
|
"identity-obj-proxy": "^3.0.0",
|
||||||
"less-loader": "^4.1.0",
|
"less-loader": "^4.1.0",
|
||||||
"mini-css-extract-plugin": "^0.5.0",
|
"mini-css-extract-plugin": "^0.5.0",
|
||||||
"nodemon": "^1.19.2",
|
|
||||||
"style-loader": "^0.21.0",
|
"style-loader": "^0.21.0",
|
||||||
"sw-precache-webpack-plugin": "^0.11.5",
|
"sw-precache-webpack-plugin": "^0.11.5",
|
||||||
"ts-node": "^8.0.1",
|
"ts-node": "^8.0.1",
|
||||||
|
@ -61,14 +60,12 @@
|
||||||
"@types/react": "16.8.1",
|
"@types/react": "16.8.1",
|
||||||
"axios": "^0.18.0",
|
"axios": "^0.18.0",
|
||||||
"babel-runtime": "^6.26.0",
|
"babel-runtime": "^6.26.0",
|
||||||
"bluebird": "^3.5.3",
|
|
||||||
"body-parser": "^1.18.3",
|
"body-parser": "^1.18.3",
|
||||||
"classnames": "^2.2.6",
|
"classnames": "^2.2.6",
|
||||||
"clean-webpack-plugin": "^0.1.9",
|
"clean-webpack-plugin": "^0.1.9",
|
||||||
"cookie-parser": "~1.4.3",
|
"cookie-parser": "~1.4.3",
|
||||||
"croppr": "^2.3.1",
|
"croppr": "^2.3.1",
|
||||||
"debug": "~2.6.9",
|
"debug": "~2.6.9",
|
||||||
"express": "~4.16.0",
|
|
||||||
"file-saver": "^2.0.0",
|
"file-saver": "^2.0.0",
|
||||||
"history": "^4.7.2",
|
"history": "^4.7.2",
|
||||||
"http-errors": "~1.6.2",
|
"http-errors": "~1.6.2",
|
||||||
|
@ -82,12 +79,8 @@
|
||||||
"less": "^3.8.1",
|
"less": "^3.8.1",
|
||||||
"less-middleware": "~2.2.1",
|
"less-middleware": "~2.2.1",
|
||||||
"lodash": "^4.17.10",
|
"lodash": "^4.17.10",
|
||||||
"mongoose": "^5.3.14",
|
|
||||||
"morgan": "~1.9.0",
|
|
||||||
"mysql": "^2.16.0",
|
|
||||||
"optimize-css-assets-webpack-plugin": "^5.0.1",
|
"optimize-css-assets-webpack-plugin": "^5.0.1",
|
||||||
"pt-sans-cyrillic": "0.0.4",
|
"pt-sans-cyrillic": "0.0.4",
|
||||||
"pug": "2.0.0-beta11",
|
|
||||||
"raleway-cyrillic": "^4.0.2",
|
"raleway-cyrillic": "^4.0.2",
|
||||||
"rc-slider": "8.5.0",
|
"rc-slider": "8.5.0",
|
||||||
"react": "16.8.1",
|
"react": "16.8.1",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue