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

     1  package user
     2  
     3  import (
     4  	"strconv"
     5  	"time"
     6  
     7  	"github.com/covergates/covergates/core"
     8  	"github.com/covergates/covergates/routers/api/request"
     9  	"github.com/gin-gonic/gin"
    10  )
    11  
    12  // Token for API
    13  type Token struct {
    14  	ID        uint      `json:"id"`
    15  	Name      string    `json:"name"`
    16  	CreatedAt time.Time `json:"createdAt"`
    17  }
    18  
    19  // HandleCreateToken for user
    20  // @Summary create OAuth token
    21  // @Tags User
    22  // @Param name formData string false "token name"
    23  // @Success 200 {object} string access token
    24  // @Router /user/tokens [post]
    25  func HandleCreateToken(service core.OAuthService) gin.HandlerFunc {
    26  	return func(c *gin.Context) {
    27  		user, ok := request.UserFrom(c)
    28  		if !ok {
    29  			c.String(401, "")
    30  			return
    31  		}
    32  		tokenName := c.PostForm("name")
    33  		ctx := service.WithUser(c.Request.Context(), user)
    34  		token, err := service.CreateToken(ctx, tokenName)
    35  		if err != nil {
    36  			c.Error(err)
    37  			c.String(500, "")
    38  			return
    39  		}
    40  		c.String(200, token.Access)
    41  	}
    42  }
    43  
    44  // HandleListTokens for user
    45  // @Summary list OAuth tokens
    46  // @Tags User
    47  // @Success 200 {object} []Token "list of tokens"
    48  // @Router /user/tokens [get]
    49  func HandleListTokens(service core.OAuthService) gin.HandlerFunc {
    50  	return func(c *gin.Context) {
    51  		user, ok := request.UserFrom(c)
    52  		if !ok {
    53  			c.JSON(401, []*Token{})
    54  			return
    55  		}
    56  		ctx := service.WithUser(c.Request.Context(), user)
    57  		tokens, err := service.ListTokens(ctx)
    58  		if err != nil {
    59  			c.Error(err)
    60  			c.JSON(500, []*Token{})
    61  			return
    62  		}
    63  		result := make([]*Token, len(tokens))
    64  		for i, token := range tokens {
    65  			result[i] = &Token{
    66  				ID:        token.ID,
    67  				Name:      token.Name,
    68  				CreatedAt: token.CreatedAt,
    69  			}
    70  		}
    71  		c.JSON(200, result)
    72  	}
    73  }
    74  
    75  // HandleDeleteToken with token id
    76  // @Summary delete token with id
    77  // @Tags User
    78  // @Param id path integer true "token id"
    79  // @Success 200 {object} Token "deleted token"
    80  // @Router /user/tokens/{id} [delete]
    81  func HandleDeleteToken(service core.OAuthService, store core.OAuthStore) gin.HandlerFunc {
    82  	return func(c *gin.Context) {
    83  		user, ok := request.UserFrom(c)
    84  		if !ok {
    85  			c.JSON(401, &Token{})
    86  			return
    87  		}
    88  		id, err := strconv.ParseUint(c.Param("id"), 10, 64)
    89  		if err != nil {
    90  			c.Error(err)
    91  			c.JSON(400, &Token{})
    92  			return
    93  		}
    94  		token, err := store.Find(&core.OAuthToken{ID: uint(id)})
    95  		if err != nil {
    96  			c.Error(err)
    97  			c.JSON(500, &Token{})
    98  			return
    99  		}
   100  		ctx := service.WithUser(c.Request.Context(), user)
   101  		if err := service.DeleteToken(ctx, token); err != nil {
   102  			c.Error(err)
   103  			c.JSON(500, &Token{})
   104  			return
   105  		}
   106  		c.JSON(200, &Token{ID: token.ID, Name: token.Name})
   107  	}
   108  }