static async apiCreateUser (req, res) {
    if (!req.body ||
      !ArkimeUtil.isString(req.body.userId) ||
      !ArkimeUtil.isString(req.body.userName)) {
      return res.serverError(403, 'Missing/Empty required fields');
    }

    if (req.body.userName.match(/^\s*$/)) {
      return res.serverError(403, 'Username can not be empty');
    }

    if (systemRolesMapping[req.body.userId]) {
      return res.serverError(403, `User ID can't be a system role id`);
    }

    let userIdTest = req.body.userId;
    const isRole = userIdTest.startsWith('role:');
    if (isRole) {
      userIdTest = userIdTest.slice(5);
      req.body.password = cryptoLib.randomBytes(48); // Reset role password to random
    } else if (!ArkimeUtil.isString(req.body.password, 3)) {
      return res.serverError(403, 'Password needs to be at least 3 characters');
    }

    if (userIdTest.match(userIdRegexp)) {
      return res.serverError(403, 'User ID must be word characters');
    }

    if (req.body.userId === '_moloch_shared') {
      return res.serverError(403, 'User ID cannot be the same as the shared user');
    }

    if (req.body.roles !== undefined && !ArkimeUtil.isStringArray(req.body.roles)) {
      return res.serverError(403, 'Roles field must be an array of strings');
    }

    req.body.roles ??= [];

    if (!User.validateRoles(req.body.roles)) {
      return res.serverError(403, 'User roles must be system roles or start with "role:"');
    }

    const rolesSet = await User.roles2ExpandedSet(req.body.roles);
    const iamSuperAdmin = req.user.hasRole('superAdmin');
    if (isRole && (rolesSet.has(req.body.userId) || req.body.roles.includes(req.body.userId))) {
      return res.serverError(403, `Can't have circular role dependencies`);
    }

    if (isRole && req.body.roles.includes('superAdmin')) {
      return res.serverError(403, `User defined roles can't have superAdmin`);
    }

    if (isRole && ArkimeUtil.arrayIncludes(req.body.roles, adminRoles)) {
      return res.serverError(403, `User defined roles can't have a system Admin role`);
    }

    if (req.body.roleAssigners && !ArkimeUtil.isStringArray(req.body.roleAssigners)) {
      return res.serverError(403, 'roleAssigners field must be an array of strings');
    }

    if (req.body.roles.includes('superAdmin') && !iamSuperAdmin) {
      return res.serverError(403, 'Can not create superAdmin unless you are superAdmin');
    }

    if (req.body.expression !== undefined && !ArkimeUtil.isString(req.body.expression, 0)) {
      return res.serverError(403, 'Expression must be a string when present');
    }

    if (!iamSuperAdmin && adminRoles.some(v => rolesSet.has(v))) {
      return res.serverError(403, 'Only superAdmin user can enable Admin roles on a user');
    }

    req.body.roleAssigners ??= [];

    User.getUser(req.body.userId, (err, user) => {
      if (user) {
        console.log('Trying to add duplicate user', util.inspect(err, false, 50), user);
        return res.serverError(403, 'User already exists');
      }

      const nuser = {
        userId: req.body.userId,
        userName: req.body.userName,
        expression: req.body.expression,
        passStore: Auth.pass2store(req.body.userId, req.body.password),
        enabled: req.body.enabled === true,
        webEnabled: req.body.webEnabled === true,
        emailSearch: req.body.emailSearch === true,
        headerAuthEnabled: req.body.headerAuthEnabled === true,
        removeEnabled: req.body.removeEnabled === true,
        packetSearch: req.body.packetSearch === true,
        timeLimit: req.body.timeLimit,
        hideStats: req.body.hideStats === true,
        hideFiles: req.body.hideFiles === true,
        hidePcap: req.body.hidePcap === true,
        disablePcapDownload: req.body.disablePcapDownload === true,
        roles: req.body.roles,
        welcomeMsgNum: 0,
        roleAssigners: req.body.roleAssigners
      };

      if (ArkimeConfig.debug) {
        console.log('Creating new user', nuser);
      }

      User.setUser(req.body.userId, nuser, (err, info) => {
        if (!err) {
          return res.send(JSON.stringify({
            success: true,
            text: `${isRole ? 'Role' : 'User'} created succesfully`
          }));
        } else {
          console.log(`ERROR - ${req.method} /api/user`, util.inspect(err, false, 50), info);
          return res.serverError(403, err);
        }
      });
    });
  }
POST - /api/user

Creates a new user (admin only).
@name /user
@returns {boolean} success - Whether the add user operation was successful.
@returns {string} text - The success/error message to (optionally) display to the user.