bool MongoDatabaseHandler::performUserCmd(
	const OPERATION                         &op,
	const repo::core::model::RepoUser &user,
	std::string                       &errMsg)
{
	bool success = true;
	mongo::DBClientBase *worker;

	if (!user.isEmpty())
	{
		try{
			worker = workerPool->getWorker();
			repo::core::model::RepoBSONBuilder cmdBuilder;
			std::string username = user.getUserName();
			switch (op)
			{
			case OPERATION::INSERT:
				cmdBuilder << "createUser" << username;
				break;
			case OPERATION::UPDATE:
				cmdBuilder << "updateUser" << username;
				break;
			case OPERATION::DROP:
				cmdBuilder << "dropUser" << username;
			}

			if (op != OPERATION::DROP)
			{
				std::string pw = user.getCleartextPassword();
				if (!pw.empty())
					cmdBuilder << "pwd" << pw;

				repo::core::model::RepoBSON customData = user.getCustomDataBSON();
				if (!customData.isEmpty())
					cmdBuilder << "customData" << customData;

				//compulsory, so no point checking if it's empty
				cmdBuilder.appendArray("roles", user.getRolesBSON());
			}
	

			mongo::BSONObj info;
			worker->runCommand(ADMIN_DATABASE, cmdBuilder.obj(), info);

			std::string cmdError = info.getStringField("errmsg");
			if (!cmdError.empty())
			{
				success = false;
				errMsg += cmdError;
			}

		}
		catch (mongo::DBException &e)
		{
			success = false;
			std::string errString(e.what());
			errMsg += errString;
		}

		workerPool->returnWorker(worker);
	}
	else
	{
		errMsg += "User bson is empty";
	}


	return success;
}