1// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2// See LICENSE.txt for license information. 3 4package api4 5 6import ( 7 "net/http" 8 9 "github.com/gorilla/mux" 10 _ "github.com/mattermost/go-i18n/i18n" 11 12 "github.com/mattermost/mattermost-server/v6/app" 13 "github.com/mattermost/mattermost-server/v6/model" 14 "github.com/mattermost/mattermost-server/v6/web" 15) 16 17type Routes struct { 18 Root *mux.Router // '' 19 APIRoot *mux.Router // 'api/v4' 20 21 Users *mux.Router // 'api/v4/users' 22 User *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}' 23 UserByUsername *mux.Router // 'api/v4/users/username/{username:[A-Za-z0-9\\_\\-\\.]+}' 24 UserByEmail *mux.Router // 'api/v4/users/email/{email:.+}' 25 26 Bots *mux.Router // 'api/v4/bots' 27 Bot *mux.Router // 'api/v4/bots/{bot_user_id:[A-Za-z0-9]+}' 28 29 Teams *mux.Router // 'api/v4/teams' 30 TeamsForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams' 31 Team *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9]+}' 32 TeamForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams/{team_id:[A-Za-z0-9]+}' 33 UserThreads *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams/{team_id:[A-Za-z0-9]+}/threads' 34 UserThread *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams/{team_id:[A-Za-z0-9]+}/threads/{thread_id:[A-Za-z0-9]+}' 35 TeamByName *mux.Router // 'api/v4/teams/name/{team_name:[A-Za-z0-9_-]+}' 36 TeamMembers *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9]+}/members' 37 TeamMember *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9]+}/members/{user_id:[A-Za-z0-9]+}' 38 TeamMembersForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams/members' 39 40 Channels *mux.Router // 'api/v4/channels' 41 Channel *mux.Router // 'api/v4/channels/{channel_id:[A-Za-z0-9]+}' 42 ChannelForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/channels/{channel_id:[A-Za-z0-9]+}' 43 ChannelByName *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9]+}/channels/name/{channel_name:[A-Za-z0-9_-]+}' 44 ChannelByNameForTeamName *mux.Router // 'api/v4/teams/name/{team_name:[A-Za-z0-9_-]+}/channels/name/{channel_name:[A-Za-z0-9_-]+}' 45 ChannelsForTeam *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9]+}/channels' 46 ChannelMembers *mux.Router // 'api/v4/channels/{channel_id:[A-Za-z0-9]+}/members' 47 ChannelMember *mux.Router // 'api/v4/channels/{channel_id:[A-Za-z0-9]+}/members/{user_id:[A-Za-z0-9]+}' 48 ChannelMembersForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams/{team_id:[A-Za-z0-9]+}/channels/members' 49 ChannelModerations *mux.Router // 'api/v4/channels/{channel_id:[A-Za-z0-9]+}/moderations' 50 ChannelCategories *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams/{team_id:[A-Za-z0-9]+}/channels/categories' 51 52 Posts *mux.Router // 'api/v4/posts' 53 Post *mux.Router // 'api/v4/posts/{post_id:[A-Za-z0-9]+}' 54 PostsForChannel *mux.Router // 'api/v4/channels/{channel_id:[A-Za-z0-9]+}/posts' 55 PostsForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/posts' 56 PostForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/posts/{post_id:[A-Za-z0-9]+}' 57 58 Files *mux.Router // 'api/v4/files' 59 File *mux.Router // 'api/v4/files/{file_id:[A-Za-z0-9]+}' 60 61 Uploads *mux.Router // 'api/v4/uploads' 62 Upload *mux.Router // 'api/v4/uploads/{upload_id:[A-Za-z0-9]+}' 63 64 Plugins *mux.Router // 'api/v4/plugins' 65 Plugin *mux.Router // 'api/v4/plugins/{plugin_id:[A-Za-z0-9\\_\\-\\.]+}' 66 67 PublicFile *mux.Router // '/files/{file_id:[A-Za-z0-9]+}/public' 68 69 Commands *mux.Router // 'api/v4/commands' 70 Command *mux.Router // 'api/v4/commands/{command_id:[A-Za-z0-9]+}' 71 72 Hooks *mux.Router // 'api/v4/hooks' 73 IncomingHooks *mux.Router // 'api/v4/hooks/incoming' 74 IncomingHook *mux.Router // 'api/v4/hooks/incoming/{hook_id:[A-Za-z0-9]+}' 75 OutgoingHooks *mux.Router // 'api/v4/hooks/outgoing' 76 OutgoingHook *mux.Router // 'api/v4/hooks/outgoing/{hook_id:[A-Za-z0-9]+}' 77 78 OAuth *mux.Router // 'api/v4/oauth' 79 OAuthApps *mux.Router // 'api/v4/oauth/apps' 80 OAuthApp *mux.Router // 'api/v4/oauth/apps/{app_id:[A-Za-z0-9]+}' 81 82 OpenGraph *mux.Router // 'api/v4/opengraph' 83 84 SAML *mux.Router // 'api/v4/saml' 85 Compliance *mux.Router // 'api/v4/compliance' 86 Cluster *mux.Router // 'api/v4/cluster' 87 88 Image *mux.Router // 'api/v4/image' 89 90 LDAP *mux.Router // 'api/v4/ldap' 91 92 Elasticsearch *mux.Router // 'api/v4/elasticsearch' 93 94 Bleve *mux.Router // 'api/v4/bleve' 95 96 DataRetention *mux.Router // 'api/v4/data_retention' 97 98 Brand *mux.Router // 'api/v4/brand' 99 100 System *mux.Router // 'api/v4/system' 101 102 Jobs *mux.Router // 'api/v4/jobs' 103 104 Preferences *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/preferences' 105 106 License *mux.Router // 'api/v4/license' 107 108 Public *mux.Router // 'api/v4/public' 109 110 Reactions *mux.Router // 'api/v4/reactions' 111 112 Roles *mux.Router // 'api/v4/roles' 113 Schemes *mux.Router // 'api/v4/schemes' 114 115 Emojis *mux.Router // 'api/v4/emoji' 116 Emoji *mux.Router // 'api/v4/emoji/{emoji_id:[A-Za-z0-9]+}' 117 EmojiByName *mux.Router // 'api/v4/emoji/name/{emoji_name:[A-Za-z0-9\\_\\-\\+]+}' 118 119 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\\_\\-\\+]+}' 120 121 TermsOfService *mux.Router // 'api/v4/terms_of_service' 122 Groups *mux.Router // 'api/v4/groups' 123 124 Cloud *mux.Router // 'api/v4/cloud' 125 126 Imports *mux.Router // 'api/v4/imports' 127 128 Exports *mux.Router // 'api/v4/exports' 129 Export *mux.Router // 'api/v4/exports/{export_name:.+\\.zip}' 130 131 RemoteCluster *mux.Router // 'api/v4/remotecluster' 132 SharedChannels *mux.Router // 'api/v4/sharedchannels' 133 134 Permissions *mux.Router // 'api/v4/permissions' 135} 136 137type API struct { 138 app app.AppIface 139 BaseRoutes *Routes 140} 141 142func Init(a app.AppIface, root *mux.Router) *API { 143 api := &API{ 144 app: a, 145 BaseRoutes: &Routes{}, 146 } 147 148 api.BaseRoutes.Root = root 149 api.BaseRoutes.APIRoot = root.PathPrefix(model.APIURLSuffix).Subrouter() 150 151 api.BaseRoutes.Users = api.BaseRoutes.APIRoot.PathPrefix("/users").Subrouter() 152 api.BaseRoutes.User = api.BaseRoutes.APIRoot.PathPrefix("/users/{user_id:[A-Za-z0-9]+}").Subrouter() 153 api.BaseRoutes.UserByUsername = api.BaseRoutes.Users.PathPrefix("/username/{username:[A-Za-z0-9\\_\\-\\.]+}").Subrouter() 154 api.BaseRoutes.UserByEmail = api.BaseRoutes.Users.PathPrefix("/email/{email:.+}").Subrouter() 155 156 api.BaseRoutes.Bots = api.BaseRoutes.APIRoot.PathPrefix("/bots").Subrouter() 157 api.BaseRoutes.Bot = api.BaseRoutes.APIRoot.PathPrefix("/bots/{bot_user_id:[A-Za-z0-9]+}").Subrouter() 158 159 api.BaseRoutes.Teams = api.BaseRoutes.APIRoot.PathPrefix("/teams").Subrouter() 160 api.BaseRoutes.TeamsForUser = api.BaseRoutes.User.PathPrefix("/teams").Subrouter() 161 api.BaseRoutes.Team = api.BaseRoutes.Teams.PathPrefix("/{team_id:[A-Za-z0-9]+}").Subrouter() 162 api.BaseRoutes.TeamForUser = api.BaseRoutes.TeamsForUser.PathPrefix("/{team_id:[A-Za-z0-9]+}").Subrouter() 163 api.BaseRoutes.UserThreads = api.BaseRoutes.TeamForUser.PathPrefix("/threads").Subrouter() 164 api.BaseRoutes.UserThread = api.BaseRoutes.TeamForUser.PathPrefix("/threads/{thread_id:[A-Za-z0-9]+}").Subrouter() 165 api.BaseRoutes.TeamByName = api.BaseRoutes.Teams.PathPrefix("/name/{team_name:[A-Za-z0-9_-]+}").Subrouter() 166 api.BaseRoutes.TeamMembers = api.BaseRoutes.Team.PathPrefix("/members").Subrouter() 167 api.BaseRoutes.TeamMember = api.BaseRoutes.TeamMembers.PathPrefix("/{user_id:[A-Za-z0-9]+}").Subrouter() 168 api.BaseRoutes.TeamMembersForUser = api.BaseRoutes.User.PathPrefix("/teams/members").Subrouter() 169 170 api.BaseRoutes.Channels = api.BaseRoutes.APIRoot.PathPrefix("/channels").Subrouter() 171 api.BaseRoutes.Channel = api.BaseRoutes.Channels.PathPrefix("/{channel_id:[A-Za-z0-9]+}").Subrouter() 172 api.BaseRoutes.ChannelForUser = api.BaseRoutes.User.PathPrefix("/channels/{channel_id:[A-Za-z0-9]+}").Subrouter() 173 api.BaseRoutes.ChannelByName = api.BaseRoutes.Team.PathPrefix("/channels/name/{channel_name:[A-Za-z0-9_-]+}").Subrouter() 174 api.BaseRoutes.ChannelByNameForTeamName = api.BaseRoutes.TeamByName.PathPrefix("/channels/name/{channel_name:[A-Za-z0-9_-]+}").Subrouter() 175 api.BaseRoutes.ChannelsForTeam = api.BaseRoutes.Team.PathPrefix("/channels").Subrouter() 176 api.BaseRoutes.ChannelMembers = api.BaseRoutes.Channel.PathPrefix("/members").Subrouter() 177 api.BaseRoutes.ChannelMember = api.BaseRoutes.ChannelMembers.PathPrefix("/{user_id:[A-Za-z0-9]+}").Subrouter() 178 api.BaseRoutes.ChannelMembersForUser = api.BaseRoutes.User.PathPrefix("/teams/{team_id:[A-Za-z0-9]+}/channels/members").Subrouter() 179 api.BaseRoutes.ChannelModerations = api.BaseRoutes.Channel.PathPrefix("/moderations").Subrouter() 180 api.BaseRoutes.ChannelCategories = api.BaseRoutes.User.PathPrefix("/teams/{team_id:[A-Za-z0-9]+}/channels/categories").Subrouter() 181 182 api.BaseRoutes.Posts = api.BaseRoutes.APIRoot.PathPrefix("/posts").Subrouter() 183 api.BaseRoutes.Post = api.BaseRoutes.Posts.PathPrefix("/{post_id:[A-Za-z0-9]+}").Subrouter() 184 api.BaseRoutes.PostsForChannel = api.BaseRoutes.Channel.PathPrefix("/posts").Subrouter() 185 api.BaseRoutes.PostsForUser = api.BaseRoutes.User.PathPrefix("/posts").Subrouter() 186 api.BaseRoutes.PostForUser = api.BaseRoutes.PostsForUser.PathPrefix("/{post_id:[A-Za-z0-9]+}").Subrouter() 187 188 api.BaseRoutes.Files = api.BaseRoutes.APIRoot.PathPrefix("/files").Subrouter() 189 api.BaseRoutes.File = api.BaseRoutes.Files.PathPrefix("/{file_id:[A-Za-z0-9]+}").Subrouter() 190 api.BaseRoutes.PublicFile = api.BaseRoutes.Root.PathPrefix("/files/{file_id:[A-Za-z0-9]+}/public").Subrouter() 191 192 api.BaseRoutes.Uploads = api.BaseRoutes.APIRoot.PathPrefix("/uploads").Subrouter() 193 api.BaseRoutes.Upload = api.BaseRoutes.Uploads.PathPrefix("/{upload_id:[A-Za-z0-9]+}").Subrouter() 194 195 api.BaseRoutes.Plugins = api.BaseRoutes.APIRoot.PathPrefix("/plugins").Subrouter() 196 api.BaseRoutes.Plugin = api.BaseRoutes.Plugins.PathPrefix("/{plugin_id:[A-Za-z0-9\\_\\-\\.]+}").Subrouter() 197 198 api.BaseRoutes.Commands = api.BaseRoutes.APIRoot.PathPrefix("/commands").Subrouter() 199 api.BaseRoutes.Command = api.BaseRoutes.Commands.PathPrefix("/{command_id:[A-Za-z0-9]+}").Subrouter() 200 201 api.BaseRoutes.Hooks = api.BaseRoutes.APIRoot.PathPrefix("/hooks").Subrouter() 202 api.BaseRoutes.IncomingHooks = api.BaseRoutes.Hooks.PathPrefix("/incoming").Subrouter() 203 api.BaseRoutes.IncomingHook = api.BaseRoutes.IncomingHooks.PathPrefix("/{hook_id:[A-Za-z0-9]+}").Subrouter() 204 api.BaseRoutes.OutgoingHooks = api.BaseRoutes.Hooks.PathPrefix("/outgoing").Subrouter() 205 api.BaseRoutes.OutgoingHook = api.BaseRoutes.OutgoingHooks.PathPrefix("/{hook_id:[A-Za-z0-9]+}").Subrouter() 206 207 api.BaseRoutes.SAML = api.BaseRoutes.APIRoot.PathPrefix("/saml").Subrouter() 208 209 api.BaseRoutes.OAuth = api.BaseRoutes.APIRoot.PathPrefix("/oauth").Subrouter() 210 api.BaseRoutes.OAuthApps = api.BaseRoutes.OAuth.PathPrefix("/apps").Subrouter() 211 api.BaseRoutes.OAuthApp = api.BaseRoutes.OAuthApps.PathPrefix("/{app_id:[A-Za-z0-9]+}").Subrouter() 212 213 api.BaseRoutes.Compliance = api.BaseRoutes.APIRoot.PathPrefix("/compliance").Subrouter() 214 api.BaseRoutes.Cluster = api.BaseRoutes.APIRoot.PathPrefix("/cluster").Subrouter() 215 api.BaseRoutes.LDAP = api.BaseRoutes.APIRoot.PathPrefix("/ldap").Subrouter() 216 api.BaseRoutes.Brand = api.BaseRoutes.APIRoot.PathPrefix("/brand").Subrouter() 217 api.BaseRoutes.System = api.BaseRoutes.APIRoot.PathPrefix("/system").Subrouter() 218 api.BaseRoutes.Preferences = api.BaseRoutes.User.PathPrefix("/preferences").Subrouter() 219 api.BaseRoutes.License = api.BaseRoutes.APIRoot.PathPrefix("/license").Subrouter() 220 api.BaseRoutes.Public = api.BaseRoutes.APIRoot.PathPrefix("/public").Subrouter() 221 api.BaseRoutes.Reactions = api.BaseRoutes.APIRoot.PathPrefix("/reactions").Subrouter() 222 api.BaseRoutes.Jobs = api.BaseRoutes.APIRoot.PathPrefix("/jobs").Subrouter() 223 api.BaseRoutes.Elasticsearch = api.BaseRoutes.APIRoot.PathPrefix("/elasticsearch").Subrouter() 224 api.BaseRoutes.Bleve = api.BaseRoutes.APIRoot.PathPrefix("/bleve").Subrouter() 225 api.BaseRoutes.DataRetention = api.BaseRoutes.APIRoot.PathPrefix("/data_retention").Subrouter() 226 227 api.BaseRoutes.Emojis = api.BaseRoutes.APIRoot.PathPrefix("/emoji").Subrouter() 228 api.BaseRoutes.Emoji = api.BaseRoutes.APIRoot.PathPrefix("/emoji/{emoji_id:[A-Za-z0-9]+}").Subrouter() 229 api.BaseRoutes.EmojiByName = api.BaseRoutes.Emojis.PathPrefix("/name/{emoji_name:[A-Za-z0-9\\_\\-\\+]+}").Subrouter() 230 231 api.BaseRoutes.ReactionByNameForPostForUser = api.BaseRoutes.PostForUser.PathPrefix("/reactions/{emoji_name:[A-Za-z0-9\\_\\-\\+]+}").Subrouter() 232 233 api.BaseRoutes.OpenGraph = api.BaseRoutes.APIRoot.PathPrefix("/opengraph").Subrouter() 234 235 api.BaseRoutes.Roles = api.BaseRoutes.APIRoot.PathPrefix("/roles").Subrouter() 236 api.BaseRoutes.Schemes = api.BaseRoutes.APIRoot.PathPrefix("/schemes").Subrouter() 237 238 api.BaseRoutes.Image = api.BaseRoutes.APIRoot.PathPrefix("/image").Subrouter() 239 240 api.BaseRoutes.TermsOfService = api.BaseRoutes.APIRoot.PathPrefix("/terms_of_service").Subrouter() 241 api.BaseRoutes.Groups = api.BaseRoutes.APIRoot.PathPrefix("/groups").Subrouter() 242 243 api.BaseRoutes.Cloud = api.BaseRoutes.APIRoot.PathPrefix("/cloud").Subrouter() 244 245 api.BaseRoutes.Imports = api.BaseRoutes.APIRoot.PathPrefix("/imports").Subrouter() 246 api.BaseRoutes.Exports = api.BaseRoutes.APIRoot.PathPrefix("/exports").Subrouter() 247 api.BaseRoutes.Export = api.BaseRoutes.Exports.PathPrefix("/{export_name:.+\\.zip}").Subrouter() 248 249 api.BaseRoutes.RemoteCluster = api.BaseRoutes.APIRoot.PathPrefix("/remotecluster").Subrouter() 250 api.BaseRoutes.SharedChannels = api.BaseRoutes.APIRoot.PathPrefix("/sharedchannels").Subrouter() 251 252 api.BaseRoutes.Permissions = api.BaseRoutes.APIRoot.PathPrefix("/permissions").Subrouter() 253 254 api.InitUser() 255 api.InitBot() 256 api.InitTeam() 257 api.InitChannel() 258 api.InitPost() 259 api.InitFile() 260 api.InitUpload() 261 api.InitSystem() 262 api.InitLicense() 263 api.InitConfig() 264 api.InitWebhook() 265 api.InitPreference() 266 api.InitSaml() 267 api.InitCompliance() 268 api.InitCluster() 269 api.InitLdap() 270 api.InitElasticsearch() 271 api.InitBleve() 272 api.InitDataRetention() 273 api.InitBrand() 274 api.InitJob() 275 api.InitCommand() 276 api.InitStatus() 277 api.InitWebSocket() 278 api.InitEmoji() 279 api.InitOAuth() 280 api.InitReaction() 281 api.InitOpenGraph() 282 api.InitPlugin() 283 api.InitRole() 284 api.InitScheme() 285 api.InitImage() 286 api.InitTermsOfService() 287 api.InitGroup() 288 api.InitAction() 289 api.InitCloud() 290 api.InitImport() 291 api.InitRemoteCluster() 292 api.InitSharedChannels() 293 api.InitPermissions() 294 api.InitExport() 295 296 root.Handle("/api/v4/{anything:.*}", http.HandlerFunc(api.Handle404)) 297 298 return api 299} 300 301func InitLocal(a app.AppIface, root *mux.Router) *API { 302 api := &API{ 303 app: a, 304 BaseRoutes: &Routes{}, 305 } 306 307 api.BaseRoutes.Root = root 308 api.BaseRoutes.APIRoot = root.PathPrefix(model.APIURLSuffix).Subrouter() 309 310 api.BaseRoutes.Users = api.BaseRoutes.APIRoot.PathPrefix("/users").Subrouter() 311 api.BaseRoutes.User = api.BaseRoutes.Users.PathPrefix("/{user_id:[A-Za-z0-9]+}").Subrouter() 312 api.BaseRoutes.UserByUsername = api.BaseRoutes.Users.PathPrefix("/username/{username:[A-Za-z0-9\\_\\-\\.]+}").Subrouter() 313 api.BaseRoutes.UserByEmail = api.BaseRoutes.Users.PathPrefix("/email/{email:.+}").Subrouter() 314 315 api.BaseRoutes.Bots = api.BaseRoutes.APIRoot.PathPrefix("/bots").Subrouter() 316 api.BaseRoutes.Bot = api.BaseRoutes.APIRoot.PathPrefix("/bots/{bot_user_id:[A-Za-z0-9]+}").Subrouter() 317 318 api.BaseRoutes.Teams = api.BaseRoutes.APIRoot.PathPrefix("/teams").Subrouter() 319 api.BaseRoutes.Team = api.BaseRoutes.Teams.PathPrefix("/{team_id:[A-Za-z0-9]+}").Subrouter() 320 api.BaseRoutes.TeamByName = api.BaseRoutes.Teams.PathPrefix("/name/{team_name:[A-Za-z0-9_-]+}").Subrouter() 321 api.BaseRoutes.TeamMembers = api.BaseRoutes.Team.PathPrefix("/members").Subrouter() 322 api.BaseRoutes.TeamMember = api.BaseRoutes.TeamMembers.PathPrefix("/{user_id:[A-Za-z0-9]+}").Subrouter() 323 324 api.BaseRoutes.Channels = api.BaseRoutes.APIRoot.PathPrefix("/channels").Subrouter() 325 api.BaseRoutes.Channel = api.BaseRoutes.Channels.PathPrefix("/{channel_id:[A-Za-z0-9]+}").Subrouter() 326 api.BaseRoutes.ChannelByName = api.BaseRoutes.Team.PathPrefix("/channels/name/{channel_name:[A-Za-z0-9_-]+}").Subrouter() 327 328 api.BaseRoutes.ChannelByNameForTeamName = api.BaseRoutes.TeamByName.PathPrefix("/channels/name/{channel_name:[A-Za-z0-9_-]+}").Subrouter() 329 api.BaseRoutes.ChannelsForTeam = api.BaseRoutes.Team.PathPrefix("/channels").Subrouter() 330 api.BaseRoutes.ChannelMembers = api.BaseRoutes.Channel.PathPrefix("/members").Subrouter() 331 api.BaseRoutes.ChannelMember = api.BaseRoutes.ChannelMembers.PathPrefix("/{user_id:[A-Za-z0-9]+}").Subrouter() 332 api.BaseRoutes.ChannelMembersForUser = api.BaseRoutes.User.PathPrefix("/teams/{team_id:[A-Za-z0-9]+}/channels/members").Subrouter() 333 334 api.BaseRoutes.Plugins = api.BaseRoutes.APIRoot.PathPrefix("/plugins").Subrouter() 335 api.BaseRoutes.Plugin = api.BaseRoutes.Plugins.PathPrefix("/{plugin_id:[A-Za-z0-9\\_\\-\\.]+}").Subrouter() 336 337 api.BaseRoutes.Commands = api.BaseRoutes.APIRoot.PathPrefix("/commands").Subrouter() 338 api.BaseRoutes.Command = api.BaseRoutes.Commands.PathPrefix("/{command_id:[A-Za-z0-9]+}").Subrouter() 339 340 api.BaseRoutes.Hooks = api.BaseRoutes.APIRoot.PathPrefix("/hooks").Subrouter() 341 api.BaseRoutes.IncomingHooks = api.BaseRoutes.Hooks.PathPrefix("/incoming").Subrouter() 342 api.BaseRoutes.IncomingHook = api.BaseRoutes.IncomingHooks.PathPrefix("/{hook_id:[A-Za-z0-9]+}").Subrouter() 343 api.BaseRoutes.OutgoingHooks = api.BaseRoutes.Hooks.PathPrefix("/outgoing").Subrouter() 344 api.BaseRoutes.OutgoingHook = api.BaseRoutes.OutgoingHooks.PathPrefix("/{hook_id:[A-Za-z0-9]+}").Subrouter() 345 346 api.BaseRoutes.License = api.BaseRoutes.APIRoot.PathPrefix("/license").Subrouter() 347 348 api.BaseRoutes.Groups = api.BaseRoutes.APIRoot.PathPrefix("/groups").Subrouter() 349 350 api.BaseRoutes.LDAP = api.BaseRoutes.APIRoot.PathPrefix("/ldap").Subrouter() 351 api.BaseRoutes.System = api.BaseRoutes.APIRoot.PathPrefix("/system").Subrouter() 352 api.BaseRoutes.Posts = api.BaseRoutes.APIRoot.PathPrefix("/posts").Subrouter() 353 api.BaseRoutes.Post = api.BaseRoutes.Posts.PathPrefix("/{post_id:[A-Za-z0-9]+}").Subrouter() 354 api.BaseRoutes.PostsForChannel = api.BaseRoutes.Channel.PathPrefix("/posts").Subrouter() 355 356 api.BaseRoutes.Roles = api.BaseRoutes.APIRoot.PathPrefix("/roles").Subrouter() 357 358 api.BaseRoutes.Uploads = api.BaseRoutes.APIRoot.PathPrefix("/uploads").Subrouter() 359 api.BaseRoutes.Upload = api.BaseRoutes.Uploads.PathPrefix("/{upload_id:[A-Za-z0-9]+}").Subrouter() 360 361 api.BaseRoutes.Imports = api.BaseRoutes.APIRoot.PathPrefix("/imports").Subrouter() 362 api.BaseRoutes.Exports = api.BaseRoutes.APIRoot.PathPrefix("/exports").Subrouter() 363 api.BaseRoutes.Export = api.BaseRoutes.Exports.PathPrefix("/{export_name:.+\\.zip}").Subrouter() 364 365 api.BaseRoutes.Jobs = api.BaseRoutes.APIRoot.PathPrefix("/jobs").Subrouter() 366 367 api.BaseRoutes.SAML = api.BaseRoutes.APIRoot.PathPrefix("/saml").Subrouter() 368 369 api.InitUserLocal() 370 api.InitTeamLocal() 371 api.InitChannelLocal() 372 api.InitConfigLocal() 373 api.InitWebhookLocal() 374 api.InitPluginLocal() 375 api.InitCommandLocal() 376 api.InitLicenseLocal() 377 api.InitBotLocal() 378 api.InitGroupLocal() 379 api.InitLdapLocal() 380 api.InitSystemLocal() 381 api.InitPostLocal() 382 api.InitRoleLocal() 383 api.InitUploadLocal() 384 api.InitImportLocal() 385 api.InitExportLocal() 386 api.InitJobLocal() 387 api.InitSamlLocal() 388 389 root.Handle("/api/v4/{anything:.*}", http.HandlerFunc(api.Handle404)) 390 391 return api 392} 393 394func (api *API) Handle404(w http.ResponseWriter, r *http.Request) { 395 web.Handle404(api.app, w, r) 396} 397 398var ReturnStatusOK = web.ReturnStatusOK 399