diff --git a/pkg/coredata/membership_profile.go b/pkg/coredata/membership_profile.go index f4964e92b..f1e0c9c80 100644 --- a/pkg/coredata/membership_profile.go +++ b/pkg/coredata/membership_profile.go @@ -30,7 +30,9 @@ import ( type ( MembershipProfile struct { ID gid.GID `db:"id"` + IdentityID gid.GID `db:"identity_id"` MembershipID gid.GID `db:"membership_id"` + EmailAddress mail.Addr `db:"email_address"` FullName string `db:"full_name"` Kind PeopleKind `db:"kind"` AdditionalEmailAddresses mail.Addrs `db:"additional_email_addresses"` @@ -66,21 +68,25 @@ func (p *MembershipProfile) LoadByMembershipID( ) error { q := ` SELECT - id, - membership_id, - full_name, - kind, - additionalEmailAddresses, - position, - contract_start_date, - contract_end_date, - created_at, - updated_at + p.id, + p.identity_id, + p.membership_id, + i.email_address, + p.full_name, + p.kind, + p.additionalEmailAddresses, + p.position, + p.contract_start_date, + p.contract_end_date, + p.created_at, + p.updated_at FROM - iam_membership_profiles + iam_membership_profiles p +INNER JOIN identities i + ON i.id = p.identity_id WHERE - %s - AND membership_id = @membership_id + p.%s + AND p.membership_id = @membership_id LIMIT 1; ` @@ -116,21 +122,25 @@ func (p *MembershipProfile) LoadByID( ) error { q := ` SELECT - id, - membership_id, - full_name, - kind, - additionalEmailAddresses, - position, - contract_start_date, - contract_end_date, - created_at, - updated_at + p.id, + p.identity_id, + p.membership_id, + i.email_address, + p.full_name, + p.kind, + p.additionalEmailAddresses, + p.position, + p.contract_start_date, + p.contract_end_date, + p.created_at, + p.updated_at FROM - iam_membership_profiles + iam_membership_profiles p +INNER JOIN identities i + ON i.id = p.identity_id WHERE - %s - AND id = @profile_id + p.%s + AND p.id = @profile_id LIMIT 1; ` @@ -166,21 +176,25 @@ func (p *MembershipProfiles) LoadByIDs( ) error { q := ` SELECT - id, - membership_id, - full_name, - kind, - additionalEmailAddresses, - position, - contract_start_date, - contract_end_date, - created_at, - updated_at + p.id, + p.identity_id, + p.membership_id, + i.email_address, + p.full_name, + p.kind, + p.additionalEmailAddresses, + p.position, + p.contract_start_date, + p.contract_end_date, + p.created_at, + p.updated_at FROM - iam_membership_profiles + iam_membership_profiles p +INNER JOIN identities i + ON i.id = p.identity_id WHERE - %s - AND id = ANY(@profile_ids) + p.%s + AND p.id = ANY(@profile_ids) ` q = fmt.Sprintf(q, scope.SQLFragment()) @@ -213,7 +227,9 @@ func (p *MembershipProfiles) LoadByMeetingID( WITH attendees AS ( SELECT p.id, + p.identity_id, p.membership_id, + i.email_address, p.full_name, p.kind, p.additionalEmailAddresses, @@ -225,6 +241,8 @@ WITH attendees AS ( ma.created_at AS attendee_created_at FROM iam_membership_profiles p + INNER JOIN identities i + ON i.id = p.identity_id INNER JOIN meeting_attendees ma ON p.id = ma.attendee_profile_id WHERE @@ -232,8 +250,10 @@ WITH attendees AS ( ) SELECT id, - organization_id, + identity_id, + membership_id, kind, + email_address, full_name, additional_email_addresses, position, @@ -287,19 +307,23 @@ WITH signatories AS ( signed_by ) SELECT - id, - organization_id, - kind, - full_name, - additional_email_addresses, - position, - contract_start_date, - contract_end_date, - created_at, - updated_at + p.id, + p.identity_id, + p.membership_id, + p.kind, + p.full_name, + i.email_address, + p.additional_email_addresses, + p.position, + p.contract_start_date, + p.contract_end_date, + p.created_at, + p.updated_at FROM - iam_membership_profiles -INNER JOIN signatories ON iam_membership_profiles.id = signatories.signed_by_profile_id + iam_membership_profiles p +INNER JOIN identities i + ON i.id = p.identity_id +INNER JOIN signatories ON p.id = signatories.signed_by_profile_id ` q = fmt.Sprintf(q, scope.SQLFragment()) @@ -328,6 +352,7 @@ INSERT INTO iam_membership_profiles ( tenant_id, id, + identity_id, membership_id, full_name, kind, @@ -341,6 +366,7 @@ INSERT INTO VALUES ( @tenant_id, @id, + @identity_id, @membership_id, @full_name, @kind, @@ -356,6 +382,7 @@ VALUES ( args := pgx.StrictNamedArgs{ "tenant_id": p.ID.TenantID().String(), "id": p.ID, + "identity_id": p.IdentityID, "membership_id": p.MembershipID, "full_name": p.FullName, "kind": p.Kind, diff --git a/pkg/coredata/migrations/20260203T132700Z.sql b/pkg/coredata/migrations/20260203T132700Z.sql index 4007ff5e2..01ffed3c2 100644 --- a/pkg/coredata/migrations/20260203T132700Z.sql +++ b/pkg/coredata/migrations/20260203T132700Z.sql @@ -1,6 +1,8 @@ -- 1. Add peoples column onto profiles ALTER TABLE iam_membership_profiles +ADD + COLUMN identity_id REFERENCES identities(id) NOT NULL, ADD COLUMN additional_email_addresses CITEXT [] NOT NULL, ADD @@ -12,6 +14,15 @@ ADD ADD COLUMN position TEXT; +UPDATE + iam_membership_profiles mp +SET + identity_id = m.identity_id +FROM + iam_memberships m +WHERE + m.id = mp.membership_id; + -- 2. Add profile references to all table referencing peoples -- was owner_id, NOT NULL ALTER TABLE diff --git a/pkg/iam/account_service.go b/pkg/iam/account_service.go index 0ec90dbb8..8393270ee 100644 --- a/pkg/iam/account_service.go +++ b/pkg/iam/account_service.go @@ -267,6 +267,7 @@ func (s *AccountService) AcceptInvitation( profile := &coredata.MembershipProfile{ ID: gid.New(tenantID, coredata.MembershipProfileEntityType), + IdentityID: identity.ID, MembershipID: membership.ID, FullName: identity.FullName, CreatedAt: now, diff --git a/pkg/iam/organization_service.go b/pkg/iam/organization_service.go index 89c91d7d6..745d0b1a4 100644 --- a/pkg/iam/organization_service.go +++ b/pkg/iam/organization_service.go @@ -667,6 +667,7 @@ func (s *OrganizationService) CreateOrganization( profile := &coredata.MembershipProfile{ ID: gid.New(tenantID, coredata.MembershipProfileEntityType), + IdentityID: identity.ID, MembershipID: membership.ID, FullName: identity.FullName, CreatedAt: now, diff --git a/pkg/iam/saml/service.go b/pkg/iam/saml/service.go index 500f1b31d..b0d25c773 100644 --- a/pkg/iam/saml/service.go +++ b/pkg/iam/saml/service.go @@ -318,6 +318,7 @@ func (s *Service) HandleAssertion( membershipProfile := &coredata.MembershipProfile{ ID: gid.New(membership.ID.TenantID(), coredata.MembershipProfileEntityType), + IdentityID: identity.ID, MembershipID: membership.ID, FullName: fullname, CreatedAt: now, diff --git a/pkg/iam/scim/service.go b/pkg/iam/scim/service.go index 36f006fee..eca402f3f 100644 --- a/pkg/iam/scim/service.go +++ b/pkg/iam/scim/service.go @@ -197,6 +197,7 @@ func (s *Service) CreateUser( // Create membership profile membershipProfile := &coredata.MembershipProfile{ ID: gid.New(membership.ID.TenantID(), coredata.MembershipProfileEntityType), + IdentityID: identity.ID, MembershipID: membership.ID, FullName: fullName, CreatedAt: now, diff --git a/pkg/probo/document_service.go b/pkg/probo/document_service.go index 012d1b216..86b3bc730 100644 --- a/pkg/probo/document_service.go +++ b/pkg/probo/document_service.go @@ -557,8 +557,7 @@ func (s *DocumentService) SendSigningNotifications( email := coredata.NewEmail( signatory.FullName, - // FIXME: load email with profile - "contact@getprobo.com", + signatory.EmailAddress, subject, textBody, htmlBody,