diff --git a/internal/repo/editing_tweets.go b/internal/repo/editing_tweets.go index 2702c59..850546c 100644 --- a/internal/repo/editing_tweets.go +++ b/internal/repo/editing_tweets.go @@ -11,8 +11,8 @@ import ( type editingTweetsRepo interface { SaveTweetForEdit(ctx context.Context, tweet *common.Tweet) error - GetTweetForEdit(ctx context.Context) ([]common.Tweet, error) - DeleteEditedTweets(ctx context.Context, ids []string) error + GetTweetForShortEdit(ctx context.Context) ([]common.Tweet, error) + DeleteShortEditedTweets(ctx context.Context, ids []string) error } func (d *db) SaveTweetForEdit(ctx context.Context, tweet *common.Tweet) error { @@ -26,18 +26,19 @@ func (d *db) SaveTweetForEdit(ctx context.Context, tweet *common.Tweet) error { return err } - tx.Set(d.keyBuilder.EditingTweet(tweet.ID), data) + tx.Set(d.keyBuilder.EditingTweetShort(tweet.ID), data) + tx.Set(d.keyBuilder.EditingTweetLong(tweet.ID), data) return tx.Commit() } -func (d *db) GetTweetForEdit(ctx context.Context) ([]common.Tweet, error) { +func (d *db) GetTweetForShortEdit(ctx context.Context) ([]common.Tweet, error) { tx, err := d.db.NewTransaction(ctx) if err != nil { return nil, err } - pr, err := fdb.PrefixRange(d.keyBuilder.EditingTweets()) + pr, err := fdb.PrefixRange(d.keyBuilder.EditingTweetsShort()) if err != nil { return nil, err } @@ -70,14 +71,66 @@ func (d *db) GetTweetForEdit(ctx context.Context) ([]common.Tweet, error) { return res, nil } -func (d *db) DeleteEditedTweets(ctx context.Context, ids []string) error { +func (d *db) DeleteShortEditedTweets(ctx context.Context, ids []string) error { tx, err := d.db.NewTransaction(ctx) if err != nil { return err } for _, id := range ids { - tx.Clear(d.keyBuilder.EditingTweet(id)) + tx.Clear(d.keyBuilder.EditingTweetShort(id)) + } + + return tx.Commit() +} + +func (d *db) GetTweetForLongEdit(ctx context.Context) ([]common.Tweet, error) { + tx, err := d.db.NewTransaction(ctx) + if err != nil { + return nil, err + } + + pr, err := fdb.PrefixRange(d.keyBuilder.EditingTweetsLong()) + if err != nil { + return nil, err + } + + kvs, err := tx.GetRange(pr) + if err != nil { + return nil, err + } + + if len(kvs) == 0 { + return nil, ErrTweetsNotFound + } + + res := make([]common.Tweet, 0, len(kvs)) + + for _, kv := range kvs { + var tweet common.Tweet + + if err = jsoniter.Unmarshal(kv.Value, &tweet); err != nil { + return nil, err + } + + res = append(res, tweet) + } + + if err = tx.Commit(); err != nil { + return nil, err + } + + return res, nil +} + +func (d *db) DeleteLongEditedTweets(ctx context.Context, ids []string) error { + tx, err := d.db.NewTransaction(ctx) + if err != nil { + return err + } + + for _, id := range ids { + tx.Clear(d.keyBuilder.EditingTweetLong(id)) } return tx.Commit() diff --git a/internal/repo/keys/key_builder.go b/internal/repo/keys/key_builder.go index 3cfcade..dd5ec59 100644 --- a/internal/repo/keys/key_builder.go +++ b/internal/repo/keys/key_builder.go @@ -21,8 +21,10 @@ type Builder interface { TweetUsernameRatingKey(username string) []byte TweetRatings() []byte SentTweet(link string) []byte - EditingTweet(id string) []byte - EditingTweets() []byte + EditingTweetShort(id string) []byte + EditingTweetLong(id string) []byte + EditingTweetsShort() []byte + EditingTweetsLong() []byte TelegramSessionStorage() []byte TwitterAccount(login string) []byte TwitterAccounts() []byte @@ -46,12 +48,20 @@ func (b builder) TwitterAccount(login string) []byte { return append(twitterAccountsPrefix[:], []byte(login)...) } -func (b builder) EditingTweet(id string) []byte { - return append(editingTweetPrefix[:], []byte(id)...) +func (b builder) EditingTweetShort(id string) []byte { + return append(editingTweetShortPrefix[:], []byte(id)...) } -func (b builder) EditingTweets() []byte { - return editingTweetPrefix[:] +func (b builder) EditingTweetsShort() []byte { + return editingTweetShortPrefix[:] +} + +func (b builder) EditingTweetLong(id string) []byte { + return append(editingTweetLongPrefix[:], []byte(id)...) +} + +func (b builder) EditingTweetsLong() []byte { + return editingTweetLongPrefix[:] } func (b builder) TelegramSessionStorage() []byte { diff --git a/internal/repo/keys/prefix.go b/internal/repo/keys/prefix.go index 3ec9705..3861a3b 100644 --- a/internal/repo/keys/prefix.go +++ b/internal/repo/keys/prefix.go @@ -8,7 +8,8 @@ var ( tweetPrefix Prefix = [2]byte{0x00, 0x01} sentTweetPrefix Prefix = [2]byte{0x00, 0x03} tweetRatingPrefix Prefix = [2]byte{0x00, 0x04} - editingTweetPrefix Prefix = [2]byte{0x00, 0x05} + editingTweetShortPrefix Prefix = [2]byte{0x00, 0x05} + editingTweetLongPrefix Prefix = [2]byte{0x00, 0x09} telegramSessionStoragePrefix Prefix = [2]byte{0x00, 0x06} twitterAccountsPrefix Prefix = [2]byte{0x00, 0x07} twitterAccountsCookiePrefix Prefix = [2]byte{0x00, 0x08}