From 5fb389e8bc43a7d917d8c7955b63bf48cdc585af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89mile=20R=C3=A9?= Date: Fri, 6 Feb 2026 20:03:47 +0400 Subject: [PATCH] Remove people service and coredata MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Émile Ré --- pkg/coredata/membership_profile.go | 74 ++++- pkg/coredata/people.go | 358 ----------------------- pkg/coredata/people_order_field.go | 42 --- pkg/probo/document_service.go | 12 +- pkg/probo/people_service.go | 315 -------------------- pkg/probo/service.go | 2 - pkg/server/api/console/v1/resolver.go | 4 +- pkg/server/api/console/v1/v1_resolver.go | 2 +- 8 files changed, 76 insertions(+), 733 deletions(-) delete mode 100644 pkg/coredata/people.go delete mode 100644 pkg/coredata/people_order_field.go delete mode 100644 pkg/probo/people_service.go diff --git a/pkg/coredata/membership_profile.go b/pkg/coredata/membership_profile.go index 99c0dd79e..264c712cc 100644 --- a/pkg/coredata/membership_profile.go +++ b/pkg/coredata/membership_profile.go @@ -117,7 +117,7 @@ LIMIT 1; rows, err := conn.Query(ctx, q, args) if err != nil { - return fmt.Errorf("cannot query identity profile: %w", err) + return fmt.Errorf("cannot query profile: %w", err) } profile, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[MembershipProfile]) @@ -126,7 +126,7 @@ LIMIT 1; return ErrResourceNotFound } - return fmt.Errorf("cannot collect identity profile: %w", err) + return fmt.Errorf("cannot collect profile: %w", err) } *p = profile @@ -172,7 +172,7 @@ LIMIT 1; rows, err := conn.Query(ctx, q, args) if err != nil { - return fmt.Errorf("cannot query identity profile: %w", err) + return fmt.Errorf("cannot query profile: %w", err) } profile, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[MembershipProfile]) @@ -181,7 +181,67 @@ LIMIT 1; return ErrResourceNotFound } - return fmt.Errorf("cannot collect identity profile: %w", err) + return fmt.Errorf("cannot collect profile: %w", err) + } + + *p = profile + + return nil +} + +func (p *MembershipProfile) LoadByIdentityIDAndOrganizationID( + ctx context.Context, + conn pg.Conn, + scope Scoper, + identityID gid.GID, + organizationID gid.GID, +) error { + q := ` +SELECT + p.id, + p.identity_id, + p.organization_id, + p.membership_id, + i.email_address, + p.full_name, + p.kind, + p.additional_email_addresses, + p.position, + p.contract_start_date, + p.contract_end_date, + p.created_at, + p.updated_at +FROM + iam_membership_profiles p +INNER JOIN identities i + ON i.id = p.identity_id +WHERE + p.%s + AND p.identity_id = @identity_id + AND p.organization_id = @organization_id +LIMIT 1; +` + + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.StrictNamedArgs{ + "identity_id": identityID, + "organization_id": organizationID, + } + maps.Copy(args, scope.SQLArguments()) + + rows, err := conn.Query(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot query profile: %w", err) + } + + profile, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[MembershipProfile]) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return ErrResourceNotFound + } + + return fmt.Errorf("cannot collect profile: %w", err) } *p = profile @@ -494,7 +554,7 @@ VALUES ( _, err := conn.Exec(ctx, q, args) if err != nil { - return fmt.Errorf("cannot insert identity profile: %w", err) + return fmt.Errorf("cannot insert profile: %w", err) } return nil @@ -537,7 +597,7 @@ WHERE result, err := conn.Exec(ctx, q, args) if err != nil { - return fmt.Errorf("cannot update identity profile: %w", err) + return fmt.Errorf("cannot update profile: %w", err) } if result.RowsAffected() == 0 { @@ -568,7 +628,7 @@ WHERE result, err := conn.Exec(ctx, q, args) if err != nil { - return fmt.Errorf("cannot delete identity profile: %w", err) + return fmt.Errorf("cannot delete profile: %w", err) } if result.RowsAffected() == 0 { diff --git a/pkg/coredata/people.go b/pkg/coredata/people.go deleted file mode 100644 index d16e3896b..000000000 --- a/pkg/coredata/people.go +++ /dev/null @@ -1,358 +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 ( - "context" - "errors" - "fmt" - "maps" - "time" - - "github.com/jackc/pgx/v5" - "github.com/jackc/pgx/v5/pgconn" - "go.gearno.de/kit/pg" - "go.probo.inc/probo/pkg/gid" - "go.probo.inc/probo/pkg/mail" - "go.probo.inc/probo/pkg/page" -) - -type ( - People struct { - ID gid.GID `db:"id"` - OrganizationID gid.GID `db:"organization_id"` - Kind PeopleKind `db:"kind"` - FullName string `db:"full_name"` - PrimaryEmailAddress mail.Addr `db:"primary_email_address"` - AdditionalEmailAddresses mail.Addrs `db:"additional_email_addresses"` - Position *string `db:"position"` - ContractStartDate *time.Time `db:"contract_start_date"` - ContractEndDate *time.Time `db:"contract_end_date"` - CreatedAt time.Time `db:"created_at"` - UpdatedAt time.Time `db:"updated_at"` - } - - Peoples []*People -) - -func (p People) CursorKey(orderBy PeopleOrderField) page.CursorKey { - switch orderBy { - case PeopleOrderFieldCreatedAt: - return page.NewCursorKey(p.ID, p.CreatedAt) - case PeopleOrderFieldFullName: - return page.NewCursorKey(p.ID, p.FullName) - case PeopleOrderFieldKind: - return page.NewCursorKey(p.ID, p.Kind) - } - - panic(fmt.Sprintf("unsupported order by: %s", orderBy)) -} - -func (p *People) AuthorizationAttributes(ctx context.Context, conn pg.Conn) (map[string]string, error) { - q := `SELECT organization_id FROM peoples WHERE id = $1 LIMIT 1;` - - var organizationID gid.GID - if err := conn.QueryRow(ctx, q, p.ID).Scan(&organizationID); err != nil { - if errors.Is(err, pgx.ErrNoRows) { - return nil, ErrResourceNotFound - } - return nil, fmt.Errorf("cannot query people authorization attributes: %w", err) - } - - return map[string]string{"organization_id": organizationID.String()}, nil -} - -// FIXME remove: only used in people_service -func (p *People) LoadByID( - ctx context.Context, - conn pg.Conn, - scope Scoper, - peopleID gid.GID, -) error { - return nil -} - -// FIXME remove: only used in document_service -func (p *People) LoadByEmailAndOrganizationID( - ctx context.Context, - conn pg.Conn, - scope Scoper, - primaryEmailAddress mail.Addr, - organizationID gid.GID, -) error { - q := ` -SELECT - id, - organization_id, - kind, - full_name, - primary_email_address, - additional_email_addresses, - position, - contract_start_date, - contract_end_date, - created_at, - updated_at -FROM - peoples -WHERE - %s - AND primary_email_address = @primary_email_address - AND organization_id = @organization_id -LIMIT 1; - ` - - q = fmt.Sprintf(q, scope.SQLFragment()) - - args := pgx.StrictNamedArgs{ - "primary_email_address": primaryEmailAddress, - "organization_id": organizationID, - } - maps.Copy(args, scope.SQLArguments()) - - rows, err := conn.Query(ctx, q, args) - if err != nil { - return fmt.Errorf("cannot query people: %w", err) - } - - people, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[People]) - if err != nil { - if errors.Is(err, pgx.ErrNoRows) { - return ErrResourceNotFound - } - - return fmt.Errorf("cannot collect people: %w", err) - } - - *p = people - - return nil -} - -// FIXME remove: only used in people_service -func (p People) Insert( - ctx context.Context, - conn pg.Conn, - scope Scoper, -) error { - q := ` -INSERT INTO - peoples ( - tenant_id, - id, - organization_id, - kind, - full_name, - primary_email_address, - additional_email_addresses, - position, - contract_start_date, - contract_end_date, - created_at, - updated_at - ) -VALUES ( - @tenant_id, - @people_id, - @organization_id, - @kind, - @full_name, - @primary_email_address, - @additional_email_addresses, - @position, - @contract_start_date, - @contract_end_date, - @created_at, - @updated_at -) -` - - args := pgx.StrictNamedArgs{ - "tenant_id": scope.GetTenantID(), - "people_id": p.ID, - "organization_id": p.OrganizationID, - "kind": p.Kind, - "full_name": p.FullName, - "primary_email_address": p.PrimaryEmailAddress, - "additional_email_addresses": p.AdditionalEmailAddresses, - "position": p.Position, - "contract_start_date": p.ContractStartDate, - "contract_end_date": p.ContractEndDate, - "created_at": p.CreatedAt, - "updated_at": p.UpdatedAt, - } - _, err := conn.Exec(ctx, q, args) - return err -} - -// FIXME remove: only used in people_service -func (p People) Delete( - ctx context.Context, - conn pg.Conn, - scope Scoper, -) error { - q := ` -DELETE FROM peoples WHERE %s AND id = @people_id -` - - q = fmt.Sprintf(q, scope.SQLFragment()) - - args := pgx.StrictNamedArgs{"people_id": p.ID} - maps.Copy(args, scope.SQLArguments()) - - _, err := conn.Exec(ctx, q, args) - if err != nil { - var pgErr *pgconn.PgError - if errors.As(err, &pgErr) { - if pgErr.Code == "23503" { - return ErrResourceInUse - } - } - return fmt.Errorf("cannot delete person: %w", err) - } - - return nil -} - -// FIXME remove: only used in people_service -func (p *Peoples) CountByOrganizationID( - ctx context.Context, - conn pg.Conn, - scope Scoper, - organizationID gid.GID, - filter *PeopleFilter, -) (int, error) { - q := ` -SELECT - COUNT(id) -FROM - peoples -WHERE - %s - AND organization_id = @organization_id - AND %s -` - - q = fmt.Sprintf(q, scope.SQLFragment(), filter.SQLFragment()) - - args := pgx.StrictNamedArgs{"organization_id": organizationID} - maps.Copy(args, scope.SQLArguments()) - maps.Copy(args, filter.SQLArguments()) - - row := conn.QueryRow(ctx, q, args) - - var count int - err := row.Scan(&count) - if err != nil { - return 0, fmt.Errorf("cannot count people: %w", err) - } - - return count, nil -} - -// FIXME remove: only used in people_service -func (p *Peoples) LoadByOrganizationID( - ctx context.Context, - conn pg.Conn, - scope Scoper, - organizationID gid.GID, - cursor *page.Cursor[PeopleOrderField], - filter *PeopleFilter, -) error { - q := ` -SELECT - id, - organization_id, - kind, - full_name, - primary_email_address, - additional_email_addresses, - position, - contract_start_date, - contract_end_date, - created_at, - updated_at -FROM - peoples -WHERE - %s - AND organization_id = @organization_id - AND %s - AND %s -` - - q = fmt.Sprintf(q, scope.SQLFragment(), filter.SQLFragment(), cursor.SQLFragment()) - - args := pgx.StrictNamedArgs{"organization_id": organizationID} - maps.Copy(args, cursor.SQLArguments()) - maps.Copy(args, scope.SQLArguments()) - maps.Copy(args, filter.SQLArguments()) - - rows, err := conn.Query(ctx, q, args) - if err != nil { - return fmt.Errorf("cannot query people: %w", err) - } - - peoples, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[People]) - if err != nil { - return fmt.Errorf("cannot collect people: %w", err) - } - - *p = peoples - - return nil -} - -// FIXME remove: only used in people_service -func (p *People) Update( - ctx context.Context, - conn pg.Conn, - scope Scoper, -) error { - q := ` -UPDATE peoples SET - full_name = @full_name, - primary_email_address = @primary_email_address, - additional_email_addresses = @additional_email_addresses, - kind = @kind, - position = @position, - contract_start_date = @contract_start_date, - contract_end_date = @contract_end_date, - updated_at = @updated_at -WHERE %s - AND id = @people_id -` - q = fmt.Sprintf(q, scope.SQLFragment()) - - args := pgx.StrictNamedArgs{ - "people_id": p.ID, - "full_name": p.FullName, - "primary_email_address": p.PrimaryEmailAddress, - "additional_email_addresses": p.AdditionalEmailAddresses, - "kind": p.Kind, - "position": p.Position, - "contract_start_date": p.ContractStartDate, - "contract_end_date": p.ContractEndDate, - "updated_at": p.UpdatedAt, - } - maps.Copy(args, scope.SQLArguments()) - - _, err := conn.Exec(ctx, q, args) - if err != nil { - return fmt.Errorf("cannot update people: %w", err) - } - - return nil -} diff --git a/pkg/coredata/people_order_field.go b/pkg/coredata/people_order_field.go deleted file mode 100644 index 4e5f1be60..000000000 --- a/pkg/coredata/people_order_field.go +++ /dev/null @@ -1,42 +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 - -type ( - PeopleOrderField string -) - -const ( - PeopleOrderFieldCreatedAt PeopleOrderField = "CREATED_AT" - PeopleOrderFieldFullName PeopleOrderField = "FULL_NAME" - PeopleOrderFieldKind PeopleOrderField = "KIND" -) - -func (p PeopleOrderField) Column() string { - return string(p) -} - -func (p PeopleOrderField) String() string { - return string(p) -} - -func (p PeopleOrderField) MarshalText() ([]byte, error) { - return []byte(p.String()), nil -} - -func (p *PeopleOrderField) UnmarshalText(text []byte) error { - *p = PeopleOrderField(text) - return nil -} diff --git a/pkg/probo/document_service.go b/pkg/probo/document_service.go index 86b3bc730..92cc08736 100644 --- a/pkg/probo/document_service.go +++ b/pkg/probo/document_service.go @@ -604,10 +604,10 @@ func (s *DocumentService) SignDocumentVersion( return nil } -func (s *DocumentService) SignDocumentVersionByEmail( +func (s *DocumentService) SignDocumentVersionByIdentity( ctx context.Context, documentVersionID gid.GID, - userEmail mail.Addr, + identityID gid.GID, ) (*coredata.DocumentVersionSignature, error) { var documentVersionSignature *coredata.DocumentVersionSignature @@ -619,14 +619,14 @@ func (s *DocumentService) SignDocumentVersionByEmail( return fmt.Errorf("cannot get document version: %w", err) } - people := &coredata.People{} + profile := &coredata.MembershipProfile{} // FIXME: will be done differently - if err := people.LoadByEmailAndOrganizationID(ctx, conn, s.svc.scope, userEmail, documentVersion.OrganizationID); err != nil { - return fmt.Errorf("cannot find people record for user email in organization %q: %w", documentVersion.OrganizationID, err) + if err := profile.LoadByIdentityIDAndOrganizationID(ctx, conn, s.svc.scope, identityID, documentVersion.OrganizationID); err != nil { + return fmt.Errorf("cannot find profile record for user email in organization %q: %w", documentVersion.OrganizationID, err) } var signErr error - documentVersionSignature, signErr = s.signDocumentVersionInTx(ctx, conn, documentVersionID, people.ID) + documentVersionSignature, signErr = s.signDocumentVersionInTx(ctx, conn, documentVersionID, profile.ID) return signErr }, ) diff --git a/pkg/probo/people_service.go b/pkg/probo/people_service.go deleted file mode 100644 index cf6c63367..000000000 --- a/pkg/probo/people_service.go +++ /dev/null @@ -1,315 +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 probo - -import ( - "context" - "fmt" - "time" - - "go.gearno.de/kit/pg" - "go.probo.inc/probo/pkg/coredata" - "go.probo.inc/probo/pkg/gid" - "go.probo.inc/probo/pkg/mail" - "go.probo.inc/probo/pkg/page" - "go.probo.inc/probo/pkg/validator" -) - -type ( - PeopleService struct { - svc *TenantService - } - - CreatePeopleRequest struct { - OrganizationID gid.GID - FullName string - PrimaryEmailAddress mail.Addr - AdditionalEmailAddresses []mail.Addr - Kind coredata.PeopleKind - Position *string - ContractStartDate *time.Time - ContractEndDate *time.Time - } - - UpdatePeopleRequest struct { - ID gid.GID - Kind *coredata.PeopleKind - FullName *string - PrimaryEmailAddress *mail.Addr - AdditionalEmailAddresses *[]mail.Addr - Position **string - ContractStartDate **time.Time - ContractEndDate **time.Time - } -) - -func (cpr *CreatePeopleRequest) Validate() error { - v := validator.New() - - v.Check(cpr.OrganizationID, "organization_id", validator.Required(), validator.GID(coredata.OrganizationEntityType)) - v.Check(cpr.FullName, "full_name", validator.SafeTextNoNewLine(NameMaxLength)) - v.Check(cpr.PrimaryEmailAddress, "primary_email_address", validator.Required(), validator.NotEmpty()) - v.CheckEach(cpr.AdditionalEmailAddresses, "additional_email_addresses", func(index int, item any) { - v.Check(item, fmt.Sprintf("additional_email_addresses[%d]", index), validator.Required(), validator.NotEmpty()) - }) - v.Check(cpr.Kind, "kind", validator.Required(), validator.OneOfSlice(coredata.PeopleKinds())) - v.Check(cpr.Position, "position", validator.SafeText(TitleMaxLength)) - v.Check(cpr.ContractStartDate, "contract_start_date", validator.Before(cpr.ContractEndDate)) - v.Check(cpr.ContractEndDate, "contract_end_date", validator.After(cpr.ContractStartDate)) - - return v.Error() -} - -func (upr *UpdatePeopleRequest) Validate() error { - v := validator.New() - - // v.Check(upr.ID, "id", validator.Required(), validator.GID(coredata.PeopleEntityType)) - v.Check(upr.Kind, "kind", validator.OneOfSlice(coredata.PeopleKinds())) - v.Check(upr.FullName, "full_name", validator.SafeTextNoNewLine(NameMaxLength)) - v.Check(upr.PrimaryEmailAddress, "primary_email_address", validator.NotEmpty()) - 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()) - }) - v.Check(upr.Position, "position", validator.SafeText(TitleMaxLength)) - v.Check(upr.ContractStartDate, "contract_start_date", validator.Before(upr.ContractEndDate)) - v.Check(upr.ContractEndDate, "contract_end_date", validator.After(upr.ContractStartDate)) - - return v.Error() -} - -func (s PeopleService) Get( - ctx context.Context, - peopleID gid.GID, -) (*coredata.People, error) { - people := &coredata.People{} - - err := s.svc.pg.WithConn( - ctx, - func(conn pg.Conn) error { - return people.LoadByID(ctx, conn, s.svc.scope, peopleID) - }, - ) - - if err != nil { - return nil, err - } - - return people, nil -} - -func (s PeopleService) GetByEmailAndOrganizationID( - ctx context.Context, - primaryEmailAddress mail.Addr, - organizationID gid.GID, -) (*coredata.People, error) { - people := &coredata.People{} - - err := s.svc.pg.WithConn( - ctx, - func(conn pg.Conn) error { - err := people.LoadByEmailAndOrganizationID(ctx, conn, s.svc.scope, primaryEmailAddress, organizationID) - if err != nil { - return fmt.Errorf("cannot load people by email and organization ID: %w", err) - } - - return nil - }, - ) - if err != nil { - return nil, err - } - - return people, nil -} - -func (s PeopleService) CountForOrganizationID( - ctx context.Context, - organizationID gid.GID, - filter *coredata.PeopleFilter, -) (int, error) { - var count int - - err := s.svc.pg.WithConn( - ctx, - func(conn pg.Conn) (err error) { - peoples := coredata.Peoples{} - count, err = peoples.CountByOrganizationID(ctx, conn, s.svc.scope, organizationID, filter) - if err != nil { - return fmt.Errorf("cannot count peoples: %w", err) - } - - return nil - }, - ) - - if err != nil { - return 0, err - } - - return count, nil -} - -func (s PeopleService) ListForOrganizationID( - ctx context.Context, - organizationID gid.GID, - cursor *page.Cursor[coredata.PeopleOrderField], - filter *coredata.PeopleFilter, -) (*page.Page[*coredata.People, coredata.PeopleOrderField], error) { - var peoples coredata.Peoples - - err := s.svc.pg.WithConn( - ctx, - func(conn pg.Conn) error { - return peoples.LoadByOrganizationID( - ctx, - conn, - s.svc.scope, - organizationID, - cursor, - filter, - ) - }, - ) - - if err != nil { - return nil, err - } - - return page.NewPage(peoples, cursor), nil -} - -func (s PeopleService) Update( - ctx context.Context, - req UpdatePeopleRequest, -) (*coredata.People, error) { - if err := req.Validate(); err != nil { - return nil, fmt.Errorf("invalid request: %w", err) - } - - people := &coredata.People{} - - err := s.svc.pg.WithTx( - ctx, - func(conn pg.Conn) error { - if err := people.LoadByID(ctx, conn, s.svc.scope, req.ID); err != nil { - return fmt.Errorf("cannot load people: %w", err) - } - - if req.Kind != nil { - people.Kind = *req.Kind - } - - if req.FullName != nil { - people.FullName = *req.FullName - } - - if req.PrimaryEmailAddress != nil { - people.PrimaryEmailAddress = *req.PrimaryEmailAddress - } - - if req.AdditionalEmailAddresses != nil { - people.AdditionalEmailAddresses = *req.AdditionalEmailAddresses - } - - if req.Position != nil { - people.Position = *req.Position - } - - if req.ContractStartDate != nil { - people.ContractStartDate = *req.ContractStartDate - } - - if req.ContractEndDate != nil { - people.ContractEndDate = *req.ContractEndDate - } - - if people.ContractStartDate != nil && people.ContractEndDate != nil { - if people.ContractEndDate.Before(*people.ContractStartDate) { - return fmt.Errorf("contract end date must be after or equal to start date") - } - } - - people.UpdatedAt = time.Now() - - return people.Update(ctx, conn, s.svc.scope) - }) - if err != nil { - return nil, err - } - - return people, nil -} - -func (s PeopleService) Create( - ctx context.Context, - req CreatePeopleRequest, -) (*coredata.People, error) { - if err := req.Validate(); err != nil { - return nil, fmt.Errorf("invalid request: %w", err) - } - - now := time.Now() - peopleID := gid.New(s.svc.scope.GetTenantID(), 8) - - organization := &coredata.Organization{} - people := &coredata.People{ - ID: peopleID, - OrganizationID: req.OrganizationID, - Kind: req.Kind, - FullName: req.FullName, - PrimaryEmailAddress: req.PrimaryEmailAddress, - AdditionalEmailAddresses: req.AdditionalEmailAddresses, - Position: req.Position, - ContractStartDate: req.ContractStartDate, - ContractEndDate: req.ContractEndDate, - CreatedAt: now, - UpdatedAt: now, - } - - err := s.svc.pg.WithTx( - ctx, - func(conn pg.Conn) error { - if err := organization.LoadByID(ctx, conn, s.svc.scope, req.OrganizationID); err != nil { - return fmt.Errorf("cannot load organization %q: %w", req.OrganizationID, err) - } - - if err := people.Insert(ctx, conn, s.svc.scope); err != nil { - return fmt.Errorf("cannot insert people: %w", err) - } - - return nil - }, - ) - - if err != nil { - return nil, err - } - - return people, nil -} - -func (s PeopleService) Delete( - ctx context.Context, - peopleID gid.GID, -) error { - people := coredata.People{ID: peopleID} - - return s.svc.pg.WithConn( - ctx, - func(conn pg.Conn) error { - return people.Delete(ctx, conn, s.svc.scope) - }, - ) -} diff --git a/pkg/probo/service.go b/pkg/probo/service.go index 3ceb78646..f61edbb57 100644 --- a/pkg/probo/service.go +++ b/pkg/probo/service.go @@ -79,7 +79,6 @@ type ( Evidences *EvidenceService Organizations *OrganizationService Vendors *VendorService - Peoples *PeopleService Documents *DocumentService Controls *ControlService Risks *RiskService @@ -186,7 +185,6 @@ func (s *Service) WithTenant(tenantID gid.TenantID) *TenantService { ), ), } - tenantService.Peoples = &PeopleService{svc: tenantService} tenantService.Vendors = &VendorService{svc: tenantService} tenantService.Documents = &DocumentService{ svc: tenantService, diff --git a/pkg/server/api/console/v1/resolver.go b/pkg/server/api/console/v1/resolver.go index a7fb59217..3a3dc2eea 100644 --- a/pkg/server/api/console/v1/resolver.go +++ b/pkg/server/api/console/v1/resolver.go @@ -249,7 +249,7 @@ func NewMux( svc := proboSvc.WithTenant(data.Data.OrganizationID.TenantID()) // Get the people to get their email for watermark - people, err := svc.Peoples.Get(r.Context(), data.Data.PeopleID) + profile, err := iamSvc.OrganizationService.GetProfile(r.Context(), data.Data.PeopleID) if err != nil { http.Error(w, "cannot get user", http.StatusInternalServerError) return @@ -258,7 +258,7 @@ func NewMux( // Generate PDF with watermark pdfData, err := svc.Documents.ExportPDF(r.Context(), documentVersionID, probo.ExportPDFOptions{ WithWatermark: true, - WatermarkEmail: &people.PrimaryEmailAddress, + WatermarkEmail: &profile.EmailAddress, WithSignatures: false, }) if err != nil { diff --git a/pkg/server/api/console/v1/v1_resolver.go b/pkg/server/api/console/v1/v1_resolver.go index ee5246387..a1cec88d3 100644 --- a/pkg/server/api/console/v1/v1_resolver.go +++ b/pkg/server/api/console/v1/v1_resolver.go @@ -4094,7 +4094,7 @@ func (r *mutationResolver) SignDocument(ctx context.Context, input types.SignDoc identity := authn.IdentityFromContext(ctx) prb := r.ProboService(ctx, input.DocumentVersionID.TenantID()) - documentVersionSignature, err := prb.Documents.SignDocumentVersionByEmail(ctx, input.DocumentVersionID, identity.EmailAddress) + documentVersionSignature, err := prb.Documents.SignDocumentVersionByIdentity(ctx, input.DocumentVersionID, identity.ID) if err != nil { if errors.Is(err, coredata.ErrResourceAlreadyExists) { return nil, gqlutils.Conflict(ctx, err)