From 716bd801f252e88cca69954b4c8631e3c8df534f Mon Sep 17 00:00:00 2001 From: Gutierrez Soto Jhosepmyr Orlando Date: Mon, 12 Oct 2026 19:54:30 -0500 Subject: [PATCH] feat(workspace): expose Jira project description and GitHub repository language Closes #145 --- CHANGELOG.md | 3 +++ .../reqsai/codebase/application/port/GitHubAppPort.java | 3 ++- .../codebase/infrastructure/github/GitHubAppAdapter.java | 3 ++- .../rest/dto/response/GitHubRepositoryResponse.java | 2 ++ .../interfaces/rest/mappers/GitHubResponseMapper.java | 2 +- .../reqsai/gateway/application/port/IntegrationProvider.java | 2 +- .../kntro/reqsai/gateway/infrastructure/jira/JiraClient.java | 5 +++-- .../reqsai/gateway/infrastructure/jira/JiraProvider.java | 2 +- .../interfaces/rest/dto/response/JiraProjectResponse.java | 3 ++- .../rest/mappers/response/IntegrationResponseMapper.java | 2 +- .../java/com/kntro/reqsai/gateway/StubJiraOAuthConfig.java | 2 +- .../com/kntro/reqsai/gateway/StubJiraProviderConfig.java | 2 +- 12 files changed, 20 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39ffd4e2..8c7d4c94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ follows [Semantic Versioning](https://semver.org/). ## [Unreleased] +### Added (Source profile data — `feature/145-source-profile`, #145) +- `GET .../integrations/{connectionId}/jira/projects` returns each project's `description` and `GET .../code/github/repositories` each repository's `language`, so the create-project wizard can fill the project's profile from the chosen sources. + ## [1.4.0] - 2026-10-12 ### Added (Share a session — `feature/137-session-share-link`, #137) diff --git a/src/main/java/com/kntro/reqsai/codebase/application/port/GitHubAppPort.java b/src/main/java/com/kntro/reqsai/codebase/application/port/GitHubAppPort.java index 86cf7285..4f8562a7 100644 --- a/src/main/java/com/kntro/reqsai/codebase/application/port/GitHubAppPort.java +++ b/src/main/java/com/kntro/reqsai/codebase/application/port/GitHubAppPort.java @@ -42,6 +42,7 @@ record Installation(long id, String accountLogin, String accountType, @Nullable } record AppRepository(String owner, String name, String defaultBranch, String htmlUrl, boolean isPrivate, - @Nullable String description, @Nullable Instant pushedAt) { + @Nullable String description, @Nullable Instant pushedAt, + @Nullable String language) { } } diff --git a/src/main/java/com/kntro/reqsai/codebase/infrastructure/github/GitHubAppAdapter.java b/src/main/java/com/kntro/reqsai/codebase/infrastructure/github/GitHubAppAdapter.java index f53787a5..bb61d87f 100644 --- a/src/main/java/com/kntro/reqsai/codebase/infrastructure/github/GitHubAppAdapter.java +++ b/src/main/java/com/kntro/reqsai/codebase/infrastructure/github/GitHubAppAdapter.java @@ -172,7 +172,8 @@ public List repositories(long installationId) { repo.path("html_url").asString(props.webUrl + "/" + owner + "/" + name), repo.path("private").asBoolean(false), text(repo.path("description")), - instant(repo.path("pushed_at")))); + instant(repo.path("pushed_at")), + text(repo.path("language")))); } if (items.size() < PAGE_SIZE) break; } diff --git a/src/main/java/com/kntro/reqsai/codebase/interfaces/rest/dto/response/GitHubRepositoryResponse.java b/src/main/java/com/kntro/reqsai/codebase/interfaces/rest/dto/response/GitHubRepositoryResponse.java index 0ca6f101..a64c2abb 100644 --- a/src/main/java/com/kntro/reqsai/codebase/interfaces/rest/dto/response/GitHubRepositoryResponse.java +++ b/src/main/java/com/kntro/reqsai/codebase/interfaces/rest/dto/response/GitHubRepositoryResponse.java @@ -17,6 +17,8 @@ public record GitHubRepositoryResponse( @JsonProperty("private") @Schema(name = "private") boolean isPrivate, @Schema(nullable = true) @Nullable String description, @Schema(nullable = true) @Nullable Instant pushedAt, + @Schema(description = "Main language GitHub reports for it", example = "Java", nullable = true) + @Nullable String language, @Schema(description = "Whether the project already reads it") boolean connected ) { } diff --git a/src/main/java/com/kntro/reqsai/codebase/interfaces/rest/mappers/GitHubResponseMapper.java b/src/main/java/com/kntro/reqsai/codebase/interfaces/rest/mappers/GitHubResponseMapper.java index 8c669e14..e0e992b5 100644 --- a/src/main/java/com/kntro/reqsai/codebase/interfaces/rest/mappers/GitHubResponseMapper.java +++ b/src/main/java/com/kntro/reqsai/codebase/interfaces/rest/mappers/GitHubResponseMapper.java @@ -36,6 +36,6 @@ public static GitHubRepositoryResponse toResponse(AvailableRepository available) var repo = available.repository(); return new GitHubRepositoryResponse(available.installationId(), repo.owner(), repo.name(), repo.owner() + "/" + repo.name(), repo.defaultBranch(), repo.htmlUrl(), repo.isPrivate(), - repo.description(), repo.pushedAt(), available.connected()); + repo.description(), repo.pushedAt(), repo.language(), available.connected()); } } diff --git a/src/main/java/com/kntro/reqsai/gateway/application/port/IntegrationProvider.java b/src/main/java/com/kntro/reqsai/gateway/application/port/IntegrationProvider.java index d2e71c20..d4a09f71 100644 --- a/src/main/java/com/kntro/reqsai/gateway/application/port/IntegrationProvider.java +++ b/src/main/java/com/kntro/reqsai/gateway/application/port/IntegrationProvider.java @@ -65,7 +65,7 @@ public static ProviderCredentials oauth(String siteUrl, String cloudId, String a } /** A remote project ({key,name}). */ - record RemoteProject(String key, String name) {} + record RemoteProject(String key, String name, @Nullable String description) {} /** A remote issue type ({id,name}). */ record RemoteIssueType(String id, String name) {} diff --git a/src/main/java/com/kntro/reqsai/gateway/infrastructure/jira/JiraClient.java b/src/main/java/com/kntro/reqsai/gateway/infrastructure/jira/JiraClient.java index 70aaffda..6ac89a9d 100644 --- a/src/main/java/com/kntro/reqsai/gateway/infrastructure/jira/JiraClient.java +++ b/src/main/java/com/kntro/reqsai/gateway/infrastructure/jira/JiraClient.java @@ -1,5 +1,6 @@ package com.kntro.reqsai.gateway.infrastructure.jira; +import org.jspecify.annotations.Nullable; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -97,7 +98,7 @@ public String verify(JiraApiContext ctx) { /** GET /project/search → visible projects. */ public List listProjects(JiraApiContext ctx) { ProjectSearch search = exchange(() -> restClient.get() - .uri(ctx.apiBase() + "/project/search?maxResults=100") + .uri(ctx.apiBase() + "/project/search?expand=description&maxResults=100") .header("Authorization", ctx.authHeader()) .accept(MediaType.APPLICATION_JSON) .retrieve() @@ -358,7 +359,7 @@ private T exchange(java.util.function.Supplier call, String op) { private record Myself(String displayName) {} @JsonIgnoreProperties(ignoreUnknown = true) - public record JiraProject(String key, String name) {} + public record JiraProject(String key, String name, @Nullable String description) {} @JsonIgnoreProperties(ignoreUnknown = true) private record ProjectSearch(List values) {} diff --git a/src/main/java/com/kntro/reqsai/gateway/infrastructure/jira/JiraProvider.java b/src/main/java/com/kntro/reqsai/gateway/infrastructure/jira/JiraProvider.java index 3f6d5d8b..a19161dd 100644 --- a/src/main/java/com/kntro/reqsai/gateway/infrastructure/jira/JiraProvider.java +++ b/src/main/java/com/kntro/reqsai/gateway/infrastructure/jira/JiraProvider.java @@ -39,7 +39,7 @@ public String verify(ProviderCredentials c) { @Override public List listProjects(ProviderCredentials c) { return jira.listProjects(contextFor(c)).stream() - .map(p -> new RemoteProject(p.key(), p.name())) + .map(p -> new RemoteProject(p.key(), p.name(), p.description())) .toList(); } diff --git a/src/main/java/com/kntro/reqsai/gateway/interfaces/rest/dto/response/JiraProjectResponse.java b/src/main/java/com/kntro/reqsai/gateway/interfaces/rest/dto/response/JiraProjectResponse.java index 18190f4a..c91525a4 100644 --- a/src/main/java/com/kntro/reqsai/gateway/interfaces/rest/dto/response/JiraProjectResponse.java +++ b/src/main/java/com/kntro/reqsai/gateway/interfaces/rest/dto/response/JiraProjectResponse.java @@ -1,7 +1,8 @@ package com.kntro.reqsai.gateway.interfaces.rest.dto.response; import io.swagger.v3.oas.annotations.media.Schema; +import org.jspecify.annotations.Nullable; /** A selectable Jira project. */ @Schema(description = "A Jira project visible to the connection") -public record JiraProjectResponse(String key, String name) {} +public record JiraProjectResponse(String key, String name, @Nullable String description) {} diff --git a/src/main/java/com/kntro/reqsai/gateway/interfaces/rest/mappers/response/IntegrationResponseMapper.java b/src/main/java/com/kntro/reqsai/gateway/interfaces/rest/mappers/response/IntegrationResponseMapper.java index 94f2fa54..fd42ec9f 100644 --- a/src/main/java/com/kntro/reqsai/gateway/interfaces/rest/mappers/response/IntegrationResponseMapper.java +++ b/src/main/java/com/kntro/reqsai/gateway/interfaces/rest/mappers/response/IntegrationResponseMapper.java @@ -45,7 +45,7 @@ public static ConnectionTestResponse toResponse(ConnectionTestResult r) { } public static JiraProjectResponse toResponse(RemoteProject p) { - return new JiraProjectResponse(p.key(), p.name()); + return new JiraProjectResponse(p.key(), p.name(), p.description()); } public static JiraIssueTypeResponse toResponse(RemoteIssueType t) { diff --git a/src/test/java/com/kntro/reqsai/gateway/StubJiraOAuthConfig.java b/src/test/java/com/kntro/reqsai/gateway/StubJiraOAuthConfig.java index 65d50b14..616ab6ab 100644 --- a/src/test/java/com/kntro/reqsai/gateway/StubJiraOAuthConfig.java +++ b/src/test/java/com/kntro/reqsai/gateway/StubJiraOAuthConfig.java @@ -38,7 +38,7 @@ public String verify(JiraApiContext ctx) { @Override public List listProjects(JiraApiContext ctx) { apiBases.add(ctx.apiBase()); - return List.of(new JiraProject("PAY", "Payments")); + return List.of(new JiraProject("PAY", "Payments", "Pagos y cobros")); } @Override diff --git a/src/test/java/com/kntro/reqsai/gateway/StubJiraProviderConfig.java b/src/test/java/com/kntro/reqsai/gateway/StubJiraProviderConfig.java index c3fe8a40..18c68c7b 100644 --- a/src/test/java/com/kntro/reqsai/gateway/StubJiraProviderConfig.java +++ b/src/test/java/com/kntro/reqsai/gateway/StubJiraProviderConfig.java @@ -36,7 +36,7 @@ public String verify(ProviderCredentials credentials) { @Override public List listProjects(ProviderCredentials credentials) { - return List.of(new RemoteProject("PAY", "Payments")); + return List.of(new RemoteProject("PAY", "Payments", "Pagos y cobros")); } @Override