Documentation ¶
Index ¶
- Constants
- Variables
- func AssertEntriesEqual(t *testing.T, gotEntries []Entry, wantEntries []Entry)
- func AssertEntryEquals(t *testing.T, index int, gotEntry Entry, wantEntry Entry)
- func AssertFeedEquals(t *testing.T, got, want Feed)
- func AssertFeedsEqual(t *testing.T, gotFeeds, wantFeeds []Feed)
- func AssertSubscriptionEquals(t *testing.T, want Subscription, got Subscription)
- func AssertSubscriptionsEqual(t *testing.T, want []Subscription, got []Subscription)
- type Category
- type Entry
- type EntryMetadata
- type FakeRepository
- func (r *FakeRepository) FeedCategoryCreate(category Category) error
- func (r *FakeRepository) FeedCategoryDelete(userUUID string, categoryUUID string) error
- func (r *FakeRepository) FeedCategoryGetByName(userUUID string, name string) (Category, error)
- func (r *FakeRepository) FeedCategoryGetBySlug(userUUID string, slug string) (Category, error)
- func (r *FakeRepository) FeedCategoryGetByUUID(userUUID string, categoryUUID string) (Category, error)
- func (r *FakeRepository) FeedCategoryGetMany(userUUID string) ([]Category, error)
- func (r *FakeRepository) FeedCategoryNameAndSlugAreRegistered(userUUID string, name string, slug string) (bool, error)
- func (r *FakeRepository) FeedCategoryNameAndSlugAreRegisteredToAnotherCategory(userUUID string, categoryUUID string, name string, slug string) (bool, error)
- func (r *FakeRepository) FeedCategoryUpdate(category Category) error
- func (r *FakeRepository) FeedCreate(feed Feed) error
- func (r *FakeRepository) FeedEntryCreateMany(entries []Entry) (int64, error)
- func (r *FakeRepository) FeedEntryMarkAllAsRead(userUUID string) error
- func (r *FakeRepository) FeedEntryMarkAllAsReadByCategory(userUUID string, categoryUUID string) error
- func (r *FakeRepository) FeedEntryMarkAllAsReadBySubscription(userUUID string, subscriptionUUID string) error
- func (r *FakeRepository) FeedEntryMetadataCreate(newEntryMetadata EntryMetadata) error
- func (r *FakeRepository) FeedEntryMetadataGetByUID(userUUID string, entryUID string) (EntryMetadata, error)
- func (r *FakeRepository) FeedEntryMetadataUpdate(updatedEntryMetadata EntryMetadata) error
- func (r *FakeRepository) FeedGetBySlug(feedSlug string) (Feed, error)
- func (r *FakeRepository) FeedGetByURL(feedURL string) (Feed, error)
- func (r *FakeRepository) FeedSubscriptionCreate(subscription Subscription) (Subscription, error)
- func (r *FakeRepository) FeedSubscriptionDelete(userUUID string, subscriptionUUID string) error
- func (r *FakeRepository) FeedSubscriptionGetByFeed(userUUID string, feedUUID string) (Subscription, error)
- func (r *FakeRepository) FeedSubscriptionGetByUUID(userUUID string, subscriptionUUID string) (Subscription, error)
- func (r *FakeRepository) FeedSubscriptionIsRegistered(userUUID string, feedUUID string) (bool, error)
- func (r *FakeRepository) FeedSubscriptionUpdate(subscription Subscription) error
- type Feed
- type Repository
- type Service
- func (s *Service) Categories(userUUID string) ([]Category, error)
- func (s *Service) CategoryBySlug(userUUID string, slug string) (Category, error)
- func (s *Service) CategoryByUUID(userUUID string, categoryUUID string) (Category, error)
- func (s *Service) CreateCategory(userUUID string, name string) (Category, error)
- func (s *Service) DeleteCategory(userUUID string, categoryUUID string) error
- func (s *Service) DeleteSubscription(userUUID string, subscriptionUUID string) error
- func (s *Service) FeedBySlug(slug string) (Feed, error)
- func (s *Service) GetOrCreateCategory(userUUID string, name string) (Category, bool, error)
- func (s *Service) GetOrCreateFeedAndEntries(feedURL string) (Feed, bool, error)
- func (s *Service) GetOrCreateSubscription(newSubscription Subscription) (Subscription, bool, error)
- func (s *Service) MarkAllEntriesAsRead(userUUID string) error
- func (s *Service) MarkAllEntriesAsReadByCategory(userUUID string, categoryUUID string) error
- func (s *Service) MarkAllEntriesAsReadBySubscription(userUUID string, subscriptionUUID string) error
- func (s *Service) Subscribe(userUUID string, categoryUUID string, feedURL string) error
- func (s *Service) SubscriptionByFeed(userUUID string, feedUUID string) (Subscription, error)
- func (s *Service) ToggleEntryRead(userUUID string, entryUID string) error
- func (s *Service) UpdateCategory(category Category) error
- func (s *Service) UpdateSubscription(subscription Subscription) error
- type Subscription
- type ValidationRepository
Constants ¶
const (
EntryTextRankMaxTerms = 10
)
Variables ¶
var ( // Feed ErrFeedHashRequired error = errors.New("feed: hash required") ErrFeedNotFound error = errors.New("feed: not found") ErrFeedSlugInvalid error = errors.New("feed: invalid slug") ErrFeedSlugRequired error = errors.New("feed: slug required") ErrFeedTitleRequired error = errors.New("feed: title required") ErrFeedUUIDInvalid error = errors.New("feed: invalid UUID") ErrFeedUUIDRequired error = errors.New("feed: UUID required") ErrFeedURLInvalid error = errors.New("feed: invalid URL") ErrFeedURLNoScheme error = errors.New("feed: missing URL scheme") ErrFeedURLNoHost error = errors.New("feed: missing URL host") ErrFeedURLRequired error = errors.New("feed: URL required") ErrFeedURLUnsupportedScheme error = errors.New("feed: unsupported URL scheme") // Feed Category ErrCategoryAlreadyRegistered error = errors.New("category: already registered") ErrCategoryNameRequired error = errors.New("category: name required") ErrCategoryNotFound error = errors.New("category: Not Found") ErrCategorySlugInvalid error = errors.New("category: invalid slug") ErrCategorySlugRequired error = errors.New("category: slug required") ErrCategoryUserUUIDRequired error = errors.New("category: UserUUID required") ErrCategoryUUIDInvalid error = errors.New("category: invalid UUID") ErrCategoryUUIDRequired error = errors.New("category: UUID required") // Feed Entry ErrEntryNotFound error = errors.New("entry: not found") ErrEntryTitleRequired error = errors.New("entry: title required") ErrEntryPublishedAtInTheFuture error = errors.New("entry: publication date is in the future") ErrEntryPublishedAtIsZero error = errors.New("entry: publication date is zero") ErrEntryUpdatedAtInTheFuture error = errors.New("entry: update date is in the future") ErrEntryUpdatedAtIsZero error = errors.New("entry: update date is zero") ErrEntryURLInvalid error = errors.New("entry: invalid URL") ErrEntryURLNoScheme error = errors.New("entry: missing URL scheme") ErrEntryURLNoHost error = errors.New("entry: missing URL host") ErrEntryURLRequired error = errors.New("entry: URL required") ErrEntryURLUnsupportedScheme error = errors.New("entry: unsupported URL scheme") ErrEntryUIDInvalid error = errors.New("entry: invalid UID") // Feed Entry Metadata ErrEntryMetadataNotFound error = errors.New("entry-metadata: not found") // Feed Subscription ErrSubscriptionAlreadyRegistered error = errors.New("subscription: already registered") ErrSubscriptionNotFound error = errors.New("subscription: not found") ErrSubscriptionUUIDRequired error = errors.New("subscription: UUID required") // Feed user ErrUserUUIDRequired error = errors.New("user: UUID required") )
Functions ¶
func AssertEntriesEqual ¶ added in v0.3.0
func AssertEntryEquals ¶ added in v0.4.0
func AssertFeedEquals ¶ added in v0.3.0
func AssertFeedsEqual ¶ added in v0.3.0
func AssertSubscriptionEquals ¶ added in v0.4.0
func AssertSubscriptionEquals(t *testing.T, want Subscription, got Subscription)
func AssertSubscriptionsEqual ¶ added in v0.4.0
func AssertSubscriptionsEqual(t *testing.T, want []Subscription, got []Subscription)
Types ¶
type Category ¶
type Category struct { UUID string UserUUID string Name string Slug string CreatedAt time.Time UpdatedAt time.Time }
Categories allow users to group feed subscriptions.
func NewCategory ¶
NewCategory initializes and returns a new feed category.
func (*Category) Normalize ¶
func (c *Category) Normalize()
Normalize sanitizes and normalizes all fields.
func (*Category) ValidateForAddition ¶
func (c *Category) ValidateForAddition(v ValidationRepository) error
ValidateForAddition ensures mandatory fields are properly set when adding a Category.
func (*Category) ValidateForDeletion ¶
func (c *Category) ValidateForDeletion(v ValidationRepository) error
ValidateForDeletion ensures mandatory fields are properly set when deleting a Category.
func (*Category) ValidateForUpdate ¶
func (c *Category) ValidateForUpdate(v ValidationRepository) error
ValidateForUpdate ensures mandatory fields are properly set when editing a Category.
type Entry ¶
type Entry struct { UID string FeedUUID string URL string Title string Summary string TextRankTerms []string PublishedAt time.Time UpdatedAt time.Time // contains filtered or unexported fields }
Entry represents an entry of a syndication feed (Atom or RSS).
func NewEntryFromItem ¶
NewEntryFromItem creates and initializes a new Entry from a gofeed.Item.
func (*Entry) ExtractTextRankTerms ¶ added in v0.3.0
func (e *Entry) ExtractTextRankTerms(ranker *textkit.TextRanker, topN int)
ExtractTextRankTerms uses TextRank to extract the top ranking phrases from the Entry content or description.
Given the TextRank implementation we use, ranked phrases (pairs of terms) seem semantically more relevant than single ranked words.
type EntryMetadata ¶
EntryMetadata tracks user-specific metadata for a given feed entry.
type FakeRepository ¶
type FakeRepository struct { Categories []Category Entries []Entry EntriesMetadata []EntryMetadata Feeds []Feed Subscriptions []Subscription }
func (*FakeRepository) FeedCategoryCreate ¶
func (r *FakeRepository) FeedCategoryCreate(category Category) error
func (*FakeRepository) FeedCategoryDelete ¶
func (r *FakeRepository) FeedCategoryDelete(userUUID string, categoryUUID string) error
func (*FakeRepository) FeedCategoryGetByName ¶
func (r *FakeRepository) FeedCategoryGetByName(userUUID string, name string) (Category, error)
func (*FakeRepository) FeedCategoryGetBySlug ¶
func (r *FakeRepository) FeedCategoryGetBySlug(userUUID string, slug string) (Category, error)
func (*FakeRepository) FeedCategoryGetByUUID ¶
func (r *FakeRepository) FeedCategoryGetByUUID(userUUID string, categoryUUID string) (Category, error)
func (*FakeRepository) FeedCategoryGetMany ¶
func (r *FakeRepository) FeedCategoryGetMany(userUUID string) ([]Category, error)
func (*FakeRepository) FeedCategoryNameAndSlugAreRegistered ¶
func (*FakeRepository) FeedCategoryNameAndSlugAreRegisteredToAnotherCategory ¶
func (*FakeRepository) FeedCategoryUpdate ¶
func (r *FakeRepository) FeedCategoryUpdate(category Category) error
func (*FakeRepository) FeedCreate ¶
func (r *FakeRepository) FeedCreate(feed Feed) error
func (*FakeRepository) FeedEntryCreateMany ¶
func (r *FakeRepository) FeedEntryCreateMany(entries []Entry) (int64, error)
func (*FakeRepository) FeedEntryMarkAllAsRead ¶
func (r *FakeRepository) FeedEntryMarkAllAsRead(userUUID string) error
func (*FakeRepository) FeedEntryMarkAllAsReadByCategory ¶
func (r *FakeRepository) FeedEntryMarkAllAsReadByCategory(userUUID string, categoryUUID string) error
func (*FakeRepository) FeedEntryMarkAllAsReadBySubscription ¶
func (r *FakeRepository) FeedEntryMarkAllAsReadBySubscription(userUUID string, subscriptionUUID string) error
func (*FakeRepository) FeedEntryMetadataCreate ¶
func (r *FakeRepository) FeedEntryMetadataCreate(newEntryMetadata EntryMetadata) error
func (*FakeRepository) FeedEntryMetadataGetByUID ¶
func (r *FakeRepository) FeedEntryMetadataGetByUID(userUUID string, entryUID string) (EntryMetadata, error)
func (*FakeRepository) FeedEntryMetadataUpdate ¶
func (r *FakeRepository) FeedEntryMetadataUpdate(updatedEntryMetadata EntryMetadata) error
func (*FakeRepository) FeedGetBySlug ¶
func (r *FakeRepository) FeedGetBySlug(feedSlug string) (Feed, error)
func (*FakeRepository) FeedGetByURL ¶
func (r *FakeRepository) FeedGetByURL(feedURL string) (Feed, error)
func (*FakeRepository) FeedSubscriptionCreate ¶
func (r *FakeRepository) FeedSubscriptionCreate(subscription Subscription) (Subscription, error)
func (*FakeRepository) FeedSubscriptionDelete ¶
func (r *FakeRepository) FeedSubscriptionDelete(userUUID string, subscriptionUUID string) error
func (*FakeRepository) FeedSubscriptionGetByFeed ¶
func (r *FakeRepository) FeedSubscriptionGetByFeed(userUUID string, feedUUID string) (Subscription, error)
func (*FakeRepository) FeedSubscriptionGetByUUID ¶
func (r *FakeRepository) FeedSubscriptionGetByUUID(userUUID string, subscriptionUUID string) (Subscription, error)
func (*FakeRepository) FeedSubscriptionIsRegistered ¶
func (r *FakeRepository) FeedSubscriptionIsRegistered(userUUID string, feedUUID string) (bool, error)
func (*FakeRepository) FeedSubscriptionUpdate ¶
func (r *FakeRepository) FeedSubscriptionUpdate(subscription Subscription) error
type Feed ¶
type Feed struct { // UUID is a unique identifier for the feed. UUID string FeedURL string Title string Description string Slug string ETag string LastModified time.Time Hash uint64 CreatedAt time.Time UpdatedAt time.Time FetchedAt time.Time }
Feed represents a Web syndication feed (Atom or RSS).
func (*Feed) ValidateForCreation ¶
ValidateForCreation ensures mandatory fields are set when creating a new Feed.
func (*Feed) ValidateSlug ¶
ValidateSlug ensures the slug is normalized and valid.
func (*Feed) ValidateURL ¶
ValidateURL validates the URL is properly formed and uses a supported scheme.
type Repository ¶
type Repository interface { ValidationRepository // FeedCreate creates a new Feed. FeedCreate(feed Feed) error // FeedGetBySlug returns the Feed for a given slug. FeedGetBySlug(feedSlug string) (Feed, error) // FeedGetByURL returns the Feed for a given URL. FeedGetByURL(feedURL string) (Feed, error) // FeedCategoryCreate creates a new Category. FeedCategoryCreate(category Category) error // FeedCategoryDelete deletes an existing Category and related Subscriptions. FeedCategoryDelete(userUUID string, categoryUUID string) error // FeedCategoryGetByName returns the Category for a given user and name. FeedCategoryGetByName(userUUID string, name string) (Category, error) // FeedCategoryGetBySlug returns the Category for a given user and slug. FeedCategoryGetBySlug(userUUID string, slug string) (Category, error) // FeedCategoryGetByUUID returns the Category for a given user and UUID. FeedCategoryGetByUUID(userUUID string, categoryUUID string) (Category, error) // FeedCategoryGetMany returns all categories for a giver user. FeedCategoryGetMany(userUUID string) ([]Category, error) // FeedCategoryUpdate updates an existing Category. FeedCategoryUpdate(category Category) error // FeedEntryCreateMany creates a collection of new Entries. FeedEntryCreateMany(entries []Entry) (int64, error) // FeedEntryMarkAllAsRead marks all entries as "read" for a given User. FeedEntryMarkAllAsRead(userUUID string) error // FeedEntryMarkAllAsReadByCategory marks all entries as "read" for a given User and Category. FeedEntryMarkAllAsReadByCategory(userUUID string, categoryUUID string) error // FeedEntryMarkAllAsReadBySubscription marks all entries as "read" for a given User and Subscription. FeedEntryMarkAllAsReadBySubscription(userUUID string, subscriptionUUID string) error // FeedEntryMetadataCreate creates a new EntryStatus. FeedEntryMetadataCreate(entryMetadata EntryMetadata) error // FeedEntryMetadataGetByUID returns the EntryStatus for a given user and Entry. FeedEntryMetadataGetByUID(userUUID string, entryUID string) (EntryMetadata, error) // FeedEntryMetadataUpdate updates an existing EntryStatus. FeedEntryMetadataUpdate(entryMetadata EntryMetadata) error // FeedSubscriptionCreate creates a new Feed subscription for a given user. FeedSubscriptionCreate(subscription Subscription) (Subscription, error) // FeedSubscriptionDelete deletes a given Feed subscription. FeedSubscriptionDelete(userUUID string, subscriptionUUID string) error // FeedSubscriptionGetByFeed returns the Subscription for a given user and feed. FeedSubscriptionGetByFeed(userUUID string, feedUUID string) (Subscription, error) // FeedSubscriptionGetByUUID returns the Subscription for a given user and UUID. FeedSubscriptionGetByUUID(userUUID string, subscriptionUUID string) (Subscription, error) // FeedSubscriptionUpdate updates an existing Subscription. FeedSubscriptionUpdate(subscription Subscription) error }
Repository provides access to user feeds.
type Service ¶
type Service struct {
// contains filtered or unexported fields
}
Service handles operations for the feed domain.
func NewService ¶
func NewService(r Repository, client *fetching.Client) *Service
NewService initializes and returns a Feed Service.
func (*Service) Categories ¶
Categories returns all categories for a given user.
func (*Service) CategoryBySlug ¶
CategoryBySlug returns the category for a given user and slug.
func (*Service) CategoryByUUID ¶
CategoryByUUID returns the category for a given user and UUID.
func (*Service) CreateCategory ¶
CreateCategory creates a new Category for a given User.
func (*Service) DeleteCategory ¶
DeleteCategory deletes a Category, related Subscriptions and EntryStatuses.
func (*Service) DeleteSubscription ¶
func (*Service) FeedBySlug ¶
FeedBySlug returns the Feed for a given slug.
func (*Service) GetOrCreateCategory ¶
GetOrCreateCategory returns an existing Category or creates it.
func (*Service) GetOrCreateFeedAndEntries ¶
GetOrCreateFeedAndEntries returns an existing feed, or creates it (along with its entries).
func (*Service) GetOrCreateSubscription ¶
func (s *Service) GetOrCreateSubscription(newSubscription Subscription) (Subscription, bool, error)
GetOrCreateSubscription returns an existing subscription or creates it.
func (*Service) MarkAllEntriesAsRead ¶
MarkAllEntriesAsRead marks all entries as "read" for a given User.
func (*Service) MarkAllEntriesAsReadByCategory ¶
MarkAllEntriesAsReadByCategory marks all entries as "read" for a given User and Category.
func (*Service) MarkAllEntriesAsReadBySubscription ¶
func (s *Service) MarkAllEntriesAsReadBySubscription(userUUID string, subscriptionUUID string) error
MarkAllEntriesAsReadBySubscription marks all entries as "read" for a given User and Subscription.
func (*Service) Subscribe ¶
Subscribe creates a new Feed if needed, and creates the corresponding Subscription for a given user.
func (*Service) SubscriptionByFeed ¶
func (s *Service) SubscriptionByFeed(userUUID string, feedUUID string) (Subscription, error)
func (*Service) ToggleEntryRead ¶
ToggleEntryRead toggles the "read" status for a given User and Entry.
func (*Service) UpdateCategory ¶
UpdateCategory updates an existing Category.
func (*Service) UpdateSubscription ¶
func (s *Service) UpdateSubscription(subscription Subscription) error
type Subscription ¶
type Subscription struct { UUID string CategoryUUID string FeedUUID string UserUUID string Alias string CreatedAt time.Time UpdatedAt time.Time }
Subscription represents a given user's subscription to a Feed.
func NewSubscription ¶
func NewSubscription(categoryUUID string, feedUUID string, userUUID string) (Subscription, error)
NewSubscription initializes and returns a new Subscription.
func (*Subscription) Normalize ¶ added in v0.3.0
func (s *Subscription) Normalize()
func (*Subscription) ValidateForCreation ¶
func (s *Subscription) ValidateForCreation(v ValidationRepository) error
type ValidationRepository ¶
type ValidationRepository interface { // FeedCategoryNameAndSlugAreRegistered returns whether a user has already registered // a Category with the same name or slug. FeedCategoryNameAndSlugAreRegistered(userUUID string, name string, slug string) (bool, error) // FeedCategoryNameAndSlugAreRegistered returns whether a user has already registered // another Category with the same name or slug. FeedCategoryNameAndSlugAreRegisteredToAnotherCategory(userUUID string, categoryUUID string, name string, slug string) (bool, error) // FeedSubscriptionIsRegistered returns whether a user has already registered // a Subscription to a given Feed. FeedSubscriptionIsRegistered(userUUID string, feedUUID string) (bool, error) }
ValidationRepository provides methods for Feed and Subscription validation.