Skip to content
Open
Show file tree
Hide file tree
Changes from 121 commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
f4a0117
fix: added basicInfoFormValueSignal() as a tracked dependency so the …
ge94zec Apr 19, 2026
40d1edf
fix: run compliance analysis before translation for faster feedback
ge94zec Apr 20, 2026
edbea60
Merge branch 'main' into bugfix/2321-title-compliance-error-not-shown
ge94zec Apr 20, 2026
a7392d8
fix: double-trigger for translate -> race condition
ge94zec Apr 20, 2026
437788f
Merge remote-tracking branch 'origin/bugfix/2321-title-compliance-err…
ge94zec Apr 20, 2026
652bb5e
Added new categories in compliance sidebar
ge94zec Apr 24, 2026
22c7fe1
added new categories in sidebar
ge94zec Apr 26, 2026
a184f9d
Merge branch 'main' into bugfix/2321-title-compliance-error-not-shown
ge94zec Apr 27, 2026
343c8cc
fix highlights across reload
ge94zec Apr 28, 2026
7f5a227
Merge remote-tracking branch 'origin/bugfix/2321-title-compliance-err…
ge94zec Apr 28, 2026
b0840ab
prettier
ge94zec Apr 28, 2026
4a13ca2
esLint
ge94zec Apr 28, 2026
07b036c
Merge branch 'main' into feat/2345-add-new-compliance-categories-in-s…
ge94zec Apr 28, 2026
55ba4dd
Merge branch 'main' into feat/2345-add-new-compliance-categories-in-s…
ge94zec Apr 29, 2026
21e240e
esLint
ge94zec Apr 29, 2026
0c46d89
Merge remote-tracking branch 'origin/feat/2345-add-new-compliance-cat…
ge94zec Apr 29, 2026
e5d7de4
fix translations
ge94zec Apr 29, 2026
f1e62d4
prettier
ge94zec Apr 29, 2026
f241af0
Merge branch 'main' into bugfix/2321-title-compliance-error-not-shown
ge94zec Apr 29, 2026
1b847bd
change requests
ge94zec May 1, 2026
3c99c9f
Merge branch 'main' into feat/2345-add-new-compliance-categories-in-s…
ge94zec May 1, 2026
08537ab
Merge branch 'main' into feat/2345-add-new-compliance-categories-in-s…
az108 May 1, 2026
fba7bed
Merge branch 'main' into feat/2345-add-new-compliance-categories-in-s…
ge94zec May 1, 2026
ee05ead
Merge branch 'main' into bugfix/2321-title-compliance-error-not-shown
ge94zec May 1, 2026
5c6f1e2
Merge branch 'main' into feat/2345-add-new-compliance-categories-in-s…
ge94zec May 1, 2026
497111a
change requests
ge94zec May 1, 2026
53dd4e5
Merge remote-tracking branch 'origin/feat/2345-add-new-compliance-cat…
ge94zec May 1, 2026
dcf5420
Merge branch 'main' into bugfix/2321-title-compliance-error-not-shown
ge94zec May 1, 2026
08152f4
change requests
ge94zec May 1, 2026
ccdca07
eslint
ge94zec May 1, 2026
87ab90e
change requests
ge94zec May 1, 2026
dca0e2a
Merge branch 'main' into bugfix/2321-title-compliance-error-not-shown
ge94zec May 1, 2026
807e8d8
Merge branch 'main' into feat/2345-add-new-compliance-categories-in-s…
ge94zec May 1, 2026
9e23fd7
change requests
ge94zec May 1, 2026
1acbc29
Merge remote-tracking branch 'origin/bugfix/2321-title-compliance-err…
ge94zec May 1, 2026
7fe140f
Merge branch 'main' into feat/2345-add-new-compliance-categories-in-s…
ge94zec May 1, 2026
e08cc5b
Merge remote-tracking branch 'origin/main' into bugfix/2321-title-com…
ge94zec May 1, 2026
cd8b599
Merge branch 'feat/2345-add-new-compliance-categories-in-sidebar' int…
ge94zec May 2, 2026
8bb854e
feat: merge compliance add new categories
ge94zec May 2, 2026
0107acc
updated editor
ge94zec May 2, 2026
a8bf9bd
Merge branch 'main' into bugfix/2321-title-compliance-error-not-shown
ge94zec May 2, 2026
cc271f7
Merge branch 'main' into bugfix/2321-title-compliance-error-not-shown
ge94zec May 2, 2026
1f09ad4
Merge branch 'main' into bugfix/2321-title-compliance-error-not-shown
ge94zec May 2, 2026
2842223
Merge branch 'main' into bugfix/2321-title-compliance-error-not-shown
ge94zec May 2, 2026
6e1c011
Merge branch 'main' into bugfix/2321-title-compliance-error-not-shown
ge94zec May 3, 2026
f958bc2
Merge branch 'main' into bugfix/2321-title-compliance-error-not-shown
ge94zec May 3, 2026
5ac21ff
feat: move gender decoder analysis to server side
ge94zec May 3, 2026
c9f0d10
refactor: restructure server-side bias analysis and reduce excessive …
ge94zec May 3, 2026
203ca29
- processingOrder: genderDecoder -> original compliance and translate…
ge94zec May 3, 2026
8b22df9
Merge remote-tracking branch 'origin/main' into bugfix/2379-fix-exces…
ge94zec May 3, 2026
9a02e9b
updated openapi
ge94zec May 4, 2026
5eddb05
Merge remote-tracking branch 'origin/main' into bugfix/2379-fix-exces…
ge94zec May 4, 2026
158eec0
chore: update OpenAPI spec and generated client
github-actions[bot] May 4, 2026
8b7c4d4
fixed client and server tests
ge94zec May 4, 2026
7327454
Merge remote-tracking branch 'origin/bugfix/2379-fix-excessive-api-re…
ge94zec May 4, 2026
46b5c94
fixed client test
ge94zec May 4, 2026
04a26a6
fixed server test
ge94zec May 4, 2026
817ab36
Merge branch 'main' into bugfix/2379-fix-excessive-api-requests-trigg…
ge94zec May 8, 2026
343b52b
- prettier
ge94zec May 8, 2026
72c15c5
Merge remote-tracking branch 'origin/bugfix/2379-fix-excessive-api-re…
ge94zec May 8, 2026
ee58a1f
add doc
ge94zec May 8, 2026
c3fe888
refactor: remove GenderBiasAnalysisResource and GenderBiasAnalysisRe…
ge94zec May 9, 2026
7252ffa
Merge branch 'main' into bugfix/2379-fix-excessive-api-requests-trigg…
ge94zec May 9, 2026
9a2db45
Merge remote-tracking branch 'origin/main' into bugfix/2379-fix-exces…
ge94zec May 12, 2026
9f0aa5d
refactor: replace coding with enum GenderCategory
ge94zec May 12, 2026
0627177
\`Bugfix\`: Replace double Job load with a targeted biased-issues query
az108 May 12, 2026
c94c107
Merge branch 'main' into bugfix/2379-fix-excessive-api-requests-trigg…
az108 May 12, 2026
da449e8
fix editor
ge94zec May 13, 2026
a36dd36
Merge remote-tracking branch 'origin/main' into bugfix/2379-fix-exces…
ge94zec May 13, 2026
eb73e71
moved BiasWordList and GenderCategory
ge94zec May 13, 2026
7d9245b
prettier
ge94zec May 13, 2026
29c625b
Merge branch 'main' into bugfix/2379-fix-excessive-api-requests-trigg…
ge94zec May 14, 2026
cbe0b64
`Bugfix`: Store biased issues in a Set so Hibernate stops rewriting t…
az108 May 14, 2026
762be05
\`Bugfix\`: Carry the biased-issues Set type through the repo and DTO…
az108 May 14, 2026
be9f574
refactor complianceScore and tests
ge94zec May 14, 2026
e0f9c72
Merge remote-tracking branch 'origin/bugfix/2379-fix-excessive-api-re…
ge94zec May 14, 2026
2b77652
refactor complianceScore
ge94zec May 14, 2026
1e8ae67
prettier
ge94zec May 14, 2026
9c85baa
Merge branch 'main' into bugfix/2379-fix-excessive-api-requests-trigg…
ge94zec May 14, 2026
032eefe
Merge branch 'main' into bugfix/2379-fix-excessive-api-requests-trigg…
ge94zec May 15, 2026
e4cd714
Merge branch 'main' into bugfix/2379-fix-excessive-api-requests-trigg…
ge94zec May 17, 2026
e3634b0
- refactored namings and BiasedIssues to Set
ge94zec Jun 3, 2026
d5c024b
Merge remote-tracking branch 'origin/main' into bugfix/2379-fix-exces…
ge94zec Jun 4, 2026
3bfef56
chore: update OpenAPI spec and generated client
github-actions[bot] Jun 4, 2026
6ff3240
- fixed test names
ge94zec Jun 4, 2026
509a39a
Merge remote-tracking branch 'origin/bugfix/2379-fix-excessive-api-re…
ge94zec Jun 4, 2026
bdfb33a
- fixed AiResourceTest
ge94zec Jun 4, 2026
914b244
prettier
ge94zec Jun 4, 2026
f1ed30b
fix test
ge94zec Jun 4, 2026
8011d44
fix test
ge94zec Jun 9, 2026
775de1b
prettier
ge94zec Jun 9, 2026
71d4abb
Fix gender bias scoring persistence per job
ge94zec Jun 9, 2026
2174c4d
chore: update OpenAPI spec and generated client
github-actions[bot] Jun 9, 2026
880e9e7
Adjust tests and prettier
ge94zec Jun 9, 2026
536fbc2
Merge remote-tracking branch 'origin/bugfix/2379-fix-excessive-api-re…
ge94zec Jun 9, 2026
a3ecf73
lint
ge94zec Jun 9, 2026
0f65c7a
fix gender bias scoring, blank descriptions, and review feedback
ge94zec Aug 2, 2026
8b5da77
merge main
ge94zec Aug 3, 2026
8e0f3c6
fix(ai): persist and return multilingual job analysis consistently
ge94zec Aug 4, 2026
84eb1d8
chore: update OpenAPI spec and generated client
github-actions[bot] Aug 4, 2026
705e89e
fix server and client tests
ge94zec Aug 4, 2026
05e731b
Merge remote-tracking branch 'origin/bugfix/2379-fix-excessive-api-re…
ge94zec Aug 4, 2026
8e5d39e
Merge branch 'main' into bugfix/2379-fix-excessive-api-requests-trigg…
ge94zec Aug 10, 2026
b9fe961
fix: synchronize autosave, translation and compliance analysis
ge94zec Aug 10, 2026
aad62bf
chore: update OpenAPI spec and generated client
github-actions[bot] Aug 10, 2026
74ec58d
- fix server tests
ge94zec Aug 10, 2026
1cc7ad7
Merge remote-tracking branch 'origin/bugfix/2379-fix-excessive-api-re…
ge94zec Aug 10, 2026
a25e72d
Merge branch 'main' into bugfix/2379-fix-excessive-api-requests-trigg…
ge94zec Aug 13, 2026
811f5d0
fix: address review feedback for gender bias analysis
ge94zec Aug 13, 2026
c975f3b
prettier
ge94zec Aug 13, 2026
c1a3ef9
chore: update OpenAPI spec and generated client
github-actions[bot] Aug 13, 2026
581b926
test: drive editor tests through public inputs and template events
ge94zec Aug 13, 2026
73e5155
Merge remote-tracking branch 'origin/bugfix/2379-fix-excessive-api-re…
ge94zec Aug 13, 2026
dee54f3
chore: update OpenAPI spec and generated client
github-actions[bot] Aug 13, 2026
b2edf95
fix client test
ge94zec Aug 13, 2026
0c27f27
Merge remote-tracking branch 'origin/bugfix/2379-fix-excessive-api-re…
ge94zec Aug 13, 2026
7ea50d7
fix server test
ge94zec Aug 13, 2026
33b2fc2
optimized tests
ge94zec Aug 14, 2026
f84b5d0
fix: prevent AI compliance analysis without user consent
ge94zec Aug 15, 2026
232dbb9
fix client tests
ge94zec Aug 15, 2026
c52b9f8
prettier
ge94zec Aug 15, 2026
431156e
prettier
ge94zec Aug 17, 2026
1f1ac8e
test: compare parallel AI processing performance on test server
ge94zec Aug 17, 2026
ed0bcc8
Revert analysis and translation to sequential processing
ge94zec Aug 17, 2026
8ebe8c4
Replace JobRepository.findByIdForAiUpdate with the inherited findById
ge94zec Aug 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 56 additions & 56 deletions openapi/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -110,16 +110,14 @@ paths:
requestBody:
content:
application/json:
schema: {$ref: '#/components/schemas/JobFormDTO'}
schema: {$ref: '#/components/schemas/AnalyzeJobDescriptionRequestDTO'}
required: true
responses:
'200':
description: OK
content:
application/json:
schema:
type: array
items: {$ref: '#/components/schemas/ComplianceIssue'}
schema: {$ref: '#/components/schemas/JobAnalysisDTO'}
/api/ai/extractPdfData:
put:
tags: [ai-resource]
Expand Down Expand Up @@ -1429,36 +1427,6 @@ paths:
content:
application/pdf:
schema: {type: string, format: binary}
/api/gender-bias/analyze:
post:
tags: [gender-bias-analysis-resource]
operationId: analyzeText
requestBody:
content:
application/json:
schema: {$ref: '#/components/schemas/GenderBiasAnalysisRequest'}
required: true
responses:
'200':
description: OK
content:
application/json:
schema: {$ref: '#/components/schemas/GenderBiasAnalysisResponse'}
/api/gender-bias/analyze-html:
post:
tags: [gender-bias-analysis-resource]
operationId: analyzeHtmlContent
requestBody:
content:
application/json:
schema: {$ref: '#/components/schemas/GenderBiasAnalysisRequest'}
required: true
responses:
'200':
description: OK
content:
application/json:
schema: {$ref: '#/components/schemas/GenderBiasAnalysisResponse'}
/api/images/defaults/job-banners:
get:
tags: [image-resource]
Expand Down Expand Up @@ -2047,6 +2015,26 @@ paths:
content:
application/json:
schema: {$ref: '#/components/schemas/PageAdminCreatedJobDTO'}
/api/jobs/analyze-gender-bias:
post:
tags: [job-resource]
operationId: analyzeGenderBias
parameters:
- name: lang
in: query
required: true
schema: {type: string}
requestBody:
content:
application/json:
schema: {$ref: '#/components/schemas/AnalyzeJobDescriptionRequestDTO'}
required: true
responses:
'200':
description: OK
content:
application/json:
schema: {$ref: '#/components/schemas/JobAnalysisDTO'}
/api/jobs/available:
get:
tags: [job-resource]
Expand Down Expand Up @@ -3111,6 +3099,14 @@ components:
AiUsageTimeRange:
type: string
enum: [LAST_DAY, LAST_WEEK, LAST_MONTH, LAST_THREE_MONTHS, ALL_TIME]
AnalyzeJobDescriptionRequestDTO:
type: object
properties:
jobDescriptionDE: {type: string}
jobDescriptionEN: {type: string}
jobId: {type: string, format: uuid}
title: {type: string}
required: [jobId]
ApplicantDTO:
type: object
properties:
Expand Down Expand Up @@ -3294,10 +3290,13 @@ components:
expiresIn: {type: integer, format: int64}
profileRequired: {type: boolean}
refreshExpiresIn: {type: integer, format: int64}
BiasedWordDTO:
BiasedIssueDTO:
type: object
properties:
type: {type: string}
language: {type: string}
type:
type: string
enum: [NON_INCLUSIVE, INCLUSIVE]
word: {type: string}
BookSlotRequestDTO:
type: object
Expand All @@ -3320,7 +3319,7 @@ components:
deleteSlot: {type: boolean}
sendReinvite: {type: boolean}
required: [deleteSlot, sendReinvite]
ComplianceIssue:
ComplianceIssueDTO:
type: object
properties:
action:
Expand Down Expand Up @@ -3528,20 +3527,6 @@ components:
masterDegreeName: {type: string}
masterGrade: {type: string}
masterUniversity: {type: string}
GenderBiasAnalysisRequest:
type: object
properties:
language: {type: string}
text: {type: string}
GenderBiasAnalysisResponse:
type: object
properties:
biasedWords:
type: array
items: {$ref: '#/components/schemas/BiasedWordDTO'}
coding: {type: string}
language: {type: string}
originalText: {type: string}
ImageDTO:
type: object
properties:
Expand Down Expand Up @@ -3636,6 +3621,16 @@ components:
firstName: {type: string}
lastName: {type: string}
userId: {type: string, format: uuid}
JobAnalysisDTO:
type: object
properties:
aiScore: {type: integer, format: int32}
biasedIssues:
type: array
items: {$ref: '#/components/schemas/BiasedIssueDTO'}
complianceIssues:
type: array
items: {$ref: '#/components/schemas/ComplianceIssueDTO'}
JobCardDTO:
type: object
properties:
Expand Down Expand Up @@ -3677,16 +3672,19 @@ components:
JobDTO:
type: object
properties:
aiScore: {type: integer, format: int32}
biasedIssues:
type: array
items: {$ref: '#/components/schemas/BiasedIssueDTO'}
complianceIssues:
type: array
items: {$ref: '#/components/schemas/ComplianceIssue'}
items: {$ref: '#/components/schemas/ComplianceIssueDTO'}
contractDuration: {type: integer, format: int32}
endDate: {type: string, format: date}
fundingType:
type: string
enum: [FULLY_FUNDED, PARTIALLY_FUNDED, SCHOLARSHIP, SELF_FUNDED, INDUSTRY_SPONSORED,
GOVERNMENT_FUNDED, RESEARCH_GRANT]
genderBiasScore: {type: integer, format: int32}
imageId: {type: string, format: uuid}
imageUrl: {type: string}
jobDescriptionDE: {type: string}
Expand Down Expand Up @@ -3804,16 +3802,19 @@ components:
JobFormDTO:
type: object
properties:
aiScore: {type: integer, format: int32}
biasedIssues:
type: array
items: {$ref: '#/components/schemas/BiasedIssueDTO'}
complianceIssues:
type: array
items: {$ref: '#/components/schemas/ComplianceIssue'}
items: {$ref: '#/components/schemas/ComplianceIssueDTO'}
contractDuration: {type: integer, format: int32}
endDate: {type: string, format: date}
fundingType:
type: string
enum: [FULLY_FUNDED, PARTIALLY_FUNDED, SCHOLARSHIP, SELF_FUNDED, INDUSTRY_SPONSORED,
GOVERNMENT_FUNDED, RESEARCH_GRANT]
genderBiasScore: {type: integer, format: int32}
imageId: {type: string, format: uuid}
jobDescriptionDE: {type: string}
jobDescriptionEN: {type: string}
Expand Down Expand Up @@ -4307,7 +4308,6 @@ components:
TranslateComplianceDTO:
type: object
properties:
originalAnalysis: {$ref: '#/components/schemas/GenderBiasAnalysisResponse'}
text: {type: string, minLength: 1}
required: [text]
UpcomingInterviewDTO:
Expand Down
26 changes: 26 additions & 0 deletions src/main/java/de/tum/cit/aet/ai/domain/BiasedIssue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package de.tum.cit.aet.ai.domain;

import de.tum.cit.aet.core.constants.GenderCategory;
import jakarta.persistence.Embeddable;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class BiasedIssue {
Comment thread
ge94zec marked this conversation as resolved.

private String language;
private String word;

@Enumerated(EnumType.STRING)
private GenderCategory type;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package de.tum.cit.aet.ai.dto;

import jakarta.validation.constraints.NotNull;
import java.util.UUID;

public record AnalyzeJobDescriptionRequestDTO(@NotNull UUID jobId, String title, String jobDescriptionEN, String jobDescriptionDE) {}
12 changes: 12 additions & 0 deletions src/main/java/de/tum/cit/aet/ai/dto/BiasedIssueDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package de.tum.cit.aet.ai.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import de.tum.cit.aet.ai.domain.BiasedIssue;
import de.tum.cit.aet.core.constants.GenderCategory;

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public record BiasedIssueDTO(String language, String word, GenderCategory type) {
Comment thread
ge94zec marked this conversation as resolved.
public static BiasedIssueDTO from(BiasedIssue issue) {
return new BiasedIssueDTO(issue.getLanguage(), issue.getWord(), issue.getType());
}
}
35 changes: 35 additions & 0 deletions src/main/java/de/tum/cit/aet/ai/dto/ComplianceIssueDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package de.tum.cit.aet.ai.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import de.tum.cit.aet.ai.constants.ComplianceAction;
import de.tum.cit.aet.ai.constants.ComplianceCategory;
import de.tum.cit.aet.ai.domain.ComplianceIssue;

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public record ComplianceIssueDTO(
String id,
ComplianceCategory category,
String text,
String article,
Comment thread
ge94zec marked this conversation as resolved.
String explanation,
ComplianceAction action,
String language
) {
/**
* Creates a DTO from a persisted compliance issue.
*
* @param issue the persisted compliance issue
* @return the mapped compliance issue DTO
*/
public static ComplianceIssueDTO from(ComplianceIssue issue) {
return new ComplianceIssueDTO(
issue.getId(),
issue.getCategory(),
issue.getText(),
issue.getArticle(),
issue.getExplanation(),
issue.getAction(),
issue.getLanguage()
);
}
}
26 changes: 26 additions & 0 deletions src/main/java/de/tum/cit/aet/ai/dto/JobAnalysisDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package de.tum.cit.aet.ai.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import de.tum.cit.aet.ai.domain.BiasedIssue;
import de.tum.cit.aet.ai.domain.ComplianceIssue;
import java.util.List;
import java.util.Set;

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public record JobAnalysisDTO(Integer aiScore, List<ComplianceIssueDTO> complianceIssues, List<BiasedIssueDTO> biasedIssues) {
/**
* Creates an analysis DTO from the persisted issues.
*
* @param aiScore the combined AI score
* @param complianceIssues the persisted compliance issues
* @param biasedIssues the persisted biased-language issues
* @return the mapped analysis DTO
*/
public static JobAnalysisDTO from(Integer aiScore, List<ComplianceIssue> complianceIssues, Set<BiasedIssue> biasedIssues) {
return new JobAnalysisDTO(
aiScore,
complianceIssues.stream().map(ComplianceIssueDTO::from).toList(),
biasedIssues.stream().map(BiasedIssueDTO::from).toList()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package de.tum.cit.aet.ai.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import de.tum.cit.aet.core.dto.GenderBiasAnalysisResponse;
import jakarta.annotation.Nullable;
import jakarta.validation.constraints.NotBlank;

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public record TranslateComplianceDTO(@NotBlank String text, @Nullable GenderBiasAnalysisResponse originalAnalysis) {}
public record TranslateComplianceDTO(@NotBlank String text) {}
Loading
Loading