MM-10140: API Implementation for Schemes related Endpoints (#8615)
* Implement basic scheme CRUD endpoints. * Get All Schemes (Paged) Endpoint and store plumbing. * Add get teams/channels for schemes. * Fix unit tests. * Review fixes. * More review fixes.
Этот коммит содержится в:
коммит произвёл
Martin Kraft
родитель
7d5e85e413
Коммит
60cf74352f
@@ -318,6 +318,14 @@ func (c *Client4) GetRolesRoute() string {
|
||||
return fmt.Sprintf("/roles")
|
||||
}
|
||||
|
||||
func (c *Client4) GetSchemesRoute() string {
|
||||
return fmt.Sprintf("/schemes")
|
||||
}
|
||||
|
||||
func (c *Client4) GetSchemeRoute(id string) string {
|
||||
return c.GetSchemesRoute() + fmt.Sprintf("/%v", id)
|
||||
}
|
||||
|
||||
func (c *Client4) GetAnalyticsRoute() string {
|
||||
return fmt.Sprintf("/analytics")
|
||||
}
|
||||
@@ -3420,6 +3428,78 @@ func (c *Client4) PatchRole(roleId string, patch *RolePatch) (*Role, *Response)
|
||||
}
|
||||
}
|
||||
|
||||
// Schemes Section
|
||||
|
||||
// CreateScheme creates a new Scheme.
|
||||
func (c *Client4) CreateScheme(scheme *Scheme) (*Scheme, *Response) {
|
||||
if r, err := c.DoApiPost(c.GetSchemesRoute(), scheme.ToJson()); err != nil {
|
||||
return nil, BuildErrorResponse(r, err)
|
||||
} else {
|
||||
defer closeBody(r)
|
||||
return SchemeFromJson(r.Body), BuildResponse(r)
|
||||
}
|
||||
}
|
||||
|
||||
// GetScheme gets a single scheme by ID.
|
||||
func (c *Client4) GetScheme(id string) (*Scheme, *Response) {
|
||||
if r, err := c.DoApiGet(c.GetSchemeRoute(id), ""); err != nil {
|
||||
return nil, BuildErrorResponse(r, err)
|
||||
} else {
|
||||
defer closeBody(r)
|
||||
return SchemeFromJson(r.Body), BuildResponse(r)
|
||||
}
|
||||
}
|
||||
|
||||
// Get all schemes, sorted with the most recently created first, optionally filtered by scope.
|
||||
func (c *Client4) GetSchemes(scope string, page int, perPage int) ([]*Scheme, *Response) {
|
||||
if r, err := c.DoApiGet(c.GetSchemesRoute()+fmt.Sprintf("?scope=%v&page=%v&per_page=%v", scope, page, perPage), ""); err != nil {
|
||||
return nil, BuildErrorResponse(r, err)
|
||||
} else {
|
||||
defer closeBody(r)
|
||||
return SchemesFromJson(r.Body), BuildResponse(r)
|
||||
}
|
||||
}
|
||||
|
||||
// DeleteScheme deletes a single scheme by ID.
|
||||
func (c *Client4) DeleteScheme(id string) (bool, *Response) {
|
||||
if r, err := c.DoApiDelete(c.GetSchemeRoute(id)); err != nil {
|
||||
return false, BuildErrorResponse(r, err)
|
||||
} else {
|
||||
defer closeBody(r)
|
||||
return CheckStatusOK(r), BuildResponse(r)
|
||||
}
|
||||
}
|
||||
|
||||
// PatchScheme partially updates a scheme in the system. Any missing fields are not updated.
|
||||
func (c *Client4) PatchScheme(id string, patch *SchemePatch) (*Scheme, *Response) {
|
||||
if r, err := c.DoApiPut(c.GetSchemeRoute(id)+"/patch", patch.ToJson()); err != nil {
|
||||
return nil, BuildErrorResponse(r, err)
|
||||
} else {
|
||||
defer closeBody(r)
|
||||
return SchemeFromJson(r.Body), BuildResponse(r)
|
||||
}
|
||||
}
|
||||
|
||||
// Get the teams using this scheme, sorted alphabetically by display name.
|
||||
func (c *Client4) GetTeamsForScheme(schemeId string, page int, perPage int) ([]*Team, *Response) {
|
||||
if r, err := c.DoApiGet(c.GetSchemeRoute(schemeId)+fmt.Sprintf("/teams?page=%v&per_page=%v", page, perPage), ""); err != nil {
|
||||
return nil, BuildErrorResponse(r, err)
|
||||
} else {
|
||||
defer closeBody(r)
|
||||
return TeamListFromJson(r.Body), BuildResponse(r)
|
||||
}
|
||||
}
|
||||
|
||||
// Get the channels using this scheme, sorted alphabetically by display name.
|
||||
func (c *Client4) GetChannelsForScheme(schemeId string, page int, perPage int) (ChannelList, *Response) {
|
||||
if r, err := c.DoApiGet(c.GetSchemeRoute(schemeId)+fmt.Sprintf("/channels?page=%v&per_page=%v", page, perPage), ""); err != nil {
|
||||
return nil, BuildErrorResponse(r, err)
|
||||
} else {
|
||||
defer closeBody(r)
|
||||
return *ChannelListFromJson(r.Body), BuildResponse(r)
|
||||
}
|
||||
}
|
||||
|
||||
// Plugin Section
|
||||
|
||||
// UploadPlugin takes an io.Reader stream pointing to the contents of a .tar.gz plugin.
|
||||
|
||||
@@ -29,6 +29,11 @@ type Scheme struct {
|
||||
DefaultChannelUserRole string `json:"default_channel_user_role"`
|
||||
}
|
||||
|
||||
type SchemePatch struct {
|
||||
Name *string `json:"name"`
|
||||
Description *string `json:"description"`
|
||||
}
|
||||
|
||||
type SchemeIDPatch struct {
|
||||
SchemeID *string `json:"scheme_id"`
|
||||
}
|
||||
@@ -44,6 +49,20 @@ func SchemeFromJson(data io.Reader) *Scheme {
|
||||
return scheme
|
||||
}
|
||||
|
||||
func SchemesToJson(schemes []*Scheme) string {
|
||||
b, _ := json.Marshal(schemes)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func SchemesFromJson(data io.Reader) []*Scheme {
|
||||
var schemes []*Scheme
|
||||
if err := json.NewDecoder(data).Decode(&schemes); err == nil {
|
||||
return schemes
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func (scheme *Scheme) IsValid() bool {
|
||||
if len(scheme.Id) != 26 {
|
||||
return false
|
||||
@@ -98,6 +117,26 @@ func (scheme *Scheme) IsValidForCreate() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (scheme *Scheme) Patch(patch *SchemePatch) {
|
||||
if patch.Name != nil {
|
||||
scheme.Name = *patch.Name
|
||||
}
|
||||
if patch.Description != nil {
|
||||
scheme.Description = *patch.Description
|
||||
}
|
||||
}
|
||||
|
||||
func (patch *SchemePatch) ToJson() string {
|
||||
b, _ := json.Marshal(patch)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func SchemePatchFromJson(data io.Reader) *SchemePatch {
|
||||
var patch *SchemePatch
|
||||
json.NewDecoder(data).Decode(&patch)
|
||||
return patch
|
||||
}
|
||||
|
||||
func SchemeIDFromJson(data io.Reader) *string {
|
||||
var p *SchemeIDPatch
|
||||
json.NewDecoder(data).Decode(&p)
|
||||
|
||||
Ссылка в новой задаче
Block a user