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());
}
}