Remove tenant service pattern
Signed-off-by: Bryan Frimin <bryan@probo.com>
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user