RepositoryController.java

1
package edu.ucsb.cs156.frontiers.controllers;
2
3
import edu.ucsb.cs156.frontiers.entities.Course;
4
import edu.ucsb.cs156.frontiers.entities.Job;
5
import edu.ucsb.cs156.frontiers.enums.RepositoryCreationOption;
6
import edu.ucsb.cs156.frontiers.enums.RepositoryPermissions;
7
import edu.ucsb.cs156.frontiers.errors.EntityNotFoundException;
8
import edu.ucsb.cs156.frontiers.errors.NoLinkedOrganizationException;
9
import edu.ucsb.cs156.frontiers.jobs.CreateStudentOrStaffRepositoriesJob;
10
import edu.ucsb.cs156.frontiers.jobs.CreateTeamRepositoriesJob;
11
import edu.ucsb.cs156.frontiers.jobs.DeleteReposJob;
12
import edu.ucsb.cs156.frontiers.repositories.CourseRepository;
13
import edu.ucsb.cs156.frontiers.services.GithubTeamService;
14
import edu.ucsb.cs156.frontiers.services.RepositoryService;
15
import edu.ucsb.cs156.frontiers.services.jobs.JobService;
16
import io.swagger.v3.oas.annotations.tags.Tag;
17
import java.util.Optional;
18
import org.springframework.beans.factory.annotation.Autowired;
19
import org.springframework.security.access.prepost.PreAuthorize;
20
import org.springframework.web.bind.annotation.DeleteMapping;
21
import org.springframework.web.bind.annotation.PostMapping;
22
import org.springframework.web.bind.annotation.RequestMapping;
23
import org.springframework.web.bind.annotation.RequestParam;
24
import org.springframework.web.bind.annotation.RestController;
25
26
@Tag(name = "Repository Controller")
27
@RestController
28
@RequestMapping("/api/repos")
29
public class RepositoryController extends ApiController {
30
31
  @Autowired RepositoryService repositoryService;
32
33
  @Autowired JobService jobService;
34
35
  @Autowired CourseRepository courseRepository;
36
37
  @Autowired GithubTeamService githubTeamService;
38
39
  /**
40
   * Fires a job that creates a repo for every RosterStudent with a linked user with a GitHub
41
   * account.
42
   *
43
   * @param courseId ID of course to create repos for
44
   * @param repoPrefix each repo created will begin with this prefix, followed by a dash and the
45
   *     student's GitHub username
46
   * @param isPrivate determines whether the repository being created is private
47
   * @return the {@link edu.ucsb.cs156.frontiers.entities.Job Job} started to create the repos.
48
   */
49
  @PostMapping("/createRepos")
50
  @PreAuthorize("@CourseSecurity.hasManagePermissions(#root, #courseId)")
51
  public Job createRepos(
52
      @RequestParam Long courseId,
53
      @RequestParam String repoPrefix,
54
      @RequestParam Optional<Boolean> isPrivate,
55
      @RequestParam RepositoryPermissions permissions,
56
      @RequestParam(required = false, defaultValue = "STUDENTS_ONLY")
57
          RepositoryCreationOption creationOption) {
58
    Course course =
59
        courseRepository
60
            .findById(courseId)
61 1 1. lambda$createRepos$0 : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/RepositoryController::lambda$createRepos$0 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Course.class, courseId));
62 2 1. createRepos : negated conditional → KILLED
2. createRepos : negated conditional → KILLED
    if (course.getOrgName() == null || course.getInstallationId() == null) {
63
      throw new NoLinkedOrganizationException(course.getCourseName());
64
    } else {
65
      CreateStudentOrStaffRepositoriesJob job =
66
          CreateStudentOrStaffRepositoriesJob.builder()
67
              .repositoryPrefix(repoPrefix)
68
              .isPrivate(isPrivate.orElse(false))
69
              .repositoryService(repositoryService)
70
              .course(course)
71
              .permissions(permissions)
72
              .creationOption(creationOption)
73
              .build();
74 1 1. createRepos : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/RepositoryController::createRepos → KILLED
      return jobService.runAsJob(job);
75
    }
76
  }
77
78
  /**
79
   * Fires a job that creates team repos shared by all TeamMembers of each Team in a Course .
80
   *
81
   * @param courseId ID of course to create team repos for
82
   * @param repoPrefix each team repo created will begin with this prefix, followed by a dash and
83
   *     the team's name
84
   * @param isPrivate determines whether the repository being created is private
85
   * @return the {@link edu.ucsb.cs156.frontiers.entities.Job Job} started to create the repos.
86
   */
87
  @PostMapping("/createTeamRepos")
88
  @PreAuthorize("@CourseSecurity.hasManagePermissions(#root, #courseId)")
89
  public Job createTeamRepos(
90
      @RequestParam Long courseId,
91
      @RequestParam String repoPrefix,
92
      @RequestParam Optional<Boolean> isPrivate,
93
      @RequestParam RepositoryPermissions permissions,
94
      @RequestParam Optional<String> teamRegex) {
95
    Course course =
96
        courseRepository
97
            .findById(courseId)
98 1 1. lambda$createTeamRepos$1 : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/RepositoryController::lambda$createTeamRepos$1 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Course.class, courseId));
99 2 1. createTeamRepos : negated conditional → KILLED
2. createTeamRepos : negated conditional → KILLED
    if (course.getOrgName() == null || course.getInstallationId() == null) {
100
      throw new NoLinkedOrganizationException(course.getCourseName());
101
    } else {
102
      CreateTeamRepositoriesJob job =
103
          CreateTeamRepositoriesJob.builder()
104
              .repositoryPrefix(repoPrefix)
105
              .isPrivate(isPrivate.orElse(false))
106
              .repositoryService(repositoryService)
107
              .githubTeamService(githubTeamService)
108
              .course(course)
109
              .permissions(permissions)
110
              .teamRegex(teamRegex.orElse(null))
111
              .build();
112 1 1. createTeamRepos : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/RepositoryController::createTeamRepos → KILLED
      return jobService.runAsJob(job);
113
    }
114
  }
115
116
  @DeleteMapping("")
117
  @PreAuthorize("@CourseSecurity.hasManagePermissions(#root, #courseId)")
118
  public Job deleteRepos(@RequestParam Long courseId, @RequestParam String prefix) {
119
    Course course =
120
        courseRepository
121
            .findById(courseId)
122 1 1. lambda$deleteRepos$2 : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/RepositoryController::lambda$deleteRepos$2 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Course.class, courseId));
123 2 1. deleteRepos : negated conditional → KILLED
2. deleteRepos : negated conditional → KILLED
    if (course.getOrgName() == null || course.getInstallationId() == null) {
124
      throw new NoLinkedOrganizationException(course.getCourseName());
125
    } else {
126
      DeleteReposJob job =
127
          DeleteReposJob.builder()
128
              .courseId(courseId)
129
              .prefix(prefix)
130
              .courseRepository(courseRepository)
131
              .repositoryService(repositoryService)
132
              .build();
133 1 1. deleteRepos : replaced return value with null for edu/ucsb/cs156/frontiers/controllers/RepositoryController::deleteRepos → KILLED
      return jobService.runAsJob(job);
134
    }
135
  }
136
}

Mutations

61

1.1
Location : lambda$createRepos$0
Killed by : edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests]/[method:notFound()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/RepositoryController::lambda$createRepos$0 → KILLED

62

1.1
Location : createRepos
Killed by : edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests]/[method:job_actually_fires_with_instructor()]
negated conditional → KILLED

2.2
Location : createRepos
Killed by : edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests]/[method:just_no_install_id()]
negated conditional → KILLED

74

1.1
Location : createRepos
Killed by : edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests]/[method:job_actually_fires_with_instructor()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/RepositoryController::createRepos → KILLED

98

1.1
Location : lambda$createTeamRepos$1
Killed by : edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests]/[method:team_repo_job_notFound()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/RepositoryController::lambda$createTeamRepos$1 → KILLED

99

1.1
Location : createTeamRepos
Killed by : edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests]/[method:team_repo_job_actually_fires()]
negated conditional → KILLED

2.2
Location : createTeamRepos
Killed by : edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests]/[method:team_repo_job_just_no_install_id()]
negated conditional → KILLED

112

1.1
Location : createTeamRepos
Killed by : edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests]/[method:team_repo_job_actually_fires()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/RepositoryController::createTeamRepos → KILLED

122

1.1
Location : lambda$deleteRepos$2
Killed by : edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests]/[method:delete_repos_job_notFound()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/RepositoryController::lambda$deleteRepos$2 → KILLED

123

1.1
Location : deleteRepos
Killed by : edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests]/[method:delete_repos_job_just_no_install_id()]
negated conditional → KILLED

2.2
Location : deleteRepos
Killed by : edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests]/[method:delete_repos_job_actually_fires()]
negated conditional → KILLED

133

1.1
Location : deleteRepos
Killed by : edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.frontiers.controllers.RepositoryControllerTests]/[method:delete_repos_job_actually_fires()]
replaced return value with null for edu/ucsb/cs156/frontiers/controllers/RepositoryController::deleteRepos → KILLED

Active mutators

Tests examined


Report generated by PIT 1.17.0