subscriptions

package
v1.0.6 Latest Latest
Warning

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

Go to latest
Published: May 26, 2025 License: MIT Imports: 14 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GetDefaultStoragePath

func GetDefaultStoragePath() (string, error)

GetDefaultStoragePath returns the default storage path

Types

type ActivityType

type ActivityType string

ActivityType represents different types of repository activities

const (
	ActivityCommits     ActivityType = "commits"
	ActivityBranches    ActivityType = "branches"
	ActivityPRs         ActivityType = "prs"
	ActivityIssues      ActivityType = "issues"
	ActivityDiscussions ActivityType = "discussions"
	ActivityReleases    ActivityType = "releases"
	ActivityWiki        ActivityType = "wiki"
	ActivitySecurity    ActivityType = "security"
)

func AllActivityTypes

func AllActivityTypes() []ActivityType

AllActivityTypes returns all available activity types

type AuthorFilter

type AuthorFilter struct {
	// All contributors if true
	All bool `json:"all" yaml:"all"`

	// Specific usernames to include
	Include []string `json:"include" yaml:"include"`

	// Specific usernames to exclude
	Exclude []string `json:"exclude" yaml:"exclude"`

	// Exclude bots
	ExcludeBots bool `json:"exclude_bots" yaml:"exclude_bots"`
}

AuthorFilter defines author filtering options

type BranchFilter

type BranchFilter struct {
	// All branches if true, otherwise use patterns
	All bool `json:"all" yaml:"all"`

	// Include main/master branches
	MainOnly bool `json:"main_only" yaml:"main_only"`

	// Specific branch patterns (glob patterns)
	Patterns []string `json:"patterns" yaml:"patterns"`

	// Exclude patterns
	ExcludePatterns []string `json:"exclude_patterns" yaml:"exclude_patterns"`
}

BranchFilter defines branch filtering options

type DiscussionFilter

type DiscussionFilter struct {
	// All discussions if true
	All bool `json:"all" yaml:"all"`

	// Specific categories to include
	Categories []string `json:"categories" yaml:"categories"`

	// Exclude categories
	ExcludeCategories []string `json:"exclude_categories" yaml:"exclude_categories"`

	// Discussion states to monitor (open, closed, all)
	States []string `json:"states" yaml:"states"`

	// Monitor answered discussions only
	AnsweredOnly bool `json:"answered_only" yaml:"answered_only"`

	// Monitor unanswered discussions only
	UnansweredOnly bool `json:"unanswered_only" yaml:"unanswered_only"`

	// Minimum upvotes threshold
	MinUpvotes int `json:"min_upvotes" yaml:"min_upvotes"`

	// Minimum comments threshold
	MinComments int `json:"min_comments" yaml:"min_comments"`

	// Keywords to include
	Keywords []string `json:"keywords" yaml:"keywords"`

	// Keywords to exclude
	ExcludeKeywords []string `json:"exclude_keywords" yaml:"exclude_keywords"`

	// Monitor discussions you're mentioned in
	MentionsOnly bool `json:"mentions_only" yaml:"mentions_only"`

	// Monitor discussions you're participating in
	ParticipatingOnly bool `json:"participating_only" yaml:"participating_only"`
}

DiscussionFilter defines discussion filtering options

type FileFilter

type FileFilter struct {
	// Include patterns (glob patterns)
	Include []string `json:"include" yaml:"include"`

	// Exclude patterns (glob patterns)
	Exclude []string `json:"exclude" yaml:"exclude"`

	// File extensions to include
	Extensions []string `json:"extensions" yaml:"extensions"`

	// Paths to include
	Paths []string `json:"paths" yaml:"paths"`
}

FileFilter defines file pattern filtering

type FileStorage

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

FileStorage implements Storage using encrypted files

func NewFileStorage

func NewFileStorage(filePath, password string) (*FileStorage, error)

NewFileStorage creates a new file-based storage

func (*FileStorage) AddSubscription

func (fs *FileStorage) AddSubscription(subscription RepositorySubscription) error

AddSubscription adds a new subscription

func (*FileStorage) BackupSubscriptions

func (fs *FileStorage) BackupSubscriptions(path string) error

BackupSubscriptions creates a backup of subscriptions

func (*FileStorage) ExportSubscriptions

func (fs *FileStorage) ExportSubscriptions() (*SubscriptionList, error)

ExportSubscriptions exports all subscriptions

func (*FileStorage) GetSubscription

func (fs *FileStorage) GetSubscription(repository string) (*RepositorySubscription, error)

GetSubscription retrieves a specific subscription

func (*FileStorage) ImportSubscriptions

func (fs *FileStorage) ImportSubscriptions(list SubscriptionList) error

ImportSubscriptions imports subscriptions from a list

func (*FileStorage) ListSubscriptions

func (fs *FileStorage) ListSubscriptions() ([]RepositorySubscription, error)

ListSubscriptions returns all subscriptions

func (*FileStorage) RemoveSubscription

func (fs *FileStorage) RemoveSubscription(repository string) error

RemoveSubscription removes a subscription

func (*FileStorage) RestoreSubscriptions

func (fs *FileStorage) RestoreSubscriptions(path string) error

RestoreSubscriptions restores subscriptions from a backup

func (*FileStorage) UpdateSubscription

func (fs *FileStorage) UpdateSubscription(subscription RepositorySubscription) error

UpdateSubscription updates an existing subscription

type Frequency

type Frequency int

Frequency defines notification frequency

const (
	FrequencyRealTime Frequency = iota
	FrequencyHourly
	FrequencyDaily
)

func ParseFrequency

func ParseFrequency(s string) Frequency

ParseFrequency parses a frequency string

func (Frequency) String

func (f Frequency) String() string

type GitHubClient

type GitHubClient interface {
	GetRepository(ctx context.Context, owner, repo string) (*github.Repository, error)
	ListUserRepositories(ctx context.Context, user string) ([]*github.Repository, error)
	ListOrganizationRepositories(ctx context.Context, org string) ([]*github.Repository, error)
	CheckRepositoryAccess(ctx context.Context, owner, repo string) (bool, error)
}

GitHubClient interface for GitHub operations

type GitHubClientImpl

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

GitHubClientImpl implements GitHubClient using go-github

func NewGitHubClient

func NewGitHubClient(ctx context.Context) (*GitHubClientImpl, error)

NewGitHubClient creates a new GitHub client for subscriptions

func (*GitHubClientImpl) CheckRepositoryAccess

func (gc *GitHubClientImpl) CheckRepositoryAccess(ctx context.Context, owner, repo string) (bool, error)

CheckRepositoryAccess checks if we have access to a repository

func (*GitHubClientImpl) DeleteRepositorySubscription

func (gc *GitHubClientImpl) DeleteRepositorySubscription(ctx context.Context, owner, repo string) error

DeleteRepositorySubscription deletes the subscription for a repository

func (*GitHubClientImpl) GetAuthenticatedUser

func (gc *GitHubClientImpl) GetAuthenticatedUser(ctx context.Context) (*github.User, error)

GetAuthenticatedUser gets information about the authenticated user

func (*GitHubClientImpl) GetRawClient

func (gc *GitHubClientImpl) GetRawClient() *github.Client

GetRawClient returns the underlying GitHub client

func (*GitHubClientImpl) GetRepository

func (gc *GitHubClientImpl) GetRepository(ctx context.Context, owner, repo string) (*github.Repository, error)

GetRepository retrieves repository information

func (*GitHubClientImpl) GetRepositoryEvents

func (gc *GitHubClientImpl) GetRepositoryEvents(ctx context.Context, owner, repo string) ([]*github.Event, error)

GetRepositoryEvents gets recent events for a repository

func (*GitHubClientImpl) GetRepositoryNotifications

func (gc *GitHubClientImpl) GetRepositoryNotifications(ctx context.Context, owner, repo string) ([]*github.Notification, error)

GetRepositoryNotifications gets notifications for a repository

func (*GitHubClientImpl) GetRepositorySubscription

func (gc *GitHubClientImpl) GetRepositorySubscription(ctx context.Context, owner, repo string) (*github.Subscription, error)

GetRepositorySubscription gets the current subscription status for a repository

func (*GitHubClientImpl) ListOrganizationRepositories

func (gc *GitHubClientImpl) ListOrganizationRepositories(ctx context.Context, org string) ([]*github.Repository, error)

ListOrganizationRepositories lists repositories for an organization

func (*GitHubClientImpl) ListUserOrganizations

func (gc *GitHubClientImpl) ListUserOrganizations(ctx context.Context) ([]*github.Organization, error)

ListUserOrganizations lists organizations for the authenticated user

func (*GitHubClientImpl) ListUserRepositories

func (gc *GitHubClientImpl) ListUserRepositories(ctx context.Context, user string) ([]*github.Repository, error)

ListUserRepositories lists repositories for a user

func (*GitHubClientImpl) ListWatchedRepositories

func (gc *GitHubClientImpl) ListWatchedRepositories(ctx context.Context) ([]*github.Repository, error)

ListWatchedRepositories lists repositories the authenticated user is watching

func (*GitHubClientImpl) SetRepositorySubscription

func (gc *GitHubClientImpl) SetRepositorySubscription(ctx context.Context, owner, repo string, subscription *github.Subscription) (*github.Subscription, error)

SetRepositorySubscription sets the subscription status for a repository

func (*GitHubClientImpl) ValidateRepositoryPattern

func (gc *GitHubClientImpl) ValidateRepositoryPattern(ctx context.Context, pattern string) ([]string, error)

ValidateRepositoryPattern validates if a repository pattern is accessible

type Manager

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

Manager handles repository subscription operations

func NewManager

func NewManager(storage Storage, client GitHubClient) *Manager

NewManager creates a new subscription manager

func (*Manager) ExpandPatterns

func (m *Manager) ExpandPatterns(ctx context.Context) ([]string, error)

ExpandPatterns expands wildcard patterns to actual repositories

func (*Manager) GetStats

func (m *Manager) GetStats() (*SubscriptionStats, error)

GetStats returns subscription statistics

func (*Manager) GetSubscription

func (m *Manager) GetSubscription(repository string) (*RepositorySubscription, error)

GetSubscription retrieves a specific subscription

func (*Manager) ListSubscriptions

func (m *Manager) ListSubscriptions() ([]RepositorySubscription, error)

ListSubscriptions returns all subscriptions

func (*Manager) Subscribe

func (m *Manager) Subscribe(ctx context.Context, repository string, priority Priority, config SubscriptionConfig) error

Subscribe adds a new repository subscription

func (*Manager) Unsubscribe

func (m *Manager) Unsubscribe(repository string) error

Unsubscribe removes a repository subscription

func (*Manager) UpdateSubscription

func (m *Manager) UpdateSubscription(repository string, updates SubscriptionUpdates) error

UpdateSubscription updates an existing subscription

func (*Manager) ValidateAccess

func (m *Manager) ValidateAccess(ctx context.Context) error

ValidateAccess checks access to all subscribed repositories

type Priority

type Priority int

Priority levels for repository subscriptions

const (
	PriorityLow Priority = iota
	PriorityNormal
	PriorityCritical
)

func ParsePriority

func ParsePriority(s string) Priority

ParsePriority parses a priority string

func (Priority) String

func (p Priority) String() string

type RepositorySubscription

type RepositorySubscription struct {
	// Repository full name (owner/repo) or pattern (owner/*)
	Repository string `json:"repository" yaml:"repository"`

	// Whether this is a wildcard pattern
	IsPattern bool `json:"is_pattern" yaml:"is_pattern"`

	// Priority level
	Priority Priority `json:"priority" yaml:"priority"`

	// Subscription configuration
	Config SubscriptionConfig `json:"config" yaml:"config"`

	// Whether the subscription is active
	Active bool `json:"active" yaml:"active"`

	// Creation timestamp
	CreatedAt time.Time `json:"created_at" yaml:"created_at"`

	// Last updated timestamp
	UpdatedAt time.Time `json:"updated_at" yaml:"updated_at"`

	// Last access check (for permission validation)
	LastAccessCheck time.Time `json:"last_access_check" yaml:"last_access_check"`

	// Whether we have access to this repository
	HasAccess bool `json:"has_access" yaml:"has_access"`

	// Access error message if any
	AccessError string `json:"access_error,omitempty" yaml:"access_error,omitempty"`

	// Metadata for additional information
	Metadata map[string]interface{} `json:"metadata,omitempty" yaml:"metadata,omitempty"`
}

RepositorySubscription represents a subscription to a repository

type Storage

type Storage interface {
	AddSubscription(subscription RepositorySubscription) error
	RemoveSubscription(repository string) error
	GetSubscription(repository string) (*RepositorySubscription, error)
	UpdateSubscription(subscription RepositorySubscription) error
	ListSubscriptions() ([]RepositorySubscription, error)
	ExportSubscriptions() (*SubscriptionList, error)
	ImportSubscriptions(list SubscriptionList) error
	BackupSubscriptions(path string) error
	RestoreSubscriptions(path string) error
}

Storage interface for subscription persistence

type SubscriptionConfig

type SubscriptionConfig struct {
	// Activity types to monitor
	ActivityTypes []ActivityType `json:"activity_types" yaml:"activity_types"`

	// Notification frequency
	Frequency Frequency `json:"frequency" yaml:"frequency"`

	// Branch filtering
	BranchFilter BranchFilter `json:"branch_filter" yaml:"branch_filter"`

	// Author filtering
	AuthorFilter AuthorFilter `json:"author_filter" yaml:"author_filter"`

	// File pattern filtering
	FileFilter FileFilter `json:"file_filter" yaml:"file_filter"`

	// Discussion filtering
	DiscussionFilter DiscussionFilter `json:"discussion_filter" yaml:"discussion_filter"`

	// Custom webhook URL (optional)
	WebhookURL string `json:"webhook_url,omitempty" yaml:"webhook_url,omitempty"`

	// Custom notification template (optional)
	Template string `json:"template,omitempty" yaml:"template,omitempty"`
}

SubscriptionConfig holds the configuration for a repository subscription

func DefaultSubscriptionConfig

func DefaultSubscriptionConfig() SubscriptionConfig

DefaultSubscriptionConfig returns a default subscription configuration

type SubscriptionList

type SubscriptionList struct {
	// Version for compatibility
	Version string `json:"version" yaml:"version"`

	// Subscriptions
	Subscriptions []RepositorySubscription `json:"subscriptions" yaml:"subscriptions"`

	// Last updated timestamp
	UpdatedAt time.Time `json:"updated_at" yaml:"updated_at"`

	// Metadata
	Metadata map[string]interface{} `json:"metadata,omitempty" yaml:"metadata,omitempty"`
}

SubscriptionList represents a collection of repository subscriptions

type SubscriptionStats

type SubscriptionStats struct {
	Total        int       `json:"total"`
	Active       int       `json:"active"`
	Inactive     int       `json:"inactive"`
	Patterns     int       `json:"patterns"`
	Repositories int       `json:"repositories"`
	Critical     int       `json:"critical"`
	Normal       int       `json:"normal"`
	Low          int       `json:"low"`
	AccessErrors int       `json:"access_errors"`
	LastUpdated  time.Time `json:"last_updated"`
}

SubscriptionStats provides statistics about subscriptions

type SubscriptionUpdates

type SubscriptionUpdates struct {
	Priority *Priority           `json:"priority,omitempty"`
	Config   *SubscriptionConfig `json:"config,omitempty"`
	Active   *bool               `json:"active,omitempty"`
}

SubscriptionUpdates represents updates to a subscription

type ValidationError

type ValidationError struct {
	Field   string `json:"field"`
	Message string `json:"message"`
}

ValidationError represents a subscription validation error

func (ValidationError) Error

func (e ValidationError) Error() string

type ValidationResult

type ValidationResult struct {
	Valid  bool              `json:"valid"`
	Errors []ValidationError `json:"errors,omitempty"`
}

ValidationResult holds the result of subscription validation

Jump to

Keyboard shortcuts

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