88 lines
2.2 KiB
JavaScript
88 lines
2.2 KiB
JavaScript
const UserRepository = require('src/user/userRepository');
|
|
const userRepository = new UserRepository();
|
|
const fetch = require('node-fetch');
|
|
const FormData = require('form-data');
|
|
|
|
function handleError(error, res) {
|
|
let { status, message, source } = error;
|
|
|
|
if (status && message) {
|
|
if (status === 401) {
|
|
message = 'Unauthorized. Please check plex credentials.',
|
|
source = 'plex'
|
|
}
|
|
|
|
res.status(status).send({ success: false, message, source })
|
|
} else {
|
|
console.log('caught authenticate plex account controller error', error)
|
|
res.status(500).send({
|
|
message: 'An unexpected error occured while authenticating your account with plex',
|
|
source
|
|
})
|
|
}
|
|
}
|
|
|
|
function handleResponse(response) {
|
|
if (!response.ok) {
|
|
throw {
|
|
success: false,
|
|
status: response.status,
|
|
message: response.statusText
|
|
}
|
|
}
|
|
|
|
return response.json()
|
|
}
|
|
|
|
function plexAuthenticate(username, password) {
|
|
const url = 'https://plex.tv/api/v2/users/signin'
|
|
|
|
const form = new FormData()
|
|
form.append('login', username)
|
|
form.append('password', password)
|
|
form.append('rememberMe', 'false')
|
|
|
|
const headers = {
|
|
'Accept': 'application/json, text/plain, */*',
|
|
'Content-Type': form.getHeaders()['content-type'],
|
|
'X-Plex-Client-Identifier': 'seasonedRequest'
|
|
}
|
|
const options = {
|
|
method: 'POST',
|
|
headers,
|
|
body: form
|
|
}
|
|
|
|
return fetch(url, options)
|
|
.then(resp => handleResponse(resp))
|
|
}
|
|
|
|
function link(req, res) {
|
|
const user = req.loggedInUser;
|
|
const { username, password } = req.body;
|
|
|
|
return plexAuthenticate(username, password)
|
|
.then(plexUser => userRepository.linkPlexUserId(user.username, plexUser.id))
|
|
.then(response => res.send({
|
|
success: true,
|
|
message: "Successfully authenticated and linked plex account with seasoned request."
|
|
}))
|
|
.catch(error => handleError(error, res))
|
|
}
|
|
|
|
function unlink(req, res) {
|
|
const user = req.loggedInUser;
|
|
|
|
return userRepository.unlinkPlexUserId(user.username)
|
|
.then(response => res.send({
|
|
success: true,
|
|
message: "Successfully unlinked plex account from seasoned request."
|
|
}))
|
|
.catch(error => handleError(error, res))
|
|
}
|
|
|
|
module.exports = {
|
|
link,
|
|
unlink
|
|
};
|