diff --git a/internal/api/apimodule.go b/internal/api/apimodule.go index 096203251..d0bcc612a 100644 --- a/internal/api/apimodule.go +++ b/internal/api/apimodule.go @@ -16,7 +16,6 @@ along with this program. If not, see . */ -// Package apimodule is basically a wrapper for a lot of modules (in subdirectories) that satisfy the ClientAPIModule interface. package api import ( diff --git a/internal/api/client/account/account_test.go b/internal/api/client/account/account_test.go index 203e2ecf9..d0560bcb6 100644 --- a/internal/api/client/account/account_test.go +++ b/internal/api/client/account/account_test.go @@ -6,12 +6,15 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/api/client/account" "github.com/superseriousbusiness/gotosocial/internal/config" "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/federation" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/message" "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/internal/storage" "github.com/superseriousbusiness/gotosocial/internal/typeutils" ) +// nolint type AccountStandardTestSuite struct { // standard suite interfaces suite.Suite @@ -19,6 +22,8 @@ type AccountStandardTestSuite struct { db db.DB log *logrus.Logger tc typeutils.TypeConverter + storage storage.Storage + federator federation.Federator processor message.Processor // standard suite models diff --git a/internal/api/client/account/accountcreate_test.go b/internal/api/client/account/accountcreate_test.go index 6f4c14aa7..da86ee940 100644 --- a/internal/api/client/account/accountcreate_test.go +++ b/internal/api/client/account/accountcreate_test.go @@ -48,7 +48,6 @@ package account_test // } // func (suite *AccountCreateTestSuite) SetupSuite() { -// testrig.StandardDBSetup(suite.db) // suite.testTokens = testrig.NewTestTokens() // suite.testClients = testrig.NewTestClients() // suite.testApplications = testrig.NewTestApplications() @@ -61,13 +60,18 @@ package account_test // func (suite *AccountCreateTestSuite) SetupTest() { // suite.config = testrig.NewTestConfig() // suite.db = testrig.NewTestDB() +// suite.storage = testrig.NewTestStorage() // suite.log = testrig.NewTestLog() -// suite.processor = testrig.NewTestProcessor(suite.db) +// suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil))) +// suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator) // suite.accountModule = account.New(suite.config, suite.processor, suite.log).(*account.Module) +// testrig.StandardDBSetup(suite.db) +// testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media") // } // func (suite *AccountCreateTestSuite) TearDownTest() { // testrig.StandardDBTeardown(suite.db) +// testrig.StandardStorageTeardown(suite.storage) // } // // TestAccountCreatePOSTHandlerSuccessful checks the happy path for an account creation request: all the fields provided are valid, diff --git a/internal/api/client/account/accountupdate.go b/internal/api/client/account/accountupdate.go index 8c43f0225..406769fe7 100644 --- a/internal/api/client/account/accountupdate.go +++ b/internal/api/client/account/accountupdate.go @@ -59,7 +59,7 @@ func (m *Module) AccountUpdateCredentialsPATCHHandler(c *gin.Context) { return } - acctSensitive, err := m.processor.AccountGet(authed, authed.Account.ID) + acctSensitive, err := m.processor.AccountUpdate(authed, form) if err != nil { l.Debugf("could not update account: %s", err) c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) diff --git a/internal/api/client/account/accountupdate_test.go b/internal/api/client/account/accountupdate_test.go index 6ceab6db6..ba7faa794 100644 --- a/internal/api/client/account/accountupdate_test.go +++ b/internal/api/client/account/accountupdate_test.go @@ -1,303 +1,106 @@ -// /* -// GoToSocial -// Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org +/* + GoToSocial + Copyright (C) 2021 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 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. + 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 . -// */ + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ package account_test -// import ( -// "bytes" -// "context" -// "fmt" -// "io" -// "mime/multipart" -// "net/http" -// "net/http/httptest" -// "net/url" -// "os" -// "testing" -// "time" +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" -// "github.com/gin-gonic/gin" -// "github.com/google/uuid" -// "github.com/sirupsen/logrus" -// "github.com/stretchr/testify/assert" -// "github.com/stretchr/testify/mock" -// "github.com/stretchr/testify/suite" -// "github.com/superseriousbusiness/gotosocial/internal/api/client/account" -// "github.com/superseriousbusiness/gotosocial/internal/config" -// "github.com/superseriousbusiness/gotosocial/internal/db" -// "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -// "github.com/superseriousbusiness/gotosocial/internal/media" -// "github.com/superseriousbusiness/gotosocial/internal/oauth" -// "github.com/superseriousbusiness/gotosocial/internal/storage" -// "github.com/superseriousbusiness/gotosocial/internal/typeutils" -// "github.com/superseriousbusiness/oauth2/v4" -// "github.com/superseriousbusiness/oauth2/v4/models" -// oauthmodels "github.com/superseriousbusiness/oauth2/v4/models" -// ) + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/api/client/account" + "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/testrig" +) -// type AccountUpdateTestSuite struct { -// suite.Suite -// config *config.Config -// log *logrus.Logger -// testAccountLocal *gtsmodel.Account -// testApplication *gtsmodel.Application -// testToken oauth2.TokenInfo -// mockOauthServer *oauth.MockServer -// mockStorage *storage.MockStorage -// mediaHandler media.Handler -// mastoConverter typeutils.TypeConverter -// db db.DB -// accountModule *account.Module -// newUserFormHappyPath url.Values -// } +type AccountUpdateTestSuite struct { + AccountStandardTestSuite +} -// /* -// TEST INFRASTRUCTURE -// */ +func (suite *AccountUpdateTestSuite) SetupSuite() { + suite.testTokens = testrig.NewTestTokens() + suite.testClients = testrig.NewTestClients() + suite.testApplications = testrig.NewTestApplications() + suite.testUsers = testrig.NewTestUsers() + suite.testAccounts = testrig.NewTestAccounts() + suite.testAttachments = testrig.NewTestAttachments() + suite.testStatuses = testrig.NewTestStatuses() +} -// // SetupSuite sets some variables on the suite that we can use as consts (more or less) throughout -// func (suite *AccountUpdateTestSuite) SetupSuite() { -// // some of our subsequent entities need a log so create this here -// log := logrus.New() -// log.SetLevel(logrus.TraceLevel) -// suite.log = log +func (suite *AccountUpdateTestSuite) SetupTest() { + suite.config = testrig.NewTestConfig() + suite.db = testrig.NewTestDB() + suite.storage = testrig.NewTestStorage() + suite.log = testrig.NewTestLog() + suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil))) + suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator) + suite.accountModule = account.New(suite.config, suite.processor, suite.log).(*account.Module) + testrig.StandardDBSetup(suite.db) + testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media") +} -// suite.testAccountLocal = >smodel.Account{ -// ID: uuid.NewString(), -// Username: "test_user", -// } +func (suite *AccountUpdateTestSuite) TearDownTest() { + testrig.StandardDBTeardown(suite.db) + testrig.StandardStorageTeardown(suite.storage) +} -// // can use this test application throughout -// suite.testApplication = >smodel.Application{ -// ID: "weeweeeeeeeeeeeeee", -// Name: "a test application", -// Website: "https://some-application-website.com", -// RedirectURI: "http://localhost:8080", -// ClientID: "a-known-client-id", -// ClientSecret: "some-secret", -// Scopes: "read", -// VapidKey: "aaaaaa-aaaaaaaa-aaaaaaaaaaa", -// } +func (suite *AccountUpdateTestSuite) TestAccountUpdateCredentialsPATCHHandler() { -// // can use this test token throughout -// suite.testToken = &oauthmodels.Token{ -// ClientID: "a-known-client-id", -// RedirectURI: "http://localhost:8080", -// Scope: "read", -// Code: "123456789", -// CodeCreateAt: time.Now(), -// CodeExpiresIn: time.Duration(10 * time.Minute), -// } + requestBody, w, err := testrig.CreateMultipartFormData("header", "../../../../testrig/media/test-jpeg.jpg", map[string]string{ + "display_name": "updated zork display name!!!", + "locked": "true", + }) + if err != nil { + panic(err) + } -// // Direct config to local postgres instance -// c := config.Empty() -// c.Protocol = "http" -// c.Host = "localhost" -// c.DBConfig = &config.DBConfig{ -// Type: "postgres", -// Address: "localhost", -// Port: 5432, -// User: "postgres", -// Password: "postgres", -// Database: "postgres", -// ApplicationName: "gotosocial", -// } -// c.MediaConfig = &config.MediaConfig{ -// MaxImageSize: 2 << 20, -// } -// c.StorageConfig = &config.StorageConfig{ -// Backend: "local", -// BasePath: "/tmp", -// ServeProtocol: "http", -// ServeHost: "localhost", -// ServeBasePath: "/fileserver/media", -// } -// suite.config = c + // setup + recorder := httptest.NewRecorder() + ctx, _ := gin.CreateTestContext(recorder) + ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["local_account_1"]) + ctx.Set(oauth.SessionAuthorizedToken, oauth.TokenToOauthToken(suite.testTokens["local_account_1"])) + ctx.Request = httptest.NewRequest(http.MethodPatch, fmt.Sprintf("http://localhost:8080/%s", account.UpdateCredentialsPath), bytes.NewReader(requestBody.Bytes())) // the endpoint we're hitting + ctx.Request.Header.Set("Content-Type", w.FormDataContentType()) + suite.accountModule.AccountUpdateCredentialsPATCHHandler(ctx) -// // use an actual database for this, because it's just easier than mocking one out -// database, err := db.NewPostgresService(context.Background(), c, log) -// if err != nil { -// suite.FailNow(err.Error()) -// } -// suite.db = database + // check response -// // we need to mock the oauth server because account creation needs it to create a new token -// suite.mockOauthServer = &oauth.MockServer{} -// suite.mockOauthServer.On("GenerateUserAccessToken", suite.testToken, suite.testApplication.ClientSecret, mock.AnythingOfType("string")).Run(func(args mock.Arguments) { -// l := suite.log.WithField("func", "GenerateUserAccessToken") -// token := args.Get(0).(oauth2.TokenInfo) -// l.Infof("received token %+v", token) -// clientSecret := args.Get(1).(string) -// l.Infof("received clientSecret %+v", clientSecret) -// userID := args.Get(2).(string) -// l.Infof("received userID %+v", userID) -// }).Return(&models.Token{ -// Code: "we're authorized now!", -// }, nil) + // 1. we should have OK because our request was valid + suite.EqualValues(http.StatusOK, recorder.Code) -// suite.mockStorage = &storage.MockStorage{} -// // We don't need storage to do anything for these tests, so just simulate a success and do nothing -- we won't need to return anything from storage -// suite.mockStorage.On("StoreFileAt", mock.AnythingOfType("string"), mock.AnythingOfType("[]uint8")).Return(nil) + // 2. we should have no error message in the result body + result := recorder.Result() + defer result.Body.Close() -// // set a media handler because some handlers (eg update credentials) need to upload media (new header/avatar) -// suite.mediaHandler = media.New(suite.config, suite.db, suite.mockStorage, log) + b, err := ioutil.ReadAll(result.Body) + assert.NoError(suite.T(), err) -// suite.mastoConverter = typeutils.NewConverter(suite.config, suite.db) + fmt.Println(string(b)) -// // and finally here's the thing we're actually testing! -// suite.accountModule = account.New(suite.config, suite.db, suite.mockOauthServer, suite.mediaHandler, suite.mastoConverter, suite.log).(*account.Module) -// } + // TODO write more assertions allee +} -// func (suite *AccountUpdateTestSuite) TearDownSuite() { -// if err := suite.db.Stop(context.Background()); err != nil { -// logrus.Panicf("error closing db connection: %s", err) -// } -// } - -// // SetupTest creates a db connection and creates necessary tables before each test -// func (suite *AccountUpdateTestSuite) SetupTest() { -// // create all the tables we might need in thie suite -// models := []interface{}{ -// >smodel.User{}, -// >smodel.Account{}, -// >smodel.Follow{}, -// >smodel.FollowRequest{}, -// >smodel.Status{}, -// >smodel.Application{}, -// >smodel.EmailDomainBlock{}, -// >smodel.MediaAttachment{}, -// } -// for _, m := range models { -// if err := suite.db.CreateTable(m); err != nil { -// logrus.Panicf("db connection error: %s", err) -// } -// } - -// // form to submit for happy path account create requests -- this will be changed inside tests so it's better to set it before each test -// suite.newUserFormHappyPath = url.Values{ -// "reason": []string{"a very good reason that's at least 40 characters i swear"}, -// "username": []string{"test_user"}, -// "email": []string{"user@example.org"}, -// "password": []string{"very-strong-password"}, -// "agreement": []string{"true"}, -// "locale": []string{"en"}, -// } - -// // same with accounts config -// suite.config.AccountsConfig = &config.AccountsConfig{ -// OpenRegistration: true, -// RequireApproval: true, -// ReasonRequired: true, -// } -// } - -// // TearDownTest drops tables to make sure there's no data in the db -// func (suite *AccountUpdateTestSuite) TearDownTest() { - -// // remove all the tables we might have used so it's clear for the next test -// models := []interface{}{ -// >smodel.User{}, -// >smodel.Account{}, -// >smodel.Follow{}, -// >smodel.FollowRequest{}, -// >smodel.Status{}, -// >smodel.Application{}, -// >smodel.EmailDomainBlock{}, -// >smodel.MediaAttachment{}, -// } -// for _, m := range models { -// if err := suite.db.DropTable(m); err != nil { -// logrus.Panicf("error dropping table: %s", err) -// } -// } -// } - -// /* -// ACTUAL TESTS -// */ - -// /* -// TESTING: AccountUpdateCredentialsPATCHHandler -// */ - -// func (suite *AccountUpdateTestSuite) TestAccountUpdateCredentialsPATCHHandler() { - -// // put test local account in db -// err := suite.db.Put(suite.testAccountLocal) -// assert.NoError(suite.T(), err) - -// // attach avatar to request form -// avatarFile, err := os.Open("../../media/test/test-jpeg.jpg") -// assert.NoError(suite.T(), err) -// body := &bytes.Buffer{} -// writer := multipart.NewWriter(body) - -// avatarPart, err := writer.CreateFormFile("avatar", "test-jpeg.jpg") -// assert.NoError(suite.T(), err) - -// _, err = io.Copy(avatarPart, avatarFile) -// assert.NoError(suite.T(), err) - -// err = avatarFile.Close() -// assert.NoError(suite.T(), err) - -// // set display name to a new value -// displayNamePart, err := writer.CreateFormField("display_name") -// assert.NoError(suite.T(), err) - -// _, err = io.Copy(displayNamePart, bytes.NewBufferString("test_user_wohoah")) -// assert.NoError(suite.T(), err) - -// // set locked to true -// lockedPart, err := writer.CreateFormField("locked") -// assert.NoError(suite.T(), err) - -// _, err = io.Copy(lockedPart, bytes.NewBufferString("true")) -// assert.NoError(suite.T(), err) - -// // close the request writer, the form is now prepared -// err = writer.Close() -// assert.NoError(suite.T(), err) - -// // setup -// recorder := httptest.NewRecorder() -// ctx, _ := gin.CreateTestContext(recorder) -// ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccountLocal) -// ctx.Set(oauth.SessionAuthorizedToken, suite.testToken) -// ctx.Request = httptest.NewRequest(http.MethodPatch, fmt.Sprintf("http://localhost:8080/%s", account.UpdateCredentialsPath), body) // the endpoint we're hitting -// ctx.Request.Header.Set("Content-Type", writer.FormDataContentType()) -// suite.accountModule.AccountUpdateCredentialsPATCHHandler(ctx) - -// // check response - -// // 1. we should have OK because our request was valid -// suite.EqualValues(http.StatusOK, recorder.Code) - -// // 2. we should have an error message in the result body -// result := recorder.Result() -// defer result.Body.Close() -// // TODO: implement proper checks here -// // -// // b, err := ioutil.ReadAll(result.Body) -// // assert.NoError(suite.T(), err) -// // assert.Equal(suite.T(), `{"error":"not authorized"}`, string(b)) -// } - -// func TestAccountUpdateTestSuite(t *testing.T) { -// suite.Run(t, new(AccountUpdateTestSuite)) -// } +func TestAccountUpdateTestSuite(t *testing.T) { + suite.Run(t, new(AccountUpdateTestSuite)) +} diff --git a/internal/api/client/status/status_test.go b/internal/api/client/status/status_test.go index a18787aef..0f77820a1 100644 --- a/internal/api/client/status/status_test.go +++ b/internal/api/client/status/status_test.go @@ -32,6 +32,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/typeutils" ) +// nolint type StatusStandardTestSuite struct { // standard suite interfaces suite.Suite diff --git a/internal/api/s2s/user/user_test.go b/internal/api/s2s/user/user_test.go index d3dae1920..84e35ab68 100644 --- a/internal/api/s2s/user/user_test.go +++ b/internal/api/s2s/user/user_test.go @@ -14,6 +14,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/typeutils" ) +// nolint type UserStandardTestSuite struct { // standard suite interfaces suite.Suite diff --git a/internal/media/media.go b/internal/media/media.go index 638b120a2..c6403fc81 100644 --- a/internal/media/media.go +++ b/internal/media/media.go @@ -32,28 +32,28 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/storage" ) -// MediaSize describes the *size* of a piece of media -type MediaSize string +// Size describes the *size* of a piece of media +type Size string -// MediaType describes the *type* of a piece of media -type MediaType string +// Type describes the *type* of a piece of media +type Type string const ( // Small is the key for small/thumbnail versions of media - Small MediaSize = "small" + Small Size = "small" // Original is the key for original/fullsize versions of media and emoji - Original MediaSize = "original" + Original Size = "original" // Static is the key for static (non-animated) versions of emoji - Static MediaSize = "static" + Static Size = "static" // Attachment is the key for media attachments - Attachment MediaType = "attachment" + Attachment Type = "attachment" // Header is the key for profile header requests - Header MediaType = "header" + Header Type = "header" // Avatar is the key for profile avatar requests - Avatar MediaType = "avatar" + Avatar Type = "avatar" // Emoji is the key for emoji type requests - Emoji MediaType = "emoji" + Emoji Type = "emoji" // EmojiMaxBytes is the maximum permitted bytes of an emoji upload (50kb) EmojiMaxBytes = 51200 @@ -64,7 +64,7 @@ type Handler interface { // ProcessHeaderOrAvatar takes a new header image for an account, checks it out, removes exif data from it, // puts it in whatever storage backend we're using, sets the relevant fields in the database for the new image, // and then returns information to the caller about the new header. - ProcessHeaderOrAvatar(img []byte, accountID string, mediaType MediaType) (*gtsmodel.MediaAttachment, error) + ProcessHeaderOrAvatar(img []byte, accountID string, mediaType Type) (*gtsmodel.MediaAttachment, error) // ProcessLocalAttachment takes a new attachment and the requesting account, checks it out, removes exif data from it, // puts it in whatever storage backend we're using, sets the relevant fields in the database for the new media, @@ -101,7 +101,7 @@ func New(config *config.Config, database db.DB, storage storage.Storage, log *lo // ProcessHeaderOrAvatar takes a new header image for an account, checks it out, removes exif data from it, // puts it in whatever storage backend we're using, sets the relevant fields in the database for the new image, // and then returns information to the caller about the new header. -func (mh *mediaHandler) ProcessHeaderOrAvatar(attachment []byte, accountID string, mediaType MediaType) (*gtsmodel.MediaAttachment, error) { +func (mh *mediaHandler) ProcessHeaderOrAvatar(attachment []byte, accountID string, mediaType Type) (*gtsmodel.MediaAttachment, error) { l := mh.log.WithField("func", "SetHeaderForAccountID") if mediaType != Header && mediaType != Avatar { @@ -394,7 +394,7 @@ func (mh *mediaHandler) processImageAttachment(data []byte, accountID string, co } -func (mh *mediaHandler) processHeaderOrAvi(imageBytes []byte, contentType string, mediaType MediaType, accountID string) (*gtsmodel.MediaAttachment, error) { +func (mh *mediaHandler) processHeaderOrAvi(imageBytes []byte, contentType string, mediaType Type, accountID string) (*gtsmodel.MediaAttachment, error) { var isHeader bool var isAvatar bool diff --git a/internal/media/util.go b/internal/media/util.go index 6e5756202..f4f2819af 100644 --- a/internal/media/util.go +++ b/internal/media/util.go @@ -45,7 +45,7 @@ const ( // MIMEVideo is the mime type for video MIMEVideo = "video" - // MIMEmp4 is the mp4 video mime type + // MIMEMp4 is the mp4 video mime type MIMEMp4 = "video/mp4" // MIMEMpeg is the mpeg video mime type MIMEMpeg = "video/mpeg" @@ -307,8 +307,8 @@ type imageAndMeta struct { } // ParseMediaType converts s to a recognized MediaType, or returns an error if unrecognized -func ParseMediaType(s string) (MediaType, error) { - switch MediaType(s) { +func ParseMediaType(s string) (Type, error) { + switch Type(s) { case Attachment: return Attachment, nil case Header: @@ -322,8 +322,8 @@ func ParseMediaType(s string) (MediaType, error) { } // ParseMediaSize converts s to a recognized MediaSize, or returns an error if unrecognized -func ParseMediaSize(s string) (MediaSize, error) { - switch MediaSize(s) { +func ParseMediaSize(s string) (Size, error) { + switch Size(s) { case Small: return Small, nil case Original: diff --git a/internal/message/accountprocess.go b/internal/message/accountprocess.go index e62622753..9433140d7 100644 --- a/internal/message/accountprocess.go +++ b/internal/message/accountprocess.go @@ -154,10 +154,6 @@ func (p *processor) AccountUpdate(authed *oauth.Auth, form *apimodel.UpdateCrede } } - // if form.FieldsAttributes != nil { - // // TODO: parse fields attributes nicely and update - // } - // fetch the account with all updated values set updatedAccount := >smodel.Account{} if err := p.db.GetByID(authed.Account.ID, updatedAccount); err != nil { diff --git a/internal/message/processor.go b/internal/message/processor.go index e748cd15c..d95a829e0 100644 --- a/internal/message/processor.go +++ b/internal/message/processor.go @@ -65,6 +65,8 @@ type Processor interface { AccountCreate(authed *oauth.Auth, form *apimodel.AccountCreateRequest) (*apimodel.Token, error) // AccountGet processes the given request for account information. AccountGet(authed *oauth.Auth, targetAccountID string) (*apimodel.Account, error) + // AccountUpdate processes the update of an account with the given form + AccountUpdate(authed *oauth.Auth, form *apimodel.UpdateCredentialsRequest) (*apimodel.Account, error) // AppCreate processes the creation of a new API application AppCreate(authed *oauth.Auth, form *apimodel.ApplicationCreateRequest) (*apimodel.Application, error) diff --git a/internal/typeutils/astointernal.go b/internal/typeutils/astointernal.go index ff22d766b..5e3b6b052 100644 --- a/internal/typeutils/astointernal.go +++ b/internal/typeutils/astointernal.go @@ -35,14 +35,14 @@ func (c *converter) ASRepresentationToAccount(accountable Accountable) (*gtsmode uri := uriProp.GetIRI() acct := >smodel.Account{} - if err := c.db.GetWhere("uri", uri.String(), acct); err == nil { + err := c.db.GetWhere("uri", uri.String(), acct) + if err == nil { // we already know this account so we can skip generating it return acct, nil - } else { - if _, ok := err.(db.ErrNoEntries); !ok { - // we don't know the account and there's been a real error - return nil, fmt.Errorf("error getting account with uri %s from the database: %s", uri.String(), err) - } + } + if _, ok := err.(db.ErrNoEntries); !ok { + // we don't know the account and there's been a real error + return nil, fmt.Errorf("error getting account with uri %s from the database: %s", uri.String(), err) } // we don't know the account so we need to generate it from the person -- at least we already have the URI! diff --git a/internal/typeutils/converter_test.go b/internal/typeutils/converter_test.go index 4ca13afcd..b2272f50c 100644 --- a/internal/typeutils/converter_test.go +++ b/internal/typeutils/converter_test.go @@ -27,6 +27,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/typeutils" ) +// nolint type ConverterStandardTestSuite struct { suite.Suite config *config.Config diff --git a/internal/typeutils/internaltofrontend.go b/internal/typeutils/internaltofrontend.go index 17ae099d9..9456ef531 100644 --- a/internal/typeutils/internaltofrontend.go +++ b/internal/typeutils/internaltofrontend.go @@ -120,7 +120,7 @@ func (c *converter) AccountToMastoPublic(a *gtsmodel.Account) (*model.Account, e aviURLStatic := avi.Thumbnail.URL header := >smodel.MediaAttachment{} - if err := c.db.GetHeaderForAccountID(avi, a.ID); err != nil { + if err := c.db.GetHeaderForAccountID(header, a.ID); err != nil { if _, ok := err.(db.ErrNoEntries); !ok { return nil, fmt.Errorf("error getting header: %s", err) }