From a3357d90e5fb1e3b1b57256a0c56a6c0342c565b Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:18 +0000 Subject: [PATCH 01/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../external/service/RestProxyService.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/openframe-external-api-service-core/src/main/java/com/openframe/external/service/RestProxyService.java b/openframe-external-api-service-core/src/main/java/com/openframe/external/service/RestProxyService.java index e0bd547a6..2630e9c77 100644 --- a/openframe-external-api-service-core/src/main/java/com/openframe/external/service/RestProxyService.java +++ b/openframe-external-api-service-core/src/main/java/com/openframe/external/service/RestProxyService.java @@ -66,7 +66,7 @@ public ResponseEntity proxyApiRequest(String toolId, HttpServletRequest } IntegratedTool tool = toolOpt.get(); - log.info("Found tool: {} (enabled: {})", tool.getName(), tool.isEnabled()); + log.debug("Found tool: {} (enabled: {})", tool.getName(), tool.isEnabled()); if (!tool.isEnabled()) { log.warn("Tool {} is not enabled", tool.getName()); @@ -78,7 +78,7 @@ public ResponseEntity proxyApiRequest(String toolId, HttpServletRequest if (request.getQueryString() != null) { originalUri = new URI(originalUri + "?" + request.getQueryString()); } - log.info("Original URI: {}", originalUri); + log.debug("Original URI: {}", originalUri); Optional optionalToolUrl = toolUrlService.getUrlByToolType(tool, ToolUrlType.API); if (optionalToolUrl.isEmpty()) { @@ -86,10 +86,10 @@ public ResponseEntity proxyApiRequest(String toolId, HttpServletRequest return ResponseEntity.badRequest().body("Tool URL not found for tool: " + toolId); } ToolUrl toolUrl = optionalToolUrl.get(); - log.info("Tool URL: {}", toolUrl.getUrl()); + log.debug("Tool URL: {}", toolUrl.getUrl()); URI targetUri = proxyUrlResolver.resolve(toolId, toolUrl.getUrl(), toolUrl.getPort(), originalUri, "/tools"); - log.info("Target URI resolved to: {}", targetUri); + log.debug("Target URI resolved to: {}", targetUri); String method = request.getMethod(); Map headers = buildApiRequestHeaders(tool); @@ -98,10 +98,10 @@ public ResponseEntity proxyApiRequest(String toolId, HttpServletRequest } catch (URISyntaxException e) { log.error("Invalid URI syntax for tool: {}", toolId, e); - return ResponseEntity.badRequest().body("Invalid URI: " + e.getMessage()); + return ResponseEntity.badRequest().body("Invalid request URI"); } catch (Exception e) { log.error("Error proxying request for tool: {}", toolId, e); - return ResponseEntity.internalServerError().body("Internal server error: " + e.getMessage()); + return ResponseEntity.internalServerError().body("Internal server error"); } } @@ -114,7 +114,7 @@ Map buildApiRequestHeaders(IntegratedTool tool) { CredentialHeader credential = credentialHeader(tool.getCredentials()); if (credential != null) { - headers.put(credential.name(), credential.value()); + headers.put(credential.getName(), credential.getValue()); } return headers; @@ -139,7 +139,7 @@ private ResponseEntity proxy(IntegratedTool tool, URI targetUri, String httpRequest.setEntity(entity); } - log.info("Executing HTTP request to {}", targetUri); + log.debug("Executing HTTP request to {}", targetUri); return httpClient.execute(httpRequest, response -> { int statusCode = response.getCode(); @@ -154,10 +154,10 @@ private ResponseEntity proxy(IntegratedTool tool, URI targetUri, String } catch (IOException e) { log.error("IOException while proxying request to {} at {}: {}", tool.getName(), targetUri, e.getMessage(), e); - return ResponseEntity.internalServerError().body("Proxy error: " + e.getMessage()); + return ResponseEntity.internalServerError().body("Proxy error"); } catch (Exception e) { log.error("Unexpected error proxying request to {} at {}: {}", tool.getName(), targetUri, e.getMessage(), e); - return ResponseEntity.internalServerError().body("Unexpected error: " + e.getMessage()); + return ResponseEntity.internalServerError().body("Unexpected error"); } } @@ -167,7 +167,7 @@ Map maskCredential(Map headers, ToolCredentials return headers; } Map masked = new HashMap<>(); - headers.forEach((name, value) -> masked.put(name, name.equalsIgnoreCase(credential.name()) ? MASKED_VALUE : value)); + headers.forEach((name, value) -> masked.put(name, name.equalsIgnoreCase(credential.getName()) ? MASKED_VALUE : value)); return masked; } @@ -183,7 +183,11 @@ private CredentialHeader credentialHeader(ToolCredentials credentials) { }; } - private record CredentialHeader(String name, String value) { + @lombok.Getter + @lombok.AllArgsConstructor + private static class CredentialHeader { + private final String name; + private final String value; } private HttpUriRequestBase createHttpRequest(String method, URI uri) { From 0736d42d843b7cf8f45c581bd2974e6f25d75ec7 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:19 +0000 Subject: [PATCH 02/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../service/rmm/ScriptDeliveryRetryStore.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/openframe-client-core/src/main/java/com/openframe/client/service/rmm/ScriptDeliveryRetryStore.java b/openframe-client-core/src/main/java/com/openframe/client/service/rmm/ScriptDeliveryRetryStore.java index 742b8d768..1f1a53be9 100644 --- a/openframe-client-core/src/main/java/com/openframe/client/service/rmm/ScriptDeliveryRetryStore.java +++ b/openframe-client-core/src/main/java/com/openframe/client/service/rmm/ScriptDeliveryRetryStore.java @@ -4,6 +4,8 @@ import com.openframe.data.document.rmm.script.DeliveryChannel; import com.openframe.data.document.rmm.script.ScriptDeliveryRetry; import com.openframe.data.repository.rmm.ScriptDeliveryRetryRepository; +import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -27,8 +29,8 @@ public void store(String executionId, String machineId, DeliveryChannel channel, try { write(executionId, machineId, 0, channel, objectMapper.writeValueAsString(message)); } catch (Exception e) { - log.warn("Failed to serialize retry-state executionId={} machineId={} channel={}: {}", - executionId, machineId, channel, e.getMessage()); + log.warn("Failed to serialize retry-state executionId={} machineId={} channel={}", + executionId, machineId, channel, e); } } @@ -37,8 +39,8 @@ public Optional get(String executionId, String machineId) { } public int incrementRetryCount(String executionId, String machineId, RetryState current) { - int next = current.retryCount() + 1; - write(executionId, machineId, next, current.channel(), current.messageJson()); + int next = current.getRetryCount() + 1; + write(executionId, machineId, next, current.getChannel(), current.getMessageJson()); return next; } @@ -58,7 +60,7 @@ private void write(String executionId, String machineId, int retryCount, Deliver .expiresAt(Instant.now().plusSeconds(ttlSeconds)) .build()); } catch (Exception e) { - log.warn("Failed to write retry-state executionId={} machineId={}: {}", executionId, machineId, e.getMessage()); + log.warn("Failed to write retry-state executionId={} machineId={}", executionId, machineId, e); } } @@ -71,5 +73,11 @@ private static String id(String executionId, String machineId) { return executionId + ":" + machineId; } - public record RetryState(int retryCount, DeliveryChannel channel, String messageJson) {} + @Getter + @AllArgsConstructor + public static class RetryState { + private final int retryCount; + private final DeliveryChannel channel; + private final String messageJson; + } } From bac485b3ce62974cf74980598aa935261e78672b Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:20 +0000 Subject: [PATCH 03/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../oauth/controller/OAuthBffController.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/openframe-security-oauth/src/main/java/com/openframe/security/oauth/controller/OAuthBffController.java b/openframe-security-oauth/src/main/java/com/openframe/security/oauth/controller/OAuthBffController.java index c67d1c3f5..14af70072 100644 --- a/openframe-security-oauth/src/main/java/com/openframe/security/oauth/controller/OAuthBffController.java +++ b/openframe-security-oauth/src/main/java/com/openframe/security/oauth/controller/OAuthBffController.java @@ -195,7 +195,7 @@ public Mono> appleNativeExchange(@RequestBody AppleNative .onErrorResume(AppleNativeRegistrationRequiredException.class, e -> Mono.just(ResponseEntity.status(409).body(Map.of("error", "registration_required")))) .onErrorResume(e -> { - log.warn("Apple native exchange failed: {}", e.getMessage()); + log.warn("Apple native exchange failed: {}", e.getMessage(), e); return Mono.just(ResponseEntity.status(401).build()); }); } @@ -228,18 +228,21 @@ public Mono> appleNativeRegister(@RequestBody AppleNative .onErrorResume(IllegalArgumentException.class, e -> Mono.just(ResponseEntity.badRequest().body(Map.of("error", e.getMessage())))) .onErrorResume(e -> { - log.warn("Apple native registration failed: {}", e.getMessage()); + log.warn("Apple native registration failed: {}", e.getMessage(), e); return Mono.just(ResponseEntity.status(401).build()); }); } - public record AppleNativeRegisterRequest(String identityToken, - String authorizationCode, - String nonce, - String firstName, - String lastName, - String tenantName, - String tenantDomain) { + @lombok.Getter + @lombok.AllArgsConstructor + public static class AppleNativeRegisterRequest { + private final String identityToken; + private final String authorizationCode; + private final String nonce; + private final String firstName; + private final String lastName; + private final String tenantName; + private final String tenantDomain; } /** From 96407693c75416010c12b695c84640705772a741 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:21 +0000 Subject: [PATCH 04/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../authz/controller/SsoJoinController.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/openframe-authorization-service-core/src/main/java/com/openframe/authz/controller/SsoJoinController.java b/openframe-authorization-service-core/src/main/java/com/openframe/authz/controller/SsoJoinController.java index 379e408c5..67581d629 100644 --- a/openframe-authorization-service-core/src/main/java/com/openframe/authz/controller/SsoJoinController.java +++ b/openframe-authorization-service-core/src/main/java/com/openframe/authz/controller/SsoJoinController.java @@ -16,6 +16,8 @@ import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; @@ -60,12 +62,16 @@ public class SsoJoinController { private final SsoOidcUserService ssoOidcUserService; private final TenantService tenantService; - public record JoinPendingResponse(String email, - String firstName, - String lastName, - String provider, - String tenantName, - List roles) {} + @Getter + @AllArgsConstructor + public static class JoinPendingResponse { + private final String email; + private final String firstName; + private final String lastName; + private final String provider; + private final String tenantName; + private final List roles; + } @GetMapping("/pending") public JoinPendingResponse pending(Authentication authentication, HttpServletRequest request) { @@ -106,9 +112,7 @@ public void complete(@RequestParam(value = "agreeTerms", defaultValue = "false") HttpServletRequest request, HttpServletResponse response) throws IOException { OidcUser user = requireSessionOidcUser(authentication); - if (!agreeTerms) { - throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "terms_not_accepted"); - } + requireTermsAgreed(agreeTerms); String[] names = OidcUserUtils.resolveNames(user); String provider = SsoAuthentication.registrationId(authentication); @@ -158,6 +162,12 @@ private void requireInviteBoundToSession(HttpServletRequest request, String invi } } + private void requireTermsAgreed(boolean agreeTerms) { + if (!agreeTerms) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "terms_not_accepted"); + } + } + private String tenantName(String tenantId) { return tenantService.findById(tenantId).map(Tenant::getName).orElse(""); } From 025890d9ec53d9a282edeb2914ac5d306fff9701 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:22 +0000 Subject: [PATCH 05/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../service/sso/SignupTicketExpiredException.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 openframe-authorization-service-core/src/main/java/com/openframe/authz/service/sso/SignupTicketExpiredException.java diff --git a/openframe-authorization-service-core/src/main/java/com/openframe/authz/service/sso/SignupTicketExpiredException.java b/openframe-authorization-service-core/src/main/java/com/openframe/authz/service/sso/SignupTicketExpiredException.java new file mode 100644 index 000000000..80ecdae15 --- /dev/null +++ b/openframe-authorization-service-core/src/main/java/com/openframe/authz/service/sso/SignupTicketExpiredException.java @@ -0,0 +1,12 @@ +package com.openframe.authz.service.sso; + +/** + * Thrown when a signup ticket cannot be found or has expired in Redis, indicating the + * pending signup session is no longer valid and the user must restart the flow. + */ +public class SignupTicketExpiredException extends RuntimeException { + + public SignupTicketExpiredException(String message) { + super(message); + } +} From c79adbb499dcb2b630b89a0e6f149411350589b1 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:23 +0000 Subject: [PATCH 06/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../service/sso/SignupTicketService.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/openframe-authorization-service-core/src/main/java/com/openframe/authz/service/sso/SignupTicketService.java b/openframe-authorization-service-core/src/main/java/com/openframe/authz/service/sso/SignupTicketService.java index 9dd221111..d0025bfba 100644 --- a/openframe-authorization-service-core/src/main/java/com/openframe/authz/service/sso/SignupTicketService.java +++ b/openframe-authorization-service-core/src/main/java/com/openframe/authz/service/sso/SignupTicketService.java @@ -2,6 +2,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.openframe.data.redis.OpenframeRedisKeyBuilder; +import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; @@ -32,14 +34,17 @@ public class SignupTicketService { private final OpenframeRedisKeyBuilder keyBuilder; private final ObjectMapper objectMapper; - public record SignupTicketPayload(String email, - String firstName, - String lastName, - String provider, - boolean emailVerified, - String subject, - String userId, - String tenantId) { + @Getter + @AllArgsConstructor + public static class SignupTicketPayload { + private final String email; + private final String firstName; + private final String lastName; + private final String provider; + private final boolean emailVerified; + private final String subject; + private final String userId; + private final String tenantId; public boolean bound() { return userId != null && tenantId != null; @@ -65,13 +70,13 @@ public void bind(String ticket, String userId, String tenantId) { String k = key(ticket); Optional current = decode(redisTemplate.opsForValue().get(k)); if (current.isEmpty()) { - throw new IllegalStateException("Signup session expired. Please sign in again."); + throw new SignupTicketExpiredException("Signup session expired. Please sign in again."); } SignupTicketPayload p = current.get(); Long remaining = redisTemplate.getExpire(k); Duration ttl = remaining != null && remaining > 0 ? Duration.ofSeconds(remaining) : TTL; - write(ticket, new SignupTicketPayload(p.email(), p.firstName(), p.lastName(), p.provider(), - p.emailVerified(), p.subject(), userId, tenantId), ttl); + write(ticket, new SignupTicketPayload(p.getEmail(), p.getFirstName(), p.getLastName(), p.getProvider(), + p.isEmailVerified(), p.getSubject(), userId, tenantId), ttl); } /** Atomic single use — the token mint, and only it, calls this. */ From 1f125e5276f09a86ac0bc69edf99f4addd81b310 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:24 +0000 Subject: [PATCH 07/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../openframe/api/mapper/OrganizationMapper.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/openframe-api-lib/src/main/java/com/openframe/api/mapper/OrganizationMapper.java b/openframe-api-lib/src/main/java/com/openframe/api/mapper/OrganizationMapper.java index a3d05fb7a..501db0757 100644 --- a/openframe-api-lib/src/main/java/com/openframe/api/mapper/OrganizationMapper.java +++ b/openframe-api-lib/src/main/java/com/openframe/api/mapper/OrganizationMapper.java @@ -20,7 +20,7 @@ public class OrganizationMapper { */ public Organization toEntity(CreateOrganizationRequest request) { if (request == null) { - return null; + throw new IllegalArgumentException("request must not be null"); } return Organization.builder() @@ -52,6 +52,9 @@ private String generateOrganizationId() { * Note: organizationId cannot be updated - it's immutable once created. */ public Organization updateEntity(Organization existing, UpdateOrganizationRequest request) { + if (existing == null) { + throw new IllegalArgumentException("existing must not be null"); + } if (request == null) { return existing; } @@ -93,7 +96,7 @@ public Organization updateEntity(Organization existing, UpdateOrganizationReques */ public OrganizationResponse toResponse(Organization organization) { if (organization == null) { - return null; + throw new IllegalArgumentException("organization must not be null"); } return OrganizationResponse.builder() @@ -121,7 +124,7 @@ public OrganizationResponse toResponse(Organization organization) { private ContactInformation toContactInformationEntity(ContactInformationDto dto) { if (dto == null) { - return null; + return ContactInformation.builder().build(); } Address physicalAddress = toAddressEntity(dto.physicalAddress()); @@ -146,7 +149,7 @@ private ContactInformation toContactInformationEntity(ContactInformationDto dto) private ContactPerson toContactPersonEntity(ContactPersonDto dto) { if (dto == null) { - return null; + return ContactPerson.builder().build(); } return ContactPerson.builder() @@ -174,7 +177,7 @@ private Address toAddressEntity(AddressDto dto) { private ContactInformationDto toContactInformationDto(ContactInformation entity) { if (entity == null) { - return null; + return ContactInformationDto.builder().build(); } return ContactInformationDto.builder() @@ -189,7 +192,7 @@ private ContactInformationDto toContactInformationDto(ContactInformation entity) private ContactPersonDto toContactPersonDto(ContactPerson entity) { if (entity == null) { - return null; + return ContactPersonDto.builder().build(); } return ContactPersonDto.builder() From a34b10d6e6b05759512bdafbc9934c721f2df35a Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:25 +0000 Subject: [PATCH 08/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../NotificationReadStateService.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/openframe-notification-core/src/main/java/com/openframe/notification/readstate/NotificationReadStateService.java b/openframe-notification-core/src/main/java/com/openframe/notification/readstate/NotificationReadStateService.java index d91774fb5..73e5d62f4 100644 --- a/openframe-notification-core/src/main/java/com/openframe/notification/readstate/NotificationReadStateService.java +++ b/openframe-notification-core/src/main/java/com/openframe/notification/readstate/NotificationReadStateService.java @@ -112,7 +112,24 @@ public long dismissForAllRecipients(@NotBlank String notificationId) { List unreadRows = repository.findByNotificationId(notificationId).stream() .filter(row -> row.getStatus() == ReadStatus.UNREAD) .toList(); - long flipped = repository.markAllRecipientsRead(notificationId); + if (unreadRows.isEmpty()) { + return 0L; + } + // Flip the snapshot, not "everything unread": constrain the update to the exact rows we + // are about to notify, so a row that becomes unread concurrently is left untouched instead + // of being silently flipped to read without a corresponding published event. + Map> recipientIdsByType = new EnumMap<>(RecipientType.class); + for (NotificationReadState row : unreadRows) { + recipientIdsByType + .computeIfAbsent(row.getRecipientType(), key -> new ArrayList<>()) + .add(row.getRecipientId()); + } + String tenantId = tenantIdProvider.getTenantId(); + long flipped = 0L; + for (Map.Entry> entry : recipientIdsByType.entrySet()) { + flipped += repository.markAsReadByRecipientIds( + tenantId, entry.getValue(), entry.getKey(), notificationId); + } for (NotificationReadState row : unreadRows) { publish(row.getRecipientId(), row.getRecipientType(), List.of(notificationId), NotificationReadEvent.Transition.READ); @@ -147,8 +164,8 @@ public Map unreadCountsByCategory(@NotBlank String r List rows = repository.unreadCountsByCategory(recipientId, recipientType, tenantIdProvider.getTenantId()); Map counts = new EnumMap<>(NotificationCategory.class); for (CategoryCount row : rows) { - if (row.category() != null) { - counts.put(row.category(), row.count()); + if (row.getCategory() != null) { + counts.put(row.getCategory(), row.getCount()); } } return counts; @@ -178,9 +195,9 @@ public Map unreadCountsByEntity(@NotBlank String recipientId, private Map countsById(List rows) { Map counts = new HashMap<>(rows.size()); for (EntityCount row : rows) { - String entityId = row.entityId(); + String entityId = row.getEntityId(); if (entityId != null) { - counts.put(entityId, row.count()); + counts.put(entityId, row.getCount()); } } return counts; From cc718e66c6b1086c1c7d947a33d4439924ac31c3 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:26 +0000 Subject: [PATCH 09/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../external/dto/ticket/TicketNoteRequest.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/TicketNoteRequest.java b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/TicketNoteRequest.java index 93c028368..ce2c192f9 100644 --- a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/TicketNoteRequest.java +++ b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/TicketNoteRequest.java @@ -3,12 +3,17 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; @Schema(description = "Ticket note content") -public record TicketNoteRequest( - @NotBlank(message = "Content is required") - @Size(max = 5000) - @Schema(description = "Note content", requiredMode = Schema.RequiredMode.REQUIRED) - String content -) { +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class TicketNoteRequest { + @NotBlank(message = "Content is required") + @Size(max = 5000) + @Schema(description = "Note content", requiredMode = Schema.RequiredMode.REQUIRED) + private String content; } From e891805011bfde400cd3f28fbd39b0de972c1b1b Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:27 +0000 Subject: [PATCH 10/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../external/dto/audit/CustomerFilterResponse.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/audit/CustomerFilterResponse.java b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/audit/CustomerFilterResponse.java index ee6022831..0214971c9 100644 --- a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/audit/CustomerFilterResponse.java +++ b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/audit/CustomerFilterResponse.java @@ -1,10 +1,15 @@ package com.openframe.external.dto.audit; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Getter; @Schema(description = "Customer filter option with id and name") -public record CustomerFilterResponse( - @Schema(description = "Customer id (for filtering)", example = "0b0f9f3a-9c1d-4a5e-9d55-8c9a2f6f1e42") String id, - @Schema(description = "Customer name (for display)", example = "Acme Corporation") String name -) { +@Getter +@AllArgsConstructor +public class CustomerFilterResponse { + @Schema(description = "Customer id (for filtering)", example = "0b0f9f3a-9c1d-4a5e-9d55-8c9a2f6f1e42") + private final String id; + @Schema(description = "Customer name (for display)", example = "Acme Corporation") + private final String name; } From 79fb4788a577c045963c6df07180bee18a9706cd Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:28 +0000 Subject: [PATCH 11/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../dto/customer/CreateCustomerRequest.java | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/customer/CreateCustomerRequest.java b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/customer/CreateCustomerRequest.java index 2af040b7a..408295026 100644 --- a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/customer/CreateCustomerRequest.java +++ b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/customer/CreateCustomerRequest.java @@ -5,25 +5,33 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.PositiveOrZero; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import java.math.BigDecimal; import java.time.LocalDate; +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor @Schema(description = "Create customer request") -public record CreateCustomerRequest( +public class CreateCustomerRequest { @NotBlank(message = "Name is required") @Schema(description = "Customer name", requiredMode = Schema.RequiredMode.REQUIRED) - String name, - String category, + private String name; + private String category; @PositiveOrZero(message = "Number of employees must be zero or positive") - Integer numberOfEmployees, - String websiteUrl, - String notes, + private Integer numberOfEmployees; + private String websiteUrl; + private String notes; @Valid - ContactInformationDto contactInformation, + private ContactInformationDto contactInformation; @PositiveOrZero(message = "Monthly revenue must be zero or positive") - BigDecimal monthlyRevenue, - LocalDate contractStartDate, - LocalDate contractEndDate -) { + private BigDecimal monthlyRevenue; + private LocalDate contractStartDate; + private LocalDate contractEndDate; } + From 6e392f1994c75778c0c53a88bb6b4ebac9398046 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:29 +0000 Subject: [PATCH 12/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../dto/ticket/TicketOwnerResponse.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/TicketOwnerResponse.java b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/TicketOwnerResponse.java index 2c90c9be8..28e944396 100644 --- a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/TicketOwnerResponse.java +++ b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/TicketOwnerResponse.java @@ -2,11 +2,18 @@ import com.openframe.data.document.ticket.TicketOwnerType; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; @Schema(description = "Ticket owner") -public record TicketOwnerResponse( - @Schema(description = "Owner type") TicketOwnerType type, - @Schema(description = "Owning device machineId (CLIENT owners only)") String machineId, - @Schema(description = "Owning user ID (ADMIN owners only)") String userId -) { +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TicketOwnerResponse { + @Schema(description = "Owner type") private TicketOwnerType type; + @Schema(description = "Owning device machineId (CLIENT owners only)") private String machineId; + @Schema(description = "Owning user ID (ADMIN owners only)") private String userId; } From 726ab8c63c55cd9f16ec3075e8f1aa8870748be1 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:30 +0000 Subject: [PATCH 13/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../dto/ticket/UpdateTicketRequest.java | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/UpdateTicketRequest.java b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/UpdateTicketRequest.java index 3572a96a0..440a7bff1 100644 --- a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/UpdateTicketRequest.java +++ b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/UpdateTicketRequest.java @@ -2,30 +2,38 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; @Schema(description = "Update ticket request; only non-null fields are applied") -public record UpdateTicketRequest( - @Size(max = 255) - @Schema(description = "New title") - String title, - - @Size(max = 5000) - @Schema(description = "New description") - String description, - - @Schema(description = "machineId of the device to link") - String deviceId, - - @Schema(description = "Customer id to link") - String customerId, - - @Schema(description = "User ID to assign the ticket to") - String assigneeId, - - @Size(max = 20) - @Schema(description = "Full set of tag ids; replaces the current tags when present") - List tagIds -) { +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class UpdateTicketRequest { + @Size(max = 255) + @Schema(description = "New title") + private String title; + + @Size(max = 5000) + @Schema(description = "New description") + private String description; + + @Schema(description = "machineId of the device to link") + private String deviceId; + + @Schema(description = "Customer id to link") + private String customerId; + + @Schema(description = "User ID to assign the ticket to") + private String assigneeId; + + @Size(max = 20) + @Schema(description = "Full set of tag ids; replaces the current tags when present") + private List tagIds; } + From effc8267901442a4526ba48aedace9a0ed40787f Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:31 +0000 Subject: [PATCH 14/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../external/dto/tool/ToolUrlResponse.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/tool/ToolUrlResponse.java b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/tool/ToolUrlResponse.java index b029e5f8d..3c5025a51 100644 --- a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/tool/ToolUrlResponse.java +++ b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/tool/ToolUrlResponse.java @@ -1,11 +1,16 @@ package com.openframe.external.dto.tool; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +@Getter +@Builder +@AllArgsConstructor @Schema(description = "Tool URL configuration") -public record ToolUrlResponse( - @Schema(description = "URL endpoint", example = "https://rmm.example.com") String url, - @Schema(description = "Port number", example = "8443") String port, - @Schema(description = "URL type", example = "DASHBOARD") String type -) { +public class ToolUrlResponse { + @Schema(description = "URL endpoint", example = "https://rmm.example.com") private final String url; + @Schema(description = "Port number", example = "8443") private final String port; + @Schema(description = "URL type", example = "DASHBOARD") private final String type; } From a86a51a228962b34539b7873843c7f5d35a73afa Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:32 +0000 Subject: [PATCH 15/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../authz/security/SsoLoginCookiePayload.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/openframe-authorization-service-core/src/main/java/com/openframe/authz/security/SsoLoginCookiePayload.java b/openframe-authorization-service-core/src/main/java/com/openframe/authz/security/SsoLoginCookiePayload.java index b9cadb158..cbae73e7e 100644 --- a/openframe-authorization-service-core/src/main/java/com/openframe/authz/security/SsoLoginCookiePayload.java +++ b/openframe-authorization-service-core/src/main/java/com/openframe/authz/security/SsoLoginCookiePayload.java @@ -1,15 +1,19 @@ package com.openframe.authz.security; +import lombok.AllArgsConstructor; +import lombok.Getter; + /** * Flow cookie for the email-less SSO login: the user picked a provider on the login page without * entering an email, so the tenant is unknown until the provider's callback identifies them. */ -public record SsoLoginCookiePayload( - String s, - String provider, - String redirectTo, - boolean authMobile, - long iat, - long exp -) implements SsoCookiePayload { +@Getter +@AllArgsConstructor +public class SsoLoginCookiePayload implements SsoCookiePayload { + private final String s; + private final String provider; + private final String redirectTo; + private final boolean authMobile; + private final long iat; + private final long exp; } From 1ba1b52e42f40a76c332370e413dbbe2d7e51b67 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:33 +0000 Subject: [PATCH 16/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../data/repository/notification/EntityCount.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/openframe-data-mongo-sync/src/main/java/com/openframe/data/repository/notification/EntityCount.java b/openframe-data-mongo-sync/src/main/java/com/openframe/data/repository/notification/EntityCount.java index a169961f1..95697c83f 100644 --- a/openframe-data-mongo-sync/src/main/java/com/openframe/data/repository/notification/EntityCount.java +++ b/openframe-data-mongo-sync/src/main/java/com/openframe/data/repository/notification/EntityCount.java @@ -1,9 +1,14 @@ package com.openframe.data.repository.notification; +import lombok.AllArgsConstructor; +import lombok.Getter; import org.springframework.data.mongodb.core.mapping.Field; -// A record on purpose — mirrors CategoryCount, whose '_id' binding is proven. -public record EntityCount( - @Field("_id") String entityId, - long count) { +@Getter +@AllArgsConstructor +public class EntityCount { + @Field("_id") + private final String entityId; + private final long count; } + From f39fc0a8da6b4811b8fd9c1336970a88b26b2a47 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:34 +0000 Subject: [PATCH 17/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../com/openframe/data/service/machine/MachineField.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/openframe-data-mongo-sync/src/main/java/com/openframe/data/service/machine/MachineField.java b/openframe-data-mongo-sync/src/main/java/com/openframe/data/service/machine/MachineField.java index 2685d423b..3abed1cd1 100644 --- a/openframe-data-mongo-sync/src/main/java/com/openframe/data/service/machine/MachineField.java +++ b/openframe-data-mongo-sync/src/main/java/com/openframe/data/service/machine/MachineField.java @@ -2,9 +2,16 @@ import com.openframe.data.document.device.Machine; +import lombok.AllArgsConstructor; +import lombok.Getter; + import java.util.function.BiConsumer; -public record MachineField(String path, BiConsumer setter) { +@Getter +@AllArgsConstructor +public class MachineField { + private final String path; + private final BiConsumer setter; public static MachineField field(String path, BiConsumer setter) { return new MachineField<>(path, setter); From ce3f55261de3d8bbdd57c0adc1920bd2a2321cf5 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:35 +0000 Subject: [PATCH 18/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../dto/ticket/CreateTicketRequest.java | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/CreateTicketRequest.java b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/CreateTicketRequest.java index 55cc24f8e..8fb43c778 100644 --- a/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/CreateTicketRequest.java +++ b/openframe-external-api-service-core/src/main/java/com/openframe/external/dto/ticket/CreateTicketRequest.java @@ -3,35 +3,42 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor @Schema(description = "Create ticket request") -public record CreateTicketRequest( +public class CreateTicketRequest { @NotBlank(message = "Title is required") @Size(max = 255) @Schema(description = "Ticket title", requiredMode = Schema.RequiredMode.REQUIRED) - String title, + private String title; @Size(max = 5000) @Schema(description = "Ticket description") - String description, + private String description; @Schema(description = "Initial status id: any custom status, or the TECH_REQUIRED system status. " + "Defaults to the first custom status. See GET /api/v1/tickets/statuses.") - String statusId, + private String statusId; @Schema(description = "machineId of the device to link") - String deviceId, + private String deviceId; @Schema(description = "Customer id to link. Derived from the device when omitted; must match the device's customer when both are given.") - String customerId, + private String customerId; @Schema(description = "User ID to assign the ticket to") - String assigneeId, + private String assigneeId; @Size(max = 20) @Schema(description = "Tag ids to assign (see GET /api/v1/tickets/tags)") - List tagIds -) { + private List tagIds; } From e2394a0b089ab03fa9e716dd74c8e717995f17c8 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:36 +0000 Subject: [PATCH 19/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../openframe/client/service/rmm/ScheduleRecurrence.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/openframe-client-core/src/main/java/com/openframe/client/service/rmm/ScheduleRecurrence.java b/openframe-client-core/src/main/java/com/openframe/client/service/rmm/ScheduleRecurrence.java index 6c8ca69fc..0c008f9b1 100644 --- a/openframe-client-core/src/main/java/com/openframe/client/service/rmm/ScheduleRecurrence.java +++ b/openframe-client-core/src/main/java/com/openframe/client/service/rmm/ScheduleRecurrence.java @@ -4,19 +4,20 @@ import java.time.Duration; import java.time.Instant; +import java.util.Optional; @UtilityClass public final class ScheduleRecurrence { - public static Instant nextRunAfter(Instant currentNextRun, Long repeatSeconds, Instant now) { + public static Optional nextRunAfter(Instant currentNextRun, Long repeatSeconds, Instant now) { if (repeatSeconds == null || repeatSeconds <= 0) { - return null; + return Optional.empty(); } Duration step = Duration.ofSeconds(repeatSeconds); Instant next = currentNextRun != null ? currentNextRun : now; while (!next.isAfter(now)) { next = next.plus(step); } - return next; + return Optional.of(next); } } From 278a21822bf6b70bc750672efbb1a042ad1aabfd Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:37 +0000 Subject: [PATCH 20/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../data/pinot/model/LogProjection.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/openframe-data-pinot/src/main/java/com/openframe/data/pinot/model/LogProjection.java b/openframe-data-pinot/src/main/java/com/openframe/data/pinot/model/LogProjection.java index 9fcad2f08..48cef1ef2 100644 --- a/openframe-data-pinot/src/main/java/com/openframe/data/pinot/model/LogProjection.java +++ b/openframe-data-pinot/src/main/java/com/openframe/data/pinot/model/LogProjection.java @@ -13,16 +13,16 @@ @AllArgsConstructor @NoArgsConstructor public class LogProjection { - public String toolEventId; - public String ingestDay; - public String toolType; - public String eventType; - public String severity; - public String userId; - public String deviceId; - public String hostname; - public String organizationId; - public String organizationName; - public String summary; - public Instant eventTimestamp; -} \ No newline at end of file + private String toolEventId; + private String ingestDay; + private String toolType; + private String eventType; + private String severity; + private String userId; + private String deviceId; + private String hostname; + private String organizationId; + private String organizationName; + private String summary; + private Instant eventTimestamp; +} From cd33a8b4f77fdafc8426ff83151df2ec730b92d5 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:38 +0000 Subject: [PATCH 21/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../com/openframe/api/dto/NotificationSettingsView.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/openframe-api-service-core/src/main/java/com/openframe/api/dto/NotificationSettingsView.java b/openframe-api-service-core/src/main/java/com/openframe/api/dto/NotificationSettingsView.java index aa4bed1b5..338330a60 100644 --- a/openframe-api-service-core/src/main/java/com/openframe/api/dto/NotificationSettingsView.java +++ b/openframe-api-service-core/src/main/java/com/openframe/api/dto/NotificationSettingsView.java @@ -1,15 +1,19 @@ package com.openframe.api.dto; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import java.util.List; // Defaults are collapsed server-side: every group exactly once — the client never re-implements the defaulting rules. @Getter +@Builder +@NoArgsConstructor @AllArgsConstructor public class NotificationSettingsView { - private final boolean enabled; - private final List typeSettings; + private boolean enabled; + private List typeSettings; } From e38fa9d5ee73fb3357c14778c60b2d34bcea1f81 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:39 +0000 Subject: [PATCH 22/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../com/openframe/client/dto/metrics/MetricsMessage.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/openframe-client-core/src/main/java/com/openframe/client/dto/metrics/MetricsMessage.java b/openframe-client-core/src/main/java/com/openframe/client/dto/metrics/MetricsMessage.java index 66c55561d..8ad10f436 100644 --- a/openframe-client-core/src/main/java/com/openframe/client/dto/metrics/MetricsMessage.java +++ b/openframe-client-core/src/main/java/com/openframe/client/dto/metrics/MetricsMessage.java @@ -1,13 +1,19 @@ package com.openframe.client.dto.metrics; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.time.Instant; @Data +@Builder +@NoArgsConstructor +@AllArgsConstructor public class MetricsMessage { private String machineId; private double cpu; private double memory; private Instant timestamp; -} \ No newline at end of file +} From 5582220b9caa025640af1aad692b335cfb1f4ad5 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:40 +0000 Subject: [PATCH 23/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../api/service/packagesearch/ChocoEntry.java | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/openframe-api-service-core/src/main/java/com/openframe/api/service/packagesearch/ChocoEntry.java b/openframe-api-service-core/src/main/java/com/openframe/api/service/packagesearch/ChocoEntry.java index 4587b6ab8..6600e09cf 100644 --- a/openframe-api-service-core/src/main/java/com/openframe/api/service/packagesearch/ChocoEntry.java +++ b/openframe-api-service-core/src/main/java/com/openframe/api/service/packagesearch/ChocoEntry.java @@ -2,24 +2,27 @@ import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Getter; +import lombok.Data; +import lombok.NoArgsConstructor; import java.time.Instant; -@Getter +@Data @Builder +@NoArgsConstructor @AllArgsConstructor class ChocoEntry { - private final String id; - private final String title; - private final String summary; - private final String description; - private final String version; - private final Integer downloadCount; - private final String iconUrl; - private final String projectUrl; - private final String tags; - private final Instant published; - private final Boolean prerelease; + private String id; + private String title; + private String summary; + private String description; + private String version; + private Integer downloadCount; + private String iconUrl; + private String projectUrl; + private String tags; + private Instant published; + private Boolean prerelease; } + From 6983c765065239fffc511ebc0138f81c06f8f6ee Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:41 +0000 Subject: [PATCH 24/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../java/com/openframe/client/dto/AgentTokenResponse.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openframe-client-core/src/main/java/com/openframe/client/dto/AgentTokenResponse.java b/openframe-client-core/src/main/java/com/openframe/client/dto/AgentTokenResponse.java index 83b09b83d..23faa9205 100644 --- a/openframe-client-core/src/main/java/com/openframe/client/dto/AgentTokenResponse.java +++ b/openframe-client-core/src/main/java/com/openframe/client/dto/AgentTokenResponse.java @@ -1,10 +1,12 @@ package com.openframe.client.dto; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data +@Builder @NoArgsConstructor @AllArgsConstructor public class AgentTokenResponse { @@ -12,4 +14,4 @@ public class AgentTokenResponse { private String refreshToken; private String tokenType; private long expiresIn; -} \ No newline at end of file +} From f21959404d9a44b496bf9317d90541ea130d89da Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:42 +0000 Subject: [PATCH 25/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../com/openframe/data/document/tenant/SSOPerTenantConfig.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openframe-data-mongo-common/src/main/java/com/openframe/data/document/tenant/SSOPerTenantConfig.java b/openframe-data-mongo-common/src/main/java/com/openframe/data/document/tenant/SSOPerTenantConfig.java index 0f0593506..c1e293c9a 100644 --- a/openframe-data-mongo-common/src/main/java/com/openframe/data/document/tenant/SSOPerTenantConfig.java +++ b/openframe-data-mongo-common/src/main/java/com/openframe/data/document/tenant/SSOPerTenantConfig.java @@ -2,6 +2,7 @@ import com.openframe.data.document.sso.SSOConfig; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @@ -16,6 +17,7 @@ */ @Data @EqualsAndHashCode(callSuper = true) +@Builder @NoArgsConstructor @AllArgsConstructor public class SSOPerTenantConfig extends SSOConfig { From 96189856792321c03e47e5474625578521d1fcfe Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:43 +0000 Subject: [PATCH 26/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../openframe/test/data/dto/external/tool/ToolResponse.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openframe-test-service-core/src/main/java/com/openframe/test/data/dto/external/tool/ToolResponse.java b/openframe-test-service-core/src/main/java/com/openframe/test/data/dto/external/tool/ToolResponse.java index c39ec0021..a83a739fa 100644 --- a/openframe-test-service-core/src/main/java/com/openframe/test/data/dto/external/tool/ToolResponse.java +++ b/openframe-test-service-core/src/main/java/com/openframe/test/data/dto/external/tool/ToolResponse.java @@ -12,6 +12,11 @@ * Integrated tool response * *

Generated from the OpenFrame External API OpenAPI contract ({@code GET /api-docs}), version 1.1.0. + * + *

Note: This DTO is intentionally kept in sync with the equivalent + * {@code ToolResponse} in {@code openframe-external-api-service-core}, since both are generated + * from the same OpenAPI contract. Consolidating them into a shared module is tracked separately + * (see OFJAVA-009); any field added here must also be added there until that consolidation happens. */ @Data @Builder From 17796ba74334934ee90165a1ea0f13c83b3c5117 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:44 +0000 Subject: [PATCH 27/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../com/openframe/sdk/fleetmdm/model/SetupResponse.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sdk/fleetmdm/src/main/java/com/openframe/sdk/fleetmdm/model/SetupResponse.java b/sdk/fleetmdm/src/main/java/com/openframe/sdk/fleetmdm/model/SetupResponse.java index cc5c5819f..1672310ef 100644 --- a/sdk/fleetmdm/src/main/java/com/openframe/sdk/fleetmdm/model/SetupResponse.java +++ b/sdk/fleetmdm/src/main/java/com/openframe/sdk/fleetmdm/model/SetupResponse.java @@ -1,14 +1,21 @@ package com.openframe.sdk.fleetmdm.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; @Setter @Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class SetupResponse { private String token; } + From 8b28bdc6a151b32616b1eae5a309f81bfcc89e69 Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:45 +0000 Subject: [PATCH 28/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../document/rmm/filter/ExecutionOwnerScope.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/openframe-data-mongo-common/src/main/java/com/openframe/data/document/rmm/filter/ExecutionOwnerScope.java b/openframe-data-mongo-common/src/main/java/com/openframe/data/document/rmm/filter/ExecutionOwnerScope.java index 5a2fb1539..d21eb35ae 100644 --- a/openframe-data-mongo-common/src/main/java/com/openframe/data/document/rmm/filter/ExecutionOwnerScope.java +++ b/openframe-data-mongo-common/src/main/java/com/openframe/data/document/rmm/filter/ExecutionOwnerScope.java @@ -2,12 +2,17 @@ import com.openframe.data.document.packagesearch.PackageManagerType; import com.openframe.data.document.rmm.software.SoftwareAction; +import lombok.AllArgsConstructor; +import lombok.Getter; -public record ExecutionOwnerScope(Type type, - String id, - PackageManagerType packageManager, - String packageName, - SoftwareAction softwareAction) { +@Getter +@AllArgsConstructor +public class ExecutionOwnerScope { + private final Type type; + private final String id; + private final PackageManagerType packageManager; + private final String packageName; + private final SoftwareAction softwareAction; public enum Type { SCRIPT, SCHEDULE, SOFTWARE From 8d033ae014f00cec56f289b542c7fb0cbe44ec6c Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:46 +0000 Subject: [PATCH 29/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../dto/force/response/ForceToolAgentUpdateResponse.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/openframe-api-service-core/src/main/java/com/openframe/api/dto/force/response/ForceToolAgentUpdateResponse.java b/openframe-api-service-core/src/main/java/com/openframe/api/dto/force/response/ForceToolAgentUpdateResponse.java index 638fa8a47..a40a95893 100644 --- a/openframe-api-service-core/src/main/java/com/openframe/api/dto/force/response/ForceToolAgentUpdateResponse.java +++ b/openframe-api-service-core/src/main/java/com/openframe/api/dto/force/response/ForceToolAgentUpdateResponse.java @@ -1,12 +1,19 @@ package com.openframe.api.dto.force.response; import lombok.Data; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; import java.util.List; @Data +@Builder +@NoArgsConstructor +@AllArgsConstructor public class ForceToolAgentUpdateResponse { private List items; } + From eb8262e928c2979722dd50eb8225956e3a07101a Mon Sep 17 00:00:00 2001 From: "flamingo[bot]" <277372822+flamingo[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 05:42:47 +0000 Subject: [PATCH 30/30] fix(OFJAVA-033): 41 review findings across 30 files --- .../force/response/ForceToolAgentUpdateResponseItem.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openframe-api-service-core/src/main/java/com/openframe/api/dto/force/response/ForceToolAgentUpdateResponseItem.java b/openframe-api-service-core/src/main/java/com/openframe/api/dto/force/response/ForceToolAgentUpdateResponseItem.java index 59e01484f..383b4ba48 100644 --- a/openframe-api-service-core/src/main/java/com/openframe/api/dto/force/response/ForceToolAgentUpdateResponseItem.java +++ b/openframe-api-service-core/src/main/java/com/openframe/api/dto/force/response/ForceToolAgentUpdateResponseItem.java @@ -1,8 +1,14 @@ package com.openframe.api.dto.force.response; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; @Data +@Builder +@NoArgsConstructor +@AllArgsConstructor public class ForceToolAgentUpdateResponseItem { private String machineId;