DeleteRepoJob.java

package edu.ucsb.cs156.frontiers.jobs;

import edu.ucsb.cs156.frontiers.entities.Course;
import edu.ucsb.cs156.frontiers.repositories.CourseRepository;
import edu.ucsb.cs156.frontiers.services.RepositoryService;
import edu.ucsb.cs156.frontiers.services.RepositoryService.GithubRepository;
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 lombok.Builder;

@Builder
public class DeleteRepoJob implements JobContextConsumer {
  Long courseId;
  String prefix;
  CourseRepository courseRepository;
  RepositoryService repositoryService;

  @Override
  public Course getCourse() {
    Optional<Course> courseOpt = courseRepository.findById(courseId);
    return courseOpt.orElse(null);
  }

  @Override
  public void accept(JobContext ctx) throws Exception {
    ctx.log(String.format("Starting delete repository job for course ID: %s", courseId));
    ctx.log(String.format("prefix=%s", prefix));

    Optional<Course> courseOpt = courseRepository.findById(courseId);
    if (courseOpt.isEmpty()) {
      ctx.log(String.format("ERROR: Course with ID %s not found", courseId));
      return;
    }

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

    List<GithubRepository> repositories;
    int errors = 0;
    try {
      repositories = repositoryService.getRepositoriesMatchingPrefix(course, prefix);
    } catch (Exception e) {
      ctx.log(String.format("ERROR: Failed to list repositories: %s", e.getMessage()));
      errors++;
      ctx.log(String.format("Summary: found=0, deleted=0, retained=0, errors=%d", errors));
      return;
    }

    int deleted = 0;
    int retained = 0;

    for (GithubRepository repository : repositories) {
      try {
        boolean deletedRepository =
            repositoryService.deleteRepositoryIfEmpty(course, repository.name());
        if (deletedRepository) {
          deleted++;
          ctx.log(String.format("Deleted empty repository: %s", repository.name()));
        } else {
          retained++;
          ctx.log(String.format("Retained repository with commits: %s", repository.name()));
        }
      } catch (Exception e) {
        errors++;
        ctx.log(
            String.format(
                "ERROR: Failed to delete/check repository %s: %s",
                repository.name(), e.getMessage()));
      }
    }

    ctx.log(
        String.format(
            "Summary: found=%d, deleted=%d, retained=%d, errors=%d",
            repositories.size(), deleted, retained, errors));
    ctx.log("Done");
  }
}