github.com/covergates/covergates@v0.2.2-0.20201009050117-42ef8a19fb95/routers/api/api.go (about)

     1  package api
     2  
     3  import (
     4  	"net/url"
     5  
     6  	"github.com/covergates/covergates/config"
     7  	"github.com/covergates/covergates/core"
     8  	"github.com/covergates/covergates/routers/api/repo"
     9  	"github.com/covergates/covergates/routers/api/report"
    10  	"github.com/covergates/covergates/routers/api/request"
    11  	"github.com/covergates/covergates/routers/api/user"
    12  	"github.com/covergates/covergates/routers/docs"
    13  	"github.com/gin-gonic/gin"
    14  	swaggerFiles "github.com/swaggo/files"
    15  	ginSwagger "github.com/swaggo/gin-swagger"
    16  )
    17  
    18  //go:generate swag init -g ./api.go -d ./ -o ../docs
    19  
    20  // @title CodeCover API
    21  // @version 1.0
    22  // @description REST API for CodeCover
    23  // @termsOfService http://swagger.io/terms/
    24  
    25  // @license.name Apache 2.0
    26  // @license.url http://www.apache.org/licenses/LICENSE-2.0.html
    27  
    28  // @host localhost:8080
    29  // @BasePath /api/v1
    30  
    31  // Router for API
    32  type Router struct {
    33  	Config  *config.Config
    34  	Session core.Session
    35  	// service
    36  	CoverageService core.CoverageService
    37  	ChartService    core.ChartService
    38  	SCMService      core.SCMService
    39  	RepoService     core.RepoService
    40  	ReportService   core.ReportService
    41  	HookService     core.HookService
    42  	OAuthService    core.OAuthService
    43  	// store
    44  	UserStore   core.UserStore
    45  	ReportStore core.ReportStore
    46  	RepoStore   core.RepoStore
    47  	OAuthStore  core.OAuthStore
    48  }
    49  
    50  func host(addr string) string {
    51  	u, err := url.Parse(addr)
    52  	if err != nil {
    53  		return addr
    54  	}
    55  	return u.Host
    56  }
    57  
    58  // RegisterRoutes for API
    59  func (r *Router) RegisterRoutes(e *gin.Engine) {
    60  	docs.SwaggerInfo.Host = host(r.Config.Server.Addr)
    61  	checkLogin := request.CheckLogin(r.Session, r.OAuthService)
    62  	e.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
    63  	g := e.Group("/api/v1")
    64  	{
    65  		g := g.Group("/user")
    66  		g.GET("", checkLogin, user.HandleGet())
    67  		g.POST("", user.HandleCreate())
    68  		g.GET("/scm", checkLogin, user.HandleGetSCM(r.Config))
    69  		g.GET("/owner/:scm/:namespace/:name", checkLogin, user.HandleGetOwner(r.RepoStore, r.SCMService))
    70  		// tokens
    71  		g.POST("/tokens", checkLogin, user.HandleCreateToken(r.OAuthService))
    72  		g.GET("/tokens", checkLogin, user.HandleListTokens(r.OAuthService))
    73  		g.DELETE("tokens/:id", checkLogin, user.HandleDeleteToken(r.OAuthService, r.OAuthStore))
    74  		// repo
    75  		g.PATCH("/repos", checkLogin, user.HandleSynchronizeRepo(r.RepoService))
    76  		g.GET("/repos", checkLogin, user.HandleListRepo(r.UserStore))
    77  	}
    78  	{
    79  		g := g.Group("/reports")
    80  		g.POST("/:id",
    81  			report.InjectReportContext(r.RepoStore),
    82  			report.ProtectReport(
    83  				checkLogin,
    84  				r.RepoStore,
    85  				r.SCMService,
    86  			),
    87  			report.HandleUpload(
    88  				r.CoverageService,
    89  				r.ReportStore,
    90  			))
    91  		g.POST("/:id/comment/:number", report.HandleComment(
    92  			r.Config,
    93  			r.SCMService,
    94  			r.RepoStore,
    95  			r.ReportStore,
    96  			r.ReportService,
    97  		))
    98  		g.GET("/:id", report.HandleGet(r.ReportStore, r.RepoStore, r.SCMService))
    99  		g.GET("/:id/treemap/*ref", report.HandleGetTreeMap(
   100  			r.ReportStore,
   101  			r.RepoStore,
   102  			r.ChartService,
   103  		))
   104  		g.GET("/:id/card", report.HandleGetCard(r.RepoStore, r.ReportStore, r.ChartService))
   105  		g.GET("/:id/badge", report.HandleGetBadge(r.ReportStore, r.RepoStore))
   106  	}
   107  	{
   108  		g := g.Group("/repos")
   109  		g.Use(checkLogin)
   110  		g.GET("", repo.HandleListAll(r.Config, r.SCMService, r.RepoStore))
   111  		g.POST("", repo.HandleCreate(r.RepoStore, r.SCMService))
   112  		g.GET("/:scm", repo.HandleListSCM(r.SCMService, r.RepoStore))
   113  		{
   114  			g := g.Group("/:scm/:namespace/:name")
   115  			g.PATCH("", repo.HandleSync(r.SCMService, r.RepoStore))
   116  			g.GET("/setting", repo.HandleGetSetting(r.RepoStore))
   117  			g.POST("/setting", repo.WithRepo(r.RepoStore), repo.HandleUpdateSetting(r.RepoStore, r.SCMService))
   118  			g.PATCH("/report", repo.HandleReportIDRenew(r.RepoStore, r.SCMService))
   119  			g.GET("/files", repo.HandleGetFiles(r.SCMService))
   120  			g.GET("/content/*path", repo.HandleGetFileContent(r.SCMService))
   121  			g.POST("/hook/create", repo.WithRepo(r.RepoStore), repo.HandleHookCreate(r.HookService))
   122  			g.GET("/commits", repo.WithRepo(r.RepoStore), repo.HandleListCommits(r.SCMService))
   123  			g.GET("/branches", repo.WithRepo(r.RepoStore), repo.HandleListBranches(r.SCMService))
   124  		}
   125  	}
   126  	{
   127  		// repo api without authorization required
   128  		g := g.Group("/repos/:scm/:namespace/:name")
   129  		g.GET("", repo.HandleGet(r.RepoStore))
   130  		g.POST("/hook", repo.WithRepo(r.RepoStore), repo.HandleHook(r.SCMService, r.HookService))
   131  	}
   132  }