Skip to content

feat(utils): makeWrapResolversPlugin, makeChangeNullabilityPlugin#352

Merged
benjie merged 14 commits into
masterfrom
resolver-wrapper
Nov 22, 2018
Merged

feat(utils): makeWrapResolversPlugin, makeChangeNullabilityPlugin#352
benjie merged 14 commits into
masterfrom
resolver-wrapper

Conversation

@benjie
Copy link
Copy Markdown
Member

@benjie benjie commented Nov 22, 2018

Fixes #342

e.g. to lowercase all user emails:

makeWrapResolversPlugin({
  User: {
    async email(resolve, source, args, context, resolveInfo) {
      const result = await resolve();
      return result.toLowerCase();
    }
  }
});

e.g. to only allow the user to see their own email:

// 1: make User.email nullable:
makeChangeNullabilityPlugin({
  User: {
    email: true,
  },
}),
// 2: return null unless the user id matches the current logged in user_id
makeWrapResolversPlugin({
  User: {
    email: {
      requires: {
        siblingColumns: [{ column: "id", alias: "$user_id" }],
      },
      resolve(resolver, user, args, context, _resolveInfo) {
        if (context.jwtClaims.user_id !== user.$user_id) return null;
        return resolver();
      },
    },
  },
}),

e.g. perform validation when registering a user and take an action afterwards:

makeWrapResolversPlugin({
  Mutation: {
    createUser: {
      requires: {
        childColumns: [{ column: "id", alias: "$new_id" }],
      },
      async resolve(resolver, mutation, args, _context, _resolveInfo) {
		/* Optional: VALIDATION */
        const {
          input: {
            user: { name },
          },
        } = args;
        if (name.length < 3) throw new Error("Name is too short");
        /* End: VALIDATION */

        const result = await resolver();

        /* Optional: ACTION */
        const { data: { $new_id: newUserId } } = result;
        await doAThingForUserId(newUserId); //e.g. send welcome email
        /* End: ACTION */

        return result;
      },
    },
  },
}),

You can handle lots of types and fields in the same plugin.

Noop example:

module.exports = makeWrapResolversPlugin({
  TypeNameHere: {
    fieldNameHere: resolve => resolve()
  }
});

Generic example:

module.exports = makeWrapResolversPlugin({
  TypeNameHere: {
    async fieldNameHere(resolve, source, args, context, resolveInfo) {
      // Do something before
      const result = await resolve(
        source, // optional, specify when overriding
        args, // optional, specify when overriding
        context, // optional, specify when overriding
        resolveInfo // optional, specify when overriding
      );
      // Do something after
      return result;
    },
    anotherFieldNameHere(...) { ... }
  },
  AnotherTypeNameHere: ...
});

@benjie benjie changed the title feat(utils): makeWrapResolversPlugin feat(utils): makeWrapResolversPlugin, makeChangeNullabilityPlugin Nov 22, 2018
@benjie benjie merged commit 9393990 into master Nov 22, 2018
@benjie benjie deleted the resolver-wrapper branch November 22, 2018 16:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Util for wrapping resolvers

1 participant