diff --git a/backend/internal/application/services/expected_signer_service.go b/backend/internal/application/services/expected_signer_service.go deleted file mode 100644 index 62a9ba0..0000000 --- a/backend/internal/application/services/expected_signer_service.go +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -package services - -import ( - "context" - - "github.com/btouchard/ackify-ce/internal/domain/models" -) - -type expectedSignerRepo interface { - ListByDocID(ctx context.Context, docID string) ([]*models.ExpectedSigner, error) - ListWithStatusByDocID(ctx context.Context, docID string) ([]*models.ExpectedSignerWithStatus, error) - AddExpected(ctx context.Context, docID string, contacts []models.ContactInfo, addedBy string) error - Remove(ctx context.Context, docID, email string) error - GetStats(ctx context.Context, docID string) (*models.DocCompletionStats, error) -} - -// ExpectedSignerService handles expected signer operations -type ExpectedSignerService struct { - repo expectedSignerRepo -} - -// NewExpectedSignerService creates a new expected signer service -func NewExpectedSignerService(repo expectedSignerRepo) *ExpectedSignerService { - return &ExpectedSignerService{repo: repo} -} - -// ListByDocID returns all expected signers for a document -func (s *ExpectedSignerService) ListByDocID(ctx context.Context, docID string) ([]*models.ExpectedSigner, error) { - return s.repo.ListByDocID(ctx, docID) -} - -// ListWithStatusByDocID returns all expected signers with their signature status -func (s *ExpectedSignerService) ListWithStatusByDocID(ctx context.Context, docID string) ([]*models.ExpectedSignerWithStatus, error) { - return s.repo.ListWithStatusByDocID(ctx, docID) -} - -// AddExpected adds expected signers to a document -func (s *ExpectedSignerService) AddExpected(ctx context.Context, docID string, contacts []models.ContactInfo, addedBy string) error { - return s.repo.AddExpected(ctx, docID, contacts, addedBy) -} - -// Remove removes an expected signer from a document -func (s *ExpectedSignerService) Remove(ctx context.Context, docID, email string) error { - return s.repo.Remove(ctx, docID, email) -} - -// GetStats returns completion statistics for a document -func (s *ExpectedSignerService) GetStats(ctx context.Context, docID string) (*models.DocCompletionStats, error) { - return s.repo.GetStats(ctx, docID) -} diff --git a/backend/internal/infrastructure/authorization/document_authorizer.go b/backend/internal/infrastructure/authorization/document_authorizer.go deleted file mode 100644 index 4df34f0..0000000 --- a/backend/internal/infrastructure/authorization/document_authorizer.go +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -package authorization - -import ( - "context" - "strings" - - "github.com/btouchard/ackify-ce/internal/domain/models" -) - -type CEDocumentAuthorizer struct { - adminEmails []string - onlyAdminCanCreate bool -} - -func NewCEDocumentAuthorizer(adminEmails []string, onlyAdminCanCreate bool) *CEDocumentAuthorizer { - return &CEDocumentAuthorizer{ - adminEmails: adminEmails, - onlyAdminCanCreate: onlyAdminCanCreate, - } -} - -func (a *CEDocumentAuthorizer) CanCreateDocument(ctx context.Context, user *models.User) bool { - if !a.onlyAdminCanCreate { - return true - } - - if user == nil { - return false - } - - for _, adminEmail := range a.adminEmails { - if strings.EqualFold(user.Email, adminEmail) { - return true - } - } - - return false -} diff --git a/backend/pkg/coreapp/deps.go b/backend/pkg/coreapp/deps.go deleted file mode 100644 index c743ec7..0000000 --- a/backend/pkg/coreapp/deps.go +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -package coreapp - -import ( - "context" - - "github.com/btouchard/ackify-ce/internal/application/services" - "github.com/btouchard/ackify-ce/internal/domain/models" -) - -type DocumentService interface { - // Creation - CreateDocument(ctx context.Context, req services.CreateDocumentRequest) (*models.Document, error) - FindOrCreateDocument(ctx context.Context, ref string) (*models.Document, bool, error) - FindByReference(ctx context.Context, ref string, refType string) (*models.Document, error) - // Read - List(ctx context.Context, limit, offset int) ([]*models.Document, error) - Search(ctx context.Context, query string, limit, offset int) ([]*models.Document, error) - Count(ctx context.Context, searchQuery string) (int, error) - GetByDocID(ctx context.Context, docID string) (*models.Document, error) - // Write - CreateOrUpdate(ctx context.Context, docID string, input models.DocumentInput, createdBy string) (*models.Document, error) - Delete(ctx context.Context, docID string) error -} - -type SignatureService interface { - CreateSignature(ctx context.Context, request *models.SignatureRequest) error - GetSignatureStatus(ctx context.Context, docID string, user *models.User) (*models.SignatureStatus, error) - GetSignatureByDocAndUser(ctx context.Context, docID string, user *models.User) (*models.Signature, error) - GetDocumentSignatures(ctx context.Context, docID string) ([]*models.Signature, error) - GetUserSignatures(ctx context.Context, user *models.User) ([]*models.Signature, error) -} - -type ExpectedSignerService interface { - ListByDocID(ctx context.Context, docID string) ([]*models.ExpectedSigner, error) - ListWithStatusByDocID(ctx context.Context, docID string) ([]*models.ExpectedSignerWithStatus, error) - AddExpected(ctx context.Context, docID string, contacts []models.ContactInfo, addedBy string) error - Remove(ctx context.Context, docID, email string) error - GetStats(ctx context.Context, docID string) (*models.DocCompletionStats, error) -} - -type ReminderService interface { - SendReminders(ctx context.Context, docID, sentBy string, specificEmails []string, docURL string, locale string) (*models.ReminderSendResult, error) - GetReminderHistory(ctx context.Context, docID string) ([]*models.ReminderLog, error) - GetReminderStats(ctx context.Context, docID string) (*models.ReminderStats, error) -} - -type WebhookPublisher interface { - Publish(ctx context.Context, eventType string, payload map[string]interface{}) error -} - -type DocumentAuthorizer interface { - CanCreateDocument(ctx context.Context, user *models.User) bool -} - -type CoreDeps struct { - Documents DocumentService - DocumentAuthorizer DocumentAuthorizer - Signatures SignatureService - ExpectedSigners ExpectedSignerService - Reminders ReminderService - WebhookPublisher WebhookPublisher - BaseURL string - ImportMaxSigners int -} diff --git a/backend/pkg/coreapp/handlers.go b/backend/pkg/coreapp/handlers.go deleted file mode 100644 index 1ba13c0..0000000 --- a/backend/pkg/coreapp/handlers.go +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -package coreapp - -import ( - "github.com/btouchard/ackify-ce/internal/presentation/api/admin" - "github.com/btouchard/ackify-ce/internal/presentation/api/documents" - "github.com/btouchard/ackify-ce/internal/presentation/api/signatures" -) - -type CoreHandlers struct { - Documents *documents.Handler - Signatures *signatures.Handler - Admin *admin.Handler -} - -func NewCoreHandlers(deps CoreDeps) *CoreHandlers { - return &CoreHandlers{ - Documents: documents.NewHandler( - deps.Signatures, - deps.Documents, - deps.Documents, // DocumentService implements documentRepository interface - deps.ExpectedSigners, // ExpectedSignerService implements expectedSignerRepository interface - deps.WebhookPublisher, - deps.DocumentAuthorizer, - ), - Signatures: signatures.NewHandler( - deps.Signatures, - deps.ExpectedSigners, // ExpectedSignerService implements expectedSignerStatsRepo interface - deps.WebhookPublisher, - ), - Admin: admin.NewHandler( - deps.Documents, // DocumentService implements documentRepository interface - deps.ExpectedSigners, // ExpectedSignerService implements expectedSignerRepository interface - deps.Reminders, - deps.Signatures, - deps.BaseURL, - deps.ImportMaxSigners, - ), - } -} diff --git a/backend/pkg/coreapp/router.go b/backend/pkg/coreapp/router.go deleted file mode 100644 index 1dc5044..0000000 --- a/backend/pkg/coreapp/router.go +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -package coreapp - -import "github.com/go-chi/chi/v5" - -type RouteRegistrar func(r chi.Router) - -type HandlerGroups struct { - RegisterPublic RouteRegistrar - RegisterUser RouteRegistrar - RegisterAdmin RouteRegistrar -} - -func NewHandlerGroups(deps CoreDeps) HandlerGroups { - h := NewCoreHandlers(deps) - - return HandlerGroups{ - RegisterPublic: func(r chi.Router) { - r.Route("/documents", func(r chi.Router) { - r.Get("/", h.Documents.HandleListDocuments) - r.Get("/{docId}", h.Documents.HandleGetDocument) - r.Get("/{docId}/signatures", h.Documents.HandleGetDocumentSignatures) - r.Get("/{docId}/expected-signers", h.Documents.HandleGetExpectedSigners) - }) - }, - - RegisterUser: func(r chi.Router) { - r.Post("/documents", h.Documents.HandleCreateDocument) - r.Get("/documents/find-or-create", h.Documents.HandleFindOrCreateDocument) - r.Get("/signatures", h.Signatures.HandleGetUserSignatures) - r.Post("/signatures", h.Signatures.HandleCreateSignature) - r.Get("/documents/{docId}/signatures/status", h.Signatures.HandleGetSignatureStatus) - }, - - RegisterAdmin: func(r chi.Router) { - r.Route("/admin/documents", func(r chi.Router) { - r.Get("/", h.Admin.HandleListDocuments) - r.Get("/{docId}", h.Admin.HandleGetDocument) - r.Get("/{docId}/signers", h.Admin.HandleGetDocumentWithSigners) - r.Get("/{docId}/status", h.Admin.HandleGetDocumentStatus) - r.Put("/{docId}/metadata", h.Admin.HandleUpdateDocumentMetadata) - r.Delete("/{docId}", h.Admin.HandleDeleteDocument) - r.Post("/{docId}/signers", h.Admin.HandleAddExpectedSigner) - r.Delete("/{docId}/signers/{email}", h.Admin.HandleRemoveExpectedSigner) - r.Post("/{docId}/signers/preview-csv", h.Admin.HandlePreviewCSV) - r.Post("/{docId}/signers/import", h.Admin.HandleImportSigners) - r.Post("/{docId}/reminders", h.Admin.HandleSendReminders) - r.Get("/{docId}/reminders", h.Admin.HandleGetReminderHistory) - }) - }, - } -}