mirror of
https://github.com/muerwre/orchidmap-front.git
synced 2025-04-25 02:56:41 +07:00
82 lines
2.2 KiB
JavaScript
82 lines
2.2 KiB
JavaScript
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 });
|
|
}
|
|
};
|
|
|