MembershipAuditJob.java

package edu.ucsb.cs156.frontiers.jobs;

import edu.ucsb.cs156.frontiers.entities.Course;
import edu.ucsb.cs156.frontiers.entities.CourseStaff;
import edu.ucsb.cs156.frontiers.entities.RosterStudent;
import edu.ucsb.cs156.frontiers.enums.OrgStatus;
import edu.ucsb.cs156.frontiers.models.OrgMember;
import edu.ucsb.cs156.frontiers.repositories.CourseRepository;
import edu.ucsb.cs156.frontiers.repositories.CourseStaffRepository;
import edu.ucsb.cs156.frontiers.repositories.RosterStudentRepository;
import edu.ucsb.cs156.frontiers.services.OrganizationMemberService;
import edu.ucsb.cs156.frontiers.services.jobs.JobContext;
import edu.ucsb.cs156.frontiers.services.jobs.JobContextConsumer;
import java.util.List;
import java.util.Optional;
import java.util.stream.StreamSupport;
import lombok.Builder;

@Builder
public class MembershipAuditJob implements JobContextConsumer {
  CourseRepository courseRepository;
  OrganizationMemberService organizationMemberService;
  RosterStudentRepository rosterStudentRepository;
  CourseStaffRepository courseStaffRepository;

  @Override
  public void accept(JobContext ctx) throws Exception {
    ctx.log("Auditing membership for each course with an attached GitHub Organization...");
    Iterable<Course> courses = courseRepository.findAll();
    for (Course course : courses) {
      if (course.getOrgName() != null && course.getInstallationId() != null) {
        Iterable<OrgMember> members = organizationMemberService.getOrganizationMembers(course);
        Iterable<OrgMember> admins = organizationMemberService.getOrganizationAdmins(course);
        Iterable<OrgMember> invitees = organizationMemberService.getOrganizationInvitees(course);
        List<RosterStudent> rosterStudents = course.getRosterStudents();
        List<CourseStaff> courseStaff = course.getCourseStaff();
        for (int i = 0; i < rosterStudents.size(); i++) {
          Integer studentGithubId = rosterStudents.get(i).getGithubId();
          String studentGithubLogin = rosterStudents.get(i).getGithubLogin();
          if (studentGithubId != null && studentGithubLogin != null) {
            Optional<OrgMember> member =
                StreamSupport.stream(members.spliterator(), false)
                    .filter(s -> studentGithubId.equals(s.getGithubId()))
                    .findFirst();
            Optional<OrgMember> admin =
                StreamSupport.stream(admins.spliterator(), false)
                    .filter(s -> studentGithubId.equals(s.getGithubId()))
                    .findFirst();
            Optional<OrgMember> invitee =
                StreamSupport.stream(invitees.spliterator(), false)
                    .filter(s -> studentGithubId.equals(s.getGithubId()))
                    .findFirst();

            OrgStatus updatedStatus = OrgStatus.JOINCOURSE;

            if (admin.isPresent()) {
              updatedStatus = OrgStatus.OWNER;
            } else if (member.isPresent()) {
              updatedStatus = OrgStatus.MEMBER;
            } else if (invitee.isPresent()) {
              updatedStatus = OrgStatus.INVITED;
            }
            rosterStudents.get(i).setOrgStatus(updatedStatus);
          }
        }
        rosterStudentRepository.saveAll(rosterStudents);

        for (int i = 0; i < courseStaff.size(); i++) {
          Integer staffGithubId = courseStaff.get(i).getGithubId();
          String staffGithubLogin = courseStaff.get(i).getGithubLogin();
          if (staffGithubId != null && staffGithubLogin != null) {
            Optional<OrgMember> member =
                StreamSupport.stream(members.spliterator(), false)
                    .filter(s -> staffGithubId.equals(s.getGithubId()))
                    .findFirst();
            Optional<OrgMember> admin =
                StreamSupport.stream(admins.spliterator(), false)
                    .filter(s -> staffGithubId.equals(s.getGithubId()))
                    .findFirst();
            Optional<OrgMember> invitee =
                StreamSupport.stream(invitees.spliterator(), false)
                    .filter(s -> staffGithubId.equals(s.getGithubId()))
                    .findFirst();

            OrgStatus updatedStatus = OrgStatus.JOINCOURSE;

            if (admin.isPresent()) {
              updatedStatus = OrgStatus.OWNER;
            } else if (member.isPresent()) {
              updatedStatus = OrgStatus.MEMBER;
            } else if (invitee.isPresent()) {
              updatedStatus = OrgStatus.INVITED;
            }
            courseStaff.get(i).setOrgStatus(updatedStatus);
          }
        }
        courseStaffRepository.saveAll(courseStaff);
      }
    }
    ctx.log("Done");
  }
}