From b7e5affcb18b7088860465f1c10bee269088f831 Mon Sep 17 00:00:00 2001 From: rostislav Date: Wed, 31 Dec 2025 14:57:58 +0200 Subject: [PATCH 1/2] feat: Update .gitignore to include __pycache__ directories and remove compiled Python files --- frontend | 2 +- python-ecosystem/mcp-client/.gitignore | 3 ++- .../mcp-client/__pycache__/main.cpython-313.pyc | Bin 4681 -> 0 bytes .../model/__pycache__/models.cpython-313.pyc | Bin 3536 -> 0 bytes .../__pycache__/stdin_handler.cpython-313.pyc | Bin 3111 -> 0 bytes .../__pycache__/web_server.cpython-313.pyc | Bin 8496 -> 0 bytes .../__pycache__/review_service.cpython-313.pyc | Bin 19035 -> 0 bytes .../__pycache__/prompt_builder.cpython-313.pyc | Bin 17129 -> 0 bytes .../__pycache__/prompt_logger.cpython-313.pyc | Bin 10888 -> 0 bytes .../__pycache__/response_parser.cpython-313.pyc | Bin 16195 -> 0 bytes python-ecosystem/rag-pipeline/.gitignore | 1 + 11 files changed, 4 insertions(+), 2 deletions(-) delete mode 100644 python-ecosystem/mcp-client/__pycache__/main.cpython-313.pyc delete mode 100644 python-ecosystem/mcp-client/model/__pycache__/models.cpython-313.pyc delete mode 100644 python-ecosystem/mcp-client/server/__pycache__/stdin_handler.cpython-313.pyc delete mode 100644 python-ecosystem/mcp-client/server/__pycache__/web_server.cpython-313.pyc delete mode 100644 python-ecosystem/mcp-client/service/__pycache__/review_service.cpython-313.pyc delete mode 100644 python-ecosystem/mcp-client/utils/__pycache__/prompt_builder.cpython-313.pyc delete mode 100644 python-ecosystem/mcp-client/utils/__pycache__/prompt_logger.cpython-313.pyc delete mode 100644 python-ecosystem/mcp-client/utils/__pycache__/response_parser.cpython-313.pyc diff --git a/frontend b/frontend index df0b8e52..62359446 160000 --- a/frontend +++ b/frontend @@ -1 +1 @@ -Subproject commit df0b8e52b495612a1ab99c086de1cbbf8f7168d3 +Subproject commit 62359446f44e5554753f257064ccada85aad24c0 diff --git a/python-ecosystem/mcp-client/.gitignore b/python-ecosystem/mcp-client/.gitignore index 10ce76db..5fa887fe 100644 --- a/python-ecosystem/mcp-client/.gitignore +++ b/python-ecosystem/mcp-client/.gitignore @@ -13,4 +13,5 @@ target/ server.log *.jar -logs/** \ No newline at end of file +logs/** +**/__pycache__/ \ No newline at end of file diff --git a/python-ecosystem/mcp-client/__pycache__/main.cpython-313.pyc b/python-ecosystem/mcp-client/__pycache__/main.cpython-313.pyc deleted file mode 100644 index 69b21a3f674ca00999ea3d7a48fc05219b385cd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4681 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 PBs6iB{I>)@V&MM*lX#ii diff --git a/python-ecosystem/mcp-client/server/__pycache__/stdin_handler.cpython-313.pyc b/python-ecosystem/mcp-client/server/__pycache__/stdin_handler.cpython-313.pyc deleted file mode 100644 index f182f55972f08b0aed56ee91cd26d4e761cf22ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3111 zcma)8OKcp+5$*ZyXSkG>r1+C)s!7wb#uRsjh%_Q1A5fB|gaqhd$26QQgTZLFcRBKM zX5BqYiaZ%P1iV^_Km|I)r$D|brzC(cmM=a9A_zmuNJ$P+4!+T*0tfabRr6U=iVe7d zss7hgSJ!*h``z6-fpTT^W%o#qkbhw(Eo#!(Uxvm_ViHqYAUv)mE=7Hr%TUV;%Dl?e zd5vrH8J?lIMp?+t=Xfq^s|)#go$Hhgk#S;b$BCJlkz?(=t05WL&#<#-C}HmPR^a-c z-3--Bt`mgHoVQ^}VX?y2T((|e@3ff+E(Jb}b;n~S<7=+NoLF5fwWPCu0U9^SGC^y> zQi&_3%vDo4PPk^O%bDfua&9?4E#n6Kre(D5n#y%E18cg>EH5;2Mm{W^9;(Jrf@x_J+*lHODr<|tC zyr7KA881iYvQiUT8)43}T(Huz!v4d)Dy75SV1y`uc$YjGoxJUDsh{Rf>_eY~8P0+> z_nvW59ws6uod)Y~l2KB{rBSIQp_BHpuB2CfXfSoBCoM^*lX3ePAxlyP-Su2aSDVu8 zTZGu~*M?jLNW`TQ!6fa)^*CsnNiJ%FjFBpyE-G1KgE~*H9!*CMX)2~;2Q`2~srIG) zB{|hNVyBha-`` z0rAsvTde7NjM@#jQtH?q6)k(+gWz%n6%Kb>fez7yVZG+oSQ^u@(lysk!di!);mwIz zokBsxB6#@*b$lRLI!xGrj|Q#VZd2$XS==1G3{6(+ z%tYrnfYJwYs4>oc9_HC~hed2*=%E6E8fsBchAJw>4jdy?uL<7^wWe>^M3{dq-4bdo z?s`F})!M5q0owy^C>&!nRJgq!N=#t%!J+sO92`WQR&opr&9UO2O*|9q-?FL)R0to$ zyJWAZ=Z7Bm_HP^S8QZ1zO1r(|TNnS)H*o94-y6R(ZcpCn-90|}aPY+AzQOI;8?(2Z z-~9M~Vf??3j}Gk<4R#iKemk-K%8geZ4xfMg0)4;d_M4w;%IJ}OqVyeoN|f&6(;PWA z^z~jBEdEN2z(0R=ey*2%*bm~PUj0Ik^3llTg@SUgph5eaA@_#}a!aI=1UD$@loTci zDhCLxif)QZHO&{Kl1ax7Y6x-JRL*t)a}drA3BZkTkBXT)3$VH*y($5GI-sj`pp~v8 zkV(KoyqxDs1-<=TSpx1)Gfw(vPxD}W`&&(O92-8ELXW1TPs`uG62W%JykPhGFo z4m#A4P*IJZX4hLlYRDQf#{qd^k~J{1{@BM%18?F^pV9h})J zJnS0W={k8p8pXl;!;5>0jD#U0VaVOZy$tE@+f(&?@yWocoq<>HjDXm>@}z%cyLzMg z{;>yR(>r6+55^XD#uh%ga)0UPyJNrD?XPZK?x?->=G~WedcXf^;e5-jzTQ({@mFF9tpC&8@P!_7uSdUFRPLRayx66D+@(R=kRsA-40yGvI9sTSKAQ%uoGVo9BCy=1{}#M639;iCx1=;rp|n!%35hJ*Q*WP8M-@h zSN!?n-RplW?HF@U35@;c^q^LZmEeA(5XT#yoEsp*Ot8^{pgv?F8W$E2Rn1Z)MI4y} z$pf$S?0YYI1jfcaYjBwRLF}v_@mWxbtS&I@_Y_Hz9+9p`M1Mq%{F9v8A*cRLjK7n! PUuM216~7=LB8&eA_q*z1 diff --git a/python-ecosystem/mcp-client/server/__pycache__/web_server.cpython-313.pyc b/python-ecosystem/mcp-client/server/__pycache__/web_server.cpython-313.pyc deleted file mode 100644 index ae3e60521bff802fc7b9c3b546c701df803f355c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8496 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 BW;p-= diff --git a/python-ecosystem/mcp-client/service/__pycache__/review_service.cpython-313.pyc b/python-ecosystem/mcp-client/service/__pycache__/review_service.cpython-313.pyc deleted file mode 100644 index 7ada6f89d580829d74b450b42134539b50cbaa17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19035 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 StA1;mxA2F5!_l3U^#1^gbg)|h diff --git a/python-ecosystem/mcp-client/utils/__pycache__/prompt_builder.cpython-313.pyc b/python-ecosystem/mcp-client/utils/__pycache__/prompt_builder.cpython-313.pyc deleted file mode 100644 index e519924d863d16778023ca65d98aa75c6599958e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17129 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 V2v?*n|Fi$Ca7g}diAp}9{{vuJdENj3 diff --git a/python-ecosystem/mcp-client/utils/__pycache__/prompt_logger.cpython-313.pyc b/python-ecosystem/mcp-client/utils/__pycache__/prompt_logger.cpython-313.pyc deleted file mode 100644 index 572e0361814697ce6cc9d81c146833b5e9d03aee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10888 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 diff --git a/python-ecosystem/mcp-client/utils/__pycache__/response_parser.cpython-313.pyc b/python-ecosystem/mcp-client/utils/__pycache__/response_parser.cpython-313.pyc deleted file mode 100644 index ccb137596674432514876e2b68edb86aa8c2d59e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16195 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

YUQK%%Ad1J|+zZT_*UX}K3& zSGs<9AW_}C+6fc?2d5J?^((@kj%y#5PbcbHSH)k|b-=4q@6?R@u{*ju{hyd3J;!3L z$5#dtO*=mvet-B@*Zrn_&;hsaSkZmPZ-2OttK5}5h~z3jw^a1nvBm!6h>o)tsz82! zHi^W@!t%v}ZyptMEp74U1JULKFtqBOpEb3>uBvyYvXg4t2Auj&oh5^u>C=Wq9lHs`=_DKWxJv0W!%-*dZh}Fu$MM_ZABj{)pz^nu_ zr5dpixP=m$5E_YD2Ox@=I!aobSCqW?yO&pW&}Q^9EJAh4ZqPY5thtYOQ92;|#;4$5 z@_7R&NS99i0~9he<&H!yG;`o>Ixm7Y=VPnc91GH3LvBBFjRWpn|gF z7Iv!Ep&G5&!qJO!97F`j|1$pFa!f+Zo|B%Xq84Dg~QQN zZN<__hELU*n(;AiHm$a7^&Xuf@(#nj=-{3?qg&p!T(_!UJ+#^pE$@q*ySSJKVstd2 zNO>ii$SYCXn&_C=;EZ@^$|om8zQxLfpeA*}E9oyrUbRvE}>Ku>98=CZZG8UJTM`o3Oa@H4~33(;Ta+Qb;OC;u4 z3b{lGVs37!ik?Uet1fNk3I7AUD#pu*e@XwEY8I(@or*uEf*6s6|4?vBsfSr`{z(sf z(vlw*fltOtXm?aFDL+BA2kDT|O61!>>A&GVGY$Y}bxjdtRidIMVk~=LDoW~WOxsqr zuNqgqw+16E`=brLP#a9!ZhP-^-!~?$RPWbKsTupaReDb~M;b$LFU8)-1*36G< zqb*0)>07Ejo|2c;_7i%Om1dy(?WWuEoq^le{-%AMy{B4JRr02h4X-!tT`pPYa7$I< zDVdw9>Rj2sI`IA>s_slzce3h-dPDjfo|0D9rP;)<2uTjNRbicOsa|*@Mn~}Un95fH z4{o=Nx5jQa-j;8-{P<#Y_ux8xOSQ*SGDz(o>MKpwRSb#Sonm&o>x~G{MlOs;gz;Yn zA5jJCv`#J6O{J|wsx8aO_2XGFhp*G0GgPX|P#PmVMq1Qk6II~PdMbq*7I_uXQm2Ce111?E2i~s-t diff --git a/python-ecosystem/rag-pipeline/.gitignore b/python-ecosystem/rag-pipeline/.gitignore index d8ba1cca..292e697b 100644 --- a/python-ecosystem/rag-pipeline/.gitignore +++ b/python-ecosystem/rag-pipeline/.gitignore @@ -19,4 +19,5 @@ build/ .vscode/ logs/** +**/__pycache__/ From 9694307ef2892bc7fae9ac0527bb039c630598a5 Mon Sep 17 00:00:00 2001 From: rostislav Date: Fri, 2 Jan 2026 17:35:22 +0200 Subject: [PATCH 2/2] feat: Enhance issue analysis by adding detection info and filtering capabilities in branch issues --- .../core/dto/analysis/issue/IssueDTO.java | 20 +++- .../branch/BranchIssueRepository.java | 8 ++ .../core/service/CodeAnalysisService.java | 4 + .../controller/AnalysisIssueController.java | 9 ++ .../controller/PullRequestController.java | 107 +++++++++++++++--- .../dto/response/AnalysisIssueResponse.java | 8 ++ .../mcp-client/utils/prompt_builder.py | 4 +- 7 files changed, 138 insertions(+), 22 deletions(-) diff --git a/java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/dto/analysis/issue/IssueDTO.java b/java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/dto/analysis/issue/IssueDTO.java index 037abc87..c2733281 100644 --- a/java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/dto/analysis/issue/IssueDTO.java +++ b/java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/dto/analysis/issue/IssueDTO.java @@ -20,12 +20,19 @@ public record IssueDTO ( String pullRequestId, String status, // open|resolved|ignored OffsetDateTime createdAt, - String issueCategory + String issueCategory, + // Detection info - where was this issue first found + Long analysisId, + Long prNumber, + String commitHash, + OffsetDateTime detectedAt ) { public static IssueDTO fromEntity(CodeAnalysisIssue issue) { String categoryStr = issue.getIssueCategory() != null ? issue.getIssueCategory().name() : IssueCategory.CODE_QUALITY.name(); + + var analysis = issue.getAnalysis(); return new IssueDTO( String.valueOf(issue.getId()), categoryStr, @@ -37,11 +44,16 @@ public static IssueDTO fromEntity(CodeAnalysisIssue issue) { issue.getLineNumber(), null, null, - issue.getAnalysis() == null ? null : issue.getAnalysis().getBranchName(), - issue.getAnalysis() == null || issue.getAnalysis().getPrNumber() == null ? null : String.valueOf(issue.getAnalysis().getPrNumber()), + analysis == null ? null : analysis.getBranchName(), + analysis == null || analysis.getPrNumber() == null ? null : String.valueOf(analysis.getPrNumber()), issue.isResolved() ? "resolved" : "open", issue.getCreatedAt(), - categoryStr + categoryStr, + // Detection info + analysis != null ? analysis.getId() : null, + analysis != null ? analysis.getPrNumber() : null, + analysis != null ? analysis.getCommitHash() : null, + issue.getCreatedAt() ); } } diff --git a/java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/persistence/repository/branch/BranchIssueRepository.java b/java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/persistence/repository/branch/BranchIssueRepository.java index 1f935352..50475879 100644 --- a/java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/persistence/repository/branch/BranchIssueRepository.java +++ b/java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/persistence/repository/branch/BranchIssueRepository.java @@ -94,4 +94,12 @@ Page findAllByBranchIdPaged( @Modifying @Query("DELETE FROM BranchIssue bi WHERE bi.branch.id IN (SELECT b.id FROM Branch b WHERE b.project.id = :projectId)") void deleteByProjectId(@Param("projectId") Long projectId); + + // Base query for filtered branch issues - filtering is done in service layer + @Query(value = "SELECT bi FROM BranchIssue bi " + + "JOIN FETCH bi.codeAnalysisIssue cai " + + "WHERE bi.branch.id = :branchId " + + "ORDER BY cai.id DESC", + countQuery = "SELECT COUNT(bi) FROM BranchIssue bi WHERE bi.branch.id = :branchId") + List findAllByBranchIdWithIssues(@Param("branchId") Long branchId); } diff --git a/java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/service/CodeAnalysisService.java b/java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/service/CodeAnalysisService.java index d7fdacf5..2f6dfa6d 100644 --- a/java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/service/CodeAnalysisService.java +++ b/java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/service/CodeAnalysisService.java @@ -176,6 +176,10 @@ public int getMaxAnalysisPrVersion(Long projectId, Long prNumber) { return codeAnalysisRepository.findMaxPrVersion(projectId, prNumber).orElse(0); } + public Optional findAnalysisByProjectAndPrNumberAndVersion(Long projectId, Long prNumber, int prVersion) { + return codeAnalysisRepository.findByProjectIdAndPrNumberAndPrVersion(projectId, prNumber, prVersion); + } + private CodeAnalysisIssue createIssueFromData(Map issueData, String issueKey) { try { CodeAnalysisIssue issue = new CodeAnalysisIssue(); diff --git a/java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/controller/AnalysisIssueController.java b/java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/controller/AnalysisIssueController.java index 66ff4cac..7a161542 100644 --- a/java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/controller/AnalysisIssueController.java +++ b/java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/controller/AnalysisIssueController.java @@ -67,6 +67,15 @@ public ResponseEntity listIssues( if(pullRequestId != null) { maxVersion = codeAnalysisService.getMaxAnalysisPrVersion(project.getId(), Long.parseLong(pullRequestId)); resp.setMaxVersion(maxVersion); + + // Fetch the analysis comment/summary for the specific version + int versionToFetch = prVersion > 0 ? prVersion : maxVersion; + var analysisOpt = codeAnalysisService.findAnalysisByProjectAndPrNumberAndVersion( + project.getId(), + Long.parseLong(pullRequestId), + versionToFetch + ); + analysisOpt.ifPresent(analysis -> resp.setAnalysisSummary(analysis.getComment())); } List issues = analysisService.findIssues(project.getId(), branch, pullRequestId, severity, type, (prVersion > 0 ? prVersion : maxVersion)); List issueDTOs = issues.stream() diff --git a/java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/controller/PullRequestController.java b/java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/controller/PullRequestController.java index fdab9071..00cccb46 100644 --- a/java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/controller/PullRequestController.java +++ b/java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/controller/PullRequestController.java @@ -98,6 +98,11 @@ public ResponseEntity> listBranchIssues( @PathVariable String projectNamespace, @PathVariable String branchName, @RequestParam(required = false, defaultValue = "open") String status, + @RequestParam(required = false) String severity, + @RequestParam(required = false) String category, + @RequestParam(required = false) String filePath, + @RequestParam(required = false) String dateFrom, + @RequestParam(required = false) String dateTo, @RequestParam(required = false, defaultValue = "1") int page, @RequestParam(required = false, defaultValue = "50") int pageSize ) { @@ -114,26 +119,96 @@ public ResponseEntity> listBranchIssues( } Branch branch = branchOpt.get(); - // Use paginated queries from repository - org.springframework.data.domain.Pageable pageable = org.springframework.data.domain.PageRequest.of(page - 1, pageSize); - org.springframework.data.domain.Page branchIssuePage; - long total; + // Normalize filter values + String normalizedStatus = (status == null || status.isBlank()) ? "open" : status.toLowerCase(); + String normalizedSeverity = (severity == null || severity.isBlank() || "ALL".equalsIgnoreCase(severity)) ? null : severity.toUpperCase(); + String normalizedCategory = (category == null || category.isBlank() || "ALL".equalsIgnoreCase(category)) ? null : category.toUpperCase(); + String normalizedFilePath = (filePath == null || filePath.isBlank()) ? null : filePath.toLowerCase(); - if ("all".equalsIgnoreCase(status)) { - branchIssuePage = branchIssueRepository.findAllByBranchIdPaged(branch.getId(), pageable); - total = branchIssueRepository.countAllByBranchId(branch.getId()); - } else if ("resolved".equalsIgnoreCase(status)) { - branchIssuePage = branchIssueRepository.findResolvedByBranchIdPaged(branch.getId(), pageable); - total = branchIssueRepository.countResolvedByBranchId(branch.getId()); - } else { - // Default to "open" (unresolved) - branchIssuePage = branchIssueRepository.findUnresolvedByBranchIdPaged(branch.getId(), pageable); - total = branchIssueRepository.countUnresolvedByBranchId(branch.getId()); + // Parse date filters + java.time.OffsetDateTime parsedDateFrom = null; + java.time.OffsetDateTime parsedDateTo = null; + if (dateFrom != null && !dateFrom.isBlank()) { + try { + parsedDateFrom = java.time.OffsetDateTime.parse(dateFrom); + } catch (Exception e) { + try { + parsedDateFrom = java.time.LocalDate.parse(dateFrom).atStartOfDay().atOffset(java.time.ZoneOffset.UTC); + } catch (Exception ignored) {} + } + } + if (dateTo != null && !dateTo.isBlank()) { + try { + parsedDateTo = java.time.OffsetDateTime.parse(dateTo); + } catch (Exception e) { + try { + parsedDateTo = java.time.LocalDate.parse(dateTo).atTime(23, 59, 59).atOffset(java.time.ZoneOffset.UTC); + } catch (Exception ignored) {} + } } + + //TODO: use SQL instead.... + // Fetch all issues for the branch and filter in Java (avoids complex SQL with nullable params) + List allBranchIssues = branchIssueRepository.findAllByBranchIdWithIssues(branch.getId()); + + // Apply filters in Java + final java.time.OffsetDateTime finalDateFrom = parsedDateFrom; + final java.time.OffsetDateTime finalDateTo = parsedDateTo; - List pagedIssues = branchIssuePage.getContent().stream() + List filteredIssues = allBranchIssues.stream() + .filter(bi -> { + // Status filter + if ("open".equals(normalizedStatus) && bi.isResolved()) return false; + if ("resolved".equals(normalizedStatus) && !bi.isResolved()) return false; + // "all" passes everything + + var issue = bi.getCodeAnalysisIssue(); + if (issue == null) return false; + + // Severity filter + if (normalizedSeverity != null) { + if (issue.getSeverity() == null) return false; + if (!normalizedSeverity.equals(issue.getSeverity().name())) return false; + } + + // Category filter + if (normalizedCategory != null) { + if (issue.getIssueCategory() == null) return false; + if (!normalizedCategory.equals(issue.getIssueCategory().name())) return false; + } + + // File path filter (partial match, case insensitive) + if (normalizedFilePath != null) { + if (issue.getFilePath() == null) return false; + if (!issue.getFilePath().toLowerCase().contains(normalizedFilePath)) return false; + } + + // Date from filter + if (finalDateFrom != null && issue.getCreatedAt() != null) { + if (issue.getCreatedAt().isBefore(finalDateFrom)) return false; + } + + // Date to filter + if (finalDateTo != null && issue.getCreatedAt() != null) { + if (issue.getCreatedAt().isAfter(finalDateTo)) return false; + } + + return true; + }) + .sorted((a, b) -> Long.compare(b.getCodeAnalysisIssue().getId(), a.getCodeAnalysisIssue().getId())) + .toList(); + + long total = filteredIssues.size(); + + // Apply pagination + int startIndex = (page - 1) * pageSize; + int endIndex = Math.min(startIndex + pageSize, filteredIssues.size()); + + List pagedIssues = (startIndex < filteredIssues.size()) + ? filteredIssues.subList(startIndex, endIndex).stream() .map(bi -> IssueDTO.fromEntity(bi.getCodeAnalysisIssue())) - .toList(); + .toList() + : List.of(); Map response = new HashMap<>(); response.put("issues", pagedIssues); diff --git a/java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/dto/response/AnalysisIssueResponse.java b/java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/dto/response/AnalysisIssueResponse.java index 37f28300..e375afa9 100644 --- a/java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/dto/response/AnalysisIssueResponse.java +++ b/java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/dto/response/AnalysisIssueResponse.java @@ -10,6 +10,7 @@ public class AnalysisIssueResponse { private List issues = new ArrayList<>(); private IssuesSummaryDTO summary = new IssuesSummaryDTO(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); private int maxVersion; + private String analysisSummary; // The comment/summary from the CodeAnalysis public AnalysisIssueResponse() { } @@ -34,4 +35,11 @@ public int getMaxVersion() { public void setMaxVersion(int maxVersion) { this.maxVersion = maxVersion; } + + public String getAnalysisSummary() { + return analysisSummary; + } + public void setAnalysisSummary(String analysisSummary) { + this.analysisSummary = analysisSummary; + } } diff --git a/python-ecosystem/mcp-client/utils/prompt_builder.py b/python-ecosystem/mcp-client/utils/prompt_builder.py index fb7be5e0..724829eb 100644 --- a/python-ecosystem/mcp-client/utils/prompt_builder.py +++ b/python-ecosystem/mcp-client/utils/prompt_builder.py @@ -228,7 +228,7 @@ def build_first_review_prompt( - Do NOT include any "id" field in issues - it will be assigned by the system - Each issue MUST have: severity, category, file, line, reason, isResolved - REQUIRED FOR ALL ISSUES: Include "suggestedFixDescription" AND "suggestedFixDiff" with actual code fix in unified diff format -- The suggestedFixDiff must show the exact code change to fix the issue - this is MANDATORY, not optional +- The suggestedFixDiff must show the exact code change to fix the issue If no issues are found, return: {{ @@ -351,7 +351,7 @@ def build_review_prompt_with_previous_analysis_data( - Do NOT include any "id" field in issues - it will be assigned by the system - Each issue MUST have: severity, category, file, line, reason, isResolved - REQUIRED FOR ALL ISSUES: Include "suggestedFixDescription" AND "suggestedFixDiff" with actual code fix in unified diff format -- The suggestedFixDiff must show the exact code change to fix the issue - this is MANDATORY, not optional +- The suggestedFixDiff must show the exact code change to fix the issue If no issues are found, return: {{