AddTeamMemberToGithubJob.java

package edu.ucsb.cs156.frontiers.jobs;

import edu.ucsb.cs156.frontiers.entities.Course;
import edu.ucsb.cs156.frontiers.entities.TeamMember;
import edu.ucsb.cs156.frontiers.enums.TeamStatus;
import edu.ucsb.cs156.frontiers.repositories.TeamMemberRepository;
import edu.ucsb.cs156.frontiers.services.GithubTeamService;
import edu.ucsb.cs156.frontiers.services.jobs.JobContext;
import edu.ucsb.cs156.frontiers.services.jobs.JobContextConsumer;
import lombok.Builder;

@Builder
public class AddTeamMemberToGithubJob implements JobContextConsumer {
  String memberGithubLogin;
  Integer githubTeamId;
  Long teamMemberId;
  Course course;
  GithubTeamService githubTeamService;
  TeamMemberRepository teamMemberRepository;

  @Override
  public void accept(JobContext ctx) throws Exception {
    ctx.log(
        "Starting add team member to GitHub job for team ID "
            + githubTeamId
            + " member "
            + memberGithubLogin);

    if (githubTeamId == null) {
      ctx.log("ERROR: Team has no GitHub team ID");
      return;
    }

    if (memberGithubLogin == null) {
      ctx.log("ERROR: Team member has no GitHub login");
      return;
    }

    if (course.getOrgName() == null || course.getInstallationId() == null) {
      ctx.log("ERROR: Course has no linked GitHub organization");
      return;
    }

    Integer orgId = null;
    try {
      orgId = githubTeamService.getOrgId(course.getOrgName(), course);

    } catch (Exception e) {
      ctx.log(
          "ERROR: Failed to get organization ID for org: "
              + course.getOrgName()
              + " - "
              + e.getMessage());
      return;
    }

    try {
      TeamStatus newStatus =
          githubTeamService.addMemberToGithubTeam(
              memberGithubLogin, githubTeamId, "member", course, orgId);
      ctx.log(
          "Successfully added " + memberGithubLogin + " to Github team with status: " + newStatus);

      TeamMember teamMember = teamMemberRepository.findById(teamMemberId).orElse(null);
      if (teamMember != null) {
        teamMember.setTeamStatus(newStatus);
        teamMemberRepository.save(teamMember);
        ctx.log("Updated team member status in database");
      } else {
        ctx.log("ERROR: Could not find team member in database with ID: " + teamMemberId);
      }
    } catch (Exception e) {
      ctx.log("ERROR: Failed to add user to GitHub team: " + e.getMessage());
    }

    ctx.log("Done");
  }
}