summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorGravatar privatmamtora <privat.mamtora@gmail.com> 2023-02-25 04:52:45 +0000
committerGravatar GitHub <noreply@github.com> 2023-02-24 20:52:45 -0800
commit8f9ccc6540be9d637b812985936f064bada8fcf3 (patch)
tree7d098af52e1f8946c1cd26ee214307b276b5f273 /storage
parentff8d68c151645de62d48fba62d2f591eab8f7383 (diff)
downloadv2-8f9ccc6540be9d637b812985936f064bada8fcf3.tar.gz
v2-8f9ccc6540be9d637b812985936f064bada8fcf3.tar.zst
v2-8f9ccc6540be9d637b812985936f064bada8fcf3.zip
Parse `<category>` from Feeds (RSS, Atom and JSON)
Diffstat (limited to '')
-rw-r--r--storage/entry.go24
-rw-r--r--storage/entry_query_builder.go13
2 files changed, 34 insertions, 3 deletions
diff --git a/storage/entry.go b/storage/entry.go
index 5f062f7f..f99d9ccc 100644
--- a/storage/entry.go
+++ b/storage/entry.go
@@ -119,7 +119,8 @@ func (s *Storage) createEntry(tx *sql.Tx, entry *model.Entry) error {
feed_id,
reading_time,
changed_at,
- document_vectors
+ document_vectors,
+ tags
)
VALUES
(
@@ -134,7 +135,8 @@ func (s *Storage) createEntry(tx *sql.Tx, entry *model.Entry) error {
$9,
$10,
now(),
- setweight(to_tsvector(left(coalesce($1, ''), 500000)), 'A') || setweight(to_tsvector(left(coalesce($6, ''), 500000)), 'B')
+ setweight(to_tsvector(left(coalesce($1, ''), 500000)), 'A') || setweight(to_tsvector(left(coalesce($6, ''), 500000)), 'B'),
+ $11
)
RETURNING
id, status
@@ -151,6 +153,7 @@ func (s *Storage) createEntry(tx *sql.Tx, entry *model.Entry) error {
entry.UserID,
entry.FeedID,
entry.ReadingTime,
+ pq.Array(removeDuplicates(entry.Tags)),
).Scan(&entry.ID, &entry.Status)
if err != nil {
@@ -183,7 +186,8 @@ func (s *Storage) updateEntry(tx *sql.Tx, entry *model.Entry) error {
content=$4,
author=$5,
reading_time=$6,
- document_vectors = setweight(to_tsvector(left(coalesce($1, ''), 500000)), 'A') || setweight(to_tsvector(left(coalesce($4, ''), 500000)), 'B')
+ document_vectors = setweight(to_tsvector(left(coalesce($1, ''), 500000)), 'A') || setweight(to_tsvector(left(coalesce($4, ''), 500000)), 'B'),
+ tags=$10
WHERE
user_id=$7 AND feed_id=$8 AND hash=$9
RETURNING
@@ -200,6 +204,7 @@ func (s *Storage) updateEntry(tx *sql.Tx, entry *model.Entry) error {
entry.UserID,
entry.FeedID,
entry.Hash,
+ pq.Array(removeDuplicates(entry.Tags)),
).Scan(&entry.ID)
if err != nil {
@@ -535,3 +540,16 @@ func (s *Storage) UnshareEntry(userID int64, entryID int64) (err error) {
}
return
}
+
+// removeDuplicate removes duplicate entries from a slice
+func removeDuplicates[T string | int](sliceList []T) []T {
+ allKeys := make(map[T]bool)
+ list := []T{}
+ for _, item := range sliceList {
+ if _, value := allKeys[item]; !value {
+ allKeys[item] = true
+ list = append(list, item)
+ }
+ }
+ return list
+}
diff --git a/storage/entry_query_builder.go b/storage/entry_query_builder.go
index 437e769c..dae7bc1f 100644
--- a/storage/entry_query_builder.go
+++ b/storage/entry_query_builder.go
@@ -135,6 +135,17 @@ func (e *EntryQueryBuilder) WithStatuses(statuses []string) *EntryQueryBuilder {
return e
}
+// WithTags filter by a list of entry tags.
+func (e *EntryQueryBuilder) WithTags(tags []string) *EntryQueryBuilder {
+ if len(tags) > 0 {
+ for _, cat := range tags {
+ e.conditions = append(e.conditions, fmt.Sprintf("$%d = ANY(e.tags)", len(e.args)+1))
+ e.args = append(e.args, cat)
+ }
+ }
+ return e
+}
+
// WithoutStatus set the entry status that should not be returned.
func (e *EntryQueryBuilder) WithoutStatus(status string) *EntryQueryBuilder {
if status != "" {
@@ -250,6 +261,7 @@ func (e *EntryQueryBuilder) GetEntries() (model.Entries, error) {
e.reading_time,
e.created_at,
e.changed_at,
+ e.tags,
f.title as feed_title,
f.feed_url,
f.site_url,
@@ -312,6 +324,7 @@ func (e *EntryQueryBuilder) GetEntries() (model.Entries, error) {
&entry.ReadingTime,
&entry.CreatedAt,
&entry.ChangedAt,
+ pq.Array(&entry.Tags),
&entry.Feed.Title,
&entry.Feed.FeedURL,
&entry.Feed.SiteURL,