mirror of https://github.com/gogs/gogs.git
89 lines
2.8 KiB
Go
89 lines
2.8 KiB
Go
// Copyright 2014 The Gogs Authors. All rights reserved.
|
|
// Use of this source code is governed by a MIT-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package user
|
|
|
|
import (
|
|
gocontext "context"
|
|
"net/http"
|
|
|
|
api "github.com/gogs/go-gogs-client"
|
|
"gopkg.in/macaron.v1"
|
|
|
|
"gogs.io/gogs/internal/context"
|
|
"gogs.io/gogs/internal/database"
|
|
)
|
|
|
|
// AccessTokensHandler is the handler for users access tokens API endpoints.
|
|
type AccessTokensHandler struct {
|
|
store AccessTokensStore
|
|
}
|
|
|
|
// NewAccessTokensHandler returns a new AccessTokensHandler for users access
|
|
// tokens API endpoints.
|
|
func NewAccessTokensHandler(s AccessTokensStore) *AccessTokensHandler {
|
|
return &AccessTokensHandler{
|
|
store: s,
|
|
}
|
|
}
|
|
|
|
func (h *AccessTokensHandler) List() macaron.Handler {
|
|
return func(c *context.APIContext) {
|
|
tokens, err := h.store.ListAccessTokens(c.Req.Context(), c.User.ID)
|
|
if err != nil {
|
|
c.Error(err, "list access tokens")
|
|
return
|
|
}
|
|
|
|
apiTokens := make([]*api.AccessToken, len(tokens))
|
|
for i := range tokens {
|
|
apiTokens[i] = &api.AccessToken{Name: tokens[i].Name, Sha1: tokens[i].Sha1}
|
|
}
|
|
c.JSONSuccess(&apiTokens)
|
|
}
|
|
}
|
|
|
|
func (h *AccessTokensHandler) Create() macaron.Handler {
|
|
return func(c *context.APIContext, form api.CreateAccessTokenOption) {
|
|
t, err := h.store.CreateAccessToken(c.Req.Context(), c.User.ID, form.Name)
|
|
if err != nil {
|
|
if database.IsErrAccessTokenAlreadyExist(err) {
|
|
c.ErrorStatus(http.StatusUnprocessableEntity, err)
|
|
} else {
|
|
c.Error(err, "new access token")
|
|
}
|
|
return
|
|
}
|
|
c.JSON(http.StatusCreated, &api.AccessToken{Name: t.Name, Sha1: t.Sha1})
|
|
}
|
|
}
|
|
|
|
// AccessTokensStore is the data layer carrier for user access tokens API
|
|
// endpoints. This interface is meant to abstract away and limit the exposure of
|
|
// the underlying data layer to the handler through a thin-wrapper.
|
|
type AccessTokensStore interface {
|
|
// CreateAccessToken creates a new access token and persist to database. It
|
|
// returns database.ErrAccessTokenAlreadyExist when an access token with same
|
|
// name already exists for the user.
|
|
CreateAccessToken(ctx gocontext.Context, userID int64, name string) (*database.AccessToken, error)
|
|
// ListAccessTokens returns all access tokens belongs to given user.
|
|
ListAccessTokens(ctx gocontext.Context, userID int64) ([]*database.AccessToken, error)
|
|
}
|
|
|
|
type accessTokensStore struct{}
|
|
|
|
// NewAccessTokensStore returns a new AccessTokensStore using the global
|
|
// database handle.
|
|
func NewAccessTokensStore() AccessTokensStore {
|
|
return &accessTokensStore{}
|
|
}
|
|
|
|
func (*accessTokensStore) CreateAccessToken(ctx gocontext.Context, userID int64, name string) (*database.AccessToken, error) {
|
|
return database.Handle.AccessTokens().Create(ctx, userID, name)
|
|
}
|
|
|
|
func (*accessTokensStore) ListAccessTokens(ctx gocontext.Context, userID int64) ([]*database.AccessToken, error) {
|
|
return database.Handle.AccessTokens().List(ctx, userID)
|
|
}
|