@@ -19,7 +19,8 @@ export interface StewardshipStewardRecord {
1919 id : string
2020 stewardshipId : string
2121 userId : string
22- name : string | null
22+ username : string | null
23+ displayName : string | null
2324 role : string
2425 assignedAt : string
2526 assignedBy : string | null
@@ -87,15 +88,33 @@ function toIso(v: unknown): string {
8788 return v instanceof Date ? v . toISOString ( ) : String ( v )
8889}
8990
91+ async function fetchActiveStewards (
92+ qx : QueryExecutor ,
93+ stewardshipId : number ,
94+ ) : Promise < StewardshipStewardRecord [ ] > {
95+ const rows : Array < Record < string , unknown > > = await qx . select (
96+ `SELECT ss.id, ss.stewardship_id, ss.user_id, ss.role, ss.assigned_at, ss.assigned_by,
97+ st.username, st.display_name
98+ FROM stewardship_stewards ss
99+ LEFT JOIN stewards st ON st.user_id = ss.user_id
100+ WHERE ss.stewardship_id = $(stewardshipId)
101+ AND ss.deleted_at IS NULL
102+ ORDER BY ss.assigned_at ASC` ,
103+ { stewardshipId } ,
104+ )
105+ return rows . map ( mapStewardStewardRow )
106+ }
107+
90108function mapStewardStewardRow ( row : Record < string , unknown > ) : StewardshipStewardRecord {
91109 return {
92110 id : String ( row . id ) ,
93111 stewardshipId : String ( row . stewardship_id ) ,
94112 userId : String ( row . user_id ) ,
95- name : null ,
113+ username : ( row . username as string ) ?? null ,
114+ displayName : ( row . display_name as string ) ?? null ,
96115 role : String ( row . role ) ,
97116 assignedAt : toIso ( row . assigned_at ) ,
98- assignedBy : row . assigned_by ? String ( row . assigned_by ) : null ,
117+ assignedBy : ( row . assigned_by as string ) ?? null ,
99118 }
100119}
101120
@@ -190,6 +209,8 @@ export async function assignSteward(
190209 stewardshipId : number ,
191210 data : {
192211 userId : string
212+ username ?: string | null
213+ displayName ?: string | null
193214 role : 'lead' | 'co_steward'
194215 assignedBy : string
195216 note ?: string
@@ -200,6 +221,18 @@ export async function assignSteward(
200221 const stewardship = await getStewardshipById ( tx , stewardshipId )
201222 if ( ! stewardship ) return null
202223
224+ if ( data . username != null && data . displayName != null ) {
225+ await tx . result (
226+ `INSERT INTO stewards (user_id, username, display_name, updated_at)
227+ VALUES ($(userId), $(username), $(displayName), NOW())
228+ ON CONFLICT (user_id) DO UPDATE
229+ SET username = EXCLUDED.username,
230+ display_name = EXCLUDED.display_name,
231+ updated_at = NOW()` ,
232+ { userId : data . userId , username : data . username , displayName : data . displayName } ,
233+ )
234+ }
235+
203236 // Soft-delete existing active entry for this user (handles role changes).
204237 await tx . result (
205238 `UPDATE stewardship_stewards
@@ -266,18 +299,9 @@ export async function assignSteward(
266299 if ( updated ) finalStewardship = mapStewardshipRow ( updated )
267300 }
268301
269- const stewards : Array < Record < string , unknown > > = await tx . select (
270- `SELECT id, stewardship_id, user_id, role, assigned_at, assigned_by
271- FROM stewardship_stewards
272- WHERE stewardship_id = $(stewardshipId)
273- AND deleted_at IS NULL
274- ORDER BY assigned_at ASC` ,
275- { stewardshipId } ,
276- )
277-
278302 return {
279303 stewardship : finalStewardship ,
280- stewards : stewards . map ( mapStewardStewardRow ) ,
304+ stewards : await fetchActiveStewards ( tx , stewardshipId ) ,
281305 }
282306 } )
283307}
@@ -292,14 +316,7 @@ export async function getStewardshipSummary(
292316 stewardshipId : number ,
293317) : Promise < StewardshipSummary > {
294318 const [ stewards , activityRow ] = await Promise . all ( [
295- qx . select (
296- `SELECT id, stewardship_id, user_id, role, assigned_at, assigned_by
297- FROM stewardship_stewards
298- WHERE stewardship_id = $(stewardshipId)
299- AND deleted_at IS NULL
300- ORDER BY assigned_at ASC` ,
301- { stewardshipId } ,
302- ) as Promise < Array < Record < string , unknown > > > ,
319+ fetchActiveStewards ( qx , stewardshipId ) ,
303320 qx . selectOneOrNone (
304321 `SELECT MAX(created_at) AS last_activity_at
305322 FROM stewardship_activity
@@ -309,7 +326,7 @@ export async function getStewardshipSummary(
309326 ] )
310327
311328 return {
312- stewards : stewards . map ( mapStewardStewardRow ) ,
329+ stewards,
313330 lastActivityAt : activityRow ?. last_activity_at ? toIso ( activityRow . last_activity_at ) : null ,
314331 }
315332}
0 commit comments