diff --git a/api4/command.go b/api4/command.go index 1e0a1a9801..fd8aff51c3 100644 --- a/api4/command.go +++ b/api4/command.go @@ -261,7 +261,9 @@ func listCommands(c *Context, w http.ResponseWriter, r *http.Request) { } } - w.Write([]byte(model.CommandListToJson(commands))) + if err := json.NewEncoder(w).Encode(commands); err != nil { + mlog.Warn("Error writing response", mlog.Err(err)) + } } func getCommand(c *Context, w http.ResponseWriter, r *http.Request) { @@ -374,7 +376,9 @@ func listAutocompleteCommands(c *Context, w http.ResponseWriter, r *http.Request return } - w.Write([]byte(model.CommandListToJson(commands))) + if err := json.NewEncoder(w).Encode(commands); err != nil { + mlog.Warn("Error while writing response", mlog.Err(err)) + } } func listCommandAutocompleteSuggestions(c *Context, w http.ResponseWriter, r *http.Request) { diff --git a/api4/emoji.go b/api4/emoji.go index fc3734f09c..b8a7b4a396 100644 --- a/api4/emoji.go +++ b/api4/emoji.go @@ -121,7 +121,9 @@ func getEmojiList(c *Context, w http.ResponseWriter, r *http.Request) { return } - w.Write([]byte(model.EmojiListToJson(listEmoji))) + if err := json.NewEncoder(w).Encode(listEmoji); err != nil { + mlog.Warn("Error while writing response", mlog.Err(err)) + } } func deleteEmoji(c *Context, w http.ResponseWriter, r *http.Request) { @@ -270,7 +272,9 @@ func searchEmojis(c *Context, w http.ResponseWriter, r *http.Request) { return } - w.Write([]byte(model.EmojiListToJson(emojis))) + if err := json.NewEncoder(w).Encode(emojis); err != nil { + mlog.Warn("Error while writing response", mlog.Err(err)) + } } func autocompleteEmojis(c *Context, w http.ResponseWriter, r *http.Request) { @@ -287,5 +291,7 @@ func autocompleteEmojis(c *Context, w http.ResponseWriter, r *http.Request) { return } - w.Write([]byte(model.EmojiListToJson(emojis))) + if err := json.NewEncoder(w).Encode(emojis); err != nil { + mlog.Warn("Error while writing response", mlog.Err(err)) + } } diff --git a/app/cluster_discovery.go b/app/cluster_discovery.go index 45a1da609f..0a003e06a0 100644 --- a/app/cluster_discovery.go +++ b/app/cluster_discovery.go @@ -42,34 +42,34 @@ func (cds *ClusterDiscoveryService) Start() { exists, err := cds.srv.Store.ClusterDiscovery().Exists(&cds.ClusterDiscovery) if err != nil { - mlog.Warn("ClusterDiscoveryService failed to check if row exists", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson()), mlog.Err(err)) + mlog.Warn("ClusterDiscoveryService failed to check if row exists", mlog.String("ClusterDiscoveryID", cds.ClusterDiscovery.Id), mlog.Err(err)) } else if exists { if _, err := cds.srv.Store.ClusterDiscovery().Delete(&cds.ClusterDiscovery); err != nil { - mlog.Warn("ClusterDiscoveryService failed to start clean", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson()), mlog.Err(err)) + mlog.Warn("ClusterDiscoveryService failed to start clean", mlog.String("ClusterDiscoveryID", cds.ClusterDiscovery.Id), mlog.Err(err)) } } if err := cds.srv.Store.ClusterDiscovery().Save(&cds.ClusterDiscovery); err != nil { - mlog.Error("ClusterDiscoveryService failed to save", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson()), mlog.Err(err)) + mlog.Error("ClusterDiscoveryService failed to save", mlog.String("ClusterDiscoveryID", cds.ClusterDiscovery.Id), mlog.Err(err)) return } go func() { - mlog.Debug("ClusterDiscoveryService ping writer started", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson())) + mlog.Debug("ClusterDiscoveryService ping writer started", mlog.String("ClusterDiscoveryID", cds.ClusterDiscovery.Id)) ticker := time.NewTicker(DiscoveryServiceWritePing) defer func() { ticker.Stop() if _, err := cds.srv.Store.ClusterDiscovery().Delete(&cds.ClusterDiscovery); err != nil { - mlog.Warn("ClusterDiscoveryService failed to cleanup", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson()), mlog.Err(err)) + mlog.Warn("ClusterDiscoveryService failed to cleanup", mlog.String("ClusterDiscoveryID", cds.ClusterDiscovery.Id), mlog.Err(err)) } - mlog.Debug("ClusterDiscoveryService ping writer stopped", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson())) + mlog.Debug("ClusterDiscoveryService ping writer stopped", mlog.String("ClusterDiscoveryID", cds.ClusterDiscovery.Id)) }() for { select { case <-ticker.C: if err := cds.srv.Store.ClusterDiscovery().SetLastPingAt(&cds.ClusterDiscovery); err != nil { - mlog.Error("ClusterDiscoveryService failed to write ping", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson()), mlog.Err(err)) + mlog.Error("ClusterDiscoveryService failed to write ping", mlog.String("ClusterDiscoveryID", cds.ClusterDiscovery.Id), mlog.Err(err)) } case <-cds.stop: return diff --git a/cmd/mattermost/commands/cmdtestlib.go b/cmd/mattermost/commands/cmdtestlib.go index 0945913f0b..f79fdf9340 100644 --- a/cmd/mattermost/commands/cmdtestlib.go +++ b/cmd/mattermost/commands/cmdtestlib.go @@ -5,6 +5,7 @@ package commands import ( "bytes" + "encoding/json" "flag" "fmt" "io" @@ -122,7 +123,11 @@ func (h *testHelper) SetConfig(config *model.Config) { h.config = config - if err := ioutil.WriteFile(h.configFilePath, []byte(config.ToJson()), 0600); err != nil { + buf, err := json.Marshal(config) + if err != nil { + panic("failed to marshal config: " + err.Error()) + } + if err := ioutil.WriteFile(h.configFilePath, buf, 0600); err != nil { panic("failed to write file " + h.configFilePath + ": " + err.Error()) } } diff --git a/model/access.go b/model/access.go index 6669376216..cbc84d9ee7 100644 --- a/model/access.go +++ b/model/access.go @@ -4,7 +4,6 @@ package model import ( - "encoding/json" "net/http" ) @@ -72,13 +71,3 @@ func (ad *AccessData) IsExpired() bool { return false } - -func (ad *AccessData) ToJson() string { - b, _ := json.Marshal(ad) - return string(b) -} - -func (ar *AccessResponse) ToJson() string { - b, _ := json.Marshal(ar) - return string(b) -} diff --git a/model/analytics_row.go b/model/analytics_row.go index 4dff8c50bc..72ba3a0938 100644 --- a/model/analytics_row.go +++ b/model/analytics_row.go @@ -3,26 +3,9 @@ package model -import ( - "encoding/json" -) - type AnalyticsRow struct { Name string `json:"name"` Value float64 `json:"value"` } type AnalyticsRows []*AnalyticsRow - -func (ar *AnalyticsRow) ToJson() string { - b, _ := json.Marshal(ar) - return string(b) -} - -func (ar AnalyticsRows) ToJson() string { - b, err := json.Marshal(ar) - if err != nil { - return "[]" - } - return string(b) -} diff --git a/model/audit.go b/model/audit.go index fcd401af09..3e8345c7b3 100644 --- a/model/audit.go +++ b/model/audit.go @@ -3,10 +3,6 @@ package model -import ( - "encoding/json" -) - type Audit struct { Id string `json:"id"` CreateAt int64 `json:"create_at"` @@ -16,8 +12,3 @@ type Audit struct { IpAddress string `json:"ip_address"` SessionId string `json:"session_id"` } - -func (o *Audit) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} diff --git a/model/audits.go b/model/audits.go index ba20dd25b3..1c547c8993 100644 --- a/model/audits.go +++ b/model/audits.go @@ -3,10 +3,6 @@ package model -import ( - "encoding/json" -) - type Audits []Audit func (o Audits) Etag() string { @@ -16,11 +12,3 @@ func (o Audits) Etag() string { } return "" } - -func (o Audits) ToJson() string { - b, err := json.Marshal(o) - if err != nil { - return "[]" - } - return string(b) -} diff --git a/model/authorize.go b/model/authorize.go index d7c489ec33..a6ab4329d9 100644 --- a/model/authorize.go +++ b/model/authorize.go @@ -4,7 +4,6 @@ package model import ( - "encoding/json" "net/http" ) @@ -114,16 +113,6 @@ func (ad *AuthData) PreSave() { } } -func (ad *AuthData) ToJson() string { - b, _ := json.Marshal(ad) - return string(b) -} - -func (ar *AuthorizeRequest) ToJson() string { - b, _ := json.Marshal(ar) - return string(b) -} - func (ad *AuthData) IsExpired() bool { return GetMillis() > ad.CreateAt+int64(ad.ExpiresIn*1000) } diff --git a/model/channel.go b/model/channel.go index dfbd7e844f..badae30ef9 100644 --- a/model/channel.go +++ b/model/channel.go @@ -170,16 +170,6 @@ func (o *Channel) ToJson() string { return string(b) } -func (o *ChannelPatch) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} - -func (o *ChannelsWithCount) ToJson() []byte { - b, _ := json.Marshal(o) - return b -} - func (o *Channel) Etag() string { return Etag(o.Id, o.UpdateAt) } diff --git a/model/channel_count.go b/model/channel_count.go index d56986dad5..25329a15c9 100644 --- a/model/channel_count.go +++ b/model/channel_count.go @@ -5,7 +5,6 @@ package model import ( "crypto/md5" - "encoding/json" "fmt" "sort" "strconv" @@ -41,8 +40,3 @@ func (o *ChannelCounts) Etag() string { return Etag(md5Counts, update) } - -func (o *ChannelCounts) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} diff --git a/model/channel_data.go b/model/channel_data.go index 69d4480280..083a3f4403 100644 --- a/model/channel_data.go +++ b/model/channel_data.go @@ -3,10 +3,6 @@ package model -import ( - "encoding/json" -) - type ChannelData struct { Channel *Channel `json:"channel"` Member *ChannelMember `json:"member"` @@ -20,8 +16,3 @@ func (o *ChannelData) Etag() string { return Etag(o.Channel.Id, o.Channel.UpdateAt, o.Channel.LastPostAt, mt) } - -func (o *ChannelData) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} diff --git a/model/channel_member.go b/model/channel_member.go index d4527c0254..ef9be2cfeb 100644 --- a/model/channel_member.go +++ b/model/channel_member.go @@ -69,24 +69,6 @@ type ChannelMemberForExport struct { Username string } -func (o *ChannelMembers) ToJson() string { - b, err := json.Marshal(o) - if err != nil { - return "[]" - } - return string(b) -} - -func (o *ChannelUnread) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} - -func (o *ChannelUnreadAt) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} - func (o *ChannelMember) ToJson() string { b, _ := json.Marshal(o) return string(b) diff --git a/model/channel_stats.go b/model/channel_stats.go index 76f682aa94..37c1206fc6 100644 --- a/model/channel_stats.go +++ b/model/channel_stats.go @@ -15,11 +15,6 @@ type ChannelStats struct { PinnedPostCount int64 `json:"pinnedpost_count"` } -func (o *ChannelStats) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} - func ChannelStatsFromJson(data io.Reader) *ChannelStats { var o *ChannelStats json.NewDecoder(data).Decode(&o) diff --git a/model/channel_view.go b/model/channel_view.go index 2ba74434e5..cb62e42dfd 100644 --- a/model/channel_view.go +++ b/model/channel_view.go @@ -14,11 +14,6 @@ type ChannelView struct { CollapsedThreadsSupported bool `json:"collapsed_threads_supported"` } -func (o *ChannelView) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} - func ChannelViewFromJson(data io.Reader) *ChannelView { var o *ChannelView json.NewDecoder(data).Decode(&o) @@ -30,11 +25,6 @@ type ChannelViewResponse struct { LastViewedAtTimes map[string]int64 `json:"last_viewed_at_times"` } -func (o *ChannelViewResponse) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} - func ChannelViewResponseFromJson(data io.Reader) *ChannelViewResponse { var o *ChannelViewResponse json.NewDecoder(data).Decode(&o) diff --git a/model/channel_view_test.go b/model/channel_view_test.go deleted file mode 100644 index dbfc3cb433..0000000000 --- a/model/channel_view_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -package model - -import ( - "strings" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestChannelViewJson(t *testing.T) { - o := ChannelView{ChannelId: NewId(), PrevChannelId: NewId()} - json := o.ToJson() - ro := ChannelViewFromJson(strings.NewReader(json)) - - assert.Equal(t, o.ChannelId, ro.ChannelId, "ChannelIdIds do not match") - assert.Equal(t, o.PrevChannelId, ro.PrevChannelId, "PrevChannelIds do not match") -} - -func TestChannelViewResponseJson(t *testing.T) { - id := NewId() - o := ChannelViewResponse{Status: "OK", LastViewedAtTimes: map[string]int64{id: 12345}} - json := o.ToJson() - ro := ChannelViewResponseFromJson(strings.NewReader(json)) - - assert.Equal(t, o.Status, ro.Status, "ChannelIdIds do not match") - assert.Equal(t, o.LastViewedAtTimes[id], ro.LastViewedAtTimes[id], "LastViewedAtTimes do not match") -} diff --git a/model/client4.go b/model/client4.go index e6dc55de44..aff056e8cb 100644 --- a/model/client4.go +++ b/model/client4.go @@ -823,9 +823,13 @@ func (c *Client4) Logout() (bool, *Response) { // SwitchAccountType changes a user's login type from one type to another. func (c *Client4) SwitchAccountType(switchRequest *SwitchRequest) (string, *Response) { - r, err := c.DoApiPost(c.GetUsersRoute()+"/login/switch", switchRequest.ToJson()) + buf, err := json.Marshal(switchRequest) if err != nil { - return "", BuildErrorResponse(r, err) + return "", BuildErrorResponse(nil, NewAppError("SwitchAccountType", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetUsersRoute()+"/login/switch", buf) + if appErr != nil { + return "", BuildErrorResponse(r, appErr) } defer closeBody(r) return MapFromJson(r.Body)["follow_link"], BuildResponse(r) @@ -835,9 +839,9 @@ func (c *Client4) SwitchAccountType(switchRequest *SwitchRequest) (string, *Resp // CreateUser creates a user in the system based on the provided user struct. func (c *Client4) CreateUser(user *User) (*User, *Response) { - r, err := c.DoApiPost(c.GetUsersRoute(), user.ToJson()) - if err != nil { - return nil, BuildErrorResponse(r, err) + r, appErr := c.DoApiPost(c.GetUsersRoute(), user.ToJson()) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return UserFromJson(r.Body), BuildResponse(r) @@ -851,9 +855,13 @@ func (c *Client4) CreateUserWithToken(user *User, tokenId string) (*User, *Respo } query := fmt.Sprintf("?t=%v", tokenId) - r, err := c.DoApiPost(c.GetUsersRoute()+query, user.ToJson()) + buf, err := json.Marshal(user) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("CreateUserWithToken", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetUsersRoute()+query, buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) @@ -868,9 +876,13 @@ func (c *Client4) CreateUserWithInviteId(user *User, inviteId string) (*User, *R } query := fmt.Sprintf("?iid=%v", url.QueryEscape(inviteId)) - r, err := c.DoApiPost(c.GetUsersRoute()+query, user.ToJson()) + buf, err := json.Marshal(user) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("CreateUserWithInviteId", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetUsersRoute()+query, buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) @@ -1158,9 +1170,13 @@ func (c *Client4) GetUsersByGroupChannelIds(groupChannelIds []string) (map[strin // SearchUsers returns a list of users based on some search criteria. func (c *Client4) SearchUsers(search *UserSearch) ([]*User, *Response) { - r, err := c.doApiPostBytes(c.GetUsersRoute()+"/search", search.ToJson()) + buf, err := json.Marshal(search) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("SearchUsers", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetUsersRoute()+"/search", buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return UserListFromJson(r.Body), BuildResponse(r) @@ -1168,9 +1184,13 @@ func (c *Client4) SearchUsers(search *UserSearch) ([]*User, *Response) { // UpdateUser updates a user in the system based on the provided user struct. func (c *Client4) UpdateUser(user *User) (*User, *Response) { - r, err := c.DoApiPut(c.GetUserRoute(user.Id), user.ToJson()) + buf, err := json.Marshal(user) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("UpdateUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetUserRoute(user.Id), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return UserFromJson(r.Body), BuildResponse(r) @@ -1178,9 +1198,13 @@ func (c *Client4) UpdateUser(user *User) (*User, *Response) { // PatchUser partially updates a user in the system. Any missing fields are not updated. func (c *Client4) PatchUser(userId string, patch *UserPatch) (*User, *Response) { - r, err := c.DoApiPut(c.GetUserRoute(userId)+"/patch", patch.ToJson()) + buf, err := json.Marshal(patch) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("PatchUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetUserRoute(userId)+"/patch", buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return UserFromJson(r.Body), BuildResponse(r) @@ -1188,9 +1212,13 @@ func (c *Client4) PatchUser(userId string, patch *UserPatch) (*User, *Response) // UpdateUserAuth updates a user AuthData (uthData, authService and password) in the system. func (c *Client4) UpdateUserAuth(userId string, userAuth *UserAuth) (*UserAuth, *Response) { - r, err := c.DoApiPut(c.GetUserRoute(userId)+"/auth", userAuth.ToJson()) + buf, err := json.Marshal(userAuth) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("UpdateUserAuth", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetUserRoute(userId)+"/auth", buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return UserAuthFromJson(r.Body), BuildResponse(r) @@ -1350,9 +1378,13 @@ func (c *Client4) ConvertBotToUser(userId string, userPatch *UserPatch, setSyste if setSystemAdmin { query = "?set_system_admin=true" } - r, err := c.DoApiPost(c.GetBotRoute(userId)+"/convert_to_user"+query, userPatch.ToJson()) + buf, err := json.Marshal(userPatch) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("ConvertBotToUser", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetBotRoute(userId)+"/convert_to_user"+query, buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return UserFromJson(r.Body), BuildResponse(r) @@ -1636,9 +1668,13 @@ func (c *Client4) RevokeUserAccessToken(tokenId string) (bool, *Response) { // SearchUserAccessTokens returns user access tokens matching the provided search term. func (c *Client4) SearchUserAccessTokens(search *UserAccessTokenSearch) ([]*UserAccessToken, *Response) { - r, err := c.DoApiPost(c.GetUsersRoute()+"/tokens/search", search.ToJson()) + buf, err := json.Marshal(search) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("SearchUserAccessTokens", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetUsersRoute()+"/tokens/search", buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return UserAccessTokenListFromJson(r.Body), BuildResponse(r) @@ -1912,9 +1948,13 @@ func (c *Client4) DeleteBotIconImage(botUserId string) (bool, *Response) { // CreateTeam creates a team in the system based on the provided team struct. func (c *Client4) CreateTeam(team *Team) (*Team, *Response) { - r, err := c.DoApiPost(c.GetTeamsRoute(), team.ToJson()) + buf, err := json.Marshal(team) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("CreateTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetTeamsRoute(), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return TeamFromJson(r.Body), BuildResponse(r) @@ -1977,9 +2017,13 @@ func (c *Client4) GetTeamByName(name, etag string) (*Team, *Response) { // SearchTeams returns teams matching the provided search term. func (c *Client4) SearchTeams(search *TeamSearch) ([]*Team, *Response) { - r, err := c.DoApiPost(c.GetTeamsRoute()+"/search", search.ToJson()) + buf, err := json.Marshal(search) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("SearchTeams", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetTeamsRoute()+"/search", buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return TeamListFromJson(r.Body), BuildResponse(r) @@ -1993,9 +2037,13 @@ func (c *Client4) SearchTeamsPaged(search *TeamSearch) ([]*Team, int64, *Respons if search.PerPage == nil { search.PerPage = NewInt(100) } - r, err := c.DoApiPost(c.GetTeamsRoute()+"/search", search.ToJson()) + buf, err := json.Marshal(search) if err != nil { - return nil, 0, BuildErrorResponse(r, err) + return nil, 0, BuildErrorResponse(nil, NewAppError("SearchTeamsPaged", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetTeamsRoute()+"/search", buf) + if appErr != nil { + return nil, 0, BuildErrorResponse(r, appErr) } defer closeBody(r) twc := TeamsWithCountFromJson(r.Body) @@ -2046,9 +2094,13 @@ func (c *Client4) UpdateTeamMemberRoles(teamId, userId, newRoles string) (bool, // UpdateTeamMemberSchemeRoles will update the scheme-derived roles on a team for a user. func (c *Client4) UpdateTeamMemberSchemeRoles(teamId string, userId string, schemeRoles *SchemeRoles) (bool, *Response) { - r, err := c.DoApiPut(c.GetTeamMemberRoute(teamId, userId)+"/schemeRoles", schemeRoles.ToJson()) + buf, err := json.Marshal(schemeRoles) if err != nil { - return false, BuildErrorResponse(r, err) + return false, BuildErrorResponse(nil, NewAppError("UpdateTeamMemberSchemeRoles", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetTeamMemberRoute(teamId, userId)+"/schemeRoles", buf) + if appErr != nil { + return false, BuildErrorResponse(r, appErr) } defer closeBody(r) return CheckStatusOK(r), BuildResponse(r) @@ -2056,9 +2108,13 @@ func (c *Client4) UpdateTeamMemberSchemeRoles(teamId string, userId string, sche // UpdateTeam will update a team. func (c *Client4) UpdateTeam(team *Team) (*Team, *Response) { - r, err := c.DoApiPut(c.GetTeamRoute(team.Id), team.ToJson()) + buf, err := json.Marshal(team) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("UpdateTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetTeamRoute(team.Id), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return TeamFromJson(r.Body), BuildResponse(r) @@ -2066,9 +2122,13 @@ func (c *Client4) UpdateTeam(team *Team) (*Team, *Response) { // PatchTeam partially updates a team. Any missing fields are not updated. func (c *Client4) PatchTeam(teamId string, patch *TeamPatch) (*Team, *Response) { - r, err := c.DoApiPut(c.GetTeamRoute(teamId)+"/patch", patch.ToJson()) + buf, err := json.Marshal(patch) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("PatchTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetTeamRoute(teamId)+"/patch", buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return TeamFromJson(r.Body), BuildResponse(r) @@ -2174,9 +2234,13 @@ func (c *Client4) GetTeamMembersByIds(teamId string, userIds []string) ([]*TeamM // AddTeamMember adds user to a team and return a team member. func (c *Client4) AddTeamMember(teamId, userId string) (*TeamMember, *Response) { member := &TeamMember{TeamId: teamId, UserId: userId} - r, err := c.DoApiPost(c.GetTeamMembersRoute(teamId), member.ToJson()) + buf, err := json.Marshal(member) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("AddTeamMember", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetTeamMembersRoute(teamId), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return TeamMemberFromJson(r.Body), BuildResponse(r) @@ -2335,9 +2399,13 @@ func (c *Client4) InviteGuestsToTeam(teamId string, userEmails []string, channel Channels: channels, Message: message, } - r, err := c.DoApiPost(c.GetTeamRoute(teamId)+"/invite-guests/email", guestsInvite.ToJson()) + buf, err := json.Marshal(guestsInvite) if err != nil { - return false, BuildErrorResponse(r, err) + return false, BuildErrorResponse(nil, NewAppError("InviteGuestsToTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetTeamRoute(teamId)+"/invite-guests/email", buf) + if appErr != nil { + return false, BuildErrorResponse(r, appErr) } defer closeBody(r) return CheckStatusOK(r), BuildResponse(r) @@ -2360,9 +2428,13 @@ func (c *Client4) InviteGuestsToTeamGracefully(teamId string, userEmails []strin Channels: channels, Message: message, } - r, err := c.DoApiPost(c.GetTeamRoute(teamId)+"/invite-guests/email?graceful="+c.boolString(true), guestsInvite.ToJson()) + buf, err := json.Marshal(guestsInvite) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("InviteGuestsToTeamGracefully", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetTeamRoute(teamId)+"/invite-guests/email?graceful="+c.boolString(true), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return EmailInviteWithErrorFromJson(r.Body), BuildResponse(r) @@ -2541,14 +2613,18 @@ func (c *Client4) UpdateChannel(channel *Channel) (*Channel, *Response) { // PatchChannel partially updates a channel. Any missing fields are not updated. func (c *Client4) PatchChannel(channelId string, patch *ChannelPatch) (*Channel, *Response) { - r, appErr := c.DoApiPut(c.GetChannelRoute(channelId)+"/patch", patch.ToJson()) + buf, err := json.Marshal(patch) + if err != nil { + return nil, BuildErrorResponse(nil, NewAppError("PatchChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetChannelRoute(channelId)+"/patch", buf) if appErr != nil { return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) var ch *Channel - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { return nil, BuildErrorResponse(r, NewAppError("PatchChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) } @@ -3037,14 +3113,18 @@ func (c *Client4) GetChannelMembersForUser(userId, teamId, etag string) (*Channe // ViewChannel performs a view action for a user. Synonymous with switching channels or marking channels as read by a user. func (c *Client4) ViewChannel(userId string, view *ChannelView) (*ChannelViewResponse, *Response) { url := fmt.Sprintf(c.GetChannelsRoute()+"/members/%v/view", userId) - r, appErr := c.DoApiPost(url, view.ToJson()) + buf, err := json.Marshal(view) + if err != nil { + return nil, BuildErrorResponse(nil, NewAppError("ViewChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(url, buf) if appErr != nil { return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) var ch *ChannelViewResponse - err := json.NewDecoder(r.Body).Decode(&ch) + err = json.NewDecoder(r.Body).Decode(&ch) if err != nil { return nil, BuildErrorResponse(r, NewAppError("ViewChannel", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) } @@ -3081,9 +3161,13 @@ func (c *Client4) UpdateChannelRoles(channelId, userId, roles string) (bool, *Re // UpdateChannelMemberSchemeRoles will update the scheme-derived roles on a channel for a user. func (c *Client4) UpdateChannelMemberSchemeRoles(channelId string, userId string, schemeRoles *SchemeRoles) (bool, *Response) { - r, err := c.DoApiPut(c.GetChannelMemberRoute(channelId, userId)+"/schemeRoles", schemeRoles.ToJson()) + buf, err := json.Marshal(schemeRoles) if err != nil { - return false, BuildErrorResponse(r, err) + return false, BuildErrorResponse(nil, NewAppError("UpdateChannelMemberSchemeRoles", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetChannelMemberRoute(channelId, userId)+"/schemeRoles", buf) + if appErr != nil { + return false, BuildErrorResponse(r, appErr) } defer closeBody(r) return CheckStatusOK(r), BuildResponse(r) @@ -3211,9 +3295,13 @@ func (c *Client4) UpdatePost(postId string, post *Post) (*Post, *Response) { // PatchPost partially updates a post. Any missing fields are not updated. func (c *Client4) PatchPost(postId string, patch *PostPatch) (*Post, *Response) { - r, err := c.DoApiPut(c.GetPostRoute(postId)+"/patch", patch.ToJson()) + buf, err := json.Marshal(patch) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("PatchPost", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetPostRoute(postId)+"/patch", buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return PostFromJson(r.Body), BuildResponse(r) @@ -3221,10 +3309,13 @@ func (c *Client4) PatchPost(postId string, patch *PostPatch) (*Post, *Response) // SetPostUnread marks channel where post belongs as unread on the time of the provided post. func (c *Client4) SetPostUnread(userId string, postId string, collapsedThreadsSupported bool) *Response { - b, _ := json.Marshal(map[string]bool{"collapsed_threads_supported": collapsedThreadsSupported}) - r, err := c.DoApiPost(c.GetUserRoute(userId)+c.GetPostRoute(postId)+"/set_unread", string(b)) + b, err := json.Marshal(map[string]bool{"collapsed_threads_supported": collapsedThreadsSupported}) if err != nil { - return BuildErrorResponse(r, err) + return BuildErrorResponse(nil, NewAppError("SetPostUnread", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetUserRoute(userId)+c.GetPostRoute(postId)+"/set_unread", b) + if appErr != nil { + return BuildErrorResponse(r, appErr) } defer closeBody(r) return BuildResponse(r) @@ -3722,9 +3813,13 @@ func (c *Client4) GetPingWithFullServerStatus() (map[string]string, *Response) { // TestEmail will attempt to connect to the configured SMTP server. func (c *Client4) TestEmail(config *Config) (bool, *Response) { - r, err := c.DoApiPost(c.GetTestEmailRoute(), config.ToJson()) + buf, err := json.Marshal(config) if err != nil { - return false, BuildErrorResponse(r, err) + return false, BuildErrorResponse(nil, NewAppError("TestEmail", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetTestEmailRoute(), buf) + if appErr != nil { + return false, BuildErrorResponse(r, appErr) } defer closeBody(r) return CheckStatusOK(r), BuildResponse(r) @@ -3744,9 +3839,13 @@ func (c *Client4) TestSiteURL(siteURL string) (bool, *Response) { // TestS3Connection will attempt to connect to the AWS S3. func (c *Client4) TestS3Connection(config *Config) (bool, *Response) { - r, err := c.DoApiPost(c.GetTestS3Route(), config.ToJson()) + buf, err := json.Marshal(config) if err != nil { - return false, BuildErrorResponse(r, err) + return false, BuildErrorResponse(nil, NewAppError("TestS3Connection", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetTestS3Route(), buf) + if appErr != nil { + return false, BuildErrorResponse(r, appErr) } defer closeBody(r) return CheckStatusOK(r), BuildResponse(r) @@ -3828,9 +3927,13 @@ func (c *Client4) InvalidateCaches() (bool, *Response) { // UpdateConfig will update the server configuration. func (c *Client4) UpdateConfig(config *Config) (*Config, *Response) { - r, err := c.DoApiPut(c.GetConfigRoute(), config.ToJson()) + buf, err := json.Marshal(config) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("UpdateConfig", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetConfigRoute(), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return ConfigFromJson(r.Body), BuildResponse(r) @@ -3925,9 +4028,13 @@ func (c *Client4) GetAnalyticsOld(name, teamId string) (AnalyticsRows, *Response // CreateIncomingWebhook creates an incoming webhook for a channel. func (c *Client4) CreateIncomingWebhook(hook *IncomingWebhook) (*IncomingWebhook, *Response) { - r, err := c.DoApiPost(c.GetIncomingWebhooksRoute(), hook.ToJson()) + buf, err := json.Marshal(hook) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("CreateIncomingWebhook", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetIncomingWebhooksRoute(), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return IncomingWebhookFromJson(r.Body), BuildResponse(r) @@ -3935,9 +4042,13 @@ func (c *Client4) CreateIncomingWebhook(hook *IncomingWebhook) (*IncomingWebhook // UpdateIncomingWebhook updates an incoming webhook for a channel. func (c *Client4) UpdateIncomingWebhook(hook *IncomingWebhook) (*IncomingWebhook, *Response) { - r, err := c.DoApiPut(c.GetIncomingWebhookRoute(hook.Id), hook.ToJson()) + buf, err := json.Marshal(hook) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("UpdateIncomingWebhook", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetIncomingWebhookRoute(hook.Id), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return IncomingWebhookFromJson(r.Body), BuildResponse(r) @@ -3987,9 +4098,13 @@ func (c *Client4) DeleteIncomingWebhook(hookID string) (bool, *Response) { // CreateOutgoingWebhook creates an outgoing webhook for a team or channel. func (c *Client4) CreateOutgoingWebhook(hook *OutgoingWebhook) (*OutgoingWebhook, *Response) { - r, err := c.DoApiPost(c.GetOutgoingWebhooksRoute(), hook.ToJson()) + buf, err := json.Marshal(hook) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("CreateOutgoingWebhook", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetOutgoingWebhooksRoute(), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return OutgoingWebhookFromJson(r.Body), BuildResponse(r) @@ -3997,9 +4112,13 @@ func (c *Client4) CreateOutgoingWebhook(hook *OutgoingWebhook) (*OutgoingWebhook // UpdateOutgoingWebhook creates an outgoing webhook for a team or channel. func (c *Client4) UpdateOutgoingWebhook(hook *OutgoingWebhook) (*OutgoingWebhook, *Response) { - r, err := c.DoApiPut(c.GetOutgoingWebhookRoute(hook.Id), hook.ToJson()) + buf, err := json.Marshal(hook) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("UpdateOutgoingWebhook", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetOutgoingWebhookRoute(hook.Id), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return OutgoingWebhookFromJson(r.Body), BuildResponse(r) @@ -4083,9 +4202,13 @@ func (c *Client4) GetPreferences(userId string) (Preferences, *Response) { // UpdatePreferences saves the user's preferences. func (c *Client4) UpdatePreferences(userId string, preferences *Preferences) (bool, *Response) { - r, err := c.DoApiPut(c.GetPreferencesRoute(userId), preferences.ToJson()) + buf, err := json.Marshal(preferences) if err != nil { - return false, BuildErrorResponse(r, err) + return false, BuildErrorResponse(nil, NewAppError("UpdatePreferences", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetPreferencesRoute(userId), buf) + if appErr != nil { + return false, BuildErrorResponse(r, appErr) } defer closeBody(r) return true, BuildResponse(r) @@ -4093,9 +4216,13 @@ func (c *Client4) UpdatePreferences(userId string, preferences *Preferences) (bo // DeletePreferences deletes the user's preferences. func (c *Client4) DeletePreferences(userId string, preferences *Preferences) (bool, *Response) { - r, err := c.DoApiPost(c.GetPreferencesRoute(userId)+"/delete", preferences.ToJson()) + buf, err := json.Marshal(preferences) if err != nil { - return false, BuildErrorResponse(r, err) + return false, BuildErrorResponse(nil, NewAppError("DeletePreferences", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetPreferencesRoute(userId)+"/delete", buf) + if appErr != nil { + return false, BuildErrorResponse(r, appErr) } defer closeBody(r) return true, BuildResponse(r) @@ -4272,9 +4399,13 @@ func (c *Client4) ResetSamlAuthDataToEmail(includeDeleted bool, dryRun bool, use // CreateComplianceReport creates an incoming webhook for a channel. func (c *Client4) CreateComplianceReport(report *Compliance) (*Compliance, *Response) { - r, err := c.DoApiPost(c.GetComplianceReportsRoute(), report.ToJson()) + buf, err := json.Marshal(report) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("CreateComplianceReport", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetComplianceReportsRoute(), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return ComplianceFromJson(r.Body), BuildResponse(r) @@ -4735,9 +4866,13 @@ func (c *Client4) PostLog(message map[string]string) (map[string]string, *Respon // CreateOAuthApp will register a new OAuth 2.0 client application with Mattermost acting as an OAuth 2.0 service provider. func (c *Client4) CreateOAuthApp(app *OAuthApp) (*OAuthApp, *Response) { - r, err := c.DoApiPost(c.GetOAuthAppsRoute(), app.ToJson()) + buf, err := json.Marshal(app) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("CreateOAuthApp", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetOAuthAppsRoute(), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return OAuthAppFromJson(r.Body), BuildResponse(r) @@ -4745,9 +4880,13 @@ func (c *Client4) CreateOAuthApp(app *OAuthApp) (*OAuthApp, *Response) { // UpdateOAuthApp updates a page of registered OAuth 2.0 client applications with Mattermost acting as an OAuth 2.0 service provider. func (c *Client4) UpdateOAuthApp(app *OAuthApp) (*OAuthApp, *Response) { - r, err := c.DoApiPut(c.GetOAuthAppRoute(app.Id), app.ToJson()) + buf, err := json.Marshal(app) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("UpdateOAuthApp", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetOAuthAppRoute(app.Id), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return OAuthAppFromJson(r.Body), BuildResponse(r) @@ -4817,9 +4956,13 @@ func (c *Client4) GetAuthorizedOAuthAppsForUser(userId string, page, perPage int // AuthorizeOAuthApp will authorize an OAuth 2.0 client application to access a user's account and provide a redirect link to follow. func (c *Client4) AuthorizeOAuthApp(authRequest *AuthorizeRequest) (string, *Response) { - r, err := c.DoApiRequest(http.MethodPost, c.Url+"/oauth/authorize", authRequest.ToJson(), "") + buf, err := json.Marshal(authRequest) if err != nil { - return "", BuildErrorResponse(r, err) + return "", BuildErrorResponse(nil, NewAppError("AuthorizeOAuthApp", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiRequestBytes(http.MethodPost, c.Url+"/oauth/authorize", buf, "") + if appErr != nil { + return "", BuildErrorResponse(r, appErr) } defer closeBody(r) return MapFromJson(r.Body)["redirect"], BuildResponse(r) @@ -5141,9 +5284,13 @@ func (c *Client4) GetChannelPoliciesForUser(userID string, offset, limit int) (* // CreateCommand will create a new command if the user have the right permissions. func (c *Client4) CreateCommand(cmd *Command) (*Command, *Response) { - r, err := c.DoApiPost(c.GetCommandsRoute(), cmd.ToJson()) + buf, err := json.Marshal(cmd) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("CreateCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetCommandsRoute(), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return CommandFromJson(r.Body), BuildResponse(r) @@ -5151,9 +5298,13 @@ func (c *Client4) CreateCommand(cmd *Command) (*Command, *Response) { // UpdateCommand updates a command based on the provided Command struct. func (c *Client4) UpdateCommand(cmd *Command) (*Command, *Response) { - r, err := c.DoApiPut(c.GetCommandRoute(cmd.Id), cmd.ToJson()) + buf, err := json.Marshal(cmd) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("UpdateCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetCommandRoute(cmd.Id), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return CommandFromJson(r.Body), BuildResponse(r) @@ -5162,9 +5313,13 @@ func (c *Client4) UpdateCommand(cmd *Command) (*Command, *Response) { // MoveCommand moves a command to a different team. func (c *Client4) MoveCommand(teamId string, commandId string) (bool, *Response) { cmr := CommandMoveRequest{TeamId: teamId} - r, err := c.DoApiPut(c.GetCommandMoveRoute(commandId), cmr.ToJson()) + buf, err := json.Marshal(cmr) if err != nil { - return false, BuildErrorResponse(r, err) + return false, BuildErrorResponse(nil, NewAppError("MoveCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetCommandMoveRoute(commandId), buf) + if appErr != nil { + return false, BuildErrorResponse(r, appErr) } defer closeBody(r) return CheckStatusOK(r), BuildResponse(r) @@ -5219,13 +5374,20 @@ func (c *Client4) ExecuteCommand(channelId, command string) (*CommandResponse, * ChannelId: channelId, Command: command, } - r, err := c.DoApiPost(c.GetCommandsRoute()+"/execute", commandArgs.ToJson()) + buf, err := json.Marshal(commandArgs) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("ExecuteCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetCommandsRoute()+"/execute", buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) - response, _ := CommandResponseFromJson(r.Body) + response, err := CommandResponseFromJson(r.Body) + if err != nil { + return nil, BuildErrorResponse(r, NewAppError("ExecuteCommand", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } return response, BuildResponse(r) } @@ -5237,13 +5399,20 @@ func (c *Client4) ExecuteCommandWithTeam(channelId, teamId, command string) (*Co TeamId: teamId, Command: command, } - r, err := c.DoApiPost(c.GetCommandsRoute()+"/execute", commandArgs.ToJson()) + buf, err := json.Marshal(commandArgs) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("ExecuteCommandWithTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetCommandsRoute()+"/execute", buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) - response, _ := CommandResponseFromJson(r.Body) + response, err := CommandResponseFromJson(r.Body) + if err != nil { + return nil, BuildErrorResponse(r, NewAppError("ExecuteCommandWithTeam", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } return response, BuildResponse(r) } @@ -5291,9 +5460,13 @@ func (c *Client4) GetUsersStatusesByIds(userIds []string) ([]*Status, *Response) // UpdateUserStatus sets a user's status based on the provided user id string. func (c *Client4) UpdateUserStatus(userId string, userStatus *Status) (*Status, *Response) { - r, err := c.DoApiPut(c.GetUserStatusRoute(userId), userStatus.ToJson()) + buf, err := json.Marshal(userStatus) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("UpdateUserStatus", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetUserStatusRoute(userId), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return StatusFromJson(r.Body), BuildResponse(r) @@ -5383,9 +5556,9 @@ func (c *Client4) GetEmojiByName(name string) (*Emoji, *Response) { // GetEmojiImage returns the emoji image. func (c *Client4) GetEmojiImage(emojiId string) ([]byte, *Response) { - r, apErr := c.DoApiGet(c.GetEmojiRoute(emojiId)+"/image", "") - if apErr != nil { - return nil, BuildErrorResponse(r, apErr) + r, appErr := c.DoApiGet(c.GetEmojiRoute(emojiId)+"/image", "") + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) @@ -5399,9 +5572,13 @@ func (c *Client4) GetEmojiImage(emojiId string) ([]byte, *Response) { // SearchEmoji returns a list of emoji matching some search criteria. func (c *Client4) SearchEmoji(search *EmojiSearch) ([]*Emoji, *Response) { - r, err := c.DoApiPost(c.GetEmojisRoute()+"/search", search.ToJson()) + buf, err := json.Marshal(search) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("SearchEmoji", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetEmojisRoute()+"/search", buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return EmojiListFromJson(r.Body), BuildResponse(r) @@ -5410,9 +5587,9 @@ func (c *Client4) SearchEmoji(search *EmojiSearch) ([]*Emoji, *Response) { // AutocompleteEmoji returns a list of emoji starting with or matching name. func (c *Client4) AutocompleteEmoji(name string, etag string) ([]*Emoji, *Response) { query := fmt.Sprintf("?name=%v", name) - r, err := c.DoApiGet(c.GetEmojisRoute()+"/autocomplete"+query, "") - if err != nil { - return nil, BuildErrorResponse(r, err) + r, appErr := c.DoApiGet(c.GetEmojisRoute()+"/autocomplete"+query, "") + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return EmojiListFromJson(r.Body), BuildResponse(r) @@ -5422,9 +5599,13 @@ func (c *Client4) AutocompleteEmoji(name string, etag string) ([]*Emoji, *Respon // SaveReaction saves an emoji reaction for a post. Returns the saved reaction if successful, otherwise an error will be returned. func (c *Client4) SaveReaction(reaction *Reaction) (*Reaction, *Response) { - r, err := c.DoApiPost(c.GetReactionsRoute(), reaction.ToJson()) + buf, err := json.Marshal(reaction) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("SaveReaction", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetReactionsRoute(), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return ReactionFromJson(r.Body), BuildResponse(r) @@ -5523,9 +5704,13 @@ func (c *Client4) GetJobsByType(jobType string, page int, perPage int) ([]*Job, // CreateJob creates a job based on the provided job struct. func (c *Client4) CreateJob(job *Job) (*Job, *Response) { - r, err := c.DoApiPost(c.GetJobsRoute(), job.ToJson()) + buf, err := json.Marshal(job) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("CreateJob", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetJobsRoute(), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return JobFromJson(r.Body), BuildResponse(r) @@ -5590,9 +5775,13 @@ func (c *Client4) GetRolesByNames(roleNames []string) ([]*Role, *Response) { // PatchRole partially updates a role in the system. Any missing fields are not updated. func (c *Client4) PatchRole(roleId string, patch *RolePatch) (*Role, *Response) { - r, err := c.DoApiPut(c.GetRolesRoute()+fmt.Sprintf("/%v/patch", roleId), patch.ToJson()) + buf, err := json.Marshal(patch) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("PatchRole", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetRolesRoute()+fmt.Sprintf("/%v/patch", roleId), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return RoleFromJson(r.Body), BuildResponse(r) @@ -5602,9 +5791,13 @@ func (c *Client4) PatchRole(roleId string, patch *RolePatch) (*Role, *Response) // CreateScheme creates a new Scheme. func (c *Client4) CreateScheme(scheme *Scheme) (*Scheme, *Response) { - r, err := c.DoApiPost(c.GetSchemesRoute(), scheme.ToJson()) + buf, err := json.Marshal(scheme) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("CreateScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetSchemesRoute(), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return SchemeFromJson(r.Body), BuildResponse(r) @@ -5642,9 +5835,13 @@ func (c *Client4) DeleteScheme(id string) (bool, *Response) { // PatchScheme partially updates a scheme in the system. Any missing fields are not updated. func (c *Client4) PatchScheme(id string, patch *SchemePatch) (*Scheme, *Response) { - r, err := c.DoApiPut(c.GetSchemeRoute(id)+"/patch", patch.ToJson()) + buf, err := json.Marshal(patch) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("PatchScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetSchemeRoute(id)+"/patch", buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return SchemeFromJson(r.Body), BuildResponse(r) @@ -5679,7 +5876,6 @@ func (c *Client4) GetChannelsForScheme(schemeId string, page int, perPage int) ( // Plugin Section // UploadPlugin takes an io.Reader stream pointing to the contents of a .tar.gz plugin. -// WARNING: PLUGINS ARE STILL EXPERIMENTAL. THIS FUNCTION IS SUBJECT TO CHANGE. func (c *Client4) UploadPlugin(file io.Reader) (*Manifest, *Response) { return c.uploadPlugin(file, false) } @@ -5748,7 +5944,6 @@ func (c *Client4) InstallPluginFromUrl(downloadUrl string, force bool) (*Manifes } // InstallMarketplacePlugin will install marketplace plugin. -// WARNING: PLUGINS ARE STILL EXPERIMENTAL. THIS FUNCTION IS SUBJECT TO CHANGE. func (c *Client4) InstallMarketplacePlugin(request *InstallMarketplacePluginRequest) (*Manifest, *Response) { json, err := request.ToJson() if err != nil { @@ -5763,7 +5958,6 @@ func (c *Client4) InstallMarketplacePlugin(request *InstallMarketplacePluginRequ } // GetPlugins will return a list of plugin manifests for currently active plugins. -// WARNING: PLUGINS ARE STILL EXPERIMENTAL. THIS FUNCTION IS SUBJECT TO CHANGE. func (c *Client4) GetPlugins() (*PluginsResponse, *Response) { r, err := c.DoApiGet(c.GetPluginsRoute(), "") if err != nil { @@ -5775,7 +5969,6 @@ func (c *Client4) GetPlugins() (*PluginsResponse, *Response) { // GetPluginStatuses will return the plugins installed on any server in the cluster, for reporting // to the administrator via the system console. -// WARNING: PLUGINS ARE STILL EXPERIMENTAL. THIS FUNCTION IS SUBJECT TO CHANGE. func (c *Client4) GetPluginStatuses() (PluginStatuses, *Response) { r, err := c.DoApiGet(c.GetPluginsRoute()+"/statuses", "") if err != nil { @@ -5786,7 +5979,6 @@ func (c *Client4) GetPluginStatuses() (PluginStatuses, *Response) { } // RemovePlugin will disable and delete a plugin. -// WARNING: PLUGINS ARE STILL EXPERIMENTAL. THIS FUNCTION IS SUBJECT TO CHANGE. func (c *Client4) RemovePlugin(id string) (bool, *Response) { r, err := c.DoApiDelete(c.GetPluginRoute(id)) if err != nil { @@ -5797,7 +5989,6 @@ func (c *Client4) RemovePlugin(id string) (bool, *Response) { } // GetWebappPlugins will return a list of plugins that the webapp should download. -// WARNING: PLUGINS ARE STILL EXPERIMENTAL. THIS FUNCTION IS SUBJECT TO CHANGE. func (c *Client4) GetWebappPlugins() ([]*Manifest, *Response) { r, err := c.DoApiGet(c.GetPluginsRoute()+"/webapp", "") if err != nil { @@ -5808,7 +5999,6 @@ func (c *Client4) GetWebappPlugins() ([]*Manifest, *Response) { } // EnablePlugin will enable an plugin installed. -// WARNING: PLUGINS ARE STILL EXPERIMENTAL. THIS FUNCTION IS SUBJECT TO CHANGE. func (c *Client4) EnablePlugin(id string) (bool, *Response) { r, err := c.DoApiPost(c.GetPluginRoute(id)+"/enable", "") if err != nil { @@ -5819,7 +6009,6 @@ func (c *Client4) EnablePlugin(id string) (bool, *Response) { } // DisablePlugin will disable an enabled plugin. -// WARNING: PLUGINS ARE STILL EXPERIMENTAL. THIS FUNCTION IS SUBJECT TO CHANGE. func (c *Client4) DisablePlugin(id string) (bool, *Response) { r, err := c.DoApiPost(c.GetPluginRoute(id)+"/disable", "") if err != nil { @@ -5830,7 +6019,6 @@ func (c *Client4) DisablePlugin(id string) (bool, *Response) { } // GetMarketplacePlugins will return a list of plugins that an admin can install. -// WARNING: PLUGINS ARE STILL EXPERIMENTAL. THIS FUNCTION IS SUBJECT TO CHANGE. func (c *Client4) GetMarketplacePlugins(filter *MarketplacePluginFilter) ([]*MarketplacePlugin, *Response) { route := c.GetPluginsRoute() + "/marketplace" u, parseErr := url.Parse(route) @@ -5857,9 +6045,13 @@ func (c *Client4) GetMarketplacePlugins(filter *MarketplacePluginFilter) ([]*Mar // UpdateChannelScheme will update a channel's scheme. func (c *Client4) UpdateChannelScheme(channelId, schemeId string) (bool, *Response) { sip := &SchemeIDPatch{SchemeID: &schemeId} - r, err := c.DoApiPut(c.GetChannelSchemeRoute(channelId), sip.ToJson()) + buf, err := json.Marshal(sip) if err != nil { - return false, BuildErrorResponse(r, err) + return false, BuildErrorResponse(nil, NewAppError("UpdateChannelScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetChannelSchemeRoute(channelId), buf) + if appErr != nil { + return false, BuildErrorResponse(r, appErr) } defer closeBody(r) return CheckStatusOK(r), BuildResponse(r) @@ -5868,9 +6060,13 @@ func (c *Client4) UpdateChannelScheme(channelId, schemeId string) (bool, *Respon // UpdateTeamScheme will update a team's scheme. func (c *Client4) UpdateTeamScheme(teamId, schemeId string) (bool, *Response) { sip := &SchemeIDPatch{SchemeID: &schemeId} - r, err := c.DoApiPut(c.GetTeamSchemeRoute(teamId), sip.ToJson()) + buf, err := json.Marshal(sip) if err != nil { - return false, BuildErrorResponse(r, err) + return false, BuildErrorResponse(nil, NewAppError("UpdateTeamScheme", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetTeamSchemeRoute(teamId), buf) + if appErr != nil { + return false, BuildErrorResponse(r, appErr) } defer closeBody(r) return CheckStatusOK(r), BuildResponse(r) @@ -6076,9 +6272,13 @@ func (c *Client4) ChannelMembersMinusGroupMembers(channelID string, groupIDs []s } func (c *Client4) PatchConfig(config *Config) (*Config, *Response) { - r, err := c.DoApiPut(c.GetConfigRoute()+"/patch", config.ToJson()) + buf, err := json.Marshal(config) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("PatchConfig", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPutBytes(c.GetConfigRoute()+"/patch", buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return ConfigFromJson(r.Body), BuildResponse(r) @@ -6132,9 +6332,13 @@ func (c *Client4) GetKnownUsers() ([]string, *Response) { // PublishUserTyping publishes a user is typing websocket event based on the provided TypingRequest. func (c *Client4) PublishUserTyping(userID string, typingRequest TypingRequest) (bool, *Response) { - r, err := c.DoApiPost(c.GetPublishUserTypingRoute(userID), typingRequest.ToJson()) + buf, err := json.Marshal(typingRequest) if err != nil { - return false, BuildErrorResponse(r, err) + return false, BuildErrorResponse(nil, NewAppError("PublishUserTyping", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetPublishUserTypingRoute(userID), buf) + if appErr != nil { + return false, BuildErrorResponse(r, appErr) } defer closeBody(r) return CheckStatusOK(r), BuildResponse(r) @@ -6320,9 +6524,13 @@ func (c *Client4) MarkNoticesViewed(ids []string) *Response { // CreateUpload creates a new upload session. func (c *Client4) CreateUpload(us *UploadSession) (*UploadSession, *Response) { - r, err := c.DoApiPost(c.GetUploadsRoute(), us.ToJson()) + buf, err := json.Marshal(us) if err != nil { - return nil, BuildErrorResponse(r, err) + return nil, BuildErrorResponse(nil, NewAppError("CreateUpload", "api.marshal_error", nil, err.Error(), http.StatusInternalServerError)) + } + r, appErr := c.doApiPostBytes(c.GetUploadsRoute(), buf) + if appErr != nil { + return nil, BuildErrorResponse(r, appErr) } defer closeBody(r) return UploadSessionFromJson(r.Body), BuildResponse(r) diff --git a/model/cluster_discovery.go b/model/cluster_discovery.go index 1cbe6d47bc..cdb167a06e 100644 --- a/model/cluster_discovery.go +++ b/model/cluster_discovery.go @@ -116,15 +116,6 @@ func (o *ClusterDiscovery) IsValid() *AppError { return nil } -func (o *ClusterDiscovery) ToJson() string { - b, err := json.Marshal(o) - if err != nil { - return "" - } - - return string(b) -} - func ClusterDiscoveryFromJson(data io.Reader) *ClusterDiscovery { decoder := json.NewDecoder(data) var me ClusterDiscovery diff --git a/model/cluster_discovery_test.go b/model/cluster_discovery_test.go index 109c7ea0cd..c46493c14b 100644 --- a/model/cluster_discovery_test.go +++ b/model/cluster_discovery_test.go @@ -4,10 +4,12 @@ package model import ( + "encoding/json" "strings" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestClusterDiscovery(t *testing.T) { @@ -17,7 +19,9 @@ func TestClusterDiscovery(t *testing.T) { Hostname: "test_hostname", } - json := o.ToJson() + buf, err := json.Marshal(o) + require.NoError(t, err) + json := string(buf) result1 := ClusterDiscoveryFromJson(strings.NewReader(json)) assert.NotNil(t, result1) diff --git a/model/cluster_info.go b/model/cluster_info.go index fc15d38ca1..4f0a75fc0b 100644 --- a/model/cluster_info.go +++ b/model/cluster_info.go @@ -16,11 +16,6 @@ type ClusterInfo struct { Hostname string `json:"hostname"` } -func (ci *ClusterInfo) ToJson() string { - b, _ := json.Marshal(ci) - return string(b) -} - func ClusterInfoFromJson(data io.Reader) *ClusterInfo { var ci *ClusterInfo json.NewDecoder(data).Decode(&ci) diff --git a/model/cluster_info_test.go b/model/cluster_info_test.go index f4f121b453..fb3a24c0a7 100644 --- a/model/cluster_info_test.go +++ b/model/cluster_info_test.go @@ -10,14 +10,6 @@ import ( "github.com/stretchr/testify/assert" ) -func TestClusterInfoJson(t *testing.T) { - cluster := ClusterInfo{IpAddress: NewId(), Hostname: NewId()} - json := cluster.ToJson() - result := ClusterInfoFromJson(strings.NewReader(json)) - - assert.Equal(t, cluster.IpAddress, result.IpAddress, "Ids do not match") -} - func TestClusterInfosJson(t *testing.T) { cluster := ClusterInfo{IpAddress: NewId(), Hostname: NewId()} clusterInfos := make([]*ClusterInfo, 1) diff --git a/model/cluster_stats.go b/model/cluster_stats.go index 9e8c630c3c..011f41f754 100644 --- a/model/cluster_stats.go +++ b/model/cluster_stats.go @@ -15,11 +15,6 @@ type ClusterStats struct { TotalMasterDbConnections int `json:"total_master_db_connections"` } -func (cs *ClusterStats) ToJson() string { - b, _ := json.Marshal(cs) - return string(b) -} - func ClusterStatsFromJson(data io.Reader) *ClusterStats { var cs *ClusterStats json.NewDecoder(data).Decode(&cs) diff --git a/model/cluster_stats_test.go b/model/cluster_stats_test.go deleted file mode 100644 index 36c73b48be..0000000000 --- a/model/cluster_stats_test.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -package model - -import ( - "strings" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestClusterStatsJson(t *testing.T) { - cluster := ClusterStats{Id: NewId(), TotalWebsocketConnections: 1, TotalReadDbConnections: 1} - json := cluster.ToJson() - result := ClusterStatsFromJson(strings.NewReader(json)) - - require.Equal(t, cluster.Id, result.Id, "Ids do not match") -} diff --git a/model/command.go b/model/command.go index a85a6425ce..dad00bc17f 100644 --- a/model/command.go +++ b/model/command.go @@ -43,22 +43,12 @@ type Command struct { AutocompleteIconData string `db:"-" json:"autocomplete_icon_data,omitempty"` } -func (o *Command) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} - func CommandFromJson(data io.Reader) *Command { var o *Command json.NewDecoder(data).Decode(&o) return o } -func CommandListToJson(l []*Command) string { - b, _ := json.Marshal(l) - return string(b) -} - func CommandListFromJson(data io.Reader) []*Command { var o []*Command json.NewDecoder(data).Decode(&o) diff --git a/model/command_args.go b/model/command_args.go index fa73ba1f68..e60d249661 100644 --- a/model/command_args.go +++ b/model/command_args.go @@ -27,11 +27,6 @@ type CommandArgs struct { Session Session `json:"-"` } -func (o *CommandArgs) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} - func CommandArgsFromJson(data io.Reader) *CommandArgs { var o *CommandArgs json.NewDecoder(data).Decode(&o) diff --git a/model/command_request.go b/model/command_request.go index 9a4e40c8f8..5c6e206774 100644 --- a/model/command_request.go +++ b/model/command_request.go @@ -21,11 +21,3 @@ func CommandMoveRequestFromJson(data io.Reader) (*CommandMoveRequest, error) { } return &cmr, nil } - -func (cmr *CommandMoveRequest) ToJson() string { - b, err := json.Marshal(cmr) - if err != nil { - return "" - } - return string(b) -} diff --git a/model/command_response.go b/model/command_response.go index 99497f31c5..432571bbec 100644 --- a/model/command_response.go +++ b/model/command_response.go @@ -32,11 +32,6 @@ type CommandResponse struct { ExtraResponses []*CommandResponse `json:"extra_responses"` } -func (o *CommandResponse) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} - func CommandResponseFromHTTPBody(contentType string, body io.Reader) (*CommandResponse, error) { if strings.TrimSpace(strings.Split(contentType, ";")[0]) == "application/json" { return CommandResponseFromJson(body) diff --git a/model/command_test.go b/model/command_test.go index 821be35466..aa63ea6998 100644 --- a/model/command_test.go +++ b/model/command_test.go @@ -10,14 +10,6 @@ import ( "github.com/stretchr/testify/require" ) -func TestCommandJson(t *testing.T) { - o := Command{Id: NewId()} - json := o.ToJson() - ro := CommandFromJson(strings.NewReader(json)) - - require.Equal(t, o.Id, ro.Id, "Ids do not match") -} - func TestCommandIsValid(t *testing.T) { o := Command{ Id: NewId(), diff --git a/model/compliance.go b/model/compliance.go index 62fc1854e2..9da215bcdb 100644 --- a/model/compliance.go +++ b/model/compliance.go @@ -50,11 +50,6 @@ type ComplianceExportCursor struct { DirectMessagesQueryCompleted bool } -func (c *Compliance) ToJson() string { - b, _ := json.Marshal(c) - return string(b) -} - func (c *Compliance) PreSave() { if c.Id == "" { c.Id = NewId() @@ -122,14 +117,6 @@ func ComplianceFromJson(data io.Reader) *Compliance { return c } -func (c Compliances) ToJson() string { - b, err := json.Marshal(c) - if err != nil { - return "[]" - } - return string(b) -} - func CompliancesFromJson(data io.Reader) Compliances { var o Compliances json.NewDecoder(data).Decode(&o) diff --git a/model/compliance_test.go b/model/compliance_test.go deleted file mode 100644 index afd0f60390..0000000000 --- a/model/compliance_test.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -package model - -import ( - "strings" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestCompliance(t *testing.T) { - o := Compliance{Desc: "test", CreateAt: GetMillis()} - json := o.ToJson() - result := ComplianceFromJson(strings.NewReader(json)) - - require.Equal(t, o.Desc, result.Desc, "JobName do not match") -} diff --git a/model/config.go b/model/config.go index bad42ad643..9b3b35b07d 100644 --- a/model/config.go +++ b/model/config.go @@ -3159,18 +3159,18 @@ type Config struct { } func (o *Config) Clone() *Config { + buf, err := json.Marshal(o) + if err != nil { + panic(err) + } var ret Config - if err := json.Unmarshal([]byte(o.ToJson()), &ret); err != nil { + err = json.Unmarshal(buf, &ret) + if err != nil { panic(err) } return &ret } -func (o *Config) ToJson() string { - b, _ := json.Marshal(o) - return string(b) -} - func (o *Config) ToJsonFiltered(tagType, tagValue string) string { filteredConfigMap := structToMapFilteredByTag(*o, tagType, tagValue) for key, value := range filteredConfigMap { diff --git a/model/emoji.go b/model/emoji.go index 380d88d4a6..c746598068 100644 --- a/model/emoji.go +++ b/model/emoji.go @@ -107,11 +107,6 @@ func EmojiFromJson(data io.Reader) *Emoji { return emoji } -func EmojiListToJson(emojiList []*Emoji) string { - b, _ := json.Marshal(emojiList) - return string(b) -} - func EmojiListFromJson(data io.Reader) []*Emoji { var emojiList []*Emoji json.NewDecoder(data).Decode(&emojiList) diff --git a/plugin/helpers_config.go b/plugin/helpers_config.go index 79f665ecda..7fe6d6dbbb 100644 --- a/plugin/helpers_config.go +++ b/plugin/helpers_config.go @@ -4,6 +4,10 @@ package plugin import ( + "bytes" + "encoding/json" + "fmt" + "github.com/pkg/errors" "github.com/mattermost/mattermost-server/v6/model" @@ -24,7 +28,17 @@ func (p *HelpersImpl) CheckRequiredServerConfiguration(req *model.Config) (bool, } mergedCfg := mc.(model.Config) - if mergedCfg.ToJson() != cfg.ToJson() { + cfgBuf, err := json.Marshal(cfg) + if err != nil { + return false, fmt.Errorf("failed to marshal config: %v", err) + } + + mergedCfgBuf, err := json.Marshal(mergedCfg) + if err != nil { + return false, fmt.Errorf("failed to marshal merged config: %v", err) + } + + if !bytes.Equal(cfgBuf, mergedCfgBuf) { return false, nil } diff --git a/testlib/resources.go b/testlib/resources.go index a953bdbe70..6b9c6ce147 100644 --- a/testlib/resources.go +++ b/testlib/resources.go @@ -4,6 +4,7 @@ package testlib import ( + "encoding/json" "fmt" "io/ioutil" "os" @@ -206,8 +207,13 @@ func setupConfig(configDir string) error { return errors.Wrapf(err, "failed to create config directory %s", configDir) } + buf, err := json.Marshal(config) + if err != nil { + return fmt.Errorf("failed to marshal config: %v", err) + } + configJSON := path.Join(configDir, "config.json") - err = ioutil.WriteFile(configJSON, []byte(config.ToJson()), 0644) + err = ioutil.WriteFile(configJSON, buf, 0644) if err != nil { return errors.Wrapf(err, "failed to write config to %s", configJSON) } diff --git a/web/oauth.go b/web/oauth.go index 099948d33d..1fabb05659 100644 --- a/web/oauth.go +++ b/web/oauth.go @@ -240,7 +240,9 @@ func getAccessToken(c *Context, w http.ResponseWriter, r *http.Request) { auditRec.Success() c.LogAudit("success") - w.Write([]byte(accessRsp.ToJson())) + if err := json.NewEncoder(w).Encode(accessRsp); err != nil { + mlog.Warn("Error writing response", mlog.Err(err)) + } } func completeOAuth(c *Context, w http.ResponseWriter, r *http.Request) {