Fix people not create when user already exist
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
@@ -16,6 +16,7 @@ package coredata
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"maps"
|
"maps"
|
||||||
"time"
|
"time"
|
||||||
@@ -40,8 +41,16 @@ type (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Peoples []*People
|
Peoples []*People
|
||||||
|
|
||||||
|
ErrPeopleNotFound struct {
|
||||||
|
Identifier string
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func (e ErrPeopleNotFound) Error() string {
|
||||||
|
return fmt.Sprintf("people not found: %s", e.Identifier)
|
||||||
|
}
|
||||||
|
|
||||||
func (p People) CursorKey(orderBy PeopleOrderField) page.CursorKey {
|
func (p People) CursorKey(orderBy PeopleOrderField) page.CursorKey {
|
||||||
switch orderBy {
|
switch orderBy {
|
||||||
case PeopleOrderFieldCreatedAt:
|
case PeopleOrderFieldCreatedAt:
|
||||||
@@ -98,6 +107,55 @@ LIMIT 1;
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *People) LoadByEmail(
|
||||||
|
ctx context.Context,
|
||||||
|
conn pg.Conn,
|
||||||
|
scope Scoper,
|
||||||
|
primaryEmailAddress string,
|
||||||
|
) error {
|
||||||
|
q := `
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
organization_id,
|
||||||
|
kind,
|
||||||
|
user_id,
|
||||||
|
full_name,
|
||||||
|
primary_email_address,
|
||||||
|
additional_email_addresses,
|
||||||
|
created_at,
|
||||||
|
updated_at
|
||||||
|
FROM
|
||||||
|
peoples
|
||||||
|
WHERE
|
||||||
|
%s
|
||||||
|
AND primary_email_address = @primary_email_address
|
||||||
|
LIMIT 1;
|
||||||
|
`
|
||||||
|
|
||||||
|
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||||
|
|
||||||
|
args := pgx.StrictNamedArgs{"primary_email_address": primaryEmailAddress}
|
||||||
|
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 &ErrPeopleNotFound{Identifier: primaryEmailAddress}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("cannot collect people: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
*p = people
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (p *People) LoadByUserID(
|
func (p *People) LoadByUserID(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
conn pg.Conn,
|
conn pg.Conn,
|
||||||
@@ -135,6 +193,10 @@ LIMIT 1;
|
|||||||
|
|
||||||
people, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[People])
|
people, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[People])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if errors.Is(err, pgx.ErrNoRows) {
|
||||||
|
return &ErrPeopleNotFound{Identifier: userID.String()}
|
||||||
|
}
|
||||||
|
|
||||||
return fmt.Errorf("cannot collect people: %w", err)
|
return fmt.Errorf("cannot collect people: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -660,6 +660,34 @@ func (s Service) InviteUser(
|
|||||||
return fmt.Errorf("cannot insert user organization: %w", err)
|
return fmt.Errorf("cannot insert user organization: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
people := &coredata.People{}
|
||||||
|
scope := coredata.NewScope(organizationID.TenantID())
|
||||||
|
if err := people.LoadByEmail(ctx, tx, scope, emailAddress); err != nil {
|
||||||
|
var errPeopleNotFound *coredata.ErrPeopleNotFound
|
||||||
|
|
||||||
|
if errors.As(err, &errPeopleNotFound) {
|
||||||
|
people = &coredata.People{
|
||||||
|
ID: gid.New(organizationID.TenantID(), coredata.PeopleEntityType),
|
||||||
|
OrganizationID: organizationID,
|
||||||
|
UserID: &user.ID,
|
||||||
|
FullName: fullName,
|
||||||
|
PrimaryEmailAddress: emailAddress,
|
||||||
|
Kind: coredata.PeopleKindContractor,
|
||||||
|
AdditionalEmailAddresses: []string{},
|
||||||
|
CreatedAt: time.Now(),
|
||||||
|
UpdatedAt: time.Now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := people.Insert(ctx, tx, scope); err != nil {
|
||||||
|
return fmt.Errorf("cannot insert people: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("cannot load people by email: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user