diff options
Diffstat (limited to 'internal/processing')
-rw-r--r-- | internal/processing/admin.go | 4 | ||||
-rw-r--r-- | internal/processing/admin/admin.go | 1 | ||||
-rw-r--r-- | internal/processing/admin/createemoji.go | 15 | ||||
-rw-r--r-- | internal/processing/admin/emojicategory.go | 60 | ||||
-rw-r--r-- | internal/processing/admin/getcategories.go | 47 | ||||
-rw-r--r-- | internal/processing/processor.go | 2 |
6 files changed, 128 insertions, 1 deletions
diff --git a/internal/processing/admin.go b/internal/processing/admin.go index 38ed0905f..f10e9d64a 100644 --- a/internal/processing/admin.go +++ b/internal/processing/admin.go @@ -46,6 +46,10 @@ func (p *processor) AdminEmojiDelete(ctx context.Context, authed *oauth.Auth, id return p.adminProcessor.EmojiDelete(ctx, id) } +func (p *processor) AdminEmojiCategoriesGet(ctx context.Context) ([]*apimodel.EmojiCategory, gtserror.WithCode) { + return p.adminProcessor.EmojiCategoriesGet(ctx) +} + func (p *processor) AdminDomainBlockCreate(ctx context.Context, authed *oauth.Auth, form *apimodel.DomainBlockCreateRequest) (*apimodel.DomainBlock, gtserror.WithCode) { return p.adminProcessor.DomainBlockCreate(ctx, authed.Account, form.Domain, form.Obfuscate, form.PublicComment, form.PrivateComment, "") } diff --git a/internal/processing/admin/admin.go b/internal/processing/admin/admin.go index 962a3ac7c..0e8f0c27a 100644 --- a/internal/processing/admin/admin.go +++ b/internal/processing/admin/admin.go @@ -44,6 +44,7 @@ type Processor interface { EmojisGet(ctx context.Context, account *gtsmodel.Account, user *gtsmodel.User, domain string, includeDisabled bool, includeEnabled bool, shortcode string, maxShortcodeDomain string, minShortcodeDomain string, limit int) (*apimodel.PageableResponse, gtserror.WithCode) EmojiGet(ctx context.Context, account *gtsmodel.Account, user *gtsmodel.User, id string) (*apimodel.AdminEmoji, gtserror.WithCode) EmojiDelete(ctx context.Context, id string) (*apimodel.AdminEmoji, gtserror.WithCode) + EmojiCategoriesGet(ctx context.Context) ([]*apimodel.EmojiCategory, gtserror.WithCode) MediaPrune(ctx context.Context, mediaRemoteCacheDays int) gtserror.WithCode } diff --git a/internal/processing/admin/createemoji.go b/internal/processing/admin/createemoji.go index a315e144e..db51d52b6 100644 --- a/internal/processing/admin/createemoji.go +++ b/internal/processing/admin/createemoji.go @@ -28,6 +28,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/gtserror" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/id" + "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/uris" ) @@ -57,7 +58,19 @@ func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, return f, form.Image.Size, err } - processingEmoji, err := p.mediaManager.ProcessEmoji(ctx, data, nil, form.Shortcode, emojiID, emojiURI, nil, false) + var ai *media.AdditionalEmojiInfo + if form.CategoryName != "" { + category, err := p.GetOrCreateEmojiCategory(ctx, form.CategoryName) + if err != nil { + return nil, gtserror.NewErrorInternalError(fmt.Errorf("error putting id in category: %s", err), "error putting id in category") + } + + ai = &media.AdditionalEmojiInfo{ + CategoryID: &category.ID, + } + } + + processingEmoji, err := p.mediaManager.ProcessEmoji(ctx, data, nil, form.Shortcode, emojiID, emojiURI, ai, false) if err != nil { return nil, gtserror.NewErrorInternalError(fmt.Errorf("error processing emoji: %s", err), "error processing emoji") } diff --git a/internal/processing/admin/emojicategory.go b/internal/processing/admin/emojicategory.go new file mode 100644 index 000000000..c40649c62 --- /dev/null +++ b/internal/processing/admin/emojicategory.go @@ -0,0 +1,60 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +package admin + +import ( + "context" + "errors" + "fmt" + + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/id" +) + +func (p *processor) GetOrCreateEmojiCategory(ctx context.Context, name string) (*gtsmodel.EmojiCategory, error) { + category, err := p.db.GetEmojiCategoryByName(ctx, name) + if err == nil { + return category, nil + } + + if err != nil && !errors.Is(err, db.ErrNoEntries) { + err = fmt.Errorf("GetOrCreateEmojiCategory: database error trying get emoji category by name: %s", err) + return nil, err + } + + // we don't have the category yet, just create it with the given name + categoryID, err := id.NewRandomULID() + if err != nil { + err = fmt.Errorf("GetOrCreateEmojiCategory: error generating id for new emoji category: %s", err) + return nil, err + } + + category = >smodel.EmojiCategory{ + ID: categoryID, + Name: name, + } + + if err := p.db.PutEmojiCategory(ctx, category); err != nil { + err = fmt.Errorf("GetOrCreateEmojiCategory: error putting new emoji category in the database: %s", err) + return nil, err + } + + return category, nil +} diff --git a/internal/processing/admin/getcategories.go b/internal/processing/admin/getcategories.go new file mode 100644 index 000000000..b38cc8f0c --- /dev/null +++ b/internal/processing/admin/getcategories.go @@ -0,0 +1,47 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +package admin + +import ( + "context" + "fmt" + + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" +) + +func (p *processor) EmojiCategoriesGet(ctx context.Context) ([]*apimodel.EmojiCategory, gtserror.WithCode) { + categories, err := p.db.GetEmojiCategories(ctx) + if err != nil { + err := fmt.Errorf("EmojiCategoriesGet: db error: %s", err) + return nil, gtserror.NewErrorInternalError(err) + } + + apiCategories := make([]*apimodel.EmojiCategory, 0, len(categories)) + for _, category := range categories { + apiCategory, err := p.tc.EmojiCategoryToAPIEmojiCategory(ctx, category) + if err != nil { + err := fmt.Errorf("EmojiCategoriesGet: error converting emoji category to api emoji category: %s", err) + return nil, gtserror.NewErrorInternalError(err) + } + apiCategories = append(apiCategories, apiCategory) + } + + return apiCategories, nil +} diff --git a/internal/processing/processor.go b/internal/processing/processor.go index b7ab8504c..b7d42ffeb 100644 --- a/internal/processing/processor.go +++ b/internal/processing/processor.go @@ -119,6 +119,8 @@ type Processor interface { // AdminEmojiDelete deletes one *local* emoji with the given key. Remote emojis will not be deleted this way. // Only admin users in good standing should be allowed to access this function -- check this before calling it. AdminEmojiDelete(ctx context.Context, authed *oauth.Auth, id string) (*apimodel.AdminEmoji, gtserror.WithCode) + // AdminEmojiCategoriesGet gets a list of all existing emoji categories. + AdminEmojiCategoriesGet(ctx context.Context) ([]*apimodel.EmojiCategory, gtserror.WithCode) // AdminDomainBlockCreate handles the creation of a new domain block by an admin, using the given form. AdminDomainBlockCreate(ctx context.Context, authed *oauth.Auth, form *apimodel.DomainBlockCreateRequest) (*apimodel.DomainBlock, gtserror.WithCode) // AdminDomainBlocksImport handles the import of multiple domain blocks by an admin, using the given form. |