From 29371662e2e350f02a6749544b9213f731cb774c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89mile=20R=C3=A9?= Date: Mon, 9 Feb 2026 10:13:57 +0400 Subject: [PATCH] Fix referenced columns used in certain SQL queries + minor front fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Émile Ré --- .../organizations/users/UserPageLoader.tsx | 2 +- .../users/_components/MemberList.tsx | 2 +- pkg/coredata/document.go | 4 +- pkg/coredata/document_filter.go | 2 +- pkg/coredata/document_version_filter.go | 2 +- pkg/coredata/document_version_signature.go | 4 +- .../document_version_signature_filter.go | 4 +- pkg/coredata/membership_profile.go | 4 +- pkg/coredata/membership_profile_kind.go | 11 ++- pkg/coredata/people_filter.go | 53 ----------- pkg/coredata/people_kind.go | 87 ------------------- pkg/coredata/risk.go | 4 +- pkg/iam/organization_service.go | 6 +- pkg/probo/document_service.go | 6 +- 14 files changed, 29 insertions(+), 162 deletions(-) delete mode 100644 pkg/coredata/people_filter.go delete mode 100644 pkg/coredata/people_kind.go diff --git a/apps/console/src/pages/iam/organizations/users/UserPageLoader.tsx b/apps/console/src/pages/iam/organizations/users/UserPageLoader.tsx index 296e2c6de..b7b196629 100644 --- a/apps/console/src/pages/iam/organizations/users/UserPageLoader.tsx +++ b/apps/console/src/pages/iam/organizations/users/UserPageLoader.tsx @@ -19,7 +19,7 @@ function UserPageQueryLoader() { if (!queryRef) { loadQuery({ userId }); } - }, [loadQuery, queryRef, userId]); + }); if (!queryRef) return ; diff --git a/apps/console/src/pages/iam/organizations/users/_components/MemberList.tsx b/apps/console/src/pages/iam/organizations/users/_components/MemberList.tsx index d2d093cf8..8605bbcf4 100644 --- a/apps/console/src/pages/iam/organizations/users/_components/MemberList.tsx +++ b/apps/console/src/pages/iam/organizations/users/_components/MemberList.tsx @@ -80,7 +80,7 @@ export function MemberList(props: { fKey: MemberListFragment$key }) { {membersPagination.data.members.totalCount === 0 ? ( - + {__("No members")} diff --git a/pkg/coredata/document.go b/pkg/coredata/document.go index 1b01ee189..ab1410dae 100644 --- a/pkg/coredata/document.go +++ b/pkg/coredata/document.go @@ -713,14 +713,14 @@ WITH last_signable_version AS ( FROM documents d INNER JOIN document_versions dv ON dv.document_id = d.id INNER JOIN document_version_signatures dvs ON dvs.document_version_id = dv.id - INNER JOIN peoples p ON dvs.signed_by = p.id + INNER JOIN iam_membership_profiles p ON dvs.signed_by_profile_id = p.id WHERE d.id = @document_id AND p.primary_email_address = @user_email AND dv.version_number = ( SELECT MAX(dv2.version_number) FROM document_versions dv2 INNER JOIN document_version_signatures dvs2 ON dvs2.document_version_id = dv2.id - INNER JOIN peoples p2 ON dvs2.signed_by = p2.id + INNER JOIN iam_membership_profiles p2 ON dvs2.signed_by_profile_id = p2.id WHERE dv2.document_id = d.id AND p2.primary_email_address = @user_email ) diff --git a/pkg/coredata/document_filter.go b/pkg/coredata/document_filter.go index 57dc18e21..23dc3de2e 100644 --- a/pkg/coredata/document_filter.go +++ b/pkg/coredata/document_filter.go @@ -99,7 +99,7 @@ func (f *DocumentFilter) SQLFragment() string { SELECT 1 FROM document_versions dv INNER JOIN document_version_signatures dvs ON dv.id = dvs.document_version_id - INNER JOIN peoples p ON dvs.signed_by = p.id + INNER JOIN iam_membership_profiles p ON dvs.signed_by_profile_id = p.id WHERE dv.document_id = documents.id AND dv.status = 'PUBLISHED' AND p.primary_email_address = @user_email::text diff --git a/pkg/coredata/document_version_filter.go b/pkg/coredata/document_version_filter.go index 7c127306f..a078fd5a5 100644 --- a/pkg/coredata/document_version_filter.go +++ b/pkg/coredata/document_version_filter.go @@ -47,7 +47,7 @@ func (f *DocumentVersionFilter) SQLFragment() string { OR EXISTS ( SELECT 1 FROM document_version_signatures dvs - INNER JOIN peoples p ON dvs.signed_by = p.id + INNER JOIN iam_membership_profiles p ON dvs.signed_by_profile_id = p.id WHERE dvs.document_version_id = document_versions.id AND p.primary_email_address = @user_email::text AND dvs.state IN ('REQUESTED', 'SIGNED') diff --git a/pkg/coredata/document_version_signature.go b/pkg/coredata/document_version_signature.go index c6d39cbf6..3c72a4bb6 100644 --- a/pkg/coredata/document_version_signature.go +++ b/pkg/coredata/document_version_signature.go @@ -364,7 +364,7 @@ WITH sigs AS ( FROM document_version_signatures dvs INNER JOIN - peoples p ON dvs.signed_by_profile_id = p.id + iam_membership_profile_id p ON dvs.signed_by_profile_id = p.id WHERE dvs.document_version_id = @document_version_id ORDER BY @@ -422,7 +422,7 @@ func (pvs *DocumentVersionSignature) IsSignedByUserEmail( SELECT EXISTS ( SELECT 1 FROM document_version_signatures dvs - INNER JOIN peoples p ON dvs.signed_by_profile_id = p.id + INNER JOIN iam_membership_profiles p ON dvs.signed_by_profile_id = p.id WHERE dvs.document_version_id = @document_version_id AND p.primary_email_address = @user_email AND dvs.state = 'SIGNED' diff --git a/pkg/coredata/document_version_signature_filter.go b/pkg/coredata/document_version_signature_filter.go index e8f8dffbd..63d11965b 100644 --- a/pkg/coredata/document_version_signature_filter.go +++ b/pkg/coredata/document_version_signature_filter.go @@ -53,8 +53,8 @@ func (f *DocumentVersionSignatureFilter) SQLFragment() string { THEN TRUE ELSE EXISTS ( SELECT 1 - FROM peoples p - WHERE p.id = signed_by + FROM iam_membership_profiles p + WHERE p.id = signed_by_profile_id AND ( ( @active_contract::boolean = TRUE diff --git a/pkg/coredata/membership_profile.go b/pkg/coredata/membership_profile.go index 264c712cc..6f4cdbe9e 100644 --- a/pkg/coredata/membership_profile.go +++ b/pkg/coredata/membership_profile.go @@ -451,14 +451,14 @@ func (p *MembershipProfiles) LoadAwaitingSigning( q := ` WITH signatories AS ( SELECT - signed_by + signed_by_profile_id FROM document_version_signatures WHERE %s AND state = 'REQUESTED' GROUP BY - signed_by + signed_by_profile_id ) SELECT p.id, diff --git a/pkg/coredata/membership_profile_kind.go b/pkg/coredata/membership_profile_kind.go index a1d646381..803086726 100644 --- a/pkg/coredata/membership_profile_kind.go +++ b/pkg/coredata/membership_profile_kind.go @@ -74,9 +74,14 @@ func (mpk MembershipProfileKind) String() string { } func (mpk *MembershipProfileKind) Scan(value any) error { - val, ok := value.(string) - if !ok { - return fmt.Errorf("invalid scan source for MembershipProfileKind, expected string got %T", value) + var val string + switch v := value.(type) { + case string: + val = v + case []byte: + val = string(v) + default: + return fmt.Errorf("unsupported type for MembershipProfileKind: %T", value) } return mpk.UnmarshalText([]byte(val)) diff --git a/pkg/coredata/people_filter.go b/pkg/coredata/people_filter.go deleted file mode 100644 index 36a656d2f..000000000 --- a/pkg/coredata/people_filter.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2025 Probo Inc . -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -// PERFORMANCE OF THIS SOFTWARE. - -package coredata - -import ( - "time" - - "github.com/jackc/pgx/v5" -) - -type ( - PeopleFilter struct { - excludeContractEnded *bool - currentDate time.Time - } -) - -func NewPeopleFilter(excludeContractEnded *bool) *PeopleFilter { - return &PeopleFilter{ - excludeContractEnded: excludeContractEnded, - currentDate: time.Now(), - } -} - -func (f *PeopleFilter) SQLArguments() pgx.StrictNamedArgs { - return pgx.StrictNamedArgs{ - "exclude_contract_ended": f.excludeContractEnded, - "current_date": f.currentDate, - } -} - -func (f *PeopleFilter) SQLFragment() string { - return ` -( - CASE - WHEN @exclude_contract_ended::boolean IS NOT NULL AND @exclude_contract_ended::boolean = true THEN - (contract_end_date IS NULL OR contract_end_date >= @current_date::date) - ELSE TRUE - END -)` -} diff --git a/pkg/coredata/people_kind.go b/pkg/coredata/people_kind.go deleted file mode 100644 index 06fed1bec..000000000 --- a/pkg/coredata/people_kind.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2025 Probo Inc . -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -// PERFORMANCE OF THIS SOFTWARE. - -package coredata - -import ( - "database/sql/driver" - "fmt" -) - -type ( - PeopleKind uint8 -) - -const ( - PeopleKindEmployee PeopleKind = iota - PeopleKindContractor - PeopleKindServiceAccount -) - -func PeopleKinds() []PeopleKind { - return []PeopleKind{ - PeopleKindEmployee, - PeopleKindContractor, - PeopleKindServiceAccount, - } -} - -func (ps PeopleKind) MarshalText() ([]byte, error) { - return []byte(ps.String()), nil -} - -func (ps *PeopleKind) UnmarshalText(data []byte) error { - val := string(data) - - switch val { - case PeopleKindEmployee.String(): - *ps = PeopleKindEmployee - case PeopleKindContractor.String(): - *ps = PeopleKindContractor - case PeopleKindServiceAccount.String(): - *ps = PeopleKindServiceAccount - default: - return fmt.Errorf("invalid PeopleKind value: %q", val) - } - - return nil -} - -func (ts PeopleKind) String() string { - var val string - - switch ts { - case PeopleKindEmployee: - val = "EMPLOYEE" - case PeopleKindContractor: - val = "CONTRACTOR" - case PeopleKindServiceAccount: - val = "SERVICE_ACCOUNT" - } - - return val -} - -func (pk *PeopleKind) Scan(value any) error { - val, ok := value.(string) - if !ok { - return fmt.Errorf("invalid scan source for PeopleKind, expected string got %T", value) - } - - return pk.UnmarshalText([]byte(val)) -} - -func (pk PeopleKind) Value() (driver.Value, error) { - return pk.String(), nil -} diff --git a/pkg/coredata/risk.go b/pkg/coredata/risk.go index 931298d58..09846612d 100644 --- a/pkg/coredata/risk.go +++ b/pkg/coredata/risk.go @@ -175,7 +175,7 @@ WITH rsks AS ( INNER JOIN risks_measures rm ON r.id = rm.risk_id LEFT JOIN - peoples p ON r.owner_profile_id = p.id + iam_membership_profiles p ON r.owner_profile_id = p.id WHERE rm.measure_id = @measure_id ) @@ -293,7 +293,7 @@ WITH rsks AS ( FROM risks r LEFT JOIN - peoples p ON r.owner_profile_id = p.id + iam_membership_profiles p ON r.owner_profile_id = p.id WHERE r.organization_id = @organization_id ) diff --git a/pkg/iam/organization_service.go b/pkg/iam/organization_service.go index 69366be56..e6f068466 100644 --- a/pkg/iam/organization_service.go +++ b/pkg/iam/organization_service.go @@ -196,7 +196,7 @@ func (upr *UpdateProfileRequest) Validate() error { v := validator.New() v.Check(upr.ID, "id", validator.Required(), validator.GID(coredata.MembershipProfileEntityType)) - v.Check(upr.Kind, "kind", validator.OneOfSlice(coredata.PeopleKinds())) + v.Check(upr.Kind, "kind", validator.OneOfSlice(coredata.MembershipProfileKinds())) v.Check(upr.FullName, "full_name", validator.SafeTextNoNewLine(NameMaxLength)) v.CheckEach(upr.AdditionalEmailAddresses, "additional_email_addresses", func(index int, item any) { v.Check(item, fmt.Sprintf("additional_email_addresses[%d]", index), validator.Required(), validator.NotEmpty()) @@ -996,7 +996,9 @@ func (s *OrganizationService) UpdateProfile(ctx context.Context, req *UpdateProf profile.AdditionalEmailAddresses = req.AdditionalEmailAddresses - profile.Position = *req.Position + if req.Position != nil { + profile.Position = *req.Position + } if req.ContractStartDate != nil { profile.ContractStartDate = *req.ContractStartDate diff --git a/pkg/probo/document_service.go b/pkg/probo/document_service.go index 92cc08736..49aa29b3f 100644 --- a/pkg/probo/document_service.go +++ b/pkg/probo/document_service.go @@ -462,7 +462,7 @@ func (s *DocumentService) Create( func (s *DocumentService) ListSigningRequests( ctx context.Context, organizationID gid.GID, - peopleID gid.GID, + profileID gid.GID, ) ([]map[string]any, error) { q := ` SELECT @@ -476,7 +476,7 @@ FROM INNER JOIN organizations o ON o.id = p.organization_id WHERE p.tenant_id = $1 - AND pvs.signed_by = $2 + AND pvs.signed_by_profile_id = $2 AND pvs.signed_at IS NULL AND pv.status = 'PUBLISHED' AND pv.version_number = ( @@ -491,7 +491,7 @@ WHERE err := s.svc.pg.WithConn( ctx, func(conn pg.Conn) error { - rows, err := conn.Query(ctx, q, s.svc.scope.GetTenantID(), peopleID) + rows, err := conn.Query(ctx, q, s.svc.scope.GetTenantID(), profileID) if err != nil { return fmt.Errorf("cannot query documents: %w", err) }