Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add proper apollo errors #341

Merged
merged 2 commits into from
May 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 11 additions & 10 deletions app/apollo/resolvers/channel.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@
const _ = require('lodash');
const { v4: UUID } = require('uuid');
const crypto = require('crypto');
const { UserInputError, ValidationError } = require('apollo-server');

const { ACTIONS, TYPES } = require('../models/const');
const { whoIs, validAuth } = require ('./common');
const { whoIs, validAuth, NotFoundError} = require ('./common');

const { encryptOrgData, decryptOrgData} = require('../../utils/orgs');

Expand Down Expand Up @@ -65,18 +66,18 @@ const channelResolvers = {

const channel = await models.Channel.findOne({ uuid: channel_uuid, org_id });
if(!channel){
throw `Could not find the channel with uuid "${channel_uuid}"`;
throw new NotFoundError(`Could not find the channel with uuid ${channel_uuid}.`);
}

const versionObj = channel.versions.find(v => v.uuid === version_uuid);
if (!versionObj) {
throw `versionObj "${version_uuid}" is not found for ${channel.name}:${channel.uuid}.`;
throw NotFoundError(`versionObj "${version_uuid}" is not found for ${channel.name}:${channel.uuid}`);
}

if (versionObj.location === 'mongo') {
const deployableVersionObj = await models.DeployableVersion.findOne({org_id, channel_id: channel_uuid, uuid: version_uuid });
if (!deployableVersionObj) {
throw `DeployableVersion is not found for ${channel.name}:${channel.uuid}/${versionObj.name}:${versionObj.uuid}.`;
throw new NotFoundError(`DeployableVersion is not found for ${channel.name}:${channel.uuid}/${versionObj.name}:${versionObj.uuid}.`);
}
deployableVersionObj.content = await decryptOrgData(orgKey, deployableVersionObj.content);
return deployableVersionObj;
Expand Down Expand Up @@ -121,7 +122,7 @@ const channelResolvers = {
try{
const channel = await models.Channel.findOne({ uuid, org_id });
if(!channel){
throw `channel uuid "${uuid}" not found`;
throw new NotFoundError(`channel uuid "${uuid}" not found`);
}

await models.Channel.updateOne({ org_id, uuid }, { $set: { name } });
Expand All @@ -147,7 +148,7 @@ const channelResolvers = {
const orgKey = _.first(org.orgKeys);

if(!name){
throw 'A name was not included';
throw new UserInputError('A name was not included');
}
if(!type){
throw 'A "type" of application/json or application/yaml must be included';
Expand All @@ -158,7 +159,7 @@ const channelResolvers = {

const channel = await models.Channel.findOne({ uuid: channel_uuid, org_id });
if(!channel){
throw `channel uuid "${channel_uuid}" not found`;
throw new NotFoundError(`channel uuid "${channel_uuid}" not found`);
}

const versions = await models.DeployableVersion.find({ org_id, channel_id: channel_uuid });
Expand All @@ -167,7 +168,7 @@ const channelResolvers = {
});

if(versionNameExists) {
throw `The version name ${name} already exists`;
throw new ValidationError(`The version name ${name} already exists`);
}

const iv = crypto.randomBytes(16);
Expand Down Expand Up @@ -253,14 +254,14 @@ const channelResolvers = {
try{
const channel = await models.Channel.findOne({ uuid, org_id });
if(!channel){
throw `channel uuid "${uuid}" not found`;
throw new NotFoundError(`channel uuid "${uuid}" not found`);
}
const channel_uuid = channel.uuid;

const subCount = await models.Subscription.count({ org_id, channel_uuid });

if(subCount > 0){
throw `${subCount} subscriptions depend on this channel. Please update/remove them before removing this channel.`;
throw new ValidationError(`${subCount} subscriptions depend on this channel. Please update/remove them before removing this channel.`);
}

await models.Channel.deleteOne({ org_id, uuid });
Expand Down
17 changes: 13 additions & 4 deletions app/apollo/resolvers/common.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const { AuthenticationError } = require('apollo-server');
const { ForbiddenError, ApolloError } = require('apollo-server');


const whoIs = me => {
if (me === null || me === undefined) return 'null';
Expand All @@ -27,12 +28,20 @@ const whoIs = me => {
const validAuth = async (me, org_id, action, type, queryName, context) => {
const {req_id, models, logger} = context;
if (me === null || !(await models.User.isAuthorized(me, org_id, action, type, null, context))) {
logger.error({req_id, me: whoIs(me), org_id, action, type}, `AuthenticationError - ${queryName}`);
throw new AuthenticationError(
logger.error({req_id, me: whoIs(me), org_id, action, type}, `ForbiddenError - ${queryName}`);
throw new ForbiddenError(
`You are not allowed to ${action} on ${type} under organization ${org_id} for the query ${queryName}.`,
);
}
};

module.exports = { whoIs, validAuth };
// Not Found Error when look up db
class NotFoundError extends ApolloError {
constructor(message) {
super(message, 'NOT_FOUND');
Object.defineProperty(this, 'name', { value: 'NotFoundError' });
}
}

module.exports = { whoIs, validAuth, NotFoundError };

14 changes: 7 additions & 7 deletions app/apollo/resolvers/subscription.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const { v4: UUID } = require('uuid');
const { pub } = require('../../utils/pubsub');

const { ACTIONS, TYPES } = require('../models/const');
const { whoIs, validAuth } = require ('./common');
const { whoIs, validAuth, NotFoundError} = require ('./common');


const resourceResolvers = {
Expand Down Expand Up @@ -77,15 +77,15 @@ const resourceResolvers = {
// loads the channel
var channel = await models.Channel.findOne({ org_id, uuid: channel_uuid });
if(!channel){
throw `channel uuid "${channel_uuid}" not found`;
throw new NotFoundError(`channel uuid "${channel_uuid}" not found`);
}

// loads the version
var version = channel.versions.find((version)=>{
return (version.uuid == version_uuid);
});
if(!version){
throw `version uuid "${version_uuid}" not found`;
throw new NotFoundError(`version uuid "${version_uuid}" not found`);
}

await models.Subscription.create({
Expand Down Expand Up @@ -118,21 +118,21 @@ const resourceResolvers = {
try{
var subscription = await models.Subscription.findOne({ org_id, uuid });
if(!subscription){
throw `subscription { uuid: "${uuid}", org_id:${org_id} } not found`;
throw new NotFoundError(`subscription { uuid: "${uuid}", org_id:${org_id} } not found`);
}

// loads the channel
var channel = await models.Channel.findOne({ org_id, uuid: channel_uuid });
if(!channel){
throw `channel uuid "${channel_uuid}" not found`;
throw new NotFoundError(`channel uuid "${channel_uuid}" not found`);
}

// loads the version
var version = channel.versions.find((version)=>{
return (version.uuid == version_uuid);
});
if(!version){
throw `version uuid "${version_uuid}" not found`;
throw new NotFoundError(`version uuid "${version_uuid}" not found`);
}

var sets = {
Expand Down Expand Up @@ -168,7 +168,7 @@ const resourceResolvers = {
try{
var subscription = await models.Subscription.findOne({ org_id, uuid });
if(!subscription){
throw `subscription uuid "${uuid}" not found`;
throw new NotFoundError(`subscription uuid "${uuid}" not found`);
}
await subscription.deleteOne();

Expand Down