Remove tenant service pattern

Signed-off-by: Bryan Frimin <bryan@probo.com>
This commit is contained in:
Bryan Frimin
2026-05-20 16:18:23 -07:00
parent 30db98455d
commit 3e4a9be7c0
89 changed files with 3510 additions and 3031 deletions

View File

@@ -21,7 +21,6 @@ import (
"go.gearno.de/kit/log"
"go.gearno.de/kit/pg"
"go.probo.inc/probo/pkg/coredata"
"go.probo.inc/probo/pkg/gid"
)
type Service struct {
@@ -32,15 +31,6 @@ type Service struct {
tokenSecret string
}
type TenantService struct {
pg *pg.Client
scope coredata.Scoper
logger *log.Logger
baseURL string
tokenSecret string
SlackMessages *SlackMessageService
}
func NewService(
pg *pg.Client,
slackSigningSecret string,
@@ -57,27 +47,10 @@ func NewService(
}
}
func (s *Service) WithTenant(tenantID gid.TenantID) *TenantService {
tenantService := &TenantService{
pg: s.pg,
scope: coredata.NewScope(tenantID),
logger: s.logger,
baseURL: s.baseURL,
tokenSecret: s.tokenSecret,
}
tenantService.SlackMessages = &SlackMessageService{svc: tenantService}
return tenantService
}
func (s *TenantService) GetSlackClient() *Client {
func (s *Service) GetSlackClient() *Client {
return NewClient(s.logger)
}
func (s *TenantService) GetSlackMessageService() *SlackMessageService {
return &SlackMessageService{svc: s}
}
func (s *Service) GetSlackSigningSecret() string {
return s.slackSigningSecret
}

View File

@@ -38,10 +38,6 @@ var (
)
type (
SlackMessageService struct {
svc *TenantService
}
SlackMessageDocument struct {
ID string
Title string
@@ -77,19 +73,23 @@ func (m SlackMessageMetadata) toMap() map[string]any {
}
}
func (s *SlackMessageService) GetSlackMessageDocumentIDs(
func (s *Service) GetSlackMessageDocumentIDs(
ctx context.Context,
scope coredata.Scoper,
slackMessageID gid.GID,
) (documentIDs []gid.GID, reportIDs []gid.GID, fileIDs []gid.GID, err error) {
var slackMessage coredata.SlackMessage
err = s.svc.pg.WithConn(ctx, func(ctx context.Context, conn pg.Querier) error {
if err := slackMessage.LoadById(ctx, conn, s.svc.scope, slackMessageID); err != nil {
return fmt.Errorf("cannot load slack message: %w", err)
}
err = s.pg.WithConn(
ctx,
func(ctx context.Context, conn pg.Querier) error {
if err := slackMessage.LoadById(ctx, conn, scope, slackMessageID); err != nil {
return fmt.Errorf("cannot load slack message: %w", err)
}
return nil
})
return nil
},
)
if err != nil {
return nil, nil, nil, err
}
@@ -101,93 +101,98 @@ func (s *SlackMessageService) GetSlackMessageDocumentIDs(
return documentIDs, reportIDs, fileIDs, nil
}
func (s *SlackMessageService) UpdateSlackAccessMessage(
func (s *Service) UpdateSlackAccessMessage(
ctx context.Context,
scope coredata.Scoper,
slackMessageID gid.GID,
responseURL string,
requesterEmail mail.Addr,
) error {
return s.svc.pg.WithTx(ctx, func(ctx context.Context, tx pg.Tx) error {
var slackMessage coredata.SlackMessage
if err := slackMessage.LoadById(ctx, tx, s.svc.scope, slackMessageID); err != nil {
return fmt.Errorf("cannot load slack message: %w", err)
}
return s.pg.WithTx(
ctx,
func(ctx context.Context, tx pg.Tx) error {
var slackMessage coredata.SlackMessage
if err := slackMessage.LoadById(ctx, tx, scope, slackMessageID); err != nil {
return fmt.Errorf("cannot load slack message: %w", err)
}
var trustCenter coredata.TrustCenter
if err := trustCenter.LoadByOrganizationID(ctx, tx, s.svc.scope, slackMessage.OrganizationID); err != nil {
return fmt.Errorf("cannot load trust center: %w", err)
}
var trustCenter coredata.TrustCenter
if err := trustCenter.LoadByOrganizationID(ctx, tx, scope, slackMessage.OrganizationID); err != nil {
return fmt.Errorf("cannot load trust center: %w", err)
}
identity := &coredata.Identity{}
if err := identity.LoadByEmail(ctx, tx, requesterEmail); err != nil {
return fmt.Errorf("cannot load identity: %w", err)
}
identity := &coredata.Identity{}
if err := identity.LoadByEmail(ctx, tx, requesterEmail); err != nil {
return fmt.Errorf("cannot load identity: %w", err)
}
var trustCenterAccess coredata.TrustCenterAccess
if err := trustCenterAccess.LoadByTrustCenterIDAndIdentityID(ctx, tx, s.svc.scope, trustCenter.ID, identity.ID); err != nil {
return fmt.Errorf("cannot load trust center access: %w", err)
}
var trustCenterAccess coredata.TrustCenterAccess
if err := trustCenterAccess.LoadByTrustCenterIDAndIdentityID(ctx, tx, scope, trustCenter.ID, identity.ID); err != nil {
return fmt.Errorf("cannot load trust center access: %w", err)
}
documents, reports, files, err := s.loadDocumentsReportsAndFilesFromAccesses(ctx, tx, trustCenterAccess.ID)
if err != nil {
return err
}
documents, reports, files, err := s.loadDocumentsReportsAndFilesFromAccesses(ctx, tx, scope, trustCenterAccess.ID)
if err != nil {
return err
}
newSlackMessageID := gid.New(s.svc.scope.GetTenantID(), coredata.SlackMessageEntityType)
newSlackMessageID := gid.New(scope.GetTenantID(), coredata.SlackMessageEntityType)
updatedBody, err := s.buildAccessRequestMessage(
newSlackMessageID,
identity.FullName,
requesterEmail,
trustCenter.OrganizationID,
documents,
reports,
files,
)
if err != nil {
return err
}
updatedBody, err := s.buildAccessRequestMessage(
newSlackMessageID,
identity.FullName,
requesterEmail,
trustCenter.OrganizationID,
documents,
reports,
files,
)
if err != nil {
return err
}
metadata := SlackMessageMetadata{
Documents: documents,
Reports: reports,
Files: files,
}
metadata := SlackMessageMetadata{
Documents: documents,
Reports: reports,
Files: files,
}
now := time.Now()
newSlackMessage := &coredata.SlackMessage{
ID: newSlackMessageID,
OrganizationID: slackMessage.OrganizationID,
Type: slackMessage.Type,
Body: updatedBody,
MessageTS: slackMessage.MessageTS,
ChannelID: slackMessage.ChannelID,
RequesterEmail: slackMessage.RequesterEmail,
Metadata: metadata.toMap(),
InitialSlackMessageID: slackMessage.InitialSlackMessageID,
CreatedAt: now,
UpdatedAt: now,
SentAt: &now,
}
now := time.Now()
newSlackMessage := &coredata.SlackMessage{
ID: newSlackMessageID,
OrganizationID: slackMessage.OrganizationID,
Type: slackMessage.Type,
Body: updatedBody,
MessageTS: slackMessage.MessageTS,
ChannelID: slackMessage.ChannelID,
RequesterEmail: slackMessage.RequesterEmail,
Metadata: metadata.toMap(),
InitialSlackMessageID: slackMessage.InitialSlackMessageID,
CreatedAt: now,
UpdatedAt: now,
SentAt: &now,
}
if err := newSlackMessage.Insert(ctx, tx, s.svc.scope); err != nil {
return fmt.Errorf("cannot insert slack message: %w", err)
}
if err := newSlackMessage.Insert(ctx, tx, scope); err != nil {
return fmt.Errorf("cannot insert slack message: %w", err)
}
if err := s.svc.GetSlackClient().UpdateInteractiveMessage(ctx, responseURL, updatedBody); err != nil {
return fmt.Errorf("cannot update Slack message: %w", err)
}
if err := s.GetSlackClient().UpdateInteractiveMessage(ctx, responseURL, updatedBody); err != nil {
return fmt.Errorf("cannot update Slack message: %w", err)
}
return nil
})
return nil
},
)
}
func (s *SlackMessageService) QueueSlackNotification(
func (s *Service) QueueSlackNotification(
ctx context.Context,
scope coredata.Scoper,
identityID gid.GID,
trustCenterID gid.GID,
) error {
return s.svc.pg.WithTx(ctx, func(ctx context.Context, tx pg.Tx) error {
return s.pg.WithTx(ctx, func(ctx context.Context, tx pg.Tx) error {
var (
identity = &coredata.Identity{}
trustCenterAccess *coredata.TrustCenterAccess
@@ -198,12 +203,12 @@ func (s *SlackMessageService) QueueSlackNotification(
}
trustCenterAccess = &coredata.TrustCenterAccess{}
if err := trustCenterAccess.LoadByTrustCenterIDAndIdentityID(ctx, tx, s.svc.scope, trustCenterID, identityID); err != nil {
if err := trustCenterAccess.LoadByTrustCenterIDAndIdentityID(ctx, tx, scope, trustCenterID, identityID); err != nil {
return fmt.Errorf("cannot load trust center access: %w", err)
}
var trustCenter coredata.TrustCenter
if err := trustCenter.LoadByID(ctx, tx, s.svc.scope, trustCenterID); err != nil {
if err := trustCenter.LoadByID(ctx, tx, scope, trustCenterID); err != nil {
return fmt.Errorf("cannot load trust center: %w", err)
}
@@ -211,7 +216,7 @@ func (s *SlackMessageService) QueueSlackNotification(
if err := connectors.LoadAllByOrganizationIDWithoutDecryptedConnection(
ctx,
tx,
s.svc.scope,
scope,
trustCenter.OrganizationID,
); err != nil {
return fmt.Errorf("cannot load connectors: %w", err)
@@ -230,12 +235,12 @@ func (s *SlackMessageService) QueueSlackNotification(
return ErrNoSlackConnector
}
documents, reports, files, err := s.loadDocumentsReportsAndFilesFromAccesses(ctx, tx, trustCenterAccess.ID)
documents, reports, files, err := s.loadDocumentsReportsAndFilesFromAccesses(ctx, tx, scope, trustCenterAccess.ID)
if err != nil {
return fmt.Errorf("cannot load documents, reports and files: %w", err)
}
slackMessageID := gid.New(s.svc.scope.GetTenantID(), coredata.SlackMessageEntityType)
slackMessageID := gid.New(scope.GetTenantID(), coredata.SlackMessageEntityType)
body, err := s.buildAccessRequestMessage(
slackMessageID,
@@ -275,7 +280,7 @@ func (s *SlackMessageService) QueueSlackNotification(
err = existingMessage.LoadLatestByRequesterEmailAndType(
ctx,
tx,
s.svc.scope,
scope,
trustCenter.OrganizationID,
identity.EmailAddress,
coredata.SlackMessageTypeTrustCenterAccessRequest,
@@ -286,7 +291,7 @@ func (s *SlackMessageService) QueueSlackNotification(
slackMessage.ChannelID = existingMessage.ChannelID
slackMessage.InitialSlackMessageID = existingMessage.InitialSlackMessageID
if err := slackMessage.Insert(ctx, tx, s.svc.scope); err != nil {
if err := slackMessage.Insert(ctx, tx, scope); err != nil {
return fmt.Errorf("cannot insert slack message: %w", err)
}
@@ -299,7 +304,7 @@ func (s *SlackMessageService) QueueSlackNotification(
}
slackMessage.InitialSlackMessageID = slackMessageID
if err := slackMessage.Insert(ctx, tx, s.svc.scope); err != nil {
if err := slackMessage.Insert(ctx, tx, scope); err != nil {
return fmt.Errorf("cannot insert slack message: %w", err)
}
@@ -307,9 +312,10 @@ func (s *SlackMessageService) QueueSlackNotification(
})
}
func (s *SlackMessageService) loadDocumentsReportsAndFilesFromAccesses(
func (s *Service) loadDocumentsReportsAndFilesFromAccesses(
ctx context.Context,
conn pg.Querier,
scope coredata.Scoper,
trustCenterAccessID gid.GID,
) (
documents []SlackMessageDocument,
@@ -322,14 +328,14 @@ func (s *SlackMessageService) loadDocumentsReportsAndFilesFromAccesses(
files = []SlackMessageFile{}
var accesses coredata.TrustCenterDocumentAccesses
if err := accesses.LoadAllByTrustCenterAccessID(ctx, conn, s.svc.scope, trustCenterAccessID); err != nil {
if err := accesses.LoadAllByTrustCenterAccessID(ctx, conn, scope, trustCenterAccessID); err != nil {
return nil, nil, nil, fmt.Errorf("cannot load trust center document accesses: %w", err)
}
for _, access := range accesses {
if access.DocumentID != nil {
doc := &coredata.Document{}
if err := doc.LoadByID(ctx, conn, s.svc.scope, *access.DocumentID); err != nil {
if err := doc.LoadByID(ctx, conn, scope, *access.DocumentID); err != nil {
return nil, nil, nil, fmt.Errorf("cannot load document: %w", err)
}
@@ -345,17 +351,17 @@ func (s *SlackMessageService) loadDocumentsReportsAndFilesFromAccesses(
if access.ReportID != nil {
rep := &coredata.Report{}
if err := rep.LoadByID(ctx, conn, s.svc.scope, *access.ReportID); err != nil {
if err := rep.LoadByID(ctx, conn, scope, *access.ReportID); err != nil {
return nil, nil, nil, fmt.Errorf("cannot load report: %w", err)
}
audit := &coredata.Audit{}
if err := audit.LoadByReportID(ctx, conn, s.svc.scope, *access.ReportID); err != nil {
if err := audit.LoadByReportID(ctx, conn, scope, *access.ReportID); err != nil {
return nil, nil, nil, fmt.Errorf("cannot load audit: %w", err)
}
framework := &coredata.Framework{}
if err := framework.LoadByID(ctx, conn, s.svc.scope, audit.FrameworkID); err != nil {
if err := framework.LoadByID(ctx, conn, scope, audit.FrameworkID); err != nil {
return nil, nil, nil, fmt.Errorf("cannot load framework: %w", err)
}
@@ -377,7 +383,7 @@ func (s *SlackMessageService) loadDocumentsReportsAndFilesFromAccesses(
if access.TrustCenterFileID != nil {
file := &coredata.TrustCenterFile{}
if err := file.LoadByID(ctx, conn, s.svc.scope, *access.TrustCenterFileID); err != nil {
if err := file.LoadByID(ctx, conn, scope, *access.TrustCenterFileID); err != nil {
return nil, nil, nil, fmt.Errorf("cannot load trust center file: %w", err)
}
@@ -396,7 +402,7 @@ func (s *SlackMessageService) loadDocumentsReportsAndFilesFromAccesses(
return documents, reports, files, nil
}
func (s *SlackMessageService) buildAccessRequestMessage(
func (s *Service) buildAccessRequestMessage(
slackMessageID gid.GID,
requesterName string,
requesterEmail mail.Addr,
@@ -405,7 +411,7 @@ func (s *SlackMessageService) buildAccessRequestMessage(
reports []SlackMessageReport,
files []SlackMessageFile,
) (map[string]any, error) {
base, err := baseurl.Parse(s.svc.baseURL)
base, err := baseurl.Parse(s.baseURL)
if err != nil {
return nil, fmt.Errorf("cannot parse base URL: %w", err)
}