Files
internship_node/day11/resolvers/create/createLink.js
T

74 lines
2.0 KiB
JavaScript
Raw Normal View History

2022-02-06 22:15:10 -05:00
'use strict';
/*Powered By: Manaknightdigital Inc. https://manaknightdigital.com/ Year: 2021*/
/**
* links Resolve Add
* @copyright 2021 Manaknightdigital Inc.
* @link https://manaknightdigital.com
* @license Proprietary Software licensing
* @author Ryan Wong
*
*/
const request = require('request-promise');
const { validateInputForGraphql } = require('../../services/ValidationService');
const { formatError } = require('../../utils/formatError');
const { errorCodes } = require('../../core/strings');
const inputValidations = {
Mutation: {
createLink: (resolver = () => null) => {
return validateInputForGraphql(
resolver,
{
link: 'required|string',
},
{
'link.required': 'Link field is required.',
'link.string': 'Link field should be a string.',
},
);
},
},
};
module.exports = inputValidations.Mutation.createLink(async (_, { link }, { db, user }) => {
try {
const previousLinks = await db.link.getAll({ user_id: user.id, status: 1 });
try {
const urlResponse = await request({ uri: link, resolveWithFullResponse: true, method: 'GET' });
const headers = urlResponse?.headers;
const xFrameHeader = headers['x-frame-options'];
if (xFrameHeader && (xFrameHeader === 'SAMEORIGIN' || xFrameHeader === 'DENY')) {
return {
success: false,
message: 'Iframe blocked to given link.',
code: errorCodes.extra.IFRAME_BLOCKED,
};
}
} catch (error) {
return {
success: false,
message: 'Link invalid or not available at the moment.',
code: errorCodes.extra.INVALID_URL,
};
}
if (previousLinks?.length) {
await db.link.update(
{ status: 0 },
{
where: { id: previousLinks?.map((link) => link.id) },
},
);
}
await db.link.insert({ link, user_id: user.id });
return {
success: true,
message: 'Link inserted successfully.',
};
} catch (error) {
return formatError(error);
}
});