public record JoinInfo()

in sources/src/main/java/com/google/solutions/jitaccess/web/rest/GroupsResource.java [298:378]


  public record JoinInfo(
    @NotNull JoinStatusInfo status,
    @NotNull MembershipInfo membership,
    @NotNull List<ConstraintInfo> satisfiedConstraints,
    @NotNull List<ConstraintInfo> unsatisfiedConstraints,
    @NotNull List<InputInfo> input
  ) {
    static @NotNull GroupsResource.JoinInfo forJoinAnalysis(
      @NotNull JitGroupContext g
    ) {
      var joinOp = g.join();
      var analysis = joinOp.dryRun();

      JoinStatusInfo status;
      if (analysis.activeMembership().isPresent()) {
        status = JoinStatusInfo.JOINED;
      }
      else if (!analysis.isAccessAllowed(PolicyAnalysis.AccessOptions.IGNORE_CONSTRAINTS)) {
        status = JoinStatusInfo.JOIN_DISALLOWED;
      }
      else if (joinOp.requiresApproval()) {
        status = JoinStatusInfo.JOIN_ALLOWED_WITH_APPROVAL;
      }
      else {
        status = JoinStatusInfo.JOIN_ALLOWED_WITHOUT_APPROVAL;
      }

      return new JoinInfo(
        status,
        new MembershipInfo(
          analysis.activeMembership().isPresent(),
          analysis.activeMembership()
            .map(p -> p.expiry() != null ? p.expiry().getEpochSecond(): null)
            .orElse(null)),
        analysis.satisfiedConstraints().stream()
          .map(c -> new ConstraintInfo(c.name(), c.displayName()))
          .toList(),
        analysis.unsatisfiedConstraints().stream()
          .map(c -> new ConstraintInfo(c.name(), c.displayName()))
          .toList(),
        analysis.input().stream()
          .sorted(Comparator.comparing(p -> p.name()))
          .map(InputInfo::fromProperty)
          .toList());
    }

    static @NotNull GroupsResource.JoinInfo forCompletedJoin(
      @NotNull Principal principal,
      @NotNull List<Property> input
    ) {
      return new JoinInfo(
        JoinStatusInfo.JOIN_COMPLETED,
        new MembershipInfo(
          true,
          Optional.ofNullable(principal.expiry())
            .map(Instant::getEpochSecond)
            .get()),
        List.of(), // Don't repeat constraints
        List.of(), // Don't repeat constraints
        input
          .stream()
          .sorted(Comparator.comparing(p -> p.name()))
          .map(InputInfo::fromProperty)
          .toList());
    }

    static @NotNull GroupsResource.JoinInfo forProposal(
      @NotNull List<Property> input
    ) {
      return new JoinInfo(
        JoinStatusInfo.JOIN_PROPOSED,
        new MembershipInfo(false, null),
        List.of(), // Don't repeat constraints
        List.of(), // Don't repeat constraints
        input
          .stream()
          .sorted(Comparator.comparing(p -> p.name()))
          .map(InputInfo::fromProperty)
          .toList());
    }
  }