Skip to content

Commit

Permalink
Merge pull request #5693 from reactioncommerce/feat-aldeed-demeteor-a…
Browse files Browse the repository at this point in the history
…ccounts-plugin

Move accounts plugin to Node app and better split accounts from users/IDP
  • Loading branch information
kieckhafer authored Oct 8, 2019
2 parents 3edd291 + 34d36ae commit 82209ff
Show file tree
Hide file tree
Showing 171 changed files with 466 additions and 494 deletions.
25 changes: 1 addition & 24 deletions client/modules/core/helpers/templates.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import _ from "lodash";
import { Template } from "meteor/templating";
import { Accounts } from "meteor/accounts-base";
import { Spacebars } from "meteor/spacebars";
import { ReactiveVar } from "meteor/reactive-var";
import { Roles } from "meteor/alanning:roles";
import ReactionError from "@reactioncommerce/reaction-error";
import ReactComponentOrBlazeTemplate from "/imports/plugins/core/components/lib/ReactComponentOrBlazeTemplate";
import { i18next, Reaction } from "/client/api";
import { i18next } from "/client/api";
import * as Collections from "/lib/collections";
import * as Schemas from "/lib/collections/schemas";
import { toCamelCase } from "/lib/api";
Expand Down Expand Up @@ -64,27 +62,6 @@ Template.registerHelper("Collections", () => Collections);

Template.registerHelper("Schemas", () => Schemas);

/**
* @method currentUser
* @memberof BlazeTemplateHelpers
* @summary overrides Meteor Package.blaze currentUser method
* @returns {Boolean} returns true/null if user has registered
*/
Template.registerHelper("currentUser", () => {
if (typeof Reaction === "object") {
const shopId = Reaction.getShopId();
const user = Accounts.user();
if (!shopId || typeof user !== "object") return null;
// shoppers should always be guests
const isGuest = Roles.userIsInRole(user, "guest", shopId);
// but if a user has never logged in then they are anonymous
const isAnonymous = Roles.userIsInRole(user, "anonymous", shopId);

return isGuest && !isAnonymous ? user : null;
}
return null;
});

/**
* @method monthOptions
* @memberof BlazeTemplateHelpers
Expand Down
28 changes: 0 additions & 28 deletions client/modules/core/startup.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import store from "store";
import Random from "@reactioncommerce/random";
import { Meteor } from "meteor/meteor";
import { Tracker } from "meteor/tracker";
import { Accounts } from "meteor/accounts-base";

import { Reaction } from "/client/api";
import { userPrefs } from "./main";
Expand All @@ -16,31 +13,6 @@ Meteor.startup(() => {
Reaction.init();
});

// Log in anonymous guest users
Tracker.autorun(() => {
const userId = getUserId();
if (userId) return; // This autorun is only for when we DO NOT have a user

const loggingIn = Tracker.nonreactive(() => Accounts.loggingIn());
if (loggingIn) return; // Already logging in

// Get or generate a sessionId, saved in local storage, so that we can auto-login again next time.
// Note that `store` package has cookie fallbacks for browsers without local storage, such as
// Safari in incognito mode.
let sessionId = store.get("Reaction.session");
if (!sessionId) {
sessionId = Random.id();
store.set("Reaction.session", sessionId);
}

Accounts.callLoginMethod({
methodArguments: [{
anonymous: true,
sessionId
}]
});
});

// Fine-grained reactivity on only the user preferences
Tracker.autorun(() => {
const userId = getUserId();
Expand Down
6 changes: 0 additions & 6 deletions client/modules/core/subscriptions.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,6 @@ Subscriptions.PrimaryShop = Subscriptions.Manager.subscribe("PrimaryShop");
// This Packages subscription is used for the Active shop's packages
Subscriptions.Packages = Subscriptions.Manager.subscribe("Packages");

// This packages subscription is used for the Primary Shop's packages
// The Packages publication defaults to returning the primaryShopId's packages,
// so this subscription shouldn't ever need to be changed
// TODO: Consider how to handle routes for several shops which are all active at once
Subscriptions.PrimaryShopPackages = Subscriptions.Manager.subscribe("Packages");

Subscriptions.Groups = Subscriptions.Manager.subscribe("Groups");

Subscriptions.BrandAssets = Subscriptions.Manager.subscribe("BrandAssets");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import i18n from "./i18n";
import mutations from "./mutations";
import queries from "./queries";
import { registerPluginHandler } from "./registration";
import resolvers from "./resolvers";
import schemas from "./schemas";
import startup from "./startup";
import i18n from "./i18n/index.js";
import mutations from "./mutations/index.js";
import queries from "./queries/index.js";
import { registerPluginHandler } from "./registration.js";
import resolvers from "./resolvers/index.js";
import schemas from "./schemas/index.js";
import startup from "./startup.js";
import tokenMiddleware from "./util/tokenMiddleware.js";
import { getHasPermissionFunctionForUser } from "./util/hasPermission.js";
import { getShopsUserHasPermissionForFunctionForUser } from "./util/shopsUserHasPermissionFor.js";
import accountByUserId from "./util/accountByUserId.js";

const ENROLL_URI_BASE = "account/enroll";

Expand Down Expand Up @@ -49,6 +53,11 @@ export default async function register(app) {
name: "users"
}
},
auth: {
accountByUserId,
getHasPermissionFunctionForUser,
getShopsUserHasPermissionForFunctionForUser
},
functionsByType: {
registerPluginHandler: [registerPluginHandler],
startup: [startup]
Expand All @@ -59,6 +68,13 @@ export default async function register(app) {
},
mutations,
queries,
expressMiddleware: [
{
route: "graphql",
stage: "authenticate",
fn: tokenMiddleware
}
],
settings: {},
registry: [{
route: "/dashboard/accounts",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ReactionError from "@reactioncommerce/reaction-error";
import { difference } from "lodash";
import SimpleSchema from "simpl-schema";
import ensureRoles from "../util/ensureRoles";
import ensureRoles from "../util/ensureRoles.js";

const inputSchema = new SimpleSchema({
accountId: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import SimpleSchema from "simpl-schema";
import ReactionError from "@reactioncommerce/reaction-error";
import sendWelcomeEmail from "../util/sendWelcomeEmail";
import sendWelcomeEmail from "../util/sendWelcomeEmail.js";

const inputSchema = new SimpleSchema({
"emails": Array,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import addressBookAdd from "./addressBookAdd";
import addAccountToGroup from "./addAccountToGroup";
import createAccount from "./createAccount";
import inviteShopMember from "./inviteShopMember";
import removeAccountAddressBookEntry from "./removeAccountAddressBookEntry";
import removeAccountEmailRecord from "./removeAccountEmailRecord";
import removeAccountFromGroup from "./removeAccountFromGroup";
import sendResetAccountPasswordEmail from "./sendResetAccountPasswordEmail";
import setAccountProfileCurrency from "./setAccountProfileCurrency";
import setAccountProfileLanguage from "./setAccountProfileLanguage";
import updateAccountAddressBookEntry from "./updateAccountAddressBookEntry";
import addressBookAdd from "./addressBookAdd.js";
import addAccountToGroup from "./addAccountToGroup.js";
import createAccount from "./createAccount.js";
import inviteShopMember from "./inviteShopMember.js";
import removeAccountAddressBookEntry from "./removeAccountAddressBookEntry.js";
import removeAccountEmailRecord from "./removeAccountEmailRecord.js";
import removeAccountFromGroup from "./removeAccountFromGroup.js";
import sendResetAccountPasswordEmail from "./sendResetAccountPasswordEmail.js";
import setAccountProfileCurrency from "./setAccountProfileCurrency.js";
import setAccountProfileLanguage from "./setAccountProfileLanguage.js";
import updateAccountAddressBookEntry from "./updateAccountAddressBookEntry.js";

export default {
addressBookAdd,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ import _ from "lodash";
import SimpleSchema from "simpl-schema";
import Random from "@reactioncommerce/random";
import ReactionError from "@reactioncommerce/reaction-error";
import getCurrentUserName from "/imports/plugins/core/accounts/server/no-meteor/util/getCurrentUserName";
import getDataForEmail from "/imports/plugins/core/accounts/server/no-meteor/util/getDataForEmail";
import createUser from "../util/createUser.js";
import getCurrentUserName from "../util/getCurrentUserName.js";
import getDataForEmail from "../util/getDataForEmail.js";

const inputSchema = new SimpleSchema({
email: String,
Expand Down Expand Up @@ -95,7 +96,7 @@ export default async function inviteShopMember(context, input) {
// We create a new account only if there's no pending invite.
if (!invitedUser) {
// The user does not already exist, we need to create a new account
userId = await context.createUser({
userId = await createUser({
profile: { invited: true },
email,
name,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import SimpleSchema from "simpl-schema";
import ReactionError from "@reactioncommerce/reaction-error";
import sendVerificationEmail from "../util/sendVerificationEmail";
import sendVerificationEmail from "../util/sendVerificationEmail.js";

const inputSchema = new SimpleSchema({
accountId: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import SimpleSchema from "simpl-schema";
import ReactionError from "@reactioncommerce/reaction-error";
import ensureRoles from "/imports/plugins/core/accounts/server/no-meteor/util/ensureRoles";
import ensureRoles from "../util/ensureRoles.js";

const inputSchema = new SimpleSchema({
accountId: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import _ from "lodash";
import SimpleSchema from "simpl-schema";
import generateVerificationTokenObject from "@reactioncommerce/api-utils/generateVerificationTokenObject.js";
import Logger from "@reactioncommerce/logger";
import ReactionError from "@reactioncommerce/reaction-error";
import generateVerificationTokenObject from "../util/generateVerificationTokenObject";

const inputSchema = new SimpleSchema({
email: String
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js";
import sendResetAccountPasswordEmail from "./sendResetAccountPasswordEmail";
import sendResetAccountPasswordEmail from "./sendResetAccountPasswordEmail.js";

mockContext.mutations.sendResetAccountPasswordEmail = jest.fn().mockName("mutations.sendResetAccountPasswordEmail");

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import SimpleSchema from "simpl-schema";
import ReactionError from "@reactioncommerce/reaction-error";
import { Address } from "/imports/collections/schemas/address.js";
import { AccountProfileAddress } from "../simpleSchemas.js";

const inputSchema = new SimpleSchema({
address: Address,
address: AccountProfileAddress,
accountId: String,
type: {
type: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js";
import groupQuery from "./group";
import groupQuery from "./group.js";

const fakeShopId = "FAKE_SHOP_ID";
const fakeGroup = { _id: "FAKE_GROUP_ID", name: "fake", shopId: fakeShopId };
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js";
import groupsQuery from "./groups";
import groupsQuery from "./groups.js";

const fakeShopId = "FAKE_SHOP_ID";
const fakeAccount = { _id: "FAKE_ACCOUNT_ID", groups: ["group1", "group2"] };
Expand Down
15 changes: 15 additions & 0 deletions imports/node-app/core-services/account/queries/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import group from "./group.js";
import groups from "./groups.js";
import primaryShopId from "./primaryShopId.js";
import roles from "./roles.js";
import shopAdministrators from "./shopAdministrators.js";
import userAccount from "./userAccount.js";

export default {
group,
groups,
primaryShopId,
roles,
shopAdministrators,
userAccount
};
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js";
import primaryShopId from "./primaryShopId";
import primaryShopId from "./primaryShopId.js";

test("calls Shops.findOne with hostname query and returns result", async () => {
mockContext.collections.Shops.findOne.mockReturnValueOnce(Promise.resolve({ _id: "CORRECT_SHOP_ID_BY_DOMAIN" }));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js";
import rolesQuery from "./roles";
import rolesQuery from "./roles.js";

beforeEach(() => {
jest.resetAllMocks();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js";
import shopAdministratorsQuery from "./shopAdministrators";
import shopAdministratorsQuery from "./shopAdministrators.js";

const fakeShopId = "FAKE_SHOP_ID_ADMIN_QUERY";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js";
import userAccountQuery from "./userAccount";
import userAccountQuery from "./userAccount.js";

const fakeAccountId = "FAKE_USER_ID_FOR_QUERY";
const fakeAccount = { _id: fakeAccountId, shopId: "ACCOUNT_SHOP_ID" };
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import addressBookResolver from "./addressBook";
import addressBookResolver from "./addressBook.js";

const addressBook = [
{ _id: "123", address1: "123 Main St" },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { get } from "lodash";
import resolveShopFromShopId from "@reactioncommerce/api-utils/graphql/resolveShopFromShopId.js";
import { encodeAccountOpaqueId } from "@reactioncommerce/reaction-graphql-xforms/account";
import getCurrencyDefinitionByCode from "@reactioncommerce/api-utils/getCurrencyDefinitionByCode.js";
import addressBook from "./addressBook";
import addressBook from "./addressBook.js";

export default {
_id: (account) => encodeAccountOpaqueId(account._id),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import resolveShopFromShopId from "@reactioncommerce/api-utils/graphql/resolveShopFromShopId.js";
import { encodeGroupOpaqueId } from "@reactioncommerce/reaction-graphql-xforms/group";
import createdBy from "./createdBy";
import createdBy from "./createdBy.js";

export default {
_id: (node) => encodeGroupOpaqueId(node._id),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { encodeAccountOpaqueId } from "@reactioncommerce/reaction-graphql-xforms/account";
import addAccountAddressBookEntry from "./addAccountAddressBookEntry";
import addAccountAddressBookEntry from "./addAccountAddressBookEntry.js";

test("correctly passes through to mutations.addressBookAdd", async () => {
const accountId = encodeAccountOpaqueId("1");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js";
import { encodeAccountOpaqueId } from "@reactioncommerce/reaction-graphql-xforms/account";
import { encodeGroupOpaqueId } from "@reactioncommerce/reaction-graphql-xforms/group";
import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js";
import addAccountToGroup from "./addAccountToGroup";
import addAccountToGroup from "./addAccountToGroup.js";

mockContext.mutations.addAccountToGroup = jest.fn().mockName("mutations.addAccountToGroup");

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import addAccountAddressBookEntry from "./addAccountAddressBookEntry";
import addAccountToGroup from "./addAccountToGroup";
import inviteShopMember from "./inviteShopMember";
import removeAccountAddressBookEntry from "./removeAccountAddressBookEntry";
import removeAccountEmailRecord from "./removeAccountEmailRecord";
import removeAccountFromGroup from "./removeAccountFromGroup";
import sendResetAccountPasswordEmail from "./sendResetAccountPasswordEmail";
import setAccountProfileCurrency from "./setAccountProfileCurrency";
import setAccountProfileLanguage from "./setAccountProfileLanguage";
import updateAccountAddressBookEntry from "./updateAccountAddressBookEntry";
import addAccountAddressBookEntry from "./addAccountAddressBookEntry.js";
import addAccountToGroup from "./addAccountToGroup.js";
import inviteShopMember from "./inviteShopMember.js";
import removeAccountAddressBookEntry from "./removeAccountAddressBookEntry.js";
import removeAccountEmailRecord from "./removeAccountEmailRecord.js";
import removeAccountFromGroup from "./removeAccountFromGroup.js";
import sendResetAccountPasswordEmail from "./sendResetAccountPasswordEmail.js";
import setAccountProfileCurrency from "./setAccountProfileCurrency.js";
import setAccountProfileLanguage from "./setAccountProfileLanguage.js";
import updateAccountAddressBookEntry from "./updateAccountAddressBookEntry.js";

export default {
addAccountAddressBookEntry,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { encodeGroupOpaqueId } from "@reactioncommerce/reaction-graphql-xforms/group";
import { encodeShopOpaqueId } from "@reactioncommerce/reaction-graphql-xforms/shop";
import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js";
import inviteShopMember from "./inviteShopMember";
import inviteShopMember from "./inviteShopMember.js";

mockContext.mutations.inviteShopMember = jest.fn().mockName("mutations.inviteShopMember");

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { encodeAccountOpaqueId } from "@reactioncommerce/reaction-graphql-xforms/account";
import { encodeAddressOpaqueId } from "@reactioncommerce/reaction-graphql-xforms/address";
import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js";
import removeAccountAddressBookEntry from "./removeAccountAddressBookEntry";
import removeAccountAddressBookEntry from "./removeAccountAddressBookEntry.js";

mockContext.mutations.removeAccountAddressBookEntry = jest.fn().mockName("mutations.removeAccountAddressBookEntry");

Expand Down
Loading

0 comments on commit 82209ff

Please sign in to comment.