github.com/demisto/mattermost-server@v4.9.0-rc3+incompatible/api4/api.go (about)

     1  // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package api4
     5  
     6  import (
     7  	"net/http"
     8  
     9  	l4g "github.com/alecthomas/log4go"
    10  	"github.com/gorilla/mux"
    11  	"github.com/mattermost/mattermost-server/app"
    12  	"github.com/mattermost/mattermost-server/model"
    13  	"github.com/mattermost/mattermost-server/utils"
    14  
    15  	_ "github.com/nicksnyder/go-i18n/i18n"
    16  )
    17  
    18  type Routes struct {
    19  	Root    *mux.Router // ''
    20  	ApiRoot *mux.Router // 'api/v4'
    21  
    22  	Users          *mux.Router // 'api/v4/users'
    23  	User           *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}'
    24  	UserByUsername *mux.Router // 'api/v4/users/username/{username:[A-Za-z0-9_-\.]+}'
    25  	UserByEmail    *mux.Router // 'api/v4/users/email/{email}'
    26  
    27  	Teams              *mux.Router // 'api/v4/teams'
    28  	TeamsForUser       *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams'
    29  	Team               *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9]+}'
    30  	TeamForUser        *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams/{team_id:[A-Za-z0-9]+}'
    31  	TeamByName         *mux.Router // 'api/v4/teams/name/{team_name:[A-Za-z0-9_-]+}'
    32  	TeamMembers        *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9_-]+}/members'
    33  	TeamMember         *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9_-]+}/members/{user_id:[A-Za-z0-9_-]+}'
    34  	TeamMembersForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams/members'
    35  
    36  	Channels                 *mux.Router // 'api/v4/channels'
    37  	Channel                  *mux.Router // 'api/v4/channels/{channel_id:[A-Za-z0-9]+}'
    38  	ChannelForUser           *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/channels/{channel_id:[A-Za-z0-9]+}'
    39  	ChannelByName            *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9]+}/channels/name/{channel_name:[A-Za-z0-9_-]+}'
    40  	ChannelByNameForTeamName *mux.Router // 'api/v4/teams/name/{team_name:[A-Za-z0-9_-]+}/channels/name/{channel_name:[A-Za-z0-9_-]+}'
    41  	ChannelsForTeam          *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9]+}/channels'
    42  	ChannelMembers           *mux.Router // 'api/v4/channels/{channel_id:[A-Za-z0-9]+}/members'
    43  	ChannelMember            *mux.Router // 'api/v4/channels/{channel_id:[A-Za-z0-9]+}/members/{user_id:[A-Za-z0-9]+}'
    44  	ChannelMembersForUser    *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams/{team_id:[A-Za-z0-9]+}/channels/members'
    45  
    46  	Posts           *mux.Router // 'api/v4/posts'
    47  	Post            *mux.Router // 'api/v4/posts/{post_id:[A-Za-z0-9]+}'
    48  	PostsForChannel *mux.Router // 'api/v4/channels/{channel_id:[A-Za-z0-9]+}/posts'
    49  	PostsForUser    *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/posts'
    50  	PostForUser     *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/posts/{post_id:[A-Za-z0-9]+}'
    51  
    52  	Files *mux.Router // 'api/v4/files'
    53  	File  *mux.Router // 'api/v4/files/{file_id:[A-Za-z0-9]+}'
    54  
    55  	Plugins *mux.Router // 'api/v4/plugins'
    56  	Plugin  *mux.Router // 'api/v4/plugins/{plugin_id:[A-Za-z0-9_-]+}'
    57  
    58  	PublicFile *mux.Router // 'files/{file_id:[A-Za-z0-9]+}/public'
    59  
    60  	Commands *mux.Router // 'api/v4/commands'
    61  	Command  *mux.Router // 'api/v4/commands/{command_id:[A-Za-z0-9]+}'
    62  
    63  	Hooks         *mux.Router // 'api/v4/hooks'
    64  	IncomingHooks *mux.Router // 'api/v4/hooks/incoming'
    65  	IncomingHook  *mux.Router // 'api/v4/hooks/incoming/{hook_id:[A-Za-z0-9]+}'
    66  	OutgoingHooks *mux.Router // 'api/v4/hooks/outgoing'
    67  	OutgoingHook  *mux.Router // 'api/v4/hooks/outgoing/{hook_id:[A-Za-z0-9]+}'
    68  
    69  	OAuth     *mux.Router // 'api/v4/oauth'
    70  	OAuthApps *mux.Router // 'api/v4/oauth/apps'
    71  	OAuthApp  *mux.Router // 'api/v4/oauth/apps/{app_id:[A-Za-z0-9]+}'
    72  
    73  	OpenGraph *mux.Router // 'api/v4/opengraph'
    74  
    75  	SAML       *mux.Router // 'api/v4/saml'
    76  	Compliance *mux.Router // 'api/v4/compliance'
    77  	Cluster    *mux.Router // 'api/v4/cluster'
    78  
    79  	Image *mux.Router // 'api/v4/image'
    80  
    81  	LDAP *mux.Router // 'api/v4/ldap'
    82  
    83  	Elasticsearch *mux.Router // 'api/v4/elasticsearch'
    84  
    85  	DataRetention *mux.Router // 'api/v4/data_retention'
    86  
    87  	Brand *mux.Router // 'api/v4/brand'
    88  
    89  	System *mux.Router // 'api/v4/system'
    90  
    91  	Jobs *mux.Router // 'api/v4/jobs'
    92  
    93  	Preferences *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/preferences'
    94  
    95  	License *mux.Router // 'api/v4/license'
    96  
    97  	Public *mux.Router // 'api/v4/public'
    98  
    99  	Reactions *mux.Router // 'api/v4/reactions'
   100  
   101  	Roles *mux.Router // 'api/v4/roles'
   102  
   103  	Emojis      *mux.Router // 'api/v4/emoji'
   104  	Emoji       *mux.Router // 'api/v4/emoji/{emoji_id:[A-Za-z0-9]+}'
   105  	EmojiByName *mux.Router // 'api/v4/emoji/name/{emoji_name:[A-Za-z0-9_-\.]+}'
   106  
   107  	ReactionByNameForPostForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/posts/{post_id:[A-Za-z0-9]+}/reactions/{emoji_name:[A-Za-z0-9_-+]+}'
   108  
   109  	Webrtc *mux.Router // 'api/v4/webrtc'
   110  }
   111  
   112  type API struct {
   113  	App        *app.App
   114  	BaseRoutes *Routes
   115  }
   116  
   117  func Init(a *app.App, root *mux.Router, full bool) *API {
   118  	api := &API{
   119  		App:        a,
   120  		BaseRoutes: &Routes{},
   121  	}
   122  
   123  	api.BaseRoutes.Root = root
   124  	api.BaseRoutes.ApiRoot = root.PathPrefix(model.API_URL_SUFFIX).Subrouter()
   125  
   126  	api.BaseRoutes.Users = api.BaseRoutes.ApiRoot.PathPrefix("/users").Subrouter()
   127  	api.BaseRoutes.User = api.BaseRoutes.ApiRoot.PathPrefix("/users/{user_id:[A-Za-z0-9]+}").Subrouter()
   128  	api.BaseRoutes.UserByUsername = api.BaseRoutes.Users.PathPrefix("/username/{username:[A-Za-z0-9\\_\\-\\.]+}").Subrouter()
   129  	api.BaseRoutes.UserByEmail = api.BaseRoutes.Users.PathPrefix("/email/{email}").Subrouter()
   130  
   131  	api.BaseRoutes.Teams = api.BaseRoutes.ApiRoot.PathPrefix("/teams").Subrouter()
   132  	api.BaseRoutes.TeamsForUser = api.BaseRoutes.User.PathPrefix("/teams").Subrouter()
   133  	api.BaseRoutes.Team = api.BaseRoutes.Teams.PathPrefix("/{team_id:[A-Za-z0-9]+}").Subrouter()
   134  	api.BaseRoutes.TeamForUser = api.BaseRoutes.TeamsForUser.PathPrefix("/{team_id:[A-Za-z0-9]+}").Subrouter()
   135  	api.BaseRoutes.TeamByName = api.BaseRoutes.Teams.PathPrefix("/name/{team_name:[A-Za-z0-9_-]+}").Subrouter()
   136  	api.BaseRoutes.TeamMembers = api.BaseRoutes.Team.PathPrefix("/members").Subrouter()
   137  	api.BaseRoutes.TeamMember = api.BaseRoutes.TeamMembers.PathPrefix("/{user_id:[A-Za-z0-9]+}").Subrouter()
   138  	api.BaseRoutes.TeamMembersForUser = api.BaseRoutes.User.PathPrefix("/teams/members").Subrouter()
   139  
   140  	api.BaseRoutes.Channels = api.BaseRoutes.ApiRoot.PathPrefix("/channels").Subrouter()
   141  	api.BaseRoutes.Channel = api.BaseRoutes.Channels.PathPrefix("/{channel_id:[A-Za-z0-9]+}").Subrouter()
   142  	api.BaseRoutes.ChannelForUser = api.BaseRoutes.User.PathPrefix("/channels/{channel_id:[A-Za-z0-9]+}").Subrouter()
   143  	api.BaseRoutes.ChannelByName = api.BaseRoutes.Team.PathPrefix("/channels/name/{channel_name:[A-Za-z0-9_-]+}").Subrouter()
   144  	api.BaseRoutes.ChannelByNameForTeamName = api.BaseRoutes.TeamByName.PathPrefix("/channels/name/{channel_name:[A-Za-z0-9_-]+}").Subrouter()
   145  	api.BaseRoutes.ChannelsForTeam = api.BaseRoutes.Team.PathPrefix("/channels").Subrouter()
   146  	api.BaseRoutes.ChannelMembers = api.BaseRoutes.Channel.PathPrefix("/members").Subrouter()
   147  	api.BaseRoutes.ChannelMember = api.BaseRoutes.ChannelMembers.PathPrefix("/{user_id:[A-Za-z0-9]+}").Subrouter()
   148  	api.BaseRoutes.ChannelMembersForUser = api.BaseRoutes.User.PathPrefix("/teams/{team_id:[A-Za-z0-9]+}/channels/members").Subrouter()
   149  
   150  	api.BaseRoutes.Posts = api.BaseRoutes.ApiRoot.PathPrefix("/posts").Subrouter()
   151  	api.BaseRoutes.Post = api.BaseRoutes.Posts.PathPrefix("/{post_id:[A-Za-z0-9]+}").Subrouter()
   152  	api.BaseRoutes.PostsForChannel = api.BaseRoutes.Channel.PathPrefix("/posts").Subrouter()
   153  	api.BaseRoutes.PostsForUser = api.BaseRoutes.User.PathPrefix("/posts").Subrouter()
   154  	api.BaseRoutes.PostForUser = api.BaseRoutes.PostsForUser.PathPrefix("/{post_id:[A-Za-z0-9]+}").Subrouter()
   155  
   156  	api.BaseRoutes.Files = api.BaseRoutes.ApiRoot.PathPrefix("/files").Subrouter()
   157  	api.BaseRoutes.File = api.BaseRoutes.Files.PathPrefix("/{file_id:[A-Za-z0-9]+}").Subrouter()
   158  	api.BaseRoutes.PublicFile = api.BaseRoutes.Root.PathPrefix("/files/{file_id:[A-Za-z0-9]+}/public").Subrouter()
   159  
   160  	api.BaseRoutes.Plugins = api.BaseRoutes.ApiRoot.PathPrefix("/plugins").Subrouter()
   161  	api.BaseRoutes.Plugin = api.BaseRoutes.Plugins.PathPrefix("/{plugin_id:[A-Za-z0-9\\_\\-\\.]+}").Subrouter()
   162  
   163  	api.BaseRoutes.Commands = api.BaseRoutes.ApiRoot.PathPrefix("/commands").Subrouter()
   164  	api.BaseRoutes.Command = api.BaseRoutes.Commands.PathPrefix("/{command_id:[A-Za-z0-9]+}").Subrouter()
   165  
   166  	api.BaseRoutes.Hooks = api.BaseRoutes.ApiRoot.PathPrefix("/hooks").Subrouter()
   167  	api.BaseRoutes.IncomingHooks = api.BaseRoutes.Hooks.PathPrefix("/incoming").Subrouter()
   168  	api.BaseRoutes.IncomingHook = api.BaseRoutes.IncomingHooks.PathPrefix("/{hook_id:[A-Za-z0-9]+}").Subrouter()
   169  	api.BaseRoutes.OutgoingHooks = api.BaseRoutes.Hooks.PathPrefix("/outgoing").Subrouter()
   170  	api.BaseRoutes.OutgoingHook = api.BaseRoutes.OutgoingHooks.PathPrefix("/{hook_id:[A-Za-z0-9]+}").Subrouter()
   171  
   172  	api.BaseRoutes.SAML = api.BaseRoutes.ApiRoot.PathPrefix("/saml").Subrouter()
   173  
   174  	api.BaseRoutes.OAuth = api.BaseRoutes.ApiRoot.PathPrefix("/oauth").Subrouter()
   175  	api.BaseRoutes.OAuthApps = api.BaseRoutes.OAuth.PathPrefix("/apps").Subrouter()
   176  	api.BaseRoutes.OAuthApp = api.BaseRoutes.OAuthApps.PathPrefix("/{app_id:[A-Za-z0-9]+}").Subrouter()
   177  
   178  	api.BaseRoutes.Compliance = api.BaseRoutes.ApiRoot.PathPrefix("/compliance").Subrouter()
   179  	api.BaseRoutes.Cluster = api.BaseRoutes.ApiRoot.PathPrefix("/cluster").Subrouter()
   180  	api.BaseRoutes.LDAP = api.BaseRoutes.ApiRoot.PathPrefix("/ldap").Subrouter()
   181  	api.BaseRoutes.Brand = api.BaseRoutes.ApiRoot.PathPrefix("/brand").Subrouter()
   182  	api.BaseRoutes.System = api.BaseRoutes.ApiRoot.PathPrefix("/system").Subrouter()
   183  	api.BaseRoutes.Preferences = api.BaseRoutes.User.PathPrefix("/preferences").Subrouter()
   184  	api.BaseRoutes.License = api.BaseRoutes.ApiRoot.PathPrefix("/license").Subrouter()
   185  	api.BaseRoutes.Public = api.BaseRoutes.ApiRoot.PathPrefix("/public").Subrouter()
   186  	api.BaseRoutes.Reactions = api.BaseRoutes.ApiRoot.PathPrefix("/reactions").Subrouter()
   187  	api.BaseRoutes.Jobs = api.BaseRoutes.ApiRoot.PathPrefix("/jobs").Subrouter()
   188  	api.BaseRoutes.Elasticsearch = api.BaseRoutes.ApiRoot.PathPrefix("/elasticsearch").Subrouter()
   189  	api.BaseRoutes.DataRetention = api.BaseRoutes.ApiRoot.PathPrefix("/data_retention").Subrouter()
   190  
   191  	api.BaseRoutes.Emojis = api.BaseRoutes.ApiRoot.PathPrefix("/emoji").Subrouter()
   192  	api.BaseRoutes.Emoji = api.BaseRoutes.ApiRoot.PathPrefix("/emoji/{emoji_id:[A-Za-z0-9]+}").Subrouter()
   193  	api.BaseRoutes.EmojiByName = api.BaseRoutes.Emojis.PathPrefix("/name/{emoji_name:[A-Za-z0-9\\_\\-\\+]+}").Subrouter()
   194  
   195  	api.BaseRoutes.ReactionByNameForPostForUser = api.BaseRoutes.PostForUser.PathPrefix("/reactions/{emoji_name:[A-Za-z0-9\\_\\-\\+]+}").Subrouter()
   196  
   197  	api.BaseRoutes.Webrtc = api.BaseRoutes.ApiRoot.PathPrefix("/webrtc").Subrouter()
   198  
   199  	api.BaseRoutes.OpenGraph = api.BaseRoutes.ApiRoot.PathPrefix("/opengraph").Subrouter()
   200  
   201  	api.BaseRoutes.Roles = api.BaseRoutes.ApiRoot.PathPrefix("/roles").Subrouter()
   202  
   203  	api.BaseRoutes.Image = api.BaseRoutes.ApiRoot.PathPrefix("/image").Subrouter()
   204  
   205  	api.InitUser()
   206  	api.InitTeam()
   207  	api.InitChannel()
   208  	api.InitPost()
   209  	api.InitFile()
   210  	api.InitSystem()
   211  	api.InitWebhook()
   212  	api.InitPreference()
   213  	api.InitSaml()
   214  	api.InitCompliance()
   215  	api.InitCluster()
   216  	api.InitLdap()
   217  	api.InitElasticsearch()
   218  	api.InitDataRetention()
   219  	api.InitBrand()
   220  	api.InitJob()
   221  	api.InitCommand()
   222  	api.InitStatus()
   223  	api.InitWebSocket()
   224  	api.InitEmoji()
   225  	api.InitOAuth()
   226  	api.InitReaction()
   227  	api.InitWebrtc()
   228  	api.InitOpenGraph()
   229  	api.InitPlugin()
   230  	api.InitRole()
   231  	api.InitImage()
   232  
   233  	root.Handle("/api/v4/{anything:.*}", http.HandlerFunc(Handle404))
   234  
   235  	// REMOVE CONDITION WHEN APIv3 REMOVED
   236  	if full {
   237  		a.InitEmailBatching()
   238  	}
   239  
   240  	return api
   241  }
   242  
   243  func Handle404(w http.ResponseWriter, r *http.Request) {
   244  	err := model.NewAppError("Handle404", "api.context.404.app_error", nil, "", http.StatusNotFound)
   245  
   246  	l4g.Debug("%v: code=404 ip=%v", r.URL.Path, utils.GetIpAddress(r))
   247  
   248  	w.WriteHeader(err.StatusCode)
   249  	err.DetailedError = "There doesn't appear to be an api call for the url='" + r.URL.Path + "'."
   250  	w.Write([]byte(err.ToJson()))
   251  }
   252  
   253  func ReturnStatusOK(w http.ResponseWriter) {
   254  	m := make(map[string]string)
   255  	m[model.STATUS] = model.STATUS_OK
   256  	w.Write([]byte(model.MapToJson(m)))
   257  }