2015-12-04 17:16:42 -05:00
// Copyright 2015 The Gogs Authors. All rights reserved.
2018-11-28 19:26:14 +08:00
// Copyright 2016 The Gitea Authors. All rights reserved.
2015-12-04 17:16:42 -05:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2017-05-02 15:35:59 +02:00
// Package v1 Gitea API.
//
2017-11-12 23:02:25 -08:00
// This documentation describes the Gitea API.
2017-05-02 15:35:59 +02:00
//
// Schemes: http, https
// BasePath: /api/v1
// Version: 1.1.1
// License: MIT http://opensource.org/licenses/MIT
//
// Consumes:
// - application/json
// - text/plain
//
// Produces:
// - application/json
// - text/html
//
2017-08-21 13:13:47 +02:00
// Security:
2018-06-13 01:23:00 +02:00
// - BasicAuth :
// - Token :
// - AccessToken :
// - AuthorizationHeaderToken :
2018-09-07 04:31:29 +01:00
// - SudoParam :
// - SudoHeader :
2017-08-21 13:13:47 +02:00
//
// SecurityDefinitions:
// BasicAuth:
// type: basic
// Token:
// type: apiKey
// name: token
// in: query
// AccessToken:
// type: apiKey
// name: access_token
// in: query
// AuthorizationHeaderToken:
// type: apiKey
// name: Authorization
// in: header
2019-07-24 09:34:11 +01:00
// description: API tokens must be prepended with "token" followed by a space.
2018-09-07 04:31:29 +01:00
// SudoParam:
// type: apiKey
// name: sudo
// in: query
// description: Sudo API request as the user provided as the key. Admin privileges are required.
// SudoHeader:
// type: apiKey
// name: Sudo
// in: header
// description: Sudo API request as the user provided as the key. Admin privileges are required.
2017-08-21 13:13:47 +02:00
//
2017-05-02 15:35:59 +02:00
// swagger:meta
2015-12-04 17:16:42 -05:00
package v1
import (
"strings"
2016-11-10 17:24:48 +01:00
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/auth"
"code.gitea.io/gitea/modules/context"
2018-09-07 04:31:29 +01:00
"code.gitea.io/gitea/modules/log"
2018-02-14 05:46:00 +01:00
"code.gitea.io/gitea/modules/setting"
2019-05-11 18:21:34 +08:00
api "code.gitea.io/gitea/modules/structs"
2016-11-10 17:24:48 +01:00
"code.gitea.io/gitea/routers/api/v1/admin"
"code.gitea.io/gitea/routers/api/v1/misc"
"code.gitea.io/gitea/routers/api/v1/org"
"code.gitea.io/gitea/routers/api/v1/repo"
2017-11-12 23:02:25 -08:00
_ "code.gitea.io/gitea/routers/api/v1/swagger" // for swagger generation
2016-11-10 17:24:48 +01:00
"code.gitea.io/gitea/routers/api/v1/user"
2017-11-12 23:02:25 -08:00
"github.com/go-macaron/binding"
2019-05-13 08:38:53 -07:00
"github.com/go-macaron/cors"
macaron "gopkg.in/macaron.v1"
2015-12-04 17:16:42 -05:00
)
2018-09-07 04:31:29 +01:00
func sudo ( ) macaron . Handler {
return func ( ctx * context . APIContext ) {
sudo := ctx . Query ( "sudo" )
2018-10-20 23:25:14 +02:00
if len ( sudo ) == 0 {
2018-09-07 04:31:29 +01:00
sudo = ctx . Req . Header . Get ( "Sudo" )
}
if len ( sudo ) > 0 {
2019-01-28 14:13:59 +00:00
if ctx . IsSigned && ctx . User . IsAdmin {
2018-09-07 04:31:29 +01:00
user , err := models . GetUserByName ( sudo )
if err != nil {
if models . IsErrUserNotExist ( err ) {
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2018-09-07 04:31:29 +01:00
} else {
ctx . Error ( 500 , "GetUserByName" , err )
}
return
}
log . Trace ( "Sudo from (%s) to: %s" , ctx . User . Name , user . Name )
ctx . User = user
} else {
ctx . JSON ( 403 , map [ string ] string {
"message" : "Only administrators allowed to sudo." ,
} )
return
}
}
}
}
2016-08-04 17:08:01 -07:00
func repoAssignment ( ) macaron . Handler {
2016-03-13 18:49:16 -04:00
return func ( ctx * context . APIContext ) {
2015-12-04 17:16:42 -05:00
userName := ctx . Params ( ":username" )
repoName := ctx . Params ( ":reponame" )
var (
owner * models . User
err error
)
// Check if the user is the same as the repository owner.
if ctx . IsSigned && ctx . User . LowerName == strings . ToLower ( userName ) {
owner = ctx . User
} else {
owner , err = models . GetUserByName ( userName )
if err != nil {
if models . IsErrUserNotExist ( err ) {
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2015-12-04 17:16:42 -05:00
} else {
2016-03-13 18:49:16 -04:00
ctx . Error ( 500 , "GetUserByName" , err )
2015-12-04 17:16:42 -05:00
}
return
}
}
ctx . Repo . Owner = owner
// Get repository.
2016-07-24 01:08:22 +08:00
repo , err := models . GetRepositoryByName ( owner . ID , repoName )
2015-12-04 17:16:42 -05:00
if err != nil {
if models . IsErrRepoNotExist ( err ) {
2017-02-05 09:35:03 -05:00
redirectRepoID , err := models . LookupRepoRedirect ( owner . ID , repoName )
if err == nil {
context . RedirectToRepo ( ctx . Context , redirectRepoID )
} else if models . IsErrRepoRedirectNotExist ( err ) {
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2017-02-05 09:35:03 -05:00
} else {
ctx . Error ( 500 , "LookupRepoRedirect" , err )
}
2015-12-04 17:16:42 -05:00
} else {
2016-03-13 18:49:16 -04:00
ctx . Error ( 500 , "GetRepositoryByName" , err )
2015-12-04 17:16:42 -05:00
}
return
}
2019-04-26 02:59:10 +08:00
2017-02-02 07:33:56 -05:00
repo . Owner = owner
2018-11-28 19:26:14 +08:00
ctx . Repo . Repository = repo
2015-12-04 17:16:42 -05:00
2018-11-28 19:26:14 +08:00
ctx . Repo . Permission , err = models . GetUserRepoPermission ( repo , ctx . User )
if err != nil {
ctx . Error ( 500 , "GetUserRepoPermission" , err )
return
2015-12-04 17:16:42 -05:00
}
2016-03-13 23:20:22 -04:00
if ! ctx . Repo . HasAccess ( ) {
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2015-12-04 17:16:42 -05:00
return
}
}
}
// Contexter middleware already checks token for user sign in process.
2016-08-04 17:08:01 -07:00
func reqToken ( ) macaron . Handler {
2018-11-04 01:15:55 +00:00
return func ( ctx * context . APIContext ) {
if true == ctx . Data [ "IsApiToken" ] {
return
}
2019-04-19 04:59:26 -04:00
if ctx . Context . IsBasicAuth {
ctx . CheckForOTP ( )
return
}
2018-11-04 01:15:55 +00:00
if ctx . IsSigned {
ctx . RequireCSRF ( )
2015-12-04 17:16:42 -05:00
return
}
2018-11-04 01:15:55 +00:00
ctx . Context . Error ( 401 )
2015-12-04 17:16:42 -05:00
}
}
2016-08-04 17:08:01 -07:00
func reqBasicAuth ( ) macaron . Handler {
2019-04-19 04:59:26 -04:00
return func ( ctx * context . APIContext ) {
if ! ctx . Context . IsBasicAuth {
ctx . Context . Error ( 401 )
2015-12-04 17:16:42 -05:00
return
}
2019-04-19 04:59:26 -04:00
ctx . CheckForOTP ( )
2015-12-04 17:16:42 -05:00
}
}
2018-11-28 19:26:14 +08:00
// reqSiteAdmin user should be the site admin
func reqSiteAdmin ( ) macaron . Handler {
2016-03-11 11:56:52 -05:00
return func ( ctx * context . Context ) {
2019-04-07 22:49:34 +00:00
if ! ctx . IsUserSiteAdmin ( ) {
2015-12-04 17:16:42 -05:00
ctx . Error ( 403 )
return
}
}
}
2019-04-07 22:49:34 +00:00
// reqOwner user should be the owner of the repo or site admin.
2018-11-28 19:26:14 +08:00
func reqOwner ( ) macaron . Handler {
return func ( ctx * context . Context ) {
2019-04-07 22:49:34 +00:00
if ! ctx . IsUserRepoOwner ( ) && ! ctx . IsUserSiteAdmin ( ) {
2018-11-28 19:26:14 +08:00
ctx . Error ( 403 )
return
}
}
}
2019-04-07 22:49:34 +00:00
// reqAdmin user should be an owner or a collaborator with admin write of a repository, or site admin
2018-11-28 19:26:14 +08:00
func reqAdmin ( ) macaron . Handler {
return func ( ctx * context . Context ) {
2019-04-07 22:49:34 +00:00
if ! ctx . IsUserRepoAdmin ( ) && ! ctx . IsUserSiteAdmin ( ) {
2018-11-28 19:26:14 +08:00
ctx . Error ( 403 )
return
}
}
}
2019-04-07 22:49:34 +00:00
// reqRepoWriter user should have a permission to write to a repo, or be a site admin
func reqRepoWriter ( unitTypes ... models . UnitType ) macaron . Handler {
2018-11-28 19:26:14 +08:00
return func ( ctx * context . Context ) {
2019-04-07 22:49:34 +00:00
if ! ctx . IsUserRepoWriter ( unitTypes ) && ! ctx . IsUserRepoAdmin ( ) && ! ctx . IsUserSiteAdmin ( ) {
2018-11-28 19:26:14 +08:00
ctx . Error ( 403 )
return
}
}
}
2019-04-07 22:49:34 +00:00
// reqRepoReader user should have specific read permission or be a repo admin or a site admin
func reqRepoReader ( unitType models . UnitType ) macaron . Handler {
2016-08-24 16:05:56 -07:00
return func ( ctx * context . Context ) {
2019-04-07 22:49:34 +00:00
if ! ctx . IsUserRepoReaderSpecific ( unitType ) && ! ctx . IsUserRepoAdmin ( ) && ! ctx . IsUserSiteAdmin ( ) {
2016-08-24 16:05:56 -07:00
ctx . Error ( 403 )
return
}
}
}
2019-04-07 22:49:34 +00:00
// reqAnyRepoReader user should have any permission to read repository or permissions of site admin
func reqAnyRepoReader ( ) macaron . Handler {
2018-11-28 19:26:14 +08:00
return func ( ctx * context . Context ) {
2019-04-07 22:49:34 +00:00
if ! ctx . IsUserRepoReaderAny ( ) && ! ctx . IsUserSiteAdmin ( ) {
ctx . Error ( 403 )
return
2018-11-28 19:26:14 +08:00
}
}
}
2019-04-07 22:49:34 +00:00
// reqOrgOwnership user should be an organization owner, or a site admin
func reqOrgOwnership ( ) macaron . Handler {
2017-01-13 21:14:48 -05:00
return func ( ctx * context . APIContext ) {
2019-04-07 22:49:34 +00:00
if ctx . Context . IsUserSiteAdmin ( ) {
return
}
2017-01-13 21:14:48 -05:00
var orgID int64
if ctx . Org . Organization != nil {
orgID = ctx . Org . Organization . ID
} else if ctx . Org . Team != nil {
orgID = ctx . Org . Team . OrgID
} else {
2019-04-07 22:49:34 +00:00
ctx . Error ( 500 , "" , "reqOrgOwnership: unprepared context" )
2017-01-13 21:14:48 -05:00
return
}
2019-04-07 22:49:34 +00:00
isOwner , err := models . IsOrganizationOwner ( orgID , ctx . User . ID )
if err != nil {
ctx . Error ( 500 , "IsOrganizationOwner" , err )
2017-12-20 23:43:26 -08:00
return
2019-04-07 22:49:34 +00:00
} else if ! isOwner {
2017-01-26 06:54:04 -05:00
if ctx . Org . Organization != nil {
2019-04-07 22:49:34 +00:00
ctx . Error ( 403 , "" , "Must be an organization owner" )
2017-01-26 06:54:04 -05:00
} else {
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2017-01-26 06:54:04 -05:00
}
2017-01-13 21:14:48 -05:00
return
}
}
}
2019-04-24 13:32:35 +08:00
// reqTeamMembership user should be an team member, or a site admin
func reqTeamMembership ( ) macaron . Handler {
return func ( ctx * context . APIContext ) {
if ctx . Context . IsUserSiteAdmin ( ) {
return
}
if ctx . Org . Team == nil {
ctx . Error ( 500 , "" , "reqTeamMembership: unprepared context" )
return
}
var orgID = ctx . Org . Team . OrgID
isOwner , err := models . IsOrganizationOwner ( orgID , ctx . User . ID )
if err != nil {
ctx . Error ( 500 , "IsOrganizationOwner" , err )
return
} else if isOwner {
return
}
if isTeamMember , err := models . IsTeamMember ( orgID , ctx . Org . Team . ID , ctx . User . ID ) ; err != nil {
ctx . Error ( 500 , "IsTeamMember" , err )
return
} else if ! isTeamMember {
isOrgMember , err := models . IsOrganizationMember ( orgID , ctx . User . ID )
if err != nil {
ctx . Error ( 500 , "IsOrganizationMember" , err )
} else if isOrgMember {
ctx . Error ( 403 , "" , "Must be a team member" )
} else {
ctx . NotFound ( )
}
return
}
}
}
2019-04-07 22:49:34 +00:00
// reqOrgMembership user should be an organization member, or a site admin
func reqOrgMembership ( ) macaron . Handler {
2017-01-13 21:14:48 -05:00
return func ( ctx * context . APIContext ) {
2019-04-07 22:49:34 +00:00
if ctx . Context . IsUserSiteAdmin ( ) {
return
}
2017-01-13 21:14:48 -05:00
var orgID int64
if ctx . Org . Organization != nil {
orgID = ctx . Org . Organization . ID
} else if ctx . Org . Team != nil {
orgID = ctx . Org . Team . OrgID
} else {
2019-04-07 22:49:34 +00:00
ctx . Error ( 500 , "" , "reqOrgMembership: unprepared context" )
2017-01-13 21:14:48 -05:00
return
}
2019-04-07 22:49:34 +00:00
if isMember , err := models . IsOrganizationMember ( orgID , ctx . User . ID ) ; err != nil {
ctx . Error ( 500 , "IsOrganizationMember" , err )
return
} else if ! isMember {
2017-01-26 06:54:04 -05:00
if ctx . Org . Organization != nil {
2019-04-07 22:49:34 +00:00
ctx . Error ( 403 , "" , "Must be an organization member" )
2017-01-26 06:54:04 -05:00
} else {
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2017-01-26 06:54:04 -05:00
}
2017-01-13 21:14:48 -05:00
return
}
}
}
2019-04-17 08:31:08 +03:00
func reqGitHook ( ) macaron . Handler {
return func ( ctx * context . APIContext ) {
if ! ctx . User . CanEditGitHook ( ) {
ctx . Error ( 403 , "" , "must be allowed to edit Git hooks" )
return
}
}
}
2016-08-04 17:08:01 -07:00
func orgAssignment ( args ... bool ) macaron . Handler {
2016-03-25 18:04:02 -04:00
var (
2016-04-04 19:41:34 -04:00
assignOrg bool
2016-03-25 18:04:02 -04:00
assignTeam bool
)
if len ( args ) > 0 {
2016-04-04 19:41:34 -04:00
assignOrg = args [ 0 ]
}
if len ( args ) > 1 {
assignTeam = args [ 1 ]
2016-03-25 18:04:02 -04:00
}
return func ( ctx * context . APIContext ) {
2016-04-04 19:41:34 -04:00
ctx . Org = new ( context . APIOrganization )
var err error
if assignOrg {
2017-07-06 15:30:19 +02:00
ctx . Org . Organization , err = models . GetOrgByName ( ctx . Params ( ":orgname" ) )
2016-04-04 19:41:34 -04:00
if err != nil {
2017-07-06 15:30:19 +02:00
if models . IsErrOrgNotExist ( err ) {
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2016-04-04 19:41:34 -04:00
} else {
2017-07-06 15:30:19 +02:00
ctx . Error ( 500 , "GetOrgByName" , err )
2016-04-04 19:41:34 -04:00
}
return
2016-03-25 18:04:02 -04:00
}
}
if assignTeam {
ctx . Org . Team , err = models . GetTeamByID ( ctx . ParamsInt64 ( ":teamid" ) )
if err != nil {
if models . IsErrUserNotExist ( err ) {
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2016-03-25 18:04:02 -04:00
} else {
ctx . Error ( 500 , "GetTeamById" , err )
}
return
}
}
}
}
2016-08-04 17:08:01 -07:00
func mustEnableIssues ( ctx * context . APIContext ) {
2018-11-28 19:26:14 +08:00
if ! ctx . Repo . CanRead ( models . UnitTypeIssues ) {
2019-04-22 21:40:51 +01:00
if log . IsTrace ( ) {
if ctx . IsSigned {
log . Trace ( "Permission Denied: User %-v cannot read %-v in Repo %-v\n" +
"User in Repo has Permissions: %-+v" ,
ctx . User ,
models . UnitTypeIssues ,
ctx . Repo . Repository ,
ctx . Repo . Permission )
} else {
log . Trace ( "Permission Denied: Anonymous user cannot read %-v in Repo %-v\n" +
"Anonymous user in Repo has Permissions: %-+v" ,
models . UnitTypeIssues ,
ctx . Repo . Repository ,
ctx . Repo . Permission )
}
}
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2016-08-04 16:32:02 -07:00
return
}
}
2019-03-18 21:29:43 -05:00
func mustAllowPulls ( ctx * context . APIContext ) {
2018-11-28 19:26:14 +08:00
if ! ( ctx . Repo . Repository . CanEnablePulls ( ) && ctx . Repo . CanRead ( models . UnitTypePullRequests ) ) {
2019-04-22 21:40:51 +01:00
if ctx . Repo . Repository . CanEnablePulls ( ) && log . IsTrace ( ) {
if ctx . IsSigned {
log . Trace ( "Permission Denied: User %-v cannot read %-v in Repo %-v\n" +
"User in Repo has Permissions: %-+v" ,
ctx . User ,
models . UnitTypePullRequests ,
ctx . Repo . Repository ,
ctx . Repo . Permission )
} else {
log . Trace ( "Permission Denied: Anonymous user cannot read %-v in Repo %-v\n" +
"Anonymous user in Repo has Permissions: %-+v" ,
models . UnitTypePullRequests ,
ctx . Repo . Repository ,
ctx . Repo . Permission )
}
}
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2016-12-02 12:10:39 +01:00
return
}
}
2019-03-18 21:29:43 -05:00
func mustEnableIssuesOrPulls ( ctx * context . APIContext ) {
2018-11-28 19:26:14 +08:00
if ! ctx . Repo . CanRead ( models . UnitTypeIssues ) &&
! ( ctx . Repo . Repository . CanEnablePulls ( ) && ctx . Repo . CanRead ( models . UnitTypePullRequests ) ) {
2019-04-22 21:40:51 +01:00
if ctx . Repo . Repository . CanEnablePulls ( ) && log . IsTrace ( ) {
if ctx . IsSigned {
log . Trace ( "Permission Denied: User %-v cannot read %-v and %-v in Repo %-v\n" +
"User in Repo has Permissions: %-+v" ,
ctx . User ,
models . UnitTypeIssues ,
models . UnitTypePullRequests ,
ctx . Repo . Repository ,
ctx . Repo . Permission )
} else {
log . Trace ( "Permission Denied: Anonymous user cannot read %-v and %-v in Repo %-v\n" +
"Anonymous user in Repo has Permissions: %-+v" ,
models . UnitTypeIssues ,
models . UnitTypePullRequests ,
ctx . Repo . Repository ,
ctx . Repo . Permission )
}
}
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2018-09-04 01:20:54 +08:00
return
}
}
2019-03-18 21:29:43 -05:00
func mustEnableUserHeatmap ( ctx * context . APIContext ) {
2018-10-23 04:57:42 +02:00
if ! setting . Service . EnableUserHeatmap {
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2018-10-23 04:57:42 +02:00
return
}
}
2019-03-18 21:29:43 -05:00
func mustNotBeArchived ( ctx * context . APIContext ) {
2019-01-30 18:20:40 +01:00
if ctx . Repo . Repository . IsArchived {
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2019-01-30 18:20:40 +01:00
return
}
}
2015-12-04 17:16:42 -05:00
// RegisterRoutes registers all v1 APIs routes to web application.
// FIXME: custom form error response
func RegisterRoutes ( m * macaron . Macaron ) {
bind := binding . Bind
2018-07-28 02:19:01 +02:00
if setting . API . EnableSwagger {
2018-02-14 05:46:00 +01:00
m . Get ( "/swagger" , misc . Swagger ) //Render V1 by default
}
2017-10-21 16:05:50 +02:00
2019-05-13 08:38:53 -07:00
var handlers [ ] macaron . Handler
if setting . EnableCORS {
handlers = append ( handlers , cors . CORS ( setting . CORSConfig ) )
}
handlers = append ( handlers , securityHeaders ( ) , context . APIContexter ( ) , sudo ( ) )
2015-12-04 17:16:42 -05:00
m . Group ( "/v1" , func ( ) {
// Miscellaneous
2018-07-28 02:19:01 +02:00
if setting . API . EnableSwagger {
2018-02-14 05:46:00 +01:00
m . Get ( "/swagger" , misc . Swagger )
}
2017-03-06 22:13:17 +08:00
m . Get ( "/version" , misc . Version )
2015-12-04 17:16:42 -05:00
m . Post ( "/markdown" , bind ( api . MarkdownOption { } ) , misc . Markdown )
m . Post ( "/markdown/raw" , misc . MarkdownRaw )
// Users
m . Group ( "/users" , func ( ) {
m . Get ( "/search" , user . Search )
m . Group ( "/:username" , func ( ) {
m . Get ( "" , user . GetInfo )
2018-10-23 04:57:42 +02:00
m . Get ( "/heatmap" , mustEnableUserHeatmap , user . GetUserHeatmapData )
2015-12-04 17:16:42 -05:00
2017-02-24 16:39:49 -05:00
m . Get ( "/repos" , user . ListUserRepos )
2015-12-04 17:16:42 -05:00
m . Group ( "/tokens" , func ( ) {
m . Combo ( "" ) . Get ( user . ListAccessTokens ) .
Post ( bind ( api . CreateAccessTokenOption { } ) , user . CreateAccessToken )
2018-07-06 21:54:30 -04:00
m . Combo ( "/:id" ) . Delete ( user . DeleteAccessToken )
2016-08-04 17:08:01 -07:00
} , reqBasicAuth ( ) )
2015-12-04 17:16:42 -05:00
} )
} )
m . Group ( "/users" , func ( ) {
m . Group ( "/:username" , func ( ) {
2015-12-05 17:13:13 -05:00
m . Get ( "/keys" , user . ListPublicKeys )
2017-03-16 02:27:35 +01:00
m . Get ( "/gpg_keys" , user . ListGPGKeys )
2015-12-21 04:24:11 -08:00
m . Get ( "/followers" , user . ListFollowers )
m . Group ( "/following" , func ( ) {
m . Get ( "" , user . ListFollowing )
m . Get ( "/:target" , user . CheckFollowing )
} )
2016-11-14 17:33:58 -05:00
m . Get ( "/starred" , user . GetStarredRepos )
2016-12-23 20:53:11 -05:00
m . Get ( "/subscriptions" , user . GetWatchedRepos )
2015-12-04 17:16:42 -05:00
} )
2016-08-04 17:08:01 -07:00
} , reqToken ( ) )
2015-12-04 17:16:42 -05:00
m . Group ( "/user" , func ( ) {
2016-08-11 15:29:39 -07:00
m . Get ( "" , user . GetAuthenticatedUser )
2015-12-21 04:24:11 -08:00
m . Combo ( "/emails" ) . Get ( user . ListEmails ) .
Post ( bind ( api . CreateEmailOption { } ) , user . AddEmail ) .
2017-11-12 23:02:25 -08:00
Delete ( bind ( api . DeleteEmailOption { } ) , user . DeleteEmail )
2015-12-21 04:24:11 -08:00
m . Get ( "/followers" , user . ListMyFollowers )
m . Group ( "/following" , func ( ) {
m . Get ( "" , user . ListMyFollowing )
m . Combo ( "/:username" ) . Get ( user . CheckMyFollowing ) . Put ( user . Follow ) . Delete ( user . Unfollow )
} )
2015-12-04 17:16:42 -05:00
m . Group ( "/keys" , func ( ) {
m . Combo ( "" ) . Get ( user . ListMyPublicKeys ) .
Post ( bind ( api . CreateKeyOption { } ) , user . CreatePublicKey )
m . Combo ( "/:id" ) . Get ( user . GetPublicKey ) .
Delete ( user . DeletePublicKey )
} )
2016-11-14 17:33:58 -05:00
2017-03-16 02:27:35 +01:00
m . Group ( "/gpg_keys" , func ( ) {
m . Combo ( "" ) . Get ( user . ListMyGPGKeys ) .
Post ( bind ( api . CreateGPGKeyOption { } ) , user . CreateGPGKey )
m . Combo ( "/:id" ) . Get ( user . GetGPGKey ) .
Delete ( user . DeleteGPGKey )
} )
2017-02-24 16:39:49 -05:00
m . Combo ( "/repos" ) . Get ( user . ListMyRepos ) .
Post ( bind ( api . CreateRepoOption { } ) , repo . Create )
2016-11-14 17:33:58 -05:00
m . Group ( "/starred" , func ( ) {
m . Get ( "" , user . GetMyStarredRepos )
m . Group ( "/:username/:reponame" , func ( ) {
m . Get ( "" , user . IsStarring )
m . Put ( "" , user . Star )
m . Delete ( "" , user . Unstar )
2016-12-29 08:17:32 -05:00
} , repoAssignment ( ) )
2016-11-14 17:33:58 -05:00
} )
2017-09-12 08:48:13 +02:00
m . Get ( "/times" , repo . ListMyTrackedTimes )
2016-12-23 20:53:11 -05:00
m . Get ( "/subscriptions" , user . GetMyWatchedRepos )
2019-01-17 06:09:50 +05:30
m . Get ( "/teams" , org . ListUserTeams )
2016-08-04 17:08:01 -07:00
} , reqToken ( ) )
2015-12-04 17:16:42 -05:00
// Repositories
2016-08-04 17:08:01 -07:00
m . Post ( "/org/:org/repos" , reqToken ( ) , bind ( api . CreateRepoOption { } ) , repo . CreateOrgRepo )
2015-12-04 17:16:42 -05:00
m . Group ( "/repos" , func ( ) {
m . Get ( "/search" , repo . Search )
} )
2016-10-03 12:35:42 +02:00
m . Combo ( "/repositories/:id" , reqToken ( ) ) . Get ( repo . GetByID )
2015-12-04 17:16:42 -05:00
m . Group ( "/repos" , func ( ) {
2017-07-11 21:23:41 -04:00
m . Post ( "/migrate" , reqToken ( ) , bind ( auth . MigrateRepoForm { } ) , repo . Migrate )
2015-12-04 17:16:42 -05:00
m . Group ( "/:username/:reponame" , func ( ) {
2018-11-28 19:26:14 +08:00
m . Combo ( "" ) . Get ( reqAnyRepoReader ( ) , repo . Get ) .
2019-05-30 11:09:05 -04:00
Delete ( reqToken ( ) , reqOwner ( ) , repo . Delete ) .
Patch ( reqToken ( ) , reqAdmin ( ) , bind ( api . EditRepoOption { } ) , repo . Edit )
2016-07-16 19:08:38 -05:00
m . Group ( "/hooks" , func ( ) {
m . Combo ( "" ) . Get ( repo . ListHooks ) .
Post ( bind ( api . CreateHookOption { } ) , repo . CreateHook )
2018-04-28 23:21:33 -07:00
m . Group ( "/:id" , func ( ) {
m . Combo ( "" ) . Get ( repo . GetHook ) .
Patch ( bind ( api . EditHookOption { } ) , repo . EditHook ) .
Delete ( repo . DeleteHook )
m . Post ( "/tests" , context . RepoRef ( ) , repo . TestHook )
} )
2019-04-17 08:31:08 +03:00
m . Group ( "/git" , func ( ) {
m . Combo ( "" ) . Get ( repo . ListGitHooks )
m . Group ( "/:id" , func ( ) {
m . Combo ( "" ) . Get ( repo . GetGitHook ) .
Patch ( bind ( api . EditGitHookOption { } ) , repo . EditGitHook ) .
Delete ( repo . DeleteGitHook )
} )
} , reqGitHook ( ) , context . ReferencesGitRepo ( true ) )
2018-11-28 19:26:14 +08:00
} , reqToken ( ) , reqAdmin ( ) )
2016-12-26 02:37:01 -05:00
m . Group ( "/collaborators" , func ( ) {
m . Get ( "" , repo . ListCollaborators )
m . Combo ( "/:collaborator" ) . Get ( repo . IsCollaborator ) .
Put ( bind ( api . AddCollaboratorOption { } ) , repo . AddCollaborator ) .
Delete ( repo . DeleteCollaborator )
2018-11-28 19:26:14 +08:00
} , reqToken ( ) , reqAdmin ( ) )
m . Get ( "/raw/*" , context . RepoRefByType ( context . RepoRefAny ) , reqRepoReader ( models . UnitTypeCode ) , repo . GetRawFile )
m . Get ( "/archive/*" , reqRepoReader ( models . UnitTypeCode ) , repo . GetArchive )
2016-12-30 20:15:45 -05:00
m . Combo ( "/forks" ) . Get ( repo . ListForks ) .
2018-11-28 19:26:14 +08:00
Post ( reqToken ( ) , reqRepoReader ( models . UnitTypeCode ) , bind ( api . CreateForkOption { } ) , repo . CreateFork )
2016-01-15 19:24:03 +01:00
m . Group ( "/branches" , func ( ) {
2016-03-11 11:56:52 -05:00
m . Get ( "" , repo . ListBranches )
2017-10-29 19:04:25 -07:00
m . Get ( "/*" , context . RepoRefByType ( context . RepoRefBranch ) , repo . GetBranch )
2018-11-28 19:26:14 +08:00
} , reqRepoReader ( models . UnitTypeCode ) )
2019-02-07 20:00:52 +08:00
m . Group ( "/tags" , func ( ) {
m . Get ( "" , repo . ListTags )
} , reqRepoReader ( models . UnitTypeCode ) )
2015-12-04 17:16:42 -05:00
m . Group ( "/keys" , func ( ) {
m . Combo ( "" ) . Get ( repo . ListDeployKeys ) .
Post ( bind ( api . CreateKeyOption { } ) , repo . CreateDeployKey )
m . Combo ( "/:id" ) . Get ( repo . GetDeployKey ) .
Delete ( repo . DeleteDeploykey )
2018-11-28 19:26:14 +08:00
} , reqToken ( ) , reqAdmin ( ) )
2017-09-12 08:48:13 +02:00
m . Group ( "/times" , func ( ) {
m . Combo ( "" ) . Get ( repo . ListTrackedTimesByRepository )
m . Combo ( "/:timetrackingusername" ) . Get ( repo . ListTrackedTimesByUser )
} , mustEnableIssues )
2016-03-13 23:20:22 -04:00
m . Group ( "/issues" , func ( ) {
2017-07-11 21:23:41 -04:00
m . Combo ( "" ) . Get ( repo . ListIssues ) .
2019-01-30 18:20:40 +01:00
Post ( reqToken ( ) , mustNotBeArchived , bind ( api . CreateIssueOption { } ) , repo . CreateIssue )
2016-12-22 09:29:26 +01:00
m . Group ( "/comments" , func ( ) {
m . Get ( "" , repo . ListRepoIssueComments )
2017-07-11 21:23:41 -04:00
m . Combo ( "/:id" , reqToken ( ) ) .
2019-01-30 18:20:40 +01:00
Patch ( mustNotBeArchived , bind ( api . EditIssueCommentOption { } ) , repo . EditIssueComment ) .
2017-11-19 23:24:07 -08:00
Delete ( repo . DeleteIssueComment )
2016-12-22 09:29:26 +01:00
} )
2016-08-03 09:24:16 -07:00
m . Group ( "/:index" , func ( ) {
2017-07-11 21:23:41 -04:00
m . Combo ( "" ) . Get ( repo . GetIssue ) .
Patch ( reqToken ( ) , bind ( api . EditIssueOption { } ) , repo . EditIssue )
2016-08-27 01:23:21 +07:00
m . Group ( "/comments" , func ( ) {
2017-07-11 21:23:41 -04:00
m . Combo ( "" ) . Get ( repo . ListIssueComments ) .
2019-01-30 18:20:40 +01:00
Post ( reqToken ( ) , mustNotBeArchived , bind ( api . CreateIssueCommentOption { } ) , repo . CreateIssueComment )
2017-11-19 23:24:07 -08:00
m . Combo ( "/:id" , reqToken ( ) ) . Patch ( bind ( api . EditIssueCommentOption { } ) , repo . EditIssueCommentDeprecated ) .
Delete ( repo . DeleteIssueCommentDeprecated )
2016-08-27 01:23:21 +07:00
} )
2016-08-03 09:24:16 -07:00
m . Group ( "/labels" , func ( ) {
2016-08-03 11:51:22 -07:00
m . Combo ( "" ) . Get ( repo . ListIssueLabels ) .
2017-07-11 21:23:41 -04:00
Post ( reqToken ( ) , bind ( api . IssueLabelsOption { } ) , repo . AddIssueLabels ) .
Put ( reqToken ( ) , bind ( api . IssueLabelsOption { } ) , repo . ReplaceIssueLabels ) .
Delete ( reqToken ( ) , repo . ClearIssueLabels )
m . Delete ( "/:id" , reqToken ( ) , repo . DeleteIssueLabel )
2016-08-03 09:24:16 -07:00
} )
2017-09-12 08:48:13 +02:00
m . Group ( "/times" , func ( ) {
m . Combo ( "" ) . Get ( repo . ListTrackedTimes ) .
Post ( reqToken ( ) , bind ( api . AddTimeOption { } ) , repo . AddTime )
} )
2018-07-16 14:43:00 +02:00
m . Combo ( "/deadline" ) . Post ( reqToken ( ) , bind ( api . EditDeadlineOption { } ) , repo . UpdateIssueDeadline )
2019-02-07 03:57:25 +01:00
m . Group ( "/stopwatch" , func ( ) {
m . Post ( "/start" , reqToken ( ) , repo . StartIssueStopwatch )
m . Post ( "/stop" , reqToken ( ) , repo . StopIssueStopwatch )
} )
2016-08-03 09:24:16 -07:00
} )
2018-09-04 01:20:54 +08:00
} , mustEnableIssuesOrPulls )
2016-08-03 09:24:16 -07:00
m . Group ( "/labels" , func ( ) {
m . Combo ( "" ) . Get ( repo . ListLabels ) .
2018-11-28 19:26:14 +08:00
Post ( reqToken ( ) , reqRepoWriter ( models . UnitTypeIssues , models . UnitTypePullRequests ) , bind ( api . CreateLabelOption { } ) , repo . CreateLabel )
2017-07-11 21:23:41 -04:00
m . Combo ( "/:id" ) . Get ( repo . GetLabel ) .
2018-11-28 19:26:14 +08:00
Patch ( reqToken ( ) , reqRepoWriter ( models . UnitTypeIssues , models . UnitTypePullRequests ) , bind ( api . EditLabelOption { } ) , repo . EditLabel ) .
Delete ( reqToken ( ) , reqRepoWriter ( models . UnitTypeIssues , models . UnitTypePullRequests ) , repo . DeleteLabel )
2016-03-13 18:49:16 -04:00
} )
2019-04-12 01:53:34 -04:00
m . Post ( "/markdown" , bind ( api . MarkdownOption { } ) , misc . Markdown )
m . Post ( "/markdown/raw" , misc . MarkdownRaw )
2016-08-24 15:18:56 -07:00
m . Group ( "/milestones" , func ( ) {
m . Combo ( "" ) . Get ( repo . ListMilestones ) .
2018-11-28 19:26:14 +08:00
Post ( reqToken ( ) , reqRepoWriter ( models . UnitTypeIssues , models . UnitTypePullRequests ) , bind ( api . CreateMilestoneOption { } ) , repo . CreateMilestone )
2016-08-24 16:05:56 -07:00
m . Combo ( "/:id" ) . Get ( repo . GetMilestone ) .
2018-11-28 19:26:14 +08:00
Patch ( reqToken ( ) , reqRepoWriter ( models . UnitTypeIssues , models . UnitTypePullRequests ) , bind ( api . EditMilestoneOption { } ) , repo . EditMilestone ) .
Delete ( reqToken ( ) , reqRepoWriter ( models . UnitTypeIssues , models . UnitTypePullRequests ) , repo . DeleteMilestone )
2016-08-24 15:18:56 -07:00
} )
2017-01-06 02:05:09 -05:00
m . Get ( "/stargazers" , repo . ListStargazers )
2017-01-06 22:13:02 -05:00
m . Get ( "/subscribers" , repo . ListSubscribers )
2016-12-23 20:53:11 -05:00
m . Group ( "/subscription" , func ( ) {
m . Get ( "" , user . IsWatching )
2017-07-11 21:23:41 -04:00
m . Put ( "" , reqToken ( ) , user . Watch )
m . Delete ( "" , reqToken ( ) , user . Unwatch )
2016-12-29 08:17:32 -05:00
} )
2016-12-31 11:51:22 -05:00
m . Group ( "/releases" , func ( ) {
m . Combo ( "" ) . Get ( repo . ListReleases ) .
2019-04-17 08:31:08 +03:00
Post ( reqToken ( ) , reqRepoWriter ( models . UnitTypeReleases ) , context . ReferencesGitRepo ( false ) , bind ( api . CreateReleaseOption { } ) , repo . CreateRelease )
2018-03-06 02:22:16 +01:00
m . Group ( "/:id" , func ( ) {
m . Combo ( "" ) . Get ( repo . GetRelease ) .
2019-04-17 08:31:08 +03:00
Patch ( reqToken ( ) , reqRepoWriter ( models . UnitTypeReleases ) , context . ReferencesGitRepo ( false ) , bind ( api . EditReleaseOption { } ) , repo . EditRelease ) .
2018-11-28 19:26:14 +08:00
Delete ( reqToken ( ) , reqRepoWriter ( models . UnitTypeReleases ) , repo . DeleteRelease )
2018-03-06 02:22:16 +01:00
m . Group ( "/assets" , func ( ) {
m . Combo ( "" ) . Get ( repo . ListReleaseAttachments ) .
2018-11-28 19:26:14 +08:00
Post ( reqToken ( ) , reqRepoWriter ( models . UnitTypeReleases ) , repo . CreateReleaseAttachment )
2018-03-06 02:22:16 +01:00
m . Combo ( "/:asset" ) . Get ( repo . GetReleaseAttachment ) .
2018-11-28 19:26:14 +08:00
Patch ( reqToken ( ) , reqRepoWriter ( models . UnitTypeReleases ) , bind ( api . EditAttachmentOptions { } ) , repo . EditReleaseAttachment ) .
Delete ( reqToken ( ) , reqRepoWriter ( models . UnitTypeReleases ) , repo . DeleteReleaseAttachment )
2018-03-06 02:22:16 +01:00
} )
} )
2018-11-28 19:26:14 +08:00
} , reqRepoReader ( models . UnitTypeReleases ) )
m . Post ( "/mirror-sync" , reqToken ( ) , reqRepoWriter ( models . UnitTypeCode ) , repo . MirrorSync )
m . Get ( "/editorconfig/:filename" , context . RepoRef ( ) , reqRepoReader ( models . UnitTypeCode ) , repo . GetEditorconfig )
2016-12-02 12:10:39 +01:00
m . Group ( "/pulls" , func ( ) {
2017-07-11 21:23:41 -04:00
m . Combo ( "" ) . Get ( bind ( api . ListPullRequestsOptions { } ) , repo . ListPullRequests ) .
2019-01-30 18:20:40 +01:00
Post ( reqToken ( ) , mustNotBeArchived , bind ( api . CreatePullRequestOption { } ) , repo . CreatePullRequest )
2016-12-02 12:10:39 +01:00
m . Group ( "/:index" , func ( ) {
2017-07-11 21:23:41 -04:00
m . Combo ( "" ) . Get ( repo . GetPullRequest ) .
2018-11-28 19:26:14 +08:00
Patch ( reqToken ( ) , reqRepoWriter ( models . UnitTypePullRequests ) , bind ( api . EditPullRequestOption { } ) , repo . EditPullRequest )
2017-07-11 21:23:41 -04:00
m . Combo ( "/merge" ) . Get ( repo . IsPullRequestMerged ) .
2019-01-30 18:20:40 +01:00
Post ( reqToken ( ) , mustNotBeArchived , reqRepoWriter ( models . UnitTypePullRequests ) , bind ( auth . MergePullRequestForm { } ) , repo . MergePullRequest )
2016-12-02 12:10:39 +01:00
} )
2019-04-17 08:31:08 +03:00
} , mustAllowPulls , reqRepoReader ( models . UnitTypeCode ) , context . ReferencesGitRepo ( false ) )
2017-04-21 13:32:31 +02:00
m . Group ( "/statuses" , func ( ) {
2017-07-11 21:23:41 -04:00
m . Combo ( "/:sha" ) . Get ( repo . GetCommitStatuses ) .
2018-11-28 19:26:14 +08:00
Post ( reqToken ( ) , bind ( api . CreateStatusOption { } ) , repo . NewCommitStatus )
} , reqRepoReader ( models . UnitTypeCode ) )
2017-04-21 13:32:31 +02:00
m . Group ( "/commits/:ref" , func ( ) {
2019-06-08 10:31:11 -04:00
// TODO: Add m.Get("") for single commit (https://developer.github.com/v3/repos/commits/#get-a-single-commit)
2017-11-12 23:02:25 -08:00
m . Get ( "/status" , repo . GetCombinedCommitStatusByRef )
m . Get ( "/statuses" , repo . GetCommitStatusesByRef )
2018-11-28 19:26:14 +08:00
} , reqRepoReader ( models . UnitTypeCode ) )
2018-11-27 23:52:20 +02:00
m . Group ( "/git" , func ( ) {
2019-02-03 11:35:17 +08:00
m . Group ( "/commits" , func ( ) {
m . Get ( "/:sha" , repo . GetSingleCommit )
} )
2018-11-27 23:52:20 +02:00
m . Get ( "/refs" , repo . GetGitAllRefs )
m . Get ( "/refs/*" , repo . GetGitRefs )
2019-04-17 10:06:35 -06:00
m . Get ( "/trees/:sha" , context . RepoRef ( ) , repo . GetTree )
m . Get ( "/blobs/:sha" , context . RepoRef ( ) , repo . GetBlob )
2019-06-08 10:31:11 -04:00
m . Get ( "/tags/:sha" , context . RepoRef ( ) , repo . GetTag )
2019-04-17 10:06:35 -06:00
} , reqRepoReader ( models . UnitTypeCode ) )
m . Group ( "/contents" , func ( ) {
2019-06-29 16:51:10 -04:00
m . Get ( "" , repo . GetContentsList )
m . Get ( "/*" , repo . GetContents )
2019-04-17 10:06:35 -06:00
m . Group ( "/*" , func ( ) {
m . Post ( "" , bind ( api . CreateFileOptions { } ) , repo . CreateFile )
m . Put ( "" , bind ( api . UpdateFileOptions { } ) , repo . UpdateFile )
m . Delete ( "" , bind ( api . DeleteFileOptions { } ) , repo . DeleteFile )
} , reqRepoWriter ( models . UnitTypeCode ) , reqToken ( ) )
2018-11-28 19:26:14 +08:00
} , reqRepoReader ( models . UnitTypeCode ) )
2016-08-04 17:08:01 -07:00
} , repoAssignment ( ) )
2017-07-11 21:23:41 -04:00
} )
2015-12-04 17:16:42 -05:00
2015-12-17 02:28:47 -05:00
// Organizations
2016-08-04 17:08:01 -07:00
m . Get ( "/user/orgs" , reqToken ( ) , org . ListMyOrgs )
2015-12-17 02:28:47 -05:00
m . Get ( "/users/:username/orgs" , org . ListUserOrgs )
2018-11-21 01:31:30 +08:00
m . Post ( "/orgs" , reqToken ( ) , bind ( api . CreateOrgOption { } ) , org . Create )
2016-03-21 12:53:04 -04:00
m . Group ( "/orgs/:orgname" , func ( ) {
2017-07-13 04:14:15 -07:00
m . Get ( "/repos" , user . ListOrgRepos )
2017-01-26 06:54:04 -05:00
m . Combo ( "" ) . Get ( org . Get ) .
2018-12-27 21:06:58 +05:30
Patch ( reqToken ( ) , reqOrgOwnership ( ) , bind ( api . EditOrgOption { } ) , org . Edit ) .
Delete ( reqToken ( ) , reqOrgOwnership ( ) , org . Delete )
2017-01-19 19:31:46 -07:00
m . Group ( "/members" , func ( ) {
m . Get ( "" , org . ListMembers )
2017-01-26 06:54:04 -05:00
m . Combo ( "/:username" ) . Get ( org . IsMember ) .
2017-06-07 12:20:32 -04:00
Delete ( reqToken ( ) , reqOrgOwnership ( ) , org . DeleteMember )
2017-01-19 19:31:46 -07:00
} )
m . Group ( "/public_members" , func ( ) {
m . Get ( "" , org . ListPublicMembers )
m . Combo ( "/:username" ) . Get ( org . IsPublicMember ) .
2017-06-07 12:20:32 -04:00
Put ( reqToken ( ) , reqOrgMembership ( ) , org . PublicizeMember ) .
Delete ( reqToken ( ) , reqOrgMembership ( ) , org . ConcealMember )
2017-01-19 19:31:46 -07:00
} )
2017-06-07 12:20:32 -04:00
m . Combo ( "/teams" , reqToken ( ) , reqOrgMembership ( ) ) . Get ( org . ListTeams ) .
2019-07-03 13:31:29 +08:00
Post ( reqOrgOwnership ( ) , bind ( api . CreateTeamOption { } ) , org . CreateTeam )
2016-12-06 23:36:28 -05:00
m . Group ( "/hooks" , func ( ) {
m . Combo ( "" ) . Get ( org . ListHooks ) .
Post ( bind ( api . CreateHookOption { } ) , org . CreateHook )
m . Combo ( "/:id" ) . Get ( org . GetHook ) .
2019-07-03 13:31:29 +08:00
Patch ( bind ( api . EditHookOption { } ) , org . EditHook ) .
Delete ( org . DeleteHook )
} , reqToken ( ) , reqOrgOwnership ( ) )
2016-08-04 17:08:01 -07:00
} , orgAssignment ( true ) )
2016-12-27 20:36:04 -05:00
m . Group ( "/teams/:teamid" , func ( ) {
2017-01-19 22:16:10 -07:00
m . Combo ( "" ) . Get ( org . GetTeam ) .
2017-01-26 06:54:04 -05:00
Patch ( reqOrgOwnership ( ) , bind ( api . EditTeamOption { } ) , org . EditTeam ) .
Delete ( reqOrgOwnership ( ) , org . DeleteTeam )
2017-01-19 22:16:10 -07:00
m . Group ( "/members" , func ( ) {
m . Get ( "" , org . GetTeamMembers )
2017-01-26 06:54:04 -05:00
m . Combo ( "/:username" ) .
2019-01-17 06:09:50 +05:30
Get ( org . GetTeamMember ) .
2017-01-26 06:54:04 -05:00
Put ( reqOrgOwnership ( ) , org . AddTeamMember ) .
Delete ( reqOrgOwnership ( ) , org . RemoveTeamMember )
2017-01-19 22:16:10 -07:00
} )
m . Group ( "/repos" , func ( ) {
m . Get ( "" , org . GetTeamRepos )
2017-06-07 17:57:28 +02:00
m . Combo ( "/:orgname/:reponame" ) .
2017-01-26 06:54:04 -05:00
Put ( org . AddTeamRepository ) .
Delete ( org . RemoveTeamRepository )
2017-01-19 22:16:10 -07:00
} )
2019-04-24 13:32:35 +08:00
} , orgAssignment ( false , true ) , reqToken ( ) , reqTeamMembership ( ) )
2015-12-17 02:28:47 -05:00
2019-03-18 21:29:43 -05:00
m . Any ( "/*" , func ( ctx * context . APIContext ) {
ctx . NotFound ( )
2015-12-04 17:16:42 -05:00
} )
2015-12-05 17:13:13 -05:00
m . Group ( "/admin" , func ( ) {
2019-01-24 04:00:19 +05:30
m . Get ( "/orgs" , admin . GetAllOrgs )
2015-12-05 17:13:13 -05:00
m . Group ( "/users" , func ( ) {
2019-01-24 04:00:19 +05:30
m . Get ( "" , admin . GetAllUsers )
2015-12-05 17:13:13 -05:00
m . Post ( "" , bind ( api . CreateUserOption { } ) , admin . CreateUser )
m . Group ( "/:username" , func ( ) {
m . Combo ( "" ) . Patch ( bind ( api . EditUserOption { } ) , admin . EditUser ) .
Delete ( admin . DeleteUser )
2017-12-06 12:27:10 +02:00
m . Group ( "/keys" , func ( ) {
m . Post ( "" , bind ( api . CreateKeyOption { } ) , admin . CreatePublicKey )
m . Delete ( "/:id" , admin . DeleteUserPublicKey )
} )
2019-01-24 04:00:19 +05:30
m . Get ( "/orgs" , org . ListUserOrgs )
2015-12-17 02:28:47 -05:00
m . Post ( "/orgs" , bind ( api . CreateOrgOption { } ) , admin . CreateOrg )
2015-12-17 22:57:41 -05:00
m . Post ( "/repos" , bind ( api . CreateRepoOption { } ) , admin . CreateRepo )
2015-12-05 17:13:13 -05:00
} )
} )
2018-11-28 19:26:14 +08:00
} , reqToken ( ) , reqSiteAdmin ( ) )
2018-04-11 10:51:44 +08:00
m . Group ( "/topics" , func ( ) {
m . Get ( "/search" , repo . TopicSearch )
} )
2019-05-13 08:38:53 -07:00
} , handlers ... )
}
func securityHeaders ( ) macaron . Handler {
return func ( ctx * macaron . Context ) {
ctx . Resp . Before ( func ( w macaron . ResponseWriter ) {
// CORB: https://www.chromium.org/Home/chromium-security/corb-for-developers
// http://stackoverflow.com/a/3146618/244009
w . Header ( ) . Set ( "x-content-type-options" , "nosniff" )
} )
}
2015-12-04 17:16:42 -05:00
}