github.com/coincircle/mattermost-server@v4.8.1-0.20180321182714-9d701c704416+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  	Emojis      *mux.Router // 'api/v4/emoji'
   102  	Emoji       *mux.Router // 'api/v4/emoji/{emoji_id:[A-Za-z0-9]+}'
   103  	EmojiByName *mux.Router // 'api/v4/emoji/name/{emoji_name:[A-Za-z0-9_-\.]+}'
   104  
   105  	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_-+]+}'
   106  
   107  	Webrtc *mux.Router // 'api/v4/webrtc'
   108  }
   109  
   110  type API struct {
   111  	App        *app.App
   112  	BaseRoutes *Routes
   113  }
   114  
   115  func Init(a *app.App, root *mux.Router, full bool) *API {
   116  	api := &API{
   117  		App:        a,
   118  		BaseRoutes: &Routes{},
   119  	}
   120  
   121  	api.BaseRoutes.Root = root
   122  	api.BaseRoutes.ApiRoot = root.PathPrefix(model.API_URL_SUFFIX).Subrouter()
   123  
   124  	api.BaseRoutes.Users = api.BaseRoutes.ApiRoot.PathPrefix("/users").Subrouter()
   125  	api.BaseRoutes.User = api.BaseRoutes.ApiRoot.PathPrefix("/users/{user_id:[A-Za-z0-9]+}").Subrouter()
   126  	api.BaseRoutes.UserByUsername = api.BaseRoutes.Users.PathPrefix("/username/{username:[A-Za-z0-9\\_\\-\\.]+}").Subrouter()
   127  	api.BaseRoutes.UserByEmail = api.BaseRoutes.Users.PathPrefix("/email/{email}").Subrouter()
   128  
   129  	api.BaseRoutes.Teams = api.BaseRoutes.ApiRoot.PathPrefix("/teams").Subrouter()
   130  	api.BaseRoutes.TeamsForUser = api.BaseRoutes.User.PathPrefix("/teams").Subrouter()
   131  	api.BaseRoutes.Team = api.BaseRoutes.Teams.PathPrefix("/{team_id:[A-Za-z0-9]+}").Subrouter()
   132  	api.BaseRoutes.TeamForUser = api.BaseRoutes.TeamsForUser.PathPrefix("/{team_id:[A-Za-z0-9]+}").Subrouter()
   133  	api.BaseRoutes.TeamByName = api.BaseRoutes.Teams.PathPrefix("/name/{team_name:[A-Za-z0-9_-]+}").Subrouter()
   134  	api.BaseRoutes.TeamMembers = api.BaseRoutes.Team.PathPrefix("/members").Subrouter()
   135  	api.BaseRoutes.TeamMember = api.BaseRoutes.TeamMembers.PathPrefix("/{user_id:[A-Za-z0-9]+}").Subrouter()
   136  	api.BaseRoutes.TeamMembersForUser = api.BaseRoutes.User.PathPrefix("/teams/members").Subrouter()
   137  
   138  	api.BaseRoutes.Channels = api.BaseRoutes.ApiRoot.PathPrefix("/channels").Subrouter()
   139  	api.BaseRoutes.Channel = api.BaseRoutes.Channels.PathPrefix("/{channel_id:[A-Za-z0-9]+}").Subrouter()
   140  	api.BaseRoutes.ChannelForUser = api.BaseRoutes.User.PathPrefix("/channels/{channel_id:[A-Za-z0-9]+}").Subrouter()
   141  	api.BaseRoutes.ChannelByName = api.BaseRoutes.Team.PathPrefix("/channels/name/{channel_name:[A-Za-z0-9_-]+}").Subrouter()
   142  	api.BaseRoutes.ChannelByNameForTeamName = api.BaseRoutes.TeamByName.PathPrefix("/channels/name/{channel_name:[A-Za-z0-9_-]+}").Subrouter()
   143  	api.BaseRoutes.ChannelsForTeam = api.BaseRoutes.Team.PathPrefix("/channels").Subrouter()
   144  	api.BaseRoutes.ChannelMembers = api.BaseRoutes.Channel.PathPrefix("/members").Subrouter()
   145  	api.BaseRoutes.ChannelMember = api.BaseRoutes.ChannelMembers.PathPrefix("/{user_id:[A-Za-z0-9]+}").Subrouter()
   146  	api.BaseRoutes.ChannelMembersForUser = api.BaseRoutes.User.PathPrefix("/teams/{team_id:[A-Za-z0-9]+}/channels/members").Subrouter()
   147  
   148  	api.BaseRoutes.Posts = api.BaseRoutes.ApiRoot.PathPrefix("/posts").Subrouter()
   149  	api.BaseRoutes.Post = api.BaseRoutes.Posts.PathPrefix("/{post_id:[A-Za-z0-9]+}").Subrouter()
   150  	api.BaseRoutes.PostsForChannel = api.BaseRoutes.Channel.PathPrefix("/posts").Subrouter()
   151  	api.BaseRoutes.PostsForUser = api.BaseRoutes.User.PathPrefix("/posts").Subrouter()
   152  	api.BaseRoutes.PostForUser = api.BaseRoutes.PostsForUser.PathPrefix("/{post_id:[A-Za-z0-9]+}").Subrouter()
   153  
   154  	api.BaseRoutes.Files = api.BaseRoutes.ApiRoot.PathPrefix("/files").Subrouter()
   155  	api.BaseRoutes.File = api.BaseRoutes.Files.PathPrefix("/{file_id:[A-Za-z0-9]+}").Subrouter()
   156  	api.BaseRoutes.PublicFile = api.BaseRoutes.Root.PathPrefix("/files/{file_id:[A-Za-z0-9]+}/public").Subrouter()
   157  
   158  	api.BaseRoutes.Plugins = api.BaseRoutes.ApiRoot.PathPrefix("/plugins").Subrouter()
   159  	api.BaseRoutes.Plugin = api.BaseRoutes.Plugins.PathPrefix("/{plugin_id:[A-Za-z0-9\\_\\-\\.]+}").Subrouter()
   160  
   161  	api.BaseRoutes.Commands = api.BaseRoutes.ApiRoot.PathPrefix("/commands").Subrouter()
   162  	api.BaseRoutes.Command = api.BaseRoutes.Commands.PathPrefix("/{command_id:[A-Za-z0-9]+}").Subrouter()
   163  
   164  	api.BaseRoutes.Hooks = api.BaseRoutes.ApiRoot.PathPrefix("/hooks").Subrouter()
   165  	api.BaseRoutes.IncomingHooks = api.BaseRoutes.Hooks.PathPrefix("/incoming").Subrouter()
   166  	api.BaseRoutes.IncomingHook = api.BaseRoutes.IncomingHooks.PathPrefix("/{hook_id:[A-Za-z0-9]+}").Subrouter()
   167  	api.BaseRoutes.OutgoingHooks = api.BaseRoutes.Hooks.PathPrefix("/outgoing").Subrouter()
   168  	api.BaseRoutes.OutgoingHook = api.BaseRoutes.OutgoingHooks.PathPrefix("/{hook_id:[A-Za-z0-9]+}").Subrouter()
   169  
   170  	api.BaseRoutes.SAML = api.BaseRoutes.ApiRoot.PathPrefix("/saml").Subrouter()
   171  
   172  	api.BaseRoutes.OAuth = api.BaseRoutes.ApiRoot.PathPrefix("/oauth").Subrouter()
   173  	api.BaseRoutes.OAuthApps = api.BaseRoutes.OAuth.PathPrefix("/apps").Subrouter()
   174  	api.BaseRoutes.OAuthApp = api.BaseRoutes.OAuthApps.PathPrefix("/{app_id:[A-Za-z0-9]+}").Subrouter()
   175  
   176  	api.BaseRoutes.Compliance = api.BaseRoutes.ApiRoot.PathPrefix("/compliance").Subrouter()
   177  	api.BaseRoutes.Cluster = api.BaseRoutes.ApiRoot.PathPrefix("/cluster").Subrouter()
   178  	api.BaseRoutes.LDAP = api.BaseRoutes.ApiRoot.PathPrefix("/ldap").Subrouter()
   179  	api.BaseRoutes.Brand = api.BaseRoutes.ApiRoot.PathPrefix("/brand").Subrouter()
   180  	api.BaseRoutes.System = api.BaseRoutes.ApiRoot.PathPrefix("/system").Subrouter()
   181  	api.BaseRoutes.Preferences = api.BaseRoutes.User.PathPrefix("/preferences").Subrouter()
   182  	api.BaseRoutes.License = api.BaseRoutes.ApiRoot.PathPrefix("/license").Subrouter()
   183  	api.BaseRoutes.Public = api.BaseRoutes.ApiRoot.PathPrefix("/public").Subrouter()
   184  	api.BaseRoutes.Reactions = api.BaseRoutes.ApiRoot.PathPrefix("/reactions").Subrouter()
   185  	api.BaseRoutes.Jobs = api.BaseRoutes.ApiRoot.PathPrefix("/jobs").Subrouter()
   186  	api.BaseRoutes.Elasticsearch = api.BaseRoutes.ApiRoot.PathPrefix("/elasticsearch").Subrouter()
   187  	api.BaseRoutes.DataRetention = api.BaseRoutes.ApiRoot.PathPrefix("/data_retention").Subrouter()
   188  
   189  	api.BaseRoutes.Emojis = api.BaseRoutes.ApiRoot.PathPrefix("/emoji").Subrouter()
   190  	api.BaseRoutes.Emoji = api.BaseRoutes.ApiRoot.PathPrefix("/emoji/{emoji_id:[A-Za-z0-9]+}").Subrouter()
   191  	api.BaseRoutes.EmojiByName = api.BaseRoutes.Emojis.PathPrefix("/name/{emoji_name:[A-Za-z0-9\\_\\-\\+]+}").Subrouter()
   192  
   193  	api.BaseRoutes.ReactionByNameForPostForUser = api.BaseRoutes.PostForUser.PathPrefix("/reactions/{emoji_name:[A-Za-z0-9\\_\\-\\+]+}").Subrouter()
   194  
   195  	api.BaseRoutes.Webrtc = api.BaseRoutes.ApiRoot.PathPrefix("/webrtc").Subrouter()
   196  
   197  	api.BaseRoutes.OpenGraph = api.BaseRoutes.ApiRoot.PathPrefix("/opengraph").Subrouter()
   198  
   199  	api.BaseRoutes.Image = api.BaseRoutes.ApiRoot.PathPrefix("/image").Subrouter()
   200  
   201  	api.InitUser()
   202  	api.InitTeam()
   203  	api.InitChannel()
   204  	api.InitPost()
   205  	api.InitFile()
   206  	api.InitSystem()
   207  	api.InitWebhook()
   208  	api.InitPreference()
   209  	api.InitSaml()
   210  	api.InitCompliance()
   211  	api.InitCluster()
   212  	api.InitLdap()
   213  	api.InitElasticsearch()
   214  	api.InitDataRetention()
   215  	api.InitBrand()
   216  	api.InitJob()
   217  	api.InitCommand()
   218  	api.InitStatus()
   219  	api.InitWebSocket()
   220  	api.InitEmoji()
   221  	api.InitOAuth()
   222  	api.InitReaction()
   223  	api.InitWebrtc()
   224  	api.InitOpenGraph()
   225  	api.InitPlugin()
   226  	api.InitImage()
   227  
   228  	root.Handle("/api/v4/{anything:.*}", http.HandlerFunc(Handle404))
   229  
   230  	// REMOVE CONDITION WHEN APIv3 REMOVED
   231  	if full {
   232  		a.InitEmailBatching()
   233  	}
   234  
   235  	return api
   236  }
   237  
   238  func Handle404(w http.ResponseWriter, r *http.Request) {
   239  	err := model.NewAppError("Handle404", "api.context.404.app_error", nil, "", http.StatusNotFound)
   240  
   241  	l4g.Debug("%v: code=404 ip=%v", r.URL.Path, utils.GetIpAddress(r))
   242  
   243  	w.WriteHeader(err.StatusCode)
   244  	err.DetailedError = "There doesn't appear to be an api call for the url='" + r.URL.Path + "'."
   245  	w.Write([]byte(err.ToJson()))
   246  }
   247  
   248  func ReturnStatusOK(w http.ResponseWriter) {
   249  	m := make(map[string]string)
   250  	m[model.STATUS] = model.STATUS_OK
   251  	w.Write([]byte(model.MapToJson(m)))
   252  }