Skip to content

Commit

Permalink
feat: add projectconfig (#228)
Browse files Browse the repository at this point in the history
  • Loading branch information
MartinWitt committed Oct 27, 2022
1 parent 99e23b4 commit 9d9c607
Show file tree
Hide file tree
Showing 23 changed files with 386 additions and 123 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ jobs:
if: github.event_name != 'pull_request'
uses: sigstore/cosign-installer@7bca8b41164994a7dc93749d266e2f1db492f8a2
with:
cosign-release: 'v1.9.0'
cosign-release: 'v1.13.1'
# Build Quarkus
- name: Build
run: cd ./github-bot/ && gradle assemble
Expand Down
1 change: 0 additions & 1 deletion buildSrc/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,4 @@ repositories {
implementation "org.kordamp.gradle:jandex-gradle-plugin:0.13.2"
implementation "net.ltgt.gradle:gradle-errorprone-plugin:3.0.1"
implementation 'io.smallrye:jandex:3.0.1'
testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.23.1'
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,12 @@ public class QodanaAnalyzer {
private String qodanaImageName;
private String resultPathString;
private String sourceFileRoot;
private Optional<String> qodanaCache;

private QodanaAnalyzer(Builder builder) {
this.resultFolder = builder.resultFolder;
this.qodanaImageName = builder.qodanaImageName;
this.resultPathString = builder.resultPathString;
this.sourceFileRoot = builder.sourceFileRoot;
this.qodanaCache = builder.cacheFolder;
}

public List<AnalyzerResult> runQodana(Path sourceRoot) {
Expand Down Expand Up @@ -272,7 +270,8 @@ public static class Builder {
private String qodanaImageName = "jetbrains/qodana";
private String resultPathString = resultFolder + "/qodana.sarif.json";
private String sourceFileRoot = "./src/main/java";
private Optional<String> cacheFolder = Optional.empty();
private Optional<String> cacheFolder = Optional.of("data/cache");
private String subFolder;

public Builder withResultFolder(String resultFolder) {
this.resultFolder = resultFolder;
Expand All @@ -297,8 +296,9 @@ public Builder withSourceFileRoot(String sourceFileRoot) {
return this;
}

public Builder withCacheVolume(String volumeName) {
public Builder withCacheVolume(String volumeName, String subFolder) {
this.cacheFolder = Optional.of(volumeName);
this.subFolder = subFolder;
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public void refactor(ChangeListener listener, CtType<?> type) {
}
for (CtInvocation<?> toStringInvocation :
filterMatches(PositionScanner.findLineOnly(type, result.position()))) {
logger.atInfo().log("found %s", toStringInvocation);
CtInvocation<?> oldInvocation = toStringInvocation.clone().setParent(null);
toStringInvocation.replace(toStringInvocation.getTarget().clone());
listener.setChanged(
Expand Down
39 changes: 9 additions & 30 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions frontend/src/ProjectData.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,19 @@ export function filterDuplicateBadSmells(params: BadSmell[]) {
return filtered;
}

export const fetchProjectConfigQuery = gql`
query getProjectConfig($projectUrl: String!) {
getProjectConfig(projectUrl: $projectUrl) {
projectUrl
sourceFolder
}
}
`;
export const addProjectConfigQuery = gql`
mutation addProjectConfig($projectConfig: ProjectConfig!) {
addProjectConfig(projectConfig: $projectConfig) {
projectUrl
sourceFolder
}
}
`;
4 changes: 4 additions & 0 deletions frontend/src/data/ProjectConfig.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export type ProjectConfig = {
projectUrl: string,
sourceFolder: string
}
5 changes: 5 additions & 0 deletions frontend/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { ThemeProvider, createTheme, ThemeOptions } from '@mui/material/styles';
import { CssBaseline } from '@mui/material';
import { AddProjectView } from './pages/AddProjectView';
import { RefactorView } from './pages/RefactorView';
import { ProjectConfigview } from './pages/ProjectConfigView';
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
Expand All @@ -30,6 +31,10 @@ const router = createBrowserRouter([
path: "/mutation/refactor/:name/:hash",
element: <RefactorView />,
},
{
path: "/mutation/projectconfig/:projectUrl",
element: <ProjectConfigview />,
},
{
path: "/resultview",
element: <DashBoard />,
Expand Down
41 changes: 41 additions & 0 deletions frontend/src/pages/ProjectConfigView.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { useQuery } from '@apollo/client';
import { Alert, Box, Button, TextField, Typography } from '@mui/material';
import React, { useState } from 'react';
import { useParams } from 'react-router';
import Headline from '../component/Headline';
import { fetchProjectConfigQuery } from '../ProjectData';

export function ProjectConfigview() {
const { projectUrl } = useParams();
const encodedProjectUrl = toBase64(projectUrl);
const [sourceFolder, setSourceFolder] = useState("")
const { loading, error} = useQuery(fetchProjectConfigQuery, {
variables: { projectUrl: encodedProjectUrl },
onCompleted: (data) => {
setSourceFolder(data.getProjectConfig.sourceFolder)
}
});
return (
<div>
<Headline />
<Box padding={5}>
<br />
<Typography variant='h4'>Project Config </Typography>
<br />
{loading && <p>Loading...</p>}
{error && <Alert severity="error">Can not fetch data. Are you logged in?</Alert>}
<TextField label="SourceFolder" value={sourceFolder} onChange={(e) => setSourceFolder(e.target.value)} />
<Button variant="contained" onClick={
(e) => {
console.log(sourceFolder);
}}>Save</Button>
</Box>
</div>
);
}
function toBase64(str: string | undefined): string {
if (undefined === str) {
return "";
}
return atob(str);
}
11 changes: 9 additions & 2 deletions frontend/src/pages/Resultview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { Project } from "../data/Project";
import { useQuery } from "@apollo/client";
import BadSmellList from "../component/BadSmellList";


function Resultview() {

let params = useParams();
Expand Down Expand Up @@ -40,7 +39,9 @@ function Resultview() {
<br />
<Divider />
<BadSmellList {...projectWithSingleHash(project, params.hash)} />
<Button variant="contained" href={"/mutation/refactor/" + project.projectName+"/"+params.hash}>toRefactor</Button>
<Divider />
<Button variant="contained" href={"/mutation/refactor/" + project.projectName + "/" + params.hash}>toRefactor</Button>
<Button variant="contained" href={generateProjectConfigLink(project)}>toProjectConfig</Button>
</div>
);
}
Expand All @@ -62,4 +63,10 @@ function addHashIfPresent(hash: string | undefined) : string {
return hash;
}
return "";
}
function toBase64(str: string) {
return btoa(str);
}
function generateProjectConfigLink(project: Project) {
return "/mutation/projectconfig/" + toBase64(project.projectUrl);
}
62 changes: 0 additions & 62 deletions github-bot/README.md

This file was deleted.

2 changes: 2 additions & 0 deletions github-bot/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ dependencies {
implementation 'io.quarkiverse.quinoa:quarkus-quinoa:1.2.2'
implementation("io.quarkus:quarkus-oidc")
implementation("io.quarkus:quarkus-keycloak-authorization")
testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.23.1'
implementation 'io.vertx:vertx-junit5:+'
}

group 'io.github.martinwitt'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,17 @@
import static com.mongodb.client.model.Sorts.ascending;

import com.google.common.flogger.FluentLogger;
import io.github.martinwitt.laughing_train.data.FindProjectConfigRequest;
import io.github.martinwitt.laughing_train.data.FindProjectConfigResult;
import io.github.martinwitt.laughing_train.persistence.BadSmell;
import io.github.martinwitt.laughing_train.persistence.Project;
import io.github.martinwitt.laughing_train.persistence.ProjectConfig;
import io.github.martinwitt.laughing_train.services.ProjectConfigService;
import io.quarkus.security.Authenticated;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import org.bson.BsonDocument;
import org.bson.conversions.Bson;
import org.eclipse.microprofile.graphql.DefaultValue;
Expand All @@ -27,6 +32,9 @@ public class ProjectGraphQL {

private static final FluentLogger logger = FluentLogger.forEnclosingClass();

@Inject
ProjectConfigService projectConfigService;

@Query("getProjects")
@Description("Gets all projects from the database")
public List<Project> getAllProjects() {
Expand Down Expand Up @@ -58,6 +66,9 @@ public List<String> getHashesForProject(String projectName) {
@Description("Adds a project to the database")
public Project addProject(String projectUrl, String projectName) {
Project project = new Project(projectName, projectUrl);
if (ProjectConfig.findByProjectUrl(projectUrl).isEmpty()) {
ProjectConfig.ofProjectUrl(projectUrl).persistOrUpdate();
}
project.persistOrUpdate();
return project;
}
Expand All @@ -77,4 +88,30 @@ public List<Project> removeProjectByName(String projectName) {
public String login(@DefaultValue("defaultValue") String notNeeded) {
return "login successful";
}

@Query("getProjectConfig")
@Description("Gets the project config for a project")
public ProjectConfig getProjectConfig(String projectUrl) {
var result = projectConfigService.getConfig(new FindProjectConfigRequest.ByProjectUrl(projectUrl));
if (result instanceof FindProjectConfigResult.SingleResult singleResult) {
return singleResult.projectConfig();
} else {
return ProjectConfig.ofProjectUrl(projectUrl);
}
}

@Mutation
@Authenticated
@Description("Sets the project config for a project")
public ProjectConfig setProjectConfig(ProjectConfig projectConfig) {
var result = projectConfigService.getConfig(
new FindProjectConfigRequest.ByProjectUrl(projectConfig.getProjectUrl()));
if (result instanceof FindProjectConfigResult.SingleResult singleResult) {
singleResult.projectConfig().update(projectConfig);
return singleResult.projectConfig();
} else {
projectConfig.persist();
return projectConfig;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package io.github.martinwitt.laughing_train.data;

import java.io.Serializable;

public sealed interface FindProjectConfigRequest extends Serializable {
record ByProjectUrl(String projectUrl) implements FindProjectConfigRequest, Serializable {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.github.martinwitt.laughing_train.data;

import io.github.martinwitt.laughing_train.persistence.ProjectConfig;
import java.io.Serializable;
import java.util.List;

public sealed interface FindProjectConfigResult extends Serializable {
record SingleResult(ProjectConfig projectConfig) implements FindProjectConfigResult {}

record MultipleResults(List<? super ProjectConfig> projectConfigs) implements FindProjectConfigResult {}

record NotFound() implements FindProjectConfigResult {}
}
Loading

0 comments on commit 9d9c607

Please sign in to comment.