Skip to content

Commit f95790a

Browse files
authored
Remove admin guard in header (#329)
1 parent 6d5cf8a commit f95790a

File tree

11 files changed

+104
-13
lines changed

11 files changed

+104
-13
lines changed

server/application-server/src/main/java/de/tum/in/www1/hephaestus/activity/badpracticedetector/BadPracticeDetectorScheduler.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ private void checkUserRoleAndScheduleDetectionAtTime(
127127
scheduleDetectionAtTime(pullRequest, scheduledTime, sendBadPracticeDetectionEmail);
128128
}
129129
} catch (Exception e) {
130-
logger.error("Error while checking user role: {}", e.getMessage());
130+
logger.error("Error while checking user role: {}", e.toString());
131131
}
132132
}
133133

@@ -148,13 +148,16 @@ private void scheduleDetectionAtTime(
148148

149149
if (scheduledTasks.containsKey(pullRequest.getId())) {
150150
List<ScheduledFuture<?>> scheduledTasksList = scheduledTasks.get(pullRequest.getId());
151+
List<ScheduledFuture<?>> tasksToRemove = new ArrayList<>();
151152
scheduledTasksList.forEach(task -> {
152153
if (!task.isDone() && !task.isCancelled()) {
154+
logger.info("Cancelling previous task for pull request: {}", pullRequest.getId());
153155
task.cancel(false);
154156
} else {
155-
scheduledTasks.get(pullRequest.getId()).remove(task);
157+
tasksToRemove.add(task);
156158
}
157159
});
160+
scheduledTasksList.removeAll(tasksToRemove);
158161
} else {
159162
scheduledTasks.put(pullRequest.getId(), new ArrayList<>());
160163
}

server/application-server/src/main/java/de/tum/in/www1/hephaestus/activity/badpracticedetector/PullRequestBadPracticeDetector.java

+2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public DetectionResult detectAndSyncBadPractices(PullRequest pullRequest) {
6363
detectorRequest.setDescription(pullRequest.getBody());
6464
detectorRequest.setTitle(pullRequest.getTitle());
6565
detectorRequest.setLifecycleState(lifecycleState.getState());
66+
detectorRequest.setRepositoryName(pullRequest.getRepository().getName());
67+
detectorRequest.setPullRequestNumber(pullRequest.getNumber());
6668
if (pullRequest.getBadPracticeSummary() != null) {
6769
detectorRequest.setBadPracticeSummary(pullRequest.getBadPracticeSummary());
6870
} else {

server/application-server/src/main/java/de/tum/in/www1/hephaestus/intelligenceservice/model/DetectorRequest.java

+63-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
DetectorRequest.JSON_PROPERTY_BAD_PRACTICES,
3737
DetectorRequest.JSON_PROPERTY_DESCRIPTION,
3838
DetectorRequest.JSON_PROPERTY_LIFECYCLE_STATE,
39+
DetectorRequest.JSON_PROPERTY_PULL_REQUEST_NUMBER,
40+
DetectorRequest.JSON_PROPERTY_REPOSITORY_NAME,
3941
DetectorRequest.JSON_PROPERTY_TITLE
4042
})
4143
@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.7.0")
@@ -52,6 +54,12 @@ public class DetectorRequest {
5254
public static final String JSON_PROPERTY_LIFECYCLE_STATE = "lifecycle_state";
5355
private String lifecycleState;
5456

57+
public static final String JSON_PROPERTY_PULL_REQUEST_NUMBER = "pull_request_number";
58+
private Integer pullRequestNumber;
59+
60+
public static final String JSON_PROPERTY_REPOSITORY_NAME = "repository_name";
61+
private String repositoryName;
62+
5563
public static final String JSON_PROPERTY_TITLE = "title";
5664
private String title;
5765

@@ -166,6 +174,56 @@ public void setLifecycleState(String lifecycleState) {
166174
this.lifecycleState = lifecycleState;
167175
}
168176

177+
public DetectorRequest pullRequestNumber(Integer pullRequestNumber) {
178+
179+
this.pullRequestNumber = pullRequestNumber;
180+
return this;
181+
}
182+
183+
/**
184+
* Get pullRequestNumber
185+
* @return pullRequestNumber
186+
*/
187+
@jakarta.annotation.Nonnull
188+
@JsonProperty(JSON_PROPERTY_PULL_REQUEST_NUMBER)
189+
@JsonInclude(value = JsonInclude.Include.ALWAYS)
190+
191+
public Integer getPullRequestNumber() {
192+
return pullRequestNumber;
193+
}
194+
195+
196+
@JsonProperty(JSON_PROPERTY_PULL_REQUEST_NUMBER)
197+
@JsonInclude(value = JsonInclude.Include.ALWAYS)
198+
public void setPullRequestNumber(Integer pullRequestNumber) {
199+
this.pullRequestNumber = pullRequestNumber;
200+
}
201+
202+
public DetectorRequest repositoryName(String repositoryName) {
203+
204+
this.repositoryName = repositoryName;
205+
return this;
206+
}
207+
208+
/**
209+
* Get repositoryName
210+
* @return repositoryName
211+
*/
212+
@jakarta.annotation.Nonnull
213+
@JsonProperty(JSON_PROPERTY_REPOSITORY_NAME)
214+
@JsonInclude(value = JsonInclude.Include.ALWAYS)
215+
216+
public String getRepositoryName() {
217+
return repositoryName;
218+
}
219+
220+
221+
@JsonProperty(JSON_PROPERTY_REPOSITORY_NAME)
222+
@JsonInclude(value = JsonInclude.Include.ALWAYS)
223+
public void setRepositoryName(String repositoryName) {
224+
this.repositoryName = repositoryName;
225+
}
226+
169227
public DetectorRequest title(String title) {
170228

171229
this.title = title;
@@ -204,12 +262,14 @@ public boolean equals(Object o) {
204262
Objects.equals(this.badPractices, detectorRequest.badPractices) &&
205263
Objects.equals(this.description, detectorRequest.description) &&
206264
Objects.equals(this.lifecycleState, detectorRequest.lifecycleState) &&
265+
Objects.equals(this.pullRequestNumber, detectorRequest.pullRequestNumber) &&
266+
Objects.equals(this.repositoryName, detectorRequest.repositoryName) &&
207267
Objects.equals(this.title, detectorRequest.title);
208268
}
209269

210270
@Override
211271
public int hashCode() {
212-
return Objects.hash(badPracticeSummary, badPractices, description, lifecycleState, title);
272+
return Objects.hash(badPracticeSummary, badPractices, description, lifecycleState, pullRequestNumber, repositoryName, title);
213273
}
214274

215275
@Override
@@ -220,6 +280,8 @@ public String toString() {
220280
sb.append(" badPractices: ").append(toIndentedString(badPractices)).append("\n");
221281
sb.append(" description: ").append(toIndentedString(description)).append("\n");
222282
sb.append(" lifecycleState: ").append(toIndentedString(lifecycleState)).append("\n");
283+
sb.append(" pullRequestNumber: ").append(toIndentedString(pullRequestNumber)).append("\n");
284+
sb.append(" repositoryName: ").append(toIndentedString(repositoryName)).append("\n");
223285
sb.append(" title: ").append(toIndentedString(title)).append("\n");
224286
sb.append("}");
225287
return sb.toString();

server/application-server/src/main/resources/mail-templates/bad-practices-detected.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
<span th:text="${badPractice.description}">Bad Practice Description</span>
1010
</li>
1111
</ul>
12-
You can review the bad practices on <a target="_blank" rel="noopener noreferrer nofollow" th:href="${config.clientHost + '/user/' + user.login + '/activity?pullRequest=' + pullRequest.id}">Hephaestus</a>.
12+
You can review the bad practices on <a target="_blank" rel="noopener noreferrer nofollow" th:href="${config.clientHost + '/best-practices'}">Hephaestus</a>.
1313
<br>
1414
<br>
15-
When you have resolved the bad practices, you can re-run the detection by clicking on the <strong>Detect bad practices</strong> button in the <a target="_blank" rel="noopener noreferrer nofollow" th:href="${config.clientHost + '/user/' + user.login + '/activity?pullRequest=' + pullRequest.id}">Activity</a> dashboard.
15+
When you have resolved the bad practices, you can re-run the detection by clicking on the <strong>Detect bad practices</strong> button in the <a target="_blank" rel="noopener noreferrer nofollow" th:href="${config.clientHost + '/best-practices'}">Best practices</a> dashboard.
1616
<hr />
1717
<div style="text-align: center;font-size: 10px">
1818
Manage your notification settings <a th:href="${config.clientHost + '/settings'}">here</a>

server/intelligence-service/app/detector/bad_practice_detector.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,13 @@ class DetectionResult(BaseModel):
5454

5555
@observe()
5656
def detect_bad_practices(
57-
title, description, lifecycle_state, bad_practice_summary, bad_practices
57+
title,
58+
description,
59+
lifecycle_state,
60+
repository_name,
61+
pull_request_number,
62+
bad_practice_summary,
63+
bad_practices,
5864
) -> DetectionResult:
5965

6066
callbacks: List[CallbackHandler] = []
@@ -78,6 +84,9 @@ def detect_bad_practices(
7884
structured_llm = model.with_structured_output(BadPracticeResult)
7985
response = structured_llm.invoke(prompt, config)
8086
trace_id = langfuse_context.get_current_trace_id() or ""
87+
langfuse_context.update_current_trace(
88+
tags=[repository_name, str(pull_request_number)]
89+
)
8190
return DetectionResult(
8291
bad_practice_summary=response.bad_practice_summary,
8392
bad_practices=response.bad_practices,

server/intelligence-service/app/routers/detector.py

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class DetectorRequest(BaseModel):
1212
title: str
1313
description: str
1414
lifecycle_state: str
15+
repository_name: str
16+
pull_request_number: int
1517
bad_practice_summary: str
1618
bad_practices: List[BadPractice]
1719

@@ -32,6 +34,8 @@ def detect(request: DetectorRequest):
3234
request.title,
3335
request.description,
3436
request.lifecycle_state,
37+
request.repository_name,
38+
request.pull_request_number,
3539
request.bad_practice_summary,
3640
request.bad_practices,
3741
)

server/intelligence-service/openapi.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,21 @@ components:
4747
lifecycle_state:
4848
title: Lifecycle State
4949
type: string
50+
pull_request_number:
51+
title: Pull Request Number
52+
type: integer
53+
repository_name:
54+
title: Repository Name
55+
type: string
5056
title:
5157
title: Title
5258
type: string
5359
required:
5460
- title
5561
- description
5662
- lifecycle_state
63+
- repository_name
64+
- pull_request_number
5765
- bad_practice_summary
5866
- bad_practices
5967
title: DetectorRequest

webapp/src/app/app.routes.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,6 @@ export const routes: Routes = [
4747
]
4848
},
4949
{ path: 'teams', component: SubteamsComponent, canActivate: [AuthGuard] },
50-
{ path: 'user/:id/activity', component: ActivityDashboardComponent, canActivate: [AuthGuard] }
50+
{ path: 'user/:id/best-practices', component: ActivityDashboardComponent, canActivate: [AuthGuard] },
51+
{ path: 'best-practices', component: ActivityDashboardComponent, canActivate: [AuthGuard] }
5152
];

webapp/src/app/core/header/header.component.html

+5-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
</a>
88
<span class="text-xs font-semibold mt-1 text-muted-foreground">{{ version }}</span>
99
</div>
10-
@if (signedIn() && user()?.roles?.includes('admin')) {
11-
<a hlmBtn variant="link" routerLink="/workspace">Workspace</a>
12-
<a hlmBtn variant="link" [routerLink]="'/user/' + user()!.username + '/activity'">Activity</a>
10+
@if (signedIn()) {
11+
@if (user()?.roles?.includes('admin')) {
12+
<a hlmBtn variant="link" routerLink="/workspace">Workspace</a>
13+
}
14+
<a hlmBtn variant="link" routerLink="/best-practices">Best practices</a>
1315
<a hlmBtn variant="link" routerLink="/teams">Teams</a>
1416
}
1517
</div>

webapp/src/app/home/activity/activity-dashboard.component.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ export class ActivityDashboardComponent {
2727

2828
user = this.securityStore.loadedUser;
2929

30-
protected userLogin: string | null = null;
30+
protected userLogin: string | undefined = undefined;
3131
protected openedPullRequestId: number | undefined = undefined;
3232

3333
protected numberOfPullRequests = computed(() => this.query.data()?.pullRequests?.length ?? 0);
3434
protected numberOfBadPractices = computed(() => this.query.data()?.pullRequests?.reduce((acc, pr) => acc + (pr.badPractices?.length ?? 0), 0) ?? 0);
3535
protected currUserIsDashboardUser = computed(() => this.user()?.username === this.userLogin);
3636

3737
constructor(private route: ActivatedRoute) {
38-
this.userLogin = this.route.snapshot.paramMap.get('id');
38+
this.userLogin = this.route.snapshot.paramMap.get('id') ?? this.user()?.username;
3939
this.openedPullRequestId = this.route.snapshot.queryParams['pullRequest'];
4040
}
4141

webapp/src/app/user/pull-request-bad-practice-card/pull-request-bad-practice-card.component.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ export class PullRequestBadPracticeCardComponent implements AfterViewInit {
105105
mutationFn: (prId: number) => lastValueFrom(this.activityService.detectBadPracticesForPullRequest(prId)),
106106
onSuccess: () => {
107107
this.queryClient.invalidateQueries({ queryKey: ['activity'] });
108-
if (this.collapsibleTrigger.state() === 'closed') {
108+
if (this.collapsibleTrigger != undefined && this.collapsibleTrigger.state() === 'closed') {
109109
this.collapsibleTrigger.toggleCollapsible();
110110
}
111111
},

0 commit comments

Comments
 (0)