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  }