1
0

access_tokens.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package user
  2. import (
  3. gocontext "context"
  4. "net/http"
  5. "github.com/flamego/flamego"
  6. api "github.com/gogs/go-gogs-client"
  7. "gogs.io/gogs/internal/context"
  8. "gogs.io/gogs/internal/database"
  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([]*api.AccessToken, len(tokens))
  29. for i := range tokens {
  30. apiTokens[i] = &api.AccessToken{Name: tokens[i].Name, Sha1: tokens[i].Sha1}
  31. }
  32. c.JSONSuccess(&apiTokens)
  33. }
  34. }
  35. func (h *AccessTokensHandler) Create() macaron.Handler {
  36. return func(c *context.APIContext, form api.CreateAccessTokenOption) {
  37. t, err := h.store.CreateAccessToken(c.Req.Context(), c.User.ID, form.Name)
  38. if err != nil {
  39. if database.IsErrAccessTokenAlreadyExist(err) {
  40. c.ErrorStatus(http.StatusUnprocessableEntity, err)
  41. } else {
  42. c.Error(err, "new access token")
  43. }
  44. return
  45. }
  46. c.JSON(http.StatusCreated, &api.AccessToken{Name: t.Name, Sha1: t.Sha1})
  47. }
  48. }
  49. // AccessTokensStore is the data layer carrier for user access tokens API
  50. // endpoints. This interface is meant to abstract away and limit the exposure of
  51. // the underlying data layer to the handler through a thin-wrapper.
  52. type AccessTokensStore interface {
  53. // CreateAccessToken creates a new access token and persist to database. It
  54. // returns database.ErrAccessTokenAlreadyExist when an access token with same
  55. // name already exists for the user.
  56. CreateAccessToken(ctx gocontext.Context, userID int64, name string) (*database.AccessToken, error)
  57. // ListAccessTokens returns all access tokens belongs to given user.
  58. ListAccessTokens(ctx gocontext.Context, userID int64) ([]*database.AccessToken, error)
  59. }
  60. type accessTokensStore struct{}
  61. // NewAccessTokensStore returns a new AccessTokensStore using the global
  62. // database handle.
  63. func NewAccessTokensStore() AccessTokensStore {
  64. return &accessTokensStore{}
  65. }
  66. func (*accessTokensStore) CreateAccessToken(ctx gocontext.Context, userID int64, name string) (*database.AccessToken, error) {
  67. return database.Handle.AccessTokens().Create(ctx, userID, name)
  68. }
  69. func (*accessTokensStore) ListAccessTokens(ctx gocontext.Context, userID int64) ([]*database.AccessToken, error) {
  70. return database.Handle.AccessTokens().List(ctx, userID)
  71. }