postgres

package
v0.0.0-...-d288a6d Latest Latest
Warning

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

Go to latest
Published: Apr 30, 2026 License: MIT Imports: 21 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ApplyPagination

func ApplyPagination(opts port.ListOptions) (limit int, afterID *uuid.UUID, err error)

ApplyPagination validates and normalises list options. It returns the effective limit, an optional afterID decoded from the cursor, or an error if the cursor is malformed.

func Connect

func Connect(ctx context.Context, cfg config.DatabaseConfig) (*pgxpool.Pool, error)

Connect creates a new pgxpool.Pool from the given DatabaseConfig.

func DecodeCursor

func DecodeCursor(cursor string) (uuid.UUID, error)

DecodeCursor decodes a base64 cursor string back to a UUID.

func DecodeTimeCursor

func DecodeTimeCursor(cursor string) (time.Time, uuid.UUID, error)

DecodeTimeCursor decodes a composite cursor back to (time, UUID).

func EncodeCursor

func EncodeCursor(id uuid.UUID) string

EncodeCursor encodes a UUID as a base64 cursor string.

func EncodeTimeCursor

func EncodeTimeCursor(t time.Time, id uuid.UUID) string

EncodeTimeCursor encodes a (time, UUID) pair as a base64 cursor for partitioned tables ordered by (created_at DESC, id DESC).

func HealthCheck

func HealthCheck(ctx context.Context, pool *pgxpool.Pool) error

HealthCheck verifies that the database connection is alive.

func NormalizeLimit

func NormalizeLimit(limit int) int

NormalizeLimit clamps a requested limit to [1, maxLimit], defaulting to defaultLimit.

func RunMigrations

func RunMigrations(dbURL string, migrationsPath string) error

RunMigrations applies all pending migrations from the given path.

func RunMigrationsDown

func RunMigrationsDown(dbURL string, migrationsPath string) error

RunMigrationsDown reverts all migrations from the given path.

Types

type APIKeyRepo

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

APIKeyRepo implements port.APIKeyStore using PostgreSQL.

func NewAPIKeyRepo

func NewAPIKeyRepo(pool *pgxpool.Pool) *APIKeyRepo

NewAPIKeyRepo creates a new APIKeyRepo.

func (*APIKeyRepo) Create

func (r *APIKeyRepo) Create(ctx context.Context, key *domain.APIKey) error

func (*APIKeyRepo) GetByHash

func (r *APIKeyRepo) GetByHash(ctx context.Context, hash string) (*domain.APIKey, error)

func (*APIKeyRepo) GetByID

func (r *APIKeyRepo) GetByID(ctx context.Context, id uuid.UUID) (*domain.APIKey, error)

func (*APIKeyRepo) ListByWorkspace

func (r *APIKeyRepo) ListByWorkspace(ctx context.Context, workspaceID uuid.UUID, opts port.ListOptions) (*port.PageResult[domain.APIKey], error)

func (*APIKeyRepo) Revoke

func (r *APIKeyRepo) Revoke(ctx context.Context, id uuid.UUID) error

func (*APIKeyRepo) TouchLastUsed

func (r *APIKeyRepo) TouchLastUsed(ctx context.Context, id uuid.UUID) error

type AdapterGrantRepo

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

AdapterGrantRepo implements adapter-level workspace sharing persistence.

func NewAdapterGrantRepo

func NewAdapterGrantRepo(pool *pgxpool.Pool) *AdapterGrantRepo

NewAdapterGrantRepo creates a new AdapterGrantRepo.

func (*AdapterGrantRepo) HasAdapterWorkspaceGrant

func (r *AdapterGrantRepo) HasAdapterWorkspaceGrant(ctx context.Context, adapterID, workspaceID uuid.UUID) (bool, error)

func (*AdapterGrantRepo) ListAdapterWorkspaceGrants

func (r *AdapterGrantRepo) ListAdapterWorkspaceGrants(ctx context.Context, adapterID uuid.UUID) ([]uuid.UUID, error)

func (*AdapterGrantRepo) ListVisibleAdaptersForWorkspace

func (r *AdapterGrantRepo) ListVisibleAdaptersForWorkspace(ctx context.Context, workspaceID uuid.UUID, opts port.ListOptions) (*port.PageResult[domain.Adapter], error)

ListVisibleAdaptersForWorkspace returns workspace-owned adapters plus system-owned adapters shared either through adapter grants (Gmail) or identity grants (SES/SMTP).

func (*AdapterGrantRepo) ReplaceAdapterWorkspaceGrants

func (r *AdapterGrantRepo) ReplaceAdapterWorkspaceGrants(ctx context.Context, adapterID uuid.UUID, workspaceIDs []uuid.UUID) error

type AdapterIdentityGrantRepo

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

AdapterIdentityGrantRepo implements SES identity-level workspace sharing persistence.

func NewAdapterIdentityGrantRepo

func NewAdapterIdentityGrantRepo(pool *pgxpool.Pool) *AdapterIdentityGrantRepo

NewAdapterIdentityGrantRepo creates a new AdapterIdentityGrantRepo.

func (*AdapterIdentityGrantRepo) HasIdentityWorkspaceGrant

func (r *AdapterIdentityGrantRepo) HasIdentityWorkspaceGrant(ctx context.Context, identityID, workspaceID uuid.UUID) (bool, error)

func (*AdapterIdentityGrantRepo) ListGrantedIdentitiesForWorkspace

func (r *AdapterIdentityGrantRepo) ListGrantedIdentitiesForWorkspace(ctx context.Context, adapterID, workspaceID uuid.UUID) ([]*domain.AdapterIdentity, error)

func (*AdapterIdentityGrantRepo) ListIdentityWorkspaceGrants

func (r *AdapterIdentityGrantRepo) ListIdentityWorkspaceGrants(ctx context.Context, identityID uuid.UUID) ([]uuid.UUID, error)

func (*AdapterIdentityGrantRepo) ReplaceIdentityWorkspaceGrants

func (r *AdapterIdentityGrantRepo) ReplaceIdentityWorkspaceGrants(ctx context.Context, identityID uuid.UUID, workspaceIDs []uuid.UUID) error

type AdapterIdentityRepo

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

AdapterIdentityRepo implements port.AdapterIdentityStore using PostgreSQL.

func NewAdapterIdentityRepo

func NewAdapterIdentityRepo(pool *pgxpool.Pool) *AdapterIdentityRepo

func (*AdapterIdentityRepo) Create

func (r *AdapterIdentityRepo) Create(ctx context.Context, identity *domain.AdapterIdentity) error

func (*AdapterIdentityRepo) Delete

func (r *AdapterIdentityRepo) Delete(ctx context.Context, id uuid.UUID) error

func (*AdapterIdentityRepo) DeleteStale

func (r *AdapterIdentityRepo) DeleteStale(ctx context.Context, adapterID uuid.UUID, keepIdentities []string) error

func (*AdapterIdentityRepo) GetByID

func (*AdapterIdentityRepo) GetDefault

func (r *AdapterIdentityRepo) GetDefault(ctx context.Context, adapterID uuid.UUID) (*domain.AdapterIdentity, error)

func (*AdapterIdentityRepo) ListByAdapter

func (r *AdapterIdentityRepo) ListByAdapter(ctx context.Context, adapterID uuid.UUID) ([]*domain.AdapterIdentity, error)

func (*AdapterIdentityRepo) SetDefault

func (r *AdapterIdentityRepo) SetDefault(ctx context.Context, adapterID uuid.UUID, identityID uuid.UUID) error

func (*AdapterIdentityRepo) Update

func (r *AdapterIdentityRepo) Update(ctx context.Context, identity *domain.AdapterIdentity) error

func (*AdapterIdentityRepo) UpsertBatch

func (r *AdapterIdentityRepo) UpsertBatch(ctx context.Context, adapterID uuid.UUID, identities []*domain.AdapterIdentity) error

type AdapterRepo

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

AdapterRepo implements port.AdapterStore using PostgreSQL.

func NewAdapterRepo

func NewAdapterRepo(pool *pgxpool.Pool) *AdapterRepo

NewAdapterRepo creates a new AdapterRepo.

func (*AdapterRepo) Create

func (r *AdapterRepo) Create(ctx context.Context, adapter *domain.Adapter) error

func (*AdapterRepo) GetByID

func (r *AdapterRepo) GetByID(ctx context.Context, id uuid.UUID) (*domain.Adapter, error)

func (*AdapterRepo) ListByWorkspace

func (r *AdapterRepo) ListByWorkspace(ctx context.Context, workspaceID *uuid.UUID, opts port.ListOptions) (*port.PageResult[domain.Adapter], error)

func (*AdapterRepo) ListInChain

func (r *AdapterRepo) ListInChain(ctx context.Context, scopes []uuid.NullUUID) ([]*domain.Adapter, error)

func (*AdapterRepo) SoftDelete

func (r *AdapterRepo) SoftDelete(ctx context.Context, id uuid.UUID) error

func (*AdapterRepo) Update

func (r *AdapterRepo) Update(ctx context.Context, adapter *domain.Adapter) error

type AuditRepo

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

AuditRepo implements port.AuditLogStore using PostgreSQL.

func NewAuditRepo

func NewAuditRepo(pool *pgxpool.Pool) *AuditRepo

NewAuditRepo creates a new AuditRepo.

func (*AuditRepo) Append

func (r *AuditRepo) Append(ctx context.Context, entry *domain.AuditLog) error

func (*AuditRepo) Query

type DashboardRepo

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

DashboardRepo implements port.DashboardStore using PostgreSQL.

func NewDashboardRepo

func NewDashboardRepo(pool *pgxpool.Pool) *DashboardRepo

NewDashboardRepo creates a new DashboardRepo.

func (*DashboardRepo) GetRecentEmails

func (r *DashboardRepo) GetRecentEmails(ctx context.Context, p port.DashboardStatsParams, limit int) ([]port.DashboardRecentEmail, error)

func (*DashboardRepo) GetTimeSeries

func (*DashboardRepo) GetTotals

func (*DashboardRepo) GetTotalsByAdapter

type EmailRepo

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

EmailRepo implements port.EmailStore using PostgreSQL.

func NewEmailRepo

func NewEmailRepo(pool *pgxpool.Pool) *EmailRepo

NewEmailRepo creates a new EmailRepo.

func (*EmailRepo) AddEvent

func (r *EmailRepo) AddEvent(ctx context.Context, event *domain.EmailEvent) error

func (*EmailRepo) AddEventTx

func (r *EmailRepo) AddEventTx(ctx context.Context, tx pgx.Tx, event *domain.EmailEvent) error

func (*EmailRepo) Create

func (r *EmailRepo) Create(ctx context.Context, email *domain.Email) error

func (*EmailRepo) CreateTx

func (r *EmailRepo) CreateTx(ctx context.Context, tx pgx.Tx, email *domain.Email) error

func (*EmailRepo) DistinctTemplateTypesForRecipient

func (r *EmailRepo) DistinctTemplateTypesForRecipient(
	ctx context.Context, workspaceID uuid.UUID, email string, since time.Time,
) ([]port.EmailHistoryType, error)

DistinctTemplateTypesForRecipient returns one row per distinct template_type_slug received by the recipient in the workspace on or after since, ordered by most recent first.

func (*EmailRepo) GetByProviderMessageID

func (r *EmailRepo) GetByProviderMessageID(ctx context.Context, providerMessageID string) (*domain.Email, error)

func (*EmailRepo) GetByTrackingID

func (r *EmailRepo) GetByTrackingID(ctx context.Context, trackingID string) (*domain.Email, error)

func (*EmailRepo) GetEvents

func (r *EmailRepo) GetEvents(ctx context.Context, emailID uuid.UUID) ([]*domain.EmailEvent, error)

func (*EmailRepo) GetPayload

func (r *EmailRepo) GetPayload(ctx context.Context, emailID uuid.UUID) (*domain.EmailPayload, error)

func (*EmailRepo) PurgeWorkspaceRuntime

func (r *EmailRepo) PurgeWorkspaceRuntime(ctx context.Context, workspaceID uuid.UUID) error

func (*EmailRepo) QueryByExternalID

func (r *EmailRepo) QueryByExternalID(ctx context.Context, wsID uuid.UUID, externalID string, cursor string, limit int) ([]*domain.Email, string, error)

func (*EmailRepo) QueryByExternalIDGlobal

func (r *EmailRepo) QueryByExternalIDGlobal(ctx context.Context, externalID string, cursor string, limit int) ([]*domain.Email, string, error)

func (*EmailRepo) QueryByRecipient

func (r *EmailRepo) QueryByRecipient(ctx context.Context, wsID uuid.UUID, email string, cursor string, limit int) ([]*domain.Email, string, error)

func (*EmailRepo) QueryByWorkspace

func (r *EmailRepo) QueryByWorkspace(ctx context.Context, wsID uuid.UUID, filters port.EmailFilters, cursor string, limit int) ([]*domain.Email, string, error)

func (*EmailRepo) SetProviderMessageID

func (r *EmailRepo) SetProviderMessageID(ctx context.Context, id uuid.UUID, providerMessageID string) error

func (*EmailRepo) UpdateRetry

func (r *EmailRepo) UpdateRetry(ctx context.Context, id uuid.UUID, retryCount int, nextRetryAt *time.Time) error

func (*EmailRepo) UpdateStatus

func (r *EmailRepo) UpdateStatus(ctx context.Context, id uuid.UUID, newStatus, expectedStatus domain.EmailStatus) error

type GlobalConfigRepo

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

GlobalConfigRepo implements port.GlobalConfigStore using PostgreSQL.

func NewGlobalConfigRepo

func NewGlobalConfigRepo(pool *pgxpool.Pool) *GlobalConfigRepo

NewGlobalConfigRepo creates a new GlobalConfigRepo.

func (*GlobalConfigRepo) Get

func (*GlobalConfigRepo) Upsert

type InjectorRepo

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

InjectorRepo implements port.InjectorStore using PostgreSQL.

func NewInjectorRepo

func NewInjectorRepo(pool *pgxpool.Pool) *InjectorRepo

NewInjectorRepo creates a new InjectorRepo.

func (*InjectorRepo) CreateDefinition

func (r *InjectorRepo) CreateDefinition(ctx context.Context, def *domain.InjectorDefinition) error

func (*InjectorRepo) CreateField

func (r *InjectorRepo) CreateField(ctx context.Context, field *domain.InjectorField) error

func (*InjectorRepo) FindDefinitionByName

func (r *InjectorRepo) FindDefinitionByName(ctx context.Context, name string, workspaceID *uuid.UUID) (*domain.InjectorDefinition, error)

func (*InjectorRepo) GetAllFieldsByDefinitions

func (r *InjectorRepo) GetAllFieldsByDefinitions(ctx context.Context, defIDs []uuid.UUID) (map[uuid.UUID][]*domain.InjectorField, error)

func (*InjectorRepo) GetAllValuesByDefinitions

func (r *InjectorRepo) GetAllValuesByDefinitions(ctx context.Context, defIDs []uuid.UUID, chain []uuid.NullUUID) (map[uuid.UUID][]*domain.InjectorValue, error)

func (*InjectorRepo) GetDefinitionByID

func (r *InjectorRepo) GetDefinitionByID(ctx context.Context, id uuid.UUID) (*domain.InjectorDefinition, error)

func (*InjectorRepo) GetFieldsByDefinition

func (r *InjectorRepo) GetFieldsByDefinition(ctx context.Context, defID uuid.UUID) ([]*domain.InjectorField, error)

func (*InjectorRepo) GetValues

func (r *InjectorRepo) GetValues(ctx context.Context, defID uuid.UUID, chain []uuid.NullUUID) ([]*domain.InjectorValue, error)

func (*InjectorRepo) ListDefinitionsInChain

func (r *InjectorRepo) ListDefinitionsInChain(ctx context.Context, chain []uuid.NullUUID) ([]*domain.InjectorDefinition, error)

func (*InjectorRepo) SetValue

func (r *InjectorRepo) SetValue(ctx context.Context, val *domain.InjectorValue) error

func (*InjectorRepo) SoftDeleteDefinition

func (r *InjectorRepo) SoftDeleteDefinition(ctx context.Context, id uuid.UUID) error

func (*InjectorRepo) UpdateDefinitionSchema

func (r *InjectorRepo) UpdateDefinitionSchema(
	ctx context.Context,
	currentName string,
	workspaceID *uuid.UUID,
	def *domain.InjectorDefinition,
	fields []*domain.InjectorField,
) error

func (*InjectorRepo) UpdateField

func (r *InjectorRepo) UpdateField(ctx context.Context, field *domain.InjectorField) error

type MemberRepo

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

MemberRepo implements port.MemberStore using PostgreSQL.

func NewMemberRepo

func NewMemberRepo(pool *pgxpool.Pool) *MemberRepo

NewMemberRepo creates a new MemberRepo.

func (*MemberRepo) AddRole

func (r *MemberRepo) AddRole(ctx context.Context, role *domain.MemberRole) error

func (*MemberRepo) CountAll

func (r *MemberRepo) CountAll(ctx context.Context) (int64, error)

func (*MemberRepo) Create

func (r *MemberRepo) Create(ctx context.Context, member *domain.Member) error

func (*MemberRepo) GetByEmail

func (r *MemberRepo) GetByEmail(ctx context.Context, email string) (*domain.Member, error)

func (*MemberRepo) GetByID

func (r *MemberRepo) GetByID(ctx context.Context, id uuid.UUID) (*domain.Member, error)

func (*MemberRepo) GetByOIDCIdentity

func (r *MemberRepo) GetByOIDCIdentity(ctx context.Context, issuer, subject string) (*domain.Member, error)

func (*MemberRepo) GetRoles

func (r *MemberRepo) GetRoles(ctx context.Context, memberID uuid.UUID) ([]*domain.MemberRole, error)

func (*MemberRepo) GetRolesByMembers

func (r *MemberRepo) GetRolesByMembers(ctx context.Context, memberIDs []uuid.UUID) (map[uuid.UUID][]*domain.MemberRole, error)

func (*MemberRepo) GetRolesInScope

func (r *MemberRepo) GetRolesInScope(ctx context.Context, memberID uuid.UUID, scopeType domain.ScopeType, scopeID *uuid.UUID) ([]*domain.MemberRole, error)

func (*MemberRepo) ListAll

func (r *MemberRepo) ListAll(ctx context.Context, opts port.ListOptions) ([]*domain.Member, string, error)

func (*MemberRepo) ListInScope

func (r *MemberRepo) ListInScope(ctx context.Context, scopeType domain.ScopeType, scopeID *uuid.UUID, opts port.ListOptions) ([]*domain.Member, string, error)

func (*MemberRepo) RemoveRole

func (r *MemberRepo) RemoveRole(ctx context.Context, roleID uuid.UUID) error

func (*MemberRepo) ReplaceRoleInScope

func (r *MemberRepo) ReplaceRoleInScope(ctx context.Context, role *domain.MemberRole) error

func (*MemberRepo) RevokeAccessInScope

func (r *MemberRepo) RevokeAccessInScope(ctx context.Context, memberID uuid.UUID, scopeType domain.ScopeType, scopeID *uuid.UUID) (int64, error)

type ProviderRateLimiter

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

ProviderRateLimiter implements port.RateLimiter using PG token buckets.

func NewProviderRateLimiter

func NewProviderRateLimiter(pool *pgxpool.Pool) *ProviderRateLimiter

NewProviderRateLimiter creates a new rate limiter backed by the given pool.

func (*ProviderRateLimiter) AcquireBurst

func (r *ProviderRateLimiter) AcquireBurst(ctx context.Context, adapterID uuid.UUID, requested int) (int, error)

AcquireBurst atomically reserves up to requested tokens for the given adapter.

func (*ProviderRateLimiter) SyncBucket

func (r *ProviderRateLimiter) SyncBucket(ctx context.Context, adapterID uuid.UUID, maxPerSecond int) error

SyncBucket creates or updates the token bucket for the given adapter.

func (*ProviderRateLimiter) TryAcquire

func (r *ProviderRateLimiter) TryAcquire(ctx context.Context, adapterID uuid.UUID) (bool, error)

TryAcquire atomically attempts to consume one token from the bucket for the given adapter. Returns true if a token was available, false otherwise.

type ProvisioningStepRepo

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

ProvisioningStepRepo implements port.ProvisioningStepStore using PostgreSQL.

func NewProvisioningStepRepo

func NewProvisioningStepRepo(pool *pgxpool.Pool) *ProvisioningStepRepo

func (*ProvisioningStepRepo) DeleteByAdapter

func (r *ProvisioningStepRepo) DeleteByAdapter(ctx context.Context, adapterID uuid.UUID) error

func (*ProvisioningStepRepo) InitDeprovisionSteps

func (r *ProvisioningStepRepo) InitDeprovisionSteps(ctx context.Context, adapterID uuid.UUID) error

func (*ProvisioningStepRepo) InitSteps

func (r *ProvisioningStepRepo) InitSteps(ctx context.Context, adapterID uuid.UUID) error

func (*ProvisioningStepRepo) ListByAdapter

func (r *ProvisioningStepRepo) ListByAdapter(ctx context.Context, adapterID uuid.UUID) ([]*domain.AdapterProvisioningStep, error)

func (*ProvisioningStepRepo) MarkCompleted

func (r *ProvisioningStepRepo) MarkCompleted(ctx context.Context, stepID uuid.UUID, resourceName, resourceARN *string) error

func (*ProvisioningStepRepo) MarkFailed

func (r *ProvisioningStepRepo) MarkFailed(ctx context.Context, stepID uuid.UUID, errMsg string) error

func (*ProvisioningStepRepo) ResetFailed

func (r *ProvisioningStepRepo) ResetFailed(ctx context.Context, adapterID uuid.UUID) error

type SNSReplayRepo

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

SNSReplayRepo persists SNS replay keys and enforces the replay window.

func NewSNSReplayRepo

func NewSNSReplayRepo(pool *pgxpool.Pool) *SNSReplayRepo

NewSNSReplayRepo creates a new SNSReplayRepo.

func (*SNSReplayRepo) Claim

func (r *SNSReplayRepo) Claim(ctx context.Context, topicArn, messageID string, messageTimestamp time.Time, replayWindow time.Duration) (port.SNSReplayDecision, error)

Claim stores a replay key if the SNS message is new and still inside the replay window.

type SuppressionRepo

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

SuppressionRepo implements port.SuppressionStore using PostgreSQL.

func NewSuppressionRepo

func NewSuppressionRepo(pool *pgxpool.Pool) *SuppressionRepo

NewSuppressionRepo creates a new SuppressionRepo.

func (*SuppressionRepo) AddGlobal

func (r *SuppressionRepo) AddGlobal(ctx context.Context, entry *domain.SuppressionGlobal) error

func (*SuppressionRepo) AddWorkspace

func (r *SuppressionRepo) AddWorkspace(ctx context.Context, entry *domain.SuppressionWorkspace) error

func (*SuppressionRepo) CheckBatch

func (r *SuppressionRepo) CheckBatch(ctx context.Context, wsID uuid.UUID, emails []string) (map[string]string, error)

func (*SuppressionRepo) GetActiveWorkspaceSuppression

func (r *SuppressionRepo) GetActiveWorkspaceSuppression(ctx context.Context, workspaceID uuid.UUID, email string) (*domain.SuppressionWorkspace, error)

func (*SuppressionRepo) GetSuppressionStatuses

func (r *SuppressionRepo) GetSuppressionStatuses(ctx context.Context, wsID uuid.UUID, emails []string) (map[string]port.SuppressionStatus, error)

func (*SuppressionRepo) IsGloballySuppressed

func (r *SuppressionRepo) IsGloballySuppressed(ctx context.Context, email string) (bool, error)

func (*SuppressionRepo) IsSuppressed

func (r *SuppressionRepo) IsSuppressed(ctx context.Context, wsID uuid.UUID, email string) (bool, string, error)

func (*SuppressionRepo) IsWorkspaceSuppressed

func (r *SuppressionRepo) IsWorkspaceSuppressed(ctx context.Context, wsID uuid.UUID, email string) (bool, error)

func (*SuppressionRepo) RemoveGlobal

func (r *SuppressionRepo) RemoveGlobal(ctx context.Context, email string, removedBy uuid.UUID, reason string) error

func (*SuppressionRepo) RemoveWorkspaceSuppression

func (r *SuppressionRepo) RemoveWorkspaceSuppression(ctx context.Context, workspaceID uuid.UUID, email string, removalReason string) error

type TemplateRepo

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

TemplateRepo implements port.TemplateStore using PostgreSQL.

func NewTemplateRepo

func NewTemplateRepo(pool *pgxpool.Pool) *TemplateRepo

NewTemplateRepo creates a new TemplateRepo.

func (*TemplateRepo) CloneVersion

func (r *TemplateRepo) CloneVersion(
	ctx context.Context,
	templateID, sourceVersionID uuid.UUID,
	createdBy *uuid.UUID,
) (*domain.TemplateVersion, error)

func (*TemplateRepo) CreateTemplate

func (r *TemplateRepo) CreateTemplate(ctx context.Context, tpl *domain.Template) error

func (*TemplateRepo) CreateType

func (r *TemplateRepo) CreateType(ctx context.Context, tt *domain.TemplateType) error

func (*TemplateRepo) CreateVersion

func (r *TemplateRepo) CreateVersion(ctx context.Context, ver *domain.TemplateVersion) error

func (*TemplateRepo) DeleteDraftVersion

func (r *TemplateRepo) DeleteDraftVersion(ctx context.Context, versionID uuid.UUID) error

func (*TemplateRepo) DeleteLocale

func (r *TemplateRepo) DeleteLocale(ctx context.Context, versionID uuid.UUID, locale string) error

func (*TemplateRepo) FindTypeBySlugInScope

func (r *TemplateRepo) FindTypeBySlugInScope(ctx context.Context, slug string, wsID *uuid.UUID) (*domain.TemplateType, error)

func (*TemplateRepo) ForkTemplate

func (r *TemplateRepo) ForkTemplate(
	ctx context.Context,
	sourceTemplateID uuid.UUID,
	workspaceID uuid.UUID,
	createdBy *uuid.UUID,
) (*domain.Template, error)

func (*TemplateRepo) GetByTypeAndScope

func (r *TemplateRepo) GetByTypeAndScope(ctx context.Context, typeID uuid.UUID, wsID *uuid.UUID) (*domain.Template, error)

func (*TemplateRepo) GetLatestVersion

func (r *TemplateRepo) GetLatestVersion(ctx context.Context, templateID uuid.UUID) (*domain.TemplateVersion, error)

func (*TemplateRepo) GetLocale

func (r *TemplateRepo) GetLocale(ctx context.Context, versionID uuid.UUID, locale string) (*domain.TemplateVersionLocale, error)

func (*TemplateRepo) GetPublishedVersion

func (r *TemplateRepo) GetPublishedVersion(ctx context.Context, templateID uuid.UUID) (*domain.TemplateVersion, error)

func (*TemplateRepo) GetTemplateByID

func (r *TemplateRepo) GetTemplateByID(ctx context.Context, id uuid.UUID) (*domain.Template, error)

func (*TemplateRepo) GetTypeByID

func (r *TemplateRepo) GetTypeByID(ctx context.Context, id uuid.UUID) (*domain.TemplateType, error)

func (*TemplateRepo) GetTypeBySlug

func (r *TemplateRepo) GetTypeBySlug(ctx context.Context, slug string, chain []uuid.NullUUID) (*domain.TemplateType, error)

func (*TemplateRepo) GetVersionByID

func (r *TemplateRepo) GetVersionByID(ctx context.Context, versionID uuid.UUID) (*domain.TemplateVersion, error)

func (*TemplateRepo) ListByType

func (r *TemplateRepo) ListByType(ctx context.Context, typeID uuid.UUID, wsID *uuid.UUID, opts port.ListOptions) ([]*domain.Template, string, error)

func (*TemplateRepo) ListLocales

func (r *TemplateRepo) ListLocales(ctx context.Context, versionID uuid.UUID) ([]*domain.TemplateVersionLocale, error)

func (*TemplateRepo) ListTypes

func (r *TemplateRepo) ListTypes(ctx context.Context, wsID *uuid.UUID, opts port.ListOptions) ([]*domain.TemplateType, string, error)

func (*TemplateRepo) ListVersions

func (r *TemplateRepo) ListVersions(ctx context.Context, templateID uuid.UUID) ([]*domain.TemplateVersion, error)

func (*TemplateRepo) Publish

func (r *TemplateRepo) Publish(ctx context.Context, versionID uuid.UUID) error

func (*TemplateRepo) ResolveTemplate

func (r *TemplateRepo) ResolveTemplate(ctx context.Context, typeID uuid.UUID, chain []uuid.NullUUID) (*domain.Template, error)

func (*TemplateRepo) SetDisabled

func (r *TemplateRepo) SetDisabled(ctx context.Context, templateID uuid.UUID, wsID *uuid.UUID, disabled bool) error

func (*TemplateRepo) SetLocale

func (r *TemplateRepo) SetLocale(ctx context.Context, locale *domain.TemplateVersionLocale) error

func (*TemplateRepo) SoftDeleteTemplate

func (r *TemplateRepo) SoftDeleteTemplate(ctx context.Context, templateID uuid.UUID) error

func (*TemplateRepo) SoftDeleteType

func (r *TemplateRepo) SoftDeleteType(ctx context.Context, id uuid.UUID) error

func (*TemplateRepo) UpdateType

func (r *TemplateRepo) UpdateType(ctx context.Context, tt *domain.TemplateType) error

func (*TemplateRepo) UpdateVersion

func (r *TemplateRepo) UpdateVersion(ctx context.Context, ver *domain.TemplateVersion) error

type TemplateTypeSubscriptionRepo

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

TemplateTypeSubscriptionRepo is the Postgres adapter for template_type_subscriptions.

func NewTemplateTypeSubscriptionRepo

func NewTemplateTypeSubscriptionRepo(db *pgxpool.Pool) *TemplateTypeSubscriptionRepo

NewTemplateTypeSubscriptionRepo returns a new TemplateTypeSubscriptionRepo backed by pool.

func (*TemplateTypeSubscriptionRepo) BatchCheckOptOut

func (s *TemplateTypeSubscriptionRepo) BatchCheckOptOut(
	ctx context.Context, workspaceID, templateTypeID uuid.UUID, emails []string,
) (map[string]struct{}, error)

BatchCheckOptOut returns the subset of emails that have an explicit opt-out row (subscribed = false) for the given (workspaceID, templateTypeID). Emails with no row or subscribed=true are not included. An empty input returns an empty map immediately without querying the DB.

func (*TemplateTypeSubscriptionRepo) GetState

func (s *TemplateTypeSubscriptionRepo) GetState(
	ctx context.Context, workspaceID, templateTypeID uuid.UUID, email string,
) (*domain.TemplateTypeSubscription, error)

GetState returns the subscription row for (workspaceID, templateTypeID, email), or a 404 AppError if none exists.

func (*TemplateTypeSubscriptionRepo) ListOptOutsForRecipient

func (s *TemplateTypeSubscriptionRepo) ListOptOutsForRecipient(
	ctx context.Context, workspaceID uuid.UUID, email string,
) ([]*domain.TemplateTypeSubscription, error)

ListOptOutsForRecipient returns all subscription rows for (workspaceID, email).

func (*TemplateTypeSubscriptionRepo) Upsert

Upsert inserts or updates the subscription state for (workspace, template_type, email).

type TemplateTypeUsageRepo

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

TemplateTypeUsageRepo provides lightweight usage checks for shared resource revocation.

func NewTemplateTypeUsageRepo

func NewTemplateTypeUsageRepo(pool *pgxpool.Pool) *TemplateTypeUsageRepo

NewTemplateTypeUsageRepo creates a new TemplateTypeUsageRepo.

func (*TemplateTypeUsageRepo) CountTypesUsingAdapter

func (r *TemplateTypeUsageRepo) CountTypesUsingAdapter(ctx context.Context, adapterID uuid.UUID, workspaceID *uuid.UUID) (int, error)

func (*TemplateTypeUsageRepo) CountTypesUsingSenderIdentity

func (r *TemplateTypeUsageRepo) CountTypesUsingSenderIdentity(ctx context.Context, identityID uuid.UUID, workspaceID *uuid.UUID) (int, error)

func (*TemplateTypeUsageRepo) ListWorkspacesUsingAdapter

func (r *TemplateTypeUsageRepo) ListWorkspacesUsingAdapter(ctx context.Context, adapterID uuid.UUID, workspaceIDs []uuid.UUID) ([]uuid.UUID, error)

ListWorkspacesUsingAdapter returns the subset of requested workspaces that currently have template types using the provided adapter.

func (*TemplateTypeUsageRepo) ListWorkspacesUsingSenderIdentity

func (r *TemplateTypeUsageRepo) ListWorkspacesUsingSenderIdentity(ctx context.Context, identityID uuid.UUID, workspaceIDs []uuid.UUID) ([]uuid.UUID, error)

ListWorkspacesUsingSenderIdentity returns the subset of requested workspaces that currently have template types using the provided sender identity.

type TenantRepo

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

TenantRepo implements port.TenantStore using PostgreSQL.

func NewTenantRepo

func NewTenantRepo(pool *pgxpool.Pool) *TenantRepo

NewTenantRepo creates a new TenantRepo.

func (*TenantRepo) Create

func (r *TenantRepo) Create(ctx context.Context, tenant *domain.Tenant) error

func (*TenantRepo) GetByCode

func (r *TenantRepo) GetByCode(ctx context.Context, code string) (*domain.Tenant, error)

func (*TenantRepo) GetByID

func (r *TenantRepo) GetByID(ctx context.Context, id uuid.UUID) (*domain.Tenant, error)

func (*TenantRepo) List

func (r *TenantRepo) List(ctx context.Context, opts port.ListOptions) ([]*domain.Tenant, string, error)

func (*TenantRepo) Purge

func (r *TenantRepo) Purge(ctx context.Context, id uuid.UUID) error

func (*TenantRepo) SoftDelete

func (r *TenantRepo) SoftDelete(ctx context.Context, id uuid.UUID) error

func (*TenantRepo) Update

func (r *TenantRepo) Update(ctx context.Context, tenant *domain.Tenant) error

type WebhookRepo

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

WebhookRepo implements port.WebhookStore using PostgreSQL.

func NewWebhookRepo

func NewWebhookRepo(pool *pgxpool.Pool) *WebhookRepo

NewWebhookRepo creates a new WebhookRepo.

func (*WebhookRepo) Create

func (r *WebhookRepo) Create(ctx context.Context, wh *domain.Webhook) error

func (*WebhookRepo) Delete

func (r *WebhookRepo) Delete(ctx context.Context, id uuid.UUID) error

func (*WebhookRepo) GetActiveByWorkspace

func (r *WebhookRepo) GetActiveByWorkspace(ctx context.Context, workspaceID uuid.UUID) ([]*domain.Webhook, error)

func (*WebhookRepo) GetByID

func (r *WebhookRepo) GetByID(ctx context.Context, id uuid.UUID) (*domain.Webhook, error)

func (*WebhookRepo) IncrementFailureCount

func (r *WebhookRepo) IncrementFailureCount(ctx context.Context, id uuid.UUID) (int, bool, error)

func (*WebhookRepo) ListByWorkspace

func (r *WebhookRepo) ListByWorkspace(ctx context.Context, workspaceID uuid.UUID, opts port.ListOptions) (*port.PageResult[domain.Webhook], error)

func (*WebhookRepo) ResetFailureCount

func (r *WebhookRepo) ResetFailureCount(ctx context.Context, id uuid.UUID) error

func (*WebhookRepo) Update

func (r *WebhookRepo) Update(ctx context.Context, wh *domain.Webhook) error

type WorkspaceRepo

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

WorkspaceRepo implements port.WorkspaceStore using PostgreSQL.

func NewWorkspaceRepo

func NewWorkspaceRepo(pool *pgxpool.Pool) *WorkspaceRepo

NewWorkspaceRepo creates a new WorkspaceRepo.

func (*WorkspaceRepo) Create

func (r *WorkspaceRepo) Create(ctx context.Context, ws *domain.Workspace) error

func (*WorkspaceRepo) CreateLogicalPair

func (r *WorkspaceRepo) CreateLogicalPair(ctx context.Context, prod *domain.Workspace, test *domain.Workspace) error

func (*WorkspaceRepo) ExistsActiveByTenantCode

func (r *WorkspaceRepo) ExistsActiveByTenantCode(ctx context.Context, tenantCode string, workspaceCodes []string, environment domain.Environment) (map[string]bool, error)

func (*WorkspaceRepo) GetByID

func (r *WorkspaceRepo) GetByID(ctx context.Context, id uuid.UUID) (*domain.Workspace, error)

func (*WorkspaceRepo) GetByTenantAndCode

func (r *WorkspaceRepo) GetByTenantAndCode(ctx context.Context, tenantID uuid.UUID, code string, environment domain.Environment) (*domain.Workspace, error)

func (*WorkspaceRepo) GetSystemWorkspace

func (r *WorkspaceRepo) GetSystemWorkspace(ctx context.Context, tenantID uuid.UUID, environment domain.Environment) (*domain.Workspace, error)

func (*WorkspaceRepo) GetUnsubscribeSigningKey

func (r *WorkspaceRepo) GetUnsubscribeSigningKey(ctx context.Context, workspaceID uuid.UUID) ([]byte, error)

func (*WorkspaceRepo) ListByTenant

func (r *WorkspaceRepo) ListByTenant(ctx context.Context, tenantID uuid.UUID, environment domain.Environment, opts port.ListOptions) ([]*domain.Workspace, string, error)

func (*WorkspaceRepo) SoftDelete

func (r *WorkspaceRepo) SoftDelete(ctx context.Context, id uuid.UUID) error

func (*WorkspaceRepo) SoftDeleteLogical

func (r *WorkspaceRepo) SoftDeleteLogical(ctx context.Context, tenantID uuid.UUID, code string) error

func (*WorkspaceRepo) Update

func (r *WorkspaceRepo) Update(ctx context.Context, ws *domain.Workspace) error

func (*WorkspaceRepo) UpdateShared

func (r *WorkspaceRepo) UpdateShared(ctx context.Context, tenantID uuid.UUID, currentCode, nextCode, nextName string) error

Jump to

Keyboard shortcuts

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