diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index 65e147938..d37727cd4 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -26,6 +26,6 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: analyze on sonarcloud - run: gradle build sonarqube -Dsonar.login=${{ secrets.SONAR_TOKEN }} + run: gradle codeCoverageReport sonarqube -Dsonar.login=${{ secrets.SONAR_TOKEN }} -Dsonar.java.binaries=build/classes env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/build.gradle b/build.gradle index d3b0446db..a39de6b10 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ buildscript { repositories { mavenLocal() + mavenCentral() jcenter() maven { url "https://plugins.gradle.org/m2/" @@ -10,9 +11,13 @@ buildscript { plugins { id "org.sonarqube" version "2.8" + id "jacoco" } apply plugin: 'idea' +apply plugin: "jacoco" +apply plugin: "java" +apply plugin: "org.sonarqube" ext { majorVersion = '0' @@ -28,20 +33,11 @@ file('gradle.d').listFiles().sort().each { } } -sonarqube { - properties { - property "sonar.projectKey", "adessoAG_coderadar" - property "sonar.organization", "adesso-ag" - property "sonar.host.url", "https://sonarcloud.io" - property "sonar.sources", "src/main/java, coderadar-ui/src" - property "sonar.tests", "src/test/java" - property "sonar.exclusions", "coderadar-app/workdir" - } -} subprojects { apply plugin: "idea" apply plugin: "java" + apply plugin: "org.sonarqube" buildscript { repositories { @@ -79,6 +75,19 @@ subprojects { testLogging { events "passed", "skipped", "failed" } + finalizedBy jacocoTestReport + } + + jacocoTestReport { + dependsOn test + } + + jacocoTestReport { + reports { + xml.enabled true + csv.enabled false + html.enabled true + } } dependencies { @@ -87,8 +96,10 @@ subprojects { testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: version_junit annotationProcessor("org.projectlombok:lombok:$lombok_version") compileOnly("org.projectlombok:lombok:$lombok_version") + testCompile group: 'org.jacoco', name: 'org.jacoco.ant', version: '0.8.5' } + } idea { @@ -96,3 +107,63 @@ idea { vcs = 'Git' } } + +sonarqube { + properties { + property "sonar.projectKey", "adessoAG_coderadar" + property "sonar.organization", "adesso-ag" + property "sonar.host.url", "https://sonarcloud.io" + property "sonar.sources", "src/main/java, coderadar-ui/src" + property "sonar.tests", "src/test/java" + property "sonar.exclusions", "coderadar-app/workdir" + property 'sonar.core.codeCoveragePlugin', 'jacoco' + property "sonar.coverage.jacoco.xmlReportPaths", "${project.buildDir}/reports/jacoco/codeCoverageReport/codeCoverageReport.xml" + } +} + +allprojects { + repositories { + mavenLocal() + mavenCentral() + jcenter() + maven { + url "https://plugins.gradle.org/m2/" + } + } + dependencies { + testCompile group: 'org.jacoco', name: 'org.jacoco.ant', version: '0.8.5' + } +} + +tasks.register("codeCoverageReport", JacocoReport) { + // If a subproject applies the 'jacoco' plugin, add the result it to the report + subprojects { subproject -> + subproject.plugins.withType(JacocoPlugin).configureEach { + subproject.tasks.matching({ t -> t.extensions.findByType(JacocoTaskExtension) }).configureEach { testTask -> + sourceSets subproject.sourceSets.main + executionData(testTask) + } + + // To automatically run `test` every time `./gradlew codeCoverageReport` is called, + // you may want to set up a task dependency between them as shown below. + // Note that this requires the `test` tasks to be resolved eagerly (see `forEach`) which + // may have a negative effect on the configuration time of your build. + subproject.tasks.matching({ t -> t.extensions.findByType(JacocoTaskExtension) }).forEach { + rootProject.tasks.codeCoverageReport.dependsOn(it) + } + } + } + + // enable the different report types (html, xml, csv) + reports { + // xml is usually used to integrate code coverage with + // other tools like SonarQube, Coveralls or Codecov + xml.enabled true + + // HTML reports can be used to see code coverage + // without any external tools + html.enabled true + } +} + + diff --git a/coderadar-app/src/main/java/io/reflectoring/coderadar/app/CoderadarApplication.java b/coderadar-app/src/main/java/io/reflectoring/coderadar/app/CoderadarApplication.java index 552981268..ce3a90e76 100644 --- a/coderadar-app/src/main/java/io/reflectoring/coderadar/app/CoderadarApplication.java +++ b/coderadar-app/src/main/java/io/reflectoring/coderadar/app/CoderadarApplication.java @@ -5,12 +5,11 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.EnableTransactionManagement; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.GetMapping; @EnableScheduling @EnableAsync(proxyTargetClass = true) @@ -19,22 +18,15 @@ @EntityScan(basePackages = "io.reflectoring.coderadar") @SpringBootApplication(scanBasePackages = "io.reflectoring.coderadar") @Controller -public class CoderadarApplication implements ErrorController { +public class CoderadarApplication { + public static void main(String[] args) { Locale.setDefault(Locale.US); SpringApplication.run(CoderadarApplication.class, args); } - // Forward unknown paths to index.html (angular) - private static final String PATH = "/error"; - - @RequestMapping(path = PATH) - public String error() { + @GetMapping(value = "/**/{path:[^.]*}") + public String redirect() { return "forward:/index.html"; } - - @Override - public String getErrorPath() { - return PATH; - } } diff --git a/coderadar-app/src/main/java/io/reflectoring/coderadar/app/Injector.java b/coderadar-app/src/main/java/io/reflectoring/coderadar/app/Injector.java deleted file mode 100644 index f81effe78..000000000 --- a/coderadar-app/src/main/java/io/reflectoring/coderadar/app/Injector.java +++ /dev/null @@ -1,40 +0,0 @@ -package io.reflectoring.coderadar.app; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * Helper class to make it possible to resolve {@link - * org.springframework.beans.factory.annotation.Autowired} annotations on beans that are not - * themselves part of the Spring application context. - */ -@Component -public class Injector implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - private static Injector INSTANCE = new Injector(); - - private Injector() {} - - public static Injector getInstance() { - return INSTANCE; - } - - /** - * Resolves {@link org.springframework.beans.factory.annotation.Autowired} annotations on the - * fields of the given object and injects them with beans from the Spring application context. - * - * @param bean the bean whose fields to inject. - */ - public void inject(Object bean) { - applicationContext.getAutowireCapableBeanFactory().autowireBean(bean); - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - Injector.applicationContext = applicationContext; - } -} diff --git a/coderadar-core/build.gradle b/coderadar-core/build.gradle index 7e7692995..81dce0c1b 100644 --- a/coderadar-core/build.gradle +++ b/coderadar-core/build.gradle @@ -1,4 +1,5 @@ apply plugin: "com.diffplug.gradle.spotless" +apply plugin: "jacoco" dependencies { compile project(':coderadar-plugin-api') diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/CoderadarConfigurationProperties.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/CoderadarConfigurationProperties.java index 7556046cf..6eec4c881 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/CoderadarConfigurationProperties.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/CoderadarConfigurationProperties.java @@ -74,7 +74,7 @@ public static class Authentication { @NotNull private Integer accessTokenDurationInMinutes = 15; - @NotNull private Boolean enabled = Boolean.TRUE; + private boolean enabled = Boolean.TRUE; @NotNull private Integer refreshTokenDurationInMinutes = 86400; } diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/analyzer/service/AnalyzerPluginService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/analyzer/service/AnalyzerPluginService.java index bcf5466c1..186da17c0 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/analyzer/service/AnalyzerPluginService.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/analyzer/service/AnalyzerPluginService.java @@ -15,10 +15,10 @@ @Service public class AnalyzerPluginService { - private Logger logger = LoggerFactory.getLogger(AnalyzerPluginService.class); + private final Logger logger = LoggerFactory.getLogger(AnalyzerPluginService.class); - private Map> sourceCodeFileAnalyzerPlugins = - new HashMap<>(); + private final Map> + sourceCodeFileAnalyzerPlugins = new HashMap<>(); /** * Constructs a new AnalyzerPluginRegistry. This is a very expensive operation since the @@ -103,7 +103,7 @@ private void checkValidConfigurationFile( } throw new IllegalArgumentException( String.format( - "Not a valid configuration file for analyzer plugin %s. The first couple lines of configuration file are:\n %s", + "Not a valid configuration file for analyzer plugin %s. The first couple lines of configuration file are:%n %s", configurableAnalyzer.getClass(), firstCoupleLines.toString())); } catch (IOException e) { throw new IllegalArgumentException( diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/analyzer/service/AnalyzingService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/analyzer/service/AnalyzingService.java index 4fd89c086..07ea9f27f 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/analyzer/service/AnalyzingService.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/analyzer/service/AnalyzingService.java @@ -170,44 +170,42 @@ private void analyzeBranch( */ private void zeroOutMissingMetrics( Commit commit, List metrics, Map> fileMetrics) { + for (FileToCommitRelationship relationship : commit.getTouchedFiles()) { - List values = fileMetrics.get(relationship.getFile().getId()); - if (values != null) { - for (MetricValue value : values) { - if (value.getValue() != 0 - && metrics.stream() - .noneMatch( - metricValue -> - metricValue.getName().equals(value.getName()) - && metricValue.getFileId() == value.getFileId())) { - metrics.add( - new MetricValue( - value.getName(), - 0L, - commit.getId(), - value.getFileId(), - Collections.emptyList())); - } + List values = + fileMetrics.getOrDefault(relationship.getFile().getId(), Collections.emptyList()); + + for (MetricValue value : values) { + if (value.getValue() != 0 + && metrics.stream() + .noneMatch( + metricValue -> + metricValue.getName().equals(value.getName()) + && metricValue.getFileId() == value.getFileId())) { + metrics.add( + new MetricValue( + value.getName(), 0L, commit.getId(), value.getFileId(), Collections.emptyList())); } } } + if (metrics.isEmpty()) { + return; + } metrics.sort(Comparator.comparingLong(MetricValue::getFileId)); - if (!metrics.isEmpty()) { - long fileId = metrics.get(0).getFileId(); - List metricsForFile = new ArrayList<>(); - for (MetricValue metricValue : metrics) { - if (metricValue.getValue() != 0) { - if (metricValue.getFileId() != fileId) { - fileMetrics.put(fileId, new ArrayList<>(metricsForFile)); - fileId = metricValue.getFileId(); - metricsForFile.clear(); - } - metricsForFile.add(metricValue); + long fileId = metrics.get(0).getFileId(); + List metricsForFile = new ArrayList<>(); + for (MetricValue metricValue : metrics) { + if (metricValue.getValue() != 0) { + if (metricValue.getFileId() != fileId) { + fileMetrics.put(fileId, new ArrayList<>(metricsForFile)); + fileId = metricValue.getFileId(); + metricsForFile.clear(); } + metricsForFile.add(metricValue); } - fileMetrics.put(fileId, metricsForFile); } + fileMetrics.put(fileId, metricsForFile); } /** diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/contributor/domain/Contributor.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/contributor/domain/Contributor.java index cce3f57e2..529de0248 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/contributor/domain/Contributor.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/contributor/domain/Contributor.java @@ -2,8 +2,10 @@ import java.util.Set; import lombok.Data; +import lombok.NoArgsConstructor; @Data +@NoArgsConstructor public class Contributor { private Long id; private String displayName; diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/dependencymap/domain/CompareNode.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/dependencymap/domain/CompareNode.java index c216f285a..20a049994 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/dependencymap/domain/CompareNode.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/dependencymap/domain/CompareNode.java @@ -1,9 +1,10 @@ package io.reflectoring.coderadar.dependencymap.domain; import io.reflectoring.coderadar.plugin.api.ChangeType; +import java.util.ArrayDeque; +import java.util.Deque; import java.util.HashSet; import java.util.List; -import java.util.Stack; import java.util.concurrent.CopyOnWriteArrayList; import lombok.Getter; import lombok.Setter; @@ -106,10 +107,10 @@ public CompareNode getNodeByPath(String nodePath) { if (nodePath == null || nodePath.equals("")) { return null; } - String[] path = nodePath.split("/"); + String[] pathString = nodePath.split("/"); CompareNode tmp = this; // iterate over every part of the new path - for (String s : path) { + for (String s : pathString) { // if the Node-object already exists, iterate over it if (tmp.getChildByName(s) != null) { tmp = tmp.getChildByName(s); @@ -131,12 +132,12 @@ public CompareNode createNodeByPath(String nodePath, ChangeType changeType) { if (nodePath == null || nodePath.equals("")) { return null; } - String[] path = nodePath.split("/"); + String[] pathString = nodePath.split("/"); CompareNode tmp = this; // iterate over every part of the new path int i = 0; - while (i < path.length) { - String s = path[i]; + while (i < pathString.length) { + String s = pathString[i]; // if the Node-object already exists, iterate over it if (tmp.getChildByName(s) != null) { tmp = tmp.getChildByName(s); @@ -193,15 +194,14 @@ public boolean hasDependencyOn(CompareNode node) { if (dependency.getPath().equals(node.getPath())) { return true; } - } else if (!this.hasChildren() && node.hasChildren() - || this.hasChildren() && node.hasChildren()) { - if (dependency - .getPath() - .contains( - (node.getPackageName().equals("") ? node.getFilename() : node.getPackageName()) - .replaceAll("\\.", "/"))) { - return true; - } + } else if ((!this.hasChildren() && node.hasChildren() + || this.hasChildren() && node.hasChildren()) + && dependency + .getPath() + .contains( + (node.getPackageName().equals("") ? node.getFilename() : node.getPackageName()) + .replaceAll("\\.", "/"))) { + return true; } } return false; @@ -219,7 +219,7 @@ public CompareNode getParent(CompareNode root) { } else if (!path.contains("/")) { return root; } else { - String parentPath = this.path.substring(0, this.path.lastIndexOf("/")); + String parentPath = this.path.substring(0, this.path.lastIndexOf('/')); return root.getNodeByPath(parentPath); } } @@ -246,16 +246,16 @@ public CompareNodeDTO getDependencyByPath(String path) { * @param traverseInterface method to call. */ public void traversePost(CompareTreeTraverseInterface traverseInterface) { - Stack stack = new Stack<>(); + Deque stack = new ArrayDeque<>(); HashSet hash = new HashSet<>(); CompareNode root = this; - stack.push(root); + stack.offer(root); while (!stack.isEmpty()) { - root = stack.peek(); + root = stack.peekLast(); if (root.children.isEmpty() || hash.contains(root)) { - traverseInterface.traverseMethod(stack.pop()); + traverseInterface.traverseMethod(stack.pollLast()); } else { - root.children.forEach(stack::push); + root.children.forEach(stack::offer); hash.add(root); } } @@ -268,11 +268,11 @@ public void traversePost(CompareTreeTraverseInterface traverseInterface) { */ public void traversePre(CompareTreeTraverseInterface traverseInterface) { CompareNode root = this; - Stack stack = new Stack<>(); - stack.add(root); + Deque stack = new ArrayDeque<>(); + stack.offer(root); while (!stack.isEmpty()) { - root = stack.pop(); + root = stack.pollLast(); stack.addAll(root.children); traverseInterface.traverseMethod(root); } diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/dependencymap/domain/Node.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/dependencymap/domain/Node.java index af371281a..71d6e8e48 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/dependencymap/domain/Node.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/dependencymap/domain/Node.java @@ -1,8 +1,6 @@ package io.reflectoring.coderadar.dependencymap.domain; -import java.util.HashSet; -import java.util.List; -import java.util.Stack; +import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import lombok.Getter; import lombok.Setter; @@ -94,10 +92,10 @@ public Node getNodeByPath(String nodePath) { if (nodePath == null || nodePath.equals("")) { return null; } - String[] path = nodePath.split("/"); + String[] pathSplit = nodePath.split("/"); Node tmp = this; // iterate over every part of the new path - for (String s : path) { + for (String s : pathSplit) { // if the Node-object already exists, iterate over it if (tmp.getChildByName(s) != null) { tmp = tmp.getChildByName(s); @@ -119,19 +117,16 @@ public Node createNodeByPath(String nodePath) { if (nodePath == null || nodePath.equals("")) { return null; } - String[] path = nodePath.split("/"); + String[] pathSplit = nodePath.split("/"); Node tmp = this; // iterate over every part of the new path int i = 0; - while (i < path.length) { - String s = path[i]; + while (i < pathSplit.length) { + String s = pathSplit[i]; // if the Node-object already exists, iterate over it if (tmp.getChildByName(s) != null) { tmp = tmp.getChildByName(s); } else { - // create new Node - // Node node = new Node(new ArrayList<>(), tmp.getPath() + "/" + s, s, - // packageName); Node node = new Node(s, tmp.getPath().equals("") ? s : tmp.getPath() + "/" + s, ""); tmp.addToChildren(node); tmp = node; @@ -179,19 +174,16 @@ public int countDependenciesOn(Node node) { */ public boolean hasDependencyOn(Node node) { for (NodeDTO dependency : dependencies) { - if (!this.hasChildren() && !node.hasChildren() || this.hasChildren() && !node.hasChildren()) { - if (dependency.getPath().equals(node.getPath())) { - return true; - } - } else if (!this.hasChildren() && node.hasChildren() - || this.hasChildren() && node.hasChildren()) { - if (dependency - .getPath() - .contains( - (node.getPackageName().equals("") ? node.getFilename() : node.getPackageName()) - .replaceAll("\\.", "/"))) { - return true; - } + if ((!node.hasChildren() && dependency.getPath().equals(node.getPath())) + || (node.hasChildren() + && dependency + .getPath() + .contains( + (node.getPackageName().equals("") + ? node.getFilename() + : node.getPackageName()) + .replaceAll("\\.", "/")))) { + return true; } } return false; @@ -227,13 +219,13 @@ public NodeDTO getDependencyByPath(String path) { * @param traverseInterface method to call. */ public void traversePost(TraverseInterface traverseInterface) { - Stack stack = new Stack<>(); + Deque stack = new ArrayDeque<>(); HashSet hash = new HashSet<>(); Node root = this; stack.push(root); while (!stack.isEmpty()) { root = stack.peek(); - if (root.children.size() == 0 || hash.contains(root)) { + if (root.children.isEmpty() || hash.contains(root)) { traverseInterface.traverseMethod(stack.pop()); } else { root.children.forEach(stack::push); @@ -249,11 +241,11 @@ public void traversePost(TraverseInterface traverseInterface) { */ public void traversePre(TraverseInterface traverseInterface) { Node root = this; - Stack stack = new Stack<>(); - stack.add(root); + Deque stack = new ArrayDeque<>(); + stack.push(root); while (!stack.isEmpty()) { - root = stack.pop(); + root = stack.removeLast(); stack.addAll(root.children); traverseInterface.traverseMethod(root); } diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/domain/Project.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/domain/Project.java index 09d40a38a..0b46dc9a5 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/domain/Project.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/domain/Project.java @@ -1,9 +1,11 @@ package io.reflectoring.coderadar.projectadministration.domain; +import io.reflectoring.coderadar.useradministration.domain.Team; import java.util.Date; +import java.util.List; import lombok.Data; -/** A coderadar project that defines the source of files that are to be analyzed. */ +/** A Coderadar project that defines the source of files that are to be analyzed. */ @Data public class Project { private long id; @@ -14,4 +16,5 @@ public class Project { private String vcsPassword; private boolean vcsOnline; private Date vcsStart; + private List teams; } diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/port/driven/module/CreateModulePort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/port/driven/module/CreateModulePort.java index 6b49bbebc..15e1160d3 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/port/driven/module/CreateModulePort.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/port/driven/module/CreateModulePort.java @@ -1,6 +1,5 @@ package io.reflectoring.coderadar.projectadministration.port.driven.module; -import io.reflectoring.coderadar.projectadministration.ModuleAlreadyExistsException; import io.reflectoring.coderadar.projectadministration.ModulePathInvalidException; public interface CreateModulePort { @@ -11,9 +10,7 @@ public interface CreateModulePort { * @param modulePath The path of the module. * @param projectId The id of the project. * @return The id of the module. - * @throws ModuleAlreadyExistsException Thrown if a module with the given path already exists. * @throws ModulePathInvalidException Thrown if the supplied path is invalid. */ - Long createModule(String modulePath, long projectId) - throws ModuleAlreadyExistsException, ModulePathInvalidException; + Long createModule(String modulePath, long projectId) throws ModulePathInvalidException; } diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/analyzerconfig/CreateAnalyzerConfigurationService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/analyzerconfig/CreateAnalyzerConfigurationService.java index c99cf3333..bb82bcd5c 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/analyzerconfig/CreateAnalyzerConfigurationService.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/analyzerconfig/CreateAnalyzerConfigurationService.java @@ -43,9 +43,9 @@ public Long create(CreateAnalyzerConfigurationCommand command, long projectId) { analyzerConfiguration.setAnalyzerName(command.getAnalyzerName()); Long id = createAnalyzerConfigurationPort.create(analyzerConfiguration, projectId); logger.info( - String.format( - "Added analyzerConfiguration %s for project with id %d", - analyzerConfiguration.getAnalyzerName(), projectId)); + "Added analyzerConfiguration {} for project with id {}", + analyzerConfiguration.getAnalyzerName(), + projectId); return id; } else { throw new AnalyzerConfigurationException( diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/analyzerconfig/DeleteAnalyzerConfigurationService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/analyzerconfig/DeleteAnalyzerConfigurationService.java index bd397ac0c..b00716608 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/analyzerconfig/DeleteAnalyzerConfigurationService.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/analyzerconfig/DeleteAnalyzerConfigurationService.java @@ -29,8 +29,8 @@ public void deleteAnalyzerConfiguration(long id, long projectId) { getAnalyzerConfigurationPort.getAnalyzerConfiguration(id); port.deleteAnalyzerConfiguration(id); logger.info( - String.format( - "Deleted analyzerConfiguration %s for project with id %d", - analyzerConfiguration.getAnalyzerName(), projectId)); + "Deleted analyzerConfiguration {} for project with id {}", + analyzerConfiguration.getAnalyzerName(), + projectId); } } diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/analyzerconfig/UpdateAnalyzerConfigurationService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/analyzerconfig/UpdateAnalyzerConfigurationService.java index 2765ab04a..5773612d2 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/analyzerconfig/UpdateAnalyzerConfigurationService.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/analyzerconfig/UpdateAnalyzerConfigurationService.java @@ -52,9 +52,9 @@ public void update( analyzerConfiguration.setEnabled(command.isEnabled()); updateAnalyzerConfigurationPort.update(analyzerConfiguration); logger.info( - String.format( - "Updated analyzerConfiguration with id %d for project with id %d", - analyzerConfiguration.getId(), projectId)); + "Updated analyzerConfiguration with id {} for project with id {}", + analyzerConfiguration.getId(), + projectId); } else { throw new AnalyzerConfigurationException( "An analyzer with this name is already configured for the project!"); diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/project/CreateProjectService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/project/CreateProjectService.java index 5b5dfe1f3..eae7cbf20 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/project/CreateProjectService.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/project/CreateProjectService.java @@ -16,6 +16,9 @@ import io.reflectoring.coderadar.projectadministration.port.driver.project.create.CreateProjectUseCase; import io.reflectoring.coderadar.projectadministration.service.ProcessProjectService; import io.reflectoring.coderadar.query.domain.DateRange; +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; +import io.reflectoring.coderadar.useradministration.port.driven.SetUserRoleForProjectPort; import io.reflectoring.coderadar.vcs.port.driven.GetAvailableBranchesPort; import io.reflectoring.coderadar.vcs.port.driver.ExtractProjectCommitsUseCase; import io.reflectoring.coderadar.vcs.port.driver.clone.CloneRepositoryCommand; @@ -27,6 +30,8 @@ import java.util.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -54,6 +59,10 @@ public class CreateProjectService implements CreateProjectUseCase { private final ListContributorsPort listContributorsPort; + private final SetUserRoleForProjectPort setUserRoleForProjectPort; + + private final GetUserPort getUserPort; + private static final Logger logger = LoggerFactory.getLogger(CreateProjectService.class); public CreateProjectService( @@ -67,7 +76,9 @@ public CreateProjectService( SaveCommitPort saveCommitPort, ComputeContributorsPort computeContributorsPort, SaveContributorsPort saveContributorsPort, - ListContributorsPort listContributorsPort) { + ListContributorsPort listContributorsPort, + SetUserRoleForProjectPort setUserRoleForProjectPort, + GetUserPort getUserPort) { this.getAvailableBranchesPort = getAvailableBranchesPort; this.createProjectPort = createProjectPort; this.getProjectPort = getProjectPort; @@ -79,6 +90,8 @@ public CreateProjectService( this.computeContributorsPort = computeContributorsPort; this.saveContributorsPort = saveContributorsPort; this.listContributorsPort = listContributorsPort; + this.setUserRoleForProjectPort = setUserRoleForProjectPort; + this.getUserPort = getUserPort; } @Override @@ -87,6 +100,7 @@ public Long createProject(CreateProjectCommand command) { throw new ProjectAlreadyExistsException(command.getName()); } Project project = saveProject(command); + setAdminRoleForCurrentUser(project.getId()); processProjectService.executeTask( () -> { String localDir = @@ -121,6 +135,16 @@ public Long createProject(CreateProjectCommand command) { return project.getId(); } + private void setAdminRoleForCurrentUser(Long projectId) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && authentication.getPrincipal() instanceof String) { + setUserRoleForProjectPort.setRole( + projectId, + getUserPort.getUserByUsername(((String) authentication.getPrincipal())).getId(), + ProjectRole.ADMIN); + } + } + private synchronized void saveContributors(Project project) { List contributors = listContributorsPort.listAll(); contributors = diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/project/ScanProjectScheduler.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/project/ScanProjectScheduler.java index 7086a3df7..3d97c9fc8 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/project/ScanProjectScheduler.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/projectadministration/service/project/ScanProjectScheduler.java @@ -98,7 +98,7 @@ public void onApplicationEvent() { } taskScheduler.scheduleAtFixedRate( this::scheduleCheckTask, - coderadarConfigurationProperties.getScanIntervalInSeconds() * 1000); + coderadarConfigurationProperties.getScanIntervalInSeconds() * 1000L); } /** Starts update tasks for all projects that don't have one running already. */ diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/query/service/GetFileContentWithMetricsService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/query/service/GetFileContentWithMetricsService.java index 7ad5554e2..da17f3607 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/query/service/GetFileContentWithMetricsService.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/query/service/GetFileContentWithMetricsService.java @@ -37,13 +37,16 @@ public FileContentWithMetrics getFileContentWithMetrics( Project project = getProjectPort.get(projectId); String workdir = coderadarConfigurationProperties.getWorkdir() + "/projects/" + project.getWorkdirName(); - String content = - new String( - getRawCommitContentPort.getCommitContent( - workdir, command.getFilepath(), command.getCommitHash())); - List metrics = - getMetricsAndFindingsForFilePort.getMetricsAndFindingsForFile( - projectId, command.getCommitHash(), command.getFilepath()); - return new FileContentWithMetrics(content, metrics); + byte[] rawContent = + getRawCommitContentPort.getCommitContent( + workdir, command.getFilepath(), command.getCommitHash()); + if (rawContent != null) { + List metrics = + getMetricsAndFindingsForFilePort.getMetricsAndFindingsForFile( + projectId, command.getCommitHash(), command.getFilepath()); + return new FileContentWithMetrics(new String(rawContent), metrics); + } else { + return new FileContentWithMetrics("", null); + } } } diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/TeamAlreadyExistsException.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/TeamAlreadyExistsException.java new file mode 100644 index 000000000..5409b9fcf --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/TeamAlreadyExistsException.java @@ -0,0 +1,9 @@ +package io.reflectoring.coderadar.useradministration; + +import io.reflectoring.coderadar.EntityAlreadyExistsException; + +public class TeamAlreadyExistsException extends EntityAlreadyExistsException { + public TeamAlreadyExistsException(String name) { + super("Team with name " + name + " already exists!"); + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/TeamNotAssignedException.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/TeamNotAssignedException.java new file mode 100644 index 000000000..0db8381fb --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/TeamNotAssignedException.java @@ -0,0 +1,8 @@ +package io.reflectoring.coderadar.useradministration; + +public class TeamNotAssignedException extends RuntimeException { + public TeamNotAssignedException(Long projectId, Long teamId) { + super( + String.format("Team with id %d is not assigned to project with id %d", teamId, projectId)); + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/TeamNotFoundException.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/TeamNotFoundException.java new file mode 100644 index 000000000..a9b2d8ddb --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/TeamNotFoundException.java @@ -0,0 +1,9 @@ +package io.reflectoring.coderadar.useradministration; + +import io.reflectoring.coderadar.EntityNotFoundException; + +public class TeamNotFoundException extends EntityNotFoundException { + public TeamNotFoundException(Long teamId) { + super("Team with id " + teamId + " not found."); + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/UserNotAssignedException.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/UserNotAssignedException.java new file mode 100644 index 000000000..2d475cc79 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/UserNotAssignedException.java @@ -0,0 +1,8 @@ +package io.reflectoring.coderadar.useradministration; + +public class UserNotAssignedException extends RuntimeException { + public UserNotAssignedException(Long projectId, Long userId) { + super( + String.format("User with id %d is not assigned to project with id %d", userId, projectId)); + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/UserNotInTeamException.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/UserNotInTeamException.java new file mode 100644 index 000000000..e134cdb58 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/UserNotInTeamException.java @@ -0,0 +1,7 @@ +package io.reflectoring.coderadar.useradministration; + +public class UserNotInTeamException extends RuntimeException { + public UserNotInTeamException(Long userId, long teamId) { + super(String.format("User with id %d is not in team with id %d", userId, teamId)); + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/domain/ProjectRole.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/domain/ProjectRole.java new file mode 100644 index 000000000..b97bbd87f --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/domain/ProjectRole.java @@ -0,0 +1,23 @@ +package io.reflectoring.coderadar.useradministration.domain; + +/** + * ADMIN: - Can delete a project - Can remove users from a team - Can add users to a team - Can + * analyze a project - Can delete analysis results - Can configure file patterns, modules, + * analyzers, (merge contributors?) + * + *

MEMBER: - Can analyze a project. + */ +public enum ProjectRole { + ADMIN("admin"), + MEMBER("member"); + + private final String value; + + ProjectRole(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/domain/Team.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/domain/Team.java new file mode 100644 index 000000000..651fd1f6c --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/domain/Team.java @@ -0,0 +1,14 @@ +package io.reflectoring.coderadar.useradministration.domain; + +import java.util.Collections; +import java.util.List; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class Team { + private long id; + private String name; + private List members = Collections.emptyList(); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/AddTeamToProjectPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/AddTeamToProjectPort.java new file mode 100644 index 000000000..47a31adb9 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/AddTeamToProjectPort.java @@ -0,0 +1,16 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; + +public interface AddTeamToProjectPort { + + /** + * Creates a team in the given project. If the team is already assigned to the project, the + * existing role is overwritten. + * + * @param projectId The id of the project. + * @param teamId The team id. + * @param role The role to add the team with. + */ + void addTeamToProject(long projectId, long teamId, ProjectRole role); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/AddUsersToTeamPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/AddUsersToTeamPort.java new file mode 100644 index 000000000..7d2cf7342 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/AddUsersToTeamPort.java @@ -0,0 +1,14 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import java.util.List; + +public interface AddUsersToTeamPort { + + /** + * Adds users to a team. If a user is already in the team nothing is changed. + * + * @param teamId The id of the team. + * @param userIds The ids of the users. + */ + void addUsersToTeam(long teamId, List userIds); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/CreateTeamPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/CreateTeamPort.java new file mode 100644 index 000000000..0c3d5b79b --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/CreateTeamPort.java @@ -0,0 +1,13 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import io.reflectoring.coderadar.useradministration.port.driver.teams.create.CreateTeamCommand; + +public interface CreateTeamPort { + /** + * Creates a new team. + * + * @param createTeamCommand The command containing the required data. + * @return The id of the new team. + */ + Long createTeam(CreateTeamCommand createTeamCommand); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/DeleteTeamPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/DeleteTeamPort.java new file mode 100644 index 000000000..f0a8f1d89 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/DeleteTeamPort.java @@ -0,0 +1,10 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +public interface DeleteTeamPort { + /** + * Deletes a team. + * + * @param teamId The id of the team. + */ + void deleteTeam(long teamId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/GetTeamPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/GetTeamPort.java new file mode 100644 index 000000000..039eb392b --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/GetTeamPort.java @@ -0,0 +1,23 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import io.reflectoring.coderadar.useradministration.domain.Team; + +public interface GetTeamPort { + /** + * @param teamId The team id. + * @return The team with the given id. + */ + Team get(long teamId); + + /** + * @param teamId The id of the team. + * @return True if a team with the given id exists. + */ + boolean existsById(long teamId); + + /** + * @param name The name of the team. + * @return True if a team with the given name exists. + */ + boolean existsByName(String name); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/GetUserRoleForProjectPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/GetUserRoleForProjectPort.java new file mode 100644 index 000000000..27de4b577 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/GetUserRoleForProjectPort.java @@ -0,0 +1,14 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; + +public interface GetUserRoleForProjectPort { + + /** + * Gives a user a role in the project. + * + * @param projectId The id of the project. + * @param userId The id of the user. + */ + ProjectRole getRole(long projectId, long userId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListProjectsForTeamPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListProjectsForTeamPort.java new file mode 100644 index 000000000..91980ca17 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListProjectsForTeamPort.java @@ -0,0 +1,12 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import io.reflectoring.coderadar.projectadministration.domain.Project; +import java.util.List; + +public interface ListProjectsForTeamPort { + /** + * @param teamId The id of the team. + * @return All projects the team has access to. + */ + List listProjects(long teamId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListProjectsForUserPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListProjectsForUserPort.java new file mode 100644 index 000000000..a3e4edee1 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListProjectsForUserPort.java @@ -0,0 +1,13 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import io.reflectoring.coderadar.projectadministration.domain.Project; +import java.util.List; + +public interface ListProjectsForUserPort { + + /** + * @param userId The id of the user. + * @return All projects this user has access to. + */ + List listProjects(long userId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListTeamsForProjectPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListTeamsForProjectPort.java new file mode 100644 index 000000000..beedfb323 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListTeamsForProjectPort.java @@ -0,0 +1,13 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import io.reflectoring.coderadar.useradministration.domain.Team; +import java.util.List; + +public interface ListTeamsForProjectPort { + + /** + * @param projectId The id of the project. + * @return All teams with access to this project. + */ + List listTeamsForProject(long projectId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListTeamsForUserPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListTeamsForUserPort.java new file mode 100644 index 000000000..7ecb1ccdf --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListTeamsForUserPort.java @@ -0,0 +1,13 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import io.reflectoring.coderadar.useradministration.domain.Team; +import java.util.List; + +public interface ListTeamsForUserPort { + + /** + * @param userId The id of the user. + * @return All teams the user is in. + */ + List listTeamsForUser(long userId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListTeamsPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListTeamsPort.java new file mode 100644 index 000000000..ba093a6de --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListTeamsPort.java @@ -0,0 +1,9 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import io.reflectoring.coderadar.useradministration.domain.Team; +import java.util.List; + +public interface ListTeamsPort { + /** @return All teams in the database. */ + List listTeams(); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListUsersForProjectPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListUsersForProjectPort.java new file mode 100644 index 000000000..b302708a6 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListUsersForProjectPort.java @@ -0,0 +1,13 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import io.reflectoring.coderadar.useradministration.domain.User; +import java.util.List; + +public interface ListUsersForProjectPort { + + /** + * @param projectId The project id. + * @return All users that have access to this project. + */ + List listUsers(long projectId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListUsersPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListUsersPort.java new file mode 100644 index 000000000..039cf273c --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/ListUsersPort.java @@ -0,0 +1,10 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import io.reflectoring.coderadar.useradministration.domain.User; +import java.util.List; + +public interface ListUsersPort { + + /** @return All users in the database. */ + List listUsers(); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/RemoveTeamFromProjectPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/RemoveTeamFromProjectPort.java new file mode 100644 index 000000000..6dd85f281 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/RemoveTeamFromProjectPort.java @@ -0,0 +1,13 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +public interface RemoveTeamFromProjectPort { + + /** + * Removes a team from a project. Any permissions users had for a project because of the team will + * be lost after this operation. + * + * @param projectId The id of the project. + * @param teamId The id of the team. + */ + void removeTeam(long projectId, long teamId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/RemoveUserFromProjectPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/RemoveUserFromProjectPort.java new file mode 100644 index 000000000..ae10d759a --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/RemoveUserFromProjectPort.java @@ -0,0 +1,14 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +public interface RemoveUserFromProjectPort { + + /** + * Removes the role a given user has to a project. If the user is not in any team with access to + * the project, they will no longer have access to the project. If the user is not assigned to the + * project, nothing is changed. + * + * @param projectId The id of the project. + * @param userId The id of the user. + */ + void removeUserFromProject(long projectId, long userId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/RemoveUsersFromTeamPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/RemoveUsersFromTeamPort.java new file mode 100644 index 000000000..8a6b3c430 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/RemoveUsersFromTeamPort.java @@ -0,0 +1,15 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import java.util.List; + +public interface RemoveUsersFromTeamPort { + + /** + * Removes users from a team. Any permissions users had for a project because of the team will be + * lost after this operation. + * + * @param teamId The id of the team. + * @param userIds The ids of the users. + */ + void removeUsersFromTeam(long teamId, List userIds); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/SetUserRoleForProjectPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/SetUserRoleForProjectPort.java new file mode 100644 index 000000000..b0e6cd7e3 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driven/SetUserRoleForProjectPort.java @@ -0,0 +1,16 @@ +package io.reflectoring.coderadar.useradministration.port.driven; + +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; + +public interface SetUserRoleForProjectPort { + + /** + * Gives a user a role in the project. If the user is already assigned to the project, the + * existing role is overwritten. + * + * @param projectId The id of the project. + * @param userId The id of the user. + * @param role The role to set. + */ + void setRole(long projectId, long userId, ProjectRole role); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/CoderadarPasswordValidator.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/CoderadarPasswordValidator.java index f649b02eb..c31884e81 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/CoderadarPasswordValidator.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/CoderadarPasswordValidator.java @@ -9,9 +9,6 @@ /** Validator for user passwords. */ public class CoderadarPasswordValidator implements ConstraintValidator { - @Override - public void initialize(ValidPassword constraintAnnotation) {} - @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (value == null || value.isEmpty()) { diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/load/GetUserUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/get/GetUserUseCase.java similarity index 97% rename from coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/load/GetUserUseCase.java rename to coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/get/GetUserUseCase.java index 5d0016706..8dbd66323 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/load/GetUserUseCase.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/get/GetUserUseCase.java @@ -1,4 +1,4 @@ -package io.reflectoring.coderadar.useradministration.port.driver.load; +package io.reflectoring.coderadar.useradministration.port.driver.get; import io.reflectoring.coderadar.useradministration.domain.User; diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/get/ListProjectsForUserUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/get/ListProjectsForUserUseCase.java new file mode 100644 index 000000000..7e5ef22b2 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/get/ListProjectsForUserUseCase.java @@ -0,0 +1,13 @@ +package io.reflectoring.coderadar.useradministration.port.driver.get; + +import io.reflectoring.coderadar.projectadministration.domain.Project; +import java.util.List; + +public interface ListProjectsForUserUseCase { + + /** + * @param userId The id of the user. + * @return All projects this user has access to. + */ + List listProjects(long userId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/get/ListUsersUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/get/ListUsersUseCase.java new file mode 100644 index 000000000..33efbdf78 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/get/ListUsersUseCase.java @@ -0,0 +1,10 @@ +package io.reflectoring.coderadar.useradministration.port.driver.get; + +import io.reflectoring.coderadar.useradministration.domain.User; +import java.util.List; + +public interface ListUsersUseCase { + + /** @return All users in the database. */ + List listUsers(); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/login/LoginUserResponse.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/login/LoginUserResponse.java index 77afba790..43481c349 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/login/LoginUserResponse.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/login/LoginUserResponse.java @@ -8,4 +8,5 @@ public class LoginUserResponse { private String accessToken; private String refreshToken; + private Long userId; } diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/permissions/RemoveUserFromProjectUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/permissions/RemoveUserFromProjectUseCase.java new file mode 100644 index 000000000..e57ed4cc6 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/permissions/RemoveUserFromProjectUseCase.java @@ -0,0 +1,14 @@ +package io.reflectoring.coderadar.useradministration.port.driver.permissions; + +public interface RemoveUserFromProjectUseCase { + + /** + * Removes the role a given user has to a project. If the user is not in any team with access to + * the project, they will no longer have access to the project. If the user is not assigned to the + * project, nothing is changed. + * + * @param projectId The id of the project. + * @param userId The id of the user. + */ + void removeUserFromProject(long projectId, long userId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/permissions/SetUserRoleForProjectUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/permissions/SetUserRoleForProjectUseCase.java new file mode 100644 index 000000000..69ae3d44f --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/permissions/SetUserRoleForProjectUseCase.java @@ -0,0 +1,16 @@ +package io.reflectoring.coderadar.useradministration.port.driver.permissions; + +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; + +public interface SetUserRoleForProjectUseCase { + + /** + * Gives a user a role in the project. If the user is already assigned to the project, the + * existing role is overwritten. + * + * @param projectId The id of the project. + * @param userId The id of the user. + * @param role The role to set. + */ + void setRole(long projectId, long userId, ProjectRole role); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/register/RegisterUserUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/register/RegisterUserUseCase.java index 4cdc0b6c0..35dc54fe3 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/register/RegisterUserUseCase.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/register/RegisterUserUseCase.java @@ -1,7 +1,5 @@ package io.reflectoring.coderadar.useradministration.port.driver.register; -import io.reflectoring.coderadar.useradministration.UsernameAlreadyInUseException; - public interface RegisterUserUseCase { /** @@ -10,5 +8,5 @@ public interface RegisterUserUseCase { * @param command The user to register. * @return The DB id of the user. */ - Long register(RegisterUserCommand command) throws UsernameAlreadyInUseException; + Long register(RegisterUserCommand command); } diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/AddTeamToProjectUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/AddTeamToProjectUseCase.java new file mode 100644 index 000000000..793805cea --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/AddTeamToProjectUseCase.java @@ -0,0 +1,16 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams; + +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; + +public interface AddTeamToProjectUseCase { + + /** + * Creates a team in the given project. If the team is already assigned to the project, the + * existing role is overwritten. + * + * @param projectId The id of the project. + * @param teamId The id of the team. + * @param role The role to add the team with. + */ + void addTeamToProject(long projectId, long teamId, ProjectRole role); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/AddUsersToTeamUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/AddUsersToTeamUseCase.java new file mode 100644 index 000000000..0e50b3d09 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/AddUsersToTeamUseCase.java @@ -0,0 +1,14 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams; + +import java.util.List; + +public interface AddUsersToTeamUseCase { + + /** + * Adds users to a team. If a user is already in the team nothing is changed. + * + * @param teamId The id of the team. + * @param userIds The ids of the users. + */ + void addUsersToTeam(long teamId, List userIds); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/DeleteTeamUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/DeleteTeamUseCase.java new file mode 100644 index 000000000..de3e258cc --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/DeleteTeamUseCase.java @@ -0,0 +1,11 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams; + +public interface DeleteTeamUseCase { + + /** + * Deletes a team. + * + * @param teamId The id of the team. + */ + void deleteTeam(long teamId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/RemoveTeamFromProjectUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/RemoveTeamFromProjectUseCase.java new file mode 100644 index 000000000..4cec067bf --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/RemoveTeamFromProjectUseCase.java @@ -0,0 +1,13 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams; + +public interface RemoveTeamFromProjectUseCase { + + /** + * Removes a team from a project. Any permissions users had for a project because of the team will + * be lost after this operation. + * + * @param projectId The id of the project. + * @param teamId The id of the team. + */ + void removeTeam(long projectId, long teamId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/RemoveUsersFromTeamUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/RemoveUsersFromTeamUseCase.java new file mode 100644 index 000000000..638b347d7 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/RemoveUsersFromTeamUseCase.java @@ -0,0 +1,15 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams; + +import java.util.List; + +public interface RemoveUsersFromTeamUseCase { + + /** + * Removes users from a team. Any permissions users had for a project because of the team will be + * lost after this operation. + * + * @param teamId The id of the team. + * @param userIds The ids of the users. + */ + void removeUsersFromTeam(long teamId, List userIds); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/create/CreateTeamCommand.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/create/CreateTeamCommand.java new file mode 100644 index 000000000..8edff6bf2 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/create/CreateTeamCommand.java @@ -0,0 +1,14 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams.create; + +import java.util.List; +import javax.validation.constraints.NotBlank; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** DTO class for creating teams. */ +@Data +@NoArgsConstructor +public class CreateTeamCommand { + @NotBlank private String name; + private List userIds; +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/create/CreateTeamUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/create/CreateTeamUseCase.java new file mode 100644 index 000000000..7d3119437 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/create/CreateTeamUseCase.java @@ -0,0 +1,12 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams.create; + +public interface CreateTeamUseCase { + + /** + * Creates a new team. + * + * @param createTeamCommand The command containing the required data. + * @return The id of the new team. + */ + Long createTeam(CreateTeamCommand createTeamCommand); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/GetTeamUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/GetTeamUseCase.java new file mode 100644 index 000000000..8161b2115 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/GetTeamUseCase.java @@ -0,0 +1,12 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams.get; + +import io.reflectoring.coderadar.useradministration.domain.Team; + +public interface GetTeamUseCase { + + /** + * @param teamId The team id. + * @return The team with the given id. + */ + Team get(long teamId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListProjectsForTeamUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListProjectsForTeamUseCase.java new file mode 100644 index 000000000..b592245a6 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListProjectsForTeamUseCase.java @@ -0,0 +1,13 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams.get; + +import io.reflectoring.coderadar.projectadministration.domain.Project; +import java.util.List; + +public interface ListProjectsForTeamUseCase { + + /** + * @param teamId The id of the team. + * @return All projects the team has access to. + */ + List listProjects(long teamId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListTeamsForProjectUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListTeamsForProjectUseCase.java new file mode 100644 index 000000000..50bc267b6 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListTeamsForProjectUseCase.java @@ -0,0 +1,13 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams.get; + +import io.reflectoring.coderadar.useradministration.domain.Team; +import java.util.List; + +public interface ListTeamsForProjectUseCase { + + /** + * @param projectId The id of the project. + * @return All teams with access to this project. + */ + List listTeamsForProject(long projectId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListTeamsForUserUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListTeamsForUserUseCase.java new file mode 100644 index 000000000..93d0ad43a --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListTeamsForUserUseCase.java @@ -0,0 +1,13 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams.get; + +import io.reflectoring.coderadar.useradministration.domain.Team; +import java.util.List; + +public interface ListTeamsForUserUseCase { + + /** + * @param userId The id of the user. + * @return All teams the user is in. + */ + List listTeamsForUser(long userId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListTeamsUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListTeamsUseCase.java new file mode 100644 index 000000000..d5db61391 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListTeamsUseCase.java @@ -0,0 +1,10 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams.get; + +import io.reflectoring.coderadar.useradministration.domain.Team; +import java.util.List; + +public interface ListTeamsUseCase { + + /** @return All teams in the database. */ + List listTeams(); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListUsersForProjectUseCase.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListUsersForProjectUseCase.java new file mode 100644 index 000000000..a1e492bc4 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/port/driver/teams/get/ListUsersForProjectUseCase.java @@ -0,0 +1,13 @@ +package io.reflectoring.coderadar.useradministration.port.driver.teams.get; + +import io.reflectoring.coderadar.useradministration.domain.User; +import java.util.List; + +public interface ListUsersForProjectUseCase { + + /** + * @param projectId The project id. + * @return All users that have access to this project. + */ + List listUsers(long projectId); +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/UserUnauthenticatedException.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/UserUnauthenticatedException.java new file mode 100644 index 000000000..f9fc99d9f --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/UserUnauthenticatedException.java @@ -0,0 +1,3 @@ +package io.reflectoring.coderadar.useradministration.service; + +public class UserUnauthenticatedException extends RuntimeException {} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/UserUnauthorizedException.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/UserUnauthorizedException.java new file mode 100644 index 000000000..d2e3aa7de --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/UserUnauthorizedException.java @@ -0,0 +1,3 @@ +package io.reflectoring.coderadar.useradministration.service; + +public class UserUnauthorizedException extends RuntimeException {} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/load/GetUserService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/get/GetUserService.java similarity index 88% rename from coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/load/GetUserService.java rename to coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/get/GetUserService.java index cc5bd30ba..4b3f8f06a 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/load/GetUserService.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/get/GetUserService.java @@ -1,9 +1,9 @@ -package io.reflectoring.coderadar.useradministration.service.load; +package io.reflectoring.coderadar.useradministration.service.get; import io.reflectoring.coderadar.useradministration.UserNotFoundException; import io.reflectoring.coderadar.useradministration.domain.User; import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; -import io.reflectoring.coderadar.useradministration.port.driver.load.GetUserUseCase; +import io.reflectoring.coderadar.useradministration.port.driver.get.GetUserUseCase; import org.springframework.stereotype.Service; @Service diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/get/ListProjectsForUserService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/get/ListProjectsForUserService.java new file mode 100644 index 000000000..ece517eab --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/get/ListProjectsForUserService.java @@ -0,0 +1,31 @@ +package io.reflectoring.coderadar.useradministration.service.get; + +import io.reflectoring.coderadar.projectadministration.domain.Project; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; +import io.reflectoring.coderadar.useradministration.port.driven.ListProjectsForUserPort; +import io.reflectoring.coderadar.useradministration.port.driver.get.ListProjectsForUserUseCase; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListProjectsForUserService implements ListProjectsForUserUseCase { + + private final ListProjectsForUserPort listProjectsForUserPort; + private final GetUserPort getUserPort; + + public ListProjectsForUserService( + ListProjectsForUserPort listProjectsForUserPort, GetUserPort getUserPort) { + this.listProjectsForUserPort = listProjectsForUserPort; + this.getUserPort = getUserPort; + } + + @Override + public List listProjects(long userId) { + if (this.getUserPort.existsById(userId)) { + return listProjectsForUserPort.listProjects(userId); + } else { + throw new UserNotFoundException(userId); + } + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/get/ListUsersService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/get/ListUsersService.java new file mode 100644 index 000000000..850467661 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/get/ListUsersService.java @@ -0,0 +1,22 @@ +package io.reflectoring.coderadar.useradministration.service.get; + +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driven.ListUsersPort; +import io.reflectoring.coderadar.useradministration.port.driver.get.ListUsersUseCase; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListUsersService implements ListUsersUseCase { + + private final ListUsersPort listUsersPort; + + public ListUsersService(ListUsersPort listUsersPort) { + this.listUsersPort = listUsersPort; + } + + @Override + public List listUsers() { + return listUsersPort.listUsers(); + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/login/LoginUserService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/login/LoginUserService.java index cf9465852..694538ad2 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/login/LoginUserService.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/login/LoginUserService.java @@ -45,7 +45,7 @@ public LoginUserResponse login(LoginUserCommand command) { String accessToken = tokenService.generateAccessToken(user.getId(), user.getUsername()); String refreshToken = tokenService.generateRefreshToken(user.getId(), user.getUsername()); saveRefreshToken(user, refreshToken); - return new LoginUserResponse(accessToken, refreshToken); + return new LoginUserResponse(accessToken, refreshToken, user.getId()); } /** diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/permissions/RemoveUserFromProjectService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/permissions/RemoveUserFromProjectService.java new file mode 100644 index 000000000..f8573c825 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/permissions/RemoveUserFromProjectService.java @@ -0,0 +1,47 @@ +package io.reflectoring.coderadar.useradministration.service.permissions; + +import io.reflectoring.coderadar.projectadministration.ProjectNotFoundException; +import io.reflectoring.coderadar.projectadministration.port.driven.project.GetProjectPort; +import io.reflectoring.coderadar.useradministration.UserNotAssignedException; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; +import io.reflectoring.coderadar.useradministration.port.driven.ListUsersForProjectPort; +import io.reflectoring.coderadar.useradministration.port.driven.RemoveUserFromProjectPort; +import io.reflectoring.coderadar.useradministration.port.driver.permissions.RemoveUserFromProjectUseCase; +import org.springframework.stereotype.Service; + +@Service +public class RemoveUserFromProjectService implements RemoveUserFromProjectUseCase { + + private final GetProjectPort getProjectPort; + private final GetUserPort getUserPort; + private final RemoveUserFromProjectPort removeUserFromProjectPort; + private final ListUsersForProjectPort listUsersForProjectPort; + + public RemoveUserFromProjectService( + GetProjectPort getProjectPort, + GetUserPort getUserPort, + RemoveUserFromProjectPort removeUserFromProjectPort, + ListUsersForProjectPort listUsersForProjectPort) { + this.getProjectPort = getProjectPort; + this.getUserPort = getUserPort; + this.removeUserFromProjectPort = removeUserFromProjectPort; + this.listUsersForProjectPort = listUsersForProjectPort; + } + + @Override + public void removeUserFromProject(long projectId, long userId) { + if (!getProjectPort.existsById(projectId)) { + throw new ProjectNotFoundException(projectId); + } + if (!getUserPort.existsById(userId)) { + throw new UserNotFoundException(userId); + } + if (listUsersForProjectPort.listUsers(projectId).stream() + .anyMatch(user -> user.getId() == userId)) { + removeUserFromProjectPort.removeUserFromProject(projectId, userId); + } else { + throw new UserNotAssignedException(projectId, userId); + } + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/permissions/SetUserRoleForProjectService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/permissions/SetUserRoleForProjectService.java new file mode 100644 index 000000000..23a6b1b07 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/permissions/SetUserRoleForProjectService.java @@ -0,0 +1,38 @@ +package io.reflectoring.coderadar.useradministration.service.permissions; + +import io.reflectoring.coderadar.projectadministration.ProjectNotFoundException; +import io.reflectoring.coderadar.projectadministration.port.driven.project.GetProjectPort; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; +import io.reflectoring.coderadar.useradministration.port.driven.SetUserRoleForProjectPort; +import io.reflectoring.coderadar.useradministration.port.driver.permissions.SetUserRoleForProjectUseCase; +import org.springframework.stereotype.Service; + +@Service +public class SetUserRoleForProjectService implements SetUserRoleForProjectUseCase { + + private final GetProjectPort getProjectPort; + private final GetUserPort getUserPort; + private final SetUserRoleForProjectPort setUserRoleForProjectPort; + + public SetUserRoleForProjectService( + GetProjectPort getProjectPort, + GetUserPort getUserPort, + SetUserRoleForProjectPort setUserRoleForProjectPort) { + this.getProjectPort = getProjectPort; + this.getUserPort = getUserPort; + this.setUserRoleForProjectPort = setUserRoleForProjectPort; + } + + @Override + public void setRole(long projectId, long userId, ProjectRole role) { + if (!getProjectPort.existsById(projectId)) { + throw new ProjectNotFoundException(projectId); + } + if (!getUserPort.existsById(userId)) { + throw new UserNotFoundException(userId); + } + setUserRoleForProjectPort.setRole(projectId, userId, role); + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/security/AuthenticationService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/security/AuthenticationService.java new file mode 100644 index 000000000..5e306f42e --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/security/AuthenticationService.java @@ -0,0 +1,53 @@ +package io.reflectoring.coderadar.useradministration.service.security; + +import io.reflectoring.coderadar.CoderadarConfigurationProperties; +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; +import io.reflectoring.coderadar.useradministration.port.driven.GetUserRoleForProjectPort; +import io.reflectoring.coderadar.useradministration.service.UserUnauthenticatedException; +import io.reflectoring.coderadar.useradministration.service.UserUnauthorizedException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +@Service +public class AuthenticationService { + + private final GetUserRoleForProjectPort getUserRoleForProjectPort; + private final GetUserPort getUserPort; + private final CoderadarConfigurationProperties coderadarConfigurationProperties; + + public AuthenticationService( + GetUserRoleForProjectPort getUserRoleForProjectPort, + GetUserPort getUserPort, + CoderadarConfigurationProperties coderadarConfigurationProperties) { + this.getUserRoleForProjectPort = getUserRoleForProjectPort; + this.getUserPort = getUserPort; + this.coderadarConfigurationProperties = coderadarConfigurationProperties; + } + + public void authenticateMember(long projectId) { + if (coderadarConfigurationProperties.getAuthentication().isEnabled() + && getUserRole(projectId) == null) { + throw new UserUnauthorizedException(); + } + } + + public void authenticateAdmin(long projectId) { + if (coderadarConfigurationProperties.getAuthentication().isEnabled() + && getUserRole(projectId) != ProjectRole.ADMIN) { + throw new UserUnauthorizedException(); + } + } + + private ProjectRole getUserRole(long projectId) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && authentication.getPrincipal() instanceof String) { + return getUserRoleForProjectPort.getRole( + projectId, + getUserPort.getUserByUsername(((String) authentication.getPrincipal())).getId()); + } else { + throw new UserUnauthenticatedException(); + } + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/security/CoderadarSecurityConfiguration.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/security/CoderadarSecurityConfiguration.java index 7a01f2c3c..d01c479b5 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/security/CoderadarSecurityConfiguration.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/security/CoderadarSecurityConfiguration.java @@ -62,7 +62,7 @@ public PasswordEncoder getPasswordEncoder() { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); - if (coderadarConfiguration.getAuthentication().getEnabled()) { + if (coderadarConfiguration.getAuthentication().isEnabled()) { http.sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() @@ -74,6 +74,8 @@ protected void configure(HttpSecurity http) throws Exception { "/api/user/registration", "/api/user/refresh", "/login", + "/teams", + "/add-team", "/**/*.js", "/**/*.css", "/**/*.map", diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/AddTeamToProjectService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/AddTeamToProjectService.java new file mode 100644 index 000000000..b13ae4a8f --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/AddTeamToProjectService.java @@ -0,0 +1,38 @@ +package io.reflectoring.coderadar.useradministration.service.teams; + +import io.reflectoring.coderadar.projectadministration.ProjectNotFoundException; +import io.reflectoring.coderadar.projectadministration.port.driven.project.GetProjectPort; +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import io.reflectoring.coderadar.useradministration.port.driven.AddTeamToProjectPort; +import io.reflectoring.coderadar.useradministration.port.driven.GetTeamPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.AddTeamToProjectUseCase; +import org.springframework.stereotype.Service; + +@Service +public class AddTeamToProjectService implements AddTeamToProjectUseCase { + + private final GetProjectPort getProjectPort; + private final AddTeamToProjectPort addTeamToProjectPort; + private final GetTeamPort getTeamPort; + + public AddTeamToProjectService( + GetProjectPort getProjectPort, + AddTeamToProjectPort addTeamToProjectPort, + GetTeamPort getTeamPort) { + this.getProjectPort = getProjectPort; + this.addTeamToProjectPort = addTeamToProjectPort; + this.getTeamPort = getTeamPort; + } + + @Override + public void addTeamToProject(long projectId, long teamId, ProjectRole role) { + if (!getProjectPort.existsById(projectId)) { + throw new ProjectNotFoundException(projectId); + } + if (!getTeamPort.existsById(teamId)) { + throw new TeamNotFoundException(teamId); + } + addTeamToProjectPort.addTeamToProject(projectId, teamId, role); + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/AddUsersToTeamService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/AddUsersToTeamService.java new file mode 100644 index 000000000..8f3409924 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/AddUsersToTeamService.java @@ -0,0 +1,38 @@ +package io.reflectoring.coderadar.useradministration.service.teams; + +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driven.AddUsersToTeamPort; +import io.reflectoring.coderadar.useradministration.port.driven.GetTeamPort; +import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.AddUsersToTeamUseCase; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class AddUsersToTeamService implements AddUsersToTeamUseCase { + + private final GetTeamPort getTeamPort; + private final GetUserPort getUserPort; + private final AddUsersToTeamPort addUsersToTeamPort; + + public AddUsersToTeamService( + GetTeamPort getTeamPort, GetUserPort getUserPort, AddUsersToTeamPort addUsersToTeamPort) { + this.getTeamPort = getTeamPort; + this.getUserPort = getUserPort; + this.addUsersToTeamPort = addUsersToTeamPort; + } + + @Override + public void addUsersToTeam(long teamId, List userIds) { + if (!getTeamPort.existsById(teamId)) { + throw new TeamNotFoundException(teamId); + } + for (Long userId : userIds) { + if (!getUserPort.existsById(userId)) { + throw new UserNotFoundException(userId); + } + } + addUsersToTeamPort.addUsersToTeam(teamId, userIds); + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/DeleteTeamService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/DeleteTeamService.java new file mode 100644 index 000000000..cbb6c07c0 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/DeleteTeamService.java @@ -0,0 +1,28 @@ +package io.reflectoring.coderadar.useradministration.service.teams; + +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driven.DeleteTeamPort; +import io.reflectoring.coderadar.useradministration.port.driven.GetTeamPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.DeleteTeamUseCase; +import org.springframework.stereotype.Service; + +@Service +public class DeleteTeamService implements DeleteTeamUseCase { + + private final GetTeamPort getTeamPort; + private final DeleteTeamPort deleteTeamPort; + + public DeleteTeamService(GetTeamPort getTeamPort, DeleteTeamPort deleteTeamPort) { + this.getTeamPort = getTeamPort; + this.deleteTeamPort = deleteTeamPort; + } + + @Override + public void deleteTeam(long teamId) { + if (getTeamPort.existsById(teamId)) { + deleteTeamPort.deleteTeam(teamId); + } else { + throw new TeamNotFoundException(teamId); + } + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/RemoveTeamFromProjectService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/RemoveTeamFromProjectService.java new file mode 100644 index 000000000..12ef08ae0 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/RemoveTeamFromProjectService.java @@ -0,0 +1,47 @@ +package io.reflectoring.coderadar.useradministration.service.teams; + +import io.reflectoring.coderadar.projectadministration.ProjectNotFoundException; +import io.reflectoring.coderadar.projectadministration.port.driven.project.GetProjectPort; +import io.reflectoring.coderadar.useradministration.TeamNotAssignedException; +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driven.GetTeamPort; +import io.reflectoring.coderadar.useradministration.port.driven.ListTeamsForProjectPort; +import io.reflectoring.coderadar.useradministration.port.driven.RemoveTeamFromProjectPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.RemoveTeamFromProjectUseCase; +import org.springframework.stereotype.Service; + +@Service +public class RemoveTeamFromProjectService implements RemoveTeamFromProjectUseCase { + + private final GetTeamPort getTeamPort; + private final GetProjectPort getProjectPort; + private final RemoveTeamFromProjectPort removeTeamFromProjectPort; + private final ListTeamsForProjectPort listTeamsForProjectPort; + + public RemoveTeamFromProjectService( + GetTeamPort getTeamPort, + GetProjectPort getProjectPort, + RemoveTeamFromProjectPort removeTeamFromProjectPort, + ListTeamsForProjectPort listTeamsForProjectPort) { + this.getTeamPort = getTeamPort; + this.getProjectPort = getProjectPort; + this.removeTeamFromProjectPort = removeTeamFromProjectPort; + this.listTeamsForProjectPort = listTeamsForProjectPort; + } + + @Override + public void removeTeam(long projectId, long teamId) { + if (!getProjectPort.existsById(projectId)) { + throw new ProjectNotFoundException(projectId); + } + if (!getTeamPort.existsById(teamId)) { + throw new TeamNotFoundException(teamId); + } + if (listTeamsForProjectPort.listTeamsForProject(projectId).stream() + .anyMatch(team -> team.getId() == teamId)) { + removeTeamFromProjectPort.removeTeam(projectId, teamId); + } else { + throw new TeamNotAssignedException(projectId, teamId); + } + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/RemoveUsersFromTeamService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/RemoveUsersFromTeamService.java new file mode 100644 index 000000000..0eccc0354 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/RemoveUsersFromTeamService.java @@ -0,0 +1,44 @@ +package io.reflectoring.coderadar.useradministration.service.teams; + +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.UserNotInTeamException; +import io.reflectoring.coderadar.useradministration.port.driven.GetTeamPort; +import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; +import io.reflectoring.coderadar.useradministration.port.driven.RemoveUsersFromTeamPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.RemoveUsersFromTeamUseCase; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class RemoveUsersFromTeamService implements RemoveUsersFromTeamUseCase { + + private final GetTeamPort getTeamPort; + private final GetUserPort getUserPort; + private final RemoveUsersFromTeamPort removeUsersFromTeamPort; + + public RemoveUsersFromTeamService( + GetTeamPort getTeamPort, + GetUserPort getUserPort, + RemoveUsersFromTeamPort removeUsersFromTeamPort) { + this.getTeamPort = getTeamPort; + this.getUserPort = getUserPort; + this.removeUsersFromTeamPort = removeUsersFromTeamPort; + } + + @Override + public void removeUsersFromTeam(long teamId, List userIds) { + if (!getTeamPort.existsById(teamId)) { + throw new TeamNotFoundException(teamId); + } + for (Long userId : userIds) { + if (!getUserPort.existsById(userId)) { + throw new UserNotFoundException(userId); + } + if (getTeamPort.get(teamId).getMembers().stream().noneMatch(user -> user.getId() == userId)) { + throw new UserNotInTeamException(userId, teamId); + } + } + removeUsersFromTeamPort.removeUsersFromTeam(teamId, userIds); + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/create/CreateTeamService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/create/CreateTeamService.java new file mode 100644 index 000000000..a298121d9 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/create/CreateTeamService.java @@ -0,0 +1,40 @@ +package io.reflectoring.coderadar.useradministration.service.teams.create; + +import io.reflectoring.coderadar.useradministration.TeamAlreadyExistsException; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driven.CreateTeamPort; +import io.reflectoring.coderadar.useradministration.port.driven.GetTeamPort; +import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.create.CreateTeamCommand; +import io.reflectoring.coderadar.useradministration.port.driver.teams.create.CreateTeamUseCase; +import org.springframework.stereotype.Service; + +@Service +public class CreateTeamService implements CreateTeamUseCase { + private final CreateTeamPort createTeamPort; + private final GetTeamPort getTeamPort; + private final GetUserPort getUserPort; + + public CreateTeamService( + CreateTeamPort createTeamPort, GetTeamPort getTeamPort, GetUserPort getUserPort) { + this.createTeamPort = createTeamPort; + this.getTeamPort = getTeamPort; + this.getUserPort = getUserPort; + } + + @Override + public Long createTeam(CreateTeamCommand createTeamCommand) { + if (getTeamPort.existsByName(createTeamCommand.getName())) { + throw new TeamAlreadyExistsException(createTeamCommand.getName()); + } else { + if (createTeamCommand.getUserIds() != null) { + for (Long userId : createTeamCommand.getUserIds()) { + if (!getUserPort.existsById(userId)) { + throw new UserNotFoundException(userId); + } + } + } + return createTeamPort.createTeam(createTeamCommand); + } + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/GetTeamService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/GetTeamService.java new file mode 100644 index 000000000..641acf880 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/GetTeamService.java @@ -0,0 +1,26 @@ +package io.reflectoring.coderadar.useradministration.service.teams.get; + +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.port.driven.GetTeamPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.GetTeamUseCase; +import org.springframework.stereotype.Service; + +@Service +public class GetTeamService implements GetTeamUseCase { + + private final GetTeamPort getTeamPort; + + public GetTeamService(GetTeamPort getTeamPort) { + this.getTeamPort = getTeamPort; + } + + @Override + public Team get(long teamId) { + if (getTeamPort.existsById(teamId)) { + return getTeamPort.get(teamId); + } else { + throw new TeamNotFoundException(teamId); + } + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListProjectsForTeamService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListProjectsForTeamService.java new file mode 100644 index 000000000..b170b8cdd --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListProjectsForTeamService.java @@ -0,0 +1,31 @@ +package io.reflectoring.coderadar.useradministration.service.teams.get; + +import io.reflectoring.coderadar.projectadministration.domain.Project; +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driven.GetTeamPort; +import io.reflectoring.coderadar.useradministration.port.driven.ListProjectsForTeamPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListProjectsForTeamUseCase; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListProjectsForTeamService implements ListProjectsForTeamUseCase { + + private final GetTeamPort getTeamPort; + private final ListProjectsForTeamPort listProjectsForTeamPort; + + public ListProjectsForTeamService( + GetTeamPort getTeamPort, ListProjectsForTeamPort listProjectsForTeamPort) { + this.getTeamPort = getTeamPort; + this.listProjectsForTeamPort = listProjectsForTeamPort; + } + + @Override + public List listProjects(long teamId) { + if (getTeamPort.existsById(teamId)) { + return listProjectsForTeamPort.listProjects(teamId); + } else { + throw new TeamNotFoundException(teamId); + } + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListTeamsForProjectService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListTeamsForProjectService.java new file mode 100644 index 000000000..171b6d26e --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListTeamsForProjectService.java @@ -0,0 +1,31 @@ +package io.reflectoring.coderadar.useradministration.service.teams.get; + +import io.reflectoring.coderadar.projectadministration.ProjectNotFoundException; +import io.reflectoring.coderadar.projectadministration.port.driven.project.GetProjectPort; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.port.driven.ListTeamsForProjectPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListTeamsForProjectUseCase; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListTeamsForProjectService implements ListTeamsForProjectUseCase { + + private final ListTeamsForProjectPort listTeamsForProjectPort; + private final GetProjectPort getProjectPort; + + public ListTeamsForProjectService( + ListTeamsForProjectPort listTeamsForProjectPort, GetProjectPort getProjectPort) { + this.listTeamsForProjectPort = listTeamsForProjectPort; + this.getProjectPort = getProjectPort; + } + + @Override + public List listTeamsForProject(long projectId) { + if (getProjectPort.existsById(projectId)) { + return listTeamsForProjectPort.listTeamsForProject(projectId); + } else { + throw new ProjectNotFoundException(projectId); + } + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListTeamsForUserService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListTeamsForUserService.java new file mode 100644 index 000000000..c40a82ee2 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListTeamsForUserService.java @@ -0,0 +1,31 @@ +package io.reflectoring.coderadar.useradministration.service.teams.get; + +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; +import io.reflectoring.coderadar.useradministration.port.driven.ListTeamsForUserPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListTeamsForUserUseCase; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListTeamsForUserService implements ListTeamsForUserUseCase { + + private final GetUserPort getUserPort; + private final ListTeamsForUserPort listTeamsForUserPort; + + public ListTeamsForUserService( + GetUserPort getUserPort, ListTeamsForUserPort listTeamsForUserPort) { + this.getUserPort = getUserPort; + this.listTeamsForUserPort = listTeamsForUserPort; + } + + @Override + public List listTeamsForUser(long userId) { + if (getUserPort.existsById(userId)) { + return listTeamsForUserPort.listTeamsForUser(userId); + } else { + throw new UserNotFoundException(userId); + } + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListTeamsService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListTeamsService.java new file mode 100644 index 000000000..d954fe628 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListTeamsService.java @@ -0,0 +1,22 @@ +package io.reflectoring.coderadar.useradministration.service.teams.get; + +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.port.driven.ListTeamsPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListTeamsUseCase; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListTeamsService implements ListTeamsUseCase { + + private final ListTeamsPort listTeamsPort; + + public ListTeamsService(ListTeamsPort listTeamsPort) { + this.listTeamsPort = listTeamsPort; + } + + @Override + public List listTeams() { + return listTeamsPort.listTeams(); + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListUsersForProjectService.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListUsersForProjectService.java new file mode 100644 index 000000000..96a563e75 --- /dev/null +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/useradministration/service/teams/get/ListUsersForProjectService.java @@ -0,0 +1,31 @@ +package io.reflectoring.coderadar.useradministration.service.teams.get; + +import io.reflectoring.coderadar.projectadministration.ProjectNotFoundException; +import io.reflectoring.coderadar.projectadministration.port.driven.project.GetProjectPort; +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driven.ListUsersForProjectPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListUsersForProjectUseCase; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListUsersForProjectService implements ListUsersForProjectUseCase { + + private final GetProjectPort getProjectPort; + private final ListUsersForProjectPort listUsersForProjectPort; + + public ListUsersForProjectService( + GetProjectPort getProjectPort, ListUsersForProjectPort listUsersForProjectPort) { + this.getProjectPort = getProjectPort; + this.listUsersForProjectPort = listUsersForProjectPort; + } + + @Override + public List listUsers(long projectId) { + if (getProjectPort.existsById(projectId)) { + return listUsersForProjectPort.listUsers(projectId); + } else { + throw new ProjectNotFoundException(projectId); + } + } +} diff --git a/coderadar-core/src/main/java/io/reflectoring/coderadar/vcs/port/driven/GetRawCommitContentPort.java b/coderadar-core/src/main/java/io/reflectoring/coderadar/vcs/port/driven/GetRawCommitContentPort.java index 52fcc6ee0..08f9706b4 100644 --- a/coderadar-core/src/main/java/io/reflectoring/coderadar/vcs/port/driven/GetRawCommitContentPort.java +++ b/coderadar-core/src/main/java/io/reflectoring/coderadar/vcs/port/driven/GetRawCommitContentPort.java @@ -1,6 +1,5 @@ package io.reflectoring.coderadar.vcs.port.driven; -import io.reflectoring.coderadar.vcs.UnableToGetCommitContentException; import java.util.HashMap; import java.util.List; import org.springframework.data.util.Pair; @@ -15,8 +14,7 @@ public interface GetRawCommitContentPort { * @param commitHash The commitHash * @return The raw commit data. */ - byte[] getCommitContent(String projectRoot, String filepath, String commitHash) - throws UnableToGetCommitContentException; + byte[] getCommitContent(String projectRoot, String filepath, String commitHash); /** * @param projectRoot The local repository. @@ -24,10 +22,8 @@ byte[] getCommitContent(String projectRoot, String filepath, String commitHash) * @param commitHash The commit hash * @return The diff against the same file in the parent commit or an empty array if the file does * not exist - * @throws UnableToGetCommitContentException Thrown if the commit is not found. */ - byte[] getFileDiff(String projectRoot, String filepath, String commitHash) - throws UnableToGetCommitContentException; + byte[] getFileDiff(String projectRoot, String filepath, String commitHash); /** * Returns the raw content of a list of files in a commit. @@ -38,8 +34,7 @@ byte[] getFileDiff(String projectRoot, String filepath, String commitHash) * @return The raw commit data grouped by the filepath. */ HashMap getCommitContentBulk( - String projectRoot, List filepaths, String commitHash) - throws UnableToGetCommitContentException; + String projectRoot, List filepaths, String commitHash); /** * Returns the raw content of a list of files in a commit. @@ -53,8 +48,7 @@ HashMap getCommitContentBulk( getCommitContentBulkWithFiles( String projectRoot, List files, - String commitHash) - throws UnableToGetCommitContentException; + String commitHash); /** * @param parentHash The first commit hash. diff --git a/coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/ChangePasswordServiceTest.java b/coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/ChangePasswordServiceTest.java similarity index 96% rename from coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/ChangePasswordServiceTest.java rename to coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/ChangePasswordServiceTest.java index e2b10bf48..3246e05af 100644 --- a/coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/ChangePasswordServiceTest.java +++ b/coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/ChangePasswordServiceTest.java @@ -1,4 +1,4 @@ -package io.reflectoring.coderadar.projectadministration.user; +package io.reflectoring.coderadar.useradministration; import static org.mockito.Mockito.*; diff --git a/coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/GetUserServiceTest.java b/coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/GetUserServiceTest.java similarity index 88% rename from coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/GetUserServiceTest.java rename to coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/GetUserServiceTest.java index b30aa631c..5276480a5 100644 --- a/coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/GetUserServiceTest.java +++ b/coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/GetUserServiceTest.java @@ -1,11 +1,11 @@ -package io.reflectoring.coderadar.projectadministration.user; +package io.reflectoring.coderadar.useradministration; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; import io.reflectoring.coderadar.useradministration.domain.User; import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; -import io.reflectoring.coderadar.useradministration.service.load.GetUserService; +import io.reflectoring.coderadar.useradministration.service.get.GetUserService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/LoginUserServiceTest.java b/coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/LoginUserServiceTest.java similarity index 97% rename from coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/LoginUserServiceTest.java rename to coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/LoginUserServiceTest.java index 31211828a..ad1b38a81 100644 --- a/coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/LoginUserServiceTest.java +++ b/coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/LoginUserServiceTest.java @@ -1,4 +1,4 @@ -package io.reflectoring.coderadar.projectadministration.user; +package io.reflectoring.coderadar.useradministration; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; @@ -53,7 +53,7 @@ void loginUserWithUsernameAndPassword() { UsernamePasswordAuthenticationToken expectedToken = new UsernamePasswordAuthenticationToken(username, password); LoginUserResponse expectedResponse = - new LoginUserResponse(expectedAccessToken, expectedRefreshToken); + new LoginUserResponse(expectedAccessToken, expectedRefreshToken, userId); RefreshToken expectedRefreshTokenEntity = new RefreshToken().setToken(expectedRefreshToken); LoginUserCommand command = new LoginUserCommand(username, password); diff --git a/coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/RefreshTokenServiceTest.java b/coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/RefreshTokenServiceTest.java similarity index 96% rename from coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/RefreshTokenServiceTest.java rename to coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/RefreshTokenServiceTest.java index 0d9e11ef1..908ffa504 100644 --- a/coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/RefreshTokenServiceTest.java +++ b/coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/RefreshTokenServiceTest.java @@ -1,13 +1,10 @@ -package io.reflectoring.coderadar.projectadministration.user; +package io.reflectoring.coderadar.useradministration; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import io.reflectoring.coderadar.useradministration.AccessTokenNotExpiredException; -import io.reflectoring.coderadar.useradministration.RefreshTokenNotFoundException; -import io.reflectoring.coderadar.useradministration.UserNotFoundException; import io.reflectoring.coderadar.useradministration.domain.RefreshToken; import io.reflectoring.coderadar.useradministration.domain.User; import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; diff --git a/coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/RegisterUserServiceTest.java b/coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/RegisterUserServiceTest.java similarity index 94% rename from coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/RegisterUserServiceTest.java rename to coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/RegisterUserServiceTest.java index ce5129b1b..bc2940c59 100644 --- a/coderadar-core/src/test/java/io/reflectoring/coderadar/projectadministration/user/RegisterUserServiceTest.java +++ b/coderadar-core/src/test/java/io/reflectoring/coderadar/useradministration/RegisterUserServiceTest.java @@ -1,4 +1,4 @@ -package io.reflectoring.coderadar.projectadministration.user; +package io.reflectoring.coderadar.useradministration; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -6,7 +6,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import io.reflectoring.coderadar.useradministration.UsernameAlreadyInUseException; import io.reflectoring.coderadar.useradministration.domain.User; import io.reflectoring.coderadar.useradministration.port.driven.GetUserPort; import io.reflectoring.coderadar.useradministration.port.driven.RegisterUserPort; diff --git a/coderadar-dependency-map/build.gradle b/coderadar-dependency-map/build.gradle index c2045fe18..143ea6817 100644 --- a/coderadar-dependency-map/build.gradle +++ b/coderadar-dependency-map/build.gradle @@ -1,4 +1,5 @@ apply plugin: "com.diffplug.gradle.spotless" +apply plugin: "jacoco" spotless { java { diff --git a/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/adapter/DependencyCompareTreeAdapter.java b/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/adapter/DependencyCompareTreeAdapter.java index 6516c7505..9b5638e27 100644 --- a/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/adapter/DependencyCompareTreeAdapter.java +++ b/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/adapter/DependencyCompareTreeAdapter.java @@ -30,7 +30,6 @@ public class DependencyCompareTreeAdapter implements GetCompareTreePort { private String commitName2; private HashMap commit1Contents; private HashMap commit2Contents; - private CompareNodeComparator nodeComparator; private final JavaAnalyzer javaAnalyzer; private final WalkCommitTreePort walkCommitTreePort; @@ -47,7 +46,6 @@ public DependencyCompareTreeAdapter( this.walkCommitTreePort = walkCommitTreePort; this.getDiffEntriesForCommitsPort = getDiffEntriesForCommitsPort; this.rawCommitContentPort = rawCommitContentPort; - nodeComparator = new CompareNodeComparator(); } private void createTree() { @@ -103,33 +101,31 @@ public CompareNode getRoot( // traverse to compare nodes and to set their level this.root.traversePost( node -> { - if (node.hasChildren()) { - node.getChildren().sort(new CompareNodeComparator()); - int level = 0; - CompareNode childI; - CompareNode childJ; - for (int i = 0; i < node.getChildren().size(); i++) { - childI = node.getChildren().get(i); - // for every child in the current layer check - for (int j = 0; j < node.getChildren().size(); j++) { - childJ = node.getChildren().get(j); - if (i == j) continue; - // if any child before this has a dependency on this - // or any child before has more dependencies on this than this has on any child - // before - // raise layer, break - if (childJ.hasDependencyOn(childI) && !childI.hasDependencyOn(childJ)) { - level = (level < childJ.getLevel() ? childJ.getLevel() + 1 : level + 1); - } else if (childJ.countDependenciesOn(childI) - > childI.countDependenciesOn(childJ)) { - level = (level < childJ.getLevel() ? childJ.getLevel() + 1 : level + 1); - } + if (!node.hasChildren()) { + return; + } + node.getChildren().sort(new CompareNodeComparator()); + int level = 0; + CompareNode childI; + CompareNode childJ; + for (int i = 0; i < node.getChildren().size(); i++) { + childI = node.getChildren().get(i); + // for every child in the current layer check + for (int j = 0; j < node.getChildren().size(); j++) { + childJ = node.getChildren().get(j); + // if any child before this has a dependency on this + // or any child before has more dependencies on this than this has on any child + // before + // raise layer, break + if (i != j && (childJ.hasDependencyOn(childI) && !childI.hasDependencyOn(childJ)) + || childJ.countDependenciesOn(childI) > childI.countDependenciesOn(childJ)) { + level = (level < childJ.getLevel() ? childJ.getLevel() + 1 : level + 1); } - childI.setLevel(level); - level = 0; } - node.getChildren().sort(Comparator.comparingInt(CompareNode::getLevel)); + childI.setLevel(level); + level = 0; } + node.getChildren().sort(Comparator.comparingInt(CompareNode::getLevel)); }); return root; } catch (UnableToGetDiffsFromCommitsException e) { @@ -217,7 +213,7 @@ private void setPackage(CompareNode node) { String childPackage = node.getChildren().get(0).getPackageName(); node.setPackageName( childPackage.contains(".") - ? childPackage.substring(0, childPackage.lastIndexOf(".")) + ? childPackage.substring(0, childPackage.lastIndexOf('.')) : ""); } } diff --git a/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/adapter/DependencyTreeAdapter.java b/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/adapter/DependencyTreeAdapter.java index 24f23e2ea..cb9836a2f 100644 --- a/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/adapter/DependencyTreeAdapter.java +++ b/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/adapter/DependencyTreeAdapter.java @@ -88,15 +88,12 @@ public Node getRoot(String projectRoot, String commitName, String repoName) { // for every child in the current layer check for (int j = 0; j < node.getChildren().size(); j++) { childJ = node.getChildren().get(j); - if (i == j) continue; // if any child before this has a dependency on this // or any child before has more dependencies on this than this has on any child // before // raise layer, break - if (childJ.hasDependencyOn(childI) && !childI.hasDependencyOn(childJ)) { - level = (level < childJ.getLevel() ? childJ.getLevel() + 1 : level + 1); - } else if (childJ.countDependenciesOn(childI) - > childI.countDependenciesOn(childJ)) { + if (i != j && (childJ.hasDependencyOn(childI) && !childI.hasDependencyOn(childJ)) + || childJ.countDependenciesOn(childI) > childI.countDependenciesOn(childJ)) { level = (level < childJ.getLevel() ? childJ.getLevel() + 1 : level + 1); } } diff --git a/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/analyzers/JavaAnalyzer.java b/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/analyzers/JavaAnalyzer.java index dc825d2d3..dadc139b0 100644 --- a/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/analyzers/JavaAnalyzer.java +++ b/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/analyzers/JavaAnalyzer.java @@ -12,26 +12,25 @@ @Service public class JavaAnalyzer { - private RegexPatternCache cache; - private Pattern importPattern; - private Pattern fullyClassifiedPattern; - private Pattern skipPattern; - private Map separators; - public int count = 0; + private final RegexPatternCache cache; + private final Pattern importPattern; + private final Pattern fullyClassifiedPattern; + private final Pattern skipPattern; + private final Map separators; - private final String FILTER_PATTERN = "(\\/\\*(.|[\\r\\n])+?\\*\\/)|(\\/\\/.*[\\r\\n])"; - private final String IMPORT_PATTERN = " (([a-z_$][\\w$]*)\\.)+(([a-zA-Z_$][\\w$]*)|\\*);"; + private static final String FILTER_PATTERN = "(\\/\\*(.|[\\r\\n])+?\\*\\/)|(\\/\\/.*[\\r\\n])"; + private static final String IMPORT_PATTERN = " (([a-z_$][\\w$]*)\\.)+(([a-zA-Z_$][\\w$]*)|\\*);"; // " ([A-Za-z_$][\\w$]*\\.)*[A-Za-z_$][\\w$]*" - private final String FULLYCLASSIFIED_PATTERN = "([a-zA-Z_$][\\w$]*\\.)*[a-zA-Z_$][\\w$]*"; - private final String NAME_PATTERN = " (([A-Za-z_$][\\w$]*)\\.)*([A-Za-z_$][\\w$]*)"; - private final String SKIP_PATTERN = "[\\w$]+"; - private final String PACKAGE_PATTERN = + private static final String FULLYCLASSIFIED_PATTERN = "([a-zA-Z_$][\\w$]*\\.)*[a-zA-Z_$][\\w$]*"; + private static final String NAME_PATTERN = " (([A-Za-z_$][\\w$]*)\\.)*([A-Za-z_$][\\w$]*)"; + private static final String SKIP_PATTERN = "[\\w$]+"; + private static final String PACKAGE_PATTERN = "^(\\s*)package(\\s*)(([A-Za-z_$][\\w$]*)\\.)*([A-Za-z_$][\\w$]*);"; - private final String SINGLE_LINE_COMMENT = "^\\s*//.*$"; - private final String PACKAGE_DECLARATION = "^\\s*package.*$"; - private final String MULTILINE_COMMENT_START = "^\\s*/\\*.*$"; - private final String MULTILINE_COMMENT = "^\\s*\\*.*$"; - private final String IN_STRING = "^.*\".*$"; + private static final String SINGLE_LINE_COMMENT = "^\\s*//.*$"; + private static final String PACKAGE_DECLARATION = "^\\s*package.*$"; + private static final String MULTILINE_COMMENT_START = "^\\s*/\\*.*$"; + private static final String MULTILINE_COMMENT = "^\\s*\\*.*$"; + private static final String IN_STRING = "^.*\".*$"; @Autowired public JavaAnalyzer() { @@ -39,33 +38,31 @@ public JavaAnalyzer() { importPattern = cache.getPattern(IMPORT_PATTERN); fullyClassifiedPattern = cache.getPattern(FULLYCLASSIFIED_PATTERN); skipPattern = cache.getPattern(SKIP_PATTERN); - separators = new LinkedHashMap(); - { - // this list is ordered by the estimated order of the separators in a line to minimize - // skipPattern checks - separators.put("private ", false); - separators.put("public ", false); - separators.put("protected ", false); - separators.put("(", false); - separators.put(")", false); - separators.put("{", false); - separators.put("=", false); - separators.put(",", false); - separators.put("<", false); - separators.put(">", false); - separators.put("||", false); - separators.put("&&", false); - separators.put("?", false); - separators.put(":", false); - separators.put("new ", false); - separators.put("extends ", false); - separators.put("implements ", false); - separators.put("throws ", false); - separators.put("|", false); - separators.put("instanceof ", false); - separators.put("@[a-zA-Z_$][\\w$]*", true); - separators.put(";", false); - } + separators = new LinkedHashMap<>(); + // this list is ordered by the estimated order of the separators in a line to minimize + // skipPattern checks + separators.put("private ", false); + separators.put("public ", false); + separators.put("protected ", false); + separators.put("(", false); + separators.put(")", false); + separators.put("{", false); + separators.put("=", false); + separators.put(",", false); + separators.put("<", false); + separators.put(">", false); + separators.put("||", false); + separators.put("&&", false); + separators.put("?", false); + separators.put(":", false); + separators.put("new ", false); + separators.put("extends ", false); + separators.put("implements ", false); + separators.put("throws ", false); + separators.put("|", false); + separators.put("instanceof ", false); + separators.put("@[a-zA-Z_$][\\w$]*", true); + separators.put(";", false); } public String getPackageName(byte[] byteFileContent) { @@ -126,7 +123,7 @@ private String clearFileContent(final String fileContent) { */ public List getDependenciesFromImportLine(String line) { // possibilities for there to be more than one dependency in one line - // import org.somepackage.A a; import org.somepackage.B; + // import org.somepackage.A a; import org.somepackage.B; List foundDependencies = new ArrayList<>(); String lineString = line; while (lineString.contains(";")) { @@ -138,7 +135,7 @@ public List getDependenciesFromImportLine(String line) { foundDependencies.add(importString); } } - lineString = lineString.substring(lineString.indexOf(";") + 1); + lineString = lineString.substring(lineString.indexOf(';') + 1); } return foundDependencies; } @@ -160,10 +157,9 @@ public List getDependenciesFromLine(String line) { while (separator != null) { Matcher fullyClassifiedMatcher = fullyClassifiedPattern.matcher(lineString); if (fullyClassifiedMatcher.find() - && !JavaUtils.isJavaKeyword(fullyClassifiedMatcher.group())) { - if (!foundDependencies.contains(fullyClassifiedMatcher.group())) { - foundDependencies.add(fullyClassifiedMatcher.group()); - } + && !JavaUtils.isJavaKeyword(fullyClassifiedMatcher.group()) + && !foundDependencies.contains(fullyClassifiedMatcher.group())) { + foundDependencies.add(fullyClassifiedMatcher.group()); } // split lineString at first found position of found separator lineString = lineString.substring(lineString.indexOf(separator) + separator.length()); @@ -187,7 +183,7 @@ public String getFirstSeparator(String toCheck) { int index = toCheck.length(); String separator = null; for (Map.Entry entry : separators.entrySet()) { - if (toCheck.contains("@") && entry.getValue()) { + if (toCheck.contains("@") && Boolean.TRUE.equals(entry.getValue())) { // entry is a regex Matcher matcher = cache.getPattern(entry.getKey()).matcher(toCheck); if (matcher.find()) { @@ -197,14 +193,12 @@ public String getFirstSeparator(String toCheck) { index = toCheck.indexOf(separator); } } - } else { + } else if (toCheck.contains(entry.getKey()) + && toCheck.indexOf(entry.getKey()) < index + && checkTmpString(entry.getKey(), toCheck)) { // entry is not a regex - if (toCheck.contains(entry.getKey()) - && toCheck.indexOf(entry.getKey()) < index - && checkTmpString(entry.getKey(), toCheck)) { - separator = entry.getKey(); - index = toCheck.indexOf(separator); - } + separator = entry.getKey(); + index = toCheck.indexOf(separator); } } return separator; @@ -219,7 +213,6 @@ && checkTmpString(entry.getKey(), toCheck)) { * @return true if there is a potential import, else false. */ private boolean checkTmpString(String border, String string) { - count++; return skipPattern .matcher(string.substring(0, string.indexOf(border) + border.length())) .find(); diff --git a/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/util/NodeComparator.java b/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/util/NodeComparator.java index 43e114dfa..29ad03e96 100644 --- a/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/util/NodeComparator.java +++ b/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/util/NodeComparator.java @@ -26,9 +26,9 @@ public int compare(Node o1, Node o2) { return -1; } else if (!o1.hasChildren() && o2.hasChildren()) { return 1; - } else if (o1.getDependencies().size() > 0 && o2.getDependencies().size() == 0) { + } else if (!o1.getDependencies().isEmpty() && o2.getDependencies().isEmpty()) { return -1; - } else if (o2.getDependencies().size() > 0 && o1.getDependencies().size() == 0) { + } else if (!o2.getDependencies().isEmpty() && o1.getDependencies().isEmpty()) { return 1; } else { return o1.getFilename().compareTo(o2.getFilename()); diff --git a/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/util/RegexPatternCache.java b/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/util/RegexPatternCache.java index 29288f6a8..bd0c84eda 100644 --- a/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/util/RegexPatternCache.java +++ b/coderadar-dependency-map/src/main/java/io/reflectoring/coderadar/dependencymap/util/RegexPatternCache.java @@ -7,7 +7,7 @@ public class RegexPatternCache { - private Map patternMap; + private final Map patternMap; public RegexPatternCache() { patternMap = new HashMap<>(); @@ -37,7 +37,7 @@ private Pattern getOrCreate(RegexPattern regexPattern) { return newPattern; } - class RegexPattern { + static class RegexPattern { String regex; int flags; @@ -48,9 +48,12 @@ public RegexPattern(String regex, int flags) { } public boolean equals(Object obj) { - RegexPattern other = (RegexPattern) obj; - if (other.regex.equals(regex) && other.flags == flags) return true; - return false; + if (obj instanceof RegexPattern) { + RegexPattern other = (RegexPattern) obj; + return other.regex.equals(regex) && other.flags == flags; + } else { + return false; + } } public int hashCode() { diff --git a/coderadar-dependency-map/src/test/java/io/reflectoring/coderadar/dependencymap/CompareNodeTest.java b/coderadar-dependency-map/src/test/java/io/reflectoring/coderadar/dependencymap/CompareNodeTest.java index 8bd183ef8..273e75704 100644 --- a/coderadar-dependency-map/src/test/java/io/reflectoring/coderadar/dependencymap/CompareNodeTest.java +++ b/coderadar-dependency-map/src/test/java/io/reflectoring/coderadar/dependencymap/CompareNodeTest.java @@ -11,7 +11,7 @@ @TestInstance(TestInstance.Lifecycle.PER_CLASS) @ExtendWith(MockitoExtension.class) -public class CompareNodeTest { +class CompareNodeTest { private CompareNode testRoot; @@ -47,32 +47,32 @@ public void init() { } @Test - public void testGetNodeByPath() { + void testGetNodeByPath() { CompareNode test = testRoot.getNodeByPath("testNode1_2/testNode2_4"); Assertions.assertNotNull(test); Assertions.assertEquals("testNode2_4", test.getFilename()); } @Test - public void testGetNodeByPathEmptyString() { + void testGetNodeByPathEmptyString() { CompareNode empty = testRoot.getNodeByPath(""); Assertions.assertNull(empty); } @Test - public void testGetNodeByPathInvalidString() { + void testGetNodeByPathInvalidString() { CompareNode empty = testRoot.getNodeByPath("jhsbdlfjs"); Assertions.assertNull(empty); } @Test - public void testGetNodeByPathNull() { + void testGetNodeByPathNull() { CompareNode empty = testRoot.getNodeByPath(null); Assertions.assertNull(empty); } @Test - public void testCreateNodeByPath() { + void testCreateNodeByPath() { CompareNode testRoot = new CompareNode("testRoot", "", "", ChangeType.UNCHANGED); testRoot.createNodeByPath("testNode1_5/testNode2_5/testNode3_1", ChangeType.UNCHANGED); @@ -86,19 +86,19 @@ public void testCreateNodeByPath() { } @Test - public void testCreateNodeByPathEmptyString() { + void testCreateNodeByPathEmptyString() { CompareNode empty = testRoot.createNodeByPath("", ChangeType.UNCHANGED); Assertions.assertNull(empty); } @Test - public void testCreateNodeByPathNull() { + void testCreateNodeByPathNull() { CompareNode empty = testRoot.createNodeByPath(null, ChangeType.UNCHANGED); Assertions.assertNull(empty); } @Test - public void testTraversePre() { + void testTraversePre() { Assertions.assertNotNull(testRoot); StringBuilder traversed = new StringBuilder(); testRoot.traversePre(node -> traversed.append(node.getFilename()).append("\n")); @@ -117,7 +117,7 @@ public void testTraversePre() { } @Test - public void testTraversePost() { + void testTraversePost() { Assertions.assertNotNull(testRoot); StringBuilder traversed = new StringBuilder(); testRoot.traversePost(node -> traversed.append(node.getFilename()).append("\n")); @@ -136,7 +136,7 @@ public void testTraversePost() { } @Test - public void testGetParent() { + void testGetParent() { Assertions.assertNotNull(testRoot); CompareNode testNode2_1 = testRoot.getNodeByPath("testNode1_1/testNode2_1"); System.out.println(testNode2_1.getPath()); @@ -145,14 +145,14 @@ public void testGetParent() { } @Test - public void testGetParentRootChild() { + void testGetParentRootChild() { Assertions.assertNotNull(testRoot); Assertions.assertEquals( "testRoot", testRoot.getNodeByPath("testNode1_1").getParent(testRoot).getFilename()); } @Test - public void testGetParentRoot() { + void testGetParentRoot() { Assertions.assertNotNull(testRoot); Assertions.assertNull(testRoot.getParent(testRoot)); } diff --git a/coderadar-dependency-map/src/test/java/io/reflectoring/coderadar/dependencymap/JavaAnalyzerTest.java b/coderadar-dependency-map/src/test/java/io/reflectoring/coderadar/dependencymap/JavaAnalyzerTest.java index 0287b6a66..9b6e73a17 100644 --- a/coderadar-dependency-map/src/test/java/io/reflectoring/coderadar/dependencymap/JavaAnalyzerTest.java +++ b/coderadar-dependency-map/src/test/java/io/reflectoring/coderadar/dependencymap/JavaAnalyzerTest.java @@ -9,9 +9,9 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -public class JavaAnalyzerTest { +class JavaAnalyzerTest { - private String fileContent = + private final String fileContent = "package org.wickedsource.dependencytree.example;\n" + "\n" + "//These imports shouldn't matter to the DependencyTree\n" @@ -96,7 +96,7 @@ public void setUp() { *

missing: RandomClass3, Annotation2, Annotation3 */ @Test - public void testGetValidImports() { + void testGetValidImports() { List imports = analyzer.getValidImports(fileContent); Assertions.assertEquals(50, imports.size()); Assertions.assertEquals("java.util.Objects", imports.get(0)); @@ -156,7 +156,7 @@ public void testGetValidImports() { } @Test - public void testGetFirstSeparator() { + void testGetFirstSeparator() { String test = "= ((ClassQ.isEmpty() && classR.isEmpty())"; // should return first '(' after ClassQ.isEmpty, because there is no potential import between // begin and all separators before that '(' @@ -164,7 +164,7 @@ public void testGetFirstSeparator() { } @Test - public void testDependencyStrings() { + void testDependencyStrings() { String line = "import org.wickedsource.dependencytree.sbdfjksbdf; import org.wickedsource.dependencytree.fhzgkobd;"; // should return first '(' after ClassQ.isEmpty, because there is no potential import between @@ -176,7 +176,7 @@ public void testDependencyStrings() { } @Test - public void testImportDependencyStrings() { + void testImportDependencyStrings() { String line = "ClassP b = ((ClassQ.isEmpty() && classR.isEmpty()) || classS.isEmpty || ((classT.size > classU.size) && classV.size < classW.size)) ? ClassX.get : classY.get;"; // should return first '(' after ClassQ.isEmpty, because there is no potential import between diff --git a/coderadar-dependency-map/src/test/java/io/reflectoring/coderadar/dependencymap/NodeTest.java b/coderadar-dependency-map/src/test/java/io/reflectoring/coderadar/dependencymap/NodeTest.java index e89d4d8f7..963885574 100644 --- a/coderadar-dependency-map/src/test/java/io/reflectoring/coderadar/dependencymap/NodeTest.java +++ b/coderadar-dependency-map/src/test/java/io/reflectoring/coderadar/dependencymap/NodeTest.java @@ -10,7 +10,7 @@ @TestInstance(TestInstance.Lifecycle.PER_CLASS) @ExtendWith(MockitoExtension.class) -public class NodeTest { +class NodeTest { private Node testRoot; @@ -38,32 +38,32 @@ public void init() { } @Test - public void testGetNodeByPath() { + void testGetNodeByPath() { Node test = testRoot.getNodeByPath("testNode1_2/testNode2_4"); Assertions.assertNotNull(test); Assertions.assertEquals("testNode2_4", test.getFilename()); } @Test - public void testGetNodeByPathEmptyString() { + void testGetNodeByPathEmptyString() { Node empty = testRoot.getNodeByPath(""); Assertions.assertNull(empty); } @Test - public void testGetNodeByPathInvalidString() { + void testGetNodeByPathInvalidString() { Node empty = testRoot.getNodeByPath("jhsbdlfjs"); Assertions.assertNull(empty); } @Test - public void testGetNodeByPathNull() { + void testGetNodeByPathNull() { Node empty = testRoot.getNodeByPath(null); Assertions.assertNull(empty); } @Test - public void testCreateNodeByPath() { + void testCreateNodeByPath() { Node testRoot = new Node("testRoot", "", ""); testRoot.createNodeByPath("testNode1_5/testNode2_5/testNode3_1"); @@ -77,19 +77,19 @@ public void testCreateNodeByPath() { } @Test - public void testCreateNodeByPathEmptyString() { + void testCreateNodeByPathEmptyString() { Node empty = testRoot.createNodeByPath(""); Assertions.assertNull(empty); } @Test - public void testCreateNodeByPathNull() { + void testCreateNodeByPathNull() { Node empty = testRoot.createNodeByPath(null); Assertions.assertNull(empty); } @Test - public void testTraversePre() { + void testTraversePre() { Assertions.assertNotNull(testRoot); StringBuilder traversed = new StringBuilder(); testRoot.traversePre(node -> traversed.append(node.getFilename()).append("\n")); @@ -108,7 +108,7 @@ public void testTraversePre() { } @Test - public void testTraversePost() { + void testTraversePost() { Assertions.assertNotNull(testRoot); StringBuilder traversed = new StringBuilder(); testRoot.traversePost(node -> traversed.append(node.getFilename()).append("\n")); @@ -127,7 +127,7 @@ public void testTraversePost() { } @Test - public void testGetParent() { + void testGetParent() { Assertions.assertNotNull(testRoot); Node testNode2_1 = testRoot.getNodeByPath("testNode1_1/testNode2_1"); Assertions.assertNotNull(testNode2_1); @@ -136,14 +136,14 @@ public void testGetParent() { } @Test - public void testGetParentRootChild() { + void testGetParentRootChild() { Assertions.assertNotNull(testRoot); Assertions.assertEquals( "testRoot", testRoot.getNodeByPath("testNode1_1").getParent(testRoot).getFilename()); } @Test - public void testGetParentRoot() { + void testGetParentRoot() { Assertions.assertNotNull(testRoot); Assertions.assertNull(testRoot.getParent(testRoot)); } diff --git a/coderadar-graph/build.gradle b/coderadar-graph/build.gradle index 43c2388ba..cbbdb6448 100644 --- a/coderadar-graph/build.gradle +++ b/coderadar-graph/build.gradle @@ -1,4 +1,5 @@ apply plugin: "com.diffplug.gradle.spotless" +apply plugin: "jacoco" spotless { java { diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/analyzer/adapter/ResetAnalysisAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/analyzer/adapter/ResetAnalysisAdapter.java index 38d2bc269..2dba72d36 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/analyzer/adapter/ResetAnalysisAdapter.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/analyzer/adapter/ResetAnalysisAdapter.java @@ -22,7 +22,6 @@ public void resetAnalysis(long projectId) { /* * The empty while loops are necessary because only 10000 entities can be deleted at a time. - * @see ProjectRepository#deleteProjectFindings(Long) * @see ProjectRepository#deleteProjectMetrics(Long) */ while (projectRepository.deleteProjectMetrics(projectId) > 0) ; diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/contributor/adapter/GetContributorAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/contributor/adapter/GetContributorAdapter.java index 922d0ac4d..5093b0165 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/contributor/adapter/GetContributorAdapter.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/contributor/adapter/GetContributorAdapter.java @@ -6,7 +6,6 @@ import io.reflectoring.coderadar.graph.contributor.ContributorMapper; import io.reflectoring.coderadar.graph.contributor.domain.ContributorEntity; import io.reflectoring.coderadar.graph.contributor.repository.ContributorRepository; -import java.util.Optional; import org.springframework.stereotype.Service; @Service @@ -20,10 +19,8 @@ public GetContributorAdapter(ContributorRepository contributorRepository) { @Override public Contributor get(long id) { - Optional entity = contributorRepository.findById(id); - if (entity.isEmpty()) { - throw new ContributorNotFoundException(id); - } - return mapper.mapGraphObject(entity.get()); + ContributorEntity entity = + contributorRepository.findById(id).orElseThrow(() -> new ContributorNotFoundException(id)); + return mapper.mapGraphObject(entity); } } diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/repository/AnalyzerConfigurationRepository.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/repository/AnalyzerConfigurationRepository.java index 70ab5f893..55bc81859 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/repository/AnalyzerConfigurationRepository.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/repository/AnalyzerConfigurationRepository.java @@ -19,6 +19,6 @@ public interface AnalyzerConfigurationRepository @NonNull List findByProjectId(long projectId); - @Query("MATCH (a) WHERE ID(a) = {0} RETURN COUNT(a) > 0") + @Query("MATCH (a:AnalyzerConfigurationEntity) WHERE ID(a) = {0} RETURN COUNT(a) > 0") boolean existsById(long id); } diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/FilePatternMapper.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/FilePatternMapper.java index ad895ef21..c749e4460 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/FilePatternMapper.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/FilePatternMapper.java @@ -18,7 +18,6 @@ public FilePattern mapGraphObject(FilePatternEntity nodeEntity) { @Override public FilePatternEntity mapDomainObject(FilePattern domainObject) { FilePatternEntity filePatternEntity = new FilePatternEntity(); - filePatternEntity.setId(domainObject.getId()); filePatternEntity.setInclusionType(domainObject.getInclusionType()); filePatternEntity.setPattern(domainObject.getPattern()); return filePatternEntity; diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/repository/FilePatternRepository.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/repository/FilePatternRepository.java index d6d303390..471c1f277 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/repository/FilePatternRepository.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/repository/FilePatternRepository.java @@ -18,6 +18,6 @@ public interface FilePatternRepository extends Neo4jRepository findByProjectId(long projectId); - @Query("MATCH (f) WHERE ID(f) = {0} RETURN COUNT(f) > 0") + @Query("MATCH (f:FilePatternEntity) WHERE ID(f) = {0} RETURN COUNT(f) > 0") boolean existsById(long id); } diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/module/adapter/CreateModuleAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/module/adapter/CreateModuleAdapter.java index 0cab9f3cc..4aee2b730 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/module/adapter/CreateModuleAdapter.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/module/adapter/CreateModuleAdapter.java @@ -179,7 +179,7 @@ private List findChildModules(List modules, String p * @return The corrected path. */ private String checkPathIsValid(String path, ProjectEntity projectEntity) - throws ModulePathInvalidException, ModuleAlreadyExistsException { + throws ModulePathInvalidException { path = path.trim(); if (path.contains("//")) { @@ -194,8 +194,7 @@ private String checkPathIsValid(String path, ProjectEntity projectEntity) } // Check if a module with the same path already exists. - for (ModuleEntity entity : - moduleRepository.findModulesInProjectSortedDesc(projectEntity.getId())) { + for (ModuleEntity entity : projectEntity.getModules()) { if (entity.getPath().equals(path)) { throw new ModuleAlreadyExistsException(path); } diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/project/adapter/CommitAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/project/adapter/CommitAdapter.java index 1e9b6a0d2..608301454 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/project/adapter/CommitAdapter.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/project/adapter/CommitAdapter.java @@ -284,7 +284,6 @@ private void addCommits(long projectId, List commits, List updat // Get all of the existing commits and save them in a map Map walkedCommits = new HashMap<>(); IdentityHashMap walkedFiles = new IdentityHashMap<>(); - commitRepository.findByProjectId(projectId).forEach(c -> walkedCommits.put(c.getHash(), c)); // Remove any already existing commits from the new commits passed into this method diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/project/repository/ProjectRepository.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/project/repository/ProjectRepository.java index fcfb1577a..3d9c4ab63 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/project/repository/ProjectRepository.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/projectadministration/project/repository/ProjectRepository.java @@ -113,7 +113,7 @@ public interface ProjectRepository extends Neo4jRepository * @param id The project id. * @return True if a project with the given id exists, false otherwise. */ - @Query("MATCH (p) WHERE ID(p) = {0} RETURN COUNT(*) > 0") + @Query("MATCH (p:ProjectEntity) WHERE ID(p) = {0} RETURN COUNT(*) > 0") boolean existsById(long id); /** @@ -159,6 +159,26 @@ public interface ProjectRepository extends Neo4jRepository + "CREATE (p)-[r:CONTAINS_COMMIT]->(c)") void attachCommitsWithIds(long projectId, @NonNull List commitIds); + /** @param projectId The id of the project */ @Query("MATCH (p)<-[r:WORKS_ON]-() WHERE ID(p) = {0} DELETE r") void deleteContributorRelationships(long projectId); + + /** + * @param userId The user id. + * @return All projects a user is assigned to. + */ + @Query( + "MATCH (u:UserEntity) WHERE ID(u) = {0} WITH u " + + "OPTIONAL MATCH (u)-[:ASSIGNED_TO*0..1]->(p1:ProjectEntity) WHERE p1.isBeingDeleted = FALSE " + + "WITH p1, u " + + "MATCH (p2:ProjectEntity)<-[:ASSIGNED_TO*0..1]-(t)<-[:IS_IN*0..1]-(u) WHERE p2.isBeingDeleted = FALSE WITH collect(p1) + collect(p2) as list " + + "UNWIND list AS p RETURN DISTINCT p ORDER BY p.name") + List findProjectsByUserId(long userId); + + /** + * @param teamId The team id. + * @return All projects a team is assigned to. + */ + @Query("MATCH (t)-[:ASSIGNED_TO]->(p) WHERE ID(t) = {0} AND p.isBeingDeleted = FALSE RETURN p") + List listProjectsByTeamId(long teamId); } diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/GetCommitsInProjectAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/GetCommitsInProjectAdapter.java index 75a0278c8..51a008329 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/GetCommitsInProjectAdapter.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/GetCommitsInProjectAdapter.java @@ -3,9 +3,15 @@ import io.reflectoring.coderadar.graph.analyzer.repository.CommitRepository; import io.reflectoring.coderadar.graph.projectadministration.domain.CommitEntity; import io.reflectoring.coderadar.graph.projectadministration.project.adapter.CommitBaseDataMapper; -import io.reflectoring.coderadar.projectadministration.domain.*; +import io.reflectoring.coderadar.projectadministration.domain.Commit; +import io.reflectoring.coderadar.projectadministration.domain.File; +import io.reflectoring.coderadar.projectadministration.domain.FilePattern; +import io.reflectoring.coderadar.projectadministration.domain.FileToCommitRelationship; import io.reflectoring.coderadar.query.port.driven.GetCommitsInProjectPort; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.springframework.data.util.Pair; import org.springframework.stereotype.Service; @@ -66,13 +72,8 @@ private List mapCommitEntitiesNoParents(List> commit continue; } FileToCommitRelationship fileToCommitRelationship = new FileToCommitRelationship(); - File file = walkedFiles.get(fileId); - if (file == null) { - file = new File(); - file.setId(fileId); - file.setPath(filepath); - walkedFiles.put(fileId, file); - } + File file = + walkedFiles.computeIfAbsent(fileId, id -> new File().setId(id).setPath(filepath)); fileToCommitRelationship.setFile(file); commit.getTouchedFiles().add(fileToCommitRelationship); } diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/GetDeltaTreeForTwoCommitsAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/GetDeltaTreeForTwoCommitsAdapter.java index e0cd463c0..259de60d2 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/GetDeltaTreeForTwoCommitsAdapter.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/GetDeltaTreeForTwoCommitsAdapter.java @@ -12,6 +12,7 @@ import io.reflectoring.coderadar.vcs.port.driven.GetRawCommitContentPort; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import org.springframework.data.util.Pair; import org.springframework.stereotype.Service; @@ -102,35 +103,37 @@ private DeltaTree createDeltaTree(MetricTree commit1Tree, MetricTree commit2Tree deltaTree.setType(commit2Tree.getType()); deltaTree.setCommit1Metrics(commit1Tree.getMetrics()); deltaTree.setCommit2Metrics(commit2Tree.getMetrics()); + int tree1Counter = 0; int tree2Counter = 0; - while (tree1Counter < commit1Tree.getChildren().size() - || tree2Counter < commit2Tree.getChildren().size()) { + int commit1ChildrenSize = commit1Tree.getChildren().size(); + int commit2ChildrenSize = commit2Tree.getChildren().size(); + + while (tree1Counter < commit1ChildrenSize || tree2Counter < commit2ChildrenSize) { MetricTree metricTree2 = - tree2Counter < commit2Tree.getChildren().size() - ? commit2Tree.getChildren().get(tree2Counter) - : null; + tree2Counter < commit2ChildrenSize ? commit2Tree.getChildren().get(tree2Counter) : null; MetricTree metricTree1 = - tree1Counter < commit1Tree.getChildren().size() - ? commit1Tree.getChildren().get(tree1Counter) - : null; + tree1Counter < commit1ChildrenSize ? commit1Tree.getChildren().get(tree1Counter) : null; if (getChangeType(metricTree1, metricTree2).equals(ChangeType.MODIFY)) { - if (metricTree1.getType().equals(MetricTreeNodeType.MODULE) - && metricTree2.getType().equals(MetricTreeNodeType.MODULE)) { + if (Objects.requireNonNull(metricTree1).getType().equals(MetricTreeNodeType.MODULE) + && Objects.requireNonNull(metricTree2).getType().equals(MetricTreeNodeType.MODULE)) { deltaTree.getChildren().add(createDeltaTree(metricTree1, metricTree2)); } else { - deltaTree.getChildren().add(createFileNode(metricTree1, metricTree2)); + deltaTree + .getChildren() + .add(createFileNode(metricTree1, Objects.requireNonNull(metricTree2))); } - tree1Counter++; - tree2Counter++; + ++tree1Counter; + ++tree2Counter; } else if (getChangeType(metricTree1, metricTree2).equals(ChangeType.DELETE)) { - deltaTree.getChildren().add(createDeletedFileNode(metricTree1)); - tree1Counter++; + deltaTree.getChildren().add(createDeletedFileNode(Objects.requireNonNull(metricTree1))); + ++tree1Counter; } else { - if (metricTree2.getType().equals(MetricTreeNodeType.MODULE) && metricTree1 != null) { + if (Objects.requireNonNull(metricTree2).getType().equals(MetricTreeNodeType.MODULE) + && metricTree1 != null) { deltaTree.getChildren().add(createAddedFileNode(metricTree1)); tree1Counter++; } else { diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/GetFileTreeForCommitAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/GetFileTreeForCommitAdapter.java index 959633205..bd6bee1a7 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/GetFileTreeForCommitAdapter.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/GetFileTreeForCommitAdapter.java @@ -67,21 +67,18 @@ private void mergeSinglePaths(FileTree fileTree) { } private void addToTree(FileTree tree, List path) { - boolean found = false; if (tree.getChildren() == null) { tree.setChildren(new ArrayList<>()); } for (FileTree child : tree.getChildren()) { if (child.getPath().equals(path.get(0))) { - found = true; addToTree(child, path.subList(1, path.size())); + return; } } - if (!found) { - tree.getChildren().add(new FileTree(path.get(0), null)); - if (path.size() > 1) { - addToTree(tree, path); - } + tree.getChildren().add(new FileTree(path.get(0), null)); + if (path.size() > 1) { + addToTree(tree, path); } } } diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/PatternUtil.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/PatternUtil.java index b374c0a30..90e10155c 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/PatternUtil.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/adapter/PatternUtil.java @@ -19,11 +19,7 @@ private PatternUtil() {} private static final String SLASHY = "[\\\\/]"; private static final String NOT_SLASHY = "[^\\\\/]"; - public static Pattern toPattern(String line) { - return toPattern(line, 0); - } - - public static Pattern toPattern(String line, int flags) { + private static Pattern toPattern(String line) { line = line.trim(); int strLen = line.length(); StringBuilder sb = new StringBuilder(strLen << 2); @@ -85,7 +81,7 @@ public static Pattern toPattern(String line, int flags) { } previousChar = currentChar; } - return Pattern.compile(sb.toString(), flags); + return Pattern.compile(sb.toString(), 0); } /** diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/repository/MetricQueryRepository.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/repository/MetricQueryRepository.java index 810fc5e7b..4ebe785d4 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/repository/MetricQueryRepository.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/query/repository/MetricQueryRepository.java @@ -69,35 +69,6 @@ List> getMetricTreeForCommit( @NonNull List getAvailableMetricsInProject(long projectId); - /** - * Metrics for each file are collected as string in the following format: "metricName=value" The - * string is then split in the adapter. This greatly reduces HashMap usage. File paths are - * returned along with their corresponding git hashes in the following format: - * "filePath=ObjectHash". - * - *

NOTE: uses APOC. - * - * @param projectId The project id. - * @param commitHash The hash of the commit. - * @param metricNames The names of the metrics needed. - * @return Metrics for each file in the given commit. - */ - @Query( - "MATCH (p)-[:CONTAINS_COMMIT]->(c:CommitEntity) WHERE ID(p) = {0} AND c.hash = {1} WITH c LIMIT 1 " - + "CALL apoc.path.subgraphNodes(c, {relationshipFilter:'IS_CHILD_OF>'}) YIELD node WITH node as c ORDER BY c.timestamp DESC WITH collect(c) as commits " - + "CALL apoc.cypher.run('UNWIND commits as c OPTIONAL MATCH (f)<-[:RENAMED_FROM]-()-[:CHANGED_IN]->(c) RETURN collect(f) as renames', {commits: commits}) " - + "YIELD value WITH commits, value.renames as renames " - + "CALL apoc.cypher.run('UNWIND commits as c OPTIONAL MATCH (f)-[:CHANGED_IN {changeType: \"DELETE\"}]->(c) " - + "RETURN collect(f) as deletes', {commits: commits}) YIELD value WITH commits, renames, value.deletes as deletes " - + "UNWIND commits as c " - + "MATCH (f)-[:MEASURED_BY]->(m)-[:VALID_FOR]->(c) WHERE " - + "NOT(f IN deletes OR f IN renames) AND m.name IN {2} WITH f.path as path, head(collect(f.objectHash)) as hash, m.name as name, " - + "head(collect(m.value)) as value ORDER BY path, name WHERE value <> 0 " - + "RETURN path + \"=\" + head(collect(hash)) as path, collect(name + \"=\" + value) as metrics ORDER BY path") - @NonNull - List> getMetricTreeForCommitWithFileHashes( - long projectId, @NonNull String commitHash, @NonNull List metricNames); - /** * NOTE: This query is currently unused, but I believe it might be useful in the future. * @@ -161,7 +132,7 @@ List> getMetricsAndFindingsForCommitAndFilepath( */ @Query( "MATCH (p)-[:CONTAINS_COMMIT]->(c:CommitEntity) WHERE ID(p) = {0} AND c.hash = {1} WITH c LIMIT 1 " - + "MATCH (f)-[r:CHANGED_IN]->(c) WHERE r.changeType <> \"DELETE\" " + + "MATCH (f)-[r:CHANGED_IN]->(c) " + "RETURN DISTINCT f.path as path") List getFilesChangedInCommit(long projectId, @NonNull String commitHash); } diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/TeamMapper.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/TeamMapper.java new file mode 100644 index 000000000..13c2a8fa9 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/TeamMapper.java @@ -0,0 +1,27 @@ +package io.reflectoring.coderadar.graph.useradministration; + +import io.reflectoring.coderadar.graph.Mapper; +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.useradministration.domain.Team; + +public class TeamMapper implements Mapper { + + private final UserMapper userMapper = new UserMapper(); + + @Override + public Team mapGraphObject(TeamEntity nodeEntity) { + Team team = new Team(); + team.setName(nodeEntity.getName()); + team.setMembers(userMapper.mapNodeEntities(nodeEntity.getMembers())); + team.setId(nodeEntity.getId()); + return team; + } + + @Override + public TeamEntity mapDomainObject(Team domainObject) { + TeamEntity teamEntity = new TeamEntity(); + teamEntity.setName(domainObject.getName()); + teamEntity.setMembers(userMapper.mapDomainObjects(domainObject.getMembers())); + return teamEntity; + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/GetUserRoleForProjectAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/GetUserRoleForProjectAdapter.java new file mode 100644 index 000000000..3febe8d3b --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/GetUserRoleForProjectAdapter.java @@ -0,0 +1,32 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter; + +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import io.reflectoring.coderadar.useradministration.port.driven.GetUserRoleForProjectPort; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class GetUserRoleForProjectAdapter implements GetUserRoleForProjectPort { + + private final UserRepository userRepository; + + public GetUserRoleForProjectAdapter(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public ProjectRole getRole(long projectId, long userId) { + List rolesInTeams = userRepository.getUserRolesForProjectInTeams(projectId, userId); + String roleInProject = userRepository.getUserRoleForProject(projectId, userId); + if (roleInProject != null) { + rolesInTeams.add(roleInProject); + } + if (!rolesInTeams.isEmpty()) { + rolesInTeams.sort(String::compareTo); + return ProjectRole.valueOf(rolesInTeams.get(0).toUpperCase()); + } else { + return null; + } + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/ListProjectsForUserAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/ListProjectsForUserAdapter.java new file mode 100644 index 000000000..d43dd70f5 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/ListProjectsForUserAdapter.java @@ -0,0 +1,24 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter; + +import io.reflectoring.coderadar.graph.projectadministration.project.ProjectMapper; +import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; +import io.reflectoring.coderadar.projectadministration.domain.Project; +import io.reflectoring.coderadar.useradministration.port.driven.ListProjectsForUserPort; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListProjectsForUserAdapter implements ListProjectsForUserPort { + + private final ProjectRepository projectRepository; + private final ProjectMapper projectMapper = new ProjectMapper(); + + public ListProjectsForUserAdapter(ProjectRepository projectRepository) { + this.projectRepository = projectRepository; + } + + @Override + public List listProjects(long userId) { + return projectMapper.mapNodeEntities(projectRepository.findProjectsByUserId(userId)); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/ListUsersAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/ListUsersAdapter.java new file mode 100644 index 000000000..38792c5c7 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/ListUsersAdapter.java @@ -0,0 +1,28 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter; + +import io.reflectoring.coderadar.graph.useradministration.UserMapper; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driven.ListUsersPort; +import java.util.ArrayList; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListUsersAdapter implements ListUsersPort { + + private final UserRepository userRepository; + private final UserMapper userMapper = new UserMapper(); + + public ListUsersAdapter(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public List listUsers() { + List userEntities = new ArrayList<>(); + userRepository.findAll(0).iterator().forEachRemaining(userEntities::add); + return userMapper.mapNodeEntities(userEntities); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/permissions/RemoveUserFromProjectAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/permissions/RemoveUserFromProjectAdapter.java new file mode 100644 index 000000000..7b6ab2f85 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/permissions/RemoveUserFromProjectAdapter.java @@ -0,0 +1,20 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.permissions; + +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.useradministration.port.driven.RemoveUserFromProjectPort; +import org.springframework.stereotype.Service; + +@Service +public class RemoveUserFromProjectAdapter implements RemoveUserFromProjectPort { + + private final UserRepository userRepository; + + public RemoveUserFromProjectAdapter(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public void removeUserFromProject(long projectId, long userId) { + userRepository.removeUserRoleFromProject(projectId, userId); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/permissions/SetUserRoleForProjectAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/permissions/SetUserRoleForProjectAdapter.java new file mode 100644 index 000000000..d8a8138bb --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/permissions/SetUserRoleForProjectAdapter.java @@ -0,0 +1,21 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.permissions; + +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import io.reflectoring.coderadar.useradministration.port.driven.SetUserRoleForProjectPort; +import org.springframework.stereotype.Service; + +@Service +public class SetUserRoleForProjectAdapter implements SetUserRoleForProjectPort { + + private final UserRepository userRepository; + + public SetUserRoleForProjectAdapter(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public void setRole(long projectId, long userId, ProjectRole role) { + userRepository.setUserRoleForProject(projectId, userId, role.getValue()); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/AddTeamToProjectAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/AddTeamToProjectAdapter.java new file mode 100644 index 000000000..46e7ebb58 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/AddTeamToProjectAdapter.java @@ -0,0 +1,21 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.teams; + +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import io.reflectoring.coderadar.useradministration.port.driven.AddTeamToProjectPort; +import org.springframework.stereotype.Service; + +@Service +public class AddTeamToProjectAdapter implements AddTeamToProjectPort { + + private final TeamRepository teamRepository; + + public AddTeamToProjectAdapter(TeamRepository teamRepository) { + this.teamRepository = teamRepository; + } + + @Override + public void addTeamToProject(long projectId, long teamId, ProjectRole role) { + teamRepository.addTeamToProject(projectId, teamId, role.getValue()); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/AddUsersToTeamAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/AddUsersToTeamAdapter.java new file mode 100644 index 000000000..c4ca54ec9 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/AddUsersToTeamAdapter.java @@ -0,0 +1,21 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.teams; + +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.useradministration.port.driven.AddUsersToTeamPort; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class AddUsersToTeamAdapter implements AddUsersToTeamPort { + + private final TeamRepository teamRepository; + + public AddUsersToTeamAdapter(TeamRepository teamRepository) { + this.teamRepository = teamRepository; + } + + @Override + public void addUsersToTeam(long teamId, List userIds) { + teamRepository.addUsersToTeam(teamId, userIds); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/CreateTeamAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/CreateTeamAdapter.java new file mode 100644 index 000000000..4bdec5d05 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/CreateTeamAdapter.java @@ -0,0 +1,28 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.teams; + +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.useradministration.port.driven.CreateTeamPort; +import io.reflectoring.coderadar.useradministration.port.driver.teams.create.CreateTeamCommand; +import org.springframework.stereotype.Service; + +@Service +public class CreateTeamAdapter implements CreateTeamPort { + + private final TeamRepository teamRepository; + private final UserRepository userRepository; + + public CreateTeamAdapter(TeamRepository teamRepository, UserRepository userRepository) { + this.teamRepository = teamRepository; + this.userRepository = userRepository; + } + + @Override + public Long createTeam(CreateTeamCommand createTeamCommand) { + TeamEntity teamEntity = new TeamEntity(); + teamEntity.setMembers(userRepository.findAllByIds(createTeamCommand.getUserIds())); + teamEntity.setName(createTeamCommand.getName()); + return teamRepository.save(teamEntity, 1).getId(); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/DeleteTeamAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/DeleteTeamAdapter.java new file mode 100644 index 000000000..149d9d02c --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/DeleteTeamAdapter.java @@ -0,0 +1,20 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.teams; + +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.useradministration.port.driven.DeleteTeamPort; +import org.springframework.stereotype.Service; + +@Service +public class DeleteTeamAdapter implements DeleteTeamPort { + + private final TeamRepository teamRepository; + + public DeleteTeamAdapter(TeamRepository teamRepository) { + this.teamRepository = teamRepository; + } + + @Override + public void deleteTeam(long teamId) { + teamRepository.deleteById(teamId); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/GetTeamAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/GetTeamAdapter.java new file mode 100644 index 000000000..1de1e6ff3 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/GetTeamAdapter.java @@ -0,0 +1,33 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.teams; + +import io.reflectoring.coderadar.graph.useradministration.TeamMapper; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.port.driven.GetTeamPort; +import org.springframework.stereotype.Service; + +@Service +public class GetTeamAdapter implements GetTeamPort { + + private final TeamRepository teamRepository; + private final TeamMapper teamMapper = new TeamMapper(); + + public GetTeamAdapter(TeamRepository teamRepository) { + this.teamRepository = teamRepository; + } + + @Override + public Team get(long teamId) { + return teamMapper.mapGraphObject(teamRepository.findByIdWithMembers(teamId)); + } + + @Override + public boolean existsById(long teamId) { + return teamRepository.existsById(teamId); + } + + @Override + public boolean existsByName(String name) { + return teamRepository.existsByName(name); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListProjectsForTeamAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListProjectsForTeamAdapter.java new file mode 100644 index 000000000..023bb2cf2 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListProjectsForTeamAdapter.java @@ -0,0 +1,24 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.teams; + +import io.reflectoring.coderadar.graph.projectadministration.project.ProjectMapper; +import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; +import io.reflectoring.coderadar.projectadministration.domain.Project; +import io.reflectoring.coderadar.useradministration.port.driven.ListProjectsForTeamPort; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListProjectsForTeamAdapter implements ListProjectsForTeamPort { + + private final ProjectMapper projectMapper = new ProjectMapper(); + private final ProjectRepository projectRepository; + + public ListProjectsForTeamAdapter(ProjectRepository projectRepository) { + this.projectRepository = projectRepository; + } + + @Override + public List listProjects(long teamId) { + return projectMapper.mapNodeEntities(projectRepository.listProjectsByTeamId(teamId)); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListTeamsAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListTeamsAdapter.java new file mode 100644 index 000000000..0196834a9 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListTeamsAdapter.java @@ -0,0 +1,24 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.teams; + +import io.reflectoring.coderadar.graph.useradministration.TeamMapper; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.port.driven.ListTeamsPort; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListTeamsAdapter implements ListTeamsPort { + + private final TeamRepository teamRepository; + private final TeamMapper mapper = new TeamMapper(); + + public ListTeamsAdapter(TeamRepository teamRepository) { + this.teamRepository = teamRepository; + } + + @Override + public List listTeams() { + return mapper.mapNodeEntities(teamRepository.findAllWithMembers()); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListTeamsForProjectAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListTeamsForProjectAdapter.java new file mode 100644 index 000000000..5a3e8669f --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListTeamsForProjectAdapter.java @@ -0,0 +1,24 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.teams; + +import io.reflectoring.coderadar.graph.useradministration.TeamMapper; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.port.driven.ListTeamsForProjectPort; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListTeamsForProjectAdapter implements ListTeamsForProjectPort { + + private final TeamRepository teamRepository; + private final TeamMapper teamMapper = new TeamMapper(); + + public ListTeamsForProjectAdapter(TeamRepository teamRepository) { + this.teamRepository = teamRepository; + } + + @Override + public List listTeamsForProject(long projectId) { + return teamMapper.mapNodeEntities(teamRepository.listTeamsByProjectIdWithMembers(projectId)); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListTeamsForUserAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListTeamsForUserAdapter.java new file mode 100644 index 000000000..77bd1bc63 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListTeamsForUserAdapter.java @@ -0,0 +1,24 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.teams; + +import io.reflectoring.coderadar.graph.useradministration.TeamMapper; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.port.driven.ListTeamsForUserPort; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListTeamsForUserAdapter implements ListTeamsForUserPort { + + private final TeamRepository teamRepository; + private final TeamMapper teamMapper = new TeamMapper(); + + public ListTeamsForUserAdapter(TeamRepository teamRepository) { + this.teamRepository = teamRepository; + } + + @Override + public List listTeamsForUser(long userId) { + return teamMapper.mapNodeEntities(teamRepository.listTeamsByUserId(userId)); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListUsersForProjectAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListUsersForProjectAdapter.java new file mode 100644 index 000000000..e66721049 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/ListUsersForProjectAdapter.java @@ -0,0 +1,24 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.teams; + +import io.reflectoring.coderadar.graph.useradministration.UserMapper; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driven.ListUsersForProjectPort; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ListUsersForProjectAdapter implements ListUsersForProjectPort { + + private final UserRepository userRepository; + private final UserMapper userMapper = new UserMapper(); + + public ListUsersForProjectAdapter(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public List listUsers(long projectId) { + return userMapper.mapNodeEntities(userRepository.listUsersForProject(projectId)); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/RemoveTeamFromProjectAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/RemoveTeamFromProjectAdapter.java new file mode 100644 index 000000000..f74207f37 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/RemoveTeamFromProjectAdapter.java @@ -0,0 +1,20 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.teams; + +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.useradministration.port.driven.RemoveTeamFromProjectPort; +import org.springframework.stereotype.Service; + +@Service +public class RemoveTeamFromProjectAdapter implements RemoveTeamFromProjectPort { + + private final TeamRepository teamRepository; + + public RemoveTeamFromProjectAdapter(TeamRepository teamRepository) { + this.teamRepository = teamRepository; + } + + @Override + public void removeTeam(long projectId, long teamId) { + teamRepository.removeTeamFromProject(projectId, teamId); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/RemoveUsersFromTeamAdapter.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/RemoveUsersFromTeamAdapter.java new file mode 100644 index 000000000..ced9cf654 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/adapter/teams/RemoveUsersFromTeamAdapter.java @@ -0,0 +1,21 @@ +package io.reflectoring.coderadar.graph.useradministration.adapter.teams; + +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.useradministration.port.driven.RemoveUsersFromTeamPort; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class RemoveUsersFromTeamAdapter implements RemoveUsersFromTeamPort { + + private final TeamRepository teamRepository; + + public RemoveUsersFromTeamAdapter(TeamRepository teamRepository) { + this.teamRepository = teamRepository; + } + + @Override + public void removeUsersFromTeam(long teamId, List userIds) { + teamRepository.deleteUsersFromTeam(teamId, userIds); + } +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/domain/TeamEntity.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/domain/TeamEntity.java new file mode 100644 index 000000000..ea2320631 --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/domain/TeamEntity.java @@ -0,0 +1,23 @@ +package io.reflectoring.coderadar.graph.useradministration.domain; + +import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; +import java.util.Collections; +import java.util.List; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.neo4j.ogm.annotation.NodeEntity; +import org.neo4j.ogm.annotation.Relationship; + +@NodeEntity +@Data +@NoArgsConstructor +public class TeamEntity { + private Long id; + private String name; + + @Relationship(value = "IS_IN", direction = Relationship.INCOMING) + private List members = Collections.emptyList(); + + @Relationship(type = "ASSIGNED_TO") + private List projects; +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/domain/UserEntity.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/domain/UserEntity.java index fa8ebac09..daacc6736 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/domain/UserEntity.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/domain/UserEntity.java @@ -1,5 +1,6 @@ package io.reflectoring.coderadar.graph.useradministration.domain; +import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; import java.util.List; import lombok.Data; import org.neo4j.ogm.annotation.NodeEntity; @@ -15,4 +16,7 @@ public class UserEntity { @Relationship(value = "HAS") private List refreshTokens; + + @Relationship(type = "ASSIGNED_TO") + private List projects; } diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/repository/TeamRepository.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/repository/TeamRepository.java new file mode 100644 index 000000000..916ff447f --- /dev/null +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/repository/TeamRepository.java @@ -0,0 +1,79 @@ +package io.reflectoring.coderadar.graph.useradministration.repository; + +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import java.util.List; +import org.springframework.data.neo4j.annotation.Query; +import org.springframework.data.neo4j.repository.Neo4jRepository; + +public interface TeamRepository extends Neo4jRepository { + + /** + * @param userId The user id. + * @return All teams the user is in. + */ + @Query( + "MATCH (u)-[:IS_IN]->(t) WHERE ID(u) = {0} WITH t " + + "OPTIONAL MATCH (t)<-[r:IS_IN]-(u) RETURN t, r, u") + List listTeamsByUserId(long userId); + + /** + * Creates a [:HAS_TEAM] relationship between a project and a team. + * + * @param projectId The id of the project. + * @param teamId The id of the team. + * @param role The role of the team in the project. + */ + @Query( + "MATCH (p:ProjectEntity) WHERE ID(p) = {0} " + + "MATCH (t) WHERE ID(t) = {1} WITH p, t " + + "OPTIONAL MATCH (t)-[r:ASSIGNED_TO]->(p) DELETE r " + + "CREATE (t)-[r1:ASSIGNED_TO {role: {2}}]->(p)") + void addTeamToProject(long projectId, long teamId, String role); + + @Query( + "MATCH (t) WHERE ID(t) = {0} WITH t " + + "UNWIND {1} as x " + + "MATCH (u) WHERE ID(u) = x " + + "MERGE (u)-[r:IS_IN]->(t)") + void addUsersToTeam(long teamId, List userIds); + + @Query( + "MATCH (t) WHERE ID(t) = {0} WITH t " + + "UNWIND {1} as x " + + "MATCH (u)-[r:IS_IN]->(t) WHERE ID(u) = x " + + "DELETE r") + void deleteUsersFromTeam(long teamId, List userIds); + + /** + * @param teamId The team id. + * @return The team along with all of its members; + */ + @Query("MATCH (u)-[r:IS_IN*0..1]->(t) WHERE ID(t) = {0} RETURN t, r, u") + TeamEntity findByIdWithMembers(long teamId); + + @Query("MATCH (t) WHERE ID(t) = {0} RETURN COUNT(t) > 0") + boolean existsById(long teamId); + + @Query("MATCH (t:TeamEntity) WHERE t.name = {0} RETURN COUNT(t) > 0") + boolean existsByName(String name); + + /** + * @param projectId The project id. + * @return All teams assigned to the project along with their members. + */ + @Query("MATCH (p)<-[:ASSIGNED_TO]-(t)<-[r:IS_IN*0..1]-(u) WHERE ID(p) = {0} RETURN t, r, u") + List listTeamsByProjectIdWithMembers(long projectId); + + /** + * Deletes the [:ASSIGNED_TO] relationship between the team and the project. + * + * @param projectId The id of the project. + * @param teamId The id of the team. + */ + @Query("MATCH (p)<-[r:ASSIGNED_TO]-(t) WHERE ID(p) = {0} AND ID(t) = {1} DELETE r") + void removeTeamFromProject(long projectId, long teamId); + + /** @return All teams in the database along with their members. */ + @Query("MATCH (t:TeamEntity)<-[r:IS_IN*0..1]-(u) RETURN t, r, u") + List findAllWithMembers(); +} diff --git a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/repository/UserRepository.java b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/repository/UserRepository.java index 41287fea2..387a972bd 100644 --- a/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/repository/UserRepository.java +++ b/coderadar-graph/src/main/java/io/reflectoring/coderadar/graph/useradministration/repository/UserRepository.java @@ -1,6 +1,7 @@ package io.reflectoring.coderadar.graph.useradministration.repository; import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import java.util.List; import org.springframework.data.neo4j.annotation.Query; import org.springframework.data.neo4j.repository.Neo4jRepository; import org.springframework.lang.NonNull; @@ -34,6 +35,48 @@ public interface UserRepository extends Neo4jRepository { * @param id The user id. * @return True if a user with the given id exists. */ - @Query("MATCH (u) WHERE ID(u) = {0} RETURN COUNT(u) > 0") + @Query("MATCH (u:UserEntity) WHERE ID(u) = {0} RETURN COUNT(u) > 0") boolean existsById(long id); + + /** + * @param userIds The user ids. + * @return All users matching the given ids. + */ + @Query("MATCH (u) WHERE ID(u) IN {0} RETURN DISTINCT u") + List findAllByIds(List userIds); + + /** + * Sets the role of a user for a given project. If the user already has a role in the project, it + * is deleted and a new one is created in its place. + * + * @param projectId The of the project. + * @param userId The id of the user. + * @param role The role to set. + */ + @Query( + "MATCH (p), (u) WHERE ID(p) = {0} AND ID(u) = {1} WITH p, u " + + "OPTIONAL MATCH (p)<-[r:ASSIGNED_TO]-(u) DELETE r " + + "CREATE (p)<-[r1:ASSIGNED_TO {role: {2}}]-(u)") + void setUserRoleForProject(long projectId, long userId, String role); + + @Query("MATCH (p)<-[r:ASSIGNED_TO]-(u) WHERE ID(p) = {0} AND ID(u) = {1} RETURN r.role LIMIT 1") + String getUserRoleForProject(long projectId, long userId); + + @Query( + "MATCH (u)-[:IS_IN]->(t)-[r:ASSIGNED_TO]->(p) WHERE ID(p) = {0} AND ID(u) = {1} RETURN r.role") + List getUserRolesForProjectInTeams(long projectId, long userId); + + /** + * Deletes the [:ASSIGNED_TO] relationship between a user and a project. + * + * @param projectId The project id. + * @param userId The user id. + */ + @Query("MATCH (p)<-[r:ASSIGNED_TO]-(u:UserEntity) WHERE ID(p) = {0} AND ID(u) = {1} DELETE r") + void removeUserRoleFromProject(long projectId, long userId); + + @Query( + "OPTIONAL MATCH (p)<-[:ASSIGNED_TO]-(u:UserEntity) WHERE ID(p) = {0} WITH p, collect(u) as users " + + "OPTIONAL MATCH (p)<-[:ASSIGNED_TO]-(t:TeamEntity)<-[:IS_IN]-(u) RETURN collect(u) + users as users") + List listUsersForProject(long projectId); } diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/AnalyzerConfigurationMapperTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/AnalyzerConfigurationMapperTest.java new file mode 100644 index 000000000..983dde79d --- /dev/null +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/AnalyzerConfigurationMapperTest.java @@ -0,0 +1,33 @@ +package io.reflectoring.coderadar.graph; + +import io.reflectoring.coderadar.analyzer.domain.AnalyzerConfiguration; +import io.reflectoring.coderadar.graph.analyzer.domain.AnalyzerConfigurationEntity; +import io.reflectoring.coderadar.graph.projectadministration.analyzerconfig.AnalyzerConfigurationMapper; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class AnalyzerConfigurationMapperTest { + private final AnalyzerConfigurationMapper configurationMapper = new AnalyzerConfigurationMapper(); + + @Test + void testMapDomainObject() { + AnalyzerConfiguration testBranch = + new AnalyzerConfiguration().setEnabled(true).setId(1L).setAnalyzerName("testName"); + + AnalyzerConfigurationEntity result = configurationMapper.mapDomainObject(testBranch); + Assertions.assertTrue(result.getEnabled()); + Assertions.assertEquals("testName", result.getAnalyzerName()); + Assertions.assertNull(result.getId()); + } + + @Test + void testMapGraphObject() { + AnalyzerConfigurationEntity testBranch = + new AnalyzerConfigurationEntity().setEnabled(true).setId(1L).setAnalyzerName("testName"); + + AnalyzerConfiguration result = configurationMapper.mapGraphObject(testBranch); + Assertions.assertTrue(result.isEnabled()); + Assertions.assertEquals("testName", result.getAnalyzerName()); + Assertions.assertEquals(1L, result.getId()); + } +} diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/BranchMapperTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/BranchMapperTest.java new file mode 100644 index 000000000..10c8b54bc --- /dev/null +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/BranchMapperTest.java @@ -0,0 +1,31 @@ +package io.reflectoring.coderadar.graph; + +import io.reflectoring.coderadar.graph.projectadministration.branch.BranchMapper; +import io.reflectoring.coderadar.graph.projectadministration.domain.BranchEntity; +import io.reflectoring.coderadar.projectadministration.domain.Branch; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class BranchMapperTest { + private final BranchMapper branchMapper = new BranchMapper(); + + @Test + void testMapDomainObject() { + Branch testBranch = new Branch().setCommitHash("testHash").setName("testName"); + + BranchEntity result = branchMapper.mapDomainObject(testBranch); + Assertions.assertEquals("testHash", result.getCommitHash()); + Assertions.assertEquals("testName", result.getName()); + Assertions.assertNull(result.getId()); + } + + @Test + void testMapGraphObject() { + BranchEntity testBranch = + new BranchEntity().setId(1L).setCommitHash("testHash").setName("testName"); + + Branch result = branchMapper.mapGraphObject(testBranch); + Assertions.assertEquals("testHash", result.getCommitHash()); + Assertions.assertEquals("testName", result.getName()); + } +} diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/ContributorMapperTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/ContributorMapperTest.java new file mode 100644 index 000000000..8fee4b62a --- /dev/null +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/ContributorMapperTest.java @@ -0,0 +1,44 @@ +package io.reflectoring.coderadar.graph; + +import io.reflectoring.coderadar.contributor.domain.Contributor; +import io.reflectoring.coderadar.graph.contributor.ContributorMapper; +import io.reflectoring.coderadar.graph.contributor.domain.ContributorEntity; +import java.util.Collections; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class ContributorMapperTest { + private final ContributorMapper contributorMapper = new ContributorMapper(); + + @Test + void testMapDomainObject() { + Contributor testContributor = + new Contributor() + .setDisplayName("testDisplayName") + .setEmailAddresses(Collections.singleton("testEmail")) + .setId(1L) + .setNames(Collections.singleton("testName")); + + ContributorEntity result = contributorMapper.mapDomainObject(testContributor); + Assertions.assertEquals("testDisplayName", result.getDisplayName()); + Assertions.assertEquals(Collections.singleton("testEmail"), result.getEmails()); + Assertions.assertEquals(Collections.singleton("testName"), result.getNames()); + Assertions.assertEquals(1L, result.getId()); // The only mapper with this edge case + } + + @Test + void testMapGraphObject() { + ContributorEntity testContributor = + new ContributorEntity() + .setDisplayName("testDisplayName") + .setEmails(Collections.singleton("testEmail")) + .setId(1L) + .setNames(Collections.singleton("testName")); + + Contributor result = contributorMapper.mapGraphObject(testContributor); + Assertions.assertEquals("testDisplayName", result.getDisplayName()); + Assertions.assertEquals(Collections.singleton("testEmail"), result.getEmailAddresses()); + Assertions.assertEquals(Collections.singleton("testName"), result.getNames()); + Assertions.assertEquals(1L, result.getId()); + } +} diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/FilePatternMapperTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/FilePatternMapperTest.java new file mode 100644 index 000000000..73c154068 --- /dev/null +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/FilePatternMapperTest.java @@ -0,0 +1,40 @@ +package io.reflectoring.coderadar.graph; + +import io.reflectoring.coderadar.graph.projectadministration.domain.FilePatternEntity; +import io.reflectoring.coderadar.graph.projectadministration.filepattern.FilePatternMapper; +import io.reflectoring.coderadar.projectadministration.domain.FilePattern; +import io.reflectoring.coderadar.projectadministration.domain.InclusionType; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class FilePatternMapperTest { + private final FilePatternMapper filePatternMapper = new FilePatternMapper(); + + @Test + void testMapDomainObject() { + FilePattern testPattern = + new FilePattern() + .setId(1L) + .setPattern("testPattern") + .setInclusionType(InclusionType.EXCLUDE); + + FilePatternEntity result = filePatternMapper.mapDomainObject(testPattern); + Assertions.assertEquals("testPattern", result.getPattern()); + Assertions.assertNull(result.getId()); + Assertions.assertEquals(InclusionType.EXCLUDE, result.getInclusionType()); + } + + @Test + void testMapGraphObject() { + FilePatternEntity testPattern = + new FilePatternEntity() + .setId(1L) + .setPattern("testPattern") + .setInclusionType(InclusionType.EXCLUDE); + + FilePattern result = filePatternMapper.mapGraphObject(testPattern); + Assertions.assertEquals("testPattern", result.getPattern()); + Assertions.assertEquals(1L, result.getId()); + Assertions.assertEquals(InclusionType.EXCLUDE, result.getInclusionType()); + } +} diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/FindingsMapperTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/FindingsMapperTest.java new file mode 100644 index 000000000..58af4908a --- /dev/null +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/FindingsMapperTest.java @@ -0,0 +1,50 @@ +package io.reflectoring.coderadar.graph; + +import io.reflectoring.coderadar.analyzer.domain.Finding; +import io.reflectoring.coderadar.graph.analyzer.FindingsMapper; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class FindingsMapperTest { + private final FindingsMapper findingsMapper = new FindingsMapper(); + + @Test + void testMapFindingDomainWithMessage() { + Finding testFinding = new Finding(1, 2, 3, 4, "message"); + + String result = findingsMapper.mapDomainObject(testFinding); + Assertions.assertEquals("1-2-3-4-message", result); + } + + @Test + void testMapFindingDomainWithMessageDash() { + Finding testFinding = new Finding(1, 2, 3, 4, "message-2"); + + String result = findingsMapper.mapDomainObject(testFinding); + Assertions.assertEquals("1-2-3-4-message-2", result); + } + + @Test + void testMapFindingGraphWithMessage() { + String testFinding = "1-2-3-4-message"; + + Finding result = findingsMapper.mapGraphObject(testFinding); + Assertions.assertEquals(1, result.getLineStart()); + Assertions.assertEquals(2, result.getLineEnd()); + Assertions.assertEquals(3, result.getCharStart()); + Assertions.assertEquals(4, result.getCharEnd()); + Assertions.assertEquals("message", result.getMessage()); + } + + @Test + void testMapFindingGraphWithMessageDash() { + String testFinding = "1-2-3-4-message-2"; + + Finding result = findingsMapper.mapGraphObject(testFinding); + Assertions.assertEquals(1, result.getLineStart()); + Assertions.assertEquals(2, result.getLineEnd()); + Assertions.assertEquals(3, result.getCharStart()); + Assertions.assertEquals(4, result.getCharEnd()); + Assertions.assertEquals("message-2", result.getMessage()); + } +} diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/ModuleMapperTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/ModuleMapperTest.java new file mode 100644 index 000000000..f0e6cf614 --- /dev/null +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/ModuleMapperTest.java @@ -0,0 +1,29 @@ +package io.reflectoring.coderadar.graph; + +import io.reflectoring.coderadar.graph.projectadministration.domain.ModuleEntity; +import io.reflectoring.coderadar.graph.projectadministration.module.ModuleMapper; +import io.reflectoring.coderadar.projectadministration.domain.Module; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class ModuleMapperTest { + private final ModuleMapper moduleMapper = new ModuleMapper(); + + @Test + void testMapDomainObject() { + Module testModule = new Module(2L, "testPath"); + + ModuleEntity result = moduleMapper.mapDomainObject(testModule); + Assertions.assertEquals("testPath", result.getPath()); + Assertions.assertNull(result.getId()); + } + + @Test + void testMapGraphObject() { + ModuleEntity testModule = new ModuleEntity().setId(1L).setPath("testPath"); + + Module result = moduleMapper.mapGraphObject(testModule); + Assertions.assertEquals("testPath", result.getPath()); + Assertions.assertEquals(1L, result.getId()); + } +} diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/ProjectMapperTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/ProjectMapperTest.java new file mode 100644 index 000000000..5a7194f22 --- /dev/null +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/ProjectMapperTest.java @@ -0,0 +1,59 @@ +package io.reflectoring.coderadar.graph; + +import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; +import io.reflectoring.coderadar.graph.projectadministration.project.ProjectMapper; +import io.reflectoring.coderadar.projectadministration.domain.Project; +import java.util.Date; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class ProjectMapperTest { + private final ProjectMapper projectMapper = new ProjectMapper(); + + @Test + void testMapDomainObject() { + Project testProject = + new Project() + .setId(1L) + .setName("testName") + .setVcsStart(new Date(123L)) + .setVcsPassword("testPassword") + .setVcsUsername("testUsername") + .setVcsOnline(true) + .setWorkdirName("workdir") + .setVcsUrl("testUrl"); + + ProjectEntity result = projectMapper.mapDomainObject(testProject); + Assertions.assertEquals("testName", result.getName()); + Assertions.assertEquals("testUsername", result.getVcsUsername()); + Assertions.assertEquals("testPassword", result.getVcsPassword()); + Assertions.assertEquals("testUrl", result.getVcsUrl()); + Assertions.assertEquals(new Date(123L), result.getVcsStart()); + Assertions.assertEquals("workdir", result.getWorkdirName()); + Assertions.assertTrue(result.isVcsOnline()); + Assertions.assertNull(result.getId()); + } + + @Test + void testMapGraphObject() { + ProjectEntity testProject = + new ProjectEntity() + .setId(1L) + .setName("testName") + .setVcsStart(new Date(123L)) + .setVcsPassword("testPassword") + .setVcsUsername("testUsername") + .setVcsOnline(true) + .setWorkdirName("workdir") + .setVcsUrl("testUrl"); + Project result = projectMapper.mapGraphObject(testProject); + Assertions.assertEquals("testName", result.getName()); + Assertions.assertEquals("testUsername", result.getVcsUsername()); + Assertions.assertEquals("testPassword", result.getVcsPassword()); + Assertions.assertEquals("testUrl", result.getVcsUrl()); + Assertions.assertEquals(new Date(123L), result.getVcsStart()); + Assertions.assertEquals("workdir", result.getWorkdirName()); + Assertions.assertTrue(result.isVcsOnline()); + Assertions.assertEquals(1L, result.getId()); + } +} diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/TeamMapperTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/TeamMapperTest.java new file mode 100644 index 000000000..9129c4a95 --- /dev/null +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/TeamMapperTest.java @@ -0,0 +1,39 @@ +package io.reflectoring.coderadar.graph; + +import io.reflectoring.coderadar.graph.useradministration.TeamMapper; +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.useradministration.domain.Team; +import java.util.Collections; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class TeamMapperTest { + private final TeamMapper teamMapper = new TeamMapper(); + + @Test + void testMapDomainObject() { + Team testTeam = new Team().setId(1L).setName("testTeam"); + + TeamEntity result = teamMapper.mapDomainObject(testTeam); + Assertions.assertEquals("testTeam", result.getName()); + Assertions.assertNull(result.getId()); + } + + @Test + void testMapGraphObject() { + TeamEntity testModule = + new TeamEntity() + .setId(1L) + .setName("testTeam") + .setMembers( + Collections.singletonList(new UserEntity().setId(2L).setUsername("testUsername"))); + + Team result = teamMapper.mapGraphObject(testModule); + Assertions.assertEquals("testTeam", result.getName()); + Assertions.assertEquals(1L, result.getId()); + Assertions.assertEquals(1L, result.getMembers().size()); + Assertions.assertEquals(2L, result.getMembers().get(0).getId()); + Assertions.assertEquals("testUsername", result.getMembers().get(0).getUsername()); + } +} diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/UserMapperTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/UserMapperTest.java new file mode 100644 index 000000000..2a152df42 --- /dev/null +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/UserMapperTest.java @@ -0,0 +1,32 @@ +package io.reflectoring.coderadar.graph; + +import io.reflectoring.coderadar.graph.useradministration.UserMapper; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.useradministration.domain.User; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class UserMapperTest { + private final UserMapper userMapper = new UserMapper(); + + @Test + void testMapDomainObject() { + User testUser = new User().setId(1L).setUsername("testUsername").setPassword("testPassword"); + + UserEntity result = userMapper.mapDomainObject(testUser); + Assertions.assertEquals("testUsername", result.getUsername()); + Assertions.assertEquals("testPassword", result.getPassword()); + Assertions.assertNull(result.getId()); + } + + @Test + void testMapGraphObject() { + UserEntity testUser = + new UserEntity().setId(1L).setUsername("testUsername").setPassword("testPassword"); + + User result = userMapper.mapGraphObject(testUser); + Assertions.assertEquals("testUsername", result.getUsername()); + Assertions.assertEquals("testPassword", result.getPassword()); + Assertions.assertEquals(1L, result.getId()); + } +} diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/contributor/GetContributorAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/contributor/GetContributorAdapterTest.java index 0185c10d9..e3fd46f86 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/contributor/GetContributorAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/contributor/GetContributorAdapterTest.java @@ -14,7 +14,7 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -public class GetContributorAdapterTest { +class GetContributorAdapterTest { private GetContributorAdapter getContributorAdapter; @Mock private ContributorRepository contributorRepository; @@ -25,7 +25,7 @@ public void setup() { } @Test - public void throwsExceptionIfContributorDoesNotExist() { + void throwsExceptionIfContributorDoesNotExist() { when(contributorRepository.findById(10L)).thenReturn(Optional.empty()); Assertions.assertThrows( diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/contributor/MergeContributorsAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/contributor/MergeContributorsAdapterTest.java index 18a3c59fa..6256a8cbb 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/contributor/MergeContributorsAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/contributor/MergeContributorsAdapterTest.java @@ -17,7 +17,7 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -public class MergeContributorsAdapterTest { +class MergeContributorsAdapterTest { private MergeContributorsAdapter mergeContributorsAdapter; @Mock private ContributorRepository contributorRepository; @@ -28,7 +28,7 @@ public void setup() { } @Test - public void mergeTwoContributorsSuccessfully() { + void mergeTwoContributorsSuccessfully() { ContributorEntity contributor1 = new ContributorEntity(); contributor1.setId(1L); contributor1.setDisplayName("Max"); diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/contributor/UpdateContributorAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/contributor/UpdateContributorAdapterTest.java index e30544021..3bcf500ca 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/contributor/UpdateContributorAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/contributor/UpdateContributorAdapterTest.java @@ -15,7 +15,7 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -public class UpdateContributorAdapterTest { +class UpdateContributorAdapterTest { private UpdateContributorAdapter updateContributorAdapter; @Mock private ContributorRepository contributorRepository; @@ -26,7 +26,7 @@ public void setup() { } @Test - public void updateDisplayName() { + void updateDisplayName() { ContributorEntity contributor = new ContributorEntity(); contributor.setId(1L); contributor.setDisplayName("Test"); diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/DeleteAnalyzerConfigurationAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/DeleteAnalyzerConfigurationAdapterTest.java index 8a475dd49..c5f6d90ca 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/DeleteAnalyzerConfigurationAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/DeleteAnalyzerConfigurationAdapterTest.java @@ -11,7 +11,7 @@ @DisplayName("Delete analyzer configuration") class DeleteAnalyzerConfigurationAdapterTest { - private AnalyzerConfigurationRepository analyzerConfigurationRepository = + private final AnalyzerConfigurationRepository analyzerConfigurationRepository = mock(AnalyzerConfigurationRepository.class); private DeleteAnalyzerConfigurationAdapter deleteAnalyzerConfigurationAdapter; diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/GetAnalyzerConfigurationAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/GetAnalyzerConfigurationAdapterTest.java index 711a5813b..efa391396 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/GetAnalyzerConfigurationAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/GetAnalyzerConfigurationAdapterTest.java @@ -15,7 +15,7 @@ @DisplayName("Get analyzer configuration") class GetAnalyzerConfigurationAdapterTest { - private AnalyzerConfigurationRepository analyzerConfigurationRepository = + private final AnalyzerConfigurationRepository analyzerConfigurationRepository = mock(AnalyzerConfigurationRepository.class); private GetAnalyzerConfigurationAdapter getAnalyzerConfigurationAdapter; diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/ListAnalyzerConfigurationsFromProjectServiceTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/ListAnalyzerConfigurationsFromProjectServiceTest.java index 056691894..a9a7ed179 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/ListAnalyzerConfigurationsFromProjectServiceTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/ListAnalyzerConfigurationsFromProjectServiceTest.java @@ -15,10 +15,10 @@ @DisplayName("Get analyzer configurations from project") class ListAnalyzerConfigurationsFromProjectServiceTest { - private AnalyzerConfigurationRepository analyzerConfigurationRepository = + private final AnalyzerConfigurationRepository analyzerConfigurationRepository = mock(AnalyzerConfigurationRepository.class); - private ProjectRepository projectRepository = mock(ProjectRepository.class); + private final ProjectRepository projectRepository = mock(ProjectRepository.class); private ListAnalyzerConfigurationsAdapter getAnalyzerConfigurationsFromProjectAdapter; @@ -37,7 +37,7 @@ void shouldReturnEmptyListWhenNoAnalyzerConfigurationsInTheProjectExist() { Iterable configurations = getAnalyzerConfigurationsFromProjectAdapter.listAnalyzerConfigurations(1L); verify(analyzerConfigurationRepository, times(1)).findByProjectId(1L); - Assertions.assertThat(configurations).hasSize(0); + Assertions.assertThat(configurations).isEmpty(); } @Test diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/UpdateAnalyzerConfigurationAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/UpdateAnalyzerConfigurationAdapterTest.java index be215d363..987f138ee 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/UpdateAnalyzerConfigurationAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/analyzerconfig/UpdateAnalyzerConfigurationAdapterTest.java @@ -16,7 +16,7 @@ @DisplayName("Update analyzer configuration") class UpdateAnalyzerConfigurationAdapterTest { - private AnalyzerConfigurationRepository analyzerConfigurationRepository = + private final AnalyzerConfigurationRepository analyzerConfigurationRepository = mock(AnalyzerConfigurationRepository.class); private UpdateAnalyzerConfigurationAdapter updateAnalyzerConfigurationAdapter; @@ -59,6 +59,5 @@ void shouldUpdateAnalyzerConfigurationWhenAAnalyzerConfigurationWithThePassingId updateAnalyzerConfigurationAdapter.update(newItem); verify(analyzerConfigurationRepository, times(1)).save(mockedItem); - Assertions.assertNotEquals(mockedOldItem, newItem); } } diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/CreateFilePatternAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/CreateFilePatternAdapterTest.java index e29c8697b..aa85a2319 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/CreateFilePatternAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/CreateFilePatternAdapterTest.java @@ -17,8 +17,8 @@ @DisplayName("Create file pattern") class CreateFilePatternAdapterTest { - private FilePatternRepository filePatternRepository = mock(FilePatternRepository.class); - private ProjectRepository projectRepository = mock(ProjectRepository.class); + private final FilePatternRepository filePatternRepository = mock(FilePatternRepository.class); + private final ProjectRepository projectRepository = mock(ProjectRepository.class); @Test @DisplayName("Should return long when passing a valid argument") @@ -34,7 +34,6 @@ void shouldReturnLongWhenPassingAValidArgument() { .thenReturn(java.util.Optional.of(new ProjectEntity())); when(filePatternRepository.save(any())).thenReturn(filePatternEntity); Long returnedId = createFilePatternAdapter.createFilePattern(filePattern, 1L); - Assertions.assertThat(returnedId).isNotNull(); - Assertions.assertThat(returnedId).isEqualTo(2L); + Assertions.assertThat(returnedId).isNotNull().isEqualTo(2L); } } diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/GetFilePatternAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/GetFilePatternAdapterTest.java index cf2893720..c0860d2c3 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/GetFilePatternAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/filepattern/GetFilePatternAdapterTest.java @@ -15,7 +15,7 @@ import org.junit.jupiter.api.Test; @DisplayName("Get file pattern") -public class GetFilePatternAdapterTest { +class GetFilePatternAdapterTest { private FilePatternRepository filePatternRepository = mock(FilePatternRepository.class); @Test diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/module/ListModulesOfProjectAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/module/ListModulesOfProjectAdapterTest.java index dbe16c6a2..4b7dfcbf2 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/module/ListModulesOfProjectAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/module/ListModulesOfProjectAdapterTest.java @@ -33,7 +33,7 @@ void shouldReturnEmptyListWhenNoModulesInTheProjectExist() { Iterable modules = listModulesOfProjectAdapter.listModules(1L); verify(moduleRepository, times(1)).findModulesInProjectSortedDesc(1L); - Assertions.assertThat(modules).hasSize(0); + Assertions.assertThat(modules).isEmpty(); } @Test diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/project/ListProjectsAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/project/ListProjectsAdapterTest.java index 3eed6a0d9..fc5defd4a 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/project/ListProjectsAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/project/ListProjectsAdapterTest.java @@ -15,7 +15,7 @@ @DisplayName("List projects") class ListProjectsAdapterTest { - private ProjectRepository projectRepository = mock(ProjectRepository.class); + private final ProjectRepository projectRepository = mock(ProjectRepository.class); private ListProjectsAdapter listProjectsAdapter; @@ -31,7 +31,7 @@ void shouldReturnEmptyListWhenNoProjectsExist() { List projects = listProjectsAdapter.getProjects(); verify(projectRepository, times(1)).findAll(); - Assertions.assertThat(projects).hasSize(0); + Assertions.assertThat(projects).isEmpty(); } @Test diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/project/UpdateProjectAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/project/UpdateProjectAdapterTest.java index b79f43091..13c2417e0 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/project/UpdateProjectAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/project/UpdateProjectAdapterTest.java @@ -7,14 +7,13 @@ import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; import io.reflectoring.coderadar.projectadministration.domain.Project; import java.util.Optional; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @DisplayName("Update project") class UpdateProjectAdapterTest { - private ProjectRepository projectRepository = mock(ProjectRepository.class); + private final ProjectRepository projectRepository = mock(ProjectRepository.class); private UpdateProjectAdapter updateProjectAdapter; @@ -42,6 +41,5 @@ void shouldUpdateProjectWhenAProjectWithThePassingIdExists() { updateProjectAdapter.update(project); verify(projectRepository, times(1)).save(mockedItem); - Assertions.assertNotEquals(mockedOldItem, project); } } diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/user/GetUserAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/user/GetUserAdapterTest.java index 1671a1105..7deb893fd 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/user/GetUserAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/projectadministration/user/GetUserAdapterTest.java @@ -14,8 +14,8 @@ import org.mockito.Mockito; @DisplayName("Load user") -public class GetUserAdapterTest { - private UserRepository userRepository = mock(UserRepository.class); +class GetUserAdapterTest { + private final UserRepository userRepository = mock(UserRepository.class); @Test @DisplayName("Should return user when passing valid argument") diff --git a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/query/GetAvailableMetricsInProjectAdapterTest.java b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/query/GetAvailableMetricsInProjectAdapterTest.java index b39b052f4..a55fb741b 100644 --- a/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/query/GetAvailableMetricsInProjectAdapterTest.java +++ b/coderadar-graph/src/test/java/io/reflectoring/coderadar/graph/query/GetAvailableMetricsInProjectAdapterTest.java @@ -16,8 +16,8 @@ @DisplayName("Get available metrics in project") class GetAvailableMetricsInProjectAdapterTest { - private ProjectRepository projectRepository = mock(ProjectRepository.class); - private MetricQueryRepository metricQueryRepository = mock(MetricQueryRepository.class); + private final ProjectRepository projectRepository = mock(ProjectRepository.class); + private final MetricQueryRepository metricQueryRepository = mock(MetricQueryRepository.class); private GetAvailableMetricsInProjectAdapter getAvailableMetricsInProjectAdapter; @@ -37,7 +37,7 @@ void shouldReturnEmptyListOfStringsWhenNoMetricsAreAvailable() { List returnedMetrics = getAvailableMetricsInProjectAdapter.get(1L); - assertThat(returnedMetrics).hasSize(0); + assertThat(returnedMetrics).isEmpty(); } @Test diff --git a/coderadar-plugin-api/src/main/java/io/reflectoring/coderadar/plugin/api/FileMetricsWithChangeType.java b/coderadar-plugin-api/src/main/java/io/reflectoring/coderadar/plugin/api/FileMetricsWithChangeType.java deleted file mode 100644 index 1e22fd233..000000000 --- a/coderadar-plugin-api/src/main/java/io/reflectoring/coderadar/plugin/api/FileMetricsWithChangeType.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.reflectoring.coderadar.plugin.api; - -public class FileMetricsWithChangeType extends FileMetrics { - - private ChangeType changeType; - - public FileMetricsWithChangeType() { - } - - public FileMetricsWithChangeType(ChangeType changeType) { - this.changeType = changeType; - } - - public FileMetricsWithChangeType(FileMetrics copyFrom, ChangeType changeType) { - super(copyFrom); - this.changeType = changeType; - } - - public ChangeType getChangeType() { - return changeType; - } - - public void setChangeType(ChangeType changeType) { - this.changeType = changeType; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - - FileMetricsWithChangeType that = (FileMetricsWithChangeType) o; - - if (changeType != that.changeType) return false; - - return true; - } - - @Override - public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (changeType != null ? changeType.hashCode() : 0); - return result; - } -} diff --git a/coderadar-plugin-api/src/main/java/io/reflectoring/coderadar/plugin/api/FileSetMetrics.java b/coderadar-plugin-api/src/main/java/io/reflectoring/coderadar/plugin/api/FileSetMetrics.java deleted file mode 100644 index 586cdf298..000000000 --- a/coderadar-plugin-api/src/main/java/io/reflectoring/coderadar/plugin/api/FileSetMetrics.java +++ /dev/null @@ -1,48 +0,0 @@ -package io.reflectoring.coderadar.plugin.api; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -/** - * Stores metrics to each of a set of files. - */ -public class FileSetMetrics { - - private Map metrics = new HashMap<>(); - - public FileMetrics getFileMetrics(String file) { - return metrics.get(file); - } - - public void addMetricsToFile(String file, FileMetrics metrics) { - FileMetrics fileMetrics = this.metrics.get(file); - if (fileMetrics == null) { - this.metrics.put(file, metrics); - } else { - fileMetrics = this.metrics.get(file); - fileMetrics.add(metrics); - } - } - - public Set getFiles() { - return metrics.keySet(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - FileSetMetrics that = (FileSetMetrics) o; - - if (metrics != null ? !metrics.equals(that.metrics) : that.metrics != null) return false; - - return true; - } - - @Override - public int hashCode() { - return metrics != null ? metrics.hashCode() : 0; - } -} diff --git a/coderadar-plugin-api/src/main/java/io/reflectoring/coderadar/plugin/api/SourceCodeFileAnalyzerPlugin.java b/coderadar-plugin-api/src/main/java/io/reflectoring/coderadar/plugin/api/SourceCodeFileAnalyzerPlugin.java index 838acd70c..02791fc6a 100644 --- a/coderadar-plugin-api/src/main/java/io/reflectoring/coderadar/plugin/api/SourceCodeFileAnalyzerPlugin.java +++ b/coderadar-plugin-api/src/main/java/io/reflectoring/coderadar/plugin/api/SourceCodeFileAnalyzerPlugin.java @@ -20,5 +20,5 @@ public interface SourceCodeFileAnalyzerPlugin extends AnalyzerPlugin { * @param fileContent the content of the file. * @return a set of metric values calculated for the given file. */ - FileMetrics analyzeFile(String filename, byte[] fileContent) throws AnalyzerException; + FileMetrics analyzeFile(String filename, byte[] fileContent); } diff --git a/coderadar-plugins/checkstyle-analyzer-plugin/build.gradle b/coderadar-plugins/checkstyle-analyzer-plugin/build.gradle index 50634ec66..92190f721 100644 --- a/coderadar-plugins/checkstyle-analyzer-plugin/build.gradle +++ b/coderadar-plugins/checkstyle-analyzer-plugin/build.gradle @@ -1,4 +1,5 @@ apply plugin: "com.diffplug.gradle.spotless" +apply plugin: "jacoco" spotless { java { @@ -8,9 +9,9 @@ spotless { dependencies { compile group: 'commons-lang', name: 'commons-lang', version: '2.6' - compile group: 'com.puppycrawl.tools', name: 'checkstyle', version: '7.0' + compile group: 'com.puppycrawl.tools', name: 'checkstyle', version: '8.34' compile group: 'commons-io', name: 'commons-io', version: '2.4' compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.12' testCompile group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.7' compile project(":coderadar-plugin-api") -} \ No newline at end of file +} diff --git a/coderadar-plugins/checkstyle-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/checkstyle/CheckstyleSourceCodeFileAnalyzerPlugin.java b/coderadar-plugins/checkstyle-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/checkstyle/CheckstyleSourceCodeFileAnalyzerPlugin.java index 0e1eea6d8..f8dd688da 100644 --- a/coderadar-plugins/checkstyle-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/checkstyle/CheckstyleSourceCodeFileAnalyzerPlugin.java +++ b/coderadar-plugins/checkstyle-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/checkstyle/CheckstyleSourceCodeFileAnalyzerPlugin.java @@ -22,6 +22,8 @@ public class CheckstyleSourceCodeFileAnalyzerPlugin private CoderadarAuditListener auditListener; + private final File tempDir = Files.createTempDir(); + public CheckstyleSourceCodeFileAnalyzerPlugin() { try { init(createDefaultConfiguration()); @@ -53,7 +55,7 @@ private Configuration createDefaultConfiguration() throws CheckstyleException { } @Override - public FileMetrics analyzeFile(String filepath, byte[] fileContent) throws AnalyzerException { + public FileMetrics analyzeFile(String filepath, byte[] fileContent) { File fileToAnalyze = null; try { fileToAnalyze = createTempFile(fileContent, filepath); @@ -71,11 +73,11 @@ public FileMetrics analyzeFile(String filepath, byte[] fileContent) throws Analy private File createTempFile(byte[] fileContent, String filename) throws IOException { String[] temp = filename.split("/"); - File file = new File(Files.createTempDir(), temp[temp.length - 1]); + File file = new File(tempDir, temp[temp.length - 1]); file.deleteOnExit(); - FileOutputStream out = new FileOutputStream(file); - out.write(fileContent); - out.close(); + try (FileOutputStream out = new FileOutputStream(file)) { + out.write(fileContent); + } return file; } @@ -93,7 +95,7 @@ private Configuration getConfigurationFromStream(InputStream in) throws Checksty return ConfigurationLoader.loadConfiguration( new InputSource(in), new CheckstylePropertiesResolver(new Properties()), // TODO: pass real properties - true); + null); } @Override diff --git a/coderadar-plugins/checkstyle-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/checkstyle/CoderadarAuditListener.java b/coderadar-plugins/checkstyle-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/checkstyle/CoderadarAuditListener.java index 8d7c55b8d..5686e4418 100644 --- a/coderadar-plugins/checkstyle-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/checkstyle/CoderadarAuditListener.java +++ b/coderadar-plugins/checkstyle-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/checkstyle/CoderadarAuditListener.java @@ -15,7 +15,7 @@ public class CoderadarAuditListener implements AuditListener { private FileMetrics metrics = new FileMetrics(); - private MetricCountExtractor metricCountExtractor = new MetricCountExtractor(); + private final MetricCountExtractor metricCountExtractor = new MetricCountExtractor(); @Override public void auditStarted(AuditEvent evt) { diff --git a/coderadar-plugins/checkstyle-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/checkstyle/MetricCountExtractor.java b/coderadar-plugins/checkstyle-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/checkstyle/MetricCountExtractor.java index 6761ac15e..a56efe84d 100644 --- a/coderadar-plugins/checkstyle-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/checkstyle/MetricCountExtractor.java +++ b/coderadar-plugins/checkstyle-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/checkstyle/MetricCountExtractor.java @@ -30,15 +30,11 @@ public class MetricCountExtractor { public Long extractMetricCount(AuditEvent event) { try { - if (event.getSourceName().equals(CyclomaticComplexityCheck.class.getName())) { - return extractLongArgument(event, 0); - } else if (event.getSourceName().equals(ReturnCountCheck.class.getName())) { - return extractLongArgument(event, 0); - } else if (event.getSourceName().equals(JavaNCSSCheck.class.getName())) { - return extractLongArgument(event, 0); - } else if (event.getSourceName().equals(NPathComplexityCheck.class.getName())) { - return extractLongArgument(event, 0); - } else if (event.getSourceName().equals(ExecutableStatementCountCheck.class.getName())) { + if (event.getSourceName().equals(CyclomaticComplexityCheck.class.getName()) + || event.getSourceName().equals(ReturnCountCheck.class.getName()) + || event.getSourceName().equals(JavaNCSSCheck.class.getName()) + || event.getSourceName().equals(NPathComplexityCheck.class.getName()) + || event.getSourceName().equals(ExecutableStatementCountCheck.class.getName())) { return extractLongArgument(event, 0); } diff --git a/coderadar-plugins/checkstyle-analyzer-plugin/src/main/resources/checkstyle.xml b/coderadar-plugins/checkstyle-analyzer-plugin/src/main/resources/checkstyle.xml index f5b9ef18e..3a6550848 100644 --- a/coderadar-plugins/checkstyle-analyzer-plugin/src/main/resources/checkstyle.xml +++ b/coderadar-plugins/checkstyle-analyzer-plugin/src/main/resources/checkstyle.xml @@ -8,7 +8,8 @@ If you set the basedir property below, then all reported file names will be relative to the specified directory. See http://checkstyle.sourceforge.net/5.x/config.html#Checker - --> + + --> @@ -56,6 +57,11 @@ + + + + + @@ -90,23 +96,16 @@ - - - + - + - - - - - @@ -359,4 +358,4 @@ - \ No newline at end of file + diff --git a/coderadar-plugins/checkstyle-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/checkstyle/CheckstylePropertiesResolverTest.java b/coderadar-plugins/checkstyle-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/checkstyle/CheckstylePropertiesResolverTest.java index 2e0743120..02b15c20a 100644 --- a/coderadar-plugins/checkstyle-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/checkstyle/CheckstylePropertiesResolverTest.java +++ b/coderadar-plugins/checkstyle-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/checkstyle/CheckstylePropertiesResolverTest.java @@ -4,10 +4,10 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class CheckstylePropertiesResolverTest { +class CheckstylePropertiesResolverTest { @Test - public void existingPropertiesAreResolved() { + void existingPropertiesAreResolved() { Properties properties = new Properties(); properties.put(CheckstyleSourceCodeFileAnalyzerPlugin.class.getName() + ".property1", "value1"); CheckstylePropertiesResolver resolver = new CheckstylePropertiesResolver(properties); @@ -15,7 +15,7 @@ public void existingPropertiesAreResolved() { } @Test - public void missingPropertiesAreNotResolved() { + void missingPropertiesAreNotResolved() { Properties properties = new Properties(); properties.put( CheckstyleSourceCodeFileAnalyzerPlugin.class.getName() + ".existingProperty", diff --git a/coderadar-plugins/checkstyle-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/checkstyle/CheckstyleSourceCodeFileAnalyzerPluginTest.java b/coderadar-plugins/checkstyle-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/checkstyle/CheckstyleSourceCodeFileAnalyzerPluginTest.java index 4a13ef4dc..6f6227824 100644 --- a/coderadar-plugins/checkstyle-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/checkstyle/CheckstyleSourceCodeFileAnalyzerPluginTest.java +++ b/coderadar-plugins/checkstyle-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/checkstyle/CheckstyleSourceCodeFileAnalyzerPluginTest.java @@ -8,10 +8,10 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class CheckstyleSourceCodeFileAnalyzerPluginTest { +class CheckstyleSourceCodeFileAnalyzerPluginTest { @Test - public void metricsAreCalculatedCorrectly() throws AnalyzerException, IOException { + void metricsAreCalculatedCorrectly() throws AnalyzerException, IOException { byte[] fileContent = IOUtils.toByteArray(getClass().getResourceAsStream("/CheckstyleAnalyzer.java.txt")); @@ -27,7 +27,7 @@ public void metricsAreCalculatedCorrectly() throws AnalyzerException, IOExceptio } @Test - public void cyclomaticComplexityIsCalculatedCorrectly() throws IOException { + void cyclomaticComplexityIsCalculatedCorrectly() throws IOException { byte[] fileContent = IOUtils.toByteArray(getClass().getResourceAsStream("/AntPathMatcher.java.txt")); diff --git a/coderadar-plugins/checkstyle-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/checkstyle/ServiceLoaderTest.java b/coderadar-plugins/checkstyle-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/checkstyle/ServiceLoaderTest.java index 339b5c801..9cfa6a17b 100644 --- a/coderadar-plugins/checkstyle-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/checkstyle/ServiceLoaderTest.java +++ b/coderadar-plugins/checkstyle-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/checkstyle/ServiceLoaderTest.java @@ -6,10 +6,10 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class ServiceLoaderTest { +class ServiceLoaderTest { @Test - public void analyzerIsRegisteredWithServiceLoader() { + void analyzerIsRegisteredWithServiceLoader() { ServiceLoader loader = ServiceLoader.load( SourceCodeFileAnalyzerPlugin.class, diff --git a/coderadar-plugins/checkstyle-analyzer-plugin/src/test/resources/checkstyle.xml b/coderadar-plugins/checkstyle-analyzer-plugin/src/test/resources/checkstyle.xml index 5c2a901cf..3a6550848 100644 --- a/coderadar-plugins/checkstyle-analyzer-plugin/src/test/resources/checkstyle.xml +++ b/coderadar-plugins/checkstyle-analyzer-plugin/src/test/resources/checkstyle.xml @@ -57,6 +57,11 @@ + + + + + @@ -91,9 +96,7 @@ - - - + @@ -101,13 +104,8 @@ - - - - - @@ -360,4 +358,4 @@ - \ No newline at end of file + diff --git a/coderadar-plugins/loc-analyzer-plugin/build.gradle b/coderadar-plugins/loc-analyzer-plugin/build.gradle index 6ef0e1935..8327cd76e 100644 --- a/coderadar-plugins/loc-analyzer-plugin/build.gradle +++ b/coderadar-plugins/loc-analyzer-plugin/build.gradle @@ -1,4 +1,5 @@ apply plugin: "com.diffplug.gradle.spotless" +apply plugin: "jacoco" spotless { java { diff --git a/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LineMarker.java b/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LineMarker.java index 0e5490bbb..11797efa8 100644 --- a/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LineMarker.java +++ b/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LineMarker.java @@ -1,5 +1,6 @@ package io.reflectoring.coderadar.analyzer.loc; +import java.util.Objects; import lombok.AllArgsConstructor; import lombok.Getter; @@ -22,4 +23,16 @@ public enum Type { public int compareTo(LineMarker o) { return this.startIndex.compareTo(o.getStartIndex()); } + + @Override + public boolean equals(Object o) { + return o instanceof LineMarker + && this.startIndex.equals(((LineMarker) o).startIndex) + && this.type.equals(((LineMarker) o).type); + } + + @Override + public int hashCode() { + return Objects.hash(startIndex, type); + } } diff --git a/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/Loc.java b/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LinesOfCode.java similarity index 96% rename from coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/Loc.java rename to coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LinesOfCode.java index d49af461e..b20fc3adf 100644 --- a/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/Loc.java +++ b/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LinesOfCode.java @@ -3,7 +3,7 @@ import lombok.Data; @Data -public class Loc { +public class LinesOfCode { /** Lines of code. Total lines of code, including comments and empty lines. */ private int loc; diff --git a/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LocAnalyzerPlugin.java b/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LocAnalyzerPlugin.java index a8661894b..1032278e8 100644 --- a/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LocAnalyzerPlugin.java +++ b/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LocAnalyzerPlugin.java @@ -8,7 +8,7 @@ /** Counts several types of lines of code. */ public class LocAnalyzerPlugin implements SourceCodeFileAnalyzerPlugin { - private LocCounter locCounter = new LocCounter(); + private final LocCounter locCounter = new LocCounter(); @Override public AnalyzerFileFilter getFilter() { @@ -16,18 +16,18 @@ public AnalyzerFileFilter getFilter() { } @Override - public FileMetrics analyzeFile(String filename, byte[] fileContent) throws AnalyzerException { + public FileMetrics analyzeFile(String filename, byte[] fileContent) { try { String fileEnding = filename.substring(filename.lastIndexOf('.')); LocProfile profile = Profiles.getForFile(filename); - Loc loc = locCounter.count(fileContent, profile); + LinesOfCode loc = locCounter.count(fileContent, profile); return toFileMetrics(loc, fileEnding); } catch (IOException e) { throw new AnalyzerException(e); } } - private FileMetrics toFileMetrics(Loc loc, String fileEnding) { + private FileMetrics toFileMetrics(LinesOfCode loc, String fileEnding) { String sanitizedFileEnding = fileEnding.replaceAll("\\.", ""); FileMetrics metrics = new FileMetrics(); metrics.setMetricCount( diff --git a/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LocCounter.java b/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LocCounter.java index 840f0b497..b8a627d27 100644 --- a/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LocCounter.java +++ b/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/LocCounter.java @@ -13,8 +13,8 @@ public class LocCounter { - public Loc count(byte[] fileContent, LocProfile profile) throws IOException { - Loc loc = new Loc(); + public LinesOfCode count(byte[] fileContent, LocProfile profile) throws IOException { + LinesOfCode loc = new LinesOfCode(); LocContext context = new LocContext(); BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(fileContent))); @@ -25,7 +25,7 @@ public Loc count(byte[] fileContent, LocProfile profile) throws IOException { return loc; } - private void countLine(String line, LocProfile profile, Loc loc, LocContext context) { + private void countLine(String line, LocProfile profile, LinesOfCode loc, LocContext context) { if (isEmptyLine(line)) { loc.incrementLoc(); } else if (isCommentLine(line, profile, context)) { @@ -74,6 +74,8 @@ private void updateContext(String line, LocProfile profile, LocContext context) withinMultiLineComment = false; } break; + default: + break; } } diff --git a/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/profiles/Profiles.java b/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/profiles/Profiles.java index 62b72f5c7..1b6994cb6 100644 --- a/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/profiles/Profiles.java +++ b/coderadar-plugins/loc-analyzer-plugin/src/main/java/io/reflectoring/coderadar/analyzer/loc/profiles/Profiles.java @@ -5,11 +5,13 @@ public class Profiles { - private static final Map PROFILES = new HashMap<>(); + private Profiles() {} + + private static final Map LOC_PROFILES = new HashMap<>(); static { - PROFILES.put(".java", new JavaLocProfile()); - PROFILES.put(".xml", new XmlLocProfile()); + LOC_PROFILES.put(".java", new JavaLocProfile()); + LOC_PROFILES.put(".xml", new XmlLocProfile()); } public static LocProfile getForFile(String file) { @@ -20,6 +22,6 @@ public static LocProfile getForFile(String file) { } String fileEnding = file.substring(lastDotIndex); - return PROFILES.get(fileEnding); + return LOC_PROFILES.get(fileEnding); } } diff --git a/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/LocAnalyzerPluginFilterTest.java b/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/LinesOfCodeAnalyzerPluginFilterTest.java similarity index 83% rename from coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/LocAnalyzerPluginFilterTest.java rename to coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/LinesOfCodeAnalyzerPluginFilterTest.java index f81032982..73a3c1c0a 100644 --- a/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/LocAnalyzerPluginFilterTest.java +++ b/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/LinesOfCodeAnalyzerPluginFilterTest.java @@ -4,10 +4,10 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class LocAnalyzerPluginFilterTest { +class LinesOfCodeAnalyzerPluginFilterTest { @Test - public void filterAcceptsTheCorrectFiles() { + void filterAcceptsTheCorrectFiles() { AnalyzerFileFilter filter = new LocAnalyzerFileFilter(); Assertions.assertTrue(filter.acceptFilename("Testfile.java")); diff --git a/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/LocAnalyzerPluginTest.java b/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/LinesOfCodeAnalyzerPluginTest.java similarity index 87% rename from coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/LocAnalyzerPluginTest.java rename to coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/LinesOfCodeAnalyzerPluginTest.java index 3231f6bf4..1d207156c 100644 --- a/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/LocAnalyzerPluginTest.java +++ b/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/LinesOfCodeAnalyzerPluginTest.java @@ -7,10 +7,10 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class LocAnalyzerPluginTest { +class LinesOfCodeAnalyzerPluginTest { @Test - public void metricIsCalculatedCorrectly() throws Exception { + void metricIsCalculatedCorrectly() throws Exception { InputStream in = getClass().getResourceAsStream("AcceptedJavaFile.txt"); byte[] fileContent = IOUtils.toByteArray(in); diff --git a/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/ServiceLoaderTest.java b/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/ServiceLoaderTest.java index 259b3aa35..ef0f2e6a0 100644 --- a/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/ServiceLoaderTest.java +++ b/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/ServiceLoaderTest.java @@ -6,10 +6,10 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class ServiceLoaderTest { +class ServiceLoaderTest { @Test - public void analyzerIsRegisteredWithServiceLoader() { + void analyzerIsRegisteredWithServiceLoader() { ServiceLoader loader = ServiceLoader.load(SourceCodeFileAnalyzerPlugin.class); Iterator plugins = loader.iterator(); diff --git a/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/AbstractLocProfileTest.java b/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/AbstractLocProfileTest.java index 8d81956ff..66a11370e 100644 --- a/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/AbstractLocProfileTest.java +++ b/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/AbstractLocProfileTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Java6Assertions.assertThat; -import io.reflectoring.coderadar.analyzer.loc.Loc; +import io.reflectoring.coderadar.analyzer.loc.LinesOfCode; import io.reflectoring.coderadar.analyzer.loc.LocAnalyzerPlugin; import io.reflectoring.coderadar.analyzer.loc.LocCounter; import java.io.IOException; @@ -12,7 +12,7 @@ public abstract class AbstractLocProfileTest { - Loc countLines(String path, LocProfile profile) throws IOException { + LinesOfCode countLines(String path, LocProfile profile) throws IOException { InputStream in = getClass().getResourceAsStream(path); assertThat(in).isNotNull(); ByteArrayOutputStream out = new ByteArrayOutputStream(); diff --git a/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/JavaLocProfileTest.java b/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/JavaLocProfileTest.java index e364e7ed0..56e00367e 100644 --- a/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/JavaLocProfileTest.java +++ b/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/JavaLocProfileTest.java @@ -2,17 +2,17 @@ import static org.assertj.core.api.Assertions.assertThat; -import io.reflectoring.coderadar.analyzer.loc.Loc; +import io.reflectoring.coderadar.analyzer.loc.LinesOfCode; import java.io.IOException; import org.junit.jupiter.api.Test; -public class JavaLocProfileTest extends AbstractLocProfileTest { +class JavaLocProfileTest extends AbstractLocProfileTest { - private LocProfile profile = new JavaLocProfile(); + private final LocProfile profile = new JavaLocProfile(); @Test - public void standard() throws IOException { - Loc loc = countLines("/testcode/java/standard.java.loctest", profile); + void standard() throws IOException { + LinesOfCode loc = countLines("/testcode/java/standard.java.loctest", profile); assertThat(loc.getLoc()).isEqualTo(7); assertThat(loc.getSloc()).isEqualTo(3); assertThat(loc.getEloc()).isEqualTo(2); @@ -20,8 +20,8 @@ public void standard() throws IOException { } @Test - public void nested() throws IOException { - Loc loc = countLines("/testcode/java/nested.java.loctest", profile); + void nested() throws IOException { + LinesOfCode loc = countLines("/testcode/java/nested.java.loctest", profile); assertThat(loc.getLoc()).isEqualTo(12); assertThat(loc.getSloc()).isEqualTo(5); assertThat(loc.getEloc()).isEqualTo(3); diff --git a/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/XmlLocProfileTest.java b/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/XmlLinesOfCodeProfileTest.java similarity index 57% rename from coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/XmlLocProfileTest.java rename to coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/XmlLinesOfCodeProfileTest.java index 59e514103..5ddd544e7 100644 --- a/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/XmlLocProfileTest.java +++ b/coderadar-plugins/loc-analyzer-plugin/src/test/java/io/reflectoring/coderadar/analyzer/loc/profiles/XmlLinesOfCodeProfileTest.java @@ -2,17 +2,17 @@ import static org.assertj.core.api.Assertions.assertThat; -import io.reflectoring.coderadar.analyzer.loc.Loc; +import io.reflectoring.coderadar.analyzer.loc.LinesOfCode; import java.io.IOException; import org.junit.jupiter.api.Test; -public class XmlLocProfileTest extends AbstractLocProfileTest { +class XmlLinesOfCodeProfileTest extends AbstractLocProfileTest { - private LocProfile profile = new XmlLocProfile(); + private final LocProfile profile = new XmlLocProfile(); @Test - public void standard() throws IOException { - Loc loc = countLines("/testcode/xml/standard.xml.loctest", profile); + void standard() throws IOException { + LinesOfCode loc = countLines("/testcode/xml/standard.xml.loctest", profile); assertThat(loc.getLoc()).isEqualTo(15); assertThat(loc.getSloc()).isEqualTo(10); assertThat(loc.getEloc()).isEqualTo(10); @@ -20,8 +20,8 @@ public void standard() throws IOException { } @Test - public void nested() throws IOException { - Loc loc = countLines("/testcode/xml/nested.xml.loctest", profile); + void nested() throws IOException { + LinesOfCode loc = countLines("/testcode/xml/nested.xml.loctest", profile); assertThat(loc.getLoc()).isEqualTo(15); assertThat(loc.getSloc()).isEqualTo(9); assertThat(loc.getEloc()).isEqualTo(9); diff --git a/coderadar-rest/build.gradle b/coderadar-rest/build.gradle index f1c254b36..ee8e902d7 100644 --- a/coderadar-rest/build.gradle +++ b/coderadar-rest/build.gradle @@ -1,4 +1,5 @@ apply plugin: "com.diffplug.gradle.spotless" +apply plugin: "jacoco" spotless { java { diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/ExceptionHandlerController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/ExceptionHandlerController.java index 902fb74d8..841dc937d 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/ExceptionHandlerController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/ExceptionHandlerController.java @@ -5,6 +5,8 @@ import io.reflectoring.coderadar.analyzer.MisconfigurationException; import io.reflectoring.coderadar.projectadministration.ProjectIsBeingProcessedException; import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.useradministration.service.UserUnauthenticatedException; +import io.reflectoring.coderadar.useradministration.service.UserUnauthorizedException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -20,6 +22,18 @@ public ResponseEntity projectProcessingException( new ErrorMessageResponse(e.getMessage()), HttpStatus.UNPROCESSABLE_ENTITY); } + @ExceptionHandler(UserUnauthenticatedException.class) + public ResponseEntity userUnauthenticatedException( + UserUnauthenticatedException e) { + return new ResponseEntity<>(new ErrorMessageResponse(e.getMessage()), HttpStatus.FORBIDDEN); + } + + @ExceptionHandler(UserUnauthorizedException.class) + public ResponseEntity userUnauthorizedException( + UserUnauthorizedException e) { + return new ResponseEntity<>(new ErrorMessageResponse(e.getMessage()), HttpStatus.UNAUTHORIZED); + } + @ExceptionHandler(EntityNotFoundException.class) public ResponseEntity entityNotFoundException(EntityNotFoundException e) { return new ResponseEntity<>(new ErrorMessageResponse(e.getMessage()), HttpStatus.NOT_FOUND); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetAnalyzerConfigurationResponseMapper.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetAnalyzerConfigurationResponseMapper.java new file mode 100644 index 000000000..7299bb2a7 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetAnalyzerConfigurationResponseMapper.java @@ -0,0 +1,24 @@ +package io.reflectoring.coderadar.rest; + +import io.reflectoring.coderadar.analyzer.domain.AnalyzerConfiguration; +import io.reflectoring.coderadar.rest.domain.GetAnalyzerConfigurationResponse; +import java.util.ArrayList; +import java.util.List; + +public class GetAnalyzerConfigurationResponseMapper { + private GetAnalyzerConfigurationResponseMapper() {} + + public static GetAnalyzerConfigurationResponse mapAnalyzerConfiguration( + AnalyzerConfiguration ac) { + return new GetAnalyzerConfigurationResponse(ac.getId(), ac.getAnalyzerName(), ac.isEnabled()); + } + + public static List mapAnalyzerConfigurations( + List analyzerConfigurations) { + List result = new ArrayList<>(analyzerConfigurations.size()); + for (AnalyzerConfiguration ac : analyzerConfigurations) { + result.add(mapAnalyzerConfiguration(ac)); + } + return result; + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetBranchResponseMapper.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetBranchResponseMapper.java new file mode 100644 index 000000000..08d693ee8 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetBranchResponseMapper.java @@ -0,0 +1,18 @@ +package io.reflectoring.coderadar.rest; + +import io.reflectoring.coderadar.projectadministration.domain.Branch; +import io.reflectoring.coderadar.rest.domain.GetBranchResponse; +import java.util.ArrayList; +import java.util.List; + +public class GetBranchResponseMapper { + private GetBranchResponseMapper() {} + + public static List mapBranches(List branches) { + List result = new ArrayList<>(branches.size()); + for (Branch branch : branches) { + result.add(new GetBranchResponse(branch.getName(), branch.getCommitHash(), branch.isTag())); + } + return result; + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetContributorResponseMapper.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetContributorResponseMapper.java new file mode 100644 index 000000000..2c923f88c --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetContributorResponseMapper.java @@ -0,0 +1,26 @@ +package io.reflectoring.coderadar.rest; + +import io.reflectoring.coderadar.contributor.domain.Contributor; +import io.reflectoring.coderadar.rest.domain.GetContributorResponse; +import java.util.ArrayList; +import java.util.List; + +public class GetContributorResponseMapper { + private GetContributorResponseMapper() {} + + public static GetContributorResponse mapContributor(Contributor contributor) { + return new GetContributorResponse( + contributor.getId(), + contributor.getDisplayName(), + contributor.getNames(), + contributor.getEmailAddresses()); + } + + public static List mapContributors(List contributors) { + List result = new ArrayList<>(contributors.size()); + for (Contributor c : contributors) { + result.add(mapContributor(c)); + } + return result; + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetFilePatternResponseMapper.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetFilePatternResponseMapper.java new file mode 100644 index 000000000..c19428eeb --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetFilePatternResponseMapper.java @@ -0,0 +1,23 @@ +package io.reflectoring.coderadar.rest; + +import io.reflectoring.coderadar.projectadministration.domain.FilePattern; +import io.reflectoring.coderadar.rest.domain.GetFilePatternResponse; +import java.util.ArrayList; +import java.util.List; + +public class GetFilePatternResponseMapper { + private GetFilePatternResponseMapper() {} + + public static GetFilePatternResponse mapFilePattern(FilePattern filePattern) { + return new GetFilePatternResponse( + filePattern.getId(), filePattern.getPattern(), filePattern.getInclusionType()); + } + + public static List mapFilePatterns(List filePatterns) { + List responses = new ArrayList<>(filePatterns.size()); + for (FilePattern filePattern : filePatterns) { + responses.add(mapFilePattern(filePattern)); + } + return responses; + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetModuleResponseMapper.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetModuleResponseMapper.java new file mode 100644 index 000000000..57b0b467d --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetModuleResponseMapper.java @@ -0,0 +1,22 @@ +package io.reflectoring.coderadar.rest; + +import io.reflectoring.coderadar.projectadministration.domain.Module; +import io.reflectoring.coderadar.rest.domain.GetModuleResponse; +import java.util.ArrayList; +import java.util.List; + +public class GetModuleResponseMapper { + private GetModuleResponseMapper() {} + + public static GetModuleResponse mapModule(Module module) { + return new GetModuleResponse(module.getId(), module.getPath()); + } + + public static List mapModules(List modules) { + List responses = new ArrayList<>(modules.size()); + for (Module module : modules) { + responses.add(mapModule(module)); + } + return responses; + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetProjectResponseMapper.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetProjectResponseMapper.java new file mode 100644 index 000000000..d3ad95d8f --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetProjectResponseMapper.java @@ -0,0 +1,28 @@ +package io.reflectoring.coderadar.rest; + +import io.reflectoring.coderadar.projectadministration.domain.Project; +import io.reflectoring.coderadar.rest.domain.GetProjectResponse; +import java.util.ArrayList; +import java.util.List; + +public class GetProjectResponseMapper { + private GetProjectResponseMapper() {} + + public static GetProjectResponse mapProject(Project project) { + return new GetProjectResponse() + .setName(project.getName()) + .setId(project.getId()) + .setStartDate(project.getVcsStart()) + .setVcsOnline(project.isVcsOnline()) + .setVcsUrl(project.getVcsUrl()) + .setVcsUsername(project.getVcsUsername()); + } + + public static List mapProjects(List projects) { + List responses = new ArrayList<>(projects.size()); + for (Project project : projects) { + responses.add(mapProject(project)); + } + return responses; + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetTeamResponseMapper.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetTeamResponseMapper.java new file mode 100644 index 000000000..eaeeb9419 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetTeamResponseMapper.java @@ -0,0 +1,24 @@ +package io.reflectoring.coderadar.rest; + +import static io.reflectoring.coderadar.rest.GetUserResponseMapper.mapUsers; + +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import io.reflectoring.coderadar.useradministration.domain.Team; +import java.util.ArrayList; +import java.util.List; + +public class GetTeamResponseMapper { + private GetTeamResponseMapper() {} + + public static GetTeamResponse mapTeam(Team team) { + return new GetTeamResponse(team.getId(), team.getName(), mapUsers(team.getMembers())); + } + + public static List mapTeams(List teams) { + List result = new ArrayList<>(teams.size()); + for (Team team : teams) { + result.add(mapTeam(team)); + } + return result; + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetUserResponseMapper.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetUserResponseMapper.java new file mode 100644 index 000000000..139f3329b --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/GetUserResponseMapper.java @@ -0,0 +1,22 @@ +package io.reflectoring.coderadar.rest; + +import io.reflectoring.coderadar.rest.domain.GetUserResponse; +import io.reflectoring.coderadar.useradministration.domain.User; +import java.util.ArrayList; +import java.util.List; + +public class GetUserResponseMapper { + private GetUserResponseMapper() {} + + public static GetUserResponse mapUser(User user) { + return new GetUserResponse(user.getId(), user.getUsername()); + } + + public static List mapUsers(List users) { + List result = new ArrayList<>(users.size()); + for (User user : users) { + result.add(mapUser(user)); + } + return result; + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/JsonListWrapper.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/JsonListWrapper.java new file mode 100644 index 000000000..2bb2d7f99 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/JsonListWrapper.java @@ -0,0 +1,14 @@ +package io.reflectoring.coderadar.rest; + +import java.util.List; +import javax.validation.constraints.NotEmpty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class JsonListWrapper { + @NotEmpty private List elements; +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/ProjectRoleJsonWrapper.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/ProjectRoleJsonWrapper.java new file mode 100644 index 000000000..91d75c885 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/ProjectRoleJsonWrapper.java @@ -0,0 +1,14 @@ +package io.reflectoring.coderadar.rest; + +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ProjectRoleJsonWrapper { + @NotNull private ProjectRole role; +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/CreateAnalyzerConfigurationController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/CreateAnalyzerConfigurationController.java index fdf601301..a6c0f925f 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/CreateAnalyzerConfigurationController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/CreateAnalyzerConfigurationController.java @@ -6,6 +6,7 @@ import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; import io.reflectoring.coderadar.rest.domain.IdResponse; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -20,10 +21,13 @@ @RestController public class CreateAnalyzerConfigurationController implements AbstractBaseController { private final CreateAnalyzerConfigurationUseCase createAnalyzerConfigurationUseCase; + private final AuthenticationService authenticationService; public CreateAnalyzerConfigurationController( - CreateAnalyzerConfigurationUseCase addAnalyzerConfigurationUseCase) { + CreateAnalyzerConfigurationUseCase addAnalyzerConfigurationUseCase, + AuthenticationService authenticationService) { this.createAnalyzerConfigurationUseCase = addAnalyzerConfigurationUseCase; + this.authenticationService = authenticationService; } @PostMapping( @@ -33,6 +37,7 @@ public CreateAnalyzerConfigurationController( public ResponseEntity addAnalyzerConfiguration( @RequestBody @Validated CreateAnalyzerConfigurationCommand command, @PathVariable long projectId) { + authenticationService.authenticateAdmin(projectId); try { return new ResponseEntity<>( new IdResponse(createAnalyzerConfigurationUseCase.create(command, projectId)), diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/DeleteAnalyzerConfigurationController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/DeleteAnalyzerConfigurationController.java index 2130464e0..94ef600b3 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/DeleteAnalyzerConfigurationController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/DeleteAnalyzerConfigurationController.java @@ -2,6 +2,7 @@ import io.reflectoring.coderadar.projectadministration.port.driver.analyzerconfig.delete.DeleteAnalyzerConfigurationUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; @@ -13,16 +14,20 @@ @RestController public class DeleteAnalyzerConfigurationController implements AbstractBaseController { private final DeleteAnalyzerConfigurationUseCase deleteAnalyzerConfigurationUseCase; + private final AuthenticationService authenticationService; public DeleteAnalyzerConfigurationController( - DeleteAnalyzerConfigurationUseCase deleteAnalyzerConfigurationUseCase) { + DeleteAnalyzerConfigurationUseCase deleteAnalyzerConfigurationUseCase, + AuthenticationService authenticationService) { this.deleteAnalyzerConfigurationUseCase = deleteAnalyzerConfigurationUseCase; + this.authenticationService = authenticationService; } @DeleteMapping(path = "/projects/{projectId}/analyzers/{analyzerConfigurationId}") public ResponseEntity deleteAnalyzerConfiguration( @PathVariable("analyzerConfigurationId") long analyzerConfigurationId, @PathVariable("projectId") long projectId) { + authenticationService.authenticateAdmin(projectId); deleteAnalyzerConfigurationUseCase.deleteAnalyzerConfiguration( analyzerConfigurationId, projectId); return new ResponseEntity<>(HttpStatus.OK); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/GetAnalyzerConfigurationController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/GetAnalyzerConfigurationController.java index 441240a79..8b4e9f9ef 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/GetAnalyzerConfigurationController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/GetAnalyzerConfigurationController.java @@ -1,9 +1,12 @@ package io.reflectoring.coderadar.rest.analyzerconfig; +import static io.reflectoring.coderadar.rest.GetAnalyzerConfigurationResponseMapper.mapAnalyzerConfiguration; + import io.reflectoring.coderadar.analyzer.domain.AnalyzerConfiguration; import io.reflectoring.coderadar.projectadministration.port.driver.analyzerconfig.get.GetAnalyzerConfigurationUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetAnalyzerConfigurationResponse; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -16,24 +19,23 @@ @RestController public class GetAnalyzerConfigurationController implements AbstractBaseController { private final GetAnalyzerConfigurationUseCase getAnalyzerConfigurationUseCase; + private final AuthenticationService authenticationService; public GetAnalyzerConfigurationController( - GetAnalyzerConfigurationUseCase getAnalyzerConfigurationUseCase) { + GetAnalyzerConfigurationUseCase getAnalyzerConfigurationUseCase, + AuthenticationService authenticationService) { this.getAnalyzerConfigurationUseCase = getAnalyzerConfigurationUseCase; + this.authenticationService = authenticationService; } @GetMapping( path = "/projects/{projectId}/analyzers/{analyzerConfigurationId}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getAnalyzerConfiguration( - @PathVariable long analyzerConfigurationId) { + @PathVariable long projectId, @PathVariable long analyzerConfigurationId) { AnalyzerConfiguration analyzerConfiguration = getAnalyzerConfigurationUseCase.getAnalyzerConfiguration(analyzerConfigurationId); - return new ResponseEntity<>( - new GetAnalyzerConfigurationResponse( - analyzerConfiguration.getId(), - analyzerConfiguration.getAnalyzerName(), - analyzerConfiguration.isEnabled()), - HttpStatus.OK); + authenticationService.authenticateMember(projectId); + return new ResponseEntity<>(mapAnalyzerConfiguration(analyzerConfiguration), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/ListAnalyzerConfigurationsFromProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/ListAnalyzerConfigurationsFromProjectController.java index 6e5419057..b878bb962 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/ListAnalyzerConfigurationsFromProjectController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/ListAnalyzerConfigurationsFromProjectController.java @@ -1,10 +1,13 @@ package io.reflectoring.coderadar.rest.analyzerconfig; +import static io.reflectoring.coderadar.rest.GetAnalyzerConfigurationResponseMapper.mapAnalyzerConfigurations; + +import io.reflectoring.coderadar.analyzer.domain.AnalyzerConfiguration; import io.reflectoring.coderadar.projectadministration.port.driver.analyzerconfig.get.ListAnalyzerConfigurationsUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetAnalyzerConfigurationResponse; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import java.util.List; -import java.util.stream.Collectors; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -17,24 +20,21 @@ @RestController public class ListAnalyzerConfigurationsFromProjectController implements AbstractBaseController { private final ListAnalyzerConfigurationsUseCase listAnalyzerConfigurationsUseCase; + private final AuthenticationService authenticationService; public ListAnalyzerConfigurationsFromProjectController( - ListAnalyzerConfigurationsUseCase listAnalyzerConfigurationsUseCase) { + ListAnalyzerConfigurationsUseCase listAnalyzerConfigurationsUseCase, + AuthenticationService authenticationService) { this.listAnalyzerConfigurationsUseCase = listAnalyzerConfigurationsUseCase; + this.authenticationService = authenticationService; } @GetMapping(path = "/projects/{projectId}/analyzers", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> getAnalyzerConfigurationsFromProject(@PathVariable long projectId) { - return new ResponseEntity<>( - listAnalyzerConfigurationsUseCase.get(projectId).stream() - .map( - analyzerConfiguration -> - new GetAnalyzerConfigurationResponse( - analyzerConfiguration.getId(), - analyzerConfiguration.getAnalyzerName(), - analyzerConfiguration.isEnabled())) - .collect(Collectors.toList()), - HttpStatus.OK); + authenticationService.authenticateMember(projectId); + List analyzerConfigurations = + listAnalyzerConfigurationsUseCase.get(projectId); + return new ResponseEntity<>(mapAnalyzerConfigurations(analyzerConfigurations), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/UpdateAnalyzerConfigurationController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/UpdateAnalyzerConfigurationController.java index 9b99b86f6..bac6cc0d3 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/UpdateAnalyzerConfigurationController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzerconfig/UpdateAnalyzerConfigurationController.java @@ -5,6 +5,7 @@ import io.reflectoring.coderadar.projectadministration.port.driver.analyzerconfig.update.UpdateAnalyzerConfigurationUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -19,10 +20,13 @@ @RestController public class UpdateAnalyzerConfigurationController implements AbstractBaseController { private final UpdateAnalyzerConfigurationUseCase updateAnalyzerConfigurationUseCase; + private final AuthenticationService authenticationService; public UpdateAnalyzerConfigurationController( - UpdateAnalyzerConfigurationUseCase updateAnalyzerConfigurationUseCase) { + UpdateAnalyzerConfigurationUseCase updateAnalyzerConfigurationUseCase, + AuthenticationService authenticationService) { this.updateAnalyzerConfigurationUseCase = updateAnalyzerConfigurationUseCase; + this.authenticationService = authenticationService; } @PostMapping( @@ -33,6 +37,7 @@ public ResponseEntity updateAnalyzerConfiguration( @RequestBody @Validated UpdateAnalyzerConfigurationCommand command, @PathVariable(name = "analyzerConfigurationId") long analyzerConfigurationId, @PathVariable(name = "projectId") long projectId) { + authenticationService.authenticateAdmin(projectId); try { updateAnalyzerConfigurationUseCase.update(command, analyzerConfigurationId, projectId); return new ResponseEntity<>(HttpStatus.OK); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/GetAnalyzingStatusController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/GetAnalyzingStatusController.java index 97cee154d..4293e0032 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/GetAnalyzingStatusController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/GetAnalyzingStatusController.java @@ -3,7 +3,9 @@ import io.reflectoring.coderadar.analyzer.port.driver.GetAnalyzingStatusUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetAnalyzingStatusResponse; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; @@ -14,14 +16,21 @@ @RestController public class GetAnalyzingStatusController implements AbstractBaseController { private final GetAnalyzingStatusUseCase getAnalyzingStatusUseCase; + private final AuthenticationService authenticationService; - public GetAnalyzingStatusController(GetAnalyzingStatusUseCase getAnalyzingStatusUseCase) { + public GetAnalyzingStatusController( + GetAnalyzingStatusUseCase getAnalyzingStatusUseCase, + AuthenticationService authenticationService) { this.getAnalyzingStatusUseCase = getAnalyzingStatusUseCase; + this.authenticationService = authenticationService; } - @GetMapping(path = "/projects/{projectId}/analyzingStatus") + @GetMapping( + path = "/projects/{projectId}/analyzingStatus", + produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getProjectAnalyzingStatus( @PathVariable("projectId") long projectId) { + authenticationService.authenticateMember(projectId); return new ResponseEntity<>( new GetAnalyzingStatusResponse(getAnalyzingStatusUseCase.getStatus(projectId)), HttpStatus.OK); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/ResetAnalysisController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/ResetAnalysisController.java index 4c71f0c39..435e4224a 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/ResetAnalysisController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/ResetAnalysisController.java @@ -2,6 +2,7 @@ import io.reflectoring.coderadar.analyzer.port.driver.ResetAnalysisUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; @@ -13,13 +14,17 @@ @RestController public class ResetAnalysisController implements AbstractBaseController { private final ResetAnalysisUseCase resetAnalysisUseCase; + private final AuthenticationService authenticationService; - public ResetAnalysisController(ResetAnalysisUseCase resetAnalysisUseCase) { + public ResetAnalysisController( + ResetAnalysisUseCase resetAnalysisUseCase, AuthenticationService authenticationService) { this.resetAnalysisUseCase = resetAnalysisUseCase; + this.authenticationService = authenticationService; } @PostMapping(path = "projects/{projectId}/analyze/reset") public ResponseEntity resetAnalysis(@PathVariable("projectId") long projectId) { + authenticationService.authenticateAdmin(projectId); resetAnalysisUseCase.resetAnalysis(projectId); return new ResponseEntity<>(HttpStatus.OK); } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/StartAnalyzingController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/StartAnalyzingController.java index 568817028..a156dbb29 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/StartAnalyzingController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/StartAnalyzingController.java @@ -2,6 +2,7 @@ import io.reflectoring.coderadar.analyzer.port.driver.StartAnalyzingUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -16,15 +17,19 @@ @RestController public class StartAnalyzingController implements AbstractBaseController { private final StartAnalyzingUseCase startAnalyzingUseCase; + private final AuthenticationService authenticationService; - public StartAnalyzingController(StartAnalyzingUseCase startAnalyzingUseCase) { + public StartAnalyzingController( + StartAnalyzingUseCase startAnalyzingUseCase, AuthenticationService authenticationService) { this.startAnalyzingUseCase = startAnalyzingUseCase; + this.authenticationService = authenticationService; } @PostMapping(path = "projects/{projectId}/analyze", consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity startAnalyzing( @PathVariable("projectId") long projectId, @RequestBody(required = false) List branches) { + authenticationService.authenticateMember(projectId); if (branches != null && !branches.isEmpty()) { startAnalyzingUseCase.start(projectId, branches); } else { diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/StopAnalyzingController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/StopAnalyzingController.java index 187e49b1e..e21956ac2 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/StopAnalyzingController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/analyzing/StopAnalyzingController.java @@ -3,6 +3,7 @@ import io.reflectoring.coderadar.analyzer.AnalysisNotRunningException; import io.reflectoring.coderadar.analyzer.port.driver.StopAnalyzingUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; @@ -14,13 +15,17 @@ @RestController public class StopAnalyzingController implements AbstractBaseController { private final StopAnalyzingUseCase stopAnalyzingUseCase; + private final AuthenticationService authenticationService; - public StopAnalyzingController(StopAnalyzingUseCase stopAnalyzingUseCase) { + public StopAnalyzingController( + StopAnalyzingUseCase stopAnalyzingUseCase, AuthenticationService authenticationService) { this.stopAnalyzingUseCase = stopAnalyzingUseCase; + this.authenticationService = authenticationService; } @GetMapping(path = "projects/{projectId}/stopAnalysis") public ResponseEntity stopAnalyzing(@PathVariable("projectId") long projectId) { + authenticationService.authenticateMember(projectId); try { stopAnalyzingUseCase.stop(projectId); } catch (AnalysisNotRunningException e) { diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/branch/ListBranchesController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/branch/ListBranchesController.java index d7d3a8b29..58c425dc5 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/branch/ListBranchesController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/branch/ListBranchesController.java @@ -1,10 +1,12 @@ package io.reflectoring.coderadar.rest.branch; +import static io.reflectoring.coderadar.rest.GetBranchResponseMapper.mapBranches; + import io.reflectoring.coderadar.projectadministration.domain.Branch; import io.reflectoring.coderadar.projectadministration.port.driver.branch.list.ListBranchesUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetBranchResponse; -import java.util.ArrayList; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -18,19 +20,18 @@ @RestController public class ListBranchesController implements AbstractBaseController { private final ListBranchesUseCase listBranchesUseCase; + private final AuthenticationService authenticationService; - public ListBranchesController(ListBranchesUseCase listBranchesUseCase) { + public ListBranchesController( + ListBranchesUseCase listBranchesUseCase, AuthenticationService authenticationService) { this.listBranchesUseCase = listBranchesUseCase; + this.authenticationService = authenticationService; } @GetMapping(path = "/projects/{projectId}/branches", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> listBranches(@PathVariable long projectId) { + authenticationService.authenticateMember(projectId); List branches = listBranchesUseCase.listBranchesInProject(projectId); - List responses = new ArrayList<>(branches.size()); - for (Branch branch : branches) { - responses.add( - new GetBranchResponse(branch.getName(), branch.getCommitHash(), branch.isTag())); - } - return new ResponseEntity<>(responses, HttpStatus.OK); + return new ResponseEntity<>(mapBranches(branches), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/GetContributorController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/GetContributorController.java index a05ebfba5..9016007d7 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/GetContributorController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/GetContributorController.java @@ -1,10 +1,12 @@ package io.reflectoring.coderadar.rest.contributor; -import io.reflectoring.coderadar.contributor.domain.Contributor; +import static io.reflectoring.coderadar.rest.GetContributorResponseMapper.mapContributor; + import io.reflectoring.coderadar.contributor.port.driver.GetContributorUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetContributorResponse; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; @@ -20,16 +22,8 @@ public GetContributorController(GetContributorUseCase getContributorUseCase) { this.getContributorUseCase = getContributorUseCase; } - @GetMapping(path = "/contributors/{id}") + @GetMapping(path = "/contributors/{id}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getById(@PathVariable long id) { - return new ResponseEntity<>(map(getContributorUseCase.getById(id)), HttpStatus.OK); - } - - private GetContributorResponse map(Contributor contributor) { - return new GetContributorResponse( - contributor.getId(), - contributor.getDisplayName(), - contributor.getNames(), - contributor.getEmailAddresses()); + return new ResponseEntity<>(mapContributor(getContributorUseCase.getById(id)), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/ListContributorsController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/ListContributorsController.java index dee5f0656..28fd24bd0 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/ListContributorsController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/ListContributorsController.java @@ -1,11 +1,12 @@ package io.reflectoring.coderadar.rest.contributor; -import io.reflectoring.coderadar.contributor.domain.Contributor; +import static io.reflectoring.coderadar.rest.GetContributorResponseMapper.mapContributors; + import io.reflectoring.coderadar.contributor.port.driver.GetContributorsForPathCommand; import io.reflectoring.coderadar.contributor.port.driver.ListContributorsUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetContributorResponse; -import java.util.ArrayList; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -18,9 +19,13 @@ @RestController public class ListContributorsController implements AbstractBaseController { private final ListContributorsUseCase listContributorsUseCase; + private final AuthenticationService authenticationService; - public ListContributorsController(ListContributorsUseCase listContributorsUseCase) { + public ListContributorsController( + ListContributorsUseCase listContributorsUseCase, + AuthenticationService authenticationService) { this.listContributorsUseCase = listContributorsUseCase; + this.authenticationService = authenticationService; } @GetMapping( @@ -28,8 +33,9 @@ public ListContributorsController(ListContributorsUseCase listContributorsUseCas produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> listContributors( @PathVariable long projectId) { + authenticationService.authenticateMember(projectId); return new ResponseEntity<>( - map(listContributorsUseCase.listContributors(projectId)), HttpStatus.OK); + mapContributors(listContributorsUseCase.listContributors(projectId)), HttpStatus.OK); } @RequestMapping( @@ -40,20 +46,8 @@ public ResponseEntity> listContributors( public ResponseEntity> listContributorsForFile( @PathVariable long projectId, @RequestBody @Validated GetContributorsForPathCommand command) { return new ResponseEntity<>( - map(listContributorsUseCase.listContributorsForProjectAndPathInCommit(projectId, command)), + mapContributors( + listContributorsUseCase.listContributorsForProjectAndPathInCommit(projectId, command)), HttpStatus.OK); } - - private List map(List contributors) { - List result = new ArrayList<>(contributors.size()); - for (Contributor c : contributors) { - GetContributorResponse responseItem = new GetContributorResponse(); - responseItem.setId(c.getId()); - responseItem.setDisplayName(c.getDisplayName()); - responseItem.setNames(c.getNames()); - responseItem.setEmailAddresses(c.getEmailAddresses()); - result.add(responseItem); - } - return result; - } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/MergeContributorsController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/MergeContributorsController.java index 90d5bc1c6..35b412886 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/MergeContributorsController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/MergeContributorsController.java @@ -21,10 +21,7 @@ public MergeContributorsController(MergeContributorsUseCase mergeContributorsUse this.mergeContributorsUseCase = mergeContributorsUseCase; } - @PostMapping( - path = "/contributors/merge", - consumes = MediaType.APPLICATION_JSON_VALUE, - produces = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(path = "/contributors/merge", consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity mergeContributors( @RequestBody @Validated MergeContributorsCommand command) { mergeContributorsUseCase.mergeContributors(command); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/UpdateContributorController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/UpdateContributorController.java index 4f40be7ad..e4bddd85b 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/UpdateContributorController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/contributor/UpdateContributorController.java @@ -22,10 +22,7 @@ public UpdateContributorController(UpdateContributorUseCase updateContributorUse this.updateContributorUseCase = updateContributorUseCase; } - @PostMapping( - path = "/contributors/{id}", - consumes = MediaType.APPLICATION_JSON_VALUE, - produces = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(path = "/contributors/{id}", consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity updateContributor( @PathVariable long id, @RequestBody @Validated UpdateContributorCommand command) { updateContributorUseCase.updateContributor(id, command); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/dependencymap/DependencyCompareTreeController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/dependencymap/DependencyCompareTreeController.java index 2544c70a3..79fa52d89 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/dependencymap/DependencyCompareTreeController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/dependencymap/DependencyCompareTreeController.java @@ -2,6 +2,7 @@ import io.reflectoring.coderadar.dependencymap.port.driver.GetCompareTreeUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -15,10 +16,13 @@ public class DependencyCompareTreeController implements AbstractBaseController { private final GetCompareTreeUseCase getCompareTreeUseCase; + private final AuthenticationService authenticationService; @Autowired - public DependencyCompareTreeController(GetCompareTreeUseCase getCompareTreeUseCase) { + public DependencyCompareTreeController( + GetCompareTreeUseCase getCompareTreeUseCase, AuthenticationService authenticationService) { this.getCompareTreeUseCase = getCompareTreeUseCase; + this.authenticationService = authenticationService; } @GetMapping( @@ -28,6 +32,7 @@ public ResponseEntity getDependencyTree( @PathVariable("projectId") Long projectId, @PathVariable("commitName") String commitName, @PathVariable("secondCommit") String secondCommit) { + authenticationService.authenticateMember(projectId); return ResponseEntity.ok( getCompareTreeUseCase.getDependencyTree(projectId, commitName, secondCommit)); } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/dependencymap/DependencyTreeController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/dependencymap/DependencyTreeController.java index 99ed59bfc..b093cfa48 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/dependencymap/DependencyTreeController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/dependencymap/DependencyTreeController.java @@ -2,6 +2,7 @@ import io.reflectoring.coderadar.dependencymap.port.driver.GetDependencyTreeUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -15,10 +16,14 @@ public class DependencyTreeController implements AbstractBaseController { private final GetDependencyTreeUseCase getDependencyTreeUseCase; + private final AuthenticationService authenticationService; @Autowired - public DependencyTreeController(GetDependencyTreeUseCase getDependencyTreeUseCase) { + public DependencyTreeController( + GetDependencyTreeUseCase getDependencyTreeUseCase, + AuthenticationService authenticationService) { this.getDependencyTreeUseCase = getDependencyTreeUseCase; + this.authenticationService = authenticationService; } @GetMapping( @@ -26,6 +31,7 @@ public DependencyTreeController(GetDependencyTreeUseCase getDependencyTreeUseCas value = "/analyzers/{projectId}/structureMap/{commitName}") public ResponseEntity getDependencyTree( @PathVariable("projectId") Long projectId, @PathVariable("commitName") String commitName) { + authenticationService.authenticateMember(projectId); return ResponseEntity.ok(getDependencyTreeUseCase.getDependencyTree(projectId, commitName)); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/domain/GetProjectResponse.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/domain/GetProjectResponse.java index 066172d99..fb10c32db 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/domain/GetProjectResponse.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/domain/GetProjectResponse.java @@ -12,5 +12,4 @@ public class GetProjectResponse { private String vcsUrl; private boolean vcsOnline; private Date startDate; - private Date endDate; } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/domain/GetTeamResponse.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/domain/GetTeamResponse.java new file mode 100644 index 000000000..d08e0a915 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/domain/GetTeamResponse.java @@ -0,0 +1,15 @@ +package io.reflectoring.coderadar.rest.domain; + +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GetTeamResponse { + private long id; + private String name; + private List members; +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/CreateFilePatternController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/CreateFilePatternController.java index d3318603b..d70786b66 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/CreateFilePatternController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/CreateFilePatternController.java @@ -4,6 +4,7 @@ import io.reflectoring.coderadar.projectadministration.port.driver.filepattern.create.CreateFilePatternUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.IdResponse; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -18,9 +19,13 @@ @RestController public class CreateFilePatternController implements AbstractBaseController { private final CreateFilePatternUseCase createFilePatternUseCase; + private final AuthenticationService authenticationService; - public CreateFilePatternController(CreateFilePatternUseCase createFilePatternUseCase) { + public CreateFilePatternController( + CreateFilePatternUseCase createFilePatternUseCase, + AuthenticationService authenticationService) { this.createFilePatternUseCase = createFilePatternUseCase; + this.authenticationService = authenticationService; } @PostMapping( @@ -30,6 +35,7 @@ public CreateFilePatternController(CreateFilePatternUseCase createFilePatternUse public ResponseEntity createFilePattern( @RequestBody @Validated CreateFilePatternCommand command, @PathVariable(name = "projectId") long projectId) { + authenticationService.authenticateAdmin(projectId); return new ResponseEntity<>( new IdResponse(createFilePatternUseCase.createFilePattern(command, projectId)), HttpStatus.CREATED); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/DeleteFilePatternController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/DeleteFilePatternController.java index 8fa16c407..6f9af8646 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/DeleteFilePatternController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/DeleteFilePatternController.java @@ -2,6 +2,7 @@ import io.reflectoring.coderadar.projectadministration.port.driver.filepattern.delete.DeleteFilePatternFromProjectUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; @@ -13,16 +14,20 @@ @RestController public class DeleteFilePatternController implements AbstractBaseController { private final DeleteFilePatternFromProjectUseCase deleteFilePatternFromProjectUseCase; + private final AuthenticationService authenticationService; public DeleteFilePatternController( - DeleteFilePatternFromProjectUseCase deleteFilePatternFromProjectUseCase) { + DeleteFilePatternFromProjectUseCase deleteFilePatternFromProjectUseCase, + AuthenticationService authenticationService) { this.deleteFilePatternFromProjectUseCase = deleteFilePatternFromProjectUseCase; + this.authenticationService = authenticationService; } @DeleteMapping(path = "/projects/{projectId}/filePatterns/{filePatternId}") public ResponseEntity deleteFilePattern( @PathVariable(name = "filePatternId") long filePatternId, @PathVariable(name = "projectId") long projectId) { + authenticationService.authenticateAdmin(projectId); deleteFilePatternFromProjectUseCase.delete(filePatternId, projectId); return new ResponseEntity<>(HttpStatus.OK); } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/GetFilePatternController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/GetFilePatternController.java index 9b3645096..82c7c6601 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/GetFilePatternController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/GetFilePatternController.java @@ -1,9 +1,12 @@ package io.reflectoring.coderadar.rest.filepattern; +import static io.reflectoring.coderadar.rest.GetFilePatternResponseMapper.mapFilePattern; + import io.reflectoring.coderadar.projectadministration.domain.FilePattern; import io.reflectoring.coderadar.projectadministration.port.driver.filepattern.get.GetFilePatternUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetFilePatternResponse; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -16,20 +19,22 @@ @RestController public class GetFilePatternController implements AbstractBaseController { private final GetFilePatternUseCase getFilePatternUseCase; + private final AuthenticationService authenticationService; - public GetFilePatternController(GetFilePatternUseCase getFilePatternUseCase) { + public GetFilePatternController( + GetFilePatternUseCase getFilePatternUseCase, AuthenticationService authenticationService) { this.getFilePatternUseCase = getFilePatternUseCase; + this.authenticationService = authenticationService; } @GetMapping( path = "/projects/{projectId}/filePatterns/{filePatternId}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getFilePattern( + @PathVariable(name = "projectId") long projectId, @PathVariable(name = "filePatternId") long filePatternId) { + authenticationService.authenticateMember(projectId); FilePattern filePattern = getFilePatternUseCase.get(filePatternId); - return new ResponseEntity<>( - new GetFilePatternResponse( - filePatternId, filePattern.getPattern(), filePattern.getInclusionType()), - HttpStatus.OK); + return new ResponseEntity<>(mapFilePattern(filePattern), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/ListFilePatternsOfProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/ListFilePatternsOfProjectController.java index e877c3fc1..4ed3bb690 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/ListFilePatternsOfProjectController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/filepattern/ListFilePatternsOfProjectController.java @@ -1,10 +1,12 @@ package io.reflectoring.coderadar.rest.filepattern; +import static io.reflectoring.coderadar.rest.GetFilePatternResponseMapper.mapFilePatterns; + import io.reflectoring.coderadar.projectadministration.domain.FilePattern; import io.reflectoring.coderadar.projectadministration.port.driver.filepattern.get.ListFilePatternsOfProjectUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetFilePatternResponse; -import java.util.ArrayList; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -18,10 +20,13 @@ @RestController public class ListFilePatternsOfProjectController implements AbstractBaseController { private final ListFilePatternsOfProjectUseCase listFilePatternsOfProjectUseCase; + private final AuthenticationService authenticationService; public ListFilePatternsOfProjectController( - ListFilePatternsOfProjectUseCase listFilePatternsOfProjectUseCase) { + ListFilePatternsOfProjectUseCase listFilePatternsOfProjectUseCase, + AuthenticationService authenticationService) { this.listFilePatternsOfProjectUseCase = listFilePatternsOfProjectUseCase; + this.authenticationService = authenticationService; } @GetMapping( @@ -29,13 +34,8 @@ public ListFilePatternsOfProjectController( produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> listFilePatterns( @PathVariable long projectId) { + authenticationService.authenticateMember(projectId); List filePatterns = listFilePatternsOfProjectUseCase.listFilePatterns(projectId); - List responses = new ArrayList<>(filePatterns.size()); - for (FilePattern filePattern : filePatterns) { - responses.add( - new GetFilePatternResponse( - filePattern.getId(), filePattern.getPattern(), filePattern.getInclusionType())); - } - return new ResponseEntity<>(responses, HttpStatus.OK); + return new ResponseEntity<>(mapFilePatterns(filePatterns), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/CreateModuleController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/CreateModuleController.java index 93ae12a85..c548b5d12 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/CreateModuleController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/CreateModuleController.java @@ -6,6 +6,7 @@ import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; import io.reflectoring.coderadar.rest.domain.IdResponse; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -20,9 +21,12 @@ @RestController public class CreateModuleController implements AbstractBaseController { private final CreateModuleUseCase createModuleUseCase; + private final AuthenticationService authenticationService; - public CreateModuleController(CreateModuleUseCase createModuleUseCase) { + public CreateModuleController( + CreateModuleUseCase createModuleUseCase, AuthenticationService authenticationService) { this.createModuleUseCase = createModuleUseCase; + this.authenticationService = authenticationService; } @PostMapping( @@ -32,6 +36,7 @@ public CreateModuleController(CreateModuleUseCase createModuleUseCase) { public ResponseEntity createModule( @RequestBody @Validated CreateModuleCommand command, @PathVariable(name = "projectId") long projectId) { + authenticationService.authenticateAdmin(projectId); try { return new ResponseEntity<>( new IdResponse(createModuleUseCase.createModule(command, projectId)), HttpStatus.CREATED); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/DeleteModuleController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/DeleteModuleController.java index c7756c065..0e78206e6 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/DeleteModuleController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/DeleteModuleController.java @@ -2,6 +2,7 @@ import io.reflectoring.coderadar.projectadministration.port.driver.module.delete.DeleteModuleUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; @@ -13,15 +14,19 @@ @RestController public class DeleteModuleController implements AbstractBaseController { private final DeleteModuleUseCase deleteModuleUseCase; + private final AuthenticationService authenticationService; - public DeleteModuleController(DeleteModuleUseCase deleteModuleUseCase) { + public DeleteModuleController( + DeleteModuleUseCase deleteModuleUseCase, AuthenticationService authenticationService) { this.deleteModuleUseCase = deleteModuleUseCase; + this.authenticationService = authenticationService; } @DeleteMapping(path = "/projects/{projectId}/modules/{moduleId}") public ResponseEntity deleteModule( @PathVariable(name = "moduleId") long moduleId, @PathVariable(name = "projectId") long projectId) { + authenticationService.authenticateAdmin(projectId); deleteModuleUseCase.delete(moduleId, projectId); return new ResponseEntity<>(HttpStatus.OK); } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/GetModuleController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/GetModuleController.java index d53dc6893..0a68de4c2 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/GetModuleController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/GetModuleController.java @@ -1,8 +1,11 @@ package io.reflectoring.coderadar.rest.module; +import static io.reflectoring.coderadar.rest.GetModuleResponseMapper.mapModule; + import io.reflectoring.coderadar.projectadministration.port.driver.module.get.GetModuleUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetModuleResponse; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -15,17 +18,21 @@ @RestController public class GetModuleController implements AbstractBaseController { private final GetModuleUseCase getModuleUseCase; + private final AuthenticationService authenticationService; - public GetModuleController(GetModuleUseCase getModuleUseCase) { + public GetModuleController( + GetModuleUseCase getModuleUseCase, AuthenticationService authenticationService) { this.getModuleUseCase = getModuleUseCase; + this.authenticationService = authenticationService; } @GetMapping( path = "/projects/{projectId}/modules/{moduleId}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getModule( + @PathVariable(name = "projectId") long projectId, @PathVariable(name = "moduleId") long moduleId) { - return new ResponseEntity<>( - new GetModuleResponse(moduleId, getModuleUseCase.get(moduleId).getPath()), HttpStatus.OK); + authenticationService.authenticateMember(projectId); + return new ResponseEntity<>(mapModule(getModuleUseCase.get(moduleId)), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/ListModulesOfProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/ListModulesOfProjectController.java index 65a67738b..e558565de 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/ListModulesOfProjectController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/module/ListModulesOfProjectController.java @@ -1,10 +1,12 @@ package io.reflectoring.coderadar.rest.module; +import static io.reflectoring.coderadar.rest.GetModuleResponseMapper.mapModules; + import io.reflectoring.coderadar.projectadministration.domain.Module; import io.reflectoring.coderadar.projectadministration.port.driver.module.get.ListModulesOfProjectUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetModuleResponse; -import java.util.ArrayList; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -18,18 +20,19 @@ @RestController public class ListModulesOfProjectController implements AbstractBaseController { private final ListModulesOfProjectUseCase listModulesOfProjectUseCase; + private final AuthenticationService authenticationService; - public ListModulesOfProjectController(ListModulesOfProjectUseCase listModulesOfProjectUseCase) { + public ListModulesOfProjectController( + ListModulesOfProjectUseCase listModulesOfProjectUseCase, + AuthenticationService authenticationService) { this.listModulesOfProjectUseCase = listModulesOfProjectUseCase; + this.authenticationService = authenticationService; } @GetMapping(path = "/projects/{projectId}/modules", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> listModules(@PathVariable long projectId) { + authenticationService.authenticateMember(projectId); List modules = listModulesOfProjectUseCase.listModules(projectId); - List responses = new ArrayList<>(modules.size()); - for (Module module : modules) { - responses.add(new GetModuleResponse(module.getId(), module.getPath())); - } - return new ResponseEntity<>(responses, HttpStatus.OK); + return new ResponseEntity<>(mapModules(modules), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/CreateProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/CreateProjectController.java index 2074599bd..7659c9a1d 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/CreateProjectController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/CreateProjectController.java @@ -20,6 +20,7 @@ public class CreateProjectController implements AbstractBaseController { private final CreateProjectUseCase createProjectUseCase; public CreateProjectController(CreateProjectUseCase createProjectUseCase) { + this.createProjectUseCase = createProjectUseCase; } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/DeleteProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/DeleteProjectController.java index 9595163e8..f81b66460 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/DeleteProjectController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/DeleteProjectController.java @@ -2,6 +2,7 @@ import io.reflectoring.coderadar.projectadministration.port.driver.project.delete.DeleteProjectUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; @@ -13,14 +14,19 @@ @RestController public class DeleteProjectController implements AbstractBaseController { private final DeleteProjectUseCase deleteProjectUseCase; + private final AuthenticationService authenticationService; + + public DeleteProjectController( + DeleteProjectUseCase deleteProjectUseCase, AuthenticationService authenticationService) { - public DeleteProjectController(DeleteProjectUseCase deleteProjectUseCase) { this.deleteProjectUseCase = deleteProjectUseCase; + this.authenticationService = authenticationService; } @DeleteMapping(path = "/projects/{projectId}") public ResponseEntity deleteProject( @PathVariable(name = "projectId") long projectId) { + authenticationService.authenticateAdmin(projectId); deleteProjectUseCase.delete(projectId); return new ResponseEntity<>(HttpStatus.OK); } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/GetProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/GetProjectController.java index 70543ef5f..e371ad6b6 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/GetProjectController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/GetProjectController.java @@ -1,9 +1,12 @@ package io.reflectoring.coderadar.rest.project; +import static io.reflectoring.coderadar.rest.GetProjectResponseMapper.mapProject; + import io.reflectoring.coderadar.projectadministration.domain.Project; import io.reflectoring.coderadar.projectadministration.port.driver.project.get.GetProjectUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetProjectResponse; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -16,21 +19,19 @@ @RestController public class GetProjectController implements AbstractBaseController { private final GetProjectUseCase getProjectUseCase; + private final AuthenticationService authenticationService; - public GetProjectController(GetProjectUseCase getProjectUseCase) { + public GetProjectController( + GetProjectUseCase getProjectUseCase, AuthenticationService authenticationService) { this.getProjectUseCase = getProjectUseCase; + this.authenticationService = authenticationService; } @GetMapping(path = "/projects/{projectId}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getProject(@PathVariable long projectId) { + authenticationService.authenticateMember(projectId); Project project = getProjectUseCase.get(projectId); - GetProjectResponse getProjectResponse = new GetProjectResponse(); - getProjectResponse.setName(project.getName()); - getProjectResponse.setId(project.getId()); - getProjectResponse.setVcsUsername(project.getVcsUsername()); - getProjectResponse.setStartDate(project.getVcsStart()); - getProjectResponse.setVcsUrl(project.getVcsUrl()); - getProjectResponse.setVcsOnline(project.isVcsOnline()); + GetProjectResponse getProjectResponse = mapProject(project); return new ResponseEntity<>(getProjectResponse, HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/ListProjectsController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/ListProjectsController.java index 0a1aec974..cc7c13811 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/ListProjectsController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/ListProjectsController.java @@ -1,10 +1,11 @@ package io.reflectoring.coderadar.rest.project; +import static io.reflectoring.coderadar.rest.GetProjectResponseMapper.mapProjects; + import io.reflectoring.coderadar.projectadministration.domain.Project; import io.reflectoring.coderadar.projectadministration.port.driver.project.get.ListProjectsUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetProjectResponse; -import java.util.ArrayList; import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -25,17 +26,6 @@ public ListProjectsController(ListProjectsUseCase listProjectsUseCase) { @GetMapping(path = "/projects", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> listProjects() { List projects = listProjectsUseCase.listProjects(); - List responses = new ArrayList<>(projects.size()); - for (Project project : projects) { - responses.add( - new GetProjectResponse() - .setName(project.getName()) - .setId(project.getId()) - .setStartDate(project.getVcsStart()) - .setVcsOnline(project.isVcsOnline()) - .setVcsUrl(project.getVcsUrl()) - .setVcsUsername(project.getVcsUsername())); - } - return new ResponseEntity<>(responses, HttpStatus.OK); + return new ResponseEntity<>(mapProjects(projects), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/UpdateProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/UpdateProjectController.java index 39a404f93..a2afc95c3 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/UpdateProjectController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/project/UpdateProjectController.java @@ -3,6 +3,7 @@ import io.reflectoring.coderadar.projectadministration.port.driver.project.update.UpdateProjectCommand; import io.reflectoring.coderadar.projectadministration.port.driver.project.update.UpdateProjectUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import java.net.MalformedURLException; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -18,19 +19,20 @@ @RestController public class UpdateProjectController implements AbstractBaseController { private final UpdateProjectUseCase updateProjectUseCase; + private final AuthenticationService authenticationService; - public UpdateProjectController(UpdateProjectUseCase updateProjectUseCase) { + public UpdateProjectController( + UpdateProjectUseCase updateProjectUseCase, AuthenticationService authenticationService) { this.updateProjectUseCase = updateProjectUseCase; + this.authenticationService = authenticationService; } - @PostMapping( - path = "/projects/{projectId}", - consumes = MediaType.APPLICATION_JSON_VALUE, - produces = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(path = "/projects/{projectId}", consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity updateProject( @RequestBody @Validated UpdateProjectCommand command, @PathVariable(name = "projectId") long projectId) throws MalformedURLException { + authenticationService.authenticateAdmin(projectId); updateProjectUseCase.update(command, projectId); return new ResponseEntity<>(HttpStatus.OK); } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetAvailableMetricsInProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetAvailableMetricsInProjectController.java index 9edae93a7..41c04021d 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetAvailableMetricsInProjectController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetAvailableMetricsInProjectController.java @@ -2,6 +2,7 @@ import io.reflectoring.coderadar.query.port.driver.GetAvailableMetricsInProjectUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -15,14 +16,18 @@ @RestController public class GetAvailableMetricsInProjectController implements AbstractBaseController { private final GetAvailableMetricsInProjectUseCase getAvailableMetricsInProjectUseCase; + private final AuthenticationService authenticationService; public GetAvailableMetricsInProjectController( - GetAvailableMetricsInProjectUseCase getAvailableMetricsInProjectUseCase) { + GetAvailableMetricsInProjectUseCase getAvailableMetricsInProjectUseCase, + AuthenticationService authenticationService) { this.getAvailableMetricsInProjectUseCase = getAvailableMetricsInProjectUseCase; + this.authenticationService = authenticationService; } @GetMapping(path = "/projects/{projectId}/metrics", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> getMetrics(@PathVariable("projectId") long projectId) { + authenticationService.authenticateMember(projectId); return new ResponseEntity<>(getAvailableMetricsInProjectUseCase.get(projectId), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetCommitLogController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetCommitLogController.java index f5e97131f..c35af5677 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetCommitLogController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetCommitLogController.java @@ -3,6 +3,7 @@ import io.reflectoring.coderadar.query.domain.CommitLog; import io.reflectoring.coderadar.query.port.driver.GetCommitLogUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -17,13 +18,17 @@ public class GetCommitLogController implements AbstractBaseController { private final GetCommitLogUseCase getCommitLogUseCase; + private final AuthenticationService authenticationService; - public GetCommitLogController(GetCommitLogUseCase getCommitLogUseCase) { + public GetCommitLogController( + GetCommitLogUseCase getCommitLogUseCase, AuthenticationService authenticationService) { this.getCommitLogUseCase = getCommitLogUseCase; + this.authenticationService = authenticationService; } @GetMapping(path = "/projects/{projectId}/commitLog", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> getCommitLog(@PathVariable Long projectId) { + authenticationService.authenticateMember(projectId); return new ResponseEntity<>(getCommitLogUseCase.getCommitLog(projectId), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetCommitsInProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetCommitsInProjectController.java index 3b4dc591b..5482807ec 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetCommitsInProjectController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetCommitsInProjectController.java @@ -5,6 +5,7 @@ import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.GetCommitResponseMapper; import io.reflectoring.coderadar.rest.domain.GetCommitResponse; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -19,9 +20,13 @@ @RestController public class GetCommitsInProjectController implements AbstractBaseController { private final GetCommitsInProjectUseCase getCommitsInProjectUseCase; + private final AuthenticationService authenticationService; - public GetCommitsInProjectController(GetCommitsInProjectUseCase getCommitsInProjectUseCase) { + public GetCommitsInProjectController( + GetCommitsInProjectUseCase getCommitsInProjectUseCase, + AuthenticationService authenticationService) { this.getCommitsInProjectUseCase = getCommitsInProjectUseCase; + this.authenticationService = authenticationService; } @GetMapping( @@ -31,6 +36,7 @@ public ResponseEntity> listCommitsForBranch( @PathVariable("projectId") long projectId, @PathVariable("branchName") String branchName, @RequestParam(value = "email", required = false) String email) { + authenticationService.authenticateMember(projectId); List commits; if (email == null || email.isEmpty()) { commits = getCommitsInProjectUseCase.get(projectId, branchName); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetCriticalFilesController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetCriticalFilesController.java index 27e19807c..1032a148e 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetCriticalFilesController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetCriticalFilesController.java @@ -9,6 +9,7 @@ import io.reflectoring.coderadar.query.port.driver.criticalfiles.GetFrequentlyChangedFilesCommand; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.FileAndCommitsForTimePeriodResponse; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import java.util.ArrayList; import java.util.List; import org.springframework.http.HttpStatus; @@ -22,9 +23,13 @@ @RestController public class GetCriticalFilesController implements AbstractBaseController { private final GetCriticalFilesUseCase getCriticalFilesUseCase; + private final AuthenticationService authenticationService; - public GetCriticalFilesController(GetCriticalFilesUseCase getCriticalFilesUseCase) { + public GetCriticalFilesController( + GetCriticalFilesUseCase getCriticalFilesUseCase, + AuthenticationService authenticationService) { this.getCriticalFilesUseCase = getCriticalFilesUseCase; + this.authenticationService = authenticationService; } @RequestMapping( @@ -34,6 +39,7 @@ public GetCriticalFilesController(GetCriticalFilesUseCase getCriticalFilesUseCas public ResponseEntity> getFilesWithContributors( @PathVariable Long projectId, @RequestBody @Validated GetFilesWithContributorsCommand command) { + authenticationService.authenticateMember(projectId); return new ResponseEntity<>( getCriticalFilesUseCase.getFilesWithContributors(projectId, command), HttpStatus.OK); } @@ -44,6 +50,7 @@ public ResponseEntity> getFilesWithContributors( public ResponseEntity> getFrequentlyChangedFiles( @PathVariable long projectId, @RequestBody @Validated GetFrequentlyChangedFilesCommand command) { + authenticationService.authenticateMember(projectId); return new ResponseEntity<>( mapResponse(getCriticalFilesUseCase.getFrequentlyChangedFiles(projectId, command)), HttpStatus.OK); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetDeltaTreeForTwoCommitsController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetDeltaTreeForTwoCommitsController.java index 0eaf33eed..88687dc3b 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetDeltaTreeForTwoCommitsController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetDeltaTreeForTwoCommitsController.java @@ -4,6 +4,7 @@ import io.reflectoring.coderadar.query.port.driver.deltatree.GetDeltaTreeForTwoCommitsCommand; import io.reflectoring.coderadar.query.port.driver.deltatree.GetDeltaTreeForTwoCommitsUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -16,10 +17,13 @@ public class GetDeltaTreeForTwoCommitsController implements AbstractBaseController { private final GetDeltaTreeForTwoCommitsUseCase getDeltaTreeForTwoCommitsUseCase; + private final AuthenticationService authenticationService; public GetDeltaTreeForTwoCommitsController( - GetDeltaTreeForTwoCommitsUseCase getDeltaTreeForTwoCommitsUseCase) { + GetDeltaTreeForTwoCommitsUseCase getDeltaTreeForTwoCommitsUseCase, + AuthenticationService authenticationService) { this.getDeltaTreeForTwoCommitsUseCase = getDeltaTreeForTwoCommitsUseCase; + this.authenticationService = authenticationService; } @RequestMapping( @@ -30,6 +34,7 @@ public GetDeltaTreeForTwoCommitsController( public ResponseEntity getMetricValuesForTwoCommits( @Validated @RequestBody GetDeltaTreeForTwoCommitsCommand command, @PathVariable("projectId") long projectId) { + authenticationService.authenticateMember(projectId); return new ResponseEntity<>( getDeltaTreeForTwoCommitsUseCase.get(command, projectId), HttpStatus.OK); } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetFileContentWithMetricsController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetFileContentWithMetricsController.java index dc9386cdd..9090835f7 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetFileContentWithMetricsController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetFileContentWithMetricsController.java @@ -4,6 +4,7 @@ import io.reflectoring.coderadar.query.port.driver.filecontent.GetFileContentWithMetricsCommand; import io.reflectoring.coderadar.query.port.driver.filecontent.GetFileContentWithMetricsUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -16,9 +17,12 @@ public class GetFileContentWithMetricsController implements AbstractBaseController { private final GetFileContentWithMetricsUseCase useCase; + private final AuthenticationService authenticationService; - public GetFileContentWithMetricsController(GetFileContentWithMetricsUseCase useCase) { + public GetFileContentWithMetricsController( + GetFileContentWithMetricsUseCase useCase, AuthenticationService authenticationService) { this.useCase = useCase; + this.authenticationService = authenticationService; } @RequestMapping( @@ -28,6 +32,7 @@ public GetFileContentWithMetricsController(GetFileContentWithMetricsUseCase useC public ResponseEntity getFileContentWithMetrics( @PathVariable Long projectId, @RequestBody @Validated GetFileContentWithMetricsCommand command) { + authenticationService.authenticateMember(projectId); return new ResponseEntity<>( useCase.getFileContentWithMetrics(projectId, command), HttpStatus.OK); } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetFileDiffController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetFileDiffController.java index 454d58306..ee0e0a72c 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetFileDiffController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetFileDiffController.java @@ -4,6 +4,7 @@ import io.reflectoring.coderadar.query.port.driver.filediff.GetFileDiffCommand; import io.reflectoring.coderadar.query.port.driver.filediff.GetFileDiffUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -16,9 +17,12 @@ public class GetFileDiffController implements AbstractBaseController { private final GetFileDiffUseCase useCase; + private final AuthenticationService authenticationService; - public GetFileDiffController(GetFileDiffUseCase useCase) { + public GetFileDiffController( + GetFileDiffUseCase useCase, AuthenticationService authenticationService) { this.useCase = useCase; + this.authenticationService = authenticationService; } @RequestMapping( @@ -27,6 +31,7 @@ public GetFileDiffController(GetFileDiffUseCase useCase) { produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getFileDiff( @PathVariable Long projectId, @RequestBody @Validated GetFileDiffCommand command) { + authenticationService.authenticateMember(projectId); return new ResponseEntity<>(useCase.getFileDiff(projectId, command), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetFileTreeForCommitController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetFileTreeForCommitController.java index 60e6def66..2886e6b35 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetFileTreeForCommitController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetFileTreeForCommitController.java @@ -3,6 +3,7 @@ import io.reflectoring.coderadar.query.domain.FileTree; import io.reflectoring.coderadar.query.port.driver.GetFileTreeForCommitUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -17,9 +18,13 @@ public class GetFileTreeForCommitController implements AbstractBaseController { private final GetFileTreeForCommitUseCase getFileTreeForCommitUseCase; + private final AuthenticationService authenticationService; - public GetFileTreeForCommitController(GetFileTreeForCommitUseCase getFileTreeForCommitUseCase) { + public GetFileTreeForCommitController( + GetFileTreeForCommitUseCase getFileTreeForCommitUseCase, + AuthenticationService authenticationService) { this.getFileTreeForCommitUseCase = getFileTreeForCommitUseCase; + this.authenticationService = authenticationService; } @GetMapping( @@ -29,6 +34,7 @@ public ResponseEntity getFileTreeForCommit( @PathVariable("projectId") long projectId, @PathVariable("commitHash") String commitHash, @RequestParam("changedOnly") boolean changedFilesOnly) { + authenticationService.authenticateMember(projectId); return new ResponseEntity<>( getFileTreeForCommitUseCase.getFileTreeForCommit(projectId, commitHash, changedFilesOnly), HttpStatus.OK); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetMetricTreeForCommitController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetMetricTreeForCommitController.java index f332d81f0..23762d667 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetMetricTreeForCommitController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetMetricTreeForCommitController.java @@ -4,6 +4,7 @@ import io.reflectoring.coderadar.query.port.driver.metrictree.GetMetricTreeForCommitCommand; import io.reflectoring.coderadar.query.port.driver.metrictree.GetMetricTreeForCommitUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -18,10 +19,13 @@ @RestController public class GetMetricTreeForCommitController implements AbstractBaseController { private final GetMetricTreeForCommitUseCase getMetricTreeForCommitUseCase; + private final AuthenticationService authenticationService; public GetMetricTreeForCommitController( - GetMetricTreeForCommitUseCase getMetricTreeForCommitUseCase) { + GetMetricTreeForCommitUseCase getMetricTreeForCommitUseCase, + AuthenticationService authenticationService) { this.getMetricTreeForCommitUseCase = getMetricTreeForCommitUseCase; + this.authenticationService = authenticationService; } @GetMapping( @@ -31,6 +35,7 @@ public GetMetricTreeForCommitController( public ResponseEntity getMetricValues( @Validated @RequestBody GetMetricTreeForCommitCommand command, @PathVariable("projectId") long projectId) { + authenticationService.authenticateMember(projectId); return new ResponseEntity<>( getMetricTreeForCommitUseCase.get(projectId, command), HttpStatus.OK); } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetMetricValuesOfCommitController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetMetricValuesOfCommitController.java index cb9c62287..bf4cb6ed9 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetMetricValuesOfCommitController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/query/GetMetricValuesOfCommitController.java @@ -4,6 +4,7 @@ import io.reflectoring.coderadar.query.port.driver.commitmetrics.GetMetricValuesOfCommitCommand; import io.reflectoring.coderadar.query.port.driver.commitmetrics.GetMetricValuesOfCommitUseCase; import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -16,10 +17,13 @@ @RestController public class GetMetricValuesOfCommitController implements AbstractBaseController { private final GetMetricValuesOfCommitUseCase getMetricValuesOfCommitUseCase; + private final AuthenticationService authenticationService; public GetMetricValuesOfCommitController( - GetMetricValuesOfCommitUseCase getMetricValuesOfCommitUseCase) { + GetMetricValuesOfCommitUseCase getMetricValuesOfCommitUseCase, + AuthenticationService authenticationService) { this.getMetricValuesOfCommitUseCase = getMetricValuesOfCommitUseCase; + this.authenticationService = authenticationService; } @RequestMapping( @@ -30,6 +34,7 @@ public GetMetricValuesOfCommitController( public ResponseEntity> getMetricValues( @Validated @RequestBody GetMetricValuesOfCommitCommand command, @PathVariable("projectId") long projectId) { + authenticationService.authenticateMember(projectId); return new ResponseEntity<>( getMetricValuesOfCommitUseCase.get(projectId, command), HttpStatus.OK); } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/ChangePasswordController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/ChangePasswordController.java similarity index 90% rename from coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/ChangePasswordController.java rename to coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/ChangePasswordController.java index 81f0a358a..329fa1eeb 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/ChangePasswordController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/ChangePasswordController.java @@ -1,4 +1,4 @@ -package io.reflectoring.coderadar.rest.user; +package io.reflectoring.coderadar.rest.useradministration; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; @@ -28,7 +28,8 @@ public ChangePasswordController(ChangePasswordUseCase changePasswordUseCase) { path = "/user/password/change", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity changePassword(@RequestBody @Validated ChangePasswordCommand command) { + public ResponseEntity changePassword( + @RequestBody @Validated ChangePasswordCommand command) { try { changePasswordUseCase.changePassword(command); return new ResponseEntity<>(HttpStatus.OK); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/GetUserController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/GetUserController.java similarity index 62% rename from coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/GetUserController.java rename to coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/GetUserController.java index a0bb54b63..02cc410cc 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/GetUserController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/GetUserController.java @@ -1,8 +1,11 @@ -package io.reflectoring.coderadar.rest.user; +package io.reflectoring.coderadar.rest.useradministration; + +import static io.reflectoring.coderadar.rest.GetUserResponseMapper.mapUser; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.GetUserResponse; -import io.reflectoring.coderadar.useradministration.port.driver.load.GetUserUseCase; +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driver.get.GetUserUseCase; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -20,9 +23,9 @@ public GetUserController(GetUserUseCase getUserUseCase) { this.getUserUseCase = getUserUseCase; } - @GetMapping(path = "/user/{userId}", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity loadUser(@PathVariable long userId) { - return new ResponseEntity<>( - new GetUserResponse(userId, getUserUseCase.getUser(userId).getUsername()), HttpStatus.OK); + @GetMapping(path = "/users/{userId}", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getUser(@PathVariable long userId) { + User user = getUserUseCase.getUser(userId); + return new ResponseEntity<>(mapUser(user), HttpStatus.OK); } } diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/ListProjectsForUserController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/ListProjectsForUserController.java new file mode 100644 index 000000000..c2ec50395 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/ListProjectsForUserController.java @@ -0,0 +1,32 @@ +package io.reflectoring.coderadar.rest.useradministration; + +import static io.reflectoring.coderadar.rest.GetProjectResponseMapper.mapProjects; + +import io.reflectoring.coderadar.projectadministration.domain.Project; +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.domain.GetProjectResponse; +import io.reflectoring.coderadar.useradministration.port.driver.get.ListProjectsForUserUseCase; +import java.util.List; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class ListProjectsForUserController implements AbstractBaseController { + private final ListProjectsForUserUseCase listProjectsForUserUseCase; + + public ListProjectsForUserController(ListProjectsForUserUseCase listProjectsForUserUseCase) { + this.listProjectsForUserUseCase = listProjectsForUserUseCase; + } + + @GetMapping(path = "/users/{userId}/projects", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> listProjectsForUser(@PathVariable long userId) { + List projects = listProjectsForUserUseCase.listProjects(userId); + return new ResponseEntity<>(mapProjects(projects), HttpStatus.OK); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/ListUsersController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/ListUsersController.java new file mode 100644 index 000000000..152a5c8f5 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/ListUsersController.java @@ -0,0 +1,31 @@ +package io.reflectoring.coderadar.rest.useradministration; + +import static io.reflectoring.coderadar.rest.GetUserResponseMapper.mapUsers; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.domain.GetUserResponse; +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driver.get.ListUsersUseCase; +import java.util.List; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class ListUsersController implements AbstractBaseController { + private final ListUsersUseCase listUsersUseCase; + + public ListUsersController(ListUsersUseCase listUsersUseCase) { + this.listUsersUseCase = listUsersUseCase; + } + + @GetMapping(path = "/users", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> listUsers() { + List users = listUsersUseCase.listUsers(); + return new ResponseEntity<>(mapUsers(users), HttpStatus.OK); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/ListUsersForProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/ListUsersForProjectController.java new file mode 100644 index 000000000..c921017b6 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/ListUsersForProjectController.java @@ -0,0 +1,38 @@ +package io.reflectoring.coderadar.rest.useradministration; + +import static io.reflectoring.coderadar.rest.GetUserResponseMapper.mapUsers; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.domain.GetUserResponse; +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListUsersForProjectUseCase; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; +import java.util.List; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class ListUsersForProjectController implements AbstractBaseController { + private final ListUsersForProjectUseCase listUsersForProjectUseCase; + private final AuthenticationService authenticationService; + + public ListUsersForProjectController( + ListUsersForProjectUseCase listUsersForProjectUseCase, + AuthenticationService authenticationService) { + this.listUsersForProjectUseCase = listUsersForProjectUseCase; + this.authenticationService = authenticationService; + } + + @GetMapping(path = "/projects/{projectId}/users", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> listTeamsForUser(@PathVariable long projectId) { + authenticationService.authenticateMember(projectId); + List users = listUsersForProjectUseCase.listUsers(projectId); + return new ResponseEntity<>(mapUsers(users), HttpStatus.OK); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/LoginUserController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/LoginUserController.java similarity index 90% rename from coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/LoginUserController.java rename to coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/LoginUserController.java index bb349a207..e0b09e037 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/LoginUserController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/LoginUserController.java @@ -1,4 +1,4 @@ -package io.reflectoring.coderadar.rest.user; +package io.reflectoring.coderadar.rest.useradministration; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; @@ -27,7 +27,7 @@ public LoginUserController(LoginUserUseCase loginUserUseCase) { path = "/user/auth", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity login(@RequestBody @Validated LoginUserCommand command) { + public ResponseEntity login(@RequestBody @Validated LoginUserCommand command) { try { return new ResponseEntity<>(loginUserUseCase.login(command), HttpStatus.OK); } catch (AuthenticationException e) { diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/RefreshTokenController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/RefreshTokenController.java similarity index 92% rename from coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/RefreshTokenController.java rename to coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/RefreshTokenController.java index 29c44d5c3..875fcdee8 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/RefreshTokenController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/RefreshTokenController.java @@ -1,4 +1,4 @@ -package io.reflectoring.coderadar.rest.user; +package io.reflectoring.coderadar.rest.useradministration; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; @@ -30,7 +30,7 @@ public RefreshTokenController(RefreshTokenUseCase refreshTokenUseCase) { path = "/user/refresh", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity refreshToken(@RequestBody @Validated RefreshTokenCommand command) { + public ResponseEntity refreshToken(@RequestBody @Validated RefreshTokenCommand command) { try { return new ResponseEntity<>( new RefreshTokenResponse(refreshTokenUseCase.refreshToken(command)), HttpStatus.OK); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/RegisterUserController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/RegisterUserController.java similarity index 91% rename from coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/RegisterUserController.java rename to coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/RegisterUserController.java index 777fe9880..f1927d815 100644 --- a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/user/RegisterUserController.java +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/RegisterUserController.java @@ -1,4 +1,4 @@ -package io.reflectoring.coderadar.rest.user; +package io.reflectoring.coderadar.rest.useradministration; import io.reflectoring.coderadar.rest.AbstractBaseController; import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; @@ -28,7 +28,7 @@ public RegisterUserController(RegisterUserUseCase registerUserUseCase) { path = "/user/registration", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity register(@RequestBody @Validated RegisterUserCommand command) { + public ResponseEntity register(@RequestBody @Validated RegisterUserCommand command) { try { return new ResponseEntity<>( new IdResponse(registerUserUseCase.register(command)), HttpStatus.CREATED); diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/permissions/RemoveUserFromProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/permissions/RemoveUserFromProjectController.java new file mode 100644 index 000000000..e7c648b26 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/permissions/RemoveUserFromProjectController.java @@ -0,0 +1,39 @@ +package io.reflectoring.coderadar.rest.useradministration.permissions; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.useradministration.UserNotAssignedException; +import io.reflectoring.coderadar.useradministration.port.driver.permissions.RemoveUserFromProjectUseCase; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class RemoveUserFromProjectController implements AbstractBaseController { + private final RemoveUserFromProjectUseCase removeUserFromProjectUseCase; + private final AuthenticationService authenticationService; + + public RemoveUserFromProjectController( + RemoveUserFromProjectUseCase removeUserFromProjectUseCase, + AuthenticationService authenticationService) { + this.removeUserFromProjectUseCase = removeUserFromProjectUseCase; + this.authenticationService = authenticationService; + } + + @DeleteMapping(path = "/projects/{projectId}/users/{userId}") + public ResponseEntity removeUserRoleFromProject( + @PathVariable long projectId, @PathVariable long userId) { + authenticationService.authenticateAdmin(projectId); + try { + removeUserFromProjectUseCase.removeUserFromProject(projectId, userId); + return new ResponseEntity<>(HttpStatus.OK); + } catch (UserNotAssignedException e) { + return new ResponseEntity<>(new ErrorMessageResponse(e.getMessage()), HttpStatus.BAD_REQUEST); + } + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/permissions/SetUserRoleForProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/permissions/SetUserRoleForProjectController.java new file mode 100644 index 000000000..3bdf5479a --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/permissions/SetUserRoleForProjectController.java @@ -0,0 +1,35 @@ +package io.reflectoring.coderadar.rest.useradministration.permissions; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.ProjectRoleJsonWrapper; +import io.reflectoring.coderadar.useradministration.port.driver.permissions.SetUserRoleForProjectUseCase; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class SetUserRoleForProjectController implements AbstractBaseController { + private final SetUserRoleForProjectUseCase setUserRoleForProjectUseCase; + + public SetUserRoleForProjectController( + SetUserRoleForProjectUseCase setUserRoleForProjectUseCase) { + this.setUserRoleForProjectUseCase = setUserRoleForProjectUseCase; + } + + @PostMapping( + path = "/projects/{projectId}/users/{userId}", + consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity setUserRoleForProject( + @PathVariable long projectId, + @PathVariable long userId, + @RequestBody ProjectRoleJsonWrapper role) { + setUserRoleForProjectUseCase.setRole(projectId, userId, role.getRole()); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/AddTeamToProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/AddTeamToProjectController.java new file mode 100644 index 000000000..544eb7f5c --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/AddTeamToProjectController.java @@ -0,0 +1,41 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.ProjectRoleJsonWrapper; +import io.reflectoring.coderadar.useradministration.port.driver.teams.AddTeamToProjectUseCase; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class AddTeamToProjectController implements AbstractBaseController { + private final AddTeamToProjectUseCase addTeamToProjectUseCase; + private final AuthenticationService authenticationService; + + public AddTeamToProjectController( + AddTeamToProjectUseCase addTeamToProjectUseCase, + AuthenticationService authenticationService) { + this.addTeamToProjectUseCase = addTeamToProjectUseCase; + this.authenticationService = authenticationService; + } + + @PostMapping( + path = "/projects/{projectId}/teams/{teamId}", + consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity addTeamToProject( + @PathVariable long projectId, + @PathVariable long teamId, + @Validated @RequestBody ProjectRoleJsonWrapper role) { + authenticationService.authenticateAdmin(projectId); + addTeamToProjectUseCase.addTeamToProject(projectId, teamId, role.getRole()); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/AddUsersToTeamController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/AddUsersToTeamController.java new file mode 100644 index 000000000..01112c03f --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/AddUsersToTeamController.java @@ -0,0 +1,31 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.JsonListWrapper; +import io.reflectoring.coderadar.useradministration.port.driver.teams.AddUsersToTeamUseCase; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class AddUsersToTeamController implements AbstractBaseController { + private final AddUsersToTeamUseCase addUsersToTeamUseCase; + + public AddUsersToTeamController(AddUsersToTeamUseCase addUsersToTeamUseCase) { + this.addUsersToTeamUseCase = addUsersToTeamUseCase; + } + + @PostMapping(path = "/teams/{teamId}/users", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity addUsersToTeam( + @PathVariable long teamId, @RequestBody @Validated JsonListWrapper userIds) { + addUsersToTeamUseCase.addUsersToTeam(teamId, userIds.getElements()); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/CreateTeamController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/CreateTeamController.java new file mode 100644 index 000000000..047421806 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/CreateTeamController.java @@ -0,0 +1,32 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.domain.IdResponse; +import io.reflectoring.coderadar.useradministration.port.driver.teams.create.CreateTeamCommand; +import io.reflectoring.coderadar.useradministration.port.driver.teams.create.CreateTeamUseCase; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class CreateTeamController implements AbstractBaseController { + private final CreateTeamUseCase createTeamUseCase; + + public CreateTeamController(CreateTeamUseCase createTeamUseCase) { + this.createTeamUseCase = createTeamUseCase; + } + + @PostMapping( + path = "/teams", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity createTeam(@RequestBody CreateTeamCommand command) { + Long teamId = createTeamUseCase.createTeam(command); + return new ResponseEntity<>(new IdResponse(teamId), HttpStatus.CREATED); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/DeleteTeamController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/DeleteTeamController.java new file mode 100644 index 000000000..fb18c36bd --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/DeleteTeamController.java @@ -0,0 +1,26 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.useradministration.port.driver.teams.DeleteTeamUseCase; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class DeleteTeamController implements AbstractBaseController { + private final DeleteTeamUseCase deleteTeamUseCase; + + public DeleteTeamController(DeleteTeamUseCase deleteTeamUseCase) { + this.deleteTeamUseCase = deleteTeamUseCase; + } + + @DeleteMapping(path = "/teams/{teamId}") + public ResponseEntity deleteTeam(@PathVariable long teamId) { + deleteTeamUseCase.deleteTeam(teamId); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/GetTeamController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/GetTeamController.java new file mode 100644 index 000000000..9f1a75db7 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/GetTeamController.java @@ -0,0 +1,31 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.GetTeamResponseMapper.mapTeam; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.GetTeamUseCase; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class GetTeamController implements AbstractBaseController { + private final GetTeamUseCase getTeamUseCase; + + public GetTeamController(GetTeamUseCase getTeamUseCase) { + this.getTeamUseCase = getTeamUseCase; + } + + @GetMapping(path = "/teams/{teamId}", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getTeam(@PathVariable long teamId) { + Team team = getTeamUseCase.get(teamId); + return new ResponseEntity<>(mapTeam(team), HttpStatus.OK); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/ListProjectsForTeamController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/ListProjectsForTeamController.java new file mode 100644 index 000000000..c2cb83147 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/ListProjectsForTeamController.java @@ -0,0 +1,32 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.GetProjectResponseMapper.mapProjects; + +import io.reflectoring.coderadar.projectadministration.domain.Project; +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.domain.GetProjectResponse; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListProjectsForTeamUseCase; +import java.util.List; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class ListProjectsForTeamController implements AbstractBaseController { + private final ListProjectsForTeamUseCase listProjectsForTeamUseCase; + + public ListProjectsForTeamController(ListProjectsForTeamUseCase listProjectsForTeamUseCase) { + this.listProjectsForTeamUseCase = listProjectsForTeamUseCase; + } + + @GetMapping(path = "/teams/{teamId}/projects", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> listProjectsForTeam(@PathVariable long teamId) { + List projects = listProjectsForTeamUseCase.listProjects(teamId); + return new ResponseEntity<>(mapProjects(projects), HttpStatus.OK); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsController.java new file mode 100644 index 000000000..010285a1c --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsController.java @@ -0,0 +1,31 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.GetTeamResponseMapper.mapTeams; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListTeamsUseCase; +import java.util.List; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class ListTeamsController implements AbstractBaseController { + private final ListTeamsUseCase listTeamsUseCase; + + public ListTeamsController(ListTeamsUseCase listTeamsUseCase) { + this.listTeamsUseCase = listTeamsUseCase; + } + + @GetMapping(path = "/teams", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> listTeams() { + List teams = listTeamsUseCase.listTeams(); + return new ResponseEntity<>(mapTeams(teams), HttpStatus.OK); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsForProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsForProjectController.java new file mode 100644 index 000000000..f837abd98 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsForProjectController.java @@ -0,0 +1,38 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.GetTeamResponseMapper.mapTeams; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListTeamsForProjectUseCase; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; +import java.util.List; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class ListTeamsForProjectController implements AbstractBaseController { + private final ListTeamsForProjectUseCase listTeamsForProjectUseCase; + private final AuthenticationService authenticationService; + + public ListTeamsForProjectController( + ListTeamsForProjectUseCase listTeamsForProjectUseCase, + AuthenticationService authenticationService) { + this.listTeamsForProjectUseCase = listTeamsForProjectUseCase; + this.authenticationService = authenticationService; + } + + @GetMapping(path = "/projects/{projectId}/teams", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> listTeamsForProject(@PathVariable long projectId) { + authenticationService.authenticateMember(projectId); + List teams = listTeamsForProjectUseCase.listTeamsForProject(projectId); + return new ResponseEntity<>(mapTeams(teams), HttpStatus.OK); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsForUserController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsForUserController.java new file mode 100644 index 000000000..7c172c950 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsForUserController.java @@ -0,0 +1,32 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.GetTeamResponseMapper.mapTeams; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListTeamsForUserUseCase; +import java.util.List; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class ListTeamsForUserController implements AbstractBaseController { + private final ListTeamsForUserUseCase listTeamsForUserUseCase; + + public ListTeamsForUserController(ListTeamsForUserUseCase listTeamsForUserUseCase) { + this.listTeamsForUserUseCase = listTeamsForUserUseCase; + } + + @GetMapping(path = "/users/{userId}/teams", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> listTeamsForUser(@PathVariable long userId) { + List teams = listTeamsForUserUseCase.listTeamsForUser(userId); + return new ResponseEntity<>(mapTeams(teams), HttpStatus.OK); + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/RemoveTeamFromProjectController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/RemoveTeamFromProjectController.java new file mode 100644 index 000000000..3f4a3e576 --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/RemoveTeamFromProjectController.java @@ -0,0 +1,39 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.useradministration.TeamNotAssignedException; +import io.reflectoring.coderadar.useradministration.port.driver.teams.RemoveTeamFromProjectUseCase; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class RemoveTeamFromProjectController implements AbstractBaseController { + private final RemoveTeamFromProjectUseCase removeTeamFromProjectUseCase; + private final AuthenticationService authenticationService; + + public RemoveTeamFromProjectController( + RemoveTeamFromProjectUseCase removeTeamFromProjectUseCase, + AuthenticationService authenticationService) { + this.removeTeamFromProjectUseCase = removeTeamFromProjectUseCase; + this.authenticationService = authenticationService; + } + + @DeleteMapping(path = "/projects/{projectId}/teams/{teamId}") + public ResponseEntity removeTeamFromProject( + @PathVariable long projectId, @PathVariable long teamId) { + authenticationService.authenticateAdmin(projectId); + try { + removeTeamFromProjectUseCase.removeTeam(projectId, teamId); + return new ResponseEntity<>(HttpStatus.OK); + } catch (TeamNotAssignedException e) { + return new ResponseEntity<>(new ErrorMessageResponse(e.getMessage()), HttpStatus.BAD_REQUEST); + } + } +} diff --git a/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/RemoveUsersFromTeamController.java b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/RemoveUsersFromTeamController.java new file mode 100644 index 000000000..0132b34de --- /dev/null +++ b/coderadar-rest/src/main/java/io/reflectoring/coderadar/rest/useradministration/teams/RemoveUsersFromTeamController.java @@ -0,0 +1,36 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import io.reflectoring.coderadar.rest.AbstractBaseController; +import io.reflectoring.coderadar.rest.JsonListWrapper; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.useradministration.UserNotInTeamException; +import io.reflectoring.coderadar.useradministration.port.driver.teams.RemoveUsersFromTeamUseCase; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Transactional +public class RemoveUsersFromTeamController implements AbstractBaseController { + private final RemoveUsersFromTeamUseCase removeUsersFromTeamUseCase; + + public RemoveUsersFromTeamController(RemoveUsersFromTeamUseCase removeUsersFromTeamUseCase) { + this.removeUsersFromTeamUseCase = removeUsersFromTeamUseCase; + } + + @DeleteMapping(path = "/teams/{teamId}/users", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity removeUsersFromTeam( + @PathVariable long teamId, @RequestBody JsonListWrapper userIds) { + try { + removeUsersFromTeamUseCase.removeUsersFromTeam(teamId, userIds.getElements()); + return new ResponseEntity<>(HttpStatus.OK); + } catch (UserNotInTeamException e) { + return new ResponseEntity<>(new ErrorMessageResponse(e.getMessage()), HttpStatus.BAD_REQUEST); + } + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetAnalyzerConfigurationResponseMapperTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetAnalyzerConfigurationResponseMapperTest.java new file mode 100644 index 000000000..5f97e054b --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetAnalyzerConfigurationResponseMapperTest.java @@ -0,0 +1,41 @@ +package io.reflectoring.coderadar.rest.unit; + +import io.reflectoring.coderadar.analyzer.domain.AnalyzerConfiguration; +import io.reflectoring.coderadar.rest.GetAnalyzerConfigurationResponseMapper; +import io.reflectoring.coderadar.rest.domain.GetAnalyzerConfigurationResponse; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class GetAnalyzerConfigurationResponseMapperTest { + + @Test + void testAnalyzerConfigurationResponseMapper() { + List analyzerConfigurations = new ArrayList<>(); + analyzerConfigurations.add(new AnalyzerConfiguration(1L, "testAnalyzer1", true)); + analyzerConfigurations.add(new AnalyzerConfiguration(2L, "testAnalyzer2", false)); + + List responses = + GetAnalyzerConfigurationResponseMapper.mapAnalyzerConfigurations(analyzerConfigurations); + Assertions.assertEquals(2L, responses.size()); + + Assertions.assertEquals("testAnalyzer1", responses.get(0).getAnalyzerName()); + Assertions.assertEquals(1L, responses.get(0).getId()); + Assertions.assertTrue(responses.get(0).isEnabled()); + Assertions.assertEquals("testAnalyzer2", responses.get(1).getAnalyzerName()); + Assertions.assertEquals(2L, responses.get(1).getId()); + Assertions.assertFalse(responses.get(1).isEnabled()); + } + + @Test + void testModuleResponseSingleMapper() { + AnalyzerConfiguration analyzerConfiguration = + new AnalyzerConfiguration(1L, "testAnalyzer1", true); + GetAnalyzerConfigurationResponse response = + GetAnalyzerConfigurationResponseMapper.mapAnalyzerConfiguration(analyzerConfiguration); + Assertions.assertEquals("testAnalyzer1", response.getAnalyzerName()); + Assertions.assertEquals(1L, response.getId()); + Assertions.assertTrue(response.isEnabled()); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetBranchResponseMapperTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetBranchResponseMapperTest.java new file mode 100644 index 000000000..141ecccd8 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetBranchResponseMapperTest.java @@ -0,0 +1,29 @@ +package io.reflectoring.coderadar.rest.unit; + +import io.reflectoring.coderadar.projectadministration.domain.Branch; +import io.reflectoring.coderadar.rest.GetBranchResponseMapper; +import io.reflectoring.coderadar.rest.domain.GetBranchResponse; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class GetBranchResponseMapperTest { + + @Test + void testBranchResponseMapper() { + List branches = new ArrayList<>(); + branches.add(new Branch("testBranch1", "testHash1", false)); + branches.add(new Branch("testBranch2", "testHash2", false)); + branches.add(new Branch("testBranch3", "testHash3", false)); + + List responses = GetBranchResponseMapper.mapBranches(branches); + Assertions.assertEquals(3L, responses.size()); + Assertions.assertEquals("testBranch1", responses.get(0).getName()); + Assertions.assertEquals("testHash1", responses.get(0).getCommitHash()); + Assertions.assertEquals("testBranch2", responses.get(1).getName()); + Assertions.assertEquals("testHash2", responses.get(1).getCommitHash()); + Assertions.assertEquals("testBranch3", responses.get(2).getName()); + Assertions.assertEquals("testHash3", responses.get(2).getCommitHash()); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetCommitResponseMapperTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetCommitResponseMapperTest.java new file mode 100644 index 000000000..d140225db --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetCommitResponseMapperTest.java @@ -0,0 +1,51 @@ +package io.reflectoring.coderadar.rest.unit; + +import io.reflectoring.coderadar.projectadministration.domain.Commit; +import io.reflectoring.coderadar.rest.GetCommitResponseMapper; +import io.reflectoring.coderadar.rest.domain.GetCommitResponse; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class GetCommitResponseMapperTest { + + @Test + void testCommitResponseMapper() { + List commits = new ArrayList<>(); + commits.add( + new Commit() + .setHash("testHash1") + .setAnalyzed(true) + .setAuthor("testAuthor1") + .setAuthorEmail("testEmail1") + .setComment("testComment1") + .setId(1L) + .setTimestamp(0L)); + commits.add( + new Commit() + .setHash("testHash2") + .setAnalyzed(false) + .setAuthor("testAuthor2") + .setAuthorEmail("testEmail2") + .setComment("testComment2") + .setId(2L) + .setTimestamp(1L)); + + List responses = GetCommitResponseMapper.mapCommits(commits); + Assertions.assertEquals(2L, responses.size()); + Assertions.assertEquals("testHash1", responses.get(0).getHash()); + Assertions.assertTrue(responses.get(0).isAnalyzed()); + Assertions.assertEquals("testAuthor1", responses.get(0).getAuthor()); + Assertions.assertEquals("testEmail1", responses.get(0).getAuthorEmail()); + Assertions.assertEquals("testComment1", responses.get(0).getComment()); + Assertions.assertEquals(0L, responses.get(0).getTimestamp()); + + Assertions.assertEquals("testHash2", responses.get(1).getHash()); + Assertions.assertFalse(responses.get(1).isAnalyzed()); + Assertions.assertEquals("testAuthor2", responses.get(1).getAuthor()); + Assertions.assertEquals("testEmail2", responses.get(1).getAuthorEmail()); + Assertions.assertEquals("testComment2", responses.get(1).getComment()); + Assertions.assertEquals(1L, responses.get(1).getTimestamp()); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetContributorResponseMapperTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetContributorResponseMapperTest.java new file mode 100644 index 000000000..e73926e58 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetContributorResponseMapperTest.java @@ -0,0 +1,46 @@ +package io.reflectoring.coderadar.rest.unit; + +import io.reflectoring.coderadar.contributor.domain.Contributor; +import io.reflectoring.coderadar.rest.GetContributorResponseMapper; +import io.reflectoring.coderadar.rest.domain.GetContributorResponse; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class GetContributorResponseMapperTest { + + @Test + void testContributorResponseMapper() { + List contributors = new ArrayList<>(); + contributors.add( + new Contributor() + .setId(1L) + .setDisplayName("testName1") + .setEmailAddresses(Collections.singleton("testEmail1")) + .setNames(Collections.singleton("testDisplayName1"))); + contributors.add( + new Contributor() + .setId(2L) + .setDisplayName("testName2") + .setEmailAddresses(Collections.singleton("testEmail2")) + .setNames(Collections.singleton("testDisplayName2"))); + + List responses = + GetContributorResponseMapper.mapContributors(contributors); + Assertions.assertEquals(2L, responses.size()); + + Assertions.assertEquals("testName1", responses.get(0).getDisplayName()); + Assertions.assertEquals(1L, responses.get(0).getId()); + Assertions.assertEquals(Collections.singleton("testDisplayName1"), responses.get(0).getNames()); + Assertions.assertEquals( + Collections.singleton("testEmail1"), responses.get(0).getEmailAddresses()); + + Assertions.assertEquals("testName2", responses.get(1).getDisplayName()); + Assertions.assertEquals(2L, responses.get(1).getId()); + Assertions.assertEquals(Collections.singleton("testDisplayName2"), responses.get(1).getNames()); + Assertions.assertEquals( + Collections.singleton("testEmail2"), responses.get(1).getEmailAddresses()); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetFilePatternResponseMapperTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetFilePatternResponseMapperTest.java new file mode 100644 index 000000000..5a991d441 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetFilePatternResponseMapperTest.java @@ -0,0 +1,41 @@ +package io.reflectoring.coderadar.rest.unit; + +import io.reflectoring.coderadar.projectadministration.domain.FilePattern; +import io.reflectoring.coderadar.projectadministration.domain.InclusionType; +import io.reflectoring.coderadar.rest.GetFilePatternResponseMapper; +import io.reflectoring.coderadar.rest.domain.GetFilePatternResponse; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class GetFilePatternResponseMapperTest { + + @Test + void testFilePatternResponseMapper() { + List filePatterns = new ArrayList<>(); + filePatterns.add(new FilePattern(1L, "testPattern1/**.java", InclusionType.EXCLUDE)); + filePatterns.add(new FilePattern(2L, "testPattern2/**.java", InclusionType.INCLUDE)); + + List responses = + GetFilePatternResponseMapper.mapFilePatterns(filePatterns); + Assertions.assertEquals(2L, responses.size()); + + Assertions.assertEquals("testPattern1/**.java", responses.get(0).getPattern()); + Assertions.assertEquals(1L, responses.get(0).getId()); + Assertions.assertEquals(InclusionType.EXCLUDE, responses.get(0).getInclusionType()); + + Assertions.assertEquals("testPattern2/**.java", responses.get(1).getPattern()); + Assertions.assertEquals(2L, responses.get(1).getId()); + Assertions.assertEquals(InclusionType.INCLUDE, responses.get(1).getInclusionType()); + } + + @Test + void testFilePatternResponseSingleMapper() { + FilePattern filePattern = new FilePattern(1L, "testPattern1/**.java", InclusionType.EXCLUDE); + GetFilePatternResponse response = GetFilePatternResponseMapper.mapFilePattern(filePattern); + Assertions.assertEquals("testPattern1/**.java", response.getPattern()); + Assertions.assertEquals(1L, response.getId()); + Assertions.assertEquals(InclusionType.EXCLUDE, response.getInclusionType()); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetModuleResponseMapperTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetModuleResponseMapperTest.java new file mode 100644 index 000000000..aff57eaea --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetModuleResponseMapperTest.java @@ -0,0 +1,35 @@ +package io.reflectoring.coderadar.rest.unit; + +import io.reflectoring.coderadar.projectadministration.domain.Module; +import io.reflectoring.coderadar.rest.GetModuleResponseMapper; +import io.reflectoring.coderadar.rest.domain.GetModuleResponse; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class GetModuleResponseMapperTest { + + @Test + void testModuleResponseMapper() { + List modules = new ArrayList<>(); + modules.add(new Module(1L, "testModule1")); + modules.add(new Module(2L, "testModule2")); + + List responses = GetModuleResponseMapper.mapModules(modules); + Assertions.assertEquals(2L, responses.size()); + + Assertions.assertEquals("testModule1", responses.get(0).getPath()); + Assertions.assertEquals(1L, responses.get(0).getId()); + Assertions.assertEquals("testModule2", responses.get(1).getPath()); + Assertions.assertEquals(2L, responses.get(1).getId()); + } + + @Test + void testModuleResponseSingleMapper() { + Module module = new Module(1L, "testPath1"); + GetModuleResponse response = GetModuleResponseMapper.mapModule(module); + Assertions.assertEquals("testPath1", response.getPath()); + Assertions.assertEquals(1L, response.getId()); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetProjectResponseMapperTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetProjectResponseMapperTest.java new file mode 100644 index 000000000..6d8ea4253 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetProjectResponseMapperTest.java @@ -0,0 +1,79 @@ +package io.reflectoring.coderadar.rest.unit; + +import io.reflectoring.coderadar.projectadministration.domain.Project; +import io.reflectoring.coderadar.rest.GetProjectResponseMapper; +import io.reflectoring.coderadar.rest.domain.GetProjectResponse; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class GetProjectResponseMapperTest { + + @Test + void testProjectResponseMapper() { + List projects = new ArrayList<>(); + projects.add( + new Project() + .setName("testProject1") + .setVcsOnline(true) + .setVcsUsername("testUsername1") + .setVcsPassword("testPassword1") + .setId(1L) + .setVcsStart(new Date(123L)) + .setVcsUrl("testUrl1")); + + projects.add( + new Project() + .setName("testProject2") + .setVcsOnline(false) + .setVcsUsername("testUsername2") + .setVcsPassword("testPassword2") + .setId(2L) + .setVcsStart(new Date(345L)) + .setVcsUrl("testUrl2")); + + List responses = GetProjectResponseMapper.mapProjects(projects); + Assertions.assertEquals(2L, responses.size()); + + Assertions.assertEquals("testProject1", responses.get(0).getName()); + Assertions.assertEquals(1L, responses.get(0).getId()); + Assertions.assertEquals(new Date(123L), responses.get(0).getStartDate()); + Assertions.assertEquals("testUsername1", responses.get(0).getVcsUsername()); + Assertions.assertNull(responses.get(0).getVcsPassword()); + Assertions.assertTrue(responses.get(0).isVcsOnline()); + Assertions.assertEquals("testUrl1", responses.get(0).getVcsUrl()); + + Assertions.assertEquals("testProject2", responses.get(1).getName()); + Assertions.assertEquals(2L, responses.get(1).getId()); + Assertions.assertEquals(new Date(345L), responses.get(1).getStartDate()); + Assertions.assertEquals("testUsername2", responses.get(1).getVcsUsername()); + Assertions.assertNull(responses.get(1).getVcsPassword()); + Assertions.assertFalse(responses.get(1).isVcsOnline()); + Assertions.assertEquals("testUrl2", responses.get(1).getVcsUrl()); + } + + @Test + void testSingleProjectResponseMapper() { + Project testProject = + new Project() + .setName("testProject1") + .setVcsOnline(true) + .setVcsUsername("testUsername1") + .setVcsPassword("testPassword1") + .setId(1L) + .setVcsStart(new Date(123L)) + .setVcsUrl("testUrl1"); + + GetProjectResponse response = GetProjectResponseMapper.mapProject(testProject); + + Assertions.assertEquals("testProject1", response.getName()); + Assertions.assertEquals(1L, response.getId()); + Assertions.assertEquals(new Date(123L), response.getStartDate()); + Assertions.assertEquals("testUsername1", response.getVcsUsername()); + Assertions.assertNull(response.getVcsPassword()); + Assertions.assertTrue(response.isVcsOnline()); + Assertions.assertEquals("testUrl1", response.getVcsUrl()); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetTeamResponseMapperControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetTeamResponseMapperControllerTest.java new file mode 100644 index 000000000..9f10ae74a --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetTeamResponseMapperControllerTest.java @@ -0,0 +1,77 @@ +package io.reflectoring.coderadar.rest.unit; + +import io.reflectoring.coderadar.rest.GetTeamResponseMapper; +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import io.reflectoring.coderadar.rest.domain.GetUserResponse; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.domain.User; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class GetTeamResponseMapperControllerTest extends UnitTestTemplate { + + @Test + void testTeamResponseMapper() { + List teams = new ArrayList<>(); + teams.add( + new Team() + .setName("testTeam1") + .setId(1L) + .setMembers( + Collections.singletonList( + new User() + .setUsername("testUsername1") + .setId(2L) + .setPassword("testPassword1")))); + + teams.add( + new Team() + .setName("testTeam2") + .setId(3L) + .setMembers( + Collections.singletonList( + new User() + .setUsername("testUsername2") + .setId(4L) + .setPassword("testPassword2")))); + + List responses = GetTeamResponseMapper.mapTeams(teams); + + Assertions.assertEquals(2L, responses.size()); + Assertions.assertEquals("testTeam1", responses.get(0).getName()); + Assertions.assertEquals(1L, responses.get(0).getId()); + Assertions.assertEquals(1L, responses.get(0).getMembers().size()); + Assertions.assertEquals( + new GetUserResponse(2L, "testUsername1"), responses.get(0).getMembers().get(0)); + + Assertions.assertEquals("testTeam2", responses.get(1).getName()); + Assertions.assertEquals(3L, responses.get(1).getId()); + Assertions.assertEquals(1L, responses.get(1).getMembers().size()); + Assertions.assertEquals( + new GetUserResponse(4L, "testUsername2"), responses.get(1).getMembers().get(0)); + } + + @Test + void testTeamResponseSingleMapper() { + Team team = + new Team() + .setName("testTeam1") + .setId(1L) + .setMembers( + Collections.singletonList( + new User() + .setUsername("testUsername1") + .setId(2L) + .setPassword("testPassword1"))); + + GetTeamResponse response = GetTeamResponseMapper.mapTeam(team); + + Assertions.assertEquals("testTeam1", response.getName()); + Assertions.assertEquals(1L, response.getId()); + Assertions.assertEquals(1L, response.getMembers().size()); + Assertions.assertEquals(new GetUserResponse(2L, "testUsername1"), response.getMembers().get(0)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetTeamResponseMapperTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetTeamResponseMapperTest.java new file mode 100644 index 000000000..3b57bd6f8 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetTeamResponseMapperTest.java @@ -0,0 +1,45 @@ +package io.reflectoring.coderadar.rest.unit; + +import io.reflectoring.coderadar.rest.GetTeamResponseMapper; +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.domain.User; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class GetTeamResponseMapperTest { + + @Test + void testTeamResponseMapper() { + List users = new ArrayList<>(); + users.add(new User().setUsername("testUser1").setId(2L).setPassword("testPassword1")); + + List teams = new ArrayList<>(); + teams.add(new Team().setId(1L).setMembers(users).setName("testTeam1")); + + List responses = GetTeamResponseMapper.mapTeams(teams); + Assertions.assertEquals(1L, responses.size()); + + Assertions.assertEquals(1L, responses.get(0).getId()); + Assertions.assertEquals("testTeam1", responses.get(0).getName()); + Assertions.assertEquals(1L, responses.get(0).getMembers().size()); + Assertions.assertEquals("testUser1", responses.get(0).getMembers().get(0).getUsername()); + Assertions.assertEquals(2L, responses.get(0).getMembers().get(0).getId()); + } + + @Test + void testTeamResponseSingleMapper() { + List users = new ArrayList<>(); + users.add(new User().setUsername("testUser1").setId(2L).setPassword("testPassword1")); + Team team = new Team().setId(1L).setMembers(users).setName("testTeam1"); + GetTeamResponse response = GetTeamResponseMapper.mapTeam(team); + + Assertions.assertEquals(1L, response.getId()); + Assertions.assertEquals("testTeam1", response.getName()); + Assertions.assertEquals(1L, response.getMembers().size()); + Assertions.assertEquals("testUser1", response.getMembers().get(0).getUsername()); + Assertions.assertEquals(2L, response.getMembers().get(0).getId()); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetUserResponseMapperTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetUserResponseMapperTest.java new file mode 100644 index 000000000..5fcbe6049 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/GetUserResponseMapperTest.java @@ -0,0 +1,34 @@ +package io.reflectoring.coderadar.rest.unit; + +import io.reflectoring.coderadar.rest.GetUserResponseMapper; +import io.reflectoring.coderadar.rest.domain.GetUserResponse; +import io.reflectoring.coderadar.useradministration.domain.User; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class GetUserResponseMapperTest { + @Test + void testUserResponseMapper() { + List users = new ArrayList<>(); + users.add(new User().setUsername("testUser1").setId(1L).setPassword("testPassword1")); + users.add(new User().setUsername("testUser2").setId(2L).setPassword("testPassword2")); + + List responses = GetUserResponseMapper.mapUsers(users); + Assertions.assertEquals(2L, responses.size()); + + Assertions.assertEquals("testUser1", responses.get(0).getUsername()); + Assertions.assertEquals(1L, responses.get(0).getId()); + Assertions.assertEquals("testUser2", responses.get(1).getUsername()); + Assertions.assertEquals(2L, responses.get(1).getId()); + } + + @Test + void testUserResponseSingleMapper() { + User user = new User().setUsername("testUser1").setId(1L).setPassword("testPassword1"); + GetUserResponse response = GetUserResponseMapper.mapUser(user); + Assertions.assertEquals("testUser1", response.getUsername()); + Assertions.assertEquals(1L, response.getId()); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/UnitTestTemplate.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/UnitTestTemplate.java new file mode 100644 index 000000000..64b879187 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/UnitTestTemplate.java @@ -0,0 +1,9 @@ +package io.reflectoring.coderadar.rest.unit; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; + +public abstract class UnitTestTemplate { + protected final AuthenticationService authenticationService = mock(AuthenticationService.class); +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/CreateAnalyzerConfigurationControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/CreateAnalyzerConfigurationControllerTest.java index 988206852..acd43a9d3 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/CreateAnalyzerConfigurationControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/CreateAnalyzerConfigurationControllerTest.java @@ -6,21 +6,23 @@ import io.reflectoring.coderadar.projectadministration.port.driver.analyzerconfig.create.CreateAnalyzerConfigurationUseCase; import io.reflectoring.coderadar.rest.analyzerconfig.CreateAnalyzerConfigurationController; import io.reflectoring.coderadar.rest.domain.IdResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class CreateAnalyzerConfigurationControllerTest { +class CreateAnalyzerConfigurationControllerTest extends UnitTestTemplate { - private CreateAnalyzerConfigurationUseCase createAnalyzerConfigurationUseCase = + private final CreateAnalyzerConfigurationUseCase createAnalyzerConfigurationUseCase = mock(CreateAnalyzerConfigurationUseCase.class); @Test - void returnsIdOneForNewAnalyzerConfiguration() { + void testCreateAnalyzer() { CreateAnalyzerConfigurationController testSubject = - new CreateAnalyzerConfigurationController(createAnalyzerConfigurationUseCase); + new CreateAnalyzerConfigurationController( + createAnalyzerConfigurationUseCase, authenticationService); CreateAnalyzerConfigurationCommand command = new CreateAnalyzerConfigurationCommand("analyzer", true); @@ -29,6 +31,7 @@ void returnsIdOneForNewAnalyzerConfiguration() { ResponseEntity responseEntity = testSubject.addAnalyzerConfiguration(command, 5L); Assertions.assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); Assertions.assertEquals(1L, ((IdResponse) responseEntity.getBody()).getId()); } } diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/DeleteAnalyzerConfigurationControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/DeleteAnalyzerConfigurationControllerTest.java index a6d32de04..a8dbf7fab 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/DeleteAnalyzerConfigurationControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/DeleteAnalyzerConfigurationControllerTest.java @@ -4,21 +4,23 @@ import io.reflectoring.coderadar.projectadministration.port.driver.analyzerconfig.delete.DeleteAnalyzerConfigurationUseCase; import io.reflectoring.coderadar.rest.analyzerconfig.DeleteAnalyzerConfigurationController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class DeleteAnalyzerConfigurationControllerTest { +class DeleteAnalyzerConfigurationControllerTest extends UnitTestTemplate { - private DeleteAnalyzerConfigurationUseCase deleteAnalyzerConfigurationUseCase = + private final DeleteAnalyzerConfigurationUseCase deleteAnalyzerConfigurationUseCase = mock(DeleteAnalyzerConfigurationUseCase.class); @Test - void deleteAnalyzerConfigurationWithIdOne() { + void testDeleteAnalyzerConfiguration() { DeleteAnalyzerConfigurationController testSubject = - new DeleteAnalyzerConfigurationController(deleteAnalyzerConfigurationUseCase); + new DeleteAnalyzerConfigurationController( + deleteAnalyzerConfigurationUseCase, authenticationService); ResponseEntity responseEntity = testSubject.deleteAnalyzerConfiguration(1L, 2L); diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/GetAnalyzerConfigurationControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/GetAnalyzerConfigurationControllerTest.java index 0dfd4f4a7..f77453e2c 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/GetAnalyzerConfigurationControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/GetAnalyzerConfigurationControllerTest.java @@ -6,21 +6,23 @@ import io.reflectoring.coderadar.projectadministration.port.driver.analyzerconfig.get.GetAnalyzerConfigurationUseCase; import io.reflectoring.coderadar.rest.analyzerconfig.GetAnalyzerConfigurationController; import io.reflectoring.coderadar.rest.domain.GetAnalyzerConfigurationResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class GetAnalyzerConfigurationControllerTest { +class GetAnalyzerConfigurationControllerTest extends UnitTestTemplate { - private GetAnalyzerConfigurationUseCase getAnalyzerConfigurationUseCase = + private final GetAnalyzerConfigurationUseCase getAnalyzerConfigurationUseCase = mock(GetAnalyzerConfigurationUseCase.class); @Test - void returnsAnalyzerConfigurationWithIdOne() { + void testGetAnalyzerConfiguration() { GetAnalyzerConfigurationController testSubject = - new GetAnalyzerConfigurationController(getAnalyzerConfigurationUseCase); + new GetAnalyzerConfigurationController( + getAnalyzerConfigurationUseCase, authenticationService); AnalyzerConfiguration analyzerConfiguration = new AnalyzerConfiguration(1L, "analyzer", true); @@ -28,11 +30,12 @@ void returnsAnalyzerConfigurationWithIdOne() { .thenReturn(analyzerConfiguration); ResponseEntity responseEntity = - testSubject.getAnalyzerConfiguration(1L); + testSubject.getAnalyzerConfiguration(0L, 1L); Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); Assertions.assertEquals(1L, responseEntity.getBody().getId()); Assertions.assertEquals("analyzer", responseEntity.getBody().getAnalyzerName()); - Assertions.assertEquals(true, responseEntity.getBody().isEnabled()); + Assertions.assertTrue(responseEntity.getBody().isEnabled()); } } diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/ListAnalyzerConfigurationsFromProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/ListAnalyzerConfigurationsFromProjectControllerTest.java index 50f7f6139..e5ce49d18 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/ListAnalyzerConfigurationsFromProjectControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/ListAnalyzerConfigurationsFromProjectControllerTest.java @@ -6,6 +6,7 @@ import io.reflectoring.coderadar.projectadministration.port.driver.analyzerconfig.get.ListAnalyzerConfigurationsUseCase; import io.reflectoring.coderadar.rest.analyzerconfig.ListAnalyzerConfigurationsFromProjectController; import io.reflectoring.coderadar.rest.domain.GetAnalyzerConfigurationResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Assertions; @@ -14,15 +15,16 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class ListAnalyzerConfigurationsFromProjectControllerTest { +class ListAnalyzerConfigurationsFromProjectControllerTest extends UnitTestTemplate { - private ListAnalyzerConfigurationsUseCase listAnalyzerConfigurationsUseCase = + private final ListAnalyzerConfigurationsUseCase listAnalyzerConfigurationsUseCase = mock(ListAnalyzerConfigurationsUseCase.class); @Test - void returnsTwoGetAnalyzerConfigurationResponsesFromProject() { + void testListAnalyzerConfigurationsFromProject() { ListAnalyzerConfigurationsFromProjectController testSubject = - new ListAnalyzerConfigurationsFromProjectController(listAnalyzerConfigurationsUseCase); + new ListAnalyzerConfigurationsFromProjectController( + listAnalyzerConfigurationsUseCase, authenticationService); AnalyzerConfiguration response1 = new AnalyzerConfiguration(1L, "analyzer1", true); AnalyzerConfiguration response2 = new AnalyzerConfiguration(2L, "analyzer2", false); @@ -37,6 +39,7 @@ void returnsTwoGetAnalyzerConfigurationResponsesFromProject() { testSubject.getAnalyzerConfigurationsFromProject(1L); Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); Assertions.assertEquals(responses.size(), responseEntity.getBody().size()); Assertions.assertEquals(response1.getId(), responseEntity.getBody().get(0).getId()); Assertions.assertEquals( diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/UpdateAnalyzerConfigurationControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/UpdateAnalyzerConfigurationControllerTest.java index 6ed69ed19..08d9550d8 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/UpdateAnalyzerConfigurationControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/analyzerconfig/UpdateAnalyzerConfigurationControllerTest.java @@ -5,21 +5,23 @@ import io.reflectoring.coderadar.projectadministration.port.driver.analyzerconfig.update.UpdateAnalyzerConfigurationCommand; import io.reflectoring.coderadar.projectadministration.port.driver.analyzerconfig.update.UpdateAnalyzerConfigurationUseCase; import io.reflectoring.coderadar.rest.analyzerconfig.UpdateAnalyzerConfigurationController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class UpdateAnalyzerConfigurationControllerTest { +class UpdateAnalyzerConfigurationControllerTest extends UnitTestTemplate { - private UpdateAnalyzerConfigurationUseCase updateAnalyzerConfigurationUseCase = + private final UpdateAnalyzerConfigurationUseCase updateAnalyzerConfigurationUseCase = mock(UpdateAnalyzerConfigurationUseCase.class); @Test - void updateAnalyzerConfigurationWithIdOne() { + void testUpdateAnalyzerConfiguration() { UpdateAnalyzerConfigurationController testSubject = - new UpdateAnalyzerConfigurationController(updateAnalyzerConfigurationUseCase); + new UpdateAnalyzerConfigurationController( + updateAnalyzerConfigurationUseCase, authenticationService); UpdateAnalyzerConfigurationCommand command = new UpdateAnalyzerConfigurationCommand("analyzer", true); diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/CreateFilePatternControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/CreateFilePatternControllerTest.java index 6eebce4f5..5c65ce628 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/CreateFilePatternControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/CreateFilePatternControllerTest.java @@ -7,20 +7,22 @@ import io.reflectoring.coderadar.projectadministration.port.driver.filepattern.create.CreateFilePatternUseCase; import io.reflectoring.coderadar.rest.domain.IdResponse; import io.reflectoring.coderadar.rest.filepattern.CreateFilePatternController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class CreateFilePatternControllerTest { +class CreateFilePatternControllerTest extends UnitTestTemplate { - private CreateFilePatternUseCase createFilePatternUseCase = mock(CreateFilePatternUseCase.class); + private final CreateFilePatternUseCase createFilePatternUseCase = + mock(CreateFilePatternUseCase.class); @Test - void createFilePatternSuccessfully() { + void testCreateFilePattern() { CreateFilePatternController testSubject = - new CreateFilePatternController(createFilePatternUseCase); + new CreateFilePatternController(createFilePatternUseCase, authenticationService); CreateFilePatternCommand command = new CreateFilePatternCommand("**/*.java", InclusionType.INCLUDE); @@ -29,6 +31,7 @@ void createFilePatternSuccessfully() { ResponseEntity responseEntity = testSubject.createFilePattern(command, 5L); Assertions.assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); Assertions.assertEquals(1L, responseEntity.getBody().getId()); } } diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/DeleteFilePatternControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/DeleteFilePatternControllerTest.java index ae7667681..72e979c67 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/DeleteFilePatternControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/DeleteFilePatternControllerTest.java @@ -4,21 +4,22 @@ import io.reflectoring.coderadar.projectadministration.port.driver.filepattern.delete.DeleteFilePatternFromProjectUseCase; import io.reflectoring.coderadar.rest.filepattern.DeleteFilePatternController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class DeleteFilePatternControllerTest { +class DeleteFilePatternControllerTest extends UnitTestTemplate { - private DeleteFilePatternFromProjectUseCase deleteFilePatternFromProjectUseCase = + private final DeleteFilePatternFromProjectUseCase deleteFilePatternFromProjectUseCase = mock(DeleteFilePatternFromProjectUseCase.class); @Test - void deleteFilePatternWithIdOne() { + void testDeleteFilePattern() { DeleteFilePatternController testSubject = - new DeleteFilePatternController(deleteFilePatternFromProjectUseCase); + new DeleteFilePatternController(deleteFilePatternFromProjectUseCase, authenticationService); ResponseEntity responseEntity = testSubject.deleteFilePattern(1L, 2L); diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/GetFilePatternControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/GetFilePatternControllerTest.java index be46d25b2..2798d8289 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/GetFilePatternControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/GetFilePatternControllerTest.java @@ -7,26 +7,29 @@ import io.reflectoring.coderadar.projectadministration.port.driver.filepattern.get.GetFilePatternUseCase; import io.reflectoring.coderadar.rest.domain.GetFilePatternResponse; import io.reflectoring.coderadar.rest.filepattern.GetFilePatternController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class GetFilePatternControllerTest { +class GetFilePatternControllerTest extends UnitTestTemplate { - private GetFilePatternUseCase getFilePatternUseCase = mock(GetFilePatternUseCase.class); + private final GetFilePatternUseCase getFilePatternUseCase = mock(GetFilePatternUseCase.class); @Test - void returnsFilePatternWithIdOne() { - GetFilePatternController testSubject = new GetFilePatternController(getFilePatternUseCase); + void testDeleteFilePattern() { + GetFilePatternController testSubject = + new GetFilePatternController(getFilePatternUseCase, authenticationService); FilePattern filePattern = new FilePattern(1L, "**/*.java", InclusionType.INCLUDE); Mockito.when(getFilePatternUseCase.get(1L)).thenReturn(filePattern); - ResponseEntity responseEntity = testSubject.getFilePattern(1L); + ResponseEntity responseEntity = testSubject.getFilePattern(0L, 1L); Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); Assertions.assertEquals(filePattern.getId(), responseEntity.getBody().getId()); Assertions.assertEquals(filePattern.getPattern(), responseEntity.getBody().getPattern()); Assertions.assertEquals( diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/ListFilePatternsOfProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/ListFilePatternsOfProjectControllerTest.java index 679744146..be3de9655 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/ListFilePatternsOfProjectControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/filepattern/ListFilePatternsOfProjectControllerTest.java @@ -7,6 +7,7 @@ import io.reflectoring.coderadar.projectadministration.port.driver.filepattern.get.ListFilePatternsOfProjectUseCase; import io.reflectoring.coderadar.rest.domain.GetFilePatternResponse; import io.reflectoring.coderadar.rest.filepattern.ListFilePatternsOfProjectController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Assertions; @@ -15,15 +16,16 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class ListFilePatternsOfProjectControllerTest { +class ListFilePatternsOfProjectControllerTest extends UnitTestTemplate { - private ListFilePatternsOfProjectUseCase listFilePatternsOfProjectUseCase = + private final ListFilePatternsOfProjectUseCase listFilePatternsOfProjectUseCase = mock(ListFilePatternsOfProjectUseCase.class); @Test - void returnsModulesForProjectWithIdOne() { + void testListFilePatternsOfProject() { ListFilePatternsOfProjectController testSubject = - new ListFilePatternsOfProjectController(listFilePatternsOfProjectUseCase); + new ListFilePatternsOfProjectController( + listFilePatternsOfProjectUseCase, authenticationService); FilePattern response1 = new FilePattern(1L, "**/*.java", InclusionType.INCLUDE); FilePattern response2 = new FilePattern(2L, "**/*.xml", InclusionType.EXCLUDE); @@ -36,6 +38,7 @@ void returnsModulesForProjectWithIdOne() { ResponseEntity> responseEntity = testSubject.listFilePatterns(1L); Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); Assertions.assertEquals(responses.size(), responseEntity.getBody().size()); } } diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/CreateModuleControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/CreateModuleControllerTest.java index 34ef8ec6e..ea3ac14b5 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/CreateModuleControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/CreateModuleControllerTest.java @@ -2,35 +2,55 @@ import static org.mockito.Mockito.mock; -import io.reflectoring.coderadar.projectadministration.ModuleAlreadyExistsException; import io.reflectoring.coderadar.projectadministration.ModulePathInvalidException; -import io.reflectoring.coderadar.projectadministration.ProjectIsBeingProcessedException; import io.reflectoring.coderadar.projectadministration.port.driver.module.create.CreateModuleCommand; import io.reflectoring.coderadar.projectadministration.port.driver.module.create.CreateModuleUseCase; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; import io.reflectoring.coderadar.rest.domain.IdResponse; import io.reflectoring.coderadar.rest.module.CreateModuleController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class CreateModuleControllerTest { +class CreateModuleControllerTest extends UnitTestTemplate { - private CreateModuleUseCase createModuleUseCase = mock(CreateModuleUseCase.class); + private final CreateModuleUseCase createModuleUseCase = mock(CreateModuleUseCase.class); @Test - void createModuleSuccessfully() - throws ModuleAlreadyExistsException, ModulePathInvalidException, - ProjectIsBeingProcessedException { - CreateModuleController testSubject = new CreateModuleController(createModuleUseCase); + void testCreateModule() throws ModulePathInvalidException { + CreateModuleController testSubject = + new CreateModuleController(createModuleUseCase, authenticationService); CreateModuleCommand command = new CreateModuleCommand("module-path-test"); Mockito.when(createModuleUseCase.createModule(command, 5L)).thenReturn(1L); - ResponseEntity responseEntity = testSubject.createModule(command, 5L); + ResponseEntity responseEntity = testSubject.createModule(command, 5L); Assertions.assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); + Assertions.assertTrue(responseEntity.getBody() instanceof IdResponse); Assertions.assertEquals(1L, ((IdResponse) responseEntity.getBody()).getId()); } + + @Test + void testCreateModuleReturnsErrorWhenPathInvalid() throws ModulePathInvalidException { + CreateModuleController testSubject = + new CreateModuleController(createModuleUseCase, authenticationService); + + CreateModuleCommand command = new CreateModuleCommand("module-path-test//"); + Mockito.when(createModuleUseCase.createModule(command, 5L)) + .thenThrow(new ModulePathInvalidException(command.getPath())); + + ResponseEntity responseEntity = testSubject.createModule(command, 5L); + + Assertions.assertEquals(HttpStatus.UNPROCESSABLE_ENTITY, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); + Assertions.assertTrue(responseEntity.getBody() instanceof ErrorMessageResponse); + Assertions.assertEquals( + "module-path-test// is not a valid path!", + ((ErrorMessageResponse) responseEntity.getBody()).getErrorMessage()); + } } diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/DeleteModuleControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/DeleteModuleControllerTest.java index 5e05deefe..4a69b303f 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/DeleteModuleControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/DeleteModuleControllerTest.java @@ -5,19 +5,21 @@ import io.reflectoring.coderadar.projectadministration.ProjectIsBeingProcessedException; import io.reflectoring.coderadar.projectadministration.port.driver.module.delete.DeleteModuleUseCase; import io.reflectoring.coderadar.rest.module.DeleteModuleController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class DeleteModuleControllerTest { +class DeleteModuleControllerTest extends UnitTestTemplate { - private DeleteModuleUseCase deleteModuleUseCase = mock(DeleteModuleUseCase.class); + private final DeleteModuleUseCase deleteModuleUseCase = mock(DeleteModuleUseCase.class); @Test - void deleteModuleWithIdOne() throws ProjectIsBeingProcessedException { - DeleteModuleController testSubject = new DeleteModuleController(deleteModuleUseCase); + void testDeleteModule() throws ProjectIsBeingProcessedException { + DeleteModuleController testSubject = + new DeleteModuleController(deleteModuleUseCase, authenticationService); ResponseEntity responseEntity = testSubject.deleteModule(1L, 2L); diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/GetModuleControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/GetModuleControllerTest.java index 4377899da..30528e7e6 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/GetModuleControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/GetModuleControllerTest.java @@ -6,26 +6,29 @@ import io.reflectoring.coderadar.projectadministration.port.driver.module.get.GetModuleUseCase; import io.reflectoring.coderadar.rest.domain.GetModuleResponse; import io.reflectoring.coderadar.rest.module.GetModuleController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class GetModuleControllerTest { +class GetModuleControllerTest extends UnitTestTemplate { - private GetModuleUseCase getModuleUseCase = mock(GetModuleUseCase.class); + private final GetModuleUseCase getModuleUseCase = mock(GetModuleUseCase.class); @Test - void returnsModuleWithIdOne() { - GetModuleController testSubject = new GetModuleController(getModuleUseCase); + void testGetModule() { + GetModuleController testSubject = + new GetModuleController(getModuleUseCase, authenticationService); Module module = new Module(1L, "module-path"); Mockito.when(getModuleUseCase.get(1L)).thenReturn(module); - ResponseEntity responseEntity = testSubject.getModule(1L); + ResponseEntity responseEntity = testSubject.getModule(0L, 1L); Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); Assertions.assertEquals(1L, responseEntity.getBody().getId()); Assertions.assertEquals("module-path", responseEntity.getBody().getPath()); } diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/ListModulesOfProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/ListModulesOfProjectControllerTest.java index 2f3707814..07565cd25 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/ListModulesOfProjectControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/module/ListModulesOfProjectControllerTest.java @@ -6,6 +6,7 @@ import io.reflectoring.coderadar.projectadministration.port.driver.module.get.ListModulesOfProjectUseCase; import io.reflectoring.coderadar.rest.domain.GetModuleResponse; import io.reflectoring.coderadar.rest.module.ListModulesOfProjectController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Assertions; @@ -14,15 +15,15 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class ListModulesOfProjectControllerTest { +class ListModulesOfProjectControllerTest extends UnitTestTemplate { - private ListModulesOfProjectUseCase listModulesOfProjectUseCase = + private final ListModulesOfProjectUseCase listModulesOfProjectUseCase = mock(ListModulesOfProjectUseCase.class); @Test - void returnsModulesForProjectWithIdOne() { + void testListModulesOfProject() { ListModulesOfProjectController testSubject = - new ListModulesOfProjectController(listModulesOfProjectUseCase); + new ListModulesOfProjectController(listModulesOfProjectUseCase, authenticationService); List responses = new ArrayList<>(); Module response1 = new Module(1L, "module-path-one"); @@ -35,6 +36,7 @@ void returnsModulesForProjectWithIdOne() { ResponseEntity> responseEntity = testSubject.listModules(1L); Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); Assertions.assertEquals(responses.size(), responseEntity.getBody().size()); Assertions.assertEquals(response1.getId(), responseEntity.getBody().get(0).getId()); Assertions.assertEquals(response1.getPath(), responseEntity.getBody().get(0).getPath()); diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/CreateProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/CreateProjectControllerTest.java index 02d02abf8..ea3e184ef 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/CreateProjectControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/CreateProjectControllerTest.java @@ -2,11 +2,11 @@ import static org.mockito.Mockito.mock; -import io.reflectoring.coderadar.projectadministration.ProjectIsBeingProcessedException; import io.reflectoring.coderadar.projectadministration.port.driver.project.create.CreateProjectCommand; import io.reflectoring.coderadar.projectadministration.port.driver.project.create.CreateProjectUseCase; import io.reflectoring.coderadar.rest.domain.IdResponse; import io.reflectoring.coderadar.rest.project.CreateProjectController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import java.net.MalformedURLException; import java.util.Date; import org.junit.jupiter.api.Assertions; @@ -15,13 +15,12 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class CreateProjectControllerTest { +class CreateProjectControllerTest extends UnitTestTemplate { - private CreateProjectUseCase createProjectUseCase = mock(CreateProjectUseCase.class); + private final CreateProjectUseCase createProjectUseCase = mock(CreateProjectUseCase.class); @Test - void createNewProjectSuccessfully() - throws MalformedURLException, ProjectIsBeingProcessedException { + void createNewProjectSuccessfully() throws MalformedURLException { CreateProjectController testSubject = new CreateProjectController(createProjectUseCase); CreateProjectCommand command = @@ -33,6 +32,7 @@ void createNewProjectSuccessfully() ResponseEntity responseEntity = testSubject.createProject(command); Assertions.assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); Assertions.assertEquals(1L, responseEntity.getBody().getId()); } } diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/DeleteProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/DeleteProjectControllerTest.java index c5f24847a..0c30ebbdd 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/DeleteProjectControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/DeleteProjectControllerTest.java @@ -2,23 +2,23 @@ import static org.mockito.Mockito.mock; -import com.fasterxml.jackson.core.JsonProcessingException; -import io.reflectoring.coderadar.projectadministration.ProjectIsBeingProcessedException; import io.reflectoring.coderadar.projectadministration.port.driver.project.delete.DeleteProjectUseCase; import io.reflectoring.coderadar.rest.project.DeleteProjectController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class DeleteProjectControllerTest { +class DeleteProjectControllerTest extends UnitTestTemplate { - private DeleteProjectUseCase deleteProjectUseCase = mock(DeleteProjectUseCase.class); + private final DeleteProjectUseCase deleteProjectUseCase = mock(DeleteProjectUseCase.class); @Test - void deleteProjectWithIdOne() throws JsonProcessingException, ProjectIsBeingProcessedException { - DeleteProjectController testSubject = new DeleteProjectController(deleteProjectUseCase); + void deleteProjectWithIdOne() { + DeleteProjectController testSubject = + new DeleteProjectController(deleteProjectUseCase, authenticationService); ResponseEntity responseEntity = testSubject.deleteProject(1L); Mockito.verify(deleteProjectUseCase, Mockito.times(1)).delete(1L); diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/GetProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/GetProjectControllerTest.java index f82b07c2f..3187a3a77 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/GetProjectControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/GetProjectControllerTest.java @@ -6,19 +6,21 @@ import io.reflectoring.coderadar.projectadministration.port.driver.project.get.GetProjectUseCase; import io.reflectoring.coderadar.rest.domain.GetProjectResponse; import io.reflectoring.coderadar.rest.project.GetProjectController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class GetProjectControllerTest { +class GetProjectControllerTest extends UnitTestTemplate { - private GetProjectUseCase getProjectUseCase = mock(GetProjectUseCase.class); + private final GetProjectUseCase getProjectUseCase = mock(GetProjectUseCase.class); @Test void returnsProjectWithIdOne() { - GetProjectController testSubject = new GetProjectController(getProjectUseCase); + GetProjectController testSubject = + new GetProjectController(getProjectUseCase, authenticationService); Project project = new Project(); project.setId(1L); @@ -28,6 +30,7 @@ void returnsProjectWithIdOne() { ResponseEntity responseEntity = testSubject.getProject(1L); Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); Assertions.assertEquals(project.getId(), responseEntity.getBody().getId()); } } diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/ListProjectsControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/ListProjectsControllerTest.java index 3ad655575..dd2edc6f4 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/ListProjectsControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/ListProjectsControllerTest.java @@ -6,6 +6,7 @@ import io.reflectoring.coderadar.projectadministration.port.driver.project.get.ListProjectsUseCase; import io.reflectoring.coderadar.rest.domain.GetProjectResponse; import io.reflectoring.coderadar.rest.project.ListProjectsController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Assertions; @@ -14,9 +15,9 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class ListProjectsControllerTest { +class ListProjectsControllerTest extends UnitTestTemplate { - private ListProjectsUseCase listProjectsUseCase = mock(ListProjectsUseCase.class); + private final ListProjectsUseCase listProjectsUseCase = mock(ListProjectsUseCase.class); @Test void listAllProjects() { @@ -34,7 +35,7 @@ void listAllProjects() { Mockito.when(listProjectsUseCase.listProjects()).thenReturn(projects); ResponseEntity> responseEntity = testSubject.listProjects(); - + Assertions.assertNotNull(responseEntity.getBody()); Assertions.assertEquals(3L, responseEntity.getBody().size()); Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); } diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/UpdateProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/UpdateProjectControllerTest.java index 3a47a820b..93d2befbc 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/UpdateProjectControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/project/UpdateProjectControllerTest.java @@ -2,10 +2,10 @@ import static org.mockito.Mockito.mock; -import io.reflectoring.coderadar.projectadministration.ProjectIsBeingProcessedException; import io.reflectoring.coderadar.projectadministration.port.driver.project.update.UpdateProjectCommand; import io.reflectoring.coderadar.projectadministration.port.driver.project.update.UpdateProjectUseCase; import io.reflectoring.coderadar.rest.project.UpdateProjectController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; import java.net.MalformedURLException; import java.util.Date; import org.junit.jupiter.api.Assertions; @@ -14,13 +14,14 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class UpdateProjectControllerTest { +class UpdateProjectControllerTest extends UnitTestTemplate { - private UpdateProjectUseCase updateProjectUseCase = mock(UpdateProjectUseCase.class); + private final UpdateProjectUseCase updateProjectUseCase = mock(UpdateProjectUseCase.class); @Test - void updateProjectWithIdOne() throws MalformedURLException, ProjectIsBeingProcessedException { - UpdateProjectController testSubject = new UpdateProjectController(updateProjectUseCase); + void updateProjectWithIdOne() throws MalformedURLException { + UpdateProjectController testSubject = + new UpdateProjectController(updateProjectUseCase, authenticationService); UpdateProjectCommand command = new UpdateProjectCommand( diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/ChangePasswordControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/ChangePasswordControllerTest.java similarity index 66% rename from coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/ChangePasswordControllerTest.java rename to coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/ChangePasswordControllerTest.java index d899f92bd..7bc110713 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/ChangePasswordControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/ChangePasswordControllerTest.java @@ -1,8 +1,9 @@ -package io.reflectoring.coderadar.rest.unit.user; +package io.reflectoring.coderadar.rest.unit.useradministration; import static org.mockito.Mockito.mock; -import io.reflectoring.coderadar.rest.user.ChangePasswordController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.ChangePasswordController; import io.reflectoring.coderadar.useradministration.port.driver.password.ChangePasswordCommand; import io.reflectoring.coderadar.useradministration.port.driver.password.ChangePasswordUseCase; import org.junit.jupiter.api.Assertions; @@ -11,16 +12,16 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class ChangePasswordControllerTest { +class ChangePasswordControllerTest extends UnitTestTemplate { - private ChangePasswordUseCase changePasswordUseCase = mock(ChangePasswordUseCase.class); + private final ChangePasswordUseCase changePasswordUseCase = mock(ChangePasswordUseCase.class); @Test void changePasswordSuccessfully() { ChangePasswordController testSubject = new ChangePasswordController(changePasswordUseCase); ChangePasswordCommand command = new ChangePasswordCommand("refreshToken", "newPassword"); - ResponseEntity responseEntity = testSubject.changePassword(command); + ResponseEntity responseEntity = testSubject.changePassword(command); Mockito.verify(changePasswordUseCase, Mockito.times(1)).changePassword(command); diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/GetUserControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/GetUserControllerTest.java similarity index 70% rename from coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/GetUserControllerTest.java rename to coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/GetUserControllerTest.java index 8f780e7f9..8f3640865 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/GetUserControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/GetUserControllerTest.java @@ -1,20 +1,21 @@ -package io.reflectoring.coderadar.rest.unit.user; +package io.reflectoring.coderadar.rest.unit.useradministration; import static org.mockito.Mockito.mock; import io.reflectoring.coderadar.rest.domain.GetUserResponse; -import io.reflectoring.coderadar.rest.user.GetUserController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.GetUserController; import io.reflectoring.coderadar.useradministration.domain.User; -import io.reflectoring.coderadar.useradministration.port.driver.load.GetUserUseCase; +import io.reflectoring.coderadar.useradministration.port.driver.get.GetUserUseCase; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class GetUserControllerTest { +class GetUserControllerTest extends UnitTestTemplate { - private GetUserUseCase getUserUseCase = mock(GetUserUseCase.class); + private final GetUserUseCase getUserUseCase = mock(GetUserUseCase.class); @Test void loadUserWithIdOne() { @@ -23,7 +24,7 @@ void loadUserWithIdOne() { Mockito.when(getUserUseCase.getUser(1L)) .thenReturn(new User().setUsername("username").setId(1L)); - ResponseEntity responseEntity = testSubject.loadUser(1L); + ResponseEntity responseEntity = testSubject.getUser(1L); Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); Assertions.assertEquals("username", responseEntity.getBody().getUsername()); diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/ListProjectsForUserControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/ListProjectsForUserControllerTest.java new file mode 100644 index 000000000..81bc0d8ed --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/ListProjectsForUserControllerTest.java @@ -0,0 +1,47 @@ +package io.reflectoring.coderadar.rest.unit.useradministration; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.projectadministration.domain.Project; +import io.reflectoring.coderadar.rest.domain.GetProjectResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.ListProjectsForUserController; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driver.get.ListProjectsForUserUseCase; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class ListProjectsForUserControllerTest extends UnitTestTemplate { + private final ListProjectsForUserUseCase listProjectsForUserUseCase = + mock(ListProjectsForUserUseCase.class); + + private final ListProjectsForUserController testController = + new ListProjectsForUserController(listProjectsForUserUseCase); + + @Test + void testListProjectsForUser() { + // Set up + Mockito.when(listProjectsForUserUseCase.listProjects(1L)) + .thenReturn(Collections.singletonList(new Project().setName("TestProject1").setId(2L))); + + ResponseEntity> response = testController.listProjectsForUser(1L); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + Assertions.assertNotNull(response.getBody()); + Assertions.assertEquals(1, response.getBody().size()); + Assertions.assertEquals(2L, response.getBody().get(0).getId()); + Assertions.assertEquals("TestProject1", response.getBody().get(0).getName()); + } + + @Test + void testListProjectsForUserThrowsWhenUserNotFound() { + Mockito.when(listProjectsForUserUseCase.listProjects(1L)) + .thenThrow(new UserNotFoundException(1L)); + Assertions.assertThrows( + UserNotFoundException.class, () -> testController.listProjectsForUser(1L)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/ListUsersControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/ListUsersControllerTest.java new file mode 100644 index 000000000..b88ce4dc7 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/ListUsersControllerTest.java @@ -0,0 +1,39 @@ +package io.reflectoring.coderadar.rest.unit.useradministration; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.rest.domain.GetUserResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.ListUsersController; +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driver.get.ListUsersUseCase; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class ListUsersControllerTest extends UnitTestTemplate { + private final ListUsersUseCase listUsersUseCase = mock(ListUsersUseCase.class); + private final ListUsersController testController = new ListUsersController(listUsersUseCase); + + @Test + void testListUsers() { + Mockito.when(listUsersUseCase.listUsers()) + .thenReturn( + Arrays.asList( + new User().setId(2L).setUsername("TestUser1"), + new User().setId(3L).setUsername("TestUser2"))); + + ResponseEntity> response = testController.listUsers(); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + Assertions.assertNotNull(response.getBody()); + Assertions.assertEquals(2, response.getBody().size()); + Assertions.assertEquals(2L, response.getBody().get(0).getId()); + Assertions.assertEquals("TestUser1", response.getBody().get(0).getUsername()); + Assertions.assertEquals(3L, response.getBody().get(1).getId()); + Assertions.assertEquals("TestUser2", response.getBody().get(1).getUsername()); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/ListUsersForProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/ListUsersForProjectControllerTest.java new file mode 100644 index 000000000..5861fb85d --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/ListUsersForProjectControllerTest.java @@ -0,0 +1,49 @@ +package io.reflectoring.coderadar.rest.unit.useradministration; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.projectadministration.ProjectNotFoundException; +import io.reflectoring.coderadar.rest.domain.GetUserResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.ListUsersForProjectController; +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListUsersForProjectUseCase; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class ListUsersForProjectControllerTest extends UnitTestTemplate { + private final ListUsersForProjectUseCase listUsersForProjectUseCase = + mock(ListUsersForProjectUseCase.class); + private final ListUsersForProjectController testController = + new ListUsersForProjectController(listUsersForProjectUseCase, authenticationService); + + @Test + void testListUsersForProject() { + Mockito.when(listUsersForProjectUseCase.listUsers(1L)) + .thenReturn( + Arrays.asList( + new User().setId(2L).setUsername("TestUser1"), + new User().setId(3L).setUsername("TestUser2"))); + + ResponseEntity> response = testController.listTeamsForUser(1L); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + Assertions.assertNotNull(response.getBody()); + Assertions.assertEquals(2, response.getBody().size()); + Assertions.assertEquals(2L, response.getBody().get(0).getId()); + Assertions.assertEquals("TestUser1", response.getBody().get(0).getUsername()); + Assertions.assertEquals(3L, response.getBody().get(1).getId()); + Assertions.assertEquals("TestUser2", response.getBody().get(1).getUsername()); + } + + @Test + void testListUsersForProjectThrowsExceptionWhenProjectNotFound() { + Mockito.doThrow(ProjectNotFoundException.class).when(listUsersForProjectUseCase).listUsers(1L); + Assertions.assertThrows( + ProjectNotFoundException.class, () -> testController.listTeamsForUser(1L)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/LoginUserControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/LoginUserControllerTest.java similarity index 51% rename from coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/LoginUserControllerTest.java rename to coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/LoginUserControllerTest.java index 6c032cbde..65d9a33c4 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/LoginUserControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/LoginUserControllerTest.java @@ -1,8 +1,9 @@ -package io.reflectoring.coderadar.rest.unit.user; +package io.reflectoring.coderadar.rest.unit.useradministration; import static org.mockito.Mockito.mock; -import io.reflectoring.coderadar.rest.user.LoginUserController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.LoginUserController; import io.reflectoring.coderadar.useradministration.port.driver.login.LoginUserCommand; import io.reflectoring.coderadar.useradministration.port.driver.login.LoginUserResponse; import io.reflectoring.coderadar.useradministration.port.driver.login.LoginUserUseCase; @@ -12,25 +13,26 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class LoginUserControllerTest { +class LoginUserControllerTest extends UnitTestTemplate { - private LoginUserUseCase loginUserUseCase = mock(LoginUserUseCase.class); + private final LoginUserUseCase loginUserUseCase = mock(LoginUserUseCase.class); @Test void loginUserWithUsernameAndPassword() { LoginUserController testSubject = new LoginUserController(loginUserUseCase); LoginUserCommand command = new LoginUserCommand("username", "password"); - LoginUserResponse loginUserResponse = new LoginUserResponse("accessToken", "refreshToken"); + LoginUserResponse loginUserResponse = new LoginUserResponse("accessToken", "refreshToken", 1L); Mockito.when(loginUserUseCase.login(command)).thenReturn(loginUserResponse); - ResponseEntity responseEntity = testSubject.login(command); + ResponseEntity responseEntity = testSubject.login(command); + Assertions.assertTrue(responseEntity.getBody() instanceof LoginUserResponse); + LoginUserResponse responseBody = (LoginUserResponse) responseEntity.getBody(); Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - Assertions.assertEquals( - loginUserResponse.getAccessToken(), responseEntity.getBody().getAccessToken()); - Assertions.assertEquals( - loginUserResponse.getRefreshToken(), responseEntity.getBody().getRefreshToken()); + Assertions.assertEquals(loginUserResponse.getAccessToken(), responseBody.getAccessToken()); + Assertions.assertEquals(loginUserResponse.getRefreshToken(), responseBody.getRefreshToken()); + Assertions.assertEquals(loginUserResponse.getUserId(), responseBody.getUserId()); } } diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/RefreshTokenControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/RefreshTokenControllerTest.java similarity index 57% rename from coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/RefreshTokenControllerTest.java rename to coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/RefreshTokenControllerTest.java index e2b6ea394..f0c073b24 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/RefreshTokenControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/RefreshTokenControllerTest.java @@ -1,8 +1,9 @@ -package io.reflectoring.coderadar.rest.unit.user; +package io.reflectoring.coderadar.rest.unit.useradministration; import static org.mockito.Mockito.mock; -import io.reflectoring.coderadar.rest.user.RefreshTokenController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.RefreshTokenController; import io.reflectoring.coderadar.useradministration.port.driver.refresh.RefreshTokenCommand; import io.reflectoring.coderadar.useradministration.port.driver.refresh.RefreshTokenResponse; import io.reflectoring.coderadar.useradministration.port.driver.refresh.RefreshTokenUseCase; @@ -12,9 +13,9 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class RefreshTokenControllerTest { +class RefreshTokenControllerTest extends UnitTestTemplate { - private RefreshTokenUseCase refreshTokenUseCase = mock(RefreshTokenUseCase.class); + private final RefreshTokenUseCase refreshTokenUseCase = mock(RefreshTokenUseCase.class); @Test void refreshTokenSuccessfully() { @@ -22,9 +23,11 @@ void refreshTokenSuccessfully() { RefreshTokenCommand command = new RefreshTokenCommand("accessToken", "refreshToken"); Mockito.when(refreshTokenUseCase.refreshToken(command)).thenReturn("newAccessToken"); - ResponseEntity responseEntity = testSubject.refreshToken(command); + ResponseEntity responseEntity = testSubject.refreshToken(command); + Assertions.assertTrue(responseEntity.getBody() instanceof RefreshTokenResponse); + RefreshTokenResponse responseBody = (RefreshTokenResponse) responseEntity.getBody(); Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - Assertions.assertEquals("newAccessToken", responseEntity.getBody().getToken()); + Assertions.assertEquals("newAccessToken", responseBody.getToken()); } } diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/RegisterUserControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/RegisterUserControllerTest.java similarity index 57% rename from coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/RegisterUserControllerTest.java rename to coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/RegisterUserControllerTest.java index 5466709dd..4d94b430b 100644 --- a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/user/RegisterUserControllerTest.java +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/RegisterUserControllerTest.java @@ -1,9 +1,10 @@ -package io.reflectoring.coderadar.rest.unit.user; +package io.reflectoring.coderadar.rest.unit.useradministration; import static org.mockito.Mockito.mock; import io.reflectoring.coderadar.rest.domain.IdResponse; -import io.reflectoring.coderadar.rest.user.RegisterUserController; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.RegisterUserController; import io.reflectoring.coderadar.useradministration.port.driver.register.RegisterUserCommand; import io.reflectoring.coderadar.useradministration.port.driver.register.RegisterUserUseCase; import org.junit.jupiter.api.Assertions; @@ -12,9 +13,9 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -class RegisterUserControllerTest { +class RegisterUserControllerTest extends UnitTestTemplate { - private RegisterUserUseCase registerUserUseCase = mock(RegisterUserUseCase.class); + private final RegisterUserUseCase registerUserUseCase = mock(RegisterUserUseCase.class); @Test void registerUserWithIdOne() { @@ -24,9 +25,11 @@ void registerUserWithIdOne() { Mockito.when(registerUserUseCase.register(command)).thenReturn(1L); - ResponseEntity responseEntity = testSubject.register(command); + ResponseEntity responseEntity = testSubject.register(command); + Assertions.assertTrue(responseEntity.getBody() instanceof IdResponse); + IdResponse responseBody = (IdResponse) responseEntity.getBody(); Assertions.assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode()); - Assertions.assertEquals(1L, responseEntity.getBody().getId()); + Assertions.assertEquals(1L, responseBody.getId()); } } diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/permissions/RemoveUserFromProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/permissions/RemoveUserFromProjectControllerTest.java new file mode 100644 index 000000000..6da7eff1d --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/permissions/RemoveUserFromProjectControllerTest.java @@ -0,0 +1,47 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.permissions; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.projectadministration.ProjectNotFoundException; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.permissions.RemoveUserFromProjectController; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driver.permissions.RemoveUserFromProjectUseCase; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class RemoveUserFromProjectControllerTest extends UnitTestTemplate { + private final RemoveUserFromProjectUseCase removeUserFromProjectUseCase = + mock(RemoveUserFromProjectUseCase.class); + private final RemoveUserFromProjectController testController = + new RemoveUserFromProjectController(removeUserFromProjectUseCase, authenticationService); + + @Test + void testRemoveUserFromProjectController() { + ResponseEntity response = + testController.removeUserRoleFromProject(1L, 2L); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + @Test + void testRemoveUserFromProjectControllerThrowsExceptionWhenUserNotFound() { + Mockito.doThrow(UserNotFoundException.class) + .when(removeUserFromProjectUseCase) + .removeUserFromProject(1L, 2L); + Assertions.assertThrows( + UserNotFoundException.class, () -> testController.removeUserRoleFromProject(1L, 2L)); + } + + @Test + void testRemoveUserFromProjectControllerThrowsExceptionWhenProjectNotFound() { + Mockito.doThrow(ProjectNotFoundException.class) + .when(removeUserFromProjectUseCase) + .removeUserFromProject(1L, 2L); + Assertions.assertThrows( + ProjectNotFoundException.class, () -> testController.removeUserRoleFromProject(1L, 2L)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/permissions/SetUserRoleForProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/permissions/SetUserRoleForProjectControllerTest.java new file mode 100644 index 000000000..a8febfa33 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/permissions/SetUserRoleForProjectControllerTest.java @@ -0,0 +1,52 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.permissions; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.projectadministration.ProjectNotFoundException; +import io.reflectoring.coderadar.rest.ProjectRoleJsonWrapper; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.permissions.SetUserRoleForProjectController; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import io.reflectoring.coderadar.useradministration.port.driver.permissions.SetUserRoleForProjectUseCase; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class SetUserRoleForProjectControllerTest extends UnitTestTemplate { + private final SetUserRoleForProjectUseCase setUserRoleForProjectUseCase = + mock(SetUserRoleForProjectUseCase.class); + private final SetUserRoleForProjectController testController = + new SetUserRoleForProjectController(setUserRoleForProjectUseCase); + + @Test + void testSetUserRoleForProject() { + ResponseEntity response = + testController.setUserRoleForProject(1L, 2L, new ProjectRoleJsonWrapper(ProjectRole.ADMIN)); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + @Test + void testSetUserRoleForProjectThrowsExceptionWhenUserNotFound() { + Mockito.doThrow(UserNotFoundException.class) + .when(setUserRoleForProjectUseCase) + .setRole(1L, 2L, ProjectRole.ADMIN); + ProjectRoleJsonWrapper jsonWrapper = new ProjectRoleJsonWrapper(ProjectRole.ADMIN); + Assertions.assertThrows( + UserNotFoundException.class, + () -> testController.setUserRoleForProject(1L, 2L, jsonWrapper)); + } + + @Test + void testSetUserRoleForProjectThrowsExceptionWhenProjectNotFound() { + Mockito.doThrow(ProjectNotFoundException.class) + .when(setUserRoleForProjectUseCase) + .setRole(1L, 2L, ProjectRole.ADMIN); + ProjectRoleJsonWrapper jsonWrapper = new ProjectRoleJsonWrapper(ProjectRole.ADMIN); + Assertions.assertThrows( + ProjectNotFoundException.class, + () -> testController.setUserRoleForProject(1L, 2L, jsonWrapper)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/AddTeamToProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/AddTeamToProjectControllerTest.java new file mode 100644 index 000000000..d9b8b5f90 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/AddTeamToProjectControllerTest.java @@ -0,0 +1,52 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.teams; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.projectadministration.ProjectNotFoundException; +import io.reflectoring.coderadar.rest.ProjectRoleJsonWrapper; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.teams.AddTeamToProjectController; +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import io.reflectoring.coderadar.useradministration.port.driver.teams.AddTeamToProjectUseCase; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class AddTeamToProjectControllerTest extends UnitTestTemplate { + private final AddTeamToProjectUseCase addTeamToProjectUseCase = + mock(AddTeamToProjectUseCase.class); + private final AddTeamToProjectController testController = + new AddTeamToProjectController(addTeamToProjectUseCase, authenticationService); + + @Test + void testAddTeamToProject() { + ResponseEntity response = + testController.addTeamToProject(1L, 2L, new ProjectRoleJsonWrapper(ProjectRole.ADMIN)); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + @Test + void testRemoveTeamFromProjectThrowsExceptionWhenTeamNotFound() { + Mockito.doThrow(TeamNotFoundException.class) + .when(addTeamToProjectUseCase) + .addTeamToProject(1L, 2L, ProjectRole.ADMIN); + ProjectRoleJsonWrapper jsonWrapper = new ProjectRoleJsonWrapper(ProjectRole.ADMIN); + + Assertions.assertThrows( + TeamNotFoundException.class, () -> testController.addTeamToProject(1L, 2L, jsonWrapper)); + } + + @Test + void testRemoveTeamFromProjectThrowsExceptionWhenProjectNotFound() { + Mockito.doThrow(ProjectNotFoundException.class) + .when(addTeamToProjectUseCase) + .addTeamToProject(1L, 2L, ProjectRole.ADMIN); + ProjectRoleJsonWrapper jsonWrapper = new ProjectRoleJsonWrapper(ProjectRole.ADMIN); + + Assertions.assertThrows( + ProjectNotFoundException.class, () -> testController.addTeamToProject(1L, 2L, jsonWrapper)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/AddUsersToTeamControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/AddUsersToTeamControllerTest.java new file mode 100644 index 000000000..dc70799bd --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/AddUsersToTeamControllerTest.java @@ -0,0 +1,52 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.teams; + +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.rest.JsonListWrapper; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.teams.AddUsersToTeamController; +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driver.teams.AddUsersToTeamUseCase; +import java.util.Collections; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class AddUsersToTeamControllerTest extends UnitTestTemplate { + private final AddUsersToTeamUseCase addUsersToTeamUseCase = mock(AddUsersToTeamUseCase.class); + private final AddUsersToTeamController testController = + new AddUsersToTeamController(addUsersToTeamUseCase); + + @Test + void testAddUsersToTeamController() { + ResponseEntity response = + testController.addUsersToTeam(1L, new JsonListWrapper<>(Collections.singletonList(2L))); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + @Test + void testRemoveTeamFromProjectThrowsExceptionWhenTeamNotFound() { + Mockito.doThrow(TeamNotFoundException.class) + .when(addUsersToTeamUseCase) + .addUsersToTeam(anyLong(), anyList()); + JsonListWrapper jsonListWrapper = new JsonListWrapper<>(Collections.singletonList(2L)); + Assertions.assertThrows( + TeamNotFoundException.class, () -> testController.addUsersToTeam(1L, jsonListWrapper)); + } + + @Test + void testRemoveTeamFromProjectThrowsExceptionWhenUserNotFound() { + Mockito.doThrow(UserNotFoundException.class) + .when(addUsersToTeamUseCase) + .addUsersToTeam(anyLong(), anyList()); + JsonListWrapper jsonListWrapper = new JsonListWrapper<>(Collections.singletonList(2L)); + + Assertions.assertThrows( + UserNotFoundException.class, () -> testController.addUsersToTeam(1L, jsonListWrapper)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/CreateTeamControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/CreateTeamControllerTest.java new file mode 100644 index 000000000..a496e82b0 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/CreateTeamControllerTest.java @@ -0,0 +1,47 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.teams; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.rest.domain.IdResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.teams.CreateTeamController; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driver.teams.create.CreateTeamCommand; +import io.reflectoring.coderadar.useradministration.port.driver.teams.create.CreateTeamUseCase; +import java.util.Collections; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class CreateTeamControllerTest extends UnitTestTemplate { + private final CreateTeamUseCase createTeamUseCase = mock(CreateTeamUseCase.class); + + private final CreateTeamController testController = new CreateTeamController(createTeamUseCase); + + @Test + void testCreateTeam() { + + // Set up + CreateTeamCommand testCommand = new CreateTeamCommand(); + testCommand.setName("TestTeam1"); + testCommand.setUserIds(Collections.singletonList(1L)); + + Mockito.when(createTeamUseCase.createTeam(testCommand)).thenReturn(2L); + + // Test + ResponseEntity responseEntity = testController.createTeam(testCommand); + Assertions.assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode()); + Assertions.assertNotNull(responseEntity.getBody()); + Assertions.assertEquals(2L, responseEntity.getBody().getId()); + } + + @Test + void testCreateTeamThrowsExceptionWhenUserNotFound() { + Mockito.when(createTeamUseCase.createTeam(any())).thenThrow(new UserNotFoundException(1L)); + CreateTeamCommand command = new CreateTeamCommand(); + Assertions.assertThrows(UserNotFoundException.class, () -> testController.createTeam(command)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/DeleteTeamControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/DeleteTeamControllerTest.java new file mode 100644 index 000000000..6d5acc682 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/DeleteTeamControllerTest.java @@ -0,0 +1,32 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.teams; + +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.teams.DeleteTeamController; +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driver.teams.DeleteTeamUseCase; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class DeleteTeamControllerTest extends UnitTestTemplate { + private final DeleteTeamUseCase deleteTeamUseCase = mock(DeleteTeamUseCase.class); + + private final DeleteTeamController testController = new DeleteTeamController(deleteTeamUseCase); + + @Test + void testDeleteTeam() { + ResponseEntity response = testController.deleteTeam(1L); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + @Test + void testDeleteTeamThrowsExceptionIfTeamNotFound() { + Mockito.doThrow(TeamNotFoundException.class).when(deleteTeamUseCase).deleteTeam(anyLong()); + Assertions.assertThrows(TeamNotFoundException.class, () -> testController.deleteTeam(1L)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/GetTeamControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/GetTeamControllerTest.java new file mode 100644 index 000000000..a96b21846 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/GetTeamControllerTest.java @@ -0,0 +1,54 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.teams; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.teams.GetTeamController; +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.GetTeamUseCase; +import java.util.Collections; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class GetTeamControllerTest extends UnitTestTemplate { + private final GetTeamUseCase getTeamUseCase = mock(GetTeamUseCase.class); + private final GetTeamController testController = new GetTeamController(getTeamUseCase); + + @Test + void testGetTeam() { + // Set up + Mockito.when(getTeamUseCase.get(1L)) + .thenReturn( + new Team() + .setId(1L) + .setName("TestTeam1") + .setMembers( + Collections.singletonList(new User().setId(3L).setUsername("TestUser1")))); + + // Test + ResponseEntity responseEntity = testController.getTeam(1L); + Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + + Assertions.assertNotNull(responseEntity.getBody()); + Assertions.assertEquals(1L, responseEntity.getBody().getId()); + Assertions.assertEquals("TestTeam1", responseEntity.getBody().getName()); + + Assertions.assertNotNull(responseEntity.getBody().getMembers()); + Assertions.assertEquals(1, responseEntity.getBody().getMembers().size()); + Assertions.assertEquals(3L, responseEntity.getBody().getMembers().get(0).getId()); + Assertions.assertEquals( + "TestUser1", responseEntity.getBody().getMembers().get(0).getUsername()); + } + + @Test + void testGetTeamReturnsErrorWhenTeamNotFound() { + Mockito.when(getTeamUseCase.get(1L)).thenThrow(new TeamNotFoundException(1L)); + Assertions.assertThrows(TeamNotFoundException.class, () -> testController.getTeam(1L)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/ListProjectsForTeamControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/ListProjectsForTeamControllerTest.java new file mode 100644 index 000000000..884625db5 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/ListProjectsForTeamControllerTest.java @@ -0,0 +1,45 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.teams; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.projectadministration.domain.Project; +import io.reflectoring.coderadar.rest.domain.GetProjectResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.teams.ListProjectsForTeamController; +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListProjectsForTeamUseCase; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class ListProjectsForTeamControllerTest extends UnitTestTemplate { + private final ListProjectsForTeamUseCase listProjectsForTeamUseCase = + mock(ListProjectsForTeamUseCase.class); + private final ListProjectsForTeamController testController = + new ListProjectsForTeamController(listProjectsForTeamUseCase); + + @Test + void testListProjectsForTeam() { + // Set up + Mockito.when(listProjectsForTeamUseCase.listProjects(1L)) + .thenReturn(Collections.singletonList(new Project().setName("TestProject1").setId(2L))); + + ResponseEntity> response = testController.listProjectsForTeam(1L); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + Assertions.assertNotNull(response.getBody()); + Assertions.assertEquals(1, response.getBody().size()); + Assertions.assertEquals(2L, response.getBody().get(0).getId()); + Assertions.assertEquals("TestProject1", response.getBody().get(0).getName()); + } + + @Test + void testRemoveTeamFromProjectThrowsExceptionWhenTeamNotFound() { + Mockito.doThrow(TeamNotFoundException.class).when(listProjectsForTeamUseCase).listProjects(1L); + Assertions.assertThrows( + TeamNotFoundException.class, () -> testController.listProjectsForTeam(1L)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/ListTeamsControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/ListTeamsControllerTest.java new file mode 100644 index 000000000..7cba2b043 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/ListTeamsControllerTest.java @@ -0,0 +1,57 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.teams; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.teams.ListTeamsController; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListTeamsUseCase; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class ListTeamsControllerTest extends UnitTestTemplate { + private final ListTeamsUseCase listTeamsUseCase = mock(ListTeamsUseCase.class); + private final ListTeamsController testController = new ListTeamsController(listTeamsUseCase); + + @BeforeEach + void setUp() { + Mockito.when(listTeamsUseCase.listTeams()) + .thenReturn( + Arrays.asList( + new Team().setId(1L).setName("TestTeam1"), + new Team() + .setId(2L) + .setName("TestTeam2") + .setMembers( + Collections.singletonList(new User().setId(3L).setUsername("TestUser1"))))); + } + + @Test + void testListTeams() { + ResponseEntity> responseEntity = testController.listTeams(); + Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + + Assertions.assertNotNull(responseEntity.getBody()); + Assertions.assertEquals(2, responseEntity.getBody().size()); + Assertions.assertEquals(1L, responseEntity.getBody().get(0).getId()); + Assertions.assertEquals("TestTeam1", responseEntity.getBody().get(0).getName()); + + Assertions.assertEquals(2L, responseEntity.getBody().get(1).getId()); + Assertions.assertEquals("TestTeam2", responseEntity.getBody().get(1).getName()); + + Assertions.assertNotNull(responseEntity.getBody().get(1).getMembers()); + Assertions.assertEquals(1, responseEntity.getBody().get(1).getMembers().size()); + Assertions.assertEquals(3L, responseEntity.getBody().get(1).getMembers().get(0).getId()); + Assertions.assertEquals( + "TestUser1", responseEntity.getBody().get(1).getMembers().get(0).getUsername()); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/ListTeamsForProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/ListTeamsForProjectControllerTest.java new file mode 100644 index 000000000..ab827554c --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/ListTeamsForProjectControllerTest.java @@ -0,0 +1,69 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.teams; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.projectadministration.ProjectNotFoundException; +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.teams.ListTeamsForProjectController; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListTeamsForProjectUseCase; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class ListTeamsForProjectControllerTest extends UnitTestTemplate { + + private final ListTeamsForProjectUseCase listTeamsForProjectUseCase = + mock(ListTeamsForProjectUseCase.class); + private final ListTeamsForProjectController testController = + new ListTeamsForProjectController(listTeamsForProjectUseCase, authenticationService); + + @BeforeEach + void setUp() { + Mockito.when(listTeamsForProjectUseCase.listTeamsForProject(5L)) + .thenReturn( + Arrays.asList( + new Team().setId(1L).setName("TestTeam1"), + new Team() + .setId(2L) + .setName("TestTeam2") + .setMembers( + Collections.singletonList(new User().setId(3L).setUsername("TestUser1"))))); + } + + @Test + void testListTeams() { + ResponseEntity> responseEntity = testController.listTeamsForProject(5L); + Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + + Assertions.assertNotNull(responseEntity.getBody()); + Assertions.assertEquals(2, responseEntity.getBody().size()); + Assertions.assertEquals(1L, responseEntity.getBody().get(0).getId()); + Assertions.assertEquals("TestTeam1", responseEntity.getBody().get(0).getName()); + + Assertions.assertEquals(2L, responseEntity.getBody().get(1).getId()); + Assertions.assertEquals("TestTeam2", responseEntity.getBody().get(1).getName()); + + Assertions.assertNotNull(responseEntity.getBody().get(1).getMembers()); + Assertions.assertEquals(1, responseEntity.getBody().get(1).getMembers().size()); + Assertions.assertEquals(3L, responseEntity.getBody().get(1).getMembers().get(0).getId()); + Assertions.assertEquals( + "TestUser1", responseEntity.getBody().get(1).getMembers().get(0).getUsername()); + } + + @Test + void testListProjectsForUserThrowsWhenProjectNotFound() { + Mockito.when(listTeamsForProjectUseCase.listTeamsForProject(8L)) + .thenThrow(new ProjectNotFoundException(1L)); + Assertions.assertThrows( + ProjectNotFoundException.class, () -> testController.listTeamsForProject(8L)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/ListTeamsForUserControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/ListTeamsForUserControllerTest.java new file mode 100644 index 000000000..85d72a4ee --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/ListTeamsForUserControllerTest.java @@ -0,0 +1,77 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.teams; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.teams.ListTeamsForUserController; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.domain.Team; +import io.reflectoring.coderadar.useradministration.domain.User; +import io.reflectoring.coderadar.useradministration.port.driver.teams.get.ListTeamsForUserUseCase; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class ListTeamsForUserControllerTest extends UnitTestTemplate { + + private final ListTeamsForUserUseCase listTeamsForUserUseCase = + mock(ListTeamsForUserUseCase.class); + private final ListTeamsForUserController testController = + new ListTeamsForUserController(listTeamsForUserUseCase); + + @BeforeEach + void setUp() { + Mockito.when(listTeamsForUserUseCase.listTeamsForUser(5L)) + .thenReturn( + Arrays.asList( + new Team() + .setId(1L) + .setName("TestTeam1") + .setMembers( + Collections.singletonList(new User().setId(5L).setUsername("TestUser1"))), + new Team() + .setId(2L) + .setName("TestTeam2") + .setMembers( + Collections.singletonList(new User().setId(5L).setUsername("TestUser1"))))); + } + + @Test + void testListTeamsForUser() { + ResponseEntity> responseEntity = testController.listTeamsForUser(5L); + Assertions.assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + + Assertions.assertNotNull(responseEntity.getBody()); + Assertions.assertEquals(2, responseEntity.getBody().size()); + Assertions.assertEquals(1L, responseEntity.getBody().get(0).getId()); + Assertions.assertEquals("TestTeam1", responseEntity.getBody().get(0).getName()); + Assertions.assertNotNull(responseEntity.getBody().get(0).getMembers()); + Assertions.assertEquals(1, responseEntity.getBody().get(0).getMembers().size()); + Assertions.assertEquals(5L, responseEntity.getBody().get(0).getMembers().get(0).getId()); + Assertions.assertEquals( + "TestUser1", responseEntity.getBody().get(0).getMembers().get(0).getUsername()); + + Assertions.assertEquals(2L, responseEntity.getBody().get(1).getId()); + Assertions.assertEquals("TestTeam2", responseEntity.getBody().get(1).getName()); + + Assertions.assertNotNull(responseEntity.getBody().get(1).getMembers()); + Assertions.assertEquals(1, responseEntity.getBody().get(1).getMembers().size()); + Assertions.assertEquals(5L, responseEntity.getBody().get(1).getMembers().get(0).getId()); + Assertions.assertEquals( + "TestUser1", responseEntity.getBody().get(1).getMembers().get(0).getUsername()); + } + + @Test + void testListProjectsForUserThrowsWhenUserNotFound() { + Mockito.when(listTeamsForUserUseCase.listTeamsForUser(8L)) + .thenThrow(new UserNotFoundException(1L)); + Assertions.assertThrows(UserNotFoundException.class, () -> testController.listTeamsForUser(8L)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/RemoveTeamFromProjectControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/RemoveTeamFromProjectControllerTest.java new file mode 100644 index 000000000..bd163355c --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/RemoveTeamFromProjectControllerTest.java @@ -0,0 +1,46 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.teams; + +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.projectadministration.ProjectNotFoundException; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.teams.RemoveTeamFromProjectController; +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driver.teams.RemoveTeamFromProjectUseCase; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class RemoveTeamFromProjectControllerTest extends UnitTestTemplate { + private final RemoveTeamFromProjectUseCase removeTeamFromProjectUseCase = + mock(RemoveTeamFromProjectUseCase.class); + private final RemoveTeamFromProjectController testController = + new RemoveTeamFromProjectController(removeTeamFromProjectUseCase, authenticationService); + + @Test + void testRemoveTeamFromProject() { + ResponseEntity response = testController.removeTeamFromProject(1L, 2L); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + @Test + void testRemoveTeamFromProjectThrowsExceptionWhenTeamNotFound() { + Mockito.doThrow(TeamNotFoundException.class) + .when(removeTeamFromProjectUseCase) + .removeTeam(1L, 2L); + Assertions.assertThrows( + TeamNotFoundException.class, () -> testController.removeTeamFromProject(1L, 2L)); + } + + @Test + void testRemoveTeamFromProjectThrowsExceptionWhenProjectNotFound() { + Mockito.doThrow(ProjectNotFoundException.class) + .when(removeTeamFromProjectUseCase) + .removeTeam(1L, 2L); + Assertions.assertThrows( + ProjectNotFoundException.class, () -> testController.removeTeamFromProject(1L, 2L)); + } +} diff --git a/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/RemoveUsersFromTeamControllerTest.java b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/RemoveUsersFromTeamControllerTest.java new file mode 100644 index 000000000..6e1f1cc60 --- /dev/null +++ b/coderadar-rest/src/test/java/io/reflectoring/coderadar/rest/unit/useradministration/teams/RemoveUsersFromTeamControllerTest.java @@ -0,0 +1,54 @@ +package io.reflectoring.coderadar.rest.unit.useradministration.teams; + +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.mock; + +import io.reflectoring.coderadar.rest.JsonListWrapper; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.rest.unit.UnitTestTemplate; +import io.reflectoring.coderadar.rest.useradministration.teams.RemoveUsersFromTeamController; +import io.reflectoring.coderadar.useradministration.TeamNotFoundException; +import io.reflectoring.coderadar.useradministration.UserNotFoundException; +import io.reflectoring.coderadar.useradministration.port.driver.teams.RemoveUsersFromTeamUseCase; +import java.util.Collections; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +class RemoveUsersFromTeamControllerTest extends UnitTestTemplate { + private final RemoveUsersFromTeamUseCase removeUsersFromTeamUseCase = + mock(RemoveUsersFromTeamUseCase.class); + private final RemoveUsersFromTeamController testController = + new RemoveUsersFromTeamController(removeUsersFromTeamUseCase); + + @Test + void testRemoveUsersFromTeam() { + ResponseEntity response = + testController.removeUsersFromTeam( + 1L, new JsonListWrapper<>(Collections.singletonList(2L))); + Assertions.assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + @Test + void testRemoveTeamFromProjectThrowsExceptionWhenTeamNotFound() { + Mockito.doThrow(TeamNotFoundException.class) + .when(removeUsersFromTeamUseCase) + .removeUsersFromTeam(anyLong(), anyList()); + JsonListWrapper jsonListWrapper = new JsonListWrapper<>(Collections.singletonList(2L)); + Assertions.assertThrows( + TeamNotFoundException.class, () -> testController.removeUsersFromTeam(1L, jsonListWrapper)); + } + + @Test + void testRemoveTeamFromProjectThrowsExceptionWhenUserNotFound() { + Mockito.doThrow(UserNotFoundException.class) + .when(removeUsersFromTeamUseCase) + .removeUsersFromTeam(anyLong(), anyList()); + JsonListWrapper jsonListWrapper = new JsonListWrapper<>(Collections.singletonList(2L)); + Assertions.assertThrows( + UserNotFoundException.class, () -> testController.removeUsersFromTeam(1L, jsonListWrapper)); + } +} diff --git a/coderadar-test/build.gradle b/coderadar-test/build.gradle index 1ca463f66..5976b9c94 100644 --- a/coderadar-test/build.gradle +++ b/coderadar-test/build.gradle @@ -3,12 +3,13 @@ import java.text.SimpleDateFormat apply plugin: "com.diffplug.gradle.spotless" apply plugin: "org.asciidoctor.convert" apply plugin: "org.ajoberstar.git-publish" +apply plugin: "jacoco" ext { snippetsDir = file("build/generated-snippets") } -sourceCompatibility = 1.8 +sourceCompatibility = 11 repositories { mavenCentral() diff --git a/coderadar-test/src/main/asciidoc/restapi.adoc b/coderadar-test/src/main/asciidoc/restapi.adoc index c9954b820..8008e405d 100644 --- a/coderadar-test/src/main/asciidoc/restapi.adoc +++ b/coderadar-test/src/main/asciidoc/restapi.adoc @@ -81,7 +81,27 @@ If some unexpected error occurs during the processing of a request, the API retu anchor:chapter-configure[] This section describes the REST endpoints for managing coderadar users. -=== Users +=== Loading a User + +==== Example Request + +include::{snippets}/users/get/http-request.adoc[] + +==== Example Response + +include::{snippets}/users/get/http-response.adoc[] + +=== Listing all Users + +===== Example Request + +include::{snippets}/users/list/http-request.adoc[] + +===== Example Response + +include::{snippets}/users/list/http-response.adoc[] + +=== Authentication To access the functionality of coderadar you have to register a user. You need to define a username and a password. The password will be sent as plain text and hashed on server side for persisting. @@ -148,7 +168,7 @@ and has to send a new password and thе refresh token to the server. The user wi refresh token and his refresh tokens will be revoked so the user has to log in with the username and password again after the current access token is expired. -===== Login Data Structure +===== Data Structure include::{snippets}/user/password/change/request-fields.adoc[] ===== Example Request @@ -186,11 +206,48 @@ A typical work flow looks like this: . Client requires resources using the access token in each request . After 15 minutes client gets a 401-Response . Clients tries to get a new access token using refresh token -. Clients gets a new acess token and can request further resources +. Clients gets a new access token and can request further resources . If the client can't get a new access token using the refresh token, client has to login again with username and password. See more: https://auth0.com/docs/tokens/refresh-token and https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/ +=== User Permissions + +Users can be assigned to projects with a specific role. + +==== Set user role in a project + +include::{snippets}/user/role/project/set/request-fields.adoc[] + +===== Example Request +include::{snippets}/user/role/project/set/http-request.adoc[] + +===== Example Response +include::{snippets}/user/role/project/set/http-response.adoc[] + +==== Remove user role from a project + +===== Example Request +include::{snippets}/user/role/project/remove/http-request.adoc[] + +===== Example Response +include::{snippets}/user/role/project/remove/http-response.adoc[] + +==== List all projects for a user + +===== Example Request +include::{snippets}/user/list/projects/http-request.adoc[] + +===== Example Response +include::{snippets}/user/list/projects/http-response.adoc[] + +==== List all users for a project + +===== Example Request +include::{snippets}/project/list/users/http-request.adoc[] + +===== Example Response +include::{snippets}/project/list/users/http-response.adoc[] == Configuring a Project anchor:chapter-configure[] @@ -839,7 +896,6 @@ include::{snippets}/contributors/update/http-response.adoc[] - == Coderadar Core Metrics === Get Critical Files of a Project @@ -872,3 +928,123 @@ include::{snippets}/metrics/criticalFiles/modificationFrequency/http-request.ado ===== Example Response include::{snippets}/metrics/criticalFiles/modificationFrequency/http-response.adoc[] + +== Teams + +=== Creating a team + +include::{snippets}/teams/create/request-fields.adoc[] + +==== Example Request + +include::{snippets}/teams/create/http-request.adoc[] + +==== Example Response + +include::{snippets}/teams/create/http-response.adoc[] + +=== Deleting a team + +==== Example Request + +include::{snippets}/teams/delete/http-request.adoc[] + +==== Example Response + +include::{snippets}/teams/delete/http-response.adoc[] + +=== Add users to a team + +include::{snippets}/teams/add/user/request-fields.adoc[] + +==== Example Request + +include::{snippets}/teams/add/user/http-request.adoc[] + +==== Example Response + +include::{snippets}/teams/add/user/http-response.adoc[] + +=== Remove users from a team + +include::{snippets}/teams/remove/user/request-fields.adoc[] + +==== Example Request + +include::{snippets}/teams/remove/user/http-request.adoc[] + +==== Example Response + +include::{snippets}/teams/remove/user/http-response.adoc[] + +=== Retrieve a single team + +==== Example Request + +include::{snippets}/teams/get/http-request.adoc[] + +==== Example Response + +include::{snippets}/teams/get/http-response.adoc[] + +=== List all teams + +==== Example Request + +include::{snippets}/teams/list/http-request.adoc[] + +==== Example Response + +include::{snippets}/teams/list/http-response.adoc[] + +=== Assign a team to a project + +include::{snippets}/teams/add/project/request-fields.adoc[] + +==== Example Request + +include::{snippets}/teams/add/project/http-request.adoc[] + +==== Example Response + +include::{snippets}/teams/add/project/http-response.adoc[] + +=== Remove a team from a project + +==== Example Request + +include::{snippets}/teams/remove/project/http-request.adoc[] + +==== Example Response + +include::{snippets}/teams/remove/project/http-response.adoc[] + +=== List teams assigned to a project + +==== Example Request + +include::{snippets}/teams/list/project/http-request.adoc[] + +==== Example Response + +include::{snippets}/teams/list/project/http-response.adoc[] + +=== List teams a user is in + +==== Example Request + +include::{snippets}/teams/list/user/http-request.adoc[] + +==== Example Response + +include::{snippets}/teams/list/user/http-response.adoc[] + +=== List all projects for a team + +==== Example Request + +include::{snippets}/teams/list/projects/http-request.adoc[] + +==== Example Response + +include::{snippets}/teams/list/projects/http-response.adoc[] diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/IntegrationTestTemplate.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/IntegrationTestTemplate.java index 6eea9061d..c162e3989 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/IntegrationTestTemplate.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/IntegrationTestTemplate.java @@ -1,7 +1,11 @@ package io.reflectoring.coderadar.rest; +import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.transaction.annotation.Transactional; @@ -12,8 +16,17 @@ @Transactional public abstract class IntegrationTestTemplate { + @Autowired private ProjectRepository projectRepository; + @Autowired private UserRepository userRepository; + @BeforeEach public void setup() { MockitoAnnotations.initMocks(this); } + + @AfterEach + void tearDown() { + projectRepository.deleteAll(); + userRepository.deleteAll(); + } } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analysis/PaySimProjectIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analysis/PaySimProjectIntegrationTest.java index 74038fa0c..a803e83af 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analysis/PaySimProjectIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analysis/PaySimProjectIntegrationTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.fasterxml.jackson.core.type.TypeReference; import io.reflectoring.coderadar.graph.analyzer.domain.AnalyzerConfigurationEntity; @@ -47,7 +48,6 @@ import org.springframework.http.MediaType; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.web.servlet.MvcResult; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -107,7 +107,7 @@ private void testCreatingModule(Long projectId) throws Exception { post("/api/projects/" + projectId + "/modules") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(status().isCreated()) .andReturn(); List modules = moduleRepository.findModulesInProjectSortedDesc(projectId); @@ -177,7 +177,7 @@ private void testUpdatingProject(Long projectId) throws Exception { post("/api/projects/" + projectId) .content(toJson(updateProjectCommand)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andReturn(); // Number of commits correct? @@ -385,7 +385,7 @@ private void testSavingAnalyzerConfiguration(Long projectId) throws Exception { post("/api/projects/" + projectId + "/analyzers") .content(toJson(analyzerConfigurationCommand)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(status().isCreated()) .andReturn(); // Configuration saved? @@ -409,7 +409,7 @@ private void testSavingFilePatterns(Long projectId) throws Exception { post("/api/projects/" + projectId + "/filePatterns") .content(toJson(filePatternCommand)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(status().isCreated()) .andReturn(); // Patterns saved? @@ -430,7 +430,7 @@ private Long testSavingProject() throws Exception { mvc() .perform( post("/api/projects").contentType(MediaType.APPLICATION_JSON).content(toJson(command))) - .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(status().isCreated()) .andReturn(); // Is the project saved? diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/CreateAnalyzerConfigControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/CreateAnalyzerConfigControllerIntegrationTest.java index fe35d45bf..0bd3fec3a 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/CreateAnalyzerConfigControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/CreateAnalyzerConfigControllerIntegrationTest.java @@ -4,6 +4,7 @@ import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.analyzer.domain.AnalyzerConfigurationEntity; import io.reflectoring.coderadar.graph.projectadministration.analyzerconfig.repository.AnalyzerConfigurationRepository; @@ -41,7 +42,7 @@ void createAnalyzerConfigurationSuccessfully() throws Exception { post("/api/projects/" + testProject.getId() + "/analyzers") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(status().isCreated()) .andExpect(containsResource(IdResponse.class)) .andDo( result -> { @@ -79,7 +80,7 @@ void createAnalyzerConfigurationReturnsErrorWhenProjectNotFound() throws Excepti post("/api/projects/1/analyzers") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage").value("Project with id 1 not found.")); } @@ -93,7 +94,7 @@ void createAnalyzerConfigurationReturnsErrorWhenAnalyzerNotFound() throws Except post("/api/projects/1/analyzers") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage") .value("Analyzer with name analyzer not found")); @@ -119,7 +120,7 @@ void createAnalyzerConfigurationReturnsErrorWhenAnalyzerAlreadyConfigured() thro post("/api/projects/" + testProject.getId() + "/analyzers") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isConflict()) + .andExpect(status().isConflict()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage") .value("An analyzer with this name is already configured for the project!")); @@ -133,6 +134,6 @@ void createAnalyzerConfigurationReturnsErrorWhenRequestIsInvalid() throws Except post("/api/projects/1/analyzers") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isBadRequest()); + .andExpect(status().isBadRequest()); } } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/DeleteAnalyzerConfigControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/DeleteAnalyzerConfigControllerIntegrationTest.java index f64cafa11..e6d5d85f8 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/DeleteAnalyzerConfigControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/DeleteAnalyzerConfigControllerIntegrationTest.java @@ -1,6 +1,7 @@ package io.reflectoring.coderadar.rest.analyzerconfig; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.analyzer.domain.AnalyzerConfigurationEntity; import io.reflectoring.coderadar.graph.projectadministration.analyzerconfig.repository.AnalyzerConfigurationRepository; @@ -39,7 +40,7 @@ void deleteAnalyzerConfigurationWithId() throws Exception { + testProject.getId() + "/analyzers/" + analyzerConfiguration.getId())) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andDo( result -> { Assertions.assertFalse(analyzerConfigurationRepository.findById(id).isPresent()); @@ -51,7 +52,7 @@ void deleteAnalyzerConfigurationWithId() throws Exception { void deleteAnalyzerConfigurationReturnsErrorWhenAnalyzerNotFound() throws Exception { mvc() .perform(delete("/api/projects/0/analyzers/2")) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage") .value("AnalyzerConfiguration with id 2 not found.")); diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/GetAnalyzerConfigControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/GetAnalyzerConfigControllerIntegrationTest.java index 227763086..5686289c2 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/GetAnalyzerConfigControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/GetAnalyzerConfigControllerIntegrationTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.analyzer.domain.AnalyzerConfigurationEntity; import io.reflectoring.coderadar.graph.projectadministration.analyzerconfig.repository.AnalyzerConfigurationRepository; @@ -41,7 +42,7 @@ void getAnalyzerConfigurationWithId() throws Exception { + testProject.getId() + "/analyzers/" + analyzerConfiguration.getId())) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(containsResource(GetAnalyzerConfigurationResponse.class)) .andDo( result -> { @@ -59,7 +60,7 @@ void getAnalyzerConfigurationWithId() throws Exception { void getAnalyzerConfigurationReturnsErrorWhenNotFound() throws Exception { mvc() .perform(get("/api/projects/0/analyzers/2")) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage") .value("AnalyzerConfiguration with id 2 not found.")) diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/ListAnalyzerConfigsFromProjectControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/ListAnalyzerConfigsFromProjectControllerIntegrationTest.java index 9ccc23385..afeb25649 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/ListAnalyzerConfigsFromProjectControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/ListAnalyzerConfigsFromProjectControllerIntegrationTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.analyzer.domain.AnalyzerConfigurationEntity; import io.reflectoring.coderadar.graph.projectadministration.analyzerconfig.repository.AnalyzerConfigurationRepository; @@ -50,7 +51,7 @@ void listAnalyzerConfigurationsFromProject() throws Exception { // Test mvc() .perform(get("/api/projects/" + testProject.getId() + "/analyzers")) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(containsResource(GetAnalyzerConfigurationResponse[].class)) .andExpect( result -> { @@ -67,7 +68,7 @@ void listAnalyzerConfigurationsFromProject() throws Exception { void listAnalyzerConfigurationsReturnsErrorWhenProjectNotFound() throws Exception { mvc() .perform(get("/api/projects/1/analyzers")) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage").value("Project with id 1 not found.")); } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/UpdateAnalyzerConfigControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/UpdateAnalyzerConfigControllerIntegrationTest.java index ffcc7b6b0..6960f928c 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/UpdateAnalyzerConfigControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzerconfig/UpdateAnalyzerConfigControllerIntegrationTest.java @@ -1,6 +1,7 @@ package io.reflectoring.coderadar.rest.analyzerconfig; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.analyzer.domain.AnalyzerConfigurationEntity; import io.reflectoring.coderadar.graph.projectadministration.analyzerconfig.repository.AnalyzerConfigurationRepository; @@ -47,7 +48,7 @@ void updateAnalyzerConfigurationWithId() throws Exception { + analyzerConfiguration.getId()) .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andDo( result -> { AnalyzerConfigurationEntity configuration = @@ -69,7 +70,7 @@ void updateAnalyzerConfigurationReturnsErrorWhenAnalyzerDoesNotExist() throws Ex post("/api/projects/0/analyzers/2") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage") .value("AnalyzerConfiguration with id 2 not found.")); @@ -108,7 +109,7 @@ void updateAnalyzerConfigurationReturnsErrorWhenAnalyzerAlreadyConfigured() thro post("/api/projects/" + testProject.getId() + "/analyzers/" + id) .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isConflict()) + .andExpect(status().isConflict()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage") .value("An analyzer with this name is already configured for the project!")); @@ -124,7 +125,7 @@ void updateAnalyzerConfigurationReturnsErrorWhenNotFound() throws Exception { post("/api/projects/0/analyzers/2") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage") .value("AnalyzerConfiguration with id 2 not found.")); @@ -138,6 +139,6 @@ void updateAnalyzerConfigurationReturnsErrorWhenRequestInvalid() throws Exceptio post("/api/projects/0/analyzers/1") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isBadRequest()); + .andExpect(status().isBadRequest()); } } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzing/ListAnalyzerControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzing/ListAnalyzerControllerIntegrationTest.java index f9bef9fb0..56a038e53 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzing/ListAnalyzerControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/analyzing/ListAnalyzerControllerIntegrationTest.java @@ -2,27 +2,25 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.fasterxml.jackson.core.type.TypeReference; import io.reflectoring.coderadar.rest.ControllerTestTemplate; import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; -public class ListAnalyzerControllerIntegrationTest extends ControllerTestTemplate { +class ListAnalyzerControllerIntegrationTest extends ControllerTestTemplate { @Test void getAvailableAnalyzers() throws Exception { mvc() .perform(get("/api/analyzers")) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andDo( result -> { List results = - fromJson( - new TypeReference>() {}, - result.getResponse().getContentAsString()); + fromJson(new TypeReference<>() {}, result.getResponse().getContentAsString()); Assertions.assertTrue( results.contains("io.reflectoring.coderadar.analyzer.loc.LocAnalyzerPlugin")); Assertions.assertTrue( diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/authentication/AuthenticationServiceIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/authentication/AuthenticationServiceIntegrationTest.java new file mode 100644 index 000000000..b23682962 --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/authentication/AuthenticationServiceIntegrationTest.java @@ -0,0 +1,133 @@ +package io.reflectoring.coderadar.rest.authentication; + +import io.reflectoring.coderadar.CoderadarConfigurationProperties; +import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; +import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import io.reflectoring.coderadar.useradministration.port.driver.login.LoginUserCommand; +import io.reflectoring.coderadar.useradministration.service.UserUnauthenticatedException; +import io.reflectoring.coderadar.useradministration.service.UserUnauthorizedException; +import io.reflectoring.coderadar.useradministration.service.login.LoginUserService; +import io.reflectoring.coderadar.useradministration.service.permissions.SetUserRoleForProjectService; +import io.reflectoring.coderadar.useradministration.service.security.AuthenticationService; +import io.reflectoring.coderadar.useradministration.service.security.PasswordUtil; +import java.util.Date; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; + +class AuthenticationServiceIntegrationTest extends ControllerTestTemplate { + + @Autowired private UserRepository userRepository; + + @Autowired private ProjectRepository projectRepository; + + @Autowired private AuthenticationService authenticationService; + + @Autowired private SetUserRoleForProjectService setUserRoleForProjectService; + + @Autowired private LoginUserService loginUserService; + + @Autowired private CoderadarConfigurationProperties coderadarConfigurationProperties; + + private ProjectEntity testProject; + private UserEntity testUser; + + private Long projectId; + + @BeforeEach + void setUp() { + coderadarConfigurationProperties.setAuthentication( + new CoderadarConfigurationProperties.Authentication().setEnabled(true)); + + testProject = new ProjectEntity(); + testProject.setVcsUrl("https://valid.url"); + testProject.setName("project"); + testProject.setVcsStart(new Date()); + testProject.setVcsOnline(true); + testProject.setVcsPassword("testPassword"); + testProject.setVcsUsername("testUser"); + projectId = projectRepository.save(testProject).getId(); + + testUser = new UserEntity(); + testUser.setUsername("username1"); + testUser.setPassword(PasswordUtil.hash("password1")); + userRepository.save(testUser); + loginUserService.login(new LoginUserCommand("username1", "password1")); + } + + @AfterEach + void tearDown() { + coderadarConfigurationProperties.setAuthentication( + new CoderadarConfigurationProperties.Authentication().setEnabled(false)); + SecurityContextHolder.getContext().setAuthentication(null); + } + + @Test + void testUserIsAuthenticatedAsAdmin() { + // Set up + SecurityContextHolder.getContext() + .setAuthentication(new UsernamePasswordAuthenticationToken("username1", "password1")); + setUserRoleForProjectService.setRole(testProject.getId(), testUser.getId(), ProjectRole.ADMIN); + + // Test + Assertions.assertDoesNotThrow(() -> authenticationService.authenticateAdmin(projectId)); + Assertions.assertDoesNotThrow(() -> authenticationService.authenticateMember(projectId)); + } + + @Test + void testUserIsAuthenticatedAsMember() { + // Set up + SecurityContextHolder.getContext() + .setAuthentication(new UsernamePasswordAuthenticationToken("username1", "password1")); + setUserRoleForProjectService.setRole(testProject.getId(), testUser.getId(), ProjectRole.MEMBER); + + // Test + Assertions.assertDoesNotThrow(() -> authenticationService.authenticateMember(projectId)); + Assertions.assertThrows( + UserUnauthorizedException.class, () -> authenticationService.authenticateAdmin(projectId)); + } + + @Test + void testThrowsExceptionWhenUserIsUnauthenticated() { + Assertions.assertThrows( + UserUnauthenticatedException.class, + () -> authenticationService.authenticateAdmin(projectId)); + Assertions.assertThrows( + UserUnauthenticatedException.class, + () -> authenticationService.authenticateMember(projectId)); + } + + @Test + void testThrowsExceptionWhenUserIsNotAdmin() { + // Set up + SecurityContextHolder.getContext() + .setAuthentication(new UsernamePasswordAuthenticationToken("username1", "password1")); + setUserRoleForProjectService.setRole(testProject.getId(), testUser.getId(), ProjectRole.MEMBER); + + // Test + Assertions.assertThrows( + UserUnauthorizedException.class, () -> authenticationService.authenticateAdmin(projectId)); + Assertions.assertDoesNotThrow(() -> authenticationService.authenticateMember(projectId)); + } + + @Test + void testThrowsExceptionWhenUserHasNoRole() { + // Set up + SecurityContextHolder.getContext() + .setAuthentication(new UsernamePasswordAuthenticationToken("username1", "password1")); + + // Test + Assertions.assertThrows( + UserUnauthorizedException.class, () -> authenticationService.authenticateAdmin(projectId)); + Assertions.assertThrows( + UserUnauthorizedException.class, () -> authenticationService.authenticateMember(projectId)); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/branches/DeleteBranchTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/branches/DeleteBranchTest.java index 63e292f0d..124aaca14 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/branches/DeleteBranchTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/branches/DeleteBranchTest.java @@ -14,7 +14,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -public class DeleteBranchTest extends ControllerTestTemplate { +class DeleteBranchTest extends ControllerTestTemplate { @Autowired private CreateProjectService createProjectService; diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/branches/ListBranchesControllerTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/branches/ListBranchesControllerTest.java index 521e7327c..96dc201da 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/branches/ListBranchesControllerTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/branches/ListBranchesControllerTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.projectadministration.port.driver.project.create.CreateProjectCommand; import io.reflectoring.coderadar.projectadministration.service.project.CreateProjectService; @@ -15,7 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; -public class ListBranchesControllerTest extends ControllerTestTemplate { +class ListBranchesControllerTest extends ControllerTestTemplate { @Autowired private CreateProjectService createProjectService; @@ -35,7 +36,7 @@ void listAllBranchesOfProjectWithId() throws Exception { // Test mvc() .perform(get("/api/projects/" + projectId + "/branches")) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(containsResource(GetBranchResponse[].class)) .andExpect( result -> { @@ -53,7 +54,7 @@ void listAllBranchesOfProjectWithId() throws Exception { void listAllBranchesOfProjectReturnsErrorWhenProjectNotFound() throws Exception { mvc() .perform(get("/api/projects/100/branches")) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage").value("Project with id 100 not found.")); } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/branches/SaveProjectWithBranchesTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/branches/SaveProjectWithBranchesTest.java index ec22d38b1..b2700f29f 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/branches/SaveProjectWithBranchesTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/branches/SaveProjectWithBranchesTest.java @@ -2,6 +2,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.analyzer.repository.CommitRepository; import io.reflectoring.coderadar.graph.projectadministration.branch.repository.BranchRepository; @@ -16,9 +17,8 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; -public class SaveProjectWithBranchesTest extends ControllerTestTemplate { +class SaveProjectWithBranchesTest extends ControllerTestTemplate { @Autowired private CommitRepository commitRepository; @Autowired private BranchRepository branchRepository; @@ -31,10 +31,10 @@ void createProjectWithBranchesSuccessfully() throws Exception { mvc() .perform( post("/api/projects").contentType(MediaType.APPLICATION_JSON).content(toJson(command))) - .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(status().isCreated()) .andDo( result -> { - Long id = + long id = fromJson(result.getResponse().getContentAsString(), IdResponse.class).getId(); List branches = branchRepository.getBranchesInProjectSortedByName(id); Assertions.assertEquals(3L, branches.size()); diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/GetContributorControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/GetContributorControllerIntegrationTest.java index 2706ff7be..3e74e2745 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/GetContributorControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/GetContributorControllerIntegrationTest.java @@ -23,12 +23,12 @@ import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultHandler; -public class GetContributorControllerIntegrationTest extends ControllerTestTemplate { +class GetContributorControllerIntegrationTest extends ControllerTestTemplate { @Autowired private ContributorRepository contributorRepository; @Autowired private SessionFactory sessionFactory; @Test - public void getSingleContributor() throws Exception { + void getSingleContributor() throws Exception { URL testRepoURL = this.getClass().getClassLoader().getResource("test-repository"); CreateProjectCommand command1 = new CreateProjectCommand( diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/ListContributorsControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/ListContributorsControllerIntegrationTest.java index d5f65689b..47be25730 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/ListContributorsControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/ListContributorsControllerIntegrationTest.java @@ -22,7 +22,7 @@ import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultHandler; -public class ListContributorsControllerIntegrationTest extends ControllerTestTemplate { +class ListContributorsControllerIntegrationTest extends ControllerTestTemplate { private long projectId; @@ -49,7 +49,7 @@ public void setUp() throws Exception { } @Test - public void listContributors() throws Exception { + void listContributors() throws Exception { MvcResult result = mvc() .perform( @@ -68,7 +68,7 @@ public void listContributors() throws Exception { } @Test - public void listContributorsForFile() throws Exception { + void listContributorsForFile() throws Exception { GetContributorsForPathCommand command = new GetContributorsForPathCommand( "GetMetricsForCommitCommand.java", "e9f7ff6fdd8c0863fdb5b24c9ed35a3651e20382"); @@ -98,7 +98,7 @@ public void listContributorsForFile() throws Exception { } @Test - public void listContributorsForDirectory() throws Exception { + void listContributorsForDirectory() throws Exception { GetContributorsForPathCommand command = new GetContributorsForPathCommand( "testModule1", "e9f7ff6fdd8c0863fdb5b24c9ed35a3651e20382"); diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/MergeContributorsControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/MergeContributorsControllerIntegrationTest.java index 0e5e641e1..49ae68a70 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/MergeContributorsControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/MergeContributorsControllerIntegrationTest.java @@ -19,11 +19,11 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.ResultHandler; -public class MergeContributorsControllerIntegrationTest extends ControllerTestTemplate { +class MergeContributorsControllerIntegrationTest extends ControllerTestTemplate { @Autowired private ContributorRepository contributorRepository; @Test - public void mergesTwoContributors() throws Exception { + void mergesTwoContributors() throws Exception { URL testRepoURL = this.getClass().getClassLoader().getResource("test-repository"); CreateProjectCommand command1 = new CreateProjectCommand( diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/UpdateContributorControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/UpdateContributorControllerIntegrationTest.java index 52a714340..b74b3bef7 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/UpdateContributorControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/contributor/UpdateContributorControllerIntegrationTest.java @@ -17,11 +17,11 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.ResultHandler; -public class UpdateContributorControllerIntegrationTest extends ControllerTestTemplate { +class UpdateContributorControllerIntegrationTest extends ControllerTestTemplate { @Autowired private ContributorRepository contributorRepository; @Test - public void updateContributor() throws Exception { + void updateContributor() throws Exception { URL testRepoURL = this.getClass().getClassLoader().getResource("test-repository"); CreateProjectCommand command1 = new CreateProjectCommand( diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/dependencymap/CompareTreeTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/dependencymap/CompareTreeTest.java index 613cbcf3d..ed958c7a7 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/dependencymap/CompareTreeTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/dependencymap/CompareTreeTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.CoderadarConfigurationProperties; import io.reflectoring.coderadar.dependencymap.adapter.DependencyCompareTreeAdapter; @@ -28,9 +29,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; -public class CompareTreeTest extends ControllerTestTemplate { +class CompareTreeTest extends ControllerTestTemplate { private CompareNode root; private File f; @@ -89,7 +89,7 @@ public void initEach() { + commitName + "/" + commitName2)) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(containsResource(CompareNode.class)) .andDo( result -> @@ -120,7 +120,7 @@ private void deleteFile(File f) { } @Test - public void testCreateTree() { + void testCreateTree() { Assertions.assertNotNull(root); Assertions.assertEquals("testSrc", root.getFilename()); Assertions.assertEquals(1, root.getChildren().size()); @@ -354,7 +354,7 @@ public void testCreateTree() { } @Test - public void testHasDependencyOn() { + void testHasDependencyOn() { Assertions.assertNotNull(root); CompareNode wildcardpackage = root.getNodeByPath("src/org/wickedsource/dependencytree/wildcardpackage"); @@ -370,7 +370,7 @@ public void testHasDependencyOn() { } @Test - public void testCountDependenciesOn() { + void testCountDependenciesOn() { Assertions.assertNotNull(root); CompareNode wildcardpackage = root.getNodeByPath("src/org/wickedsource/dependencytree/wildcardpackage"); @@ -389,21 +389,21 @@ public void testCountDependenciesOn() { } @Test - public void testGetNodeFromImportNoClass() { + void testGetNodeFromImportNoClass() { List imports = dependencyTree.getNodeFromImport("org.wickedsource.dependencytree.sbdfjksbdf"); Assertions.assertEquals(0, imports.size()); } @Test - public void testGetNodeFromImportWildcard() { + void testGetNodeFromImportWildcard() { List imports = dependencyTree.getNodeFromImport("org.wickedsource.dependencytree.wildcardpackage.*"); Assertions.assertEquals(4, imports.size()); } @Test - public void testGetNodeFromImportClass() { + void testGetNodeFromImportClass() { List imports = dependencyTree.getNodeFromImport( "org.wickedsource.dependencytree.somepackage.CoreDependencyTest"); diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/dependencymap/TreeTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/dependencymap/TreeTest.java index 02b461bf4..41a5a8ac6 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/dependencymap/TreeTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/dependencymap/TreeTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.CoderadarConfigurationProperties; import io.reflectoring.coderadar.dependencymap.adapter.DependencyTreeAdapter; @@ -28,9 +29,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; -public class TreeTest extends ControllerTestTemplate { +class TreeTest extends ControllerTestTemplate { private Node root; private File f; @@ -43,7 +43,7 @@ public class TreeTest extends ControllerTestTemplate { @Autowired private GetProjectPort getProjectPort; @BeforeEach - public void initEach() { + void initEach() { try { URL testRepoURL = this.getClass().getClassLoader().getResource("testSrc"); CreateProjectCommand command = new CreateProjectCommand(); @@ -61,7 +61,7 @@ public void initEach() { mvc() .perform(get("/api/analyzers/" + testProject.getId() + "/structureMap/" + commitName)) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(containsResource(Node.class)) .andDo(result -> root = fromJson(result.getResponse().getContentAsString(), Node.class)); Assertions.assertNotNull(root); @@ -89,7 +89,7 @@ private void deleteFile(File f) { } @Test - public void testInPackageDependencies() { + void testInPackageDependencies() { Assertions.assertNotNull(root); Node notADependencyTest = root.getNodeByPath( @@ -99,7 +99,7 @@ public void testInPackageDependencies() { } @Test - public void testCreateTree() { + void testCreateTree() { Assertions.assertNotNull(root); Assertions.assertEquals("testSrc", root.getFilename()); Assertions.assertEquals(1, root.getChildren().size()); @@ -219,7 +219,7 @@ public void testCreateTree() { } @Test - public void testHasDependencyOn() { + void testHasDependencyOn() { Assertions.assertNotNull(root); Node wildcardpackage = root.getNodeByPath("src/org/wickedsource/dependencytree/wildcardpackage"); @@ -235,7 +235,7 @@ public void testHasDependencyOn() { } @Test - public void testCountDependenciesOn() { + void testCountDependenciesOn() { Assertions.assertNotNull(root); Node wildcardpackage = root.getNodeByPath("src/org/wickedsource/dependencytree/wildcardpackage"); @@ -251,21 +251,21 @@ public void testCountDependenciesOn() { } @Test - public void testGetNodeFromImportNoClass() { + void testGetNodeFromImportNoClass() { List imports = dependencyTree.getNodeFromImport("org.wickedsource.dependencytree.sbdfjksbdf"); Assertions.assertEquals(0, imports.size()); } @Test - public void testGetNodeFromImportWildcard() { + void testGetNodeFromImportWildcard() { List imports = dependencyTree.getNodeFromImport("org.wickedsource.dependencytree.wildcardpackage.*"); Assertions.assertEquals(2, imports.size()); } @Test - public void testGetNodeFromImportClass() { + void testGetNodeFromImportClass() { List imports = dependencyTree.getNodeFromImport( "org.wickedsource.dependencytree.somepackage.CoreDependencyTest"); diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/CreateFilePatternControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/CreateFilePatternControllerIntegrationTest.java index e5e6ce5bd..60d6fc3be 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/CreateFilePatternControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/CreateFilePatternControllerIntegrationTest.java @@ -2,6 +2,7 @@ import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.projectadministration.domain.FilePatternEntity; import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; @@ -35,7 +36,7 @@ void createFilePatternSuccessfully() throws Exception { post("/api/projects/" + testProject.getId() + "/filePatterns") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(status().isCreated()) .andDo( result -> { FilePatternEntity filePattern = filePatternRepository.findAll().iterator().next(); @@ -65,7 +66,7 @@ void createFilePatternReturnsErrorWhenProjectDoesNotExist() throws Exception { post("/api/projects/1/filePatterns") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage").value("Project with id 1 not found.")); } @@ -78,6 +79,6 @@ void createFilePatternReturnsErrorWhenRequestIsInvalid() throws Exception { post("/api/projects/1/filePatterns") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isBadRequest()); + .andExpect(status().isBadRequest()); } } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/DeleteFilePatternControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/DeleteFilePatternControllerIntegrationTest.java index e62e3dd6c..a681ab6e4 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/DeleteFilePatternControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/DeleteFilePatternControllerIntegrationTest.java @@ -1,6 +1,7 @@ package io.reflectoring.coderadar.rest.filepattern; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.projectadministration.domain.FilePatternEntity; import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; @@ -35,7 +36,7 @@ void deleteFilePatternWithId() throws Exception { mvc() .perform( delete("/api/projects/" + testProject.getId() + "/filePatterns/" + filePattern.getId())) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andDo(result -> Assertions.assertFalse(filePatternRepository.findById(id).isPresent())) .andDo(document("filepatterns/delete")); } @@ -44,7 +45,7 @@ void deleteFilePatternWithId() throws Exception { void deleteFilePatternReturnsErrorWhenNotFound() throws Exception { mvc() .perform(delete("/api/projects/0/filePatterns/2")) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage") .value("FilePattern with id 2 not found.")); diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/GetFilePatternControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/GetFilePatternControllerIntegrationTest.java index df2b7d782..5cde80494 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/GetFilePatternControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/GetFilePatternControllerIntegrationTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.projectadministration.domain.FilePatternEntity; import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; @@ -42,7 +43,7 @@ void getFilePatternWithId() throws Exception { mvc() .perform( get("/api/projects/" + testProject.getId() + "/filePatterns/" + filePattern.getId())) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(containsResource(GetFilePatternResponse.class)) .andDo( result -> { @@ -58,7 +59,7 @@ void getFilePatternWithId() throws Exception { void getFilePatternReturnsErrorWhenNotFound() throws Exception { mvc() .perform(get("/api/projects/0/filePatterns/2")) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage") .value("FilePattern with id 2 not found.")); diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/ListFilePatternsOfProjectControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/ListFilePatternsOfProjectControllerIntegrationTest.java index f4b9fdcb6..bee9869c4 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/ListFilePatternsOfProjectControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/filepattern/ListFilePatternsOfProjectControllerIntegrationTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.projectadministration.domain.FilePatternEntity; import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; @@ -44,7 +45,7 @@ void listAllFilePatternsOfProjectWithId() throws Exception { // Test mvc() .perform(get("/api/projects/" + testProject.getId() + "/filePatterns")) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(containsResource(GetFilePatternResponse[].class)) .andExpect( result -> { @@ -60,7 +61,7 @@ void listAllFilePatternsOfProjectWithId() throws Exception { void listAllFilePatternsReturnsErrorWhenProjectNotFound() throws Exception { mvc() .perform(get("/api/projects/1/filePatterns")) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage").value("Project with id 1 not found.")); } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/CreateModuleControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/CreateModuleControllerIntegrationTest.java index 5257bcd7b..c6fd88b4d 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/CreateModuleControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/CreateModuleControllerIntegrationTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.projectadministration.domain.FileEntity; import io.reflectoring.coderadar.graph.projectadministration.domain.ModuleEntity; @@ -44,7 +45,7 @@ void createModuleSuccessfully() throws Exception { post("/api/projects/" + testProject.getId() + "/modules") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(status().isCreated()) .andDo( result -> { Long id = @@ -79,7 +80,7 @@ void createModuleSuccessfullyWithNonExistentPath() throws Exception { post("/api/projects/" + testProject.getId() + "/modules") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(status().isCreated()) .andDo( result -> { Long id = @@ -107,7 +108,7 @@ void createModuleReturnsErrorWhenProjectNotFound() throws Exception { post("/api/projects/1/modules") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage").value("Project with id 1 not found.")); } @@ -120,6 +121,6 @@ void createModuleReturnsErrorWhenRequestIsInvalid() throws Exception { post("/api/projects/0/modules") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isBadRequest()); + .andExpect(status().isBadRequest()); } } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/DeleteModuleControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/DeleteModuleControllerIntegrationTest.java index 2bf3026dd..1c80fc33b 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/DeleteModuleControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/DeleteModuleControllerIntegrationTest.java @@ -1,6 +1,7 @@ package io.reflectoring.coderadar.rest.module; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.projectadministration.domain.ModuleEntity; import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; @@ -34,7 +35,7 @@ void deleteModuleWithId() throws Exception { // Test mvc() .perform(delete("/api/projects/" + testProject.getId() + "/modules/" + module.getId())) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andDo(result -> Assertions.assertFalse(moduleRepository.findById(id).isPresent())) .andDo(document("modules/delete")); } @@ -47,7 +48,7 @@ void deleteModuleReturnsErrorWhenModuleNotFound() throws Exception { mvc() .perform(delete("/api/projects/0/modules/0")) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage").value("Module with id 0 not found.")); } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/GetModuleControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/GetModuleControllerIntegrationTest.java index 461a21bec..767af703f 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/GetModuleControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/GetModuleControllerIntegrationTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.projectadministration.domain.ModuleEntity; import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; @@ -36,7 +37,7 @@ void getModuleWithId() throws Exception { // Test mvc() .perform(get("/api/projects/" + testProject.getId() + "/modules/" + module.getId())) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(containsResource(GetModuleResponse.class)) .andDo( result -> { @@ -51,7 +52,7 @@ void getModuleWithId() throws Exception { void getModuleReturnsErrorWhenModuleNotFound() throws Exception { mvc() .perform(get("/api/projects/0/modules/0")) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage").value("Module with id 0 not found.")); } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/ListModulesOfProjectControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/ListModulesOfProjectControllerIntegrationTest.java index 9c2be85b0..96c6f642f 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/ListModulesOfProjectControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/module/ListModulesOfProjectControllerIntegrationTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.projectadministration.domain.ModuleEntity; import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; @@ -59,7 +60,7 @@ void listAllModulesOfProjectWithId() throws Exception { // Test mvc() .perform(get("/api/projects/" + testProject.getId() + "/modules")) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(containsResource(GetModuleResponse[].class)) .andExpect( result -> { @@ -74,7 +75,7 @@ void listAllModulesOfProjectWithId() throws Exception { void listAllModulesOfProjectReturnsErrorWhenProjectNotFound() throws Exception { mvc() .perform(get("/api/projects/1/modules")) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage").value("Project with id 1 not found.")); } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/CreateProjectControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/CreateProjectControllerIntegrationTest.java index 871a3b189..be12fb1e1 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/CreateProjectControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/CreateProjectControllerIntegrationTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.analyzer.repository.CommitRepository; import io.reflectoring.coderadar.graph.analyzer.repository.FileRepository; @@ -21,7 +22,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.ResultHandler; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; class CreateProjectControllerIntegrationTest extends ControllerTestTemplate { @Autowired private ProjectRepository projectRepository; @@ -37,7 +37,7 @@ void createProjectSuccessfully() throws Exception { mvc() .perform( post("/api/projects").contentType(MediaType.APPLICATION_JSON).content(toJson(command))) - .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(status().isCreated()) .andDo( result -> { Long id = @@ -64,7 +64,7 @@ void createProjectReturnsErrorOnInvalidData() throws Exception { mvc() .perform( post("/api/projects").contentType(MediaType.APPLICATION_JSON).content(toJson(command))) - .andExpect(MockMvcResultMatchers.status().isBadRequest()) + .andExpect(status().isBadRequest()) .andDo(document("projects/create/error400")); } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/GetProjectControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/GetProjectControllerIntegrationTest.java index 8f1a65ff1..6870ad155 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/GetProjectControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/GetProjectControllerIntegrationTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; @@ -32,7 +33,7 @@ void getProjectWithId() throws Exception { mvc() .perform(get("/api/projects/" + testProject.getId())) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(containsResource(GetProjectResponse.class)) .andDo( result -> { @@ -47,7 +48,7 @@ void getProjectWithId() throws Exception { void getProjectWithIdThrowsErrorWhenProjectDoesNotExist() throws Exception { mvc() .perform(get("/api/projects/1")) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage").value("Project with id 1 not found.")); } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/ListProjectsControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/ListProjectsControllerIntegrationTest.java index c51ab2280..58a34b760 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/ListProjectsControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/ListProjectsControllerIntegrationTest.java @@ -3,6 +3,7 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; @@ -13,7 +14,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; class ListProjectsControllerIntegrationTest extends ControllerTestTemplate { @@ -21,8 +21,6 @@ class ListProjectsControllerIntegrationTest extends ControllerTestTemplate { @BeforeEach public void setUp() { - projectRepository.deleteAll(); - ProjectEntity testProject = new ProjectEntity(); testProject.setVcsUrl("https://valid.url"); testProject.setName("project"); @@ -47,7 +45,7 @@ public void setUp() { void listAllProjects() throws Exception { mvc() .perform(get("/api/projects")) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(containsResource(GetProjectResponse[].class)) .andExpect( result -> { diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/UpdateProjectControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/UpdateProjectControllerIntegrationTest.java index 358917316..eb9aace2f 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/UpdateProjectControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/project/UpdateProjectControllerIntegrationTest.java @@ -1,6 +1,7 @@ package io.reflectoring.coderadar.rest.project; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; @@ -40,7 +41,7 @@ void updateProjectWithId() throws Exception { post("/api/projects/" + testProject.getId()) .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andDo( result -> { ProjectEntity project = projectRepository.findById(id).get(); @@ -63,7 +64,7 @@ void updateProjectReturnsErrorWhenProjectDoesNotExist() throws Exception { post("/api/projects/1") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage").value("Project with id 1 not found.")); } @@ -77,6 +78,6 @@ void updateProjectReturnsErrorWhenRequestIsInvalid() throws Exception { post("/api/projects/0") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isBadRequest()); + .andExpect(status().isBadRequest()); } } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetAvailableMetricsInProjectControllerTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetAvailableMetricsInProjectControllerTest.java index 0378755a8..d7f051c17 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetAvailableMetricsInProjectControllerTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetAvailableMetricsInProjectControllerTest.java @@ -66,7 +66,7 @@ void returnsNothingWhenNotAnalyzed() throws Exception { .andReturn(); List metrics = - fromJson(new TypeReference>() {}, result.getResponse().getContentAsString()); + fromJson(new TypeReference<>() {}, result.getResponse().getContentAsString()); Assertions.assertTrue(metrics.isEmpty()); } @@ -96,7 +96,7 @@ void returnsLocMetrics() throws Exception { .andReturn(); List metrics = - fromJson(new TypeReference>() {}, result.getResponse().getContentAsString()); + fromJson(new TypeReference<>() {}, result.getResponse().getContentAsString()); Assertions.assertEquals(4, metrics.size()); Assertions.assertTrue(metrics.contains("coderadar:size:eloc:java")); @@ -130,7 +130,7 @@ void returnsCheckstyleMetrics() throws Exception { .andReturn(); List metrics = - fromJson(new TypeReference>() {}, result.getResponse().getContentAsString()); + fromJson(new TypeReference<>() {}, result.getResponse().getContentAsString()); Assertions.assertTrue( metrics.contains( @@ -138,9 +138,6 @@ void returnsCheckstyleMetrics() throws Exception { Assertions.assertTrue( metrics.contains( "checkstyle:com.puppycrawl.tools.checkstyle.checks.imports.ImportOrderCheck")); - Assertions.assertTrue( - metrics.contains( - "checkstyle:com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTypeCheck")); Assertions.assertTrue( metrics.contains( "checkstyle:com.puppycrawl.tools.checkstyle.checks.indentation.IndentationCheck")); @@ -162,8 +159,6 @@ void returnsCheckstyleMetrics() throws Exception { Assertions.assertTrue( metrics.contains( "checkstyle:com.puppycrawl.tools.checkstyle.checks.annotation.AnnotationLocationCheck")); - Assertions.assertTrue( - metrics.contains("checkstyle:com.puppycrawl.tools.checkstyle.checks.regexp.RegexpCheck")); } @Test @@ -200,7 +195,7 @@ void returnsLocAndCheckstyleMetrics() throws Exception { .andReturn(); List metrics = - fromJson(new TypeReference>() {}, result.getResponse().getContentAsString()); + fromJson(new TypeReference<>() {}, result.getResponse().getContentAsString()); Assertions.assertTrue(metrics.contains("coderadar:size:eloc:java")); Assertions.assertTrue(metrics.contains("coderadar:size:sloc:java")); @@ -212,9 +207,6 @@ void returnsLocAndCheckstyleMetrics() throws Exception { Assertions.assertTrue( metrics.contains( "checkstyle:com.puppycrawl.tools.checkstyle.checks.imports.ImportOrderCheck")); - Assertions.assertTrue( - metrics.contains( - "checkstyle:com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTypeCheck")); Assertions.assertTrue( metrics.contains( "checkstyle:com.puppycrawl.tools.checkstyle.checks.indentation.IndentationCheck")); @@ -236,8 +228,6 @@ void returnsLocAndCheckstyleMetrics() throws Exception { Assertions.assertTrue( metrics.contains( "checkstyle:com.puppycrawl.tools.checkstyle.checks.annotation.AnnotationLocationCheck")); - Assertions.assertTrue( - metrics.contains("checkstyle:com.puppycrawl.tools.checkstyle.checks.regexp.RegexpCheck")); } @Test diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetCommitLogControllerTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetCommitLogControllerTest.java index c35a66a59..52515fb03 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetCommitLogControllerTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetCommitLogControllerTest.java @@ -20,7 +20,7 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MvcResult; -public class GetCommitLogControllerTest extends ControllerTestTemplate { +class GetCommitLogControllerTest extends ControllerTestTemplate { private Long projectId; diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetCriticalFilesControllerTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetCriticalFilesControllerTest.java index 692480aa7..8d297a247 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetCriticalFilesControllerTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetCriticalFilesControllerTest.java @@ -32,7 +32,7 @@ class GetCriticalFilesControllerTest extends ControllerTestTemplate { private long projectId; @BeforeEach - public void setUp() throws Exception { + void setUp() throws Exception { URL testRepoURL = this.getClass().getClassLoader().getResource("test-repository"); CreateProjectCommand command1 = new CreateProjectCommand( diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetFileContentWithMetricsControllerTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetFileContentWithMetricsControllerTest.java index a4a877df1..3505bcefb 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetFileContentWithMetricsControllerTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetFileContentWithMetricsControllerTest.java @@ -21,7 +21,7 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MvcResult; -public class GetFileContentWithMetricsControllerTest extends ControllerTestTemplate { +class GetFileContentWithMetricsControllerTest extends ControllerTestTemplate { long projectId; diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetFileDiffControllerTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetFileDiffControllerTest.java index c429879fc..44a2dbfe4 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetFileDiffControllerTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetFileDiffControllerTest.java @@ -21,7 +21,7 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MvcResult; -public class GetFileDiffControllerTest extends ControllerTestTemplate { +class GetFileDiffControllerTest extends ControllerTestTemplate { long projectId; diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetFileTreeForCommitControllerTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetFileTreeForCommitControllerTest.java index e85ef6660..497cb5fee 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetFileTreeForCommitControllerTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/query/GetFileTreeForCommitControllerTest.java @@ -2,7 +2,6 @@ import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -21,7 +20,7 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MvcResult; -public class GetFileTreeForCommitControllerTest extends ControllerTestTemplate { +class GetFileTreeForCommitControllerTest extends ControllerTestTemplate { long projectId; diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/ChangePasswordControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/ChangePasswordControllerIntegrationTest.java similarity index 93% rename from coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/ChangePasswordControllerIntegrationTest.java rename to coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/ChangePasswordControllerIntegrationTest.java index 937556062..f8011d947 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/ChangePasswordControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/ChangePasswordControllerIntegrationTest.java @@ -1,7 +1,8 @@ -package io.reflectoring.coderadar.rest.user; +package io.reflectoring.coderadar.rest.useradministration; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.useradministration.domain.RefreshTokenEntity; import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; @@ -17,7 +18,6 @@ import org.springframework.http.MediaType; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.test.web.servlet.ResultHandler; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; class ChangePasswordControllerIntegrationTest extends ControllerTestTemplate { @@ -47,7 +47,7 @@ void ChangePasswordSuccessfully() throws Exception { post("/api/user/password/change") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andDo(documentPasswordChange()); Assertions.assertTrue( @@ -75,7 +75,7 @@ void ChangePasswordReturnsErrorWhenTokenInvalid() throws Exception { post("/api/user/password/change") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isUnauthorized()); + .andExpect(status().isUnauthorized()); Assertions.assertTrue( new BCryptPasswordEncoder() diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/GetUserControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/GetUserControllerIntegrationTest.java similarity index 83% rename from coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/GetUserControllerIntegrationTest.java rename to coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/GetUserControllerIntegrationTest.java index 842293ccf..dfc0aa081 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/GetUserControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/GetUserControllerIntegrationTest.java @@ -1,8 +1,9 @@ -package io.reflectoring.coderadar.rest.user; +package io.reflectoring.coderadar.rest.useradministration; import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; import static io.reflectoring.coderadar.rest.ResultMatchers.containsResource; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; @@ -27,8 +28,8 @@ void loadUserWithId() throws Exception { final Long userId = testUser.getId(); mvc() - .perform(get("/api/user/" + userId)) - .andExpect(MockMvcResultMatchers.status().isOk()) + .perform(get("/api/users/" + userId)) + .andExpect(status().isOk()) .andExpect(containsResource(GetUserResponse.class)) .andDo( result -> { @@ -37,14 +38,14 @@ void loadUserWithId() throws Exception { Assertions.assertEquals("username2", response.getUsername()); Assertions.assertEquals(userId, response.getId()); }) - .andDo(document("user/get")); + .andDo(document("users/get")); } @Test void loadUserWithIdOneReturnsErrorWhenUserNotFound() throws Exception { mvc() - .perform(get("/api/user/1")) - .andExpect(MockMvcResultMatchers.status().isNotFound()) + .perform(get("/api/users/1")) + .andExpect(status().isNotFound()) .andExpect( MockMvcResultMatchers.jsonPath("errorMessage").value("User with id 1 not found.")); } diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/ListProjectsForUserControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/ListProjectsForUserControllerIntegrationTest.java new file mode 100644 index 000000000..5631b972a --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/ListProjectsForUserControllerIntegrationTest.java @@ -0,0 +1,76 @@ +package io.reflectoring.coderadar.rest.useradministration; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; +import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.rest.domain.GetProjectResponse; +import io.reflectoring.coderadar.useradministration.service.security.PasswordUtil; +import java.util.Collections; +import java.util.Date; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.MvcResult; + +class ListProjectsForUserControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private UserRepository userRepository; + + @Autowired private ProjectRepository projectRepository; + + private ProjectEntity testProject; + private UserEntity testUser; + + @BeforeEach + void setUp() { + testProject = new ProjectEntity(); + testProject.setVcsUrl("https://valid.url"); + testProject.setName("project"); + testProject.setVcsStart(new Date()); + testProject.setVcsOnline(true); + testProject.setVcsPassword("testPassword"); + testProject.setVcsUsername("testUser"); + projectRepository.save(testProject); + + testUser = new UserEntity(); + testUser.setUsername("username"); + testUser.setPassword(PasswordUtil.hash("password1")); + testUser.setProjects(Collections.singletonList(testProject)); + userRepository.save(testUser); + } + + @Test + void listProjectsForUserSuccessfully() throws Exception { + MvcResult result = + mvc() + .perform(get("/api/users/" + testUser.getId() + "/projects")) + .andExpect(status().isOk()) + .andDo(document("user/list/projects")) + .andReturn(); + + GetProjectResponse[] projects = + fromJson(result.getResponse().getContentAsString(), GetProjectResponse[].class); + Assertions.assertEquals(1, projects.length); + Assertions.assertEquals("project", projects[0].getName()); + Assertions.assertEquals(testProject.getId(), projects[0].getId()); + } + + @Test + void throwsExceptionWhenUserDoesNotExist() throws Exception { + MvcResult result = + mvc().perform(get("/api/users/1000/projects")).andExpect(status().isNotFound()).andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("User with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/ListUsersControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/ListUsersControllerIntegrationTest.java new file mode 100644 index 000000000..b9425b746 --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/ListUsersControllerIntegrationTest.java @@ -0,0 +1,46 @@ +package io.reflectoring.coderadar.rest.useradministration; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.domain.GetUserResponse; +import io.reflectoring.coderadar.useradministration.service.security.PasswordUtil; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.MvcResult; + +class ListUsersControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private UserRepository userRepository; + + private UserEntity testUser; + + @BeforeEach + void setUp() { + testUser = new UserEntity(); + testUser.setUsername("username"); + testUser.setPassword(PasswordUtil.hash("password1")); + userRepository.save(testUser); + } + + @Test + void listUsersSuccessfully() throws Exception { + MvcResult result = + mvc() + .perform(get("/api/users")) + .andExpect(status().isOk()) + .andDo(document("users/list")) + .andReturn(); + + GetUserResponse[] users = + fromJson(result.getResponse().getContentAsString(), GetUserResponse[].class); + Assertions.assertEquals(1, users.length); + Assertions.assertEquals("username", users[0].getUsername()); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/ListUsersForProjectControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/ListUsersForProjectControllerIntegrationTest.java new file mode 100644 index 000000000..86ae31c4c --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/ListUsersForProjectControllerIntegrationTest.java @@ -0,0 +1,78 @@ +package io.reflectoring.coderadar.rest.useradministration; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; +import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.rest.domain.GetUserResponse; +import io.reflectoring.coderadar.useradministration.service.security.PasswordUtil; +import java.util.Collections; +import java.util.Date; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.MvcResult; + +class ListUsersForProjectControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private UserRepository userRepository; + + @Autowired private ProjectRepository projectRepository; + + private ProjectEntity testProject; + private UserEntity testUser; + + @BeforeEach + void setUp() { + testProject = new ProjectEntity(); + testProject.setVcsUrl("https://valid.url"); + testProject.setName("project"); + testProject.setVcsStart(new Date()); + testProject.setVcsOnline(true); + testProject.setVcsPassword("testPassword"); + testProject.setVcsUsername("testUser"); + projectRepository.save(testProject); + + testUser = new UserEntity(); + testUser.setUsername("username"); + testUser.setPassword(PasswordUtil.hash("password1")); + testUser.setProjects(Collections.singletonList(testProject)); + userRepository.save(testUser); + } + + @Test + void listUsersForProjectSuccessfully() throws Exception { + MvcResult result = + mvc() + .perform(get("/api/projects/" + testProject.getId() + "/users/")) + .andExpect(status().isOk()) + .andDo(document("project/list/users")) + .andReturn(); + + GetUserResponse[] users = + fromJson(result.getResponse().getContentAsString(), GetUserResponse[].class); + Assertions.assertEquals(1, users.length); + Assertions.assertEquals("username", users[0].getUsername()); + } + + @Test + void throwsExceptionWhenProjectDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform(get("/api/projects/1000/users/")) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Project with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/LoginUserControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/LoginUserControllerIntegrationTest.java similarity index 90% rename from coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/LoginUserControllerIntegrationTest.java rename to coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/LoginUserControllerIntegrationTest.java index e4613baa4..6df3f4d99 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/LoginUserControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/LoginUserControllerIntegrationTest.java @@ -1,8 +1,9 @@ -package io.reflectoring.coderadar.rest.user; +package io.reflectoring.coderadar.rest.useradministration; import static org.hamcrest.Matchers.any; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; @@ -20,7 +21,6 @@ class LoginUserControllerIntegrationTest extends ControllerTestTemplate { @Test void loginUserSuccessfully() throws Exception { - userRepository.deleteAll(); UserEntity testUser = new UserEntity(); testUser.setUsername("username"); testUser.setPassword(PasswordUtil.hash("password1")); @@ -30,7 +30,7 @@ void loginUserSuccessfully() throws Exception { mvc() .perform( post("/api/user/auth").content(toJson(command)).contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("accessToken").value(any(String.class))) .andExpect(MockMvcResultMatchers.jsonPath("refreshToken").value(any(String.class))) .andDo(documentLogin()); @@ -42,7 +42,7 @@ void loginUserReturnsErrorWhenRequestIsInvalid() throws Exception { mvc() .perform( post("/api/user/auth").content(toJson(command)).contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isBadRequest()); + .andExpect(status().isBadRequest()); } @Test @@ -51,7 +51,7 @@ void loginUserReturnsErrorWhenUserDoesNotExist() throws Exception { mvc() .perform( post("/api/user/auth").content(toJson(command)).contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isNotFound()); + .andExpect(status().isNotFound()); } @Test @@ -67,7 +67,7 @@ void loginUserReturnsErrorWhenPasswordIsWrong() throws Exception { .perform( post("/api/user/auth").content(toJson(command)).contentType(MediaType.APPLICATION_JSON)) .andExpect(MockMvcResultMatchers.jsonPath("errorMessage").value("Bad credentials")) - .andExpect(MockMvcResultMatchers.status().isForbidden()); + .andExpect(status().isForbidden()); } private ResultHandler documentLogin() { diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/RefreshTokenControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/RefreshTokenControllerIntegrationTest.java similarity index 94% rename from coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/RefreshTokenControllerIntegrationTest.java rename to coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/RefreshTokenControllerIntegrationTest.java index 99ae0f3ae..987b33424 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/RefreshTokenControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/RefreshTokenControllerIntegrationTest.java @@ -1,7 +1,8 @@ -package io.reflectoring.coderadar.rest.user; +package io.reflectoring.coderadar.rest.useradministration; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; @@ -54,7 +55,7 @@ void refreshTokenSuccessfully() throws Exception { post("/api/user/refresh") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("token").exists()) .andDo(documentRefresh()); } @@ -74,7 +75,7 @@ void refreshTokenReturnsErrorOnInvalidToken() throws Exception { post("/api/user/refresh") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isUnauthorized()); + .andExpect(status().isUnauthorized()); } @Test @@ -100,7 +101,7 @@ void refreshTokenReturnsErrorOnNonExpiredAccessToken() throws Exception { post("/api/user/refresh") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isBadRequest()); + .andExpect(status().isBadRequest()); } private String createExpiredAccessToken() { diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/RegisterUserControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/RegisterUserControllerIntegrationTest.java similarity index 87% rename from coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/RegisterUserControllerIntegrationTest.java rename to coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/RegisterUserControllerIntegrationTest.java index 36c60147d..2a1c2888c 100644 --- a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/user/RegisterUserControllerIntegrationTest.java +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/RegisterUserControllerIntegrationTest.java @@ -1,7 +1,8 @@ -package io.reflectoring.coderadar.rest.user; +package io.reflectoring.coderadar.rest.useradministration; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; @@ -11,7 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.ResultHandler; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; class RegisterUserControllerIntegrationTest extends ControllerTestTemplate { @@ -25,7 +25,7 @@ void registerNewUserSuccessfully() throws Exception { post("/api/user/registration") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(status().isCreated()) .andDo(documentRegistration()); } @@ -37,7 +37,7 @@ void registerNewUserReturnErrorOnInvalidRequest1() throws Exception { post("/api/user/registration") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isBadRequest()); + .andExpect(status().isBadRequest()); } @Test @@ -48,7 +48,7 @@ void registerNewUserReturnErrorOnInvalidRequest2() throws Exception { post("/api/user/registration") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isBadRequest()); + .andExpect(status().isBadRequest()); } @Test @@ -65,7 +65,7 @@ void registerNewUserReturnErrorWhenUsernameExists() throws Exception { post("/api/user/registration") .content(toJson(command)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isConflict()); + .andExpect(status().isConflict()); } private ResultHandler documentRegistration() { diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/permissions/RemoveUserFromProjectControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/permissions/RemoveUserFromProjectControllerIntegrationTest.java new file mode 100644 index 000000000..27118f4de --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/permissions/RemoveUserFromProjectControllerIntegrationTest.java @@ -0,0 +1,110 @@ +package io.reflectoring.coderadar.rest.useradministration.permissions; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; +import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.useradministration.service.security.PasswordUtil; +import java.util.Collections; +import java.util.Date; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.MvcResult; + +class RemoveUserFromProjectControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private UserRepository userRepository; + + @Autowired private ProjectRepository projectRepository; + + private ProjectEntity testProject; + private UserEntity testUser; + + @BeforeEach + void setUp() { + testProject = new ProjectEntity(); + testProject.setVcsUrl("https://valid.url"); + testProject.setName("project"); + testProject.setVcsStart(new Date()); + testProject.setVcsOnline(true); + testProject.setVcsPassword("testPassword"); + testProject.setVcsUsername("testUser"); + projectRepository.save(testProject); + + testUser = new UserEntity(); + testUser.setUsername("username"); + testUser.setPassword(PasswordUtil.hash("password1")); + testUser.setProjects(Collections.singletonList(testProject)); + userRepository.save(testUser); + } + + @Test + void removeUserFromProjectSuccessfully() throws Exception { + mvc() + .perform(delete("/api/projects/" + testProject.getId() + "/users/" + testUser.getId())) + .andExpect(status().isOk()) + .andDo(document("user/role/project/remove")) + .andReturn(); + + Assertions.assertTrue(userRepository.listUsersForProject(testProject.getId()).isEmpty()); + } + + @Test + void throwsExceptionWhenUserIsNotAssignedToProject() throws Exception { + testUser.setProjects(Collections.emptyList()); + userRepository.save(testUser, 1); + + MvcResult result = + mvc() + .perform(delete("/api/projects/" + testProject.getId() + "/users/" + testUser.getId())) + .andExpect(status().isBadRequest()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + + Assertions.assertEquals( + "User with id " + + testUser.getId() + + " is not assigned to project with id " + + testProject.getId(), + errorMessage); + } + + @Test + void throwsExceptionWhenProjectDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform(delete("/api/projects/1000/users/" + testUser.getId())) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Project with id 1000 not found.", errorMessage); + } + + @Test + void throwsExceptionWhenUserDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform(delete("/api/projects/" + testProject.getId() + "/users/1000")) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("User with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/permissions/SetUserRoleForProjectControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/permissions/SetUserRoleForProjectControllerIntegrationTest.java new file mode 100644 index 000000000..4d1250fe7 --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/permissions/SetUserRoleForProjectControllerIntegrationTest.java @@ -0,0 +1,109 @@ +package io.reflectoring.coderadar.rest.useradministration.permissions; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; +import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.ProjectRoleJsonWrapper; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import io.reflectoring.coderadar.useradministration.service.security.PasswordUtil; +import java.util.Date; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; + +class SetUserRoleForProjectControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private UserRepository userRepository; + + @Autowired private ProjectRepository projectRepository; + + private ProjectEntity testProject; + private UserEntity testUser; + + @BeforeEach + void setUp() { + testProject = new ProjectEntity(); + testProject.setVcsUrl("https://valid.url"); + testProject.setName("project"); + testProject.setVcsStart(new Date()); + testProject.setVcsOnline(true); + testProject.setVcsPassword("testPassword"); + testProject.setVcsUsername("testUser"); + projectRepository.save(testProject); + + testUser = new UserEntity(); + testUser.setUsername("username"); + testUser.setPassword(PasswordUtil.hash("password1")); + userRepository.save(testUser); + } + + @Test + void setUserRoleForProjectSuccessfully() throws Exception { + ConstrainedFields fields = fields(ProjectRoleJsonWrapper.class); + + mvc() + .perform( + post("/api/projects/" + testProject.getId() + "/users/" + testUser.getId()) + .content(toJson(new ProjectRoleJsonWrapper(ProjectRole.ADMIN))) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo( + document( + "user/role/project/set", + requestFields( + fields + .withCustomPath("role") + .description( + "The role the user should have for the given project. Can be either ADMIN or MEMBER")))) + .andReturn(); + + Assertions.assertEquals(1, userRepository.listUsersForProject(testProject.getId()).size()); + Assertions.assertEquals( + "username", userRepository.listUsersForProject(testProject.getId()).get(0).getUsername()); + } + + @Test + void throwsExceptionWhenProjectDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform( + post("/api/projects/1000/users/" + testUser.getId()) + .content(toJson(new ProjectRoleJsonWrapper(ProjectRole.ADMIN))) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Project with id 1000 not found.", errorMessage); + } + + @Test + void throwsExceptionWhenUserDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform( + post("/api/projects/" + testProject.getId() + "/users/1000") + .content(toJson(new ProjectRoleJsonWrapper(ProjectRole.ADMIN))) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("User with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/AddTeamToProjectControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/AddTeamToProjectControllerIntegrationTest.java new file mode 100644 index 000000000..f56ae9abc --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/AddTeamToProjectControllerIntegrationTest.java @@ -0,0 +1,106 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; +import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.ProjectRoleJsonWrapper; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.useradministration.domain.ProjectRole; +import java.util.Date; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; + +class AddTeamToProjectControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private TeamRepository teamRepository; + + @Autowired private ProjectRepository projectRepository; + + private TeamEntity teamEntity; + private ProjectEntity testProject; + + @BeforeEach + void setUp() { + teamEntity = new TeamEntity(); + teamEntity.setName("testTeam"); + teamRepository.save(teamEntity, 1); + + testProject = new ProjectEntity(); + testProject.setVcsUrl("https://valid.url"); + testProject.setName("project"); + testProject.setVcsStart(new Date()); + testProject.setVcsOnline(true); + testProject.setVcsPassword("testPassword"); + testProject.setVcsUsername("testUser"); + projectRepository.save(testProject); + } + + @Test + void addTeamToProjectSuccessfully() throws Exception { + ConstrainedFields fields = fields(ProjectRoleJsonWrapper.class); + + mvc() + .perform( + post("/api/projects/" + testProject.getId() + "/teams/" + teamEntity.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(toJson(new ProjectRoleJsonWrapper(ProjectRole.ADMIN)))) + .andExpect(status().isOk()) + .andDo( + document( + "teams/add/project", + requestFields( + fields + .withCustomPath("role") + .description("The role of the team in the project")))); + + List teams = teamRepository.listTeamsByProjectIdWithMembers(testProject.getId()); + Assertions.assertEquals(1L, teams.size()); + Assertions.assertEquals("testTeam", teams.get(0).getName()); + } + + @Test + void throwsExceptionWhenProjectDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform( + post("/api/projects/1000/teams/" + teamEntity.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(toJson(new ProjectRoleJsonWrapper(ProjectRole.ADMIN)))) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Project with id 1000 not found.", errorMessage); + } + + @Test + void throwsExceptionWhenTeamDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform( + post("/api/projects/" + testProject.getId() + "/teams/1000") + .contentType(MediaType.APPLICATION_JSON) + .content(toJson(new ProjectRoleJsonWrapper(ProjectRole.ADMIN)))) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Team with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/AddUsersToTeamControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/AddUsersToTeamControllerIntegrationTest.java new file mode 100644 index 000000000..33fc9c9e3 --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/AddUsersToTeamControllerIntegrationTest.java @@ -0,0 +1,103 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.JsonListWrapper; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; + +class AddUsersToTeamControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private TeamRepository teamRepository; + + @Autowired private UserRepository userRepository; + + private TeamEntity teamEntity; + private UserEntity testUser; + + @BeforeEach + void setUp() { + testUser = new UserEntity(); + testUser.setUsername("username"); + testUser.setPassword("password1"); + userRepository.save(testUser); + + teamEntity = new TeamEntity(); + teamEntity.setName("testTeam"); + teamRepository.save(teamEntity, 1); + } + + @Test + void addUsersToTeamSuccessfully() throws Exception { + + ConstrainedFields fields = fields(JsonListWrapper.class); + + mvc() + .perform( + post("/api/teams/" + teamEntity.getId() + "/users") + .content(toJson(new JsonListWrapper<>(Collections.singletonList(testUser.getId())))) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo( + document( + "teams/add/user", + requestFields( + fields.withPath("elements").description("A list containing user IDs")))) + .andReturn(); + + List teams = teamRepository.findAllWithMembers(); + Assertions.assertEquals(1L, teams.size()); + Assertions.assertEquals("testTeam", teams.get(0).getName()); + Assertions.assertEquals("username", teams.get(0).getMembers().get(0).getUsername()); + } + + @Test + void throwsExceptionWhenTeamDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform( + post("/api/teams/1000/users") + .content( + toJson(new JsonListWrapper<>(Collections.singletonList(testUser.getId())))) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Team with id 1000 not found.", errorMessage); + } + + @Test + void throwsExceptionWhenUserDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform( + post("/api/teams/" + teamEntity.getId() + "/users") + .content(toJson(new JsonListWrapper<>(Collections.singletonList(1000)))) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("User with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/CreateTeamControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/CreateTeamControllerIntegrationTest.java new file mode 100644 index 000000000..4a314cbb3 --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/CreateTeamControllerIntegrationTest.java @@ -0,0 +1,136 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.useradministration.port.driver.teams.create.CreateTeamCommand; +import io.reflectoring.coderadar.useradministration.service.security.PasswordUtil; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; + +class CreateTeamControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private UserRepository userRepository; + + @Autowired private TeamRepository teamRepository; + + private UserEntity testUser; + + @BeforeEach + void setUp() { + testUser = new UserEntity(); + testUser.setUsername("username"); + testUser.setPassword(PasswordUtil.hash("password1")); + userRepository.save(testUser); + } + + @Test + void createTeamWithUsersSuccessfully() throws Exception { + CreateTeamCommand createTeamCommand = new CreateTeamCommand(); + createTeamCommand.setName("testTeam"); + createTeamCommand.setUserIds(Collections.singletonList(testUser.getId())); + ConstrainedFields fields = fields(CreateTeamCommand.class); + + mvc() + .perform( + post("/api/teams") + .contentType(MediaType.APPLICATION_JSON) + .content(toJson(createTeamCommand))) + .andExpect(status().isCreated()) + .andDo( + document( + "teams/create", + requestFields( + fields.withPath("name").description("The name of the team"), + fields + .withPath("userIds") + .description("A list of user IDs to add to the newly created team")))) + .andReturn(); + + List teams = teamRepository.findAllWithMembers(); + Assertions.assertEquals(1L, teams.size()); + Assertions.assertEquals("testTeam", teams.get(0).getName()); + Assertions.assertEquals("username", teams.get(0).getMembers().get(0).getUsername()); + } + + @Test + void createTeamWithNoUsersSuccessfully() throws Exception { + CreateTeamCommand createTeamCommand = new CreateTeamCommand(); + createTeamCommand.setName("testTeam"); + + mvc() + .perform( + post("/api/teams") + .contentType(MediaType.APPLICATION_JSON) + .content(toJson(createTeamCommand))) + .andExpect(status().isCreated()) + .andReturn(); + + List teams = teamRepository.findAllWithMembers(); + Assertions.assertEquals(1L, teams.size()); + Assertions.assertEquals("testTeam", teams.get(0).getName()); + } + + @Test + void throwsExceptionWhenTeamAlreadyExists() throws Exception { + CreateTeamCommand createTeamCommand = new CreateTeamCommand(); + createTeamCommand.setName("testTeam"); + + // create team + mvc() + .perform( + post("/api/teams") + .contentType(MediaType.APPLICATION_JSON) + .content(toJson(createTeamCommand))) + .andExpect(status().isCreated()) + .andReturn(); + + // try to create team with the same name + MvcResult result = + mvc() + .perform( + post("/api/teams") + .contentType(MediaType.APPLICATION_JSON) + .content(toJson(createTeamCommand))) + .andExpect(status().isConflict()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Team with name testTeam already exists!", errorMessage); + } + + @Test + void throwsExceptionWhenUserNotFound() throws Exception { + CreateTeamCommand command = new CreateTeamCommand(); + command.setName("testTeam"); + command.setUserIds(Collections.singletonList(100L)); + + MvcResult result = + mvc() + .perform( + post("/api/teams").contentType(MediaType.APPLICATION_JSON).content(toJson(command))) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("User with id 100 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/DeleteTeamControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/DeleteTeamControllerIntegrationTest.java new file mode 100644 index 000000000..2d293e511 --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/DeleteTeamControllerIntegrationTest.java @@ -0,0 +1,77 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.useradministration.service.security.PasswordUtil; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.MvcResult; + +class DeleteTeamControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private UserRepository userRepository; + + @Autowired private TeamRepository teamRepository; + + private UserEntity testUser; + + private TeamEntity teamEntity; + + @BeforeEach + void setUp() { + teamEntity = new TeamEntity(); + teamEntity.setName("testTeam"); + teamRepository.save(teamEntity, 1); + + testUser = new UserEntity(); + testUser.setUsername("username"); + testUser.setPassword(PasswordUtil.hash("password1")); + userRepository.save(testUser); + } + + @Test + void deleteTeamWithUsersSuccessfully() throws Exception { + teamEntity.setMembers(Collections.singletonList(testUser)); + teamRepository.save(teamEntity, 1); + + mvc() + .perform(delete("/api/teams/" + teamEntity.getId())) + .andExpect(status().isOk()) + .andDo(document("teams/delete")) + .andReturn(); + + List teams = teamRepository.findAllWithMembers(); + Assertions.assertTrue(teams.isEmpty()); + } + + @Test + void deleteTeamWithNoUsersSuccessfully() throws Exception { + mvc().perform(delete("/api/teams/" + teamEntity.getId())).andExpect(status().isOk()); + + List teams = teamRepository.findAllWithMembers(); + Assertions.assertTrue(teams.isEmpty()); + } + + @Test + void throwsExceptionWhenTeamDoesNotExist() throws Exception { + MvcResult result = + mvc().perform(delete("/api/teams/1000")).andExpect(status().isNotFound()).andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Team with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/GetTeamControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/GetTeamControllerIntegrationTest.java new file mode 100644 index 000000000..ebb63fa47 --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/GetTeamControllerIntegrationTest.java @@ -0,0 +1,55 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.MvcResult; + +class GetTeamControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private TeamRepository teamRepository; + + private TeamEntity teamEntity; + + @BeforeEach + void setUp() { + teamEntity = new TeamEntity(); + teamEntity.setName("testTeam"); + teamRepository.save(teamEntity, 1); + } + + @Test + void getTeamSuccessfully() throws Exception { + MvcResult result = + mvc() + .perform(get("/api/teams/" + teamEntity.getId())) + .andExpect(status().isOk()) + .andDo(document("teams/get")) + .andReturn(); + + GetTeamResponse response = + fromJson(result.getResponse().getContentAsString(), GetTeamResponse.class); + Assertions.assertEquals("testTeam", response.getName()); + } + + @Test + void throwsExceptionWhenTeamDoesNotExist() throws Exception { + MvcResult result = + mvc().perform(get("/api/teams/1000")).andExpect(status().isNotFound()).andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Team with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/ListProjectsForTeamControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/ListProjectsForTeamControllerIntegrationTest.java new file mode 100644 index 000000000..dcecdc64a --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/ListProjectsForTeamControllerIntegrationTest.java @@ -0,0 +1,73 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; +import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.rest.domain.GetProjectResponse; +import java.util.Collections; +import java.util.Date; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.MvcResult; + +class ListProjectsForTeamControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private TeamRepository teamRepository; + + @Autowired private ProjectRepository projectRepository; + + private TeamEntity teamEntity; + private ProjectEntity testProject; + + @BeforeEach + void setUp() { + testProject = new ProjectEntity(); + testProject.setVcsUrl("https://valid.url"); + testProject.setName("project"); + testProject.setVcsStart(new Date()); + testProject.setVcsOnline(true); + testProject.setVcsPassword("testPassword"); + testProject.setVcsUsername("testUser"); + projectRepository.save(testProject); + + teamEntity = new TeamEntity(); + teamEntity.setName("testTeam"); + teamEntity.setProjects(Collections.singletonList(testProject)); + teamRepository.save(teamEntity, 1); + } + + @Test + void listProjectsForTeamSuccessfully() throws Exception { + MvcResult result = + mvc() + .perform(get("/api/teams/" + teamEntity.getId() + "/projects")) + .andExpect(status().isOk()) + .andDo(document("teams/list/projects")) + .andReturn(); + + GetProjectResponse[] projects = + fromJson(result.getResponse().getContentAsString(), GetProjectResponse[].class); + Assertions.assertEquals(1L, projects.length); + Assertions.assertEquals("project", projects[0].getName()); + } + + @Test + void throwsExceptionWhenTeamDoesNotExist() throws Exception { + MvcResult result = + mvc().perform(get("/api/teams/1000/projects")).andExpect(status().isNotFound()).andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Team with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsControllerIntegrationTest.java new file mode 100644 index 000000000..3e93bbd00 --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsControllerIntegrationTest.java @@ -0,0 +1,42 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.MvcResult; + +class ListTeamsControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private TeamRepository teamRepository; + + @BeforeEach + void setUp() { + TeamEntity teamEntity = new TeamEntity(); + teamEntity.setName("testTeam"); + teamRepository.save(teamEntity, 1); + } + + @Test + void listTeamsSuccessfully() throws Exception { + MvcResult result = + mvc() + .perform(get("/api/teams/")) + .andExpect(status().isOk()) + .andDo(document("teams/list")) + .andReturn(); + + GetTeamResponse[] response = + fromJson(result.getResponse().getContentAsString(), GetTeamResponse[].class); + Assertions.assertEquals(1, response.length); + Assertions.assertEquals("testTeam", response[0].getName()); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsForProjectControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsForProjectControllerIntegrationTest.java new file mode 100644 index 000000000..6c39bde44 --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsForProjectControllerIntegrationTest.java @@ -0,0 +1,73 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; +import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import java.util.Collections; +import java.util.Date; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.MvcResult; + +class ListTeamsForProjectControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private TeamRepository teamRepository; + + @Autowired private ProjectRepository projectRepository; + + private TeamEntity teamEntity; + private ProjectEntity testProject; + + @BeforeEach + void setUp() { + testProject = new ProjectEntity(); + testProject.setVcsUrl("https://valid.url"); + testProject.setName("project"); + testProject.setVcsStart(new Date()); + testProject.setVcsOnline(true); + testProject.setVcsPassword("testPassword"); + testProject.setVcsUsername("testUser"); + projectRepository.save(testProject); + + teamEntity = new TeamEntity(); + teamEntity.setName("testTeam"); + teamEntity.setProjects(Collections.singletonList(testProject)); + teamRepository.save(teamEntity, 1); + } + + @Test + void listTeamsForProjectSuccessfully() throws Exception { + MvcResult result = + mvc() + .perform(get("/api/projects/" + testProject.getId() + "/teams")) + .andExpect(status().isOk()) + .andDo(document("teams/list/project")) + .andReturn(); + + GetTeamResponse[] teams = + fromJson(result.getResponse().getContentAsString(), GetTeamResponse[].class); + Assertions.assertEquals(1L, teams.length); + Assertions.assertEquals("testTeam", teams[0].getName()); + } + + @Test + void throwsExceptionWhenProjectDoesNotExist() throws Exception { + MvcResult result = + mvc().perform(get("/api/projects/1000/teams")).andExpect(status().isNotFound()).andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Project with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsForUserControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsForUserControllerIntegrationTest.java new file mode 100644 index 000000000..bb1d3a773 --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/ListTeamsForUserControllerIntegrationTest.java @@ -0,0 +1,64 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import io.reflectoring.coderadar.rest.domain.GetTeamResponse; +import java.util.Collections; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.MvcResult; + +class ListTeamsForUserControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private TeamRepository teamRepository; + + private TeamEntity teamEntity; + private UserEntity testUser; + + @BeforeEach + void setUp() { + testUser = new UserEntity(); + testUser.setUsername("testUser"); + testUser.setPassword("password1"); + + teamEntity = new TeamEntity(); + teamEntity.setName("testTeam"); + teamEntity.setMembers(Collections.singletonList(testUser)); + teamRepository.save(teamEntity, 1); + } + + @Test + void listTeamsForUserSuccessfully() throws Exception { + MvcResult result = + mvc() + .perform(get("/api/users/" + testUser.getId() + "/teams")) + .andExpect(status().isOk()) + .andDo(document("teams/list/user")) + .andReturn(); + + GetTeamResponse[] teams = + fromJson(result.getResponse().getContentAsString(), GetTeamResponse[].class); + Assertions.assertEquals(1L, teams.length); + Assertions.assertEquals("testTeam", teams[0].getName()); + } + + @Test + void throwsExceptionWhenUserDoesNotExist() throws Exception { + MvcResult result = + mvc().perform(get("/api/users/1000/teams")).andExpect(status().isNotFound()).andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("User with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/RemoveTeamFromProjectControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/RemoveTeamFromProjectControllerIntegrationTest.java new file mode 100644 index 000000000..9c877c6a1 --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/RemoveTeamFromProjectControllerIntegrationTest.java @@ -0,0 +1,111 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.projectadministration.domain.ProjectEntity; +import io.reflectoring.coderadar.graph.projectadministration.project.repository.ProjectRepository; +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.MvcResult; + +class RemoveTeamFromProjectControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private TeamRepository teamRepository; + + @Autowired private ProjectRepository projectRepository; + + private TeamEntity teamEntity; + private ProjectEntity testProject; + + @BeforeEach + void setUp() { + testProject = new ProjectEntity(); + testProject.setVcsUrl("https://valid.url"); + testProject.setName("project"); + testProject.setVcsStart(new Date()); + testProject.setVcsOnline(true); + testProject.setVcsPassword("testPassword"); + testProject.setVcsUsername("testUser"); + projectRepository.save(testProject); + + teamEntity = new TeamEntity(); + teamEntity.setName("testTeam"); + teamEntity.setProjects(Collections.singletonList(testProject)); + teamRepository.save(teamEntity, 1); + } + + @Test + void removeTeamFromProjectSuccessfully() throws Exception { + mvc() + .perform(delete("/api/projects/" + testProject.getId() + "/teams/" + teamEntity.getId())) + .andExpect(status().isOk()) + .andDo(document("teams/remove/project")) + .andReturn(); + + List teams = teamRepository.listTeamsByProjectIdWithMembers(testProject.getId()); + Assertions.assertTrue(teams.isEmpty()); + } + + @Test + void throwsExceptionWhenTeamIsNotAssignedToProject() throws Exception { + teamEntity.setProjects(Collections.emptyList()); + teamRepository.save(teamEntity, 1); + + MvcResult result = + mvc() + .perform( + delete("/api/projects/" + testProject.getId() + "/teams/" + teamEntity.getId())) + .andExpect(status().isBadRequest()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + + Assertions.assertEquals( + "Team with id " + + teamEntity.getId() + + " is not assigned to project with id " + + testProject.getId(), + errorMessage); + } + + @Test + void throwsExceptionWhenProjectDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform(delete("/api/projects/1000/teams/" + teamEntity.getId())) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Project with id 1000 not found.", errorMessage); + } + + @Test + void throwsExceptionWhenTeamDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform(delete("/api/projects/" + testProject.getId() + "/teams/1000")) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Team with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/RemoveUsersFromTeamControllerIntegrationTest.java b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/RemoveUsersFromTeamControllerIntegrationTest.java new file mode 100644 index 000000000..c9b6ae571 --- /dev/null +++ b/coderadar-test/src/test/java/io/reflectoring/coderadar/rest/useradministration/teams/RemoveUsersFromTeamControllerIntegrationTest.java @@ -0,0 +1,124 @@ +package io.reflectoring.coderadar.rest.useradministration.teams; + +import static io.reflectoring.coderadar.rest.JsonHelper.fromJson; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.reflectoring.coderadar.graph.useradministration.domain.TeamEntity; +import io.reflectoring.coderadar.graph.useradministration.domain.UserEntity; +import io.reflectoring.coderadar.graph.useradministration.repository.TeamRepository; +import io.reflectoring.coderadar.graph.useradministration.repository.UserRepository; +import io.reflectoring.coderadar.rest.ControllerTestTemplate; +import io.reflectoring.coderadar.rest.JsonListWrapper; +import io.reflectoring.coderadar.rest.domain.ErrorMessageResponse; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; + +class RemoveUsersFromTeamControllerIntegrationTest extends ControllerTestTemplate { + + @Autowired private TeamRepository teamRepository; + + @Autowired private UserRepository userRepository; + + private TeamEntity teamEntity; + private UserEntity testUser; + + @BeforeEach + void setUp() { + testUser = new UserEntity(); + testUser.setUsername("username"); + testUser.setPassword("password1"); + userRepository.save(testUser); + + teamEntity = new TeamEntity(); + teamEntity.setName("testTeam"); + teamEntity.setMembers(Collections.singletonList(testUser)); + teamRepository.save(teamEntity, 1); + } + + @Test + void removeUsersFromTeamSuccessfully() throws Exception { + ConstrainedFields fields = fields(JsonListWrapper.class); + + mvc() + .perform( + delete("/api/teams/" + teamEntity.getId() + "/users") + .content(toJson(new JsonListWrapper<>(Collections.singletonList(testUser.getId())))) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andDo( + document( + "teams/remove/user", + requestFields( + fields.withPath("elements").description("A list containing user IDs")))) + .andReturn(); + + List teams = teamRepository.listTeamsByUserId(testUser.getId()); + Assertions.assertEquals(0, teams.size()); + } + + @Test + void throwsExceptionWhenUserIsNotInTeam() throws Exception { + teamEntity.setMembers(Collections.emptyList()); + teamRepository.save(teamEntity, 1); + + MvcResult result = + mvc() + .perform( + delete("/api/teams/" + teamEntity.getId() + "/users") + .content( + toJson(new JsonListWrapper<>(Collections.singletonList(testUser.getId())))) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals( + "User with id " + testUser.getId() + " is not in team with id " + teamEntity.getId(), + errorMessage); + } + + @Test + void throwsExceptionWhenTeamDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform( + delete("/api/teams/1000/users") + .content( + toJson(new JsonListWrapper<>(Collections.singletonList(testUser.getId())))) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("Team with id 1000 not found.", errorMessage); + } + + @Test + void throwsExceptionWhenUserDoesNotExist() throws Exception { + MvcResult result = + mvc() + .perform( + delete("/api/teams/" + teamEntity.getId() + "/users") + .content(toJson(new JsonListWrapper<>(Collections.singletonList(1000)))) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()) + .andReturn(); + + String errorMessage = + fromJson(result.getResponse().getContentAsString(), ErrorMessageResponse.class) + .getErrorMessage(); + Assertions.assertEquals("User with id 1000 not found.", errorMessage); + } +} diff --git a/coderadar-ui/package-lock.json b/coderadar-ui/package-lock.json index 8889918a5..d26454889 100644 --- a/coderadar-ui/package-lock.json +++ b/coderadar-ui/package-lock.json @@ -485,17 +485,17 @@ } }, "@angular/elements": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-10.0.8.tgz", - "integrity": "sha512-LTWqNCqBPzKiTDAgFJMhX5nViYf12ufW4eVyUatvgHa3QpV1TEsou6c+q46sw6y9RoV87aRV3H+DnpaSuuQx8w==", + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-10.0.14.tgz", + "integrity": "sha512-oT9/yXwTPX+SFXXVCe0eRK5uFVefKVWPcS+s/LvpFehWPt80p5CSFbeo5+BICcaRLQltVWi09wjwUF/9fcvzmA==", "requires": { "tslib": "^2.0.0" }, "dependencies": { "tslib": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", - "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" } } }, diff --git a/coderadar-ui/src/app/app.module.ts b/coderadar-ui/src/app/app.module.ts index 509cbcb68..fa88c88e5 100644 --- a/coderadar-ui/src/app/app.module.ts +++ b/coderadar-ui/src/app/app.module.ts @@ -62,17 +62,22 @@ import {PinchZoomModule} from 'ngx-pinch-zoom'; import {ScrollingModule} from '@angular/cdk/scrolling'; import { ListViewComponent } from './view/project-dashboard/list-view/list-view.component'; import { BranchViewComponent } from './view/project-dashboard/branch-view/branch-view.component'; -import {ContributorCardComponent, ContributorDialogComponent} from './components/contributor-card/contributor-card.component'; +import {ContributorCardComponent} from './components/contributor-card/contributor-card.component'; import { FileViewComponent } from './view/file-view/file-view.component'; -import {ContributorMergeDialogComponent} from './components/contributor-merge-dialog/merge-dialog.component'; -import { - DeleteProjectDialogComponent -} from './components/delete-project-dialog/delete-project-dialog.component'; +import { TeamsDashboardComponent } from './view/teams-dashboard/teams-dashboard.component'; +import { AddTeamComponent } from './view/add-team/add-team.component'; +import { SidenavContentComponent } from './view/sidenav-content/sidenav-content.component'; +import {ContributorMergeDialogComponent} from './components/contributor-merge-dialog/contributor-merge-dialog.component'; +import {DeleteProjectDialogComponent} from './components/delete-project-dialog/delete-project-dialog.component'; +import {AddProjectToTeamDialogComponent} from './components/add-project-to-team-dialog/add-project-to-team-dialog.component'; +import {ContributorDialogComponent} from './components/contributor-card/contributor-dialog.component'; const appRoutes: Routes = [ {path: 'login', component: LoginComponent}, {path: 'register', component: RegisterComponent}, {path: 'dashboard', component: MainDashboardComponent}, + {path: 'teams', component: TeamsDashboardComponent}, + {path: 'add-team', component: AddTeamComponent}, {path: 'user-settings', component: UserSettingsComponent}, {path: 'add-project', component: AddProjectComponent}, {path: 'project-configure/:id', component: ConfigureProjectComponent}, @@ -93,13 +98,13 @@ const appRoutes: Routes = [ RegisterComponent, AddProjectComponent, MainDashboardComponent, - DeleteProjectDialogComponent, ConfigureProjectComponent, EditProjectComponent, HeaderComponent, FooterComponent, UserSettingsComponent, ProjectDashboardComponent, + TeamsDashboardComponent, ViewCommitComponent, CityViewComponent, DependencyRootComponent, @@ -109,6 +114,11 @@ const appRoutes: Routes = [ CityViewHeaderComponent, ListViewComponent, BranchViewComponent, + FileViewComponent, + TeamsDashboardComponent, + AddProjectToTeamDialogComponent, + AddTeamComponent, + SidenavContentComponent, ContributorDialogComponent, ContributorCardComponent, FileViewComponent, @@ -180,6 +190,7 @@ const appRoutes: Routes = [ ], bootstrap: [AppComponent], entryComponents: [ + AddProjectToTeamDialogComponent, ContributorMergeDialogComponent, ContributorDialogComponent, DeleteProjectDialogComponent diff --git a/coderadar-ui/src/app/city-map/VisualizationConfig.ts b/coderadar-ui/src/app/city-map/VisualizationConfig.ts index 92953dfc2..c0135467b 100644 --- a/coderadar-ui/src/app/city-map/VisualizationConfig.ts +++ b/coderadar-ui/src/app/city-map/VisualizationConfig.ts @@ -5,7 +5,7 @@ export class VisualizationConfig { // VISUALIZATION SETTINGS static EDGE_LENGTH_FACTOR = 2; static HEIGHT_FACTOR = 0.1; - static ROOT_NAME = "root"; + static ROOT_NAME = 'root'; // static GLOBAL_MAX_GROUND_AREA = 100; // static GLOBAL_MIN_GROUND_AREA = 1; // static GLOBAL_MAX_HEIGHT = 100; @@ -31,7 +31,7 @@ export class VisualizationConfig { static COLOR_DELETED_FILE = '#d90206'; static COLOR_UNCHANGED_FILE = '#cccccc'; - //HIGHLIGHTING + // HIGHLIGHTING static HIGHLIGHT_BOX_MARGIN = 0.25; static getShortNameByMetricName(metricName: string): IMetric { diff --git a/coderadar-ui/src/app/city-map/autosuggest-wrapper/autosuggest-wrapper.component.ts b/coderadar-ui/src/app/city-map/autosuggest-wrapper/autosuggest-wrapper.component.ts index 9e4538452..ab0533566 100644 --- a/coderadar-ui/src/app/city-map/autosuggest-wrapper/autosuggest-wrapper.component.ts +++ b/coderadar-ui/src/app/city-map/autosuggest-wrapper/autosuggest-wrapper.component.ts @@ -16,52 +16,53 @@ import {debounceTime, distinctUntilChanged, map, startWith} from 'rxjs/operators templateUrl: './autosuggest-wrapper.component.html', styleUrls: ['./autosuggest-wrapper.component.scss'] }) -export class AutosuggestWrapperComponent implements OnInit{ +export class AutosuggestWrapperComponent implements OnInit { @ViewChild('inputElement') inputElement; @Input() model$: Observable; @Input() source$: Observable; @Input() isDisabled: boolean; - @Input() resetOnBlur:boolean = false; + @Input() resetOnBlur = false; @Input() alignRight = false; @Input() label: string; @Output() valueChanged = new EventEmitter(); - @Input() filterOptions :((value: any,source:any[])=> any[]) = (value, options) => options; - @Input() formatOption :((value: any)=> string ) = value => value.toString(); - displayOptions: Observable<{value:any,displayValue:string }[]>; - formattedOptions: {value:any,displayValue:string }[]; + displayOptions: Observable<{value: any, displayValue: string }[]>; + formattedOptions: {value: any, displayValue: string }[]; formControl = new FormControl(); - lastSetValue:any; + lastSetValue: any; + @Input() filterOptions: ((value: any, source: any[]) => any[]) = (value, options) => options; + @Input() formatOption: ((value: any) => string ) = value => value.toString(); handleValueChanged(selectedOption: any) { this.lastSetValue = selectedOption; this.valueChanged.emit(selectedOption.value); } - displayFunction(option:{value:any,displayValue:string }):string{ - if(option){ + displayFunction(option: {value: any, displayValue: string }): string { + if (option) { return option.displayValue; - }else{ - return ""; + } else { + return ''; } } - onBlur(){ - if (this.resetOnBlur)this.formControl.reset(this.associateFormattedOptions(this.lastSetValue)) + onBlur() { + if (this.resetOnBlur) {this.formControl.reset(this.associateFormattedOptions(this.lastSetValue)); } } - associateFormattedOptions(value):{value:any,displayValue:string}{ - return {value:value,displayValue:this.formatOption(value)}; + associateFormattedOptions(value): {value: any, displayValue: string} { + return {value, displayValue: this.formatOption(value)}; } ngOnInit(): void { - if(this.model$)this.model$.subscribe(value => { + if (this.model$) {this.model$.subscribe(value => { this.formControl.setValue(this.associateFormattedOptions(value)); this.lastSetValue = value; }); + } this.formattedOptions = []; this.source$.subscribe(value => value.forEach(option => this.formattedOptions.push(this.associateFormattedOptions(option)))); @@ -70,7 +71,7 @@ export class AutosuggestWrapperComponent implements OnInit{ debounceTime(200), distinctUntilChanged(), startWith(' '), - map(value => this.filterOptions(value,this.formattedOptions)) + map(value => this.filterOptions(value, this.formattedOptions)) ); } } diff --git a/coderadar-ui/src/app/city-map/control-panel/commit-chooser/commit-chooser.component.ts b/coderadar-ui/src/app/city-map/control-panel/commit-chooser/commit-chooser.component.ts index edff899e4..379bda4cf 100644 --- a/coderadar-ui/src/app/city-map/control-panel/commit-chooser/commit-chooser.component.ts +++ b/coderadar-ui/src/app/city-map/control-panel/commit-chooser/commit-chooser.component.ts @@ -1,15 +1,19 @@ -import {Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges} from '@angular/core'; +import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; import {CommitType} from '../../enum/CommitType'; import {Commit} from '../../../model/commit'; -import {Observable} from "rxjs"; -import {DatePipe} from "@angular/common"; +import {Observable} from 'rxjs'; +import {DatePipe} from '@angular/common'; @Component({ selector: 'app-commit-chooser', templateUrl: './commit-chooser.component.html', styleUrls: ['./commit-chooser.component.scss'] }) -export class CommitChooserComponent implements OnInit{ +export class CommitChooserComponent implements OnInit { + + constructor(public datepipe: DatePipe) {} + + static readonly COMMIT_HASH_LENGTH = 7; @Input() commitType: CommitType; @Input() commits: Observable; @@ -20,10 +24,6 @@ export class CommitChooserComponent implements OnInit{ @Output() changeCommit = new EventEmitter(); - static readonly COMMIT_HASH_LENGTH = 7; - - constructor(public datepipe:DatePipe) {} - ngOnInit() { this.selected.subscribe(value => this.handleCommitChanged(value)); } @@ -31,12 +31,13 @@ export class CommitChooserComponent implements OnInit{ formatCommit(commit: Commit): string { if (commit === null || commit === undefined) { - return "empty"; + return 'empty'; } - return commit.hash.substring(0, CommitChooserComponent.COMMIT_HASH_LENGTH) + ', ' + commit.author + ', ' + new Date(commit.timestamp).toUTCString(); + return commit.hash.substring(0, CommitChooserComponent.COMMIT_HASH_LENGTH) + ', ' + + commit.author + ', ' + new Date(commit.timestamp).toUTCString(); } - filterCommitOptions(value: string,source:{value:Commit,displayValue:string}[]): {value:Commit,displayValue:string}[] { + filterCommitOptions(value: string, source: {value: Commit, displayValue: string}[]): {value: Commit, displayValue: string}[] { if (source === undefined) { return []; } else if (typeof value !== 'string') { @@ -56,8 +57,9 @@ export class CommitChooserComponent implements OnInit{ if (optionAny.author.toLowerCase().includes(lowercaseValue)) {score += 25; } if (optionAny.name.startsWith(value)) {score += 1000; } if (optionAny.name.includes(lowercaseValue)) {score += 500; } - if (option.displayValue.substring(option.value.author.length+CommitChooserComponent.COMMIT_HASH_LENGTH).toLowerCase().includes(lowercaseValue)){score+=1000} - if (score > 0||value==="") { + if (option.displayValue.substring(option.value.author.length + CommitChooserComponent.COMMIT_HASH_LENGTH) + .toLowerCase().includes(lowercaseValue)) {score += 1000; } + if (score > 0 || value === '') { optionAny.score = score; return option; } diff --git a/coderadar-ui/src/app/city-map/control-panel/control-panel.module.ts b/coderadar-ui/src/app/city-map/control-panel/control-panel.module.ts index 91086b2e2..b747bfdef 100644 --- a/coderadar-ui/src/app/city-map/control-panel/control-panel.module.ts +++ b/coderadar-ui/src/app/city-map/control-panel/control-panel.module.ts @@ -30,7 +30,7 @@ import { } from '@angular/material'; import {LayoutModule} from '@angular/cdk/layout'; import {ProjectService} from '../../service/project.service'; -import {HighlightSearchPipe} from "./pipes/highlight-search.pipe"; +import {HighlightSearchPipe} from './pipes/highlight-search.pipe'; @NgModule({ imports: [ diff --git a/coderadar-ui/src/app/city-map/control-panel/pipes/highlight-search.pipe.ts b/coderadar-ui/src/app/city-map/control-panel/pipes/highlight-search.pipe.ts index 60abc233e..64c3e2881 100644 --- a/coderadar-ui/src/app/city-map/control-panel/pipes/highlight-search.pipe.ts +++ b/coderadar-ui/src/app/city-map/control-panel/pipes/highlight-search.pipe.ts @@ -6,11 +6,11 @@ import { Pipe, PipeTransform } from '@angular/core'; export class HighlightSearchPipe implements PipeTransform { transform(value: any, args?: string): any { - if(!args) {return value;} - if(typeof args !== 'string') return value; - if(args.toString()===" ") return value; - var re = new RegExp(args,'gi'); - return value.replace(re,"$&"); + if (!args) {return value; } + if (typeof args !== 'string') { return value; } + if (args.toString() === ' ') { return value; } + const re = new RegExp(args, 'gi'); + return value.replace(re, '$&'); } } diff --git a/coderadar-ui/src/app/city-map/control-panel/search/search.component.ts b/coderadar-ui/src/app/city-map/control-panel/search/search.component.ts index 3bbb161ec..692ca2c85 100644 --- a/coderadar-ui/src/app/city-map/control-panel/search/search.component.ts +++ b/coderadar-ui/src/app/city-map/control-panel/search/search.component.ts @@ -1,6 +1,6 @@ import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; -import {Observable} from "rxjs"; -import {VisualizationConfig} from "../../VisualizationConfig"; +import {Observable} from 'rxjs'; +import {VisualizationConfig} from '../../VisualizationConfig'; @Component({ selector: 'app-search', @@ -16,7 +16,9 @@ export class SearchComponent implements OnInit { constructor() { } - filterFileOptions(value: string,source:{value:string,displayValue:string}[]): {value:string,displayValue:string}[] { + filterFileOptions(value: string, source: {value: string, displayValue: string, score: number}[]): + {value: string, displayValue: string}[] { + if (source === undefined) { return []; } else if (typeof value !== 'string') { @@ -27,30 +29,30 @@ export class SearchComponent implements OnInit { const lowercaseValue = value.toLowerCase(); source.forEach(option => { - var score = 0; - //Positive conditions - if(option.displayValue.startsWith(value))score += 10 - if(option.displayValue.toLowerCase().includes(lowercaseValue))score +=1; - //Final conditions - if(option.displayValue===VisualizationConfig.ROOT_NAME)score = 0; - option["score"] = score; + let score = 0; + // Positive conditions + if (option.displayValue.startsWith(value)) {score += 10; } + if (option.displayValue.toLowerCase().includes(lowercaseValue)) {score += 1; } + // Final conditions + if (option.displayValue === VisualizationConfig.ROOT_NAME) {score = 0; } + option.score = score; }); - const filteredFiles: {value:string,displayValue:string}[] = source.filter(option => { - if(option["score"]<=0)return; - if(option.value.toLowerCase().includes(lowercaseValue))return option; + const filteredFiles: {value: string, displayValue: string, score: number}[] = source.filter(option => { + if (option.score <= 0) {return; } + if (option.value.toLowerCase().includes(lowercaseValue)) {return option; } }); return filteredFiles.sort( - (a, b) =>{ - return Math.sign(b["score"] - a["score"]); + (a, b) => { + return Math.sign(b.score - a.score); }); } - formatFileOptions(option: string): string{ - if(option){ + formatFileOptions(option: string): string { + if (option) { return option; - }else{ - return ""; + } else { + return ''; } } diff --git a/coderadar-ui/src/app/city-map/helper/element-analyzer.ts b/coderadar-ui/src/app/city-map/helper/element-analyzer.ts index 1a19ffe90..c89b2b83c 100644 --- a/coderadar-ui/src/app/city-map/helper/element-analyzer.ts +++ b/coderadar-ui/src/app/city-map/helper/element-analyzer.ts @@ -2,7 +2,7 @@ import {INode} from '../interfaces/INode'; import {NodeType} from '../enum/NodeType'; import {ScreenType} from '../enum/ScreenType'; import {CommitReferenceType} from '../enum/CommitReferenceType'; -import {MetricValue} from "../../model/metric-value"; +import {MetricValue} from '../../model/metric-value'; export class ElementAnalyzer { @@ -113,7 +113,8 @@ export class ElementAnalyzer { } else if (commit2Metrics === null) { return commit1Metrics[metricName]; } else { - let commit1 = this.getValueFromMetric(commit1Metrics, metricName), commit2 = this.getValueFromMetric(commit2Metrics, metricName); + const commit1 = this.getValueFromMetric(commit1Metrics, metricName); + const commit2 = this.getValueFromMetric(commit2Metrics, metricName); return commit1 < commit2 ? commit1 : commit2; } @@ -125,11 +126,12 @@ export class ElementAnalyzer { } if (commit1Metrics === null) { - return this.getValueFromMetric(commit2Metrics, metricName) + return this.getValueFromMetric(commit2Metrics, metricName); } else if (commit2Metrics === null) { return this.getValueFromMetric(commit1Metrics, metricName); } else { - let commit1 = this.getValueFromMetric(commit1Metrics, metricName), commit2 = this.getValueFromMetric(commit2Metrics, metricName); + const commit1 = this.getValueFromMetric(commit1Metrics, metricName); + const commit2 = this.getValueFromMetric(commit2Metrics, metricName); return commit1 > commit2 ? commit1 : commit2; } @@ -198,8 +200,8 @@ export class ElementAnalyzer { } } - static getValueFromMetric(metrics: MetricValue[], metricName: String) { - let index = metrics ? Object.values(metrics).findIndex(object => object.metricName === metricName): -1; + static getValueFromMetric(metrics: MetricValue[], metricName: string) { + const index = metrics ? Object.values(metrics).findIndex(object => object.metricName === metricName) : -1; return index >= 0 ? Number(metrics[index].value) : undefined; } diff --git a/coderadar-ui/src/app/city-map/interfaces/INode.ts b/coderadar-ui/src/app/city-map/interfaces/INode.ts index f29c88328..df1a2b45d 100644 --- a/coderadar-ui/src/app/city-map/interfaces/INode.ts +++ b/coderadar-ui/src/app/city-map/interfaces/INode.ts @@ -1,6 +1,6 @@ import {IPackerElement} from './IPackerElement'; import {NodeType} from '../enum/NodeType'; -import {MetricValue} from "../../model/metric-value"; +import {MetricValue} from '../../model/metric-value'; export interface INode { name: string; diff --git a/coderadar-ui/src/app/city-map/visualization/interaction-handler/interaction-handler.ts b/coderadar-ui/src/app/city-map/visualization/interaction-handler/interaction-handler.ts index 73d1a0688..4338cb500 100644 --- a/coderadar-ui/src/app/city-map/visualization/interaction-handler/interaction-handler.ts +++ b/coderadar-ui/src/app/city-map/visualization/interaction-handler/interaction-handler.ts @@ -10,7 +10,7 @@ import { } from 'three'; import {FocusService} from '../../service/focus.service'; import {TooltipService} from '../../service/tooltip.service'; -import {VisualizationConfig} from "../../VisualizationConfig"; +import {VisualizationConfig} from '../../VisualizationConfig'; export class InteractionHandler { @@ -181,11 +181,11 @@ export class InteractionHandler { private findFirstNonHelperBlockIntersection(intersections: Intersection[]): Intersection { if (intersections.length > 0) { - for (let i = 0; i < intersections.length; i++) { + for (const i of intersections) { // find the first block that is not a helper block // this lets the clicks go through the helper blocks - if (!intersections[i].object.userData.isHelper) { - return intersections[i]; + if (!i.object.userData.isHelper) { + return i; } } } diff --git a/coderadar-ui/src/app/city-map/visualization/screen/screen.component.ts b/coderadar-ui/src/app/city-map/visualization/screen/screen.component.ts index f8f36f65b..9b6ff6403 100644 --- a/coderadar-ui/src/app/city-map/visualization/screen/screen.component.ts +++ b/coderadar-ui/src/app/city-map/visualization/screen/screen.component.ts @@ -131,7 +131,7 @@ export class ScreenComponent implements OnInit, OnChanges, OnDestroy { } createRenderer() { - this.renderer = new WebGLRenderer({antialias: true, preserveDrawingBuffer: true,logarithmicDepthBuffer:true}); + this.renderer = new WebGLRenderer({antialias: true, preserveDrawingBuffer: true, logarithmicDepthBuffer: true}); this.renderer.setClearColor(0xf0f0f0); this.renderer.setSize(this.getScreenWidth() - 0, window.innerHeight); @@ -296,7 +296,7 @@ export class ScreenComponent implements OnInit, OnChanges, OnDestroy { }; } - private getRoot():Object3D{ + private getRoot(): Object3D { return this.scene.getObjectByName(VisualizationConfig.ROOT_NAME); } @@ -353,35 +353,35 @@ export class ScreenComponent implements OnInit, OnChanges, OnDestroy { } private createTooltip() { - var material = new THREE.MeshBasicMaterial({ - color:0xff0000 + const material = new THREE.MeshBasicMaterial({ + color: 0xff0000 }); - var geometry = new THREE.Geometry(); + const geometry = new THREE.Geometry(); geometry.vertices.push( - new Vector3(0,0,0), - new Vector3(0,-1,0) + new Vector3(0, 0, 0), + new Vector3(0, -1, 0) ); - var tipSize = 0.1; - var tipGeometry = new THREE.SphereGeometry(tipSize,16,16); - this.tooltipLine = new Line(geometry,material); - var tooltipLineTip = new Mesh(tipGeometry,material); + const tipSize = 0.1; + const tipGeometry = new THREE.SphereGeometry(tipSize, 16, 16); + this.tooltipLine = new Line(geometry, material); + const tooltipLineTip = new Mesh(tipGeometry, material); tooltipLineTip.position.setY(-1); this.tooltipLine.add(tooltipLineTip); - this.tooltipLine.type = "TooltipLine"; + this.tooltipLine.type = 'TooltipLine'; this.tooltipLine.visible = false; this.tooltipLine.userData.isHelper = true; this.scene.add(this.tooltipLine); } - private createSelectionHighlightBox(){ - var material = new THREE.MeshBasicMaterial({ - color:0xffff00, - opacity:0.5, - transparent:true + private createSelectionHighlightBox() { + const material = new THREE.MeshBasicMaterial({ + color: 0xffff00, + opacity: 0.5, + transparent: true }); - var geometry = new THREE.BoxGeometry(1,1,1); - this.highlightBox = new Mesh(geometry,material); - this.highlightBox.type = "HighlightBox"; + const geometry = new THREE.BoxGeometry(1, 1, 1); + this.highlightBox = new Mesh(geometry, material); + this.highlightBox.type = 'HighlightBox'; this.highlightBox.visible = false; this.highlightBox.userData.isHelper = true; this.scene.add(this.highlightBox); diff --git a/coderadar-ui/src/app/components/add-project-to-team-dialog/add-project-to-team-dialog-data.ts b/coderadar-ui/src/app/components/add-project-to-team-dialog/add-project-to-team-dialog-data.ts new file mode 100644 index 000000000..550cf3f84 --- /dev/null +++ b/coderadar-ui/src/app/components/add-project-to-team-dialog/add-project-to-team-dialog-data.ts @@ -0,0 +1,11 @@ +import {Project} from '../../model/project'; +import {Team} from '../../model/team'; +import {ProjectRole} from '../../model/project-role'; + +export class AddProjectToTeamDialogData { + project: Project; + teams: Team[]; + role: ProjectRole; +} + + diff --git a/coderadar-ui/src/app/components/add-project-to-team-dialog/add-project-to-team-dialog.component.ts b/coderadar-ui/src/app/components/add-project-to-team-dialog/add-project-to-team-dialog.component.ts new file mode 100644 index 000000000..52ab4e225 --- /dev/null +++ b/coderadar-ui/src/app/components/add-project-to-team-dialog/add-project-to-team-dialog.component.ts @@ -0,0 +1,29 @@ +import {Component, Inject} from '@angular/core'; +import {FormControl} from '@angular/forms'; +import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; +import {AddProjectToTeamDialogData} from './add-project-to-team-dialog-data'; + +@Component({ + selector: 'app-add-project-to-team-dialog', + templateUrl: 'add-project-to-team-dialog.html' +}) +export class AddProjectToTeamDialogComponent { + + selectedTeams: FormControl = new FormControl(); + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: AddProjectToTeamDialogData + ) { + + } + + onNoClick(): void { + this.dialogRef.close(); + } + + onAddClick(): void { + this.data.teams = this.selectedTeams.value; + } + +} diff --git a/coderadar-ui/src/app/components/add-project-to-team-dialog/add-project-to-team-dialog.html b/coderadar-ui/src/app/components/add-project-to-team-dialog/add-project-to-team-dialog.html new file mode 100644 index 000000000..41ce47edd --- /dev/null +++ b/coderadar-ui/src/app/components/add-project-to-team-dialog/add-project-to-team-dialog.html @@ -0,0 +1,24 @@ +
+ + Select teams + + {{team.name}} + + + + + Select role + + + Admin + + + Member + + + +
+ + + + diff --git a/coderadar-ui/src/app/components/contributor-card/contributor-card.component.ts b/coderadar-ui/src/app/components/contributor-card/contributor-card.component.ts index 45df2dbf3..6114051cc 100644 --- a/coderadar-ui/src/app/components/contributor-card/contributor-card.component.ts +++ b/coderadar-ui/src/app/components/contributor-card/contributor-card.component.ts @@ -1,10 +1,7 @@ -import {Component, ElementRef, HostListener, Inject, Input, OnInit} from '@angular/core'; +import {Component, HostListener, Input, OnInit} from '@angular/core'; import {Contributor} from '../../model/contributor'; -import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from '@angular/material/dialog'; - -interface ContributorDialogData{ - contributor: Contributor; -} +import {MatDialog, MatDialogRef} from '@angular/material/dialog'; +import {ContributorDialogComponent} from './contributor-dialog.component'; @Component({ selector: 'app-contributor-card', @@ -12,43 +9,43 @@ interface ContributorDialogData{ styleUrls: ['./contributor-card.component.css'] }) export class ContributorCardComponent implements OnInit { + constructor(public dialog: MatDialog) { } - @HostListener('document:click',['$event']) - clickout(event){ - if(this.clickoutHandler){ - this.clickoutHandler(event); - } - } - - clickoutHandler: Function; + clickoutHandler: (event: MouseEvent) => void; dialogRef: MatDialogRef; @Input() contributor: Contributor; @Input() - noAvatar: boolean = false; - constructor(public dialog: MatDialog) { } + noAvatar = false; + + @HostListener('document:click', ['$event']) + clickout(event) { + if (this.clickoutHandler) { + this.clickoutHandler.call(event); + } + } - openDialog(): void{ + openDialog(): void { setTimeout(() => { this.dialogRef = this.dialog.open(ContributorDialogComponent, { minWidth: '150px', - data:{contributor: this.contributor} + data: {contributor: this.contributor} }); - this.dialogRef.afterOpened().subscribe(()=>{ + this.dialogRef.afterOpened().subscribe(() => { this.clickoutHandler = this.closeDialogFromClickout; }); }); } - closeDialogFromClickout(event: MouseEvent){ - if (!this.dialogRef.componentInstance)return; + closeDialogFromClickout(event: MouseEvent) { + if (!this.dialogRef.componentInstance) {return; } const matDialogContainer = this.dialogRef.componentInstance.hostElement.nativeElement.parentElement; const rect = matDialogContainer.getBoundingClientRect(); - if(event.clientX <= rect.left || event.clientX >= rect.right || event.clientY <= rect.top || event.clientY >= rect.bottom){ + if (event.clientX <= rect.left || event.clientX >= rect.right || event.clientY <= rect.top || event.clientY >= rect.bottom) { this.dialogRef.close(); } } @@ -60,29 +57,3 @@ export class ContributorCardComponent implements OnInit { } -@Component({ - selector: 'app-contributor-dialog', - templateUrl: './contributor-dialog.html', - styleUrls: ['contributor-dialog.css'] -}) -export class ContributorDialogComponent implements OnInit { - - contributor: Contributor; - avatarUrl: string; - - constructor( - public hostElement: ElementRef, - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: ContributorDialogData - ) { - this.contributor = data.contributor; - } - - getAliases(): string[]{ - return this.contributor.names.filter(value => value !== this.contributor.displayName); - } - - ngOnInit() { - } - -} diff --git a/coderadar-ui/src/app/components/contributor-card/contributor-dialog.component.ts b/coderadar-ui/src/app/components/contributor-card/contributor-dialog.component.ts new file mode 100644 index 000000000..b8d625a96 --- /dev/null +++ b/coderadar-ui/src/app/components/contributor-card/contributor-dialog.component.ts @@ -0,0 +1,35 @@ +import {Contributor} from '../../model/contributor'; +import {Component, ElementRef, Inject, OnInit} from '@angular/core'; +import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; + +interface ContributorDialogData { + contributor: Contributor; +} + + +@Component({ + selector: 'app-contributor-dialog', + templateUrl: './contributor-dialog.html', + styleUrls: ['contributor-dialog.css'] +}) +export class ContributorDialogComponent implements OnInit { + + contributor: Contributor; + avatarUrl: string; + + constructor( + public hostElement: ElementRef, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: ContributorDialogData + ) { + this.contributor = data.contributor; + } + + getAliases(): string[] { + return this.contributor.names.filter(value => value !== this.contributor.displayName); + } + + ngOnInit() { + } + +} diff --git a/coderadar-ui/src/app/components/contributor-card/contributor-dialog.css b/coderadar-ui/src/app/components/contributor-card/contributor-dialog.css index 5ce057c7a..8435eab28 100644 --- a/coderadar-ui/src/app/components/contributor-card/contributor-dialog.css +++ b/coderadar-ui/src/app/components/contributor-card/contributor-dialog.css @@ -1,3 +1,7 @@ ::ng-deep .contributor-name{ margin: 0; } + +ul { + padding: 0 16px +} diff --git a/coderadar-ui/src/app/components/contributor-card/contributor-dialog.html b/coderadar-ui/src/app/components/contributor-card/contributor-dialog.html index e1f112943..d84411cbc 100644 --- a/coderadar-ui/src/app/components/contributor-card/contributor-dialog.html +++ b/coderadar-ui/src/app/components/contributor-card/contributor-dialog.html @@ -5,14 +5,14 @@

Alias{{getAliases().length>1?'es':''}}

-
    +
    • {{alias}}

Email{{contributor.emailAddresses.length>1?'s':''}}:

-
    +
    • {{email}}
    • diff --git a/coderadar-ui/src/app/components/contributor-merge-dialog/contributor-merge-dialog.component.spec.ts b/coderadar-ui/src/app/components/contributor-merge-dialog/contributor-merge-dialog.component.spec.ts index 149dc9d1c..7006fa095 100644 --- a/coderadar-ui/src/app/components/contributor-merge-dialog/contributor-merge-dialog.component.spec.ts +++ b/coderadar-ui/src/app/components/contributor-merge-dialog/contributor-merge-dialog.component.spec.ts @@ -1,6 +1,6 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ContributorMergeDialogComponent } from './merge-dialog.component'; +import { ContributorMergeDialogComponent } from './contributor-merge-dialog.component'; describe('MergeDialogComponent', () => { let component: ContributorMergeDialogComponent; diff --git a/coderadar-ui/src/app/components/contributor-merge-dialog/merge-dialog.component.ts b/coderadar-ui/src/app/components/contributor-merge-dialog/contributor-merge-dialog.component.ts similarity index 84% rename from coderadar-ui/src/app/components/contributor-merge-dialog/merge-dialog.component.ts rename to coderadar-ui/src/app/components/contributor-merge-dialog/contributor-merge-dialog.component.ts index ca92e78ec..97cad3486 100644 --- a/coderadar-ui/src/app/components/contributor-merge-dialog/merge-dialog.component.ts +++ b/coderadar-ui/src/app/components/contributor-merge-dialog/contributor-merge-dialog.component.ts @@ -1,6 +1,6 @@ import {Component, Inject} from '@angular/core'; import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material'; -import {DialogData} from '../../view/configure-project/configure-project.component'; +import {DialogData} from './merge-dialog-data'; @Component({ selector: 'app-contributor-merge-dialog', diff --git a/coderadar-ui/src/app/components/contributor-merge-dialog/merge-dialog-data.ts b/coderadar-ui/src/app/components/contributor-merge-dialog/merge-dialog-data.ts new file mode 100644 index 000000000..91bbda8dd --- /dev/null +++ b/coderadar-ui/src/app/components/contributor-merge-dialog/merge-dialog-data.ts @@ -0,0 +1,4 @@ +export interface DialogData { + selected: string; + displayNames: string[]; +} diff --git a/coderadar-ui/src/app/levelized-structure-map/dependency-base.ts b/coderadar-ui/src/app/levelized-structure-map/dependency-base.ts index bccc071ad..2dd03c6eb 100644 --- a/coderadar-ui/src/app/levelized-structure-map/dependency-base.ts +++ b/coderadar-ui/src/app/levelized-structure-map/dependency-base.ts @@ -2,10 +2,10 @@ import {ElementRef, HostListener, ViewChild} from '@angular/core'; import html2canvas from 'html2canvas'; import * as $ from 'jquery'; import * as jspdf from 'jspdf'; -import {AppComponent} from "../app.component"; -import {Project} from "../model/project"; -import {FORBIDDEN, NOT_FOUND} from "http-status-codes"; -import {EdgeModel} from "./edge.model"; +import {AppComponent} from '../app.component'; +import {Project} from '../model/project'; +import {FORBIDDEN, NOT_FOUND} from 'http-status-codes'; +import {EdgeModel} from './edge.model'; export abstract class DependencyBase { @@ -138,7 +138,7 @@ export abstract class DependencyBase { draw(callback): void { // clear svg - $("#3svg").empty(); + $('#3svg').empty(); this.drawn = []; const rootList = document.getElementById('3list__root'); this.svg = document.getElementById('3svg'); @@ -178,7 +178,7 @@ export abstract class DependencyBase { // calculate positions for arrows of currentNode and its dependencies if (currentNode.dependencies.length > 0) { // find last visible element for currentNode as start - let start = this.findLastHTMLElement(currentNode.path) as HTMLElement; + const start = this.findLastHTMLElement(currentNode.path) as HTMLElement; let toDraw; if (this.activeDependency !== undefined) { // activeDependency is set is not start @@ -189,13 +189,15 @@ export abstract class DependencyBase { // different values for chrome and firefox // (ref: https://stackoverflow.com/questions/1472842/firefox-and-chrome-give-different-values-for-offsettop). const startx = ($(start).offset().left - $(this.svg).offset().left) / this.zoomElement.scale + start.offsetWidth / 2; - let starty = ($(start).offset().top - $(this.svg).offset().top) / this.zoomElement.scale + start.offsetHeight + ($(start).css('padding-top') !== '0px' ? 0 : 5); - let startTop = starty - start.offsetHeight - ($(start).css('padding-top') !== '0px' ? 0 : 10); + const starty = ($(start).offset().top - $(this.svg).offset().top) / + this.zoomElement.scale + start.offsetHeight + ($(start).css('padding-top') !== '0px' ? 0 : 5); + + const startTop = starty - start.offsetHeight - ($(start).css('padding-top') !== '0px' ? 0 : 10); console.log(parseFloat($(start).css('padding-top'))); currentNode.dependencies.forEach(dependency => { // find last visible element for dependency as end - let end = this.findLastHTMLElement(dependency.path) as HTMLElement; + const end = this.findLastHTMLElement(dependency.path); // if activeDependency is set, draw only activeDependency related dependencies if (this.activeDependency !== undefined) { @@ -210,8 +212,10 @@ export abstract class DependencyBase { // end = end.parentNode as HTMLElement; const endx = ($(end).offset().left - $(this.svg).offset().left) / this.zoomElement.scale + end.offsetWidth / 2; - let endy = ($(end).offset().top - $(this.svg).offset().top) / this.zoomElement.scale - ($(end).css('padding-bottom') !== '0px' ? 0 : 7); - let endBottom = endy + end.offsetHeight + ($(end).css('padding-bottom') !== '0px' ? 0 : 14); + const endy = ($(end).offset().top - $(this.svg).offset().top) / + this.zoomElement.scale - ($(end).css('padding-bottom') !== '0px' ? 0 : 7); + + const endBottom = endy + end.offsetHeight + ($(end).css('padding-bottom') !== '0px' ? 0 : 14); if (start !== end) { if (dependency.changed === 'ADD') { @@ -250,7 +254,7 @@ export abstract class DependencyBase { svgArrow(startx, starty, endx, endy, color, width?, dashed?) { // reduce number of nodes - let edge = new EdgeModel(startx, starty, endx, endy, color, width, dashed); + const edge = new EdgeModel(startx, starty, endx, endy, color, width, dashed); if (this.drawn.filter(existingEdge => existingEdge.equals(edge)).length > 0) { return; } @@ -260,7 +264,7 @@ export abstract class DependencyBase { // definition of teh figure to draw, either a line or a curve let figureDefinition; - if (Math.abs(parseInt(startx) - parseInt(endx)) < 10) { + if (Math.abs(parseInt(startx, 10) - parseInt(endx, 10)) < 10) { // draw straight line because there is not enough space for a curve figureDefinition = `M ${startx} ${starty} L ${endx} ${endy}`; angle = Math.atan2(endy - starty, endx - startx); @@ -301,8 +305,8 @@ export abstract class DependencyBase { ); } - drawFigure(figureDefinition: string, width: number, color: string, dashed? : boolean) { - const figure = document.createElementNS("http://www.w3.org/2000/svg", 'path'); + drawFigure(figureDefinition: string, width: number, color: string, dashed?: boolean) { + const figure = document.createElementNS('http://www.w3.org/2000/svg', 'path'); figure.setAttribute('d', figureDefinition); figure.style.stroke = color; figure.style.fill = 'transparent'; diff --git a/coderadar-ui/src/app/levelized-structure-map/dependency-compare/dependency-compare.component.spec.ts b/coderadar-ui/src/app/levelized-structure-map/dependency-compare/dependency-compare.component.spec.ts index 34ffede5d..7675cbbe0 100644 --- a/coderadar-ui/src/app/levelized-structure-map/dependency-compare/dependency-compare.component.spec.ts +++ b/coderadar-ui/src/app/levelized-structure-map/dependency-compare/dependency-compare.component.spec.ts @@ -183,7 +183,8 @@ describe('DependencyRootComponent', () => { changed: null }, { - path: 'org/wickedsource/dependencytree/example/wildcardpackage/WildcardImportCircularDependencyTest.java', + path: + 'org/wickedsource/dependencytree/example/wildcardpackage/WildcardImportCircularDependencyTest.java', changed: null } ] @@ -209,7 +210,8 @@ describe('DependencyRootComponent', () => { changed: null }, { - path: 'org/wickedsource/dependencytree/example/wildcardpackage/WildcardImportCircularDependencyTest.java', + path: + 'org/wickedsource/dependencytree/example/wildcardpackage/WildcardImportCircularDependencyTest.java', changed: null } ] @@ -301,7 +303,8 @@ describe('DependencyRootComponent', () => { { filename: 'WildcardImportCircularDependencyTest.java', path: 'org/wickedsource/dependencytree/example/wildcardpackage/WildcardImportCircularDependencyTest.java', - packageName: 'org.wickedsource.dependencytree.example.wildcardpackage.WildcardImportCircularDependencyTest.java', + packageName: + 'org.wickedsource.dependencytree.example.wildcardpackage.WildcardImportCircularDependencyTest.java', level: 0, changed: null, children: [], @@ -574,7 +577,8 @@ describe('DependencyRootComponent', () => { expect(dependencyTree.children[0].changed).toBe('ADD'); }); const req = httpTestingController. - expectOne('http://localhost:8080/analyzers/1/structureMap/0b79780c8e8c8736a8e0ddafc964fc4446f007f2/643a55c23dce1832b5da07816f068896aef854e6'); + expectOne( + 'http://localhost:8080/analyzers/1/structureMap/0b79780c8e8c8736a8e0ddafc964fc4446f007f2/643a55c23dce1832b5da07816f068896aef854e6'); expect(req.request.method).toEqual('GET'); req.flush(mockResponse); }); diff --git a/coderadar-ui/src/app/levelized-structure-map/dependency-root/dependency-root.component.spec.ts b/coderadar-ui/src/app/levelized-structure-map/dependency-root/dependency-root.component.spec.ts index 9066c2f67..582c8a478 100644 --- a/coderadar-ui/src/app/levelized-structure-map/dependency-root/dependency-root.component.spec.ts +++ b/coderadar-ui/src/app/levelized-structure-map/dependency-root/dependency-root.component.spec.ts @@ -227,7 +227,8 @@ describe('DependencyRootComponent', () => { { filename: 'WildcardImportCircularDependencyTest.java', path: 'org/wickedsource/dependencytree/example/wildcardpackage/WildcardImportCircularDependencyTest.java', - packageName: 'org.wickedsource.dependencytree.example.wildcardpackage.WildcardImportCircularDependencyTest.java', + packageName: + 'org.wickedsource.dependencytree.example.wildcardpackage.WildcardImportCircularDependencyTest.java', level: 0, children: [], dependencies: [ diff --git a/coderadar-ui/src/app/model/file-pattern.spec.ts b/coderadar-ui/src/app/model/file-pattern.spec.ts new file mode 100644 index 000000000..9c782b3b9 --- /dev/null +++ b/coderadar-ui/src/app/model/file-pattern.spec.ts @@ -0,0 +1,7 @@ +import {FilePattern} from './file-pattern'; + +describe('FilePattern', () => { + it('should create an instance', () => { + expect(new FilePattern()).toBeTruthy(); + }); +}); diff --git a/coderadar-ui/src/app/model/file-patterns.spec.ts b/coderadar-ui/src/app/model/file-patterns.spec.ts deleted file mode 100644 index adf468771..000000000 --- a/coderadar-ui/src/app/model/file-patterns.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import {FilePatterns} from './file-pattern'; - -describe('FilePatterns', () => { - it('should create an instance', () => { - expect(new FilePatterns()).toBeTruthy(); - }); -}); diff --git a/coderadar-ui/src/app/model/project-role.ts b/coderadar-ui/src/app/model/project-role.ts new file mode 100644 index 000000000..584a24e7c --- /dev/null +++ b/coderadar-ui/src/app/model/project-role.ts @@ -0,0 +1,4 @@ +export enum ProjectRole { + ADMIN= 'admin', + MEMBER = 'member' +} diff --git a/coderadar-ui/src/app/model/team.ts b/coderadar-ui/src/app/model/team.ts new file mode 100644 index 000000000..c98d96660 --- /dev/null +++ b/coderadar-ui/src/app/model/team.ts @@ -0,0 +1,7 @@ +import {User} from './user'; + +export class Team { + public id: number; + public name: string; + public members: User[]; +} diff --git a/coderadar-ui/src/app/model/user.ts b/coderadar-ui/src/app/model/user.ts new file mode 100644 index 000000000..94508e1e1 --- /dev/null +++ b/coderadar-ui/src/app/model/user.ts @@ -0,0 +1,4 @@ +export class User { + public id: number; + public username: string; +} diff --git a/coderadar-ui/src/app/service/project.service.ts b/coderadar-ui/src/app/service/project.service.ts index d09aaa4b0..1ffff1dcc 100644 --- a/coderadar-ui/src/app/service/project.service.ts +++ b/coderadar-ui/src/app/service/project.service.ts @@ -108,17 +108,6 @@ export class ProjectService { {observe: 'response'}).toPromise(); } - /** - * Edits a module of a project. - * Sends a POST request to /projects/{id}/modules/{moduleId} - * @param id The id of the project. - * @param module The name (path) of the module. - */ - public editProjectModule(id: number, module: Module): Promise> { - return this.httpClient.post(this.apiURL + 'projects/' + id + '/modules/' + module.id, JSON.stringify(module), - {observe: 'response'}).toPromise(); - } - /** * Deletes a module of a project. * Sends a DELETE request to /projects/{id}/modules/{moduleId} @@ -214,7 +203,7 @@ export class ProjectService { * @param branch The branch to use for getting the commits. */ public getCommitsForContributor(id: number, branch: string, email: string): Promise> { - return this.httpClient.get(this.apiURL + 'projects/' + id + '/' + branch + '/commits?email='+email, + return this.httpClient.get(this.apiURL + 'projects/' + id + '/' + branch + '/commits?email=' + email.replace('+', '%2B'), {observe: 'response'}).toPromise(); } @@ -248,7 +237,7 @@ export class ProjectService { } /** - * Returnsthe delta three of a project given two commits and a metric mapping + * Returns the delta tree of a project given two commits and a metric mapping * @param firstCommit The first commit * @param secondCommit The second commit * @param metricMapping The metric mapping @@ -327,4 +316,9 @@ export class ProjectService { return this.httpClient.post(this.apiURL + 'projects/' + projectId + '/files/diff', {commitHash, filepath}, {observe: 'response'}).toPromise(); } + + public listProjectsForUser(userId: number): Promise> { + return this.httpClient.get(this.apiURL + 'users/' + userId + '/projects', + {observe: 'response'}).toPromise(); + } } diff --git a/coderadar-ui/src/app/service/team.service.ts b/coderadar-ui/src/app/service/team.service.ts new file mode 100644 index 000000000..50e6470ef --- /dev/null +++ b/coderadar-ui/src/app/service/team.service.ts @@ -0,0 +1,80 @@ +import {Injectable} from '@angular/core'; +import {HttpClient, HttpResponse} from '@angular/common/http'; +import {AppComponent} from '../app.component'; +import {ProjectRole} from '../model/project-role'; +import {Team} from '../model/team'; +import {Project} from '../model/project'; + +@Injectable({ + providedIn: 'root' +}) +export class TeamService { + + private apiURL = AppComponent.getApiUrl(); + + constructor(private httpClient: HttpClient) { + } + + /** + * Gets all the teams. + * Sends a GET request to /projects + */ + public listTeams(): Promise> { + return this.httpClient.get(this.apiURL + 'teams', {observe: 'response'}).toPromise(); + } + + public addTeamToProject(projectId: number, teamId: number, role: ProjectRole): Promise> { + return this.httpClient.post(this.apiURL + 'projects/' + projectId + '/teams/' + teamId, {role}, + {observe: 'response'}).toPromise(); + } + + public addUsersToTeam(teamId: number, userIds: number[]): Promise> { + return this.httpClient.post(this.apiURL + 'teams/' + teamId + '/users', {userIds}, + {observe: 'response'}).toPromise(); + } + + public removeUsersFromTeam(teamId: number, userIds: number[]): Promise> { + return this.httpClient.post(this.apiURL + 'teams/' + teamId + '/users', {userIds}, + {observe: 'response'}).toPromise(); + } + + public createTeam(name: string, userIds: number[]): Promise> { + return this.httpClient.post(this.apiURL + 'teams', {name, userIds}, + {observe: 'response'}).toPromise(); + } + + public deleteTeam(teamId: number): Promise> { + return this.httpClient.delete(this.apiURL + 'teams/' + teamId, + {observe: 'response'}).toPromise(); + } + + public getTeam(teamId: number): Promise> { + return this.httpClient.get(this.apiURL + 'teams/' + teamId, + {observe: 'response'}).toPromise(); + } + + public listProjectsForTeam(teamId: number): Promise> { + return this.httpClient.get(this.apiURL + 'teams/' + teamId + '/projects', + {observe: 'response'}).toPromise(); + } + + public listTeamsForProject(projectId: number): Promise> { + return this.httpClient.get(this.apiURL + 'projects/' + projectId + '/teams', + {observe: 'response'}).toPromise(); + } + + public listTeamsForUser(userId: number): Promise> { + return this.httpClient.get(this.apiURL + 'users/' + userId + '/teams', + {observe: 'response'}).toPromise(); + } + + public removeTeamFromProject(projectId: number, teamId: number): Promise> { + return this.httpClient.delete(this.apiURL + 'projects/' + projectId + '/teams/' + teamId, + {observe: 'response'}).toPromise(); + } + + public removeTeam(id: number) { + return this.httpClient.delete(this.apiURL + 'teams/' + id, + {observe: 'response'}).toPromise(); + } +} diff --git a/coderadar-ui/src/app/service/user.service.ts b/coderadar-ui/src/app/service/user.service.ts index 74dd3f63a..236f0397c 100644 --- a/coderadar-ui/src/app/service/user.service.ts +++ b/coderadar-ui/src/app/service/user.service.ts @@ -1,7 +1,8 @@ import {Injectable} from '@angular/core'; -import {HttpClient} from '@angular/common/http'; +import {HttpClient, HttpResponse} from '@angular/common/http'; import {Router} from '@angular/router'; import {AppComponent} from '../app.component'; +import {User} from '../model/user'; @Injectable({ @@ -67,7 +68,6 @@ export class UserService { }); } - /** * Sends a POST request to /user/refresh with the current access and refresh tokens. * Upon receiving a successful response from the server, the new access token is saved in the localStorage. @@ -112,4 +112,14 @@ export class UserService { return this.httpClient.post(this.apiURL + 'user/password/change', {refreshToken: UserService.getLoggedInUser().refreshToken, newPassword: password}, {observe: 'response'}).toPromise(); } + + public listUsersForProject(projectId: number): Promise> { + return this.httpClient.get(this.apiURL + 'projects/' + projectId + '/users', + {observe: 'response'}).toPromise(); + } + + public listUsers(): Promise> { + return this.httpClient.get(this.apiURL + 'users', + {observe: 'response'}).toPromise(); + } } diff --git a/coderadar-ui/src/app/view/add-project/add-project.component.html b/coderadar-ui/src/app/view/add-project/add-project.component.html index 9196d8619..0ef33b563 100644 --- a/coderadar-ui/src/app/view/add-project/add-project.component.html +++ b/coderadar-ui/src/app/view/add-project/add-project.component.html @@ -43,7 +43,7 @@ The VCS URL is invalid! -
      +
      diff --git a/coderadar-ui/src/app/view/add-team/add-team.component.css b/coderadar-ui/src/app/view/add-team/add-team.component.css new file mode 100644 index 000000000..f90c2c684 --- /dev/null +++ b/coderadar-ui/src/app/view/add-team/add-team.component.css @@ -0,0 +1,8 @@ +.sidenav { + top: 0; + bottom: 0; + left: 0; + right: 0; + background: ghostwhite; + min-height: calc(100vh - 220px); +} diff --git a/coderadar-ui/src/app/view/add-team/add-team.component.html b/coderadar-ui/src/app/view/add-team/add-team.component.html new file mode 100644 index 000000000..82180f5c8 --- /dev/null +++ b/coderadar-ui/src/app/view/add-team/add-team.component.html @@ -0,0 +1,50 @@ + + + + + +
      +
      +
      +
      +
      + + + + + + Add team + + + + + + + + + + Select users + + {{user.username}} + + + + The team name must not be empty! + The team must have at least one user! + A team with this name already exists! + +
      + + +
      + +
      +
      +
      +
      +
      +
      +
      +
      + diff --git a/coderadar-ui/src/app/view/add-team/add-team.component.ts b/coderadar-ui/src/app/view/add-team/add-team.component.ts new file mode 100644 index 000000000..ca20e56ac --- /dev/null +++ b/coderadar-ui/src/app/view/add-team/add-team.component.ts @@ -0,0 +1,57 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; +import {Team} from '../../model/team'; +import {User} from '../../model/user'; +import {UserService} from '../../service/user.service'; +import {TeamService} from '../../service/team.service'; +import {CONFLICT, FORBIDDEN, NOT_FOUND} from 'http-status-codes'; +import {Router} from '@angular/router'; + +@Component({ + selector: 'app-add-team', + templateUrl: './add-team.component.html', + styleUrls: ['./add-team.component.css'] +}) +export class AddTeamComponent implements OnInit { + + usersFormControl = new FormControl(); + team: Team = new Team(); + users: User[] = []; + nameEmpty = false; + teamNameTaken = false; + noUsers: boolean; + + constructor(private userService: UserService, private teamService: TeamService, private router: Router) { } + + ngOnInit() { + this.getAllUsers(); + } + + private getAllUsers() { + this.userService.listUsers().then(value => { + this.users = value.body; + }).catch(error => { + if (error.status && error.status === FORBIDDEN) { + this.userService.refresh(() => this.getAllUsers()); + } else if (error.status && error.status === NOT_FOUND) { + this.router.navigate(['/dashboard']); + } + }); + } + + submitForm() { + this.nameEmpty = this.team.name === undefined || this.team.name.length === 0; + this.noUsers = this.usersFormControl.value.length === 0; + if (!this.nameEmpty && !this.noUsers) { + this.teamService.createTeam(this.team.name, this.usersFormControl.value).then(() => + this.router.navigate(['/teams'] + )).catch(error => { + if (error.status && error.status === FORBIDDEN) { + this.userService.refresh(() => this.getAllUsers()); + } else if (error.status && error.status === CONFLICT) { + this.teamNameTaken = true; + } + }); + } + } +} diff --git a/coderadar-ui/src/app/view/configure-project/configure-project.component.ts b/coderadar-ui/src/app/view/configure-project/configure-project.component.ts index 02f1953dd..bff40f8b3 100644 --- a/coderadar-ui/src/app/view/configure-project/configure-project.component.ts +++ b/coderadar-ui/src/app/view/configure-project/configure-project.component.ts @@ -11,12 +11,7 @@ import {MatDialog, MatSnackBar} from '@angular/material'; import {Contributor} from '../../model/contributor'; import {Branch} from '../../model/branch'; import {ContributorService} from '../../service/contributor.service'; -import {ContributorMergeDialogComponent} from '../../components/contributor-merge-dialog/merge-dialog.component'; - -export interface DialogData { - selected: string; - displayNames: string[]; -} +import {ContributorMergeDialogComponent} from '../../components/contributor-merge-dialog/contributor-merge-dialog.component'; @Component({ selector: 'app-configure-project', @@ -25,10 +20,9 @@ export interface DialogData { }) export class ConfigureProjectComponent implements OnInit { - projectName: string; analyzers: AnalyzerConfiguration[] = []; - filePatterns: FilePattern[] = [] + filePatterns: FilePattern[] = []; contributors: Contributor[] = []; branches: Branch[] = []; selectedContributors: Contributor[] = []; @@ -44,7 +38,8 @@ export class ConfigureProjectComponent implements OnInit { moduleExists = false; constructor(private snackBar: MatSnackBar, private router: Router, private userService: UserService, private titleService: Title, - private projectService: ProjectService, private contributorService: ContributorService, private route: ActivatedRoute, public dialog: MatDialog) { + private projectService: ProjectService, private contributorService: ContributorService, + private route: ActivatedRoute, public dialog: MatDialog) { this.projectName = ''; this.filePatternIncludeInput = ''; this.filePatternExcludeInput = ''; @@ -215,7 +210,7 @@ export class ConfigureProjectComponent implements OnInit { * Sends the refresh token if access is denied and repeats the request. * @param module The module to delete from the project */ - private deleteModule(module: Module): void { + deleteModule(module: Module): void { this.processing = true; this.projectService.deleteProjectModule(this.projectId, module) .then(() => { @@ -246,7 +241,7 @@ export class ConfigureProjectComponent implements OnInit { * * @param analyzerConfiguration The configuration to add to the project. */ - private submitAnalyzerConfiguration(analyzerConfiguration: AnalyzerConfiguration): void { + submitAnalyzerConfiguration(analyzerConfiguration: AnalyzerConfiguration): void { if (analyzerConfiguration.id !== undefined) { this.projectService.editAnalyzerConfigurationForProject(this.projectId, analyzerConfiguration) .catch(error => { @@ -277,7 +272,7 @@ export class ConfigureProjectComponent implements OnInit { * Sends the refresh token if access is denied and repeats the request. * @param pattern The pattern to delete from the project */ - private deleteFilePattern(pattern: FilePattern): void { + deleteFilePattern(pattern: FilePattern): void { this.processing = true; this.projectService.deleteProjectFilePattern(this.projectId, pattern) .then(() => { @@ -336,7 +331,6 @@ export class ConfigureProjectComponent implements OnInit { }); } - openDialog(): void { const dialogRef = this.dialog.open(ContributorMergeDialogComponent, { width: '250px', @@ -353,7 +347,7 @@ export class ConfigureProjectComponent implements OnInit { } mergeContributors(displayName: string): void { - this.contributorService.mergeContributors(this.selectedContributors, displayName).then(value => { + this.contributorService.mergeContributors(this.selectedContributors, displayName).then(() => { this.selectedContributors = []; this.contributors = []; this.getProjectContributors(); diff --git a/coderadar-ui/src/app/view/edit-project/edit-project.component.ts b/coderadar-ui/src/app/view/edit-project/edit-project.component.ts index cc02ce4dd..1578bb60b 100644 --- a/coderadar-ui/src/app/view/edit-project/edit-project.component.ts +++ b/coderadar-ui/src/app/view/edit-project/edit-project.component.ts @@ -109,7 +109,7 @@ export class EditProjectComponent implements OnInit { private validateInput(): boolean { this.incorrectURL = this.project.vcsUrl.trim().length === 0; this.nameEmpty = this.project.name.trim().length === 0; - + if (this.project.startDate === 'first commit') { this.project.startDate = null; } diff --git a/coderadar-ui/src/app/view/file-view/file-view.component.css b/coderadar-ui/src/app/view/file-view/file-view.component.css index 6e30543fa..50b6d81f6 100644 --- a/coderadar-ui/src/app/view/file-view/file-view.component.css +++ b/coderadar-ui/src/app/view/file-view/file-view.component.css @@ -33,3 +33,24 @@ float: right; margin-right: 20px } + +.fileTree { + overflow: scroll; + height: 100% +} + +.fileDeleted { + width: 50%; + font-size: larger; + margin-top: 5%; + margin-left: 30% +} + +.bgColor { + background-color: rgb(245, 242, 240); +} + +.fileNodeButton { + font-weight:normal; + margin-left: 0; +} diff --git a/coderadar-ui/src/app/view/file-view/file-view.component.html b/coderadar-ui/src/app/view/file-view/file-view.component.html index 00ebd7ace..e4520d23b 100644 --- a/coderadar-ui/src/app/view/file-view/file-view.component.html +++ b/coderadar-ui/src/app/view/file-view/file-view.component.html @@ -2,7 +2,7 @@ {location: '/project/' + projectId, name: project.name}, {location: '/project/'+projectId+'/'+commitHash+'/files', name: 'File tree for commit ' + commitHashAbbrev}]"> -
      +
      Show only files changed in this commit @@ -14,7 +14,7 @@ {{currentSelectedFilepath}}
      -

      +

      Authored by:

      @@ -26,35 +26,42 @@

      -
      +
      -
    • - -
    • +
        +
      • + +
      • +
      -
    • -
      - -
      -
        - -
      -
    • +
        +
      • +
        + +
        +
          + +
        +
      • +
      +
      + File was deleted +
       
           
      diff --git a/coderadar-ui/src/app/view/file-view/file-view.component.ts b/coderadar-ui/src/app/view/file-view/file-view.component.ts index 79ad359d2..243e80f48 100644 --- a/coderadar-ui/src/app/view/file-view/file-view.component.ts +++ b/coderadar-ui/src/app/view/file-view/file-view.component.ts @@ -27,8 +27,8 @@ import {AppComponent} from '../../app.component'; import {Title} from '@angular/platform-browser'; import {ContributorService} from '../../service/contributor.service'; import {Contributor} from '../../model/contributor'; -import {HttpResponse} from "@angular/common/http"; -import {FileContentWithMetrics} from "../../model/file-content-with-metrics"; +import {HttpResponse} from '@angular/common/http'; +import {FileContentWithMetrics} from '../../model/file-content-with-metrics'; @Component({ selector: 'app-file-view', @@ -80,7 +80,7 @@ export class FileViewComponent implements OnInit, AfterViewChecked { hasChild = (_: number, node: FileTreeNode) => node.children !== null; public getFileTree() { - if(!this.showOnlyChangedFiles){ + if (!this.showOnlyChangedFiles) { this.showDiff = false; this.updateSelectedFile(null, this.currentSelectedFilepath); } @@ -107,23 +107,23 @@ export class FileViewComponent implements OnInit, AfterViewChecked { public updateSelectedFile(node: any, path: string): void { this.highlighted = false; this.currentFileContent = ''; - if(node === null && path === null){ + if (node === null && path === null) { return; } - if(path === null) { + if (path === null) { this.currentSelectedFilepath = this.getFullPath(this.tree.children, node, ''); this.currentSelectedFilepath = this.currentSelectedFilepath.substr(1, this.currentSelectedFilepath.length); } else { this.currentSelectedFilepath = path; } - if(this.currentSelectedFilepath === ''){ + if (this.currentSelectedFilepath === '') { return; } let promise: Promise> ; - if(this.showDiff){ - promise = this.projectService.getFileDiff(this.projectId, this.commitHash, this.currentSelectedFilepath) + if (this.showDiff) { + promise = this.projectService.getFileDiff(this.projectId, this.commitHash, this.currentSelectedFilepath); } else { - promise = this.projectService.getFileContentWithMetrics(this.projectId, this.commitHash, this.currentSelectedFilepath) + promise = this.projectService.getFileContentWithMetrics(this.projectId, this.commitHash, this.currentSelectedFilepath); } promise.then(value => { this.currentFileContent = value.body.content; @@ -153,7 +153,7 @@ export class FileViewComponent implements OnInit, AfterViewChecked { @HostListener('window:resize', ['$event']) onResize(event) { - if(this.showDiff){ + if (this.showDiff) { this.fileView.nativeElement.children.item(0).lastChild.remove(); } else { this.fileView.nativeElement.children.item(1).remove(); @@ -212,7 +212,7 @@ export class FileViewComponent implements OnInit, AfterViewChecked { const lineStart = +range.value.split('-')[0]; let findings = ''; this.currentFileMetrics.forEach(value => { - let found = false; + const found = false; for (const finding of value.findings) { if (finding.lineStart === lineStart) { findings += finding.message + '\n'; @@ -226,11 +226,11 @@ export class FileViewComponent implements OnInit, AfterViewChecked { getCodeClass() { const temp = this.currentSelectedFilepath.split('.'); const fileExtension = temp[temp.length - 1]; - if(this.showDiff) { + if (this.showDiff) { if (fileExtension === 'gradle') { return 'language-diff-groovy diff-highlight'; } - return 'language-diff-'+ fileExtension + ' diff-highlight'; + return 'language-diff-' + fileExtension + ' diff-highlight'; } else { if (fileExtension === 'gradle') { return 'line-numbers language-groovy'; @@ -240,7 +240,7 @@ export class FileViewComponent implements OnInit, AfterViewChecked { } getAllFindings(metrics: MetricWithFindings[]) { - if(metrics === null){ + if (metrics === null) { return '0'; } let result = ''; @@ -267,7 +267,7 @@ export class FileViewComponent implements OnInit, AfterViewChecked { } getPreClass() { - if(!this.showDiff){ + if (!this.showDiff) { return 'line-numbers file-content'; } else { return 'file-content'; diff --git a/coderadar-ui/src/app/view/login/login.component.html b/coderadar-ui/src/app/view/login/login.component.html index fd7739eed..31deaced2 100644 --- a/coderadar-ui/src/app/view/login/login.component.html +++ b/coderadar-ui/src/app/view/login/login.component.html @@ -25,7 +25,7 @@ -
      +
      diff --git a/coderadar-ui/src/app/view/login/login.component.ts b/coderadar-ui/src/app/view/login/login.component.ts index ac20356ce..cb982a8dd 100644 --- a/coderadar-ui/src/app/view/login/login.component.ts +++ b/coderadar-ui/src/app/view/login/login.component.ts @@ -1,7 +1,7 @@ import {Component} from '@angular/core'; import {Router} from '@angular/router'; import {UserService} from '../../service/user.service'; -import {FORBIDDEN, INTERNAL_SERVER_ERROR, NOT_FOUND} from 'http-status-codes'; +import {FORBIDDEN, NOT_FOUND} from 'http-status-codes'; import {Title} from '@angular/platform-browser'; @Component({ diff --git a/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.html b/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.html index 7ba42ee12..4a9403889 100644 --- a/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.html +++ b/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.html @@ -2,56 +2,74 @@
      + + + + + +
      +
      -
      -
      + +
      + Hello there, it looks like you haven't added any projects yet.
      + Click on the plus button to add one. +
      +
      + No projects available in the selected team +
      - -
      - Hello there, it looks like you haven't added any projects yet.
      - Click on the plus button to add one. -
      - - - - - - - - {{appComponent.trimProjectName(project.name)}} - - - - - - - - - - - - -
      Project URL: {{project.vcsUrl}}
      -
      Project start date:   {{project.startDate}}
      -
      -
      -
      + + Team + + All + + {{team.name}} + + + - - - + - + + + + + + {{appComponent.trimProjectName(project.name)}} + + + + + + + + + + + + + +
      Project URL: {{project.vcsUrl}}
      +
      Project start date:   {{project.startDate}}
      +
      +
      +
      -
      -
      -
      + + + + + + +
      +
      +
      +
      diff --git a/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.scss b/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.scss index 93f8982b8..4e59a6305 100644 --- a/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.scss +++ b/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.scss @@ -33,8 +33,7 @@ .card-list mat-grid-list { width: 70%; - float: right; - margin-right: 10%; + float: left; } .card-list mat-card-header a { @@ -45,8 +44,9 @@ padding-left: 30px; } -.card-list #noProjectsMessage { +.card-list .noProjectsMessage { font-size: x-large; + text-align: center; } .card-list mat-card-content > div { @@ -58,3 +58,12 @@ margin-right: 100px; margin-top: 2px; } + +.sidenav { + top: 0; + bottom: 0; + left: 0; + right: 0; + background: ghostwhite; + min-height: calc(100vh - 220px); +} diff --git a/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.spec.ts b/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.spec.ts index 629a7cc66..b3b6ab852 100644 --- a/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.spec.ts +++ b/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.spec.ts @@ -1,7 +1,7 @@ import {LayoutModule} from '@angular/cdk/layout'; import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {async, ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatButtonModule, MatCardModule, MatGridListModule, MatIconModule, MatMenuModule,} from '@angular/material'; +import {MatButtonModule, MatCardModule, MatGridListModule, MatIconModule, MatMenuModule} from '@angular/material'; import {MainDashboardComponent} from './main-dashboard.component'; diff --git a/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.ts b/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.ts index 8c05c6c7f..6510c2480 100644 --- a/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.ts +++ b/coderadar-ui/src/app/view/main-dashboard/main-dashboard.component.ts @@ -8,7 +8,11 @@ import {Title} from '@angular/platform-browser'; import {AppComponent} from '../../app.component'; import {MatDialog, MatSnackBar} from '@angular/material'; import {MatDialogRef} from '@angular/material/dialog'; +import {Team} from '../../model/team'; +import {TeamService} from '../../service/team.service'; +import {HttpResponse} from '@angular/common/http'; import {DeleteProjectDialogComponent} from '../../components/delete-project-dialog/delete-project-dialog.component'; +import {AddProjectToTeamDialogComponent} from '../../components/add-project-to-team-dialog/add-project-to-team-dialog.component'; @Component({ selector: 'app-main-dashboard', @@ -18,18 +22,22 @@ import {DeleteProjectDialogComponent} from '../../components/delete-project-dial export class MainDashboardComponent implements OnInit { projects: Project[] = []; - + teams: Team[] = []; + teamDialogRef: MatDialogRef; dialogRef: MatDialogRef; appComponent = AppComponent; waiting = false; + selectedTeam: Team; constructor(private snackBar: MatSnackBar, private titleService: Title, private userService: UserService, - private router: Router, private projectService: ProjectService, private dialog: MatDialog) { + private router: Router, private projectService: ProjectService, private dialog: MatDialog, + private teamService: TeamService) { titleService.setTitle('Coderadar - Dashboard'); } ngOnInit(): void { this.getProjects(); + this.getTeams(); } /** @@ -68,18 +76,41 @@ export class MainDashboardComponent implements OnInit { }); } + openAddToTeamDialog(project: Project): void { + const dialogRef = this.dialog.open(AddProjectToTeamDialogComponent, { + width: '300px', + data: {teams: this.teams, project} + }); + + dialogRef.afterClosed().subscribe(result => { + if (result !== undefined) { + for (const team of result.teams) { + this.teamService.addTeamToProject(project.id, team.id, result.role); + } + } + }); + } + /** * Gets all projects from the project service and constructs a new array of Project objects * from the returned JSON. Sends a refresh token if access is denied. */ - private getProjects(): void { + getProjects(): void { this.waiting = true; - this.projectService.getProjects() - .then(response => {response.body.forEach(project => { + let promise: Promise>; + if (this.selectedTeam === undefined) { + promise = this.projectService.listProjectsForUser(UserService.getLoggedInUser().userId); + } else { + promise = this.teamService.listProjectsForTeam(this.selectedTeam.id); + } + promise + .then(response => { + this.projects = []; + response.body.forEach(project => { const newProject = new Project(project); this.projects.push(newProject); }); - this.waiting = false; + this.waiting = false; } ) .catch(e => { @@ -89,6 +120,16 @@ export class MainDashboardComponent implements OnInit { }); } + private getTeams() { + this.teamService.listTeamsForUser(UserService.getLoggedInUser().userId).then(value => + this.teams = value.body + ) .catch(e => { + if (e.status && e.status === FORBIDDEN) { + this.userService.refresh(() => this.getTeams()); + } + }); + } + startAnalysis(id: number) { this.projectService.startAnalyzingJob(id).then(() => { this.openSnackBar('Analysis started!', '🞩'); diff --git a/coderadar-ui/src/app/view/project-dashboard/branch-view/branch-view.component.ts b/coderadar-ui/src/app/view/project-dashboard/branch-view/branch-view.component.ts index 204c8ee30..6adb97d18 100644 --- a/coderadar-ui/src/app/view/project-dashboard/branch-view/branch-view.component.ts +++ b/coderadar-ui/src/app/view/project-dashboard/branch-view/branch-view.component.ts @@ -20,10 +20,10 @@ import * as _ from 'lodash'; styleUrls: ['./branch-view.component.scss'] }) export class BranchViewComponent implements OnInit, OnChanges { - private renderedCommits: any; constructor(private cityEffects: AppEffects, private store: Store, private router: Router) { } + private renderedCommits: any; @ViewChild('graph', {read: ElementRef})graph: ElementRef; @@ -44,6 +44,43 @@ export class BranchViewComponent implements OnInit, OnChanges { private selectedCommitColor = '#f60'; + private static setCommitColor(hash: string, selectedCommitColor: string) { + const element = document.getElementById(hash); + + // Color the commit dot + element.setAttribute('fill', selectedCommitColor); + + const parent = element.parentElement.parentElement.parentElement; + + // Color the text + parent.children.item(1) + .children.item(0).children.item(0).setAttribute('fill', selectedCommitColor); + + // See if there is a branch (and tag) + if (parent.children.item(1).children.item(1) !== null) { + const elementToColor = parent.children.item(1) + .children.item(1).children.item(0); + + elementToColor.children.item(0).setAttribute('stroke', selectedCommitColor); + + // If there is a tag, color it + if (elementToColor.children.item(0).tagName === 'path') { + elementToColor.children.item(0).setAttribute('fill', selectedCommitColor); + } else { + elementToColor.children.item(1).setAttribute('fill', selectedCommitColor); + } + } + + // Check if there is only a tag + if (parent.children.item(1).children.item(2) !== null) { + const elementToColor = parent.children.item(1) + .children.item(2).children.item(0).children.item(0); + elementToColor.setAttribute('stroke', selectedCommitColor); + elementToColor.setAttribute('fill', selectedCommitColor); + } + + } + ngOnInit() { this.initTree(); this.showCommitsInRange(); @@ -66,51 +103,15 @@ export class BranchViewComponent implements OnInit, OnChanges { this.prevSelectedCommit2 = selectedCommit; BranchViewComponent.setCommitColor(commitElement.hash, commitElement.style.color); } else { - if(this.selectedCommit2 !== null) { - BranchViewComponent.setCommitColor(this.selectedCommit2.hash, this.renderedCommits.find(c => c.hash === this.selectedCommit2.hash).style.color); + if (this.selectedCommit2 !== null) { + BranchViewComponent.setCommitColor(this.selectedCommit2.hash, + this.renderedCommits.find(c => c.hash === this.selectedCommit2.hash).style.color); } this.selectedCommit2 = selectedCommit; BranchViewComponent.setCommitColor(commitElement.hash, this.selectedCommitColor); } } - private static setCommitColor(hash: string, selectedCommitColor: string) { - let element = document.getElementById(hash); - - //Color the commit dot - element.setAttribute("fill", selectedCommitColor); - - let parent = element.parentElement.parentElement.parentElement; - - //Color the text - parent.children.item(1) - .children.item(0).children.item(0).setAttribute("fill", selectedCommitColor); - - //See if there is a branch (and tag) - if(parent.children.item(1).children.item(1) !== null) { - let elementToColor = parent.children.item(1) - .children.item(1).children.item(0); - - elementToColor.children.item(0).setAttribute("stroke", selectedCommitColor); - - //If there is a tag, color it - if(elementToColor.children.item(0).tagName === "path") { - elementToColor.children.item(0).setAttribute("fill", selectedCommitColor); - } else { - elementToColor.children.item(1).setAttribute("fill", selectedCommitColor); - } - } - - //Check if there is only a tag - if(parent.children.item(1).children.item(2) !== null) { - let elementToColor = parent.children.item(1) - .children.item(2).children.item(0).children.item(0); - elementToColor.setAttribute("stroke", selectedCommitColor); - elementToColor.setAttribute("fill", selectedCommitColor); - } - - } - showCommitsInRange() { this.selectedCommit1 = null; this.selectedCommit2 = null; diff --git a/coderadar-ui/src/app/view/project-dashboard/list-view/list-view.component.ts b/coderadar-ui/src/app/view/project-dashboard/list-view/list-view.component.ts index d298ee6f0..15d4282d7 100644 --- a/coderadar-ui/src/app/view/project-dashboard/list-view/list-view.component.ts +++ b/coderadar-ui/src/app/view/project-dashboard/list-view/list-view.component.ts @@ -16,7 +16,7 @@ import {ProjectService} from '../../../service/project.service'; import {Store} from '@ngrx/store'; import {Branch} from '../../../model/branch'; import {loadAvailableMetrics} from '../../../city-map/visualization/visualization.actions'; -import {Contributor} from "../../../model/contributor"; +import {Contributor} from '../../../model/contributor'; @Component({ selector: 'app-commit-list', @@ -235,7 +235,7 @@ export class ListViewComponent implements OnInit, OnChanges { } showCommitsInRange() { - if(this.commits.length > 0) { + if (this.commits.length > 0) { let endDate: Date; if (this.endDate === null || this.endDate.length === 0) { endDate = new Date(this.commits[0].timestamp); diff --git a/coderadar-ui/src/app/view/project-dashboard/project-dashboard.component.ts b/coderadar-ui/src/app/view/project-dashboard/project-dashboard.component.ts index e71873309..8587673a4 100644 --- a/coderadar-ui/src/app/view/project-dashboard/project-dashboard.component.ts +++ b/coderadar-ui/src/app/view/project-dashboard/project-dashboard.component.ts @@ -14,8 +14,8 @@ import * as fromRoot from '../../city-map/shared/reducers'; import {Store} from '@ngrx/store'; import {loadAvailableMetrics} from '../../city-map/visualization/visualization.actions'; import {CommitLog} from '../../model/commit-log'; -import {Contributor} from "../../model/contributor"; -import {ContributorService} from "../../service/contributor.service"; +import {Contributor} from '../../model/contributor'; +import {ContributorService} from '../../service/contributor.service'; @Component({ selector: 'app-project-dashboard', @@ -164,11 +164,11 @@ export class ProjectDashboardComponent implements OnInit, OnDestroy { if (error.status && error.status === FORBIDDEN) { this.userService.refresh(() => this.getContributors()); } - }) + }); } handleContributorChange($event: any) { - if($event == undefined) { + if ($event === undefined) { this.selectedContributor = new Contributor(); this.selectedContributor.emailAddresses = ['']; } else { diff --git a/coderadar-ui/src/app/view/register/register.component.html b/coderadar-ui/src/app/view/register/register.component.html index 8e90457d8..3a3391327 100644 --- a/coderadar-ui/src/app/view/register/register.component.html +++ b/coderadar-ui/src/app/view/register/register.component.html @@ -31,7 +31,7 @@ Passwords do not match! -
      +
      diff --git a/coderadar-ui/src/app/view/sidenav-content/sidenav-content.component.html b/coderadar-ui/src/app/view/sidenav-content/sidenav-content.component.html new file mode 100644 index 000000000..af6b9ea8a --- /dev/null +++ b/coderadar-ui/src/app/view/sidenav-content/sidenav-content.component.html @@ -0,0 +1,4 @@ + + Dashboard + Teams + diff --git a/coderadar-ui/src/app/view/sidenav-content/sidenav-content.component.spec.ts b/coderadar-ui/src/app/view/sidenav-content/sidenav-content.component.spec.ts new file mode 100644 index 000000000..c33ec6991 --- /dev/null +++ b/coderadar-ui/src/app/view/sidenav-content/sidenav-content.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SidenavContentComponent } from './sidenav-content.component'; + +describe('SidenavContentComponent', () => { + let component: SidenavContentComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SidenavContentComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SidenavContentComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/coderadar-ui/src/app/view/sidenav-content/sidenav-content.component.ts b/coderadar-ui/src/app/view/sidenav-content/sidenav-content.component.ts new file mode 100644 index 000000000..240f33ecd --- /dev/null +++ b/coderadar-ui/src/app/view/sidenav-content/sidenav-content.component.ts @@ -0,0 +1,14 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-sidenav-content', + templateUrl: './sidenav-content.component.html' +}) +export class SidenavContentComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/coderadar-ui/src/app/view/teams-dashboard/teams-dashboard.component.css b/coderadar-ui/src/app/view/teams-dashboard/teams-dashboard.component.css new file mode 100644 index 000000000..d33b79c20 --- /dev/null +++ b/coderadar-ui/src/app/view/teams-dashboard/teams-dashboard.component.css @@ -0,0 +1,68 @@ +.grid-container { + margin: 20px; +} + +.dashboard-card { + position: absolute; + top: 15px; + left: 15px; + right: 15px; + bottom: 15px; +} + +.more-button { + position: absolute; + top: 5px; + right: 10px; +} + +.add-button { + right: 7%; + bottom: 8%; + width: 80px; + height: 80px; + font-size: large; + position: fixed; +} + +.add-icon { + margin-top: 8px; + color: #ffffff; +} + +.card-list mat-grid-list { + width: 70%; + float: left; +} + +.card-list mat-card-header a { + font-size: 18pt; +} + +.card-list mat-card-content { + padding-left: 30px; +} + +.card-list #noTeamsMessage { + font-size: x-large; + text-align: center; +} + +.card-list mat-card-content> div { + padding-bottom: 10px; +} + +.card-list mat-error { + float: right; + margin-right: 100px; + margin-top: 2px; +} + +.sidenav { + top: 0; + bottom: 0; + left: 0; + right: 0; + background: ghostwhite; + min-height: calc(100vh - 220px); +} diff --git a/coderadar-ui/src/app/view/teams-dashboard/teams-dashboard.component.html b/coderadar-ui/src/app/view/teams-dashboard/teams-dashboard.component.html new file mode 100644 index 000000000..ec2eb590e --- /dev/null +++ b/coderadar-ui/src/app/view/teams-dashboard/teams-dashboard.component.html @@ -0,0 +1,54 @@ + +
      + +
      + + + + + +
      +
      + + +
      + You aren't in any team yet.
      + Click on the plus button to create a team. +
      + + + + + + + + {{team.name}} + + + + + + + + + Team members: + + {{member.username}} + + + + + + + + + + + + +
      +
      +
      +
      + diff --git a/coderadar-ui/src/app/view/teams-dashboard/teams-dashboard.component.ts b/coderadar-ui/src/app/view/teams-dashboard/teams-dashboard.component.ts new file mode 100644 index 000000000..fe0440a91 --- /dev/null +++ b/coderadar-ui/src/app/view/teams-dashboard/teams-dashboard.component.ts @@ -0,0 +1,44 @@ +import { Component, OnInit } from '@angular/core'; +import {Team} from '../../model/team'; +import {TeamService} from '../../service/team.service'; +import {UserService} from '../../service/user.service'; +import {FORBIDDEN} from 'http-status-codes'; + +@Component({ + selector: 'app-teams-dashboard', + templateUrl: './teams-dashboard.component.html', + styleUrls: ['./teams-dashboard.component.css'] +}) +export class TeamsDashboardComponent implements OnInit { + waiting = false; + + teams: Team[] = []; + + constructor(private teamService: TeamService, private userService: UserService) { } + + ngOnInit() { + this.getTeams(); + } + + private getTeams() { + this.teamService.listTeamsForUser(UserService.getLoggedInUser().userId).then(value => + this.teams = value.body + ) .catch(e => { + if (e.status && e.status === FORBIDDEN) { // TODO: UNAUTHORIZED + this.userService.refresh(() => this.getTeams()); + } + }); + } + + removeTeam(id: number) { + this.teamService.removeTeam(id) + .then(() => { + this.teams = this.teams.filter(value => value.id !== id); + }) + .catch(e => { + if (e.status && e.status === FORBIDDEN) { // TODO: UNAUTHORIZED + this.userService.refresh(() => this.getTeams()); + } + }); + } +} diff --git a/coderadar-ui/src/app/view/view-commit/view-commit.component.html b/coderadar-ui/src/app/view/view-commit/view-commit.component.html index f5f7558a3..d57faa861 100644 --- a/coderadar-ui/src/app/view/view-commit/view-commit.component.html +++ b/coderadar-ui/src/app/view/view-commit/view-commit.component.html @@ -11,16 +11,16 @@ - {{commit.hash}} + {{commit.hash}}

      - Metrics: + Metrics:

      Not yet analyzed or no metrics are available
      {{metric.metricName.split('.').pop() + ' : '}} - {{metric.value}} + {{metric.value}}
      diff --git a/coderadar-ui/src/styles.scss b/coderadar-ui/src/styles.scss index 1c53ca496..70db55aa5 100644 --- a/coderadar-ui/src/styles.scss +++ b/coderadar-ui/src/styles.scss @@ -46,6 +46,12 @@ Styles for most forms in the app font-size: 20pt; } +.mat-card-form #cardButtons { + display: flex; + align-items: center; + justify-content: center; +} + .mat-card-form #cardButtons button { width: 25%; margin: 10px; @@ -82,16 +88,23 @@ Styles for the login and register forms font-size: 30pt; } -.login-card-form #cardButtons button { - margin: 10px; -} - .login-card-form mat-card { position: fixed; top: 20%; min-width: 22%; } +.login-card-form #cardButtons { + display: flex; + align-items: center; + justify-content: center; +} + +.login-card-form #cardButtons button { + margin: 10px; +} + + .login-card-form form { min-width: 22%; } diff --git a/coderadar-vcs/build.gradle b/coderadar-vcs/build.gradle index 223275dcc..873356d0a 100644 --- a/coderadar-vcs/build.gradle +++ b/coderadar-vcs/build.gradle @@ -1,4 +1,5 @@ apply plugin: "com.diffplug.gradle.spotless" +apply plugin: "jacoco" dependencies { compile project(':coderadar-plugin-api') diff --git a/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/ChangeTypeMapper.java b/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/ChangeTypeMapper.java index 2deba828c..4cc226396 100644 --- a/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/ChangeTypeMapper.java +++ b/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/ChangeTypeMapper.java @@ -5,6 +5,8 @@ public class ChangeTypeMapper { + private ChangeTypeMapper() {} + public static ChangeType jgitToCoderadar(DiffEntry.ChangeType changeType) { return ChangeType.valueOf(changeType.name()); } diff --git a/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/adapter/GetDiffEntriesForCommitsAdapter.java b/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/adapter/GetDiffEntriesForCommitsAdapter.java index 09ee50afc..5a8fef26e 100644 --- a/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/adapter/GetDiffEntriesForCommitsAdapter.java +++ b/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/adapter/GetDiffEntriesForCommitsAdapter.java @@ -23,8 +23,7 @@ public class GetDiffEntriesForCommitsAdapter implements GetDiffEntriesForCommits @Override public List getDiffs(String projectRoot, String commitName1, String commitName2) throws UnableToGetDiffsFromCommitsException { - try { - Git git = Git.open(new File(projectRoot)); + try (Git git = Git.open(new File(projectRoot))) { Repository repository = git.getRepository(); RevCommit commit1 = repository.parseCommit(ObjectId.fromString(commitName1)); RevCommit commit2 = repository.parseCommit(ObjectId.fromString(commitName2)); @@ -35,32 +34,30 @@ public List getDiffs(String projectRoot, String commitName1, String c commit2 = tmp; } - ObjectReader reader = git.getRepository().newObjectReader(); - CanonicalTreeParser oldTreeIter = new CanonicalTreeParser(); - ObjectId oldTree = commit1.getTree(); - oldTreeIter.reset(reader, oldTree); - CanonicalTreeParser newTreeIter = new CanonicalTreeParser(); - ObjectId newTree = commit2.getTree(); - newTreeIter.reset(reader, newTree); + + try (ObjectReader reader = git.getRepository().newObjectReader()) { + ObjectId oldTree = commit1.getTree(); + oldTreeIter.reset(reader, oldTree); + + ObjectId newTree = commit2.getTree(); + newTreeIter.reset(reader, newTree); + } DiffFormatter df = new DiffFormatter(new ByteArrayOutputStream()); df.setRepository(repository); - List entries = - df.scan(oldTreeIter, newTreeIter).stream() - .map( - diffEntry -> { - DiffEntry entry = new DiffEntry(); - entry.setNewPath(diffEntry.getNewPath()); - entry.setOldPath(diffEntry.getOldPath()); - entry.setChangeType( - ChangeTypeMapper.jgitToCoderadar(diffEntry.getChangeType()).ordinal()); - return entry; - }) - .collect(Collectors.toList()); - git.close(); - return entries; + return df.scan(oldTreeIter, newTreeIter).stream() + .map( + diffEntry -> { + DiffEntry entry = new DiffEntry(); + entry.setNewPath(diffEntry.getNewPath()); + entry.setOldPath(diffEntry.getOldPath()); + entry.setChangeType( + ChangeTypeMapper.jgitToCoderadar(diffEntry.getChangeType()).ordinal()); + return entry; + }) + .collect(Collectors.toList()); } catch (IOException e) { throw new UnableToGetDiffsFromCommitsException(e.getMessage()); } diff --git a/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/adapter/GetRawCommitContentAdapter.java b/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/adapter/GetRawCommitContentAdapter.java index a078c1dd7..bf9081d49 100644 --- a/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/adapter/GetRawCommitContentAdapter.java +++ b/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/adapter/GetRawCommitContentAdapter.java @@ -24,8 +24,7 @@ public class GetRawCommitContentAdapter implements GetRawCommitContentPort { @Override - public byte[] getCommitContent(String projectRoot, String filepath, String commitHash) - throws UnableToGetCommitContentException { + public byte[] getCommitContent(String projectRoot, String filepath, String commitHash) { if (filepath.isEmpty()) { return new byte[0]; } @@ -72,8 +71,7 @@ public List> getRenamesBetweenCommits( } @Override - public byte[] getFileDiff(String projectRoot, String filepath, String commitHash) - throws UnableToGetCommitContentException { + public byte[] getFileDiff(String projectRoot, String filepath, String commitHash) { if (filepath.isEmpty()) { return new byte[0]; } @@ -97,7 +95,13 @@ public byte[] getFileDiff(String projectRoot, String filepath, String commitHash } else { rt1 = new RawText(new byte[0]); } - RawText rt2 = new RawText(BlobUtils.getRawContent(git.getRepository(), commit, filepath)); + byte[] rawContent = BlobUtils.getRawContent(git.getRepository(), commit, filepath); + RawText rt2; + if (rawContent != null && rawContent.length != 0) { + rt2 = new RawText(BlobUtils.getRawContent(git.getRepository(), commit, filepath)); + } else { + rt2 = new RawText(new byte[] {'\n'}); + } ByteArrayOutputStream out = new ByteArrayOutputStream(); new DiffFormatter(out) .format(new HistogramDiff().diff(RawTextComparator.DEFAULT, rt1, rt2), rt1, rt2); @@ -109,8 +113,7 @@ public byte[] getFileDiff(String projectRoot, String filepath, String commitHash @Override public HashMap getCommitContentBulk( - String projectRoot, List filepaths, String commitHash) - throws UnableToGetCommitContentException { + String projectRoot, List filepaths, String commitHash) { try (Git git = Git.open(new java.io.File(projectRoot))) { ObjectId commitId = git.getRepository().resolve(commitHash); HashMap bulkContent = new LinkedHashMap<>(); @@ -127,8 +130,7 @@ public HashMap getCommitContentBulk( public HashMap getCommitContentBulkWithFiles( String projectRoot, List files, - String commitHash) - throws UnableToGetCommitContentException { + String commitHash) { try (Git git = Git.open(new java.io.File(projectRoot))) { ObjectId commitId = git.getRepository().resolve(commitHash); HashMap bulkContent = new LinkedHashMap<>(); diff --git a/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/adapter/WalkCommitTreeAdapter.java b/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/adapter/WalkCommitTreeAdapter.java index 5a9161253..3ab4a2b16 100644 --- a/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/adapter/WalkCommitTreeAdapter.java +++ b/coderadar-vcs/src/main/java/io/reflectoring/coderadar/vcs/adapter/WalkCommitTreeAdapter.java @@ -19,8 +19,7 @@ public class WalkCommitTreeAdapter implements WalkCommitTreePort { public void walkCommitTree( String projectRoot, String name, WalkTreeCommandInterface commandInterface) throws UnableToWalkCommitTreeException { - try { - Git git = Git.open(new File(projectRoot)); + try (Git git = Git.open(new File(projectRoot))) { ObjectId commitId = git.getRepository().resolve(name); RevWalk walk = new RevWalk(git.getRepository()); @@ -41,7 +40,6 @@ public void walkCommitTree( } commandInterface.walkMethod(treeWalk.getPathString()); } - git.close(); } catch (IOException e) { throw new UnableToWalkCommitTreeException(e.getMessage()); } diff --git a/coderadar-vcs/src/test/java/io/reflectoring/coderadar/adapter/CloneRepositoryAdapterTest.java b/coderadar-vcs/src/test/java/io/reflectoring/coderadar/adapter/CloneRepositoryAdapterTest.java index aa50f2fef..89e5f97a7 100644 --- a/coderadar-vcs/src/test/java/io/reflectoring/coderadar/adapter/CloneRepositoryAdapterTest.java +++ b/coderadar-vcs/src/test/java/io/reflectoring/coderadar/adapter/CloneRepositoryAdapterTest.java @@ -13,12 +13,12 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -public class CloneRepositoryAdapterTest { +class CloneRepositoryAdapterTest { @TempDir public File folder; @Test - public void test() throws UnableToCloneRepositoryException { + void test() throws UnableToCloneRepositoryException { URL testRepoURL = this.getClass().getClassLoader().getResource("test-repository"); CloneRepositoryAdapter cloneRepositoryAdapter = new CloneRepositoryAdapter(); diff --git a/coderadar-vcs/src/test/java/io/reflectoring/coderadar/adapter/ComputeContributorAdapterTest.java b/coderadar-vcs/src/test/java/io/reflectoring/coderadar/adapter/ComputeContributorAdapterTest.java index 67006446b..6e6c900c6 100644 --- a/coderadar-vcs/src/test/java/io/reflectoring/coderadar/adapter/ComputeContributorAdapterTest.java +++ b/coderadar-vcs/src/test/java/io/reflectoring/coderadar/adapter/ComputeContributorAdapterTest.java @@ -18,7 +18,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -public class ComputeContributorAdapterTest { +class ComputeContributorAdapterTest { private URL testRepoURL = this.getClass().getClassLoader().getResource("test-repository"); @TempDir public File folder; @@ -29,7 +29,7 @@ public void setup() throws GitAPIException { } @Test - public void test() { + void test() { ComputeContributorAdapter computeContributorAdapter = new ComputeContributorAdapter(); List contributors = diff --git a/coderadar-vcs/src/test/java/io/reflectoring/coderadar/adapter/DeleteRepositoryAdapterTest.java b/coderadar-vcs/src/test/java/io/reflectoring/coderadar/adapter/DeleteRepositoryAdapterTest.java index f174197be..13bb2eea4 100644 --- a/coderadar-vcs/src/test/java/io/reflectoring/coderadar/adapter/DeleteRepositoryAdapterTest.java +++ b/coderadar-vcs/src/test/java/io/reflectoring/coderadar/adapter/DeleteRepositoryAdapterTest.java @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -public class DeleteRepositoryAdapterTest { +class DeleteRepositoryAdapterTest { @TempDir public File folder; @@ -24,7 +24,7 @@ public void setUp() throws GitAPIException { } @Test - public void testRepositoryDelete() throws IOException { + void testRepositoryDelete() throws IOException { DeleteLocalRepositoryAdapter deleteRepositoryAdapter = new DeleteLocalRepositoryAdapter(); deleteRepositoryAdapter.deleteRepository(folder.getPath()); diff --git a/lombok.config b/lombok.config index 5115acb53..d0bdfc50c 100644 --- a/lombok.config +++ b/lombok.config @@ -1,2 +1,3 @@ # make setters return the object reference instead of void lombok.accessors.chain=true +lombok.addLombokGeneratedAnnotation = true