private async Task CreateOnlyOnceAnonBuyerConfig(EnvironmentSeed seed, string token)
        {
            // validate AnonymousShoppingBuyerID or provide fallback if none is defined
            var allBuyers = await _oc.Buyers.ListAllAsync(accessToken : token);

            if (seed.AnonymousShoppingBuyerID != null)
            {
                if (!allBuyers.Select(b => b.ID).Contains(seed.AnonymousShoppingBuyerID))
                {
                    throw new Exception("The buyer defined by AnonymousShoppingBuyerID does not exist");
                }
            }
            else
            {
                seed.AnonymousShoppingBuyerID = SeedConstants.DefaultBuyerID;
            }

            //create and assign initial buyer location
            await _buyerLocationCommand.Save(seed.AnonymousShoppingBuyerID,
                                             $"{seed.AnonymousShoppingBuyerID}-{SeedConstants.DefaultLocationID}",
                                             SeedConstants.DefaultBuyerLocation(), token, _oc);

            // create user
            var anonBuyerUser = await _oc.Users.SaveAsync(seed.AnonymousShoppingBuyerID, SeedConstants.AnonymousBuyerUser().ID, SeedConstants.AnonymousBuyerUser(), token);

            // save assignment between user and buyergroup (location)
            var assignment = new UserGroupAssignment()
            {
                UserGroupID = $"{seed.AnonymousShoppingBuyerID}-{SeedConstants.DefaultLocationID}",
                UserID      = anonBuyerUser.ID
            };
            await _oc.UserGroups.SaveUserAssignmentAsync(seed.AnonymousShoppingBuyerID, assignment, accessToken : token);
        }
        private async Task CreateConfigureAnonBuyer(EnvironmentSeed seed, string token)
        {
            var anonBuyer    = SeedConstants.AnonymousBuyerUser();
            var defaultBuyer = SeedConstants.DefaultBuyer();

            //create anonymous buyer user
            var createUser = _oc.Users.SaveAsync(seed.AnonymousShoppingBuyerID, anonBuyer.ID, anonBuyer, token);

            //create and assign initial buyer location
            var createBuyerLocation = _buyerLocationCommand.Save(seed.AnonymousShoppingBuyerID,
                                                                 $"{seed.AnonymousShoppingBuyerID}-{SeedConstants.DefaultLocationID}",
                                                                 SeedConstants.DefaultBuyerLocation(), token, true);

            var assignment = new UserGroupAssignment()
            {
                UserGroupID = $"{seed.AnonymousShoppingBuyerID}-{SeedConstants.DefaultLocationID}",
                UserID      = anonBuyer.ID
            };
            var saveAssignment = _oc.UserGroups.SaveUserAssignmentAsync(seed.AnonymousShoppingBuyerID, assignment, token);
            await Task.WhenAll(createUser, createBuyerLocation, saveAssignment);
        }
		public UserGroupAssignment CreateUserGroupAssignment(string userId, string groupId)
		{
			if(string.IsNullOrEmpty(userId))
			{
				throw new ArgumentNullException("Missing user ID");
			}
			if(string.IsNullOrEmpty(groupId))
			{
				throw new ArgumentNullException("Missing group ID");
			}
			var existingItem = this.TryGetUserGroupAssignment(userId, groupId);
			if(existingItem != null)
			{
				throw new ArgumentException(string.Format("UserGroupAssignment already exists for userID {0} and groupID {1}", userId, groupId));
			}
			VerifyGroupExists(groupId);
			var item = new UserGroupAssignment
			{
				Id = Guid.NewGuid().ToString(),
				GroupId = groupId,
				UserId = userId
			};
			_documentSession.Store(item);
			_documentSession.SaveChanges();
			return item;
		}