public Response apply()

in src/main/java/com/googlesource/gerrit/plugins/serviceuser/RegisterServiceUser.java [116:192]


  public Response<ServiceUserInfo> apply(ConfigResource parentResource, IdString id, Input input)
      throws RestApiException, IOException, ConfigInvalidException, PermissionBackendException {
    CurrentUser requestingUser = userProvider.get();
    if (requestingUser == null || !requestingUser.isIdentifiedUser()) {
      throw new AuthException("authentication required");
    }

    if (input == null) {
      input = new Input();
    }

    IdentifiedUser user;
    try {
      user = accountResolver.resolve(input.username).asUniqueUser();
    } catch (UnresolvableAccountException e) {
      throw new BadRequestException("Username does not exist");
    }

    if (!requestingUser.getAccountId().equals(user.getAccountId())
        && !permissionBackend.user(requestingUser).testOrFalse(ADMINISTRATE_SERVER)) {
      throw new MethodNotAllowedException("Forbidden");
    }

    if (blockedNameFilter.isBlocked(input.username)) {
      throw new BadRequestException(
          "The username '" + input.username + "' is not allowed as name for service users.");
    }

    String creator;
    Account.Id creatorId;
    if (Strings.isNullOrEmpty(input.creator)) {
      creator = requestingUser.getUserName().orElse(null);
      creatorId = requestingUser.asIdentifiedUser().getAccountId();
    } else {
      creator = input.creator;
      creatorId = accountResolver.resolve(input.creator).asUniqueUser().getAccountId();
    }
    String creationDate = rfc2822DateFormatter.format(new Date());

    String owner = null;
    if (!Strings.isNullOrEmpty(input.owner)) {
      try {
        owner = groupResolver.parse(input.owner).getGroupUUID().toString();
      } catch (UnresolvableAccountException e) {
        throw new BadRequestException("The group '" + input.owner + "' does not exist");
      }
    }

    try (MetaDataUpdate md = metaDataUpdateFactory.create(allProjects)) {
      ProjectLevelConfig.Bare update = configProvider.get();
      update.load(md);

      Config db = update.getConfig();
      if (db.getSubsections(USER).contains(input.username)) {
        return Response.none();
      }
      db.setInt(USER, input.username, KEY_CREATOR_ID, creatorId.get());
      if (creator != null) {
        db.setString(USER, input.username, KEY_CREATED_BY, creator);
      }
      if (owner != null) {
        db.setString(USER, input.username, KEY_OWNER, owner);
      }
      db.setString(USER, input.username, KEY_CREATED_AT, creationDate);

      md.setMessage("Create service user '" + input.username + "'\n");
      update.commit(md);
      storageCache.invalidate();
    }

    ServiceUserInfo info = new ServiceUserInfo(new AccountInfo(user.getAccountId().get()));
    AccountLoader al = accountLoader.create(true);
    info.createdBy = al.get(creatorId);
    al.fill();
    info.createdAt = creationDate;
    return Response.created(info);
  }