[bugfix] fix emoji recaching operations (#3167)

* add test for emoji update image

* update emoji recache to set the instance account id

* don't refresh emoji if only not cached. in that case literally just recache

* code comment

* rename + move a few things

* add some more code comments, and rename some functions to make logic a bit clearer

* remove unnecessary nil check (the value can be nil)

* comment wording

* remove test data output

* handle the case of caching an emoji which has been refreshed then uncached

* allow overwriting on testrig storage as we do now on regular storage

* fix emoji category ID not getting updated

---------

Co-authored-by: tobi <tobi.smethurst@protonmail.com>
This commit is contained in:
kim
2024-08-03 17:05:38 +00:00
committed by GitHub
parent fa59c3713c
commit b85a9983d0
10 changed files with 305 additions and 91 deletions

View File

@@ -291,13 +291,8 @@ func (p *Processor) emojiUpdateCopy(
}
// Ensure target emoji is locally cached.
target, err := p.federator.RefreshEmoji(
ctx,
target, err := p.federator.RecacheEmoji(ctx,
target,
// no changes we want to make.
media.AdditionalEmojiInfo{},
false,
)
if err != nil {
err := gtserror.Newf("error recaching emoji %s: %w", target.ImageRemoteURL, err)
@@ -325,8 +320,8 @@ func (p *Processor) emojiUpdateCopy(
// Attempt to create the new local emoji.
emoji, errWithCode := p.createEmoji(ctx,
util.PtrOrValue(shortcode, ""),
util.PtrOrValue(categoryName, ""),
util.PtrOrZero(shortcode),
util.PtrOrZero(categoryName),
data,
)
if errWithCode != nil {
@@ -401,35 +396,39 @@ func (p *Processor) emojiUpdateModify(
return nil, gtserror.NewErrorBadRequest(errors.New(text), text)
}
if categoryName != nil {
if *categoryName != "" {
// A category was provided, get / create relevant emoji category.
category, errWithCode := p.mustGetEmojiCategory(ctx, *categoryName)
if errWithCode != nil {
return nil, errWithCode
}
// Check if we need to
// set a new category ID.
var newCategoryID *string
switch {
case categoryName == nil:
// No changes.
if category.ID == emoji.CategoryID {
// There was no change,
// indicate this by unsetting
// the category name pointer.
categoryName = nil
} else {
// Update emoji category.
emoji.CategoryID = category.ID
emoji.Category = category
}
} else {
// Emoji category was unset.
emoji.CategoryID = ""
emoji.Category = nil
case *categoryName == "":
// Emoji category was unset.
newCategoryID = util.Ptr("")
emoji.CategoryID = ""
emoji.Category = nil
case *categoryName != "":
// A category was provided, get or create relevant emoji category.
category, errWithCode := p.mustGetEmojiCategory(ctx, *categoryName)
if errWithCode != nil {
return nil, errWithCode
}
// Update emoji category if
// it's different from before.
if category.ID != emoji.CategoryID {
newCategoryID = &category.ID
emoji.CategoryID = category.ID
emoji.Category = category
}
}
// Check whether any image changes were requested.
imageUpdated := (image != nil && image.Size > 0)
if !imageUpdated && categoryName != nil {
if !imageUpdated && newCategoryID != nil {
// Only updating category; only a single database update required.
if err := p.state.DB.UpdateEmoji(ctx, emoji, "category_id"); err != nil {
err := gtserror.Newf("error updating emoji in db: %w", err)
@@ -463,8 +462,17 @@ func (p *Processor) emojiUpdateModify(
return rc, nil
}
// Prepare emoji model for recache from new data.
processing := p.media.RecacheEmoji(emoji, data)
// Include category ID
// update if necessary.
ai := media.AdditionalEmojiInfo{}
ai.CategoryID = newCategoryID
// Prepare emoji model for update+recache from new data.
processing, err := p.media.UpdateEmoji(ctx, emoji, data, ai)
if err != nil {
err := gtserror.Newf("error preparing recache: %w", err)
return nil, gtserror.NewErrorInternalError(err)
}
// Load to trigger update + write.
emoji, err = processing.Load(ctx)