1
0

user_access_tokens.go 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package v1
  2. import (
  3. gocontext "context"
  4. "net/http"
  5. "gopkg.in/macaron.v1"
  6. "gogs.io/gogs/internal/context"
  7. "gogs.io/gogs/internal/database"
  8. "gogs.io/gogs/internal/route/api/v1/types"
  9. )
  10. // accessTokensHandler is the handler for users access tokens API endpoints.
  11. type accessTokensHandler struct {
  12. store AccessTokensStore
  13. }
  14. // newAccessTokensHandler returns a new accessTokensHandler for users access
  15. // tokens API endpoints.
  16. func newAccessTokensHandler(s AccessTokensStore) *accessTokensHandler {
  17. return &accessTokensHandler{
  18. store: s,
  19. }
  20. }
  21. func (h *accessTokensHandler) List() macaron.Handler {
  22. return func(c *context.APIContext) {
  23. tokens, err := h.store.ListAccessTokens(c.Req.Context(), c.User.ID)
  24. if err != nil {
  25. c.Error(err, "list access tokens")
  26. return
  27. }
  28. apiTokens := make([]*types.UserAccessToken, len(tokens))
  29. for i := range tokens {
  30. apiTokens[i] = &types.UserAccessToken{
  31. Name: tokens[i].Name,
  32. Sha1: tokens[i].Sha1,
  33. }
  34. }
  35. c.JSONSuccess(&apiTokens)
  36. }
  37. }
  38. type createAccessTokenRequest struct {
  39. Name string `json:"name" binding:"Required"`
  40. }
  41. func (h *accessTokensHandler) Create() macaron.Handler {
  42. return func(c *context.APIContext, form createAccessTokenRequest) {
  43. t, err := h.store.CreateAccessToken(c.Req.Context(), c.User.ID, form.Name)
  44. if err != nil {
  45. if database.IsErrAccessTokenAlreadyExist(err) {
  46. c.ErrorStatus(http.StatusUnprocessableEntity, err)
  47. } else {
  48. c.Error(err, "new access token")
  49. }
  50. return
  51. }
  52. c.JSON(http.StatusCreated, &types.UserAccessToken{
  53. Name: t.Name,
  54. Sha1: t.Sha1,
  55. })
  56. }
  57. }
  58. // AccessTokensStore is the data layer carrier for user access tokens API
  59. // endpoints. This interface is meant to abstract away and limit the exposure of
  60. // the underlying data layer to the handler through a thin-wrapper.
  61. type AccessTokensStore interface {
  62. // CreateAccessToken creates a new access token and persist to database. It
  63. // returns database.ErrAccessTokenAlreadyExist when an access token with same
  64. // name already exists for the user.
  65. CreateAccessToken(ctx gocontext.Context, userID int64, name string) (*database.AccessToken, error)
  66. // ListAccessTokens returns all access tokens belongs to given user.
  67. ListAccessTokens(ctx gocontext.Context, userID int64) ([]*database.AccessToken, error)
  68. }
  69. type accessTokensStore struct{}
  70. // newAccessTokensStore returns a new AccessTokensStore using the global
  71. // database handle.
  72. func newAccessTokensStore() AccessTokensStore {
  73. return &accessTokensStore{}
  74. }
  75. func (*accessTokensStore) CreateAccessToken(ctx gocontext.Context, userID int64, name string) (*database.AccessToken, error) {
  76. return database.Handle.AccessTokens().Create(ctx, userID, name)
  77. }
  78. func (*accessTokensStore) ListAccessTokens(ctx gocontext.Context, userID int64) ([]*database.AccessToken, error) {
  79. return database.Handle.AccessTokens().List(ctx, userID)
  80. }