@@ -31,17 +31,16 @@ import (
|
||||
|
||||
type (
|
||||
Membership struct {
|
||||
ID gid.GID `db:"id"`
|
||||
IdentityID gid.GID `db:"identity_id"`
|
||||
OrganizationID gid.GID `db:"organization_id"`
|
||||
Role MembershipRole `db:"role"`
|
||||
Source MembershipSource `db:"source"`
|
||||
State MembershipState `db:"state"`
|
||||
FullName string `db:"full_name"`
|
||||
EmailAddress mail.Addr `db:"email_address"`
|
||||
OrganizationName string `db:"organization_name"`
|
||||
CreatedAt time.Time `db:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at"`
|
||||
ID gid.GID `db:"id"`
|
||||
IdentityID gid.GID `db:"identity_id"`
|
||||
OrganizationID gid.GID `db:"organization_id"`
|
||||
Role MembershipRole `db:"role"`
|
||||
Source MembershipSource `db:"source"`
|
||||
State MembershipState `db:"state"`
|
||||
FullName string `db:"full_name"`
|
||||
EmailAddress mail.Addr `db:"email_address"`
|
||||
CreatedAt time.Time `db:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at"`
|
||||
}
|
||||
|
||||
Memberships []*Membership
|
||||
@@ -49,8 +48,6 @@ type (
|
||||
|
||||
func (m Membership) CursorKey(orderBy MembershipOrderField) page.CursorKey {
|
||||
switch orderBy {
|
||||
case MembershipOrderFieldOrganizationName:
|
||||
return page.NewCursorKey(m.ID, m.OrganizationName)
|
||||
case MembershipOrderFieldFullName:
|
||||
return page.NewCursorKey(m.ID, m.FullName)
|
||||
case MembershipOrderFieldEmailAddress:
|
||||
@@ -426,93 +423,6 @@ WHERE
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Memberships) LoadByIdentityID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
identityID gid.GID,
|
||||
cursor *page.Cursor[MembershipOrderField],
|
||||
) error {
|
||||
query := `
|
||||
WITH mbr AS (
|
||||
SELECT
|
||||
id,
|
||||
identity_id,
|
||||
organization_id,
|
||||
role,
|
||||
source,
|
||||
state,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
iam_memberships
|
||||
WHERE
|
||||
identity_id = @identity_id
|
||||
AND state = 'ACTIVE'
|
||||
AND %s
|
||||
),
|
||||
r AS (
|
||||
SELECT
|
||||
mbr.id,
|
||||
mbr.identity_id,
|
||||
mbr.organization_id,
|
||||
mbr.role,
|
||||
mbr.source,
|
||||
mbr.state,
|
||||
COALESCE(mp.full_name, i.full_name, '') as full_name,
|
||||
i.email_address,
|
||||
o.name as organization_name,
|
||||
mbr.created_at,
|
||||
mbr.updated_at
|
||||
FROM
|
||||
mbr
|
||||
JOIN
|
||||
identities i ON mbr.identity_id = i.id
|
||||
JOIN
|
||||
organizations o ON mbr.organization_id = o.id
|
||||
LEFT JOIN
|
||||
iam_membership_profiles mp ON mp.membership_id = mbr.id
|
||||
)
|
||||
SELECT
|
||||
id,
|
||||
identity_id,
|
||||
organization_id,
|
||||
role,
|
||||
source,
|
||||
state,
|
||||
full_name,
|
||||
email_address,
|
||||
organization_name,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
r
|
||||
WHERE
|
||||
%s
|
||||
`
|
||||
|
||||
query = fmt.Sprintf(query, scope.SQLFragment(), cursor.SQLFragment())
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
"identity_id": identityID,
|
||||
}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
maps.Copy(args, cursor.SQLArguments())
|
||||
|
||||
rows, err := conn.Query(ctx, query, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query memberships: %w", err)
|
||||
}
|
||||
|
||||
memberships, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[Membership])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect memberships: %w", err)
|
||||
}
|
||||
|
||||
*m = memberships
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Memberships) LoadByOrganizationID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
|
||||
@@ -40,6 +40,7 @@ type (
|
||||
Position *string `db:"position"`
|
||||
ContractStartDate *time.Time `db:"contract_start_date"`
|
||||
ContractEndDate *time.Time `db:"contract_end_date"`
|
||||
OrganizationName string `db:"organization_name"`
|
||||
CreatedAt time.Time `db:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at"`
|
||||
}
|
||||
@@ -55,6 +56,8 @@ func (p MembershipProfile) CursorKey(orderBy MembershipProfileOrderField) page.C
|
||||
return page.NewCursorKey(p.ID, p.FullName)
|
||||
case MembershipProfileOrderFieldKind:
|
||||
return page.NewCursorKey(p.ID, p.Kind)
|
||||
case MembershipProfileOrderFieldOrganizationName:
|
||||
return page.NewCursorKey(p.ID, p.OrganizationName)
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("unsupported order by: %s", orderBy))
|
||||
@@ -307,6 +310,75 @@ INNER JOIN identities i ON i.id = p.identity_id
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *MembershipProfiles) LoadByIdentityID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
scope Scoper,
|
||||
identityID gid.GID,
|
||||
cursor *page.Cursor[MembershipProfileOrderField],
|
||||
filter *MembershipProfileFilter,
|
||||
) error {
|
||||
q := `
|
||||
WITH profiles AS (
|
||||
SELECT
|
||||
id,
|
||||
identity_id,
|
||||
organization_id,
|
||||
full_name,
|
||||
kind,
|
||||
additional_email_addresses,
|
||||
position,
|
||||
contract_start_date,
|
||||
contract_end_date,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
iam_membership_profiles
|
||||
WHERE
|
||||
%s
|
||||
AND identity_id = @identity_id
|
||||
AND %s
|
||||
AND %s
|
||||
)
|
||||
SELECT
|
||||
p.id,
|
||||
p.identity_id,
|
||||
p.organization_id,
|
||||
i.email_address,
|
||||
p.full_name,
|
||||
p.kind,
|
||||
p.additional_email_addresses,
|
||||
p.position,
|
||||
p.contract_start_date,
|
||||
p.contract_end_date,
|
||||
o.name AS organization_name,
|
||||
p.created_at,
|
||||
p.updated_at
|
||||
FROM profiles p
|
||||
INNER JOIN identities i ON i.id = p.identity_id
|
||||
INNER JOIN organizations o ON o.id = p.organization_id
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment(), filter.SQLFragment(), cursor.SQLFragment())
|
||||
|
||||
args := pgx.NamedArgs{"identity_id": identityID}
|
||||
maps.Copy(args, scope.SQLArguments())
|
||||
|
||||
rows, err := conn.Query(ctx, q, args)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot query profiles: %w", err)
|
||||
}
|
||||
|
||||
profiles, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[MembershipProfile])
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot collect profiles: %w", err)
|
||||
}
|
||||
|
||||
*p = profiles
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *MembershipProfiles) LoadByDocumentID(
|
||||
ctx context.Context,
|
||||
conn pg.Conn,
|
||||
@@ -320,7 +392,6 @@ WITH profiles AS (
|
||||
mp.id,
|
||||
mp.identity_id,
|
||||
mp.organization_id,
|
||||
mp.membership_id,
|
||||
mp.full_name,
|
||||
mp.kind,
|
||||
mp.additional_email_addresses,
|
||||
@@ -344,7 +415,6 @@ SELECT
|
||||
p.id,
|
||||
p.identity_id,
|
||||
p.organization_id,
|
||||
p.membership_id,
|
||||
i.email_address,
|
||||
p.full_name,
|
||||
p.kind,
|
||||
@@ -423,7 +493,6 @@ WITH profiles AS (
|
||||
mp.id,
|
||||
mp.identity_id,
|
||||
mp.organization_id,
|
||||
mp.membership_id,
|
||||
mp.full_name,
|
||||
mp.kind,
|
||||
mp.additional_email_addresses,
|
||||
@@ -447,7 +516,6 @@ SELECT
|
||||
p.id,
|
||||
p.identity_id,
|
||||
p.organization_id,
|
||||
p.membership_id,
|
||||
i.email_address,
|
||||
p.full_name,
|
||||
p.kind,
|
||||
@@ -654,7 +722,7 @@ FROM
|
||||
iam_membership_profiles
|
||||
WHERE
|
||||
%s
|
||||
AND %s
|
||||
AND %s
|
||||
AND organization_id = @organization_id
|
||||
`
|
||||
|
||||
|
||||
@@ -19,9 +19,10 @@ type (
|
||||
)
|
||||
|
||||
const (
|
||||
MembershipProfileOrderFieldCreatedAt MembershipProfileOrderField = "CREATED_AT"
|
||||
MembershipProfileOrderFieldFullName MembershipProfileOrderField = "FULL_NAME"
|
||||
MembershipProfileOrderFieldKind MembershipProfileOrderField = "KIND"
|
||||
MembershipProfileOrderFieldCreatedAt MembershipProfileOrderField = "CREATED_AT"
|
||||
MembershipProfileOrderFieldFullName MembershipProfileOrderField = "FULL_NAME"
|
||||
MembershipProfileOrderFieldKind MembershipProfileOrderField = "KIND"
|
||||
MembershipProfileOrderFieldOrganizationName MembershipProfileOrderField = "ORGANIZATION_NAME"
|
||||
)
|
||||
|
||||
func (p MembershipProfileOrderField) Column() string {
|
||||
|
||||
31
pkg/coredata/migrations/20260212T163603Z.sql
Normal file
31
pkg/coredata/migrations/20260212T163603Z.sql
Normal file
@@ -0,0 +1,31 @@
|
||||
ALTER TABLE
|
||||
iam_memberships
|
||||
ADD
|
||||
COLUMN profile_id REFERENCES iam_membership_profiles(id);
|
||||
|
||||
UPDATE
|
||||
iam_memberships m
|
||||
SET
|
||||
profile_id = p.id
|
||||
FROM
|
||||
iam_membership_profiles p
|
||||
WHERE
|
||||
p.membership_id = m.id;
|
||||
|
||||
DROP INDEX authz_memberships_user_id_organization_id_key;
|
||||
|
||||
DROP INDEX idx_iam_memberships_identity_tenant_org;
|
||||
|
||||
CREATE UNIQUE INDEX idx_iam_memberships_profile_id_idx ON iam_memberships(profile_id);
|
||||
|
||||
ALTER TABLE
|
||||
iam_memberships
|
||||
ALTER COLUMN
|
||||
profile_id
|
||||
SET
|
||||
NOT NULL,
|
||||
DROP COLUMN organization_id,
|
||||
DROP COLUMN identity_id;
|
||||
|
||||
ALTER TABLE
|
||||
iam_membership_profiles DROP COLUMN membership_id;
|
||||
Reference in New Issue
Block a user