github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/api4/api.go (about) 1 // Copyright (c) 2017-present Xenia, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package api4 5 6 import ( 7 "net/http" 8 9 "github.com/gorilla/mux" 10 "github.com/xzl8028/xenia-server/app" 11 "github.com/xzl8028/xenia-server/model" 12 "github.com/xzl8028/xenia-server/services/configservice" 13 "github.com/xzl8028/xenia-server/web" 14 15 _ "github.com/xzl8028/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 Bots *mux.Router // 'api/v4/bots' 28 Bot *mux.Router // 'api/v4/bots/{bot_user_id:[A-Za-z0-9]+}' 29 30 Tasks *mux.Router // 'api/v4/tasks' 31 Task *mux.Router // 'api/v4/taks/{task_id:[A-Za-z0-9]+}' 32 33 Teams *mux.Router // 'api/v4/teams' 34 TeamsForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams' 35 Team *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9]+}' 36 TeamForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams/{team_id:[A-Za-z0-9]+}' 37 TeamByName *mux.Router // 'api/v4/teams/name/{team_name:[A-Za-z0-9_-]+}' 38 TeamMembers *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9_-]+}/members' 39 TeamMember *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9_-]+}/members/{user_id:[A-Za-z0-9_-]+}' 40 TeamMembersForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams/members' 41 42 Channels *mux.Router // 'api/v4/channels' 43 Channel *mux.Router // 'api/v4/channels/{channel_id:[A-Za-z0-9]+}' 44 ChannelForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/channels/{channel_id:[A-Za-z0-9]+}' 45 ChannelByName *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9]+}/channels/name/{channel_name:[A-Za-z0-9_-]+}' 46 ChannelByNameForTeamName *mux.Router // 'api/v4/teams/name/{team_name:[A-Za-z0-9_-]+}/channels/name/{channel_name:[A-Za-z0-9_-]+}' 47 ChannelsForTeam *mux.Router // 'api/v4/teams/{team_id:[A-Za-z0-9]+}/channels' 48 ChannelMembers *mux.Router // 'api/v4/channels/{channel_id:[A-Za-z0-9]+}/members' 49 ChannelMember *mux.Router // 'api/v4/channels/{channel_id:[A-Za-z0-9]+}/members/{user_id:[A-Za-z0-9]+}' 50 ChannelMembersForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/teams/{team_id:[A-Za-z0-9]+}/channels/members' 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 Plugins *mux.Router // 'api/v4/plugins' 62 Plugin *mux.Router // 'api/v4/plugins/{plugin_id:[A-Za-z0-9_-]+}' 63 64 PublicFile *mux.Router // 'files/{file_id:[A-Za-z0-9]+}/public' 65 66 Commands *mux.Router // 'api/v4/commands' 67 Command *mux.Router // 'api/v4/commands/{command_id:[A-Za-z0-9]+}' 68 69 Hooks *mux.Router // 'api/v4/hooks' 70 IncomingHooks *mux.Router // 'api/v4/hooks/incoming' 71 IncomingHook *mux.Router // 'api/v4/hooks/incoming/{hook_id:[A-Za-z0-9]+}' 72 OutgoingHooks *mux.Router // 'api/v4/hooks/outgoing' 73 OutgoingHook *mux.Router // 'api/v4/hooks/outgoing/{hook_id:[A-Za-z0-9]+}' 74 75 OAuth *mux.Router // 'api/v4/oauth' 76 OAuthApps *mux.Router // 'api/v4/oauth/apps' 77 OAuthApp *mux.Router // 'api/v4/oauth/apps/{app_id:[A-Za-z0-9]+}' 78 79 OpenGraph *mux.Router // 'api/v4/opengraph' 80 81 SAML *mux.Router // 'api/v4/saml' 82 Compliance *mux.Router // 'api/v4/compliance' 83 Cluster *mux.Router // 'api/v4/cluster' 84 85 Image *mux.Router // 'api/v4/image' 86 87 LDAP *mux.Router // 'api/v4/ldap' 88 89 Elasticsearch *mux.Router // 'api/v4/elasticsearch' 90 91 DataRetention *mux.Router // 'api/v4/data_retention' 92 93 Brand *mux.Router // 'api/v4/brand' 94 95 System *mux.Router // 'api/v4/system' 96 97 Jobs *mux.Router // 'api/v4/jobs' 98 99 Preferences *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/preferences' 100 101 License *mux.Router // 'api/v4/license' 102 103 Public *mux.Router // 'api/v4/public' 104 105 Reactions *mux.Router // 'api/v4/reactions' 106 107 Roles *mux.Router // 'api/v4/roles' 108 Schemes *mux.Router // 'api/v4/schemes' 109 110 Emojis *mux.Router // 'api/v4/emoji' 111 Emoji *mux.Router // 'api/v4/emoji/{emoji_id:[A-Za-z0-9]+}' 112 EmojiByName *mux.Router // 'api/v4/emoji/name/{emoji_name:[A-Za-z0-9_-\.]+}' 113 114 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_-+]+}' 115 116 TermsOfService *mux.Router // 'api/v4/terms_of_service 117 Groups *mux.Router // 'api/v4/groups' 118 } 119 120 type API struct { 121 ConfigService configservice.ConfigService 122 GetGlobalAppOptions app.AppOptionCreator 123 BaseRoutes *Routes 124 } 125 126 func Init(configservice configservice.ConfigService, globalOptionsFunc app.AppOptionCreator, root *mux.Router) *API { 127 api := &API{ 128 ConfigService: configservice, 129 GetGlobalAppOptions: globalOptionsFunc, 130 BaseRoutes: &Routes{}, 131 } 132 133 api.BaseRoutes.Root = root 134 api.BaseRoutes.ApiRoot = root.PathPrefix(model.API_URL_SUFFIX).Subrouter() 135 136 api.BaseRoutes.Users = api.BaseRoutes.ApiRoot.PathPrefix("/users").Subrouter() 137 api.BaseRoutes.User = api.BaseRoutes.ApiRoot.PathPrefix("/users/{user_id:[A-Za-z0-9]+}").Subrouter() 138 api.BaseRoutes.UserByUsername = api.BaseRoutes.Users.PathPrefix("/username/{username:[A-Za-z0-9\\_\\-\\.]+}").Subrouter() 139 api.BaseRoutes.UserByEmail = api.BaseRoutes.Users.PathPrefix("/email/{email}").Subrouter() 140 141 api.BaseRoutes.Bots = api.BaseRoutes.ApiRoot.PathPrefix("/bots").Subrouter() 142 api.BaseRoutes.Bot = api.BaseRoutes.ApiRoot.PathPrefix("/bots/{bot_user_id:[A-Za-z0-9]+}").Subrouter() 143 144 api.BaseRoutes.Tasks = api.BaseRoutes.ApiRoot.PathPrefix("/tasks").Subrouter() 145 api.BaseRoutes.Task = api.BaseRoutes.ApiRoot.PathPrefix("/tasks/{task_id:[A-Za-z0-9]+}").Subrouter() 146 147 api.BaseRoutes.Teams = api.BaseRoutes.ApiRoot.PathPrefix("/teams").Subrouter() 148 api.BaseRoutes.TeamsForUser = api.BaseRoutes.User.PathPrefix("/teams").Subrouter() 149 api.BaseRoutes.Team = api.BaseRoutes.Teams.PathPrefix("/{team_id:[A-Za-z0-9]+}").Subrouter() 150 api.BaseRoutes.TeamForUser = api.BaseRoutes.TeamsForUser.PathPrefix("/{team_id:[A-Za-z0-9]+}").Subrouter() 151 api.BaseRoutes.TeamByName = api.BaseRoutes.Teams.PathPrefix("/name/{team_name:[A-Za-z0-9_-]+}").Subrouter() 152 api.BaseRoutes.TeamMembers = api.BaseRoutes.Team.PathPrefix("/members").Subrouter() 153 api.BaseRoutes.TeamMember = api.BaseRoutes.TeamMembers.PathPrefix("/{user_id:[A-Za-z0-9]+}").Subrouter() 154 api.BaseRoutes.TeamMembersForUser = api.BaseRoutes.User.PathPrefix("/teams/members").Subrouter() 155 156 api.BaseRoutes.Channels = api.BaseRoutes.ApiRoot.PathPrefix("/channels").Subrouter() 157 api.BaseRoutes.Channel = api.BaseRoutes.Channels.PathPrefix("/{channel_id:[A-Za-z0-9]+}").Subrouter() 158 api.BaseRoutes.ChannelForUser = api.BaseRoutes.User.PathPrefix("/channels/{channel_id:[A-Za-z0-9]+}").Subrouter() 159 api.BaseRoutes.ChannelByName = api.BaseRoutes.Team.PathPrefix("/channels/name/{channel_name:[A-Za-z0-9_-]+}").Subrouter() 160 api.BaseRoutes.ChannelByNameForTeamName = api.BaseRoutes.TeamByName.PathPrefix("/channels/name/{channel_name:[A-Za-z0-9_-]+}").Subrouter() 161 api.BaseRoutes.ChannelsForTeam = api.BaseRoutes.Team.PathPrefix("/channels").Subrouter() 162 api.BaseRoutes.ChannelMembers = api.BaseRoutes.Channel.PathPrefix("/members").Subrouter() 163 api.BaseRoutes.ChannelMember = api.BaseRoutes.ChannelMembers.PathPrefix("/{user_id:[A-Za-z0-9]+}").Subrouter() 164 api.BaseRoutes.ChannelMembersForUser = api.BaseRoutes.User.PathPrefix("/teams/{team_id:[A-Za-z0-9]+}/channels/members").Subrouter() 165 166 api.BaseRoutes.Posts = api.BaseRoutes.ApiRoot.PathPrefix("/posts").Subrouter() 167 api.BaseRoutes.Post = api.BaseRoutes.Posts.PathPrefix("/{post_id:[A-Za-z0-9]+}").Subrouter() 168 api.BaseRoutes.PostsForChannel = api.BaseRoutes.Channel.PathPrefix("/posts").Subrouter() 169 api.BaseRoutes.PostsForUser = api.BaseRoutes.User.PathPrefix("/posts").Subrouter() 170 api.BaseRoutes.PostForUser = api.BaseRoutes.PostsForUser.PathPrefix("/{post_id:[A-Za-z0-9]+}").Subrouter() 171 172 api.BaseRoutes.Files = api.BaseRoutes.ApiRoot.PathPrefix("/files").Subrouter() 173 api.BaseRoutes.File = api.BaseRoutes.Files.PathPrefix("/{file_id:[A-Za-z0-9]+}").Subrouter() 174 api.BaseRoutes.PublicFile = api.BaseRoutes.Root.PathPrefix("/files/{file_id:[A-Za-z0-9]+}/public").Subrouter() 175 176 api.BaseRoutes.Plugins = api.BaseRoutes.ApiRoot.PathPrefix("/plugins").Subrouter() 177 api.BaseRoutes.Plugin = api.BaseRoutes.Plugins.PathPrefix("/{plugin_id:[A-Za-z0-9\\_\\-\\.]+}").Subrouter() 178 179 api.BaseRoutes.Commands = api.BaseRoutes.ApiRoot.PathPrefix("/commands").Subrouter() 180 api.BaseRoutes.Command = api.BaseRoutes.Commands.PathPrefix("/{command_id:[A-Za-z0-9]+}").Subrouter() 181 182 api.BaseRoutes.Hooks = api.BaseRoutes.ApiRoot.PathPrefix("/hooks").Subrouter() 183 api.BaseRoutes.IncomingHooks = api.BaseRoutes.Hooks.PathPrefix("/incoming").Subrouter() 184 api.BaseRoutes.IncomingHook = api.BaseRoutes.IncomingHooks.PathPrefix("/{hook_id:[A-Za-z0-9]+}").Subrouter() 185 api.BaseRoutes.OutgoingHooks = api.BaseRoutes.Hooks.PathPrefix("/outgoing").Subrouter() 186 api.BaseRoutes.OutgoingHook = api.BaseRoutes.OutgoingHooks.PathPrefix("/{hook_id:[A-Za-z0-9]+}").Subrouter() 187 188 api.BaseRoutes.SAML = api.BaseRoutes.ApiRoot.PathPrefix("/saml").Subrouter() 189 190 api.BaseRoutes.OAuth = api.BaseRoutes.ApiRoot.PathPrefix("/oauth").Subrouter() 191 api.BaseRoutes.OAuthApps = api.BaseRoutes.OAuth.PathPrefix("/apps").Subrouter() 192 api.BaseRoutes.OAuthApp = api.BaseRoutes.OAuthApps.PathPrefix("/{app_id:[A-Za-z0-9]+}").Subrouter() 193 194 api.BaseRoutes.Compliance = api.BaseRoutes.ApiRoot.PathPrefix("/compliance").Subrouter() 195 api.BaseRoutes.Cluster = api.BaseRoutes.ApiRoot.PathPrefix("/cluster").Subrouter() 196 api.BaseRoutes.LDAP = api.BaseRoutes.ApiRoot.PathPrefix("/ldap").Subrouter() 197 api.BaseRoutes.Brand = api.BaseRoutes.ApiRoot.PathPrefix("/brand").Subrouter() 198 api.BaseRoutes.System = api.BaseRoutes.ApiRoot.PathPrefix("/system").Subrouter() 199 api.BaseRoutes.Preferences = api.BaseRoutes.User.PathPrefix("/preferences").Subrouter() 200 api.BaseRoutes.License = api.BaseRoutes.ApiRoot.PathPrefix("/license").Subrouter() 201 api.BaseRoutes.Public = api.BaseRoutes.ApiRoot.PathPrefix("/public").Subrouter() 202 api.BaseRoutes.Reactions = api.BaseRoutes.ApiRoot.PathPrefix("/reactions").Subrouter() 203 api.BaseRoutes.Jobs = api.BaseRoutes.ApiRoot.PathPrefix("/jobs").Subrouter() 204 api.BaseRoutes.Elasticsearch = api.BaseRoutes.ApiRoot.PathPrefix("/elasticsearch").Subrouter() 205 api.BaseRoutes.DataRetention = api.BaseRoutes.ApiRoot.PathPrefix("/data_retention").Subrouter() 206 207 api.BaseRoutes.Emojis = api.BaseRoutes.ApiRoot.PathPrefix("/emoji").Subrouter() 208 api.BaseRoutes.Emoji = api.BaseRoutes.ApiRoot.PathPrefix("/emoji/{emoji_id:[A-Za-z0-9]+}").Subrouter() 209 api.BaseRoutes.EmojiByName = api.BaseRoutes.Emojis.PathPrefix("/name/{emoji_name:[A-Za-z0-9\\_\\-\\+]+}").Subrouter() 210 211 api.BaseRoutes.ReactionByNameForPostForUser = api.BaseRoutes.PostForUser.PathPrefix("/reactions/{emoji_name:[A-Za-z0-9\\_\\-\\+]+}").Subrouter() 212 213 api.BaseRoutes.OpenGraph = api.BaseRoutes.ApiRoot.PathPrefix("/opengraph").Subrouter() 214 215 api.BaseRoutes.Roles = api.BaseRoutes.ApiRoot.PathPrefix("/roles").Subrouter() 216 api.BaseRoutes.Schemes = api.BaseRoutes.ApiRoot.PathPrefix("/schemes").Subrouter() 217 218 api.BaseRoutes.Image = api.BaseRoutes.ApiRoot.PathPrefix("/image").Subrouter() 219 220 api.BaseRoutes.TermsOfService = api.BaseRoutes.ApiRoot.PathPrefix("/terms_of_service").Subrouter() 221 api.BaseRoutes.Groups = api.BaseRoutes.ApiRoot.PathPrefix("/groups").Subrouter() 222 223 api.InitUser() 224 api.InitBot() 225 api.InitTask() 226 api.InitTeam() 227 api.InitChannel() 228 api.InitPost() 229 api.InitFile() 230 api.InitSystem() 231 api.InitLicense() 232 api.InitConfig() 233 api.InitWebhook() 234 api.InitPreference() 235 api.InitSaml() 236 api.InitCompliance() 237 api.InitCluster() 238 api.InitLdap() 239 api.InitElasticsearch() 240 api.InitDataRetention() 241 api.InitBrand() 242 api.InitJob() 243 api.InitCommand() 244 api.InitStatus() 245 api.InitWebSocket() 246 api.InitEmoji() 247 api.InitOAuth() 248 api.InitReaction() 249 api.InitOpenGraph() 250 api.InitPlugin() 251 api.InitRole() 252 api.InitScheme() 253 api.InitImage() 254 api.InitTermsOfService() 255 api.InitGroup() 256 api.InitAction() 257 258 root.Handle("/api/v4/{anything:.*}", http.HandlerFunc(api.Handle404)) 259 260 return api 261 } 262 263 func (api *API) Handle404(w http.ResponseWriter, r *http.Request) { 264 web.Handle404(api.ConfigService, w, r) 265 } 266 267 var ReturnStatusOK = web.ReturnStatusOK