-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathprofile.interface.ts
More file actions
689 lines (614 loc) · 14.9 KB
/
profile.interface.ts
File metadata and controls
689 lines (614 loc) · 14.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
// Copyright The Linux Foundation and each contributor to LFX.
// SPDX-License-Identifier: MIT
/**
* Profile tab configuration for the profile layout navigation
*/
export interface ProfileTab {
id: string;
label: string;
route: string;
icon?: string;
visible?: boolean; // For role-based visibility (future)
}
/**
* Connected identity provider types
*/
export type IdentityProvider = 'github' | 'gitlab' | 'linkedin' | 'google' | 'email' | 'lfid';
/**
* Connected identity for the Overview tab
*/
export interface ConnectedIdentity {
id: string;
provider: IdentityProvider;
identifier: string;
verified: boolean;
icon?: string;
}
/**
* Profile header data displayed in the profile layout card
* Extends and normalizes the UserMetadata for display purposes
*/
export interface ProfileHeaderData {
firstName: string;
lastName: string;
username: string;
email?: string;
jobTitle?: string;
organization?: string;
city?: string;
stateProvince?: string;
country?: string;
address?: string;
postalCode?: string;
phoneNumber?: string;
tshirtSize?: string;
avatarUrl?: string;
}
/**
* Skill item for skill management
*/
export interface ProfileSkill {
id: string;
name: string;
category?: string;
}
/**
* Verification choice for identity verification dialog
*/
export type VerificationChoice = 'yes' | 'no' | undefined;
/**
* Map of identity ID to verification choice
*/
export type VerificationChoices = Record<string, VerificationChoice>;
/**
* Map of identity ID to contribution count
*/
export type ContributionCounts = Record<string, number>;
/**
* Work experience verification status
*/
export type WorkExperienceStatus = 'Verified' | 'Unverified' | 'Suggested';
/**
* Work experience entry for Work Experience tab
*/
export interface WorkExperience {
id: string;
organization: string;
organizationId?: string;
role?: string;
startDate: string;
endDate?: string;
status: WorkExperienceStatus;
}
/**
* Email option for email preference dropdowns
*/
export interface EmailOption {
label: string;
value: string | null;
}
/**
* Dialog data for add/edit work experience form
*/
export interface WorkExperienceFormDialogData {
mode: 'add' | 'edit';
experience?: WorkExperience;
}
// --- Attribution Tab Redesign Types ---
/**
* Role types for attribution affiliations
*/
export type AffiliationRole = 'Contributor' | 'Maintainer';
/**
* How the role was determined
*/
export type AffiliationRoleSource = 'cdp-detected' | 'repo-file' | 'user-confirmed' | 'user-overridden';
/**
* Human-readable labels for affiliation sources
*/
export type AffiliationSourceLabel = 'Confirmed by user' | 'Derived from work experience' | 'Repository file';
/**
* Source type for affiliations
*/
export type AffiliationSourceType = 'inferred' | 'repo-file' | 'user-confirmed' | 'user-overridden';
/**
* Source for work experience entries
*/
export type WorkExperienceSource = 'manual' | 'cdp-enriched';
/**
* Time-bound affiliation within a project
*/
export interface AffiliationSegment {
id: string;
role: AffiliationRole;
roleSource: AffiliationRoleSource;
organization: string;
organizationLogo?: string;
startDate: string;
endDate?: string;
sourceLabel: AffiliationSourceLabel;
sourceType: AffiliationSourceType;
needsConfirmation: boolean;
}
/**
* Groups affiliation segments under a project
*/
export interface ProjectGroup {
id: string;
projectName: string;
projectLogo?: string;
segments: AffiliationSegment[];
disabledOrgSuggestions?: DisabledOrgSuggestion[];
}
/**
* Flattened row for rendering affiliations in lfx-table.
* Each row represents one segment with metadata about its position within the group.
*/
export interface FlatAffiliationRow {
group: ProjectGroup;
segment: AffiliationSegment;
isFirstSegment: boolean;
isLastSegmentInGroup: boolean;
isLastGroup: boolean;
isPlaceholder?: boolean;
}
/**
* Work experience entry with source tracking
*/
export interface WorkExperienceEntry {
id: string;
organization: string;
organizationId?: string;
organizationLogo?: string;
jobTitle: string;
startDate: string;
endDate?: string;
source: WorkExperienceSource;
cdpSource?: string;
needsReview?: boolean;
}
/**
* Request body sent from frontend to BFF for creating/updating work experience
*/
export interface WorkExperienceCreateUpdateBody {
organizationId: string;
jobTitle: string;
source: string;
startDate: string;
endDate?: string | null;
}
/**
* Full request body sent from BFF to CDP API for creating/updating work experience
* Includes verified/verifiedBy fields injected by the backend
*/
export interface CdpWorkExperienceRequest {
organizationId: string;
jobTitle: string;
source: string;
startDate: string;
endDate?: string | null;
verified: boolean;
verifiedBy: string;
}
/**
* Disabled org suggestion derived from non-project-type affiliations
* Shown as toggled-off cards in the affiliation timeline dialog
*/
export interface DisabledOrgSuggestion {
organizationName: string;
organizationId: string;
organizationLogo?: string;
earliestStartDate: string;
latestEndDate?: string;
}
/**
* Timeline data for a single project in the affiliation timeline dialog
*/
export interface TimelineProjectData {
projectName: string;
segments: AffiliationSegment[];
disabledOrgSuggestions?: DisabledOrgSuggestion[];
}
/**
* Work experience timeline entry for the affiliation timeline dialog
*/
export interface TimelineWorkExperience {
organization: string;
color: string;
startDate: string;
endDate: string | null;
}
/**
* Project affiliation entry in work experience confirmation dialog
*/
export interface WorkExperienceProjectAffiliation {
id: string;
projectName: string;
projectLogo?: string;
detectedRole: AffiliationRole;
enabled: boolean;
}
/**
* Work experience update detected by the system
*/
export interface WorkExperienceUpdate {
id: string;
organization: string;
organizationLogo?: string;
jobTitle: string;
startDate: string;
endDate?: string;
status: 'New' | 'Updated';
projectAffiliations: WorkExperienceProjectAffiliation[];
}
/**
* A project affiliation that the user disabled during work experience confirmation
*/
export interface DisabledAffiliation {
projectName: string;
organization: string;
}
/**
* Result emitted when the user confirms work experience updates
*/
export interface WorkExperienceConfirmationResult {
disabledAffiliations: DisabledAffiliation[];
}
/**
* Data passed to the maintainer confirmation dialog
*/
export interface MaintainerConfirmationDialogData {
projectName: string;
}
/**
* Result from the maintainer confirmation dialog
*/
export type MaintainerConfirmationResult = 'maintainer' | 'contributor';
/**
* Social identity providers supported for OAuth verification flow
*/
export type SocialProvider = 'github' | 'google' | 'linkedin';
/**
* Pending social connection stored in session during Flow C chain
*/
export interface PendingSocialConnect {
provider: SocialProvider;
returnTo: string;
}
/**
* Identity provider option for the Add Account dialog
*/
export interface IdentityProviderOption {
id: IdentityProvider;
name: string;
description: string;
icon: string;
}
/**
* Dialog data for adding a new identity account
*/
export interface AddAccountDialogData {
existingProviders: IdentityProvider[];
}
/**
* Result from the add account dialog
*/
export interface AddAccountDialogResult {
provider: IdentityProvider;
identifier: string;
}
/**
* Dialog data for verifying an identity
*/
export interface VerifyIdentityDialogData {
identity: ConnectedIdentityFull;
}
/**
* Dialog data for removing an identity
*/
export interface RemoveIdentityDialogData {
identity: ConnectedIdentityFull;
}
/**
* Identity verification state
*/
export type IdentityState = 'verified' | 'unverified';
/**
* Full connected identity for the Identities tab
*/
export interface ConnectedIdentityFull {
id: string;
provider: IdentityProvider;
identifier: string;
state: IdentityState;
icon: string;
isPrimary?: boolean;
verifiedBy?: string;
verifiedOn?: string;
contributions?: number;
auth0UserId?: string;
}
/**
* Data passed to the affiliation timeline dialog
*/
export interface AffiliationTimelineDialogData {
projects: TimelineProjectData[];
startProjectIndex?: number;
workExperience?: WorkExperienceEntry[];
}
/**
* Editable period within an affiliation org card (dialog internal state)
*/
export interface AffiliationEditPeriod {
id: string;
startMonth: string;
startYear: string;
endMonth: string;
endYear: string;
isPresent: boolean;
}
/**
* Organization edit state for the affiliation timeline dialog
*/
export interface AffiliationEditOrg {
organization: string;
organizationLogo?: string;
enabled: boolean;
periods: AffiliationEditPeriod[];
weStartDate?: string;
weEndDate?: string;
}
/**
* Positioned segment for date-based timeline rendering
*/
export interface PositionedSegment {
segment: AffiliationSegment;
leftPercent: number;
widthPercent: number;
color: string;
}
/**
* Profile auth status response for Flow C management token
*/
export interface ProfileAuthStatus {
authorized: boolean;
configured: boolean;
}
/**
* Request body for PATCH /v1/members/{memberId}/project-affiliations/{projectId}
* Sends the full CDP project shape so the backend can overwrite the entire project record.
*/
export interface ProjectAffiliationPatchBody {
id: string;
projectSlug: string;
verified: boolean;
verifiedBy: string;
affiliations: CdpProjectAffiliationEntry[];
}
// --- CDP (Community Data Platform) Identity Types ---
/**
* CDP member resolve request body
*/
export interface CdpResolveRequest {
lfids: string[];
emails?: string[];
}
/**
* CDP member resolve response
*/
export interface CdpResolveResponse {
memberId: string;
}
/**
* CDP identity type — distinguishes whether the identity's value is an email
* address or a platform username/handle. Returned by the CDP identities API
* and required on create.
*/
export type CdpIdentityType = 'email' | 'username';
/**
* Raw identity from CDP API response
*/
export interface CdpIdentityRaw {
id: string;
value: string;
platform: string;
// Optional to tolerate legacy CDP rows that pre-date the field; backend
// derives a fallback by inspecting the value's shape (email vs username)
// in cdp.service.ts when absent.
type?: CdpIdentityType;
verified: boolean;
verifiedBy?: string | null;
source: string;
createdAt: string;
updatedAt: string;
}
/**
* CDP identities API response envelope
*/
export interface CdpIdentitiesResponse {
identities: CdpIdentityRaw[];
}
/**
* Request body for creating a new identity in CDP
*/
export interface CdpCreateIdentityRequest {
value: string;
platform: string;
type: CdpIdentityType;
source: string;
verified: boolean;
verifiedBy: string;
}
/**
* Mapped identity for frontend display
*/
export interface CdpIdentity {
id: string;
platform: string;
type: CdpIdentityType;
value: string;
verified: boolean;
verifiedBy?: string | null;
source: string;
icon: string;
createdAt: string;
updatedAt: string;
}
// --- Auth0 Linked Identity Types ---
/**
* Identity linked to the user's Auth0 account
* Represents what the logged-in user actually owns (source of truth for ownership)
*/
export interface Auth0Identity {
provider: string;
user_id: string;
connection: string;
isSocial: boolean;
profileData?: { email?: string; nickname?: string; name?: string; [key: string]: unknown };
}
/**
* Display state for an identity after cross-referencing CDP with Auth0
* - verified: owned by user and confirmed
* - unverified: needs user verification
* - hidden: belongs to another LFID merged into CDP, not shown
*/
export type IdentityDisplayState = 'verified' | 'unverified' | 'hidden';
/**
* CDP identity enriched with Auth0 cross-reference data
* Returned by the identities endpoint after applying display logic
*/
export interface EnrichedIdentity extends CdpIdentity {
displayState: IdentityDisplayState;
inAuth0: boolean;
auth0UserId?: string;
}
// --- CDP Work Experience Types ---
/**
* Raw work experience from CDP API response
*/
export interface CdpWorkExperience {
id: string;
organizationId: string;
organizationName: string;
organizationLogo: string;
jobTitle: string;
verified: boolean;
verifiedBy: string | null;
source: string;
startDate: string;
endDate: string | null;
createdAt: string;
updatedAt: string;
}
/**
* CDP work experiences API response envelope
*/
export interface CdpWorkExperiencesResponse {
memberId: string;
workExperiences: CdpWorkExperience[];
}
// --- Email Verification NATS Types ---
/**
* Response from NATS email verification send-code request
*/
export interface SendEmailVerificationResponse {
success: boolean;
message?: string;
error?: string;
}
/**
* Response from NATS email OTP verification request
*/
export interface VerifyEmailOtpNatsResponse {
success: boolean;
data?: {
access_token: string;
id_token: string;
scope: string;
expires_in: number;
token_type: string;
};
message?: string;
error?: string;
}
/**
* Response from NATS user identity link request
*/
export interface LinkIdentityNatsResponse {
success: boolean;
message?: string;
error?: string;
}
/**
* Response from NATS user identity unlink request
*/
export interface UnlinkIdentityNatsResponse {
success: boolean;
message?: string;
error?: string;
}
/**
* Response from NATS password reset link request
*/
export interface ResetPasswordLinkNatsResponse {
success: boolean;
message?: string;
error?: string;
}
/**
* Response from NATS user identity list request
*/
export interface ListIdentitiesNatsResponse {
success: boolean;
data?: Auth0Identity[];
message?: string;
error?: string;
}
/**
* Combined response from verify OTP + link identity flow
*/
export interface VerifyAndLinkEmailResponse {
success: boolean;
message?: string;
error?: string;
authorize_url?: string;
}
// --- CDP Project Affiliation Types ---
/**
* Role entry within a CDP project affiliation
*/
export interface CdpProjectAffiliationRole {
id: string;
role: string;
startDate: string;
endDate: string;
repoUrl: string;
repoFileUrl: string;
}
/**
* Organization affiliation entry within a CDP project affiliation
*/
export interface CdpProjectAffiliationEntry {
id?: string;
organizationLogo: string;
organizationId: string;
organizationName: string;
verified: boolean;
verifiedBy: string;
source: string;
startDate: string;
endDate: string | null;
type: string;
}
/**
* CDP project affiliation grouping projects with their roles and org affiliations
*/
export interface CdpProjectAffiliation {
id: string;
projectSlug: string;
projectLogo: string;
projectName: string;
contributionCount: number;
roles: CdpProjectAffiliationRole[];
affiliations: CdpProjectAffiliationEntry[];
}