11package com .dbaagent .controller ;
22
3+ import com .dbaagent .dto .DigestPreferenceResponse ;
4+ import com .dbaagent .model .DatabaseConnection ;
35import com .dbaagent .model .DigestDeliveryMethod ;
46import com .dbaagent .model .PersonaTag ;
57import com .dbaagent .model .UserDigestPreference ;
8+ import com .dbaagent .repository .CredentialRepository ;
69import com .dbaagent .service .DigestPreferenceSeedService ;
710import com .dbaagent .service .security .AccessControlService ;
811import com .dbaagent .service .UserDigestPreferenceService ;
1316import org .springframework .security .access .prepost .PreAuthorize ;
1417import org .springframework .web .bind .annotation .*;
1518
19+ import java .util .HashMap ;
1620import java .util .List ;
1721import java .util .Map ;
22+ import java .util .Objects ;
23+ import java .util .Set ;
24+ import java .util .stream .Collectors ;
1825
1926/**
2027 * REST controller for managing per-user digest preferences.
@@ -32,21 +39,23 @@ public class DigestPreferenceController {
3239 private final AccessControlService accessControlService ;
3340 private final DigestPreferenceSeedService seedService ;
3441 private final SlackDailyDigestService digestService ;
42+ private final CredentialRepository credentialRepository ;
3543
3644 /**
37- * Get the current user's digest preferences.
45+ * Get the current user's digest preferences (includes connection display names) .
3846 */
3947 @ GetMapping
40- public ResponseEntity <List <UserDigestPreference >> getMyPreferences () {
48+ public ResponseEntity <List <DigestPreferenceResponse >> getMyPreferences () {
4149 String username = accessControlService .requireCurrentUsername ();
42- return ResponseEntity .ok (preferenceService .getPreferencesForUser (username ));
50+ List <UserDigestPreference > prefs = preferenceService .getPreferencesForUser (username );
51+ return ResponseEntity .ok (toResponses (prefs ));
4352 }
4453
4554 /**
4655 * Create a new digest preference for the current user.
4756 */
4857 @ PostMapping
49- public ResponseEntity <UserDigestPreference > createPreference (@ RequestBody CreatePreferenceRequest request ) {
58+ public ResponseEntity <DigestPreferenceResponse > createPreference (@ RequestBody CreatePreferenceRequest request ) {
5059 String username = accessControlService .requireCurrentUsername ();
5160
5261 DigestDeliveryMethod method ;
@@ -80,14 +89,14 @@ public ResponseEntity<UserDigestPreference> createPreference(@RequestBody Create
8089 request .timezone
8190 );
8291
83- return ResponseEntity .ok (preference );
92+ return ResponseEntity .ok (toResponse ( preference ) );
8493 }
8594
8695 /**
8796 * Update an existing preference.
8897 */
8998 @ PutMapping ("/{id}" )
90- public ResponseEntity <UserDigestPreference > updatePreference (
99+ public ResponseEntity <DigestPreferenceResponse > updatePreference (
91100 @ PathVariable Long id ,
92101 @ RequestBody UpdatePreferenceRequest request ) {
93102
@@ -112,14 +121,14 @@ public ResponseEntity<UserDigestPreference> updatePreference(
112121 request .timezone
113122 );
114123
115- return ResponseEntity .ok (updated );
124+ return ResponseEntity .ok (toResponse ( updated ) );
116125 }
117126
118127 /**
119128 * Enable or disable a preference.
120129 */
121130 @ PatchMapping ("/{id}/enabled" )
122- public ResponseEntity <UserDigestPreference > setEnabled (
131+ public ResponseEntity <DigestPreferenceResponse > setEnabled (
123132 @ PathVariable Long id ,
124133 @ RequestBody Map <String , Boolean > body ) {
125134
@@ -138,7 +147,7 @@ public ResponseEntity<UserDigestPreference> setEnabled(
138147 }
139148
140149 UserDigestPreference updated = preferenceService .setEnabled (id , enabled );
141- return ResponseEntity .ok (updated );
150+ return ResponseEntity .ok (toResponse ( updated ) );
142151 }
143152
144153 /**
@@ -286,4 +295,58 @@ public record DigestStatusResponse(boolean perUserMode, long enabledPreferences,
286295 public ResponseEntity <Map <String , String >> handleBadRequest (IllegalArgumentException e ) {
287296 return ResponseEntity .badRequest ().body (Map .of ("message" , e .getMessage () != null ? e .getMessage () : "Bad request" ));
288297 }
298+
299+ // ─────────────────────────────────────────────────────────────────────────
300+ // Response mapping (connection display names)
301+ // ─────────────────────────────────────────────────────────────────────────
302+
303+ private List <DigestPreferenceResponse > toResponses (List <UserDigestPreference > prefs ) {
304+ Map <String , String > namesById = resolveConnectionNames (prefs );
305+ return prefs .stream ()
306+ .map (pref -> toResponse (pref , namesById ))
307+ .toList ();
308+ }
309+
310+ private DigestPreferenceResponse toResponse (UserDigestPreference pref ) {
311+ Map <String , String > namesById = resolveConnectionNames (List .of (pref ));
312+ return toResponse (pref , namesById );
313+ }
314+
315+ private DigestPreferenceResponse toResponse (UserDigestPreference pref , Map <String , String > namesById ) {
316+ String connectionName = null ;
317+ if (pref .getConnectionId () != null ) {
318+ connectionName = namesById .get (pref .getConnectionId ());
319+ }
320+ return DigestPreferenceResponse .builder ()
321+ .id (pref .getId ())
322+ .username (pref .getUsername ())
323+ .connectionId (pref .getConnectionId ())
324+ .connectionName (connectionName )
325+ .enabled (pref .isEnabled ())
326+ .personaTag (pref .getPersonaTag () != null ? pref .getPersonaTag ().name () : null )
327+ .cronExpression (pref .getCronExpression ())
328+ .deliveryMethod (pref .getDeliveryMethod () != null ? pref .getDeliveryMethod ().name () : null )
329+ .timezone (pref .getTimezone ())
330+ .createdAt (pref .getCreatedAt ())
331+ .updatedAt (pref .getUpdatedAt ())
332+ .build ();
333+ }
334+
335+ private Map <String , String > resolveConnectionNames (List <UserDigestPreference > prefs ) {
336+ Set <String > ids = prefs .stream ()
337+ .map (UserDigestPreference ::getConnectionId )
338+ .filter (Objects ::nonNull )
339+ .filter (id -> !id .isBlank ())
340+ .collect (Collectors .toSet ());
341+ if (ids .isEmpty ()) {
342+ return Map .of ();
343+ }
344+ Map <String , String > names = new HashMap <>();
345+ for (DatabaseConnection conn : credentialRepository .findAllById (ids )) {
346+ if (conn .getId () != null && conn .getConnectionName () != null ) {
347+ names .put (conn .getId (), conn .getConnectionName ());
348+ }
349+ }
350+ return names ;
351+ }
289352}
0 commit comments