github.com/covergates/covergates@v0.2.2-0.20201009050117-42ef8a19fb95/routers/api/user/user.go (about) 1 package user 2 3 import ( 4 "strings" 5 6 "github.com/covergates/covergates/config" 7 "github.com/covergates/covergates/core" 8 "github.com/covergates/covergates/routers/api/request" 9 "github.com/gin-gonic/gin" 10 ) 11 12 // User for API response 13 type User struct { 14 Login string `json:"login"` 15 Email string `json:"email"` 16 Avatar string `json:"avatar"` 17 } 18 19 // Providers defines lined SCM accounts 20 type Providers map[string]bool 21 22 // HandleCreate new user 23 func HandleCreate() gin.HandlerFunc { 24 return func(c *gin.Context) { 25 // TODO: Implement user create 26 } 27 } 28 29 // HandleGet login user 30 // @Summary Get login user 31 // @Tags User 32 // @Success 200 {object} User "user" 33 // @Failure 404 {string} string "error" 34 // @Router /user [get] 35 func HandleGet() gin.HandlerFunc { 36 return func(c *gin.Context) { 37 user, ok := request.UserFrom(c) 38 if !ok { 39 c.String(404, "user not found") 40 return 41 } 42 u := User{ 43 Login: user.Login, 44 Email: user.Email, 45 Avatar: user.Avatar, 46 } 47 c.JSON(200, u) 48 } 49 } 50 51 // HandleGetSCM binds to login user 52 // @Summary Get user's SCM binding state 53 // @Tags User 54 // @Success 200 {object} Providers "providers" 55 // @Failure 404 {object} Providers "providers" 56 // @Router /user/scm [get] 57 func HandleGetSCM(config *config.Config) gin.HandlerFunc { 58 return func(c *gin.Context) { 59 providers := make(Providers) 60 user, ok := request.UserFrom(c) 61 if !ok { 62 c.JSON(404, providers) 63 return 64 } 65 for _, scm := range config.Providers() { 66 login := "" 67 switch scm { 68 case core.Gitea: 69 login = user.GiteaLogin 70 case core.Github: 71 login = user.GithubLogin 72 case core.GitLab: 73 login = user.GitLabLogin 74 default: 75 login = "" 76 } 77 providers[strings.ToLower(string(scm))] = login != "" 78 } 79 c.JSON(200, providers) 80 } 81 } 82 83 // HandleGetOwner of the repository 84 // @Summary Get repository's owner 85 // @Tags User 86 // @Param scm path string true "SCM" 87 // @Param namespace path string true "Namespace" 88 // @Param name path string true "name" 89 // @Success 200 {object} User "owner" 90 // @Router /user/owner/{scm}/{namespace}/{name} [get] 91 func HandleGetOwner(store core.RepoStore, service core.SCMService) gin.HandlerFunc { 92 return func(c *gin.Context) { 93 provider := core.SCMProvider(c.Param("scm")) 94 repo, err := store.Find(&core.Repo{ 95 NameSpace: c.Param("namespace"), 96 Name: c.Param("name"), 97 SCM: provider, 98 }) 99 if err != nil { 100 c.JSON(404, &User{}) 101 return 102 } 103 user, ok := request.UserFrom(c) 104 if !ok { 105 c.JSON(401, &User{}) 106 return 107 } 108 109 client, err := service.Client(provider) 110 if err != nil { 111 c.Error(err) 112 c.JSON(500, &User{}) 113 return 114 } 115 116 if client.Repositories().IsAdmin(c.Request.Context(), user, repo.FullName()) { 117 c.JSON(200, &User{ 118 Avatar: user.Avatar, 119 Email: user.Email, 120 Login: user.Login, 121 }) 122 return 123 } 124 125 owner, err := store.Creator(repo) 126 if err != nil { 127 c.JSON(404, &User{}) 128 return 129 } 130 if owner.Login != user.Login { 131 c.JSON(401, &User{}) 132 return 133 } 134 c.JSON(200, &User{ 135 Avatar: owner.Avatar, 136 Email: owner.Email, 137 Login: owner.Login, 138 }) 139 } 140 }