service

package
v1.0.34 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 30, 2025 License: AGPL-3.0 Imports: 98 Imported by: 0

Documentation

Overview

Package service provides business logic implementations for the FlexPrice application.

Package service provides file processing capabilities with support for multiple cloud storage providers.

The file download system is designed to be generic and extensible, supporting various providers: - Direct URLs (http/https) - Google Drive - AWS S3 - Microsoft OneDrive - Dropbox - GitHub (raw files)

Example usage:

processor := NewFileProcessor(httpClient, logger)
content, err := processor.DownloadFile(ctx, &task.Task{FileURL: "https://drive.google.com/file/d/123/view"})
if err != nil {
    // Handle error - simple error message, no complex error objects
    log.Printf("Download failed: %v", err)
}

Adding a new provider:

  1. Implement the FileProvider interface
  2. Register it with the FileProviderRegistry
  3. Update the GetProvider method to detect URLs for your provider

Index

Constants

View Source
const (
	// CreditNoteNumberPrefix is the prefix for credit note numbers
	CreditNoteNumberPrefix = "CN"
	// CreditNoteNumberLength is the length of the random part of credit note number
	CreditNoteNumberLength = 8
)
View Source
const (
	OnboardingEventsTopic = "onboarding_events"
)

Variables

This section is empty.

Functions

func NewProrationService added in v1.0.25

func NewProrationService(
	serviceParams ServiceParams,
) proration.Service

NewProrationService creates a new proration service.

Types

type AddonService added in v1.0.21

type AddonService interface {
	// Addon CRUD operations
	CreateAddon(ctx context.Context, req dto.CreateAddonRequest) (*dto.CreateAddonResponse, error)
	GetAddon(ctx context.Context, id string) (*dto.AddonResponse, error)
	GetAddonByLookupKey(ctx context.Context, lookupKey string) (*dto.AddonResponse, error)
	GetAddons(ctx context.Context, filter *types.AddonFilter) (*dto.ListAddonsResponse, error)
	UpdateAddon(ctx context.Context, id string, req dto.UpdateAddonRequest) (*dto.AddonResponse, error)
	DeleteAddon(ctx context.Context, id string) error
}

AddonService interface defines the business logic for addon management

func NewAddonService added in v1.0.21

func NewAddonService(params ServiceParams) AddonService

type AlertLogsService added in v1.0.29

type AlertLogsService interface {
	// LogAlert creates a new alert log entry and triggers webhook if status changes
	// This is the main method used by cron jobs or other internal processes
	LogAlert(ctx context.Context, req *LogAlertRequest) error

	// GetLatestAlert retrieves the latest alert log based on provided filters
	GetLatestAlert(ctx context.Context, entityType types.AlertEntityType, entityID string, alertType *types.AlertType, parentEntityType *string, parentEntityID *string) (*alertlogs.AlertLog, error)

	// ListAlertsByEntity retrieves alert logs for a specific entity
	ListAlertsByEntity(ctx context.Context, entityType types.AlertEntityType, entityID string, limit int) ([]*alertlogs.AlertLog, error)
}

AlertLogsService defines the interface for alert logs operations

func NewAlertLogsService added in v1.0.29

func NewAlertLogsService(params ServiceParams) AlertLogsService

type AnalyticsData added in v1.0.29

type AnalyticsData struct {
	Customer              *customer.Customer
	Subscriptions         []*subscription.Subscription
	SubscriptionLineItems map[string]*subscription.SubscriptionLineItem // Map of line item ID -> line item
	SubscriptionsMap      map[string]*subscription.Subscription         // Map of subscription ID -> subscription
	Analytics             []*events.DetailedUsageAnalytic
	Features              map[string]*feature.Feature
	Meters                map[string]*meter.Meter
	Prices                map[string]*price.Price
	PriceResponses        map[string]*dto.PriceResponse // Map of price ID -> PriceResponse (used when groups need to be expanded)
	Plans                 map[string]*plan.Plan         // Map of plan ID -> plan
	Addons                map[string]*addon.Addon       // Map of addon ID -> addon
	Currency              string
	Params                *events.UsageAnalyticsParams
}

AnalyticsData holds all data required for analytics processing

type AuthService

type AuthService interface {
	SignUp(ctx context.Context, req *dto.SignUpRequest) (*dto.AuthResponse, error)
	Login(ctx context.Context, req *dto.LoginRequest) (*dto.AuthResponse, error)
}

func NewAuthService

func NewAuthService(
	params ServiceParams,
	pubSub pubsub.PubSub,
) AuthService

type BillingCalculationResult

type BillingCalculationResult struct {
	FixedCharges []dto.CreateInvoiceLineItemRequest
	UsageCharges []dto.CreateInvoiceLineItemRequest
	TotalAmount  decimal.Decimal
	Currency     string
}

BillingCalculationResult holds all calculated charges for a billing period

type BillingService

type BillingService interface {
	// CalculateFixedCharges calculates all fixed charges for a subscription
	CalculateFixedCharges(ctx context.Context, sub *subscription.Subscription, periodStart, periodEnd time.Time) ([]dto.CreateInvoiceLineItemRequest, decimal.Decimal, error)

	// CalculateUsageCharges calculates all usage-based charges
	CalculateUsageCharges(ctx context.Context, sub *subscription.Subscription, usage *dto.GetUsageBySubscriptionResponse, periodStart, periodEnd time.Time) ([]dto.CreateInvoiceLineItemRequest, decimal.Decimal, error)

	// CalculateAllCharges calculates both fixed and usage charges
	CalculateAllCharges(ctx context.Context, sub *subscription.Subscription, usage *dto.GetUsageBySubscriptionResponse, periodStart, periodEnd time.Time) (*BillingCalculationResult, error)

	// PrepareSubscriptionInvoiceRequest prepares a complete invoice request for a subscription period
	// using the reference point to determine which charges to include
	PrepareSubscriptionInvoiceRequest(ctx context.Context, sub *subscription.Subscription, periodStart, periodEnd time.Time, referencePoint types.InvoiceReferencePoint) (*dto.CreateInvoiceRequest, error)

	// ClassifyLineItems classifies line items based on cadence and type
	ClassifyLineItems(sub *subscription.Subscription, currentPeriodStart, currentPeriodEnd time.Time, nextPeriodStart, nextPeriodEnd time.Time) *LineItemClassification

	// FilterLineItemsToBeInvoiced filters the line items to be invoiced for the given period
	FilterLineItemsToBeInvoiced(ctx context.Context, sub *subscription.Subscription, periodStart, periodEnd time.Time, lineItems []*subscription.SubscriptionLineItem) ([]*subscription.SubscriptionLineItem, error)

	// CalculateCharges calculates charges for the given line items and period
	CalculateCharges(ctx context.Context, sub *subscription.Subscription, lineItems []*subscription.SubscriptionLineItem, periodStart, periodEnd time.Time, includeUsage bool) (*BillingCalculationResult, error)

	// CreateInvoiceRequestForCharges creates an invoice creation request for the given charges
	CreateInvoiceRequestForCharges(ctx context.Context, sub *subscription.Subscription, result *BillingCalculationResult, periodStart, periodEnd time.Time, description string, metadata types.Metadata) (*dto.CreateInvoiceRequest, error)

	// GetCustomerEntitlements returns aggregated entitlements for a customer across all subscriptions
	GetCustomerEntitlements(ctx context.Context, customerID string, req *dto.GetCustomerEntitlementsRequest) (*dto.CustomerEntitlementsResponse, error)

	// GetCustomerUsageSummary returns usage summaries for a customer's features
	GetCustomerUsageSummary(ctx context.Context, customerID string, req *dto.GetCustomerUsageSummaryRequest) (*dto.CustomerUsageSummaryResponse, error)
}

BillingService handles all billing calculations

func NewBillingService

func NewBillingService(params ServiceParams) BillingService

type CSVProcessor added in v1.0.27

type CSVProcessor struct {
	Logger *logger.Logger
}

CSVProcessor handles CSV-specific operations

func NewCSVProcessor added in v1.0.27

func NewCSVProcessor(logger *logger.Logger) *CSVProcessor

NewCSVProcessor creates a new CSV processor

func (*CSVProcessor) PrepareCSVReader added in v1.0.27

func (cp *CSVProcessor) PrepareCSVReader(fileContent []byte) (*csv.Reader, error)

PrepareCSVReader creates a configured CSV reader from the file content

type ChunkProcessor added in v1.0.27

type ChunkProcessor interface {
	ProcessChunk(ctx context.Context, chunk [][]string, headers []string, chunkIndex int) (*ChunkResult, error)
}

ChunkProcessor defines the interface for processing file chunks

type ChunkResult added in v1.0.27

type ChunkResult struct {
	ProcessedRecords  int     `json:"processed_records"`
	SuccessfulRecords int     `json:"successful_records"`
	FailedRecords     int     `json:"failed_records"`
	ErrorSummary      *string `json:"error_summary,omitempty"`
}

ChunkResult represents the result of processing a chunk

type ConnectionService added in v1.0.21

type ConnectionService interface {
	CreateConnection(ctx context.Context, req dto.CreateConnectionRequest) (*dto.ConnectionResponse, error)
	GetConnection(ctx context.Context, id string) (*dto.ConnectionResponse, error)
	GetConnections(ctx context.Context, filter *types.ConnectionFilter) (*dto.ListConnectionsResponse, error)
	UpdateConnection(ctx context.Context, id string, req dto.UpdateConnectionRequest) (*dto.ConnectionResponse, error)
	DeleteConnection(ctx context.Context, id string) error
}

ConnectionService defines the interface for connection operations

func NewConnectionService added in v1.0.21

func NewConnectionService(params ServiceParams, encryptionService security.EncryptionService) ConnectionService

NewConnectionService creates a new connection service

type CostsheetService added in v1.0.33

type CostsheetService interface {
	// CRUD Operations
	CreateCostsheet(ctx context.Context, req dto.CreateCostsheetRequest) (*dto.CreateCostsheetResponse, error)
	GetCostsheet(ctx context.Context, id string) (*dto.CostsheetResponse, error)
	GetCostsheets(ctx context.Context, filter *domainCostsheet.Filter) (*dto.ListCostsheetResponse, error)
	UpdateCostsheet(ctx context.Context, id string, req dto.UpdateCostsheetRequest) (*dto.UpdateCostsheetResponse, error)
	DeleteCostsheet(ctx context.Context, id string) (*dto.DeleteCostsheetResponse, error)
	GetActiveCostsheetForTenant(ctx context.Context) (*dto.CostsheetResponse, error)

	// Calculation Operations (legacy methods for backward compatibility)
	GetInputCostForMargin(ctx context.Context, req *dto.GetCostBreakdownRequest) (*dto.CostBreakdownResponse, error)
	CalculateMargin(totalCost, totalRevenue decimal.Decimal) decimal.Decimal
	CalculateMarkup(totalCost, totalRevenue decimal.Decimal) decimal.Decimal
}

CostsheetService defines the interface for managing costsheet operations. It provides functionality for CRUD operations and cost calculations.

func NewCostsheetService added in v1.0.33

func NewCostsheetService(params ServiceParams) CostsheetService

NewCostsheetService creates a new instance of the costsheet service with the required dependencies.

type CouponApplicationService added in v1.0.21

type CouponApplicationService interface {
	CreateCouponApplication(ctx context.Context, req dto.CreateCouponApplicationRequest) (*dto.CouponApplicationResponse, error)
	GetCouponApplication(ctx context.Context, id string) (*dto.CouponApplicationResponse, error)
	GetCouponApplicationsByInvoice(ctx context.Context, invoiceID string) ([]*dto.CouponApplicationResponse, error)
	GetCouponApplicationsBySubscription(ctx context.Context, subscriptionID string) ([]*dto.CouponApplicationResponse, error)
	ApplyCouponToInvoice(ctx context.Context, couponID string, invoiceID string, originalPrice decimal.Decimal) (*dto.CouponApplicationResponse, error)
	ApplyCouponsOnInvoice(ctx context.Context, inv *invoice.Invoice, invoiceCoupons []dto.InvoiceCoupon) (*CouponCalculationResult, error)
	ApplyCouponsOnInvoiceWithLineItems(ctx context.Context, inv *invoice.Invoice, invoiceCoupons []dto.InvoiceCoupon, lineItemCoupons []dto.InvoiceLineItemCoupon) (*CouponCalculationResult, error)
}

func NewCouponApplicationService added in v1.0.21

func NewCouponApplicationService(
	params ServiceParams,
) CouponApplicationService

type CouponAssociationService added in v1.0.21

type CouponAssociationService interface {
	CreateCouponAssociation(ctx context.Context, req dto.CreateCouponAssociationRequest) (*dto.CouponAssociationResponse, error)
	GetCouponAssociation(ctx context.Context, id string) (*dto.CouponAssociationResponse, error)
	DeleteCouponAssociation(ctx context.Context, id string) error
	GetCouponAssociationsBySubscription(ctx context.Context, subscriptionID string) ([]*dto.CouponAssociationResponse, error)
	GetBySubscriptionForLineItems(ctx context.Context, subscriptionID string) ([]*dto.CouponAssociationResponse, error)
	ApplyCouponToSubscription(ctx context.Context, couponIDs []string, subscriptionID string) error

	// Line item coupon association methods
	ApplyCouponToSubscriptionLineItem(ctx context.Context, couponIDs []string, subscriptionID string, priceID string) error
}

func NewCouponAssociationService added in v1.0.21

func NewCouponAssociationService(
	params ServiceParams,
) CouponAssociationService

type CouponCalculationResult added in v1.0.21

type CouponCalculationResult struct {
	TotalDiscountAmount decimal.Decimal
	AppliedCoupons      []*dto.CouponApplicationResponse
	Currency            string
	Metadata            map[string]interface{}
}

CouponCalculationResult holds the result of applying coupons to an invoice

type CouponService added in v1.0.21

type CouponService interface {
	// Core coupon operations
	CreateCoupon(ctx context.Context, req dto.CreateCouponRequest) (*dto.CouponResponse, error)
	GetCoupon(ctx context.Context, id string) (*dto.CouponResponse, error)
	UpdateCoupon(ctx context.Context, id string, req dto.UpdateCouponRequest) (*dto.CouponResponse, error)
	DeleteCoupon(ctx context.Context, id string) error
	ListCoupons(ctx context.Context, filter *types.CouponFilter) (*dto.ListCouponsResponse, error)
	CalculateDiscount(ctx context.Context, couponID string, originalPrice decimal.Decimal) (decimal.Decimal, error)
}

CouponService defines the interface for core coupon CRUD operations

func NewCouponService added in v1.0.21

func NewCouponService(
	params ServiceParams,
) CouponService

NewCouponService creates a new coupon service

type CouponValidationError added in v1.0.21

type CouponValidationError struct {
	Code    types.CouponValidationErrorCode `json:"code"`
	Message string                          `json:"message"`
	Details map[string]interface{}          `json:"details,omitempty"`
}

CouponValidationError represents validation errors with structured details

func (*CouponValidationError) Error added in v1.0.21

func (e *CouponValidationError) Error() string

type CouponValidationService added in v1.0.21

type CouponValidationService interface {
	// Core validation method used for both subscription and invoice scenarios
	ValidateCoupon(ctx context.Context, couponID string, subscriptionID *string) error
	// Basic coupon validation (status, validity, etc.)
	ValidateCouponBasic(coupon *coupon.Coupon) error
}

CouponValidationService defines the interface for coupon validation operations

func NewCouponValidationService added in v1.0.21

func NewCouponValidationService(params ServiceParams) CouponValidationService

NewCouponValidationService creates a new coupon validation service

type CreditGrantService added in v1.0.18

type CreditGrantService interface {
	// CreateCreditGrant creates a new credit grant
	CreateCreditGrant(ctx context.Context, req dto.CreateCreditGrantRequest) (*dto.CreditGrantResponse, error)

	// GetCreditGrant retrieves a credit grant by ID
	GetCreditGrant(ctx context.Context, id string) (*dto.CreditGrantResponse, error)

	// ListCreditGrants retrieves credit grants based on filter
	ListCreditGrants(ctx context.Context, filter *types.CreditGrantFilter) (*dto.ListCreditGrantsResponse, error)

	// UpdateCreditGrant updates an existing credit grant
	UpdateCreditGrant(ctx context.Context, id string, req dto.UpdateCreditGrantRequest) (*dto.CreditGrantResponse, error)

	// DeleteCreditGrant deletes a credit grant by ID
	DeleteCreditGrant(ctx context.Context, id string) error

	// GetCreditGrantsByPlan retrieves credit grants for a specific plan
	GetCreditGrantsByPlan(ctx context.Context, planID string) (*dto.ListCreditGrantsResponse, error)

	// GetCreditGrantsBySubscription retrieves credit grants for a specific subscription
	GetCreditGrantsBySubscription(ctx context.Context, subscriptionID string) (*dto.ListCreditGrantsResponse, error)

	// NOTE: THIS IS ONLY FOR CRON JOB SHOULD NOT BE USED ELSEWHERE IN OTHER WORKFLOWS
	// This runs every 15 mins
	// ProcessScheduledCreditGrantApplications processes scheduled credit grant applications
	ProcessScheduledCreditGrantApplications(ctx context.Context) (*dto.ProcessScheduledCreditGrantApplicationsResponse, error)

	// ApplyCreditGrant applies a credit grant to a subscription and creates CGA tracking records
	// This method handles both one-time and recurring credit grants
	ApplyCreditGrant(ctx context.Context, grant *creditgrant.CreditGrant, subscription *subscription.Subscription, metadata types.Metadata) error

	// CancelFutureCreditGrantsOfSubscription cancels all future credit grants for this subscription
	CancelFutureCreditGrantsOfSubscription(ctx context.Context, subscriptionID string) error
}

CreditGrantService defines the interface for credit grant service

func NewCreditGrantService added in v1.0.18

func NewCreditGrantService(
	serviceParams ServiceParams,
) CreditGrantService

type CreditNoteService added in v1.0.18

type CreditNoteService interface {
	CreateCreditNote(ctx context.Context, req *dto.CreateCreditNoteRequest) (*dto.CreditNoteResponse, error)
	GetCreditNote(ctx context.Context, id string) (*dto.CreditNoteResponse, error)
	ListCreditNotes(ctx context.Context, filter *types.CreditNoteFilter) (*dto.ListCreditNotesResponse, error)

	// This method is used to void a credit note
	// this can be done when credit note is a adjustment and not a refund so we can cancel the adjustment
	VoidCreditNote(ctx context.Context, id string) error

	// This method is used to finalize a credit note
	// this can be done when credit note is a adjustment and not a refund so we can cancel the adjustment
	FinalizeCreditNote(ctx context.Context, id string) error
}

func NewCreditNoteService added in v1.0.18

func NewCreditNoteService(params ServiceParams) CreditNoteService

type CustomerService

type CustomerService = interfaces.CustomerService

func NewCustomerService

func NewCustomerService(params ServiceParams) CustomerService

type CustomersChunkProcessor added in v1.0.27

type CustomersChunkProcessor struct {
	// contains filtered or unexported fields
}

CustomersChunkProcessor processes chunks of customer data

func (*CustomersChunkProcessor) ProcessChunk added in v1.0.27

func (p *CustomersChunkProcessor) ProcessChunk(ctx context.Context, chunk [][]string, headers []string, chunkIndex int) (*ChunkResult, error)

ProcessChunk processes a chunk of customer records

type DirectURLProvider added in v1.0.27

type DirectURLProvider struct{}

DirectURLProvider handles direct file URLs

func (*DirectURLProvider) GetDownloadURL added in v1.0.27

func (p *DirectURLProvider) GetDownloadURL(ctx context.Context, fileURL string) (string, error)

func (*DirectURLProvider) GetProviderName added in v1.0.27

func (p *DirectURLProvider) GetProviderName() FileProviderType

type DropboxProvider added in v1.0.27

type DropboxProvider struct{}

DropboxProvider handles Dropbox URLs

func (*DropboxProvider) GetDownloadURL added in v1.0.27

func (p *DropboxProvider) GetDownloadURL(ctx context.Context, fileURL string) (string, error)

func (*DropboxProvider) GetProviderName added in v1.0.27

func (p *DropboxProvider) GetProviderName() FileProviderType

type EntitlementService

type EntitlementService interface {
	CreateEntitlement(ctx context.Context, req dto.CreateEntitlementRequest) (*dto.EntitlementResponse, error)
	CreateBulkEntitlement(ctx context.Context, req dto.CreateBulkEntitlementRequest) (*dto.CreateBulkEntitlementResponse, error)
	GetEntitlement(ctx context.Context, id string) (*dto.EntitlementResponse, error)
	ListEntitlements(ctx context.Context, filter *types.EntitlementFilter) (*dto.ListEntitlementsResponse, error)
	UpdateEntitlement(ctx context.Context, id string, req dto.UpdateEntitlementRequest) (*dto.EntitlementResponse, error)
	DeleteEntitlement(ctx context.Context, id string) error
	GetPlanEntitlements(ctx context.Context, planID string) (*dto.ListEntitlementsResponse, error)
	GetPlanFeatureEntitlements(ctx context.Context, planID, featureID string) (*dto.ListEntitlementsResponse, error)
	GetAddonEntitlements(ctx context.Context, addonID string) (*dto.ListEntitlementsResponse, error)
}

EntitlementService defines the interface for entitlement operations

func NewEntitlementService

func NewEntitlementService(params ServiceParams) EntitlementService

type EntityIntegrationMappingService added in v1.0.21

type EntityIntegrationMappingService = interfaces.EntityIntegrationMappingService

func NewEntityIntegrationMappingService added in v1.0.21

func NewEntityIntegrationMappingService(params ServiceParams) EntityIntegrationMappingService

type EnvAccessService added in v1.0.18

type EnvAccessService interface {
	// HasEnvironmentAccess checks if a user has access to a specific environment
	HasEnvironmentAccess(ctx context.Context, userID, tenantID, environmentID string) bool

	// GetAllowedEnvironments returns the list of environment IDs a user can access
	GetAllowedEnvironments(ctx context.Context, userID, tenantID string) []string
}

EnvAccessService handles environment access control

func NewEnvAccessService added in v1.0.18

func NewEnvAccessService(cfg *config.Configuration) EnvAccessService

NewEnvAccessService creates a new environment access service

type EnvironmentService

type EnvironmentService interface {
	CreateEnvironment(ctx context.Context, req dto.CreateEnvironmentRequest) (*dto.EnvironmentResponse, error)
	GetEnvironment(ctx context.Context, id string) (*dto.EnvironmentResponse, error)
	GetEnvironments(ctx context.Context, filter types.Filter) (*dto.ListEnvironmentsResponse, error)
	UpdateEnvironment(ctx context.Context, id string, req dto.UpdateEnvironmentRequest) (*dto.EnvironmentResponse, error)
}

func NewEnvironmentService

func NewEnvironmentService(repo environment.Repository, envAccessService EnvAccessService) EnvironmentService

type EventConsumptionService added in v1.0.31

type EventConsumptionService interface {
	// Register message handler with the router
	RegisterHandler(router *pubsubRouter.Router, cfg *config.Configuration)

	// Register message handler with the router
	RegisterHandlerLazy(router *pubsubRouter.Router, cfg *config.Configuration)

	// Process a raw event payload (used for AWS Lambda and direct processing)
	ProcessRawEvent(ctx context.Context, payload []byte) error
}

EventConsumptionService handles consuming raw events from Kafka and inserting them into ClickHouse

func NewEventConsumptionService added in v1.0.31

func NewEventConsumptionService(
	params ServiceParams,
	eventRepo events.Repository,
	sentryService *sentry.Service,
	eventPostProcessingSvc EventPostProcessingService,
) EventConsumptionService

NewEventConsumptionService creates a new event consumption service

type EventPostProcessingService added in v1.0.17

type EventPostProcessingService interface {
	// Publish an event for post-processing
	PublishEvent(ctx context.Context, event *events.Event, isBackfill bool) error

	// Register message handler with the router
	RegisterHandler(router *pubsubRouter.Router, cfg *config.Configuration)

	// Get usage cost for a specific period
	GetPeriodCost(ctx context.Context, tenantID, environmentID, customerID, subscriptionID string, periodID uint64) (decimal.Decimal, error)

	// Get usage totals per feature for a period
	GetPeriodFeatureTotals(ctx context.Context, tenantID, environmentID, customerID, subscriptionID string, periodID uint64) ([]*events.PeriodFeatureTotal, error)

	// Get usage analytics for a customer
	GetUsageAnalytics(ctx context.Context, tenantID, environmentID, customerID string, lookbackHours int) ([]*events.UsageAnalytic, error)

	// Get detailed usage analytics with filtering, grouping, and time-series data
	GetDetailedUsageAnalytics(ctx context.Context, req *dto.GetUsageAnalyticsRequest) (*dto.GetUsageAnalyticsResponse, error)

	// Reprocess events for a specific customer or with other filters
	ReprocessEvents(ctx context.Context, params *events.ReprocessEventsParams) error
}

EventPostProcessingService handles post-processing operations for metered events

func NewEventPostProcessingService added in v1.0.17

func NewEventPostProcessingService(
	params ServiceParams,
	eventRepo events.Repository,
	processedEventRepo events.ProcessedEventRepository,
) EventPostProcessingService

NewEventPostProcessingService creates a new event post-processing service

type EventService

type EventService interface {
	CreateEvent(ctx context.Context, createEventRequest *dto.IngestEventRequest) error
	BulkCreateEvents(ctx context.Context, createEventRequest *dto.BulkIngestEventRequest) error
	GetUsage(ctx context.Context, getUsageRequest *dto.GetUsageRequest) (*events.AggregationResult, error)
	GetUsageByMeter(ctx context.Context, getUsageByMeterRequest *dto.GetUsageByMeterRequest) (*events.AggregationResult, error)
	BulkGetUsageByMeter(ctx context.Context, req []*dto.GetUsageByMeterRequest) (map[string]*events.AggregationResult, error)
	GetUsageByMeterWithFilters(ctx context.Context, req *dto.GetUsageByMeterRequest, filterGroups map[string]map[string][]string) ([]*events.AggregationResult, error)
	GetEvents(ctx context.Context, req *dto.GetEventsRequest) (*dto.GetEventsResponse, error)
}

func NewEventService

func NewEventService(
	eventRepo events.Repository,
	meterRepo meter.Repository,
	publisher publisher.EventPublisher,
	logger *logger.Logger,
	config *config.Configuration,
) EventService

type EventsChunkProcessor added in v1.0.27

type EventsChunkProcessor struct {
	// contains filtered or unexported fields
}

EventsChunkProcessor processes chunks of event data

func (*EventsChunkProcessor) ProcessChunk added in v1.0.27

func (p *EventsChunkProcessor) ProcessChunk(ctx context.Context, chunk [][]string, headers []string, chunkIndex int) (*ChunkResult, error)

ProcessChunk processes a chunk of event records

type FeatureService

type FeatureService interface {
	CreateFeature(ctx context.Context, req dto.CreateFeatureRequest) (*dto.FeatureResponse, error)
	GetFeature(ctx context.Context, id string) (*dto.FeatureResponse, error)
	GetFeatures(ctx context.Context, filter *types.FeatureFilter) (*dto.ListFeaturesResponse, error)
	UpdateFeature(ctx context.Context, id string, req dto.UpdateFeatureRequest) (*dto.FeatureResponse, error)
	DeleteFeature(ctx context.Context, id string) error
}

func NewFeatureService

func NewFeatureService(params ServiceParams) FeatureService

type FeatureUsageTrackingService added in v1.0.27

type FeatureUsageTrackingService interface {
	// Publish an event for feature usage tracking
	PublishEvent(ctx context.Context, event *events.Event, isBackfill bool) error

	// Register message handler with the router
	RegisterHandler(router *pubsubRouter.Router, cfg *config.Configuration)

	// Register message handler with the router
	RegisterHandlerLazy(router *pubsubRouter.Router, cfg *config.Configuration)

	// Get detailed usage analytics with filtering, grouping, and time-series data
	GetDetailedUsageAnalytics(ctx context.Context, req *dto.GetUsageAnalyticsRequest) (*dto.GetUsageAnalyticsResponse, error)

	// Get detailed usage analytics version 2 with filtering, grouping, and time-series data
	GetDetailedUsageAnalyticsV2(ctx context.Context, req *dto.GetUsageAnalyticsRequest) (*dto.GetUsageAnalyticsResponse, error)

	// Reprocess events for a specific customer or with other filters
	ReprocessEvents(ctx context.Context, params *events.ReprocessEventsParams) error
}

FeatureUsageTrackingService handles feature usage tracking operations for metered events

func NewFeatureUsageTrackingService added in v1.0.27

func NewFeatureUsageTrackingService(
	params ServiceParams,
	eventRepo events.Repository,
	featureUsageRepo events.FeatureUsageRepository,
) FeatureUsageTrackingService

NewFeatureUsageTrackingService creates a new feature usage tracking service

type FileProcessor added in v1.0.27

type FileProcessor struct {
	*StreamingProcessor
	ProviderRegistry *FileProviderRegistry
	CSVProcessor     *CSVProcessor
	JSONProcessor    *JSONProcessor
	RetryClient      *retryablehttp.Client

	// Configuration for file size thresholds
	MaxMemoryFileSize int64 // Maximum file size to process in memory (default: 10MB)
	MaxFileSize       int64 // Maximum file size allowed (default: 1GB)
}

FileProcessor handles both streaming and regular file processing It provides intelligent file processing by automatically choosing between: - Memory-based processing for small files (< 10MB) - Streaming processing for large files (>= 10MB) This prevents OOM errors while maintaining performance for small files

func NewFileProcessor added in v1.0.27

func NewFileProcessor(client httpclient.Client, logger *logger.Logger) *FileProcessor

NewFileProcessor creates a new file processor with default configuration Default settings: - MaxMemoryFileSize: 10MB (files smaller than this are processed in memory) - MaxFileSize: 1GB (maximum file size allowed)

func (*FileProcessor) DetectFileType added in v1.0.27

func (fp *FileProcessor) DetectFileType(fileContent []byte) FileType

DetectFileType attempts to determine if the file is CSV or JSON using battle-tested filetype package

func (*FileProcessor) DownloadFile added in v1.0.27

func (fp *FileProcessor) DownloadFile(ctx context.Context, t *task.Task) ([]byte, error)

DownloadFile downloads a file and returns the full content (for regular processing) WARNING: This method loads the entire file into memory. Use DownloadFileStream for large files. This method is suitable for small files (< 10MB) to avoid OOM errors.

func (*FileProcessor) DownloadFileStream added in v1.0.27

func (fp *FileProcessor) DownloadFileStream(ctx context.Context, t *task.Task) (io.ReadCloser, error)

DownloadFileStream downloads a file and returns a stream for large file processing This method is memory-efficient and suitable for large files (>= 10MB) The returned io.ReadCloser must be closed by the caller to prevent resource leaks

func (*FileProcessor) GetFileSize added in v1.0.27

func (fp *FileProcessor) GetFileSize(ctx context.Context, t *task.Task) (int64, error)

GetFileSize retrieves the file size without downloading the entire file This is useful for determining whether to use memory-based or streaming processing

func (*FileProcessor) PrepareCSVReader added in v1.0.27

func (fp *FileProcessor) PrepareCSVReader(fileContent []byte) (*csv.Reader, error)

PrepareCSVReader creates a configured CSV reader from the file content

func (*FileProcessor) PrepareJSONReader added in v1.0.27

func (fp *FileProcessor) PrepareJSONReader(fileContent []byte) (*jsoniter.Decoder, error)

PrepareJSONReader creates a configured JSON decoder from the file content using jsoniter

func (*FileProcessor) ShouldUseStreaming added in v1.0.27

func (fp *FileProcessor) ShouldUseStreaming(fileSize int64) bool

ShouldUseStreaming determines if a file should be processed using streaming based on its size and configuration thresholds

func (*FileProcessor) ValidateFileSize added in v1.0.27

func (fp *FileProcessor) ValidateFileSize(fileSize int64) error

ValidateFileSize checks if the file size is within acceptable limits

type FileProvider added in v1.0.27

type FileProvider interface {
	GetDownloadURL(ctx context.Context, fileURL string) (string, error)
	GetProviderName() FileProviderType
}

FileProvider defines the interface for different file providers This allows the system to handle various cloud storage providers and file sharing services by converting their URLs to direct download URLs that can be fetched via HTTP.

type FileProviderRegistry added in v1.0.27

type FileProviderRegistry struct {
	// contains filtered or unexported fields
}

FileProviderRegistry manages different file providers

func NewFileProviderRegistry added in v1.0.27

func NewFileProviderRegistry() *FileProviderRegistry

NewFileProviderRegistry creates a new file provider registry

func (*FileProviderRegistry) GetProvider added in v1.0.27

func (r *FileProviderRegistry) GetProvider(fileURL string) FileProvider

GetProvider returns the appropriate provider for a given URL

func (*FileProviderRegistry) RegisterProvider added in v1.0.27

func (r *FileProviderRegistry) RegisterProvider(provider FileProvider)

RegisterProvider registers a file provider

type FileProviderType added in v1.0.27

type FileProviderType string
const (
	FileProviderTypeDirect      FileProviderType = "direct"
	FileProviderTypeGoogleDrive FileProviderType = "google_drive"
	FileProviderTypeS3          FileProviderType = "s3"
	FileProviderTypeOneDrive    FileProviderType = "onedrive"
	FileProviderTypeDropbox     FileProviderType = "dropbox"
	FileProviderTypeGitHub      FileProviderType = "github"
)

type FileType added in v1.0.27

type FileType string

FileType represents the type of file being processed

const (
	FileTypeCSV  FileType = "csv"
	FileTypeJSON FileType = "json"
)

type GitHubProvider added in v1.0.27

type GitHubProvider struct{}

GitHubProvider handles GitHub raw file URLs

func (*GitHubProvider) GetDownloadURL added in v1.0.27

func (p *GitHubProvider) GetDownloadURL(ctx context.Context, fileURL string) (string, error)

func (*GitHubProvider) GetProviderName added in v1.0.27

func (p *GitHubProvider) GetProviderName() FileProviderType

type GoogleDriveProvider added in v1.0.27

type GoogleDriveProvider struct{}

GoogleDriveProvider handles Google Drive URLs

func (*GoogleDriveProvider) GetDownloadURL added in v1.0.27

func (p *GoogleDriveProvider) GetDownloadURL(ctx context.Context, fileURL string) (string, error)

func (*GoogleDriveProvider) GetProviderName added in v1.0.27

func (p *GoogleDriveProvider) GetProviderName() FileProviderType

type GroupService added in v1.0.34

type GroupService interface {
	CreateGroup(ctx context.Context, req dto.CreateGroupRequest) (*dto.GroupResponse, error)
	GetGroup(ctx context.Context, id string) (*dto.GroupResponse, error)
	DeleteGroup(ctx context.Context, id string) error
	ListGroups(ctx context.Context, filter *types.GroupFilter) (*dto.ListGroupsResponse, error)
	ValidateGroup(ctx context.Context, id string, entityType types.GroupEntityType) error
	ValidateGroupBulk(ctx context.Context, groupIDs []string, entityType types.GroupEntityType) error
}

GroupService interface defines the business logic for group management

func NewGroupService added in v1.0.34

func NewGroupService(params ServiceParams) GroupService

type InvoiceService

type InvoiceService interface {
	// Embed the basic interface from interfaces package
	interfaces.InvoiceService

	// Additional methods specific to this service
	CreateOneOffInvoice(ctx context.Context, req dto.CreateInvoiceRequest) (*dto.InvoiceResponse, error)
	FinalizeInvoice(ctx context.Context, id string) error
	VoidInvoice(ctx context.Context, id string, req dto.InvoiceVoidRequest) error
	ProcessDraftInvoice(ctx context.Context, id string, paymentParams *dto.PaymentParameters, sub *subscription.Subscription, flowType types.InvoiceFlowType) error
	UpdatePaymentStatus(ctx context.Context, id string, status types.PaymentStatus, amount *decimal.Decimal) error
	CreateSubscriptionInvoice(ctx context.Context, req *dto.CreateSubscriptionInvoiceRequest, paymentParams *dto.PaymentParameters, flowType types.InvoiceFlowType) (*dto.InvoiceResponse, *subscription.Subscription, error)
	GetPreviewInvoice(ctx context.Context, req dto.GetPreviewInvoiceRequest) (*dto.InvoiceResponse, error)
	GetCustomerInvoiceSummary(ctx context.Context, customerID string, currency string) (*dto.CustomerInvoiceSummary, error)
	GetUnpaidInvoicesToBePaid(ctx context.Context, customerID string, currency string) ([]*dto.InvoiceResponse, decimal.Decimal, error)
	GetCustomerMultiCurrencyInvoiceSummary(ctx context.Context, customerID string) (*dto.CustomerMultiCurrencyInvoiceSummary, error)
	AttemptPayment(ctx context.Context, id string) error
	GetInvoicePDF(ctx context.Context, id string) ([]byte, error)
	GetInvoicePDFUrl(ctx context.Context, id string) (string, error)
	RecalculateInvoice(ctx context.Context, id string, finalize bool) (*dto.InvoiceResponse, error)
	RecalculateInvoiceAmounts(ctx context.Context, invoiceID string) error
	CalculatePriceBreakdown(ctx context.Context, inv *dto.InvoiceResponse) (map[string][]dto.SourceUsageItem, error)
	CalculateUsageBreakdown(ctx context.Context, inv *dto.InvoiceResponse, groupBy []string) (map[string][]dto.UsageBreakdownItem, error)
	TriggerCommunication(ctx context.Context, id string) error
	HandleIncompleteSubscriptionPayment(ctx context.Context, invoice *invoice.Invoice) error
}

func NewInvoiceService

func NewInvoiceService(params ServiceParams) InvoiceService

type JSONProcessor added in v1.0.27

type JSONProcessor struct {
	Logger *logger.Logger
}

JSONProcessor handles JSON-specific operations

func NewJSONProcessor added in v1.0.27

func NewJSONProcessor(logger *logger.Logger) *JSONProcessor

NewJSONProcessor creates a new JSON processor

func (*JSONProcessor) ExtractHeaders added in v1.0.27

func (jp *JSONProcessor) ExtractHeaders(decoder *json.Decoder) ([]string, error)

ExtractHeaders extracts the field names from the first object in the JSON array

func (*JSONProcessor) PrepareJSONReader added in v1.0.27

func (jp *JSONProcessor) PrepareJSONReader(fileContent []byte) (*json.Decoder, error)

PrepareJSONReader creates a configured JSON decoder from the file content

func (*JSONProcessor) ValidateJSONStructure added in v1.0.27

func (jp *JSONProcessor) ValidateJSONStructure(decoder *json.Decoder) error

ValidateJSONStructure validates that the JSON content is an array of objects

type LineItemClassification added in v1.0.0

type LineItemClassification struct {
	CurrentPeriodAdvance []*subscription.SubscriptionLineItem
	CurrentPeriodArrear  []*subscription.SubscriptionLineItem
	NextPeriodAdvance    []*subscription.SubscriptionLineItem
	HasUsageCharges      bool
}

LineItemClassification represents the classification of line items based on cadence and type

type LogAlertRequest added in v1.0.29

type LogAlertRequest struct {
	EntityType       types.AlertEntityType `json:"entity_type" validate:"required"`
	EntityID         string                `json:"entity_id" validate:"required"`
	ParentEntityType *string               `json:"parent_entity_type,omitempty"` // Optional parent entity type (e.g., "wallet")
	ParentEntityID   *string               `json:"parent_entity_id,omitempty"`   // Optional parent entity ID (e.g., wallet_id)
	AlertType        types.AlertType       `json:"alert_type" validate:"required"`
	AlertStatus      types.AlertState      `json:"alert_status" validate:"required"`
	AlertInfo        types.AlertInfo       `json:"alert_info" validate:"required"`
}

LogAlertRequest represents the request to log an alert

func (*LogAlertRequest) Validate added in v1.0.29

func (r *LogAlertRequest) Validate() error

Validate validates the log alert request

type MeterService

type MeterService interface {
	CreateMeter(ctx context.Context, req *dto.CreateMeterRequest) (*meter.Meter, error)
	GetMeter(ctx context.Context, id string) (*meter.Meter, error)
	GetMeters(ctx context.Context, filter *types.MeterFilter) (*dto.ListMetersResponse, error)
	GetAllMeters(ctx context.Context) (*dto.ListMetersResponse, error)
	DisableMeter(ctx context.Context, id string) error
	UpdateMeter(ctx context.Context, id string, filters []meter.Filter) (*meter.Meter, error)
}

func NewMeterService

func NewMeterService(meterRepo meter.Repository) MeterService

type OnboardingService added in v1.0.0

type OnboardingService interface {
	GenerateEvents(ctx context.Context, req *dto.OnboardingEventsRequest) (*dto.OnboardingEventsResponse, error)
	RegisterHandler(router *pubsubRouter.Router)
	OnboardNewUserWithTenant(ctx context.Context, userID, email, tenantName, tenantID string) error
	SetupSandboxEnvironment(ctx context.Context, tenantID, userID, envID string) error
}

OnboardingService handles onboarding-related operations

func NewOnboardingService added in v1.0.0

func NewOnboardingService(
	params ServiceParams,
	pubSub pubsub.PubSub,
) OnboardingService

NewOnboardingService creates a new onboarding service

type OneDriveProvider added in v1.0.27

type OneDriveProvider struct{}

OneDriveProvider handles Microsoft OneDrive URLs

func (*OneDriveProvider) GetDownloadURL added in v1.0.27

func (p *OneDriveProvider) GetDownloadURL(ctx context.Context, fileURL string) (string, error)

func (*OneDriveProvider) GetProviderName added in v1.0.27

func (p *OneDriveProvider) GetProviderName() FileProviderType

type PaymentMethodUsed added in v1.0.25

type PaymentMethodUsed struct {
	Type   types.PaymentMethodType `json:"type"`
	ID     string                  `json:"id"`
	Amount decimal.Decimal         `json:"amount"`
	Status types.PaymentStatus     `json:"status"`
}

PaymentMethodUsed represents a payment method that was used

type PaymentProcessorService

type PaymentProcessorService interface {
	ProcessPayment(ctx context.Context, id string) (*payment.Payment, error)
}

func NewPaymentProcessorService

func NewPaymentProcessorService(params ServiceParams) PaymentProcessorService

type PaymentResult added in v1.0.25

type PaymentResult struct {
	Success                    bool                `json:"success"`
	AmountPaid                 decimal.Decimal     `json:"amount_paid"`
	RemainingAmount            decimal.Decimal     `json:"remaining_amount"`
	PaymentMethods             []PaymentMethodUsed `json:"payment_methods_used"`
	RequiresManualConfirmation bool                `json:"requires_manual_confirmation"`
	Error                      error               `json:"error,omitempty"`
}

PaymentResult represents the result of a payment attempt

type PaymentService

type PaymentService = interfaces.PaymentService

PaymentService defines the interface for payment operations

func NewPaymentService

func NewPaymentService(params ServiceParams) PaymentService

NewPaymentService creates a new payment service

type PlanService

type PlanService = interfaces.PlanService

func NewPlanService

func NewPlanService(
	params ServiceParams,
) PlanService

type PriceMatch added in v1.0.17

type PriceMatch struct {
	Price *price.Price
	Meter *meter.Meter
}

PriceMatch represents a matching price and meter for an event

type PriceService

type PriceService interface {
	CreatePrice(ctx context.Context, req dto.CreatePriceRequest) (*dto.PriceResponse, error)
	CreateBulkPrice(ctx context.Context, req dto.CreateBulkPriceRequest) (*dto.CreateBulkPriceResponse, error)
	GetPrice(ctx context.Context, id string) (*dto.PriceResponse, error)
	GetPricesByPlanID(ctx context.Context, planID string) (*dto.ListPricesResponse, error)
	GetPricesBySubscriptionID(ctx context.Context, subscriptionID string) (*dto.ListPricesResponse, error)
	GetPricesByAddonID(ctx context.Context, addonID string) (*dto.ListPricesResponse, error)
	GetPricesByCostsheetID(ctx context.Context, costsheetID string) (*dto.ListPricesResponse, error)
	GetPrices(ctx context.Context, filter *types.PriceFilter) (*dto.ListPricesResponse, error)
	UpdatePrice(ctx context.Context, id string, req dto.UpdatePriceRequest) (*dto.PriceResponse, error)
	DeletePrice(ctx context.Context, id string, req dto.DeletePriceRequest) error
	CalculateCost(ctx context.Context, price *price.Price, quantity decimal.Decimal) decimal.Decimal

	// CalculateBucketedCost calculates cost for bucketed max values where each value represents max in its time bucket
	CalculateBucketedCost(ctx context.Context, price *price.Price, bucketedValues []decimal.Decimal) decimal.Decimal

	// CalculateCostWithBreakup calculates the cost for a given price and quantity
	// and returns detailed information about the calculation
	CalculateCostWithBreakup(ctx context.Context, price *price.Price, quantity decimal.Decimal, round bool) dto.CostBreakup

	// CalculateCostSheetPrice calculates the cost for a given price and quantity
	// specifically for costsheet calculations
	CalculateCostSheetPrice(ctx context.Context, price *price.Price, quantity decimal.Decimal) decimal.Decimal
}

func NewPriceService

func NewPriceService(params ServiceParams) PriceService

type PriceUnitService added in v1.0.21

type PriceUnitService struct {
	// contains filtered or unexported fields
}

PriceUnitService handles business logic for price units

func NewPriceUnitService added in v1.0.21

func NewPriceUnitService(repo domainPriceUnit.Repository, log *logger.Logger) *PriceUnitService

NewPriceUnitService creates a new instance of PriceUnitService

func (*PriceUnitService) ConvertToBaseCurrency added in v1.0.21

func (s *PriceUnitService) ConvertToBaseCurrency(ctx context.Context, code, tenantID, environmentID string, priceUnitAmount decimal.Decimal) (decimal.Decimal, error)

ConvertToBaseCurrency converts an amount from pricing unit to base currency amount in fiat currency = amount in pricing unit * conversion_rate

func (*PriceUnitService) ConvertToPriceUnit added in v1.0.21

func (s *PriceUnitService) ConvertToPriceUnit(ctx context.Context, code, tenantID, environmentID string, fiatAmount decimal.Decimal) (decimal.Decimal, error)

ConvertToPriceUnit converts an amount from base currency to pricing unit amount in pricing unit = amount in fiat currency / conversion_rate

func (*PriceUnitService) Create added in v1.0.21

func (*PriceUnitService) Delete added in v1.0.21

func (s *PriceUnitService) Delete(ctx context.Context, id string) error

func (*PriceUnitService) GetByCode added in v1.0.21

func (s *PriceUnitService) GetByCode(ctx context.Context, code, tenantID, environmentID string) (*dto.PriceUnitResponse, error)

func (*PriceUnitService) GetByID added in v1.0.21

GetByID retrieves a pricing unit by ID

func (*PriceUnitService) List added in v1.0.21

List returns a paginated list of pricing units

func (*PriceUnitService) Update added in v1.0.21

type RevenueAnalyticsService added in v1.0.33

type RevenueAnalyticsService = interfaces.RevenueAnalyticsService

func NewRevenueAnalyticsService added in v1.0.33

func NewRevenueAnalyticsService(params ServiceParams, featureUsageTrackingService FeatureUsageTrackingService, costsheetService CostsheetService) RevenueAnalyticsService

type S3Provider added in v1.0.27

type S3Provider struct{}

S3Provider handles AWS S3 URLs

func (*S3Provider) GetDownloadURL added in v1.0.27

func (p *S3Provider) GetDownloadURL(ctx context.Context, fileURL string) (string, error)

func (*S3Provider) GetProviderName added in v1.0.27

func (p *S3Provider) GetProviderName() FileProviderType

type ScheduledTaskService added in v1.0.32

type ScheduledTaskService interface {
	CreateScheduledTask(ctx context.Context, req dto.CreateScheduledTaskRequest) (*dto.ScheduledTaskResponse, error)
	GetScheduledTask(ctx context.Context, id string) (*dto.ScheduledTaskResponse, error)
	ListScheduledTasks(ctx context.Context, filter *types.QueryFilter, connectionID string, entityType types.ScheduledTaskEntityType, interval types.ScheduledTaskInterval, enabled string) (*dto.ListScheduledTasksResponse, error)
	UpdateScheduledTask(ctx context.Context, id string, req dto.UpdateScheduledTaskRequest) (*dto.ScheduledTaskResponse, error)
	DeleteScheduledTask(ctx context.Context, id string) error
	TriggerForceRun(ctx context.Context, id string, req dto.TriggerForceRunRequest) (*dto.TriggerForceRunResponse, error)

	CalculateIntervalBoundaries(currentTime time.Time, interval types.ScheduledTaskInterval) (startTime, endTime time.Time)
}

ScheduledTaskService handles scheduled task operations

func NewScheduledTaskService added in v1.0.32

func NewScheduledTaskService(
	repo scheduledtask.Repository,
	temporalClient temporalClient.TemporalClient,
	logger *logger.Logger,
) ScheduledTaskService

NewScheduledTaskService creates a new scheduled task service

type SecretService

type SecretService interface {
	// API Key operations
	CreateAPIKey(ctx context.Context, req *dto.CreateAPIKeyRequest) (*secret.Secret, string, error)
	ListAPIKeys(ctx context.Context, filter *types.SecretFilter) (*dto.ListSecretsResponse, error)
	Delete(ctx context.Context, id string) error

	// Integration operations
	CreateIntegration(ctx context.Context, req *dto.CreateIntegrationRequest) (*secret.Secret, error)
	ListIntegrations(ctx context.Context, filter *types.SecretFilter) (*dto.ListSecretsResponse, error)

	// Verification operations
	VerifyAPIKey(ctx context.Context, apiKey string) (*secret.Secret, error)

	ListLinkedIntegrations(ctx context.Context) ([]string, error)
	// contains filtered or unexported methods
}

SecretService defines the interface for secret business logic

func NewSecretService

func NewSecretService(
	repo secret.Repository,
	config *config.Configuration,
	logger *logger.Logger,
) SecretService

NewSecretService creates a new secret service

type ServiceParams

type ServiceParams struct {
	Logger       *logger.Logger
	Config       *config.Configuration
	DB           postgres.IClient
	PDFGenerator pdf.Generator
	S3           s3.Service

	// Repositories
	AuthRepo                     auth.Repository
	UserRepo                     user.Repository
	EventRepo                    events.Repository
	ProcessedEventRepo           events.ProcessedEventRepository
	FeatureUsageRepo             events.FeatureUsageRepository
	MeterRepo                    meter.Repository
	PriceRepo                    price.Repository
	PriceUnitRepo                priceunit.Repository
	CustomerRepo                 customer.Repository
	PlanRepo                     plan.Repository
	SubRepo                      subscription.Repository
	SubscriptionScheduleRepo     subscription.SubscriptionScheduleRepository
	SubscriptionLineItemRepo     subscription.LineItemRepository
	WalletRepo                   wallet.Repository
	TenantRepo                   tenant.Repository
	InvoiceRepo                  invoice.Repository
	FeatureRepo                  feature.Repository
	EntitlementRepo              entitlement.Repository
	PaymentRepo                  payment.Repository
	SecretRepo                   secret.Repository
	EnvironmentRepo              environment.Repository
	TaskRepo                     task.Repository
	CreditGrantRepo              creditgrant.Repository
	CostSheetRepo                costsheet.Repository
	CreditNoteRepo               creditnote.Repository
	CreditNoteLineItemRepo       creditnote.CreditNoteLineItemRepository
	CreditGrantApplicationRepo   creditgrantapplication.Repository
	TaxRateRepo                  taxrate.Repository
	TaxAssociationRepo           taxassociation.Repository
	TaxAppliedRepo               taxapplied.Repository
	CouponRepo                   coupon.Repository
	CouponAssociationRepo        coupon_association.Repository
	CouponApplicationRepo        coupon_application.Repository
	AddonRepo                    addon.Repository
	AddonAssociationRepo         addonassociation.Repository
	ConnectionRepo               connection.Repository
	EntityIntegrationMappingRepo entityintegrationmapping.Repository
	SettingsRepo                 settings.Repository
	AlertLogsRepo                alertlogs.Repository
	GroupRepo                    group.Repository
	ScheduledTaskRepo            scheduledtask.Repository

	// Publishers
	EventPublisher   publisher.EventPublisher
	WebhookPublisher webhookPublisher.WebhookPublisher

	// http client
	Client httpclient.Client

	// Proration
	ProrationCalculator proration.Calculator

	// Integration Factory
	IntegrationFactory *integration.Factory
}

ServiceParams holds common dependencies for services TODO: start using this for all services init

func NewServiceParams

func NewServiceParams(
	logger *logger.Logger,
	config *config.Configuration,
	db postgres.IClient,
	pdfGenerator pdf.Generator,
	authRepo auth.Repository,
	userRepo user.Repository,
	eventRepo events.Repository,
	processedEventRepo events.ProcessedEventRepository,
	featureUsageRepo events.FeatureUsageRepository,
	meterRepo meter.Repository,
	priceRepo price.Repository,
	priceUnitRepo priceunit.Repository,
	customerRepo customer.Repository,
	planRepo plan.Repository,
	subRepo subscription.Repository,
	subscriptionScheduleRepo subscription.SubscriptionScheduleRepository,
	subscriptionLineItemRepo subscription.LineItemRepository,
	walletRepo wallet.Repository,
	tenantRepo tenant.Repository,
	invoiceRepo invoice.Repository,
	featureRepo feature.Repository,
	creditGrantApplicationRepo creditgrantapplication.Repository,
	entitlementRepo entitlement.Repository,
	paymentRepo payment.Repository,
	secretRepo secret.Repository,
	environmentRepo environment.Repository,
	creditGrantRepo creditgrant.Repository,
	creditNoteRepo creditnote.Repository,
	creditNoteLineItemRepo creditnote.CreditNoteLineItemRepository,
	taxConfigRepo taxassociation.Repository,
	taskRepo task.Repository,
	costSheetRepo costsheet.Repository,
	taxAppliedRepo taxapplied.Repository,
	taxRateRepo taxrate.Repository,
	couponRepo coupon.Repository,
	couponAssociationRepo coupon_association.Repository,
	couponApplicationRepo coupon_application.Repository,
	eventPublisher publisher.EventPublisher,
	webhookPublisher webhookPublisher.WebhookPublisher,
	s3Service s3.Service,
	client httpclient.Client,
	addonRepo addon.Repository,
	addonAssociationRepo addonassociation.Repository,
	connectionRepo connection.Repository,
	entityIntegrationMappingRepo entityintegrationmapping.Repository,
	settingsRepo settings.Repository,
	alertLogsRepo alertlogs.Repository,
	groupRepo group.Repository,
	scheduledTaskRepo scheduledtask.Repository,
	prorationCalculator proration.Calculator,
	integrationFactory *integration.Factory,
) ServiceParams

Common service params

type SettingsService added in v1.0.22

type SettingsService interface {

	// Key-based operations
	GetSettingByKey(ctx context.Context, key string) (*dto.SettingResponse, error)
	UpdateSettingByKey(ctx context.Context, key string, req *dto.UpdateSettingRequest) (*dto.SettingResponse, error)
	DeleteSettingByKey(ctx context.Context, key string) error
}

SettingsService defines the interface for managing settings operations

func NewSettingsService added in v1.0.22

func NewSettingsService(params ServiceParams) SettingsService

type StateAction added in v1.0.18

type StateAction string
const (
	StateActionApply  StateAction = "apply"
	StateActionSkip   StateAction = "skip"
	StateActionDefer  StateAction = "defer"
	StateActionCancel StateAction = "cancel"
)

type StreamingConfig added in v1.0.27

type StreamingConfig struct {
	ChunkSize      int           `json:"chunk_size"`      // Number of records per chunk
	BufferSize     int           `json:"buffer_size"`     // Buffer size for reading
	UpdateInterval time.Duration `json:"update_interval"` // Progress update interval
	MaxRetries     int           `json:"max_retries"`     // Maximum retries for failed chunks
	RetryDelay     time.Duration `json:"retry_delay"`     // Delay between retries
	MaxErrors      int           `json:"max_errors"`      // Maximum errors to accumulate before stopping
	BatchSize      int           `json:"batch_size"`      // Number of chunks to process before updating progress
}

StreamingConfig holds configuration for streaming processing

func DefaultStreamingConfig added in v1.0.27

func DefaultStreamingConfig() *StreamingConfig

DefaultStreamingConfig returns default streaming configuration

type StreamingProcessor added in v1.0.27

type StreamingProcessor struct {
	Client           httpclient.Client
	Logger           *logger.Logger
	ProviderRegistry *FileProviderRegistry
	CSVProcessor     *CSVProcessor
	JSONProcessor    *JSONProcessor
	RetryClient      *retryablehttp.Client
}

StreamingProcessor handles streaming processing of large files

func NewStreamingProcessor added in v1.0.27

func NewStreamingProcessor(client httpclient.Client, logger *logger.Logger) *StreamingProcessor

NewStreamingProcessor creates a new streaming processor

func (*StreamingProcessor) Close added in v1.0.27

func (sp *StreamingProcessor) Close()

Close cleans up resources

func (*StreamingProcessor) ProcessFileStream added in v1.0.27

func (sp *StreamingProcessor) ProcessFileStream(
	ctx context.Context,
	t *task.Task,
	processor ChunkProcessor,
	config *StreamingConfig,
) error

ProcessFileStream processes a file in streaming fashion

type SubscriptionChangeService added in v1.0.25

type SubscriptionChangeService interface {
	// PreviewSubscriptionChange shows the impact of changing subscription plan
	PreviewSubscriptionChange(ctx context.Context, subscriptionID string, req dto.SubscriptionChangeRequest) (*dto.SubscriptionChangePreviewResponse, error)

	// ExecuteSubscriptionChange performs the actual subscription plan change
	ExecuteSubscriptionChange(ctx context.Context, subscriptionID string, req dto.SubscriptionChangeRequest) (*dto.SubscriptionChangeExecuteResponse, error)
}

SubscriptionChangeService handles subscription plan changes (upgrades/downgrades)

func NewSubscriptionChangeService added in v1.0.25

func NewSubscriptionChangeService(serviceParams ServiceParams) SubscriptionChangeService

NewSubscriptionChangeService creates a new subscription change service

type SubscriptionPaymentProcessor added in v1.0.25

type SubscriptionPaymentProcessor interface {
	HandlePaymentBehavior(ctx context.Context, subscription *subscription.Subscription, invoice *dto.InvoiceResponse, behavior types.PaymentBehavior, flowType types.InvoiceFlowType) error
	ProcessCreditsPaymentForInvoice(ctx context.Context, inv *dto.InvoiceResponse, sub *subscription.Subscription) decimal.Decimal
}

SubscriptionPaymentProcessor handles payment processing for subscriptions

func NewSubscriptionPaymentProcessor added in v1.0.25

func NewSubscriptionPaymentProcessor(params *ServiceParams) SubscriptionPaymentProcessor

NewSubscriptionPaymentProcessor creates a new subscription payment processor

type SubscriptionService

type SubscriptionService = interfaces.SubscriptionService

func NewSubscriptionService

func NewSubscriptionService(params ServiceParams) SubscriptionService

type SubscriptionStateHandler added in v1.0.18

type SubscriptionStateHandler struct {
	// contains filtered or unexported fields
}

func NewSubscriptionStateHandler added in v1.0.18

func NewSubscriptionStateHandler(subscription *subscription.Subscription, grant *creditgrant.CreditGrant) *SubscriptionStateHandler

func (*SubscriptionStateHandler) DetermineCreditGrantAction added in v1.0.18

func (h *SubscriptionStateHandler) DetermineCreditGrantAction() (StateAction, error)

type TaskService

type TaskService interface {
	CreateTask(ctx context.Context, req dto.CreateTaskRequest) (*dto.TaskResponse, error)
	GetTask(ctx context.Context, id string) (*dto.TaskResponse, error)
	ListTasks(ctx context.Context, filter *types.TaskFilter) (*dto.ListTasksResponse, error)
	UpdateTaskStatus(ctx context.Context, id string, status types.TaskStatus) error
	ProcessTaskWithStreaming(ctx context.Context, id string) error
}

func NewTaskService

func NewTaskService(
	serviceParams ServiceParams,
) TaskService

type TaxCalculationResult added in v1.0.21

type TaxCalculationResult struct {
	TotalTaxAmount    decimal.Decimal
	TaxAppliedRecords []*dto.TaxAppliedResponse
	TaxRates          []*dto.TaxRateResponse
}

TaxCalculationResult represents the result of tax calculations

type TaxService added in v1.0.21

type TaxService interface {
	// Core CRUD operations
	CreateTaxRate(ctx context.Context, req dto.CreateTaxRateRequest) (*dto.TaxRateResponse, error)
	GetTaxRate(ctx context.Context, id string) (*dto.TaxRateResponse, error)
	ListTaxRates(ctx context.Context, filter *types.TaxRateFilter) (*dto.ListTaxRatesResponse, error)
	UpdateTaxRate(ctx context.Context, id string, req dto.UpdateTaxRateRequest) (*dto.TaxRateResponse, error)
	GetTaxRateByCode(ctx context.Context, code string) (*dto.TaxRateResponse, error)
	DeleteTaxRate(ctx context.Context, id string) error

	// Tax Applied operations
	RecalculateInvoiceTaxes(ctx context.Context, invoiceId string) error

	// tax association operations
	CreateTaxAssociation(ctx context.Context, ta *dto.CreateTaxAssociationRequest) (*dto.TaxAssociationResponse, error)
	GetTaxAssociation(ctx context.Context, id string) (*dto.TaxAssociationResponse, error)
	UpdateTaxAssociation(ctx context.Context, id string, ta *dto.TaxAssociationUpdateRequest) (*dto.TaxAssociationResponse, error)
	DeleteTaxAssociation(ctx context.Context, id string) error
	ListTaxAssociations(ctx context.Context, filter *types.TaxAssociationFilter) (*dto.ListTaxAssociationsResponse, error)

	// LinkTaxRatesToEntity links tax rates to any entity type
	LinkTaxRatesToEntity(ctx context.Context, req dto.LinkTaxRateToEntityRequest) error

	// tax application operations
	CreateTaxApplied(ctx context.Context, req dto.CreateTaxAppliedRequest) (*dto.TaxAppliedResponse, error)
	GetTaxApplied(ctx context.Context, id string) (*dto.TaxAppliedResponse, error)
	ListTaxApplied(ctx context.Context, filter *types.TaxAppliedFilter) (*dto.ListTaxAppliedResponse, error)
	DeleteTaxApplied(ctx context.Context, id string) error

	// Invoice tax operations
	PrepareTaxRatesForInvoice(ctx context.Context, req dto.CreateInvoiceRequest) ([]*dto.TaxRateResponse, error)
	ApplyTaxesOnInvoice(ctx context.Context, inv *invoice.Invoice, taxRates []*dto.TaxRateResponse) (*TaxCalculationResult, error)
}

func NewTaxService added in v1.0.21

func NewTaxService(params ServiceParams) TaxService

NewTaxService creates a new instance of TaxService

type TenantService

type TenantService interface {
	CreateTenant(ctx context.Context, req dto.CreateTenantRequest) (*dto.TenantResponse, error)
	GetTenantByID(ctx context.Context, id string) (*dto.TenantResponse, error)
	AssignTenantToUser(ctx context.Context, req dto.AssignTenantRequest) error
	GetAllTenants(ctx context.Context) ([]*dto.TenantResponse, error)
	UpdateTenant(ctx context.Context, id string, req dto.UpdateTenantRequest) (*dto.TenantResponse, error)
	GetBillingUsage(ctx context.Context) (*dto.TenantBillingUsage, error)
	CreateTenantAsBillingCustomer(ctx context.Context, t *tenant.Tenant) error
}

func NewTenantService

func NewTenantService(
	params ServiceParams,
) TenantService

type UserService

type UserService interface {
	GetUserInfo(ctx context.Context) (*dto.UserResponse, error)
}

func NewUserService

func NewUserService(userRepo user.Repository, tenantRepo tenant.Repository) UserService

type WalletPaymentOptions added in v1.0.0

type WalletPaymentOptions struct {
	// Strategy determines the order in which wallets are selected
	Strategy WalletPaymentStrategy
	// MaxWalletsToUse limits the number of wallets to use (0 means no limit)
	MaxWalletsToUse int
	// AdditionalMetadata to include in payment requests
	AdditionalMetadata types.Metadata
}

WalletPaymentOptions defines options for wallet payment processing

func DefaultWalletPaymentOptions added in v1.0.0

func DefaultWalletPaymentOptions() WalletPaymentOptions

DefaultWalletPaymentOptions returns the default options for wallet payments

type WalletPaymentService added in v1.0.0

type WalletPaymentService interface {
	// ProcessInvoicePaymentWithWallets attempts to pay an invoice using available wallets
	ProcessInvoicePaymentWithWallets(ctx context.Context, inv *invoice.Invoice, options WalletPaymentOptions) (decimal.Decimal, error)

	// GetWalletsForPayment retrieves and filters wallets suitable for payment
	GetWalletsForPayment(ctx context.Context, customerID string, currency string, options WalletPaymentOptions) ([]*wallet.Wallet, error)
}

WalletPaymentService defines the interface for wallet payment operations

func NewWalletPaymentService added in v1.0.0

func NewWalletPaymentService(params ServiceParams) WalletPaymentService

NewWalletPaymentService creates a new wallet payment service

type WalletPaymentStrategy added in v1.0.0

type WalletPaymentStrategy string

WalletPaymentStrategy defines the strategy for selecting wallets for payment

const (
	// PromotionalFirstStrategy prioritizes promotional wallets before prepaid wallets
	PromotionalFirstStrategy WalletPaymentStrategy = "promotional_first"
	// PrepaidFirstStrategy prioritizes prepaid wallets before promotional wallets
	PrepaidFirstStrategy WalletPaymentStrategy = "prepaid_first"
	// BalanceOptimizedStrategy selects wallets to minimize leftover balances
	BalanceOptimizedStrategy WalletPaymentStrategy = "balance_optimized"
)

type WalletService

type WalletService interface {
	// CreateWallet creates a new wallet for a customer
	CreateWallet(ctx context.Context, req *dto.CreateWalletRequest) (*dto.WalletResponse, error)

	// GetWalletsByCustomerID retrieves all wallets for a customer
	GetWalletsByCustomerID(ctx context.Context, customerID string) ([]*dto.WalletResponse, error)

	// GetWalletByID retrieves a wallet by its ID and calculates real-time balance
	GetWalletByID(ctx context.Context, id string) (*dto.WalletResponse, error)

	// GetWalletTransactions retrieves transactions for a wallet with pagination
	GetWalletTransactions(ctx context.Context, walletID string, filter *types.WalletTransactionFilter) (*dto.ListWalletTransactionsResponse, error)

	// TopUpWallet adds credits to a wallet
	TopUpWallet(ctx context.Context, walletID string, req *dto.TopUpWalletRequest) (*dto.WalletResponse, error)

	// GetWalletTransactionByID retrieves a transaction by its ID
	GetWalletTransactionByID(ctx context.Context, transactionID string) (*dto.WalletTransactionResponse, error)

	// GetWalletBalance retrieves the real-time balance of a wallet
	GetWalletBalance(ctx context.Context, walletID string) (*dto.WalletBalanceResponse, error)

	// GetWalletBalance Version 2
	GetWalletBalanceV2(ctx context.Context, walletID string) (*dto.WalletBalanceResponse, error)

	// TerminateWallet terminates a wallet by closing it and debiting remaining balance
	TerminateWallet(ctx context.Context, walletID string) error

	// UpdateWallet updates a wallet
	UpdateWallet(ctx context.Context, id string, req *dto.UpdateWalletRequest) (*wallet.Wallet, error)

	// DebitWallet processes a debit operation on a wallet
	DebitWallet(ctx context.Context, req *wallet.WalletOperation) error

	// CreditWallet processes a credit operation on a wallet
	CreditWallet(ctx context.Context, req *wallet.WalletOperation) error

	// ExpireCredits expires credits for a given transaction
	ExpireCredits(ctx context.Context, transactionID string) error

	// conversion rate operations
	GetCurrencyAmountFromCredits(credits decimal.Decimal, conversionRate decimal.Decimal) decimal.Decimal
	GetCreditsFromCurrencyAmount(amount decimal.Decimal, conversionRate decimal.Decimal) decimal.Decimal

	// GetCustomerWallets retrieves all wallets for a customer
	GetCustomerWallets(ctx context.Context, req *dto.GetCustomerWalletsRequest) ([]*dto.WalletBalanceResponse, error)

	// GetWallets retrieves wallets based on filter
	GetWallets(ctx context.Context, filter *types.WalletFilter) (*types.ListResponse[*wallet.Wallet], error)

	// UpdateWalletAlertState updates the alert state of a wallet
	UpdateWalletAlertState(ctx context.Context, walletID string, state types.AlertState) error

	// PublishEvent publishes a webhook event for a wallet
	PublishEvent(ctx context.Context, eventName string, w *wallet.Wallet) error

	// CheckBalanceThresholds checks if wallet balance is below threshold and triggers alerts
	CheckBalanceThresholds(ctx context.Context, w *wallet.Wallet, balance *dto.WalletBalanceResponse) error

	// TopUpWalletForProratedCharge tops up a wallet for proration credits from subscription changes
	TopUpWalletForProratedCharge(ctx context.Context, customerID string, amount decimal.Decimal, currency string) error
}

WalletService defines the interface for wallet operations

func NewWalletService

func NewWalletService(params ServiceParams) WalletService

NewWalletService creates a new instance of WalletService

type WebhookEventMapping added in v1.0.29

type WebhookEventMapping struct {
	WebhookEvent string `json:"webhook_event"`
}

WebhookEventMapping represents the mapping configuration for alert types and statuses to webhook events

Directories

Path Synopsis
sync

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL