Skip to content

Commit

Permalink
Merge pull request #19 from ystv/bearer-token
Browse files Browse the repository at this point in the history
Bearer token support
  • Loading branch information
rmil authored Mar 6, 2022
2 parents b35e362 + 6a5217a commit 94e3645
Show file tree
Hide file tree
Showing 22 changed files with 241 additions and 220 deletions.
12 changes: 10 additions & 2 deletions controllers/v1/clapper/clapper.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,25 @@ import (
"github.com/ystv/web-api/services/clapper/event"
"github.com/ystv/web-api/services/clapper/position"
"github.com/ystv/web-api/services/clapper/signup"
"github.com/ystv/web-api/utils"
)

// Repos encapsulates the dependency
type Repos struct {
access *utils.Accesser
crew clapper.CrewRepo
event clapper.EventRepo
signup clapper.SignupRepo
position clapper.PositionRepo
}

// NewRepos creates our data store
func NewRepos(db *sqlx.DB) *Repos {
return &Repos{crew.NewStore(db), event.NewStore(db), signup.NewStore(db), position.NewStore(db)}
func NewRepos(db *sqlx.DB, access *utils.Accesser) *Repos {
return &Repos{
access,
crew.NewStore(db),
event.NewStore(db),
signup.NewStore(db),
position.NewStore(db),
}
}
5 changes: 2 additions & 3 deletions controllers/v1/clapper/crew.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"strconv"

"github.com/labstack/echo/v4"
"github.com/ystv/web-api/utils"
)

// SetCrew handles setting the user ID for a crew object,
Expand All @@ -24,7 +23,7 @@ import (
// @Success 200
// @Router /v1/internal/clapper/event/{eventid}/{signupid}/{crewid} [put]
func (r *Repos) SetCrew(c echo.Context) error {
p, err := utils.GetTokenEcho(c)
p, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("SetCrew: failed to get token: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down Expand Up @@ -53,7 +52,7 @@ func (r *Repos) SetCrew(c echo.Context) error {
// @Success 200
// @Router /v1/internal/clapper/event/{signupid}/{crewid}/reset [put]
func (r *Repos) ResetCrew(c echo.Context) error {
_, err := utils.GetTokenEcho(c)
_, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("ResetCrew: failed to get token: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down
5 changes: 2 additions & 3 deletions controllers/v1/clapper/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (

"github.com/labstack/echo/v4"
"github.com/ystv/web-api/services/clapper"
"github.com/ystv/web-api/utils"
)

// ListMonth returns all events for a month.
Expand Down Expand Up @@ -78,7 +77,7 @@ func (r *Repos) NewEvent(c echo.Context) error {
err = fmt.Errorf("NewEvent: failed to bind to request json: %w", err)
return echo.NewHTTPError(http.StatusBadRequest, err)
}
p, err := utils.GetTokenEcho(c)
p, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("NewEvent: failed to get token: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down Expand Up @@ -108,7 +107,7 @@ func (r *Repos) UpdateEvent(c echo.Context) error {
err = fmt.Errorf("UpdateEvent: failed to bind to request json: %w", err)
return echo.NewHTTPError(http.StatusBadRequest, err)
}
p, err := utils.GetTokenEcho(c)
p, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("UpdateEvent: failed to get token: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down
5 changes: 4 additions & 1 deletion controllers/v1/creator/creator.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ import (
"github.com/ystv/web-api/services/creator/series"
"github.com/ystv/web-api/services/creator/video"
"github.com/ystv/web-api/services/encoder"
"github.com/ystv/web-api/utils"
)

// Repos represents all our data repositories
type Repos struct {
access *utils.Accesser
video creator.VideoRepo
series creator.SeriesRepo
playlist creator.PlaylistRepo
Expand All @@ -34,12 +36,13 @@ type Config struct {
}

// NewRepos creates our data repositories
func NewRepos(db *sqlx.DB, cdn *s3.S3, enc *encoder.Encoder, conf *Config) *Repos {
func NewRepos(db *sqlx.DB, cdn *s3.S3, enc *encoder.Encoder, access *utils.Accesser, conf *Config) *Repos {
config := &creator.Config{
IngestBucket: conf.IngestBucket,
ServeBucket: conf.ServeBucket,
}
return &Repos{
access,
video.NewStore(db, cdn, enc, config),
series.NewController(db, cdn, enc, config),
playlist.NewStore(db),
Expand Down
5 changes: 2 additions & 3 deletions controllers/v1/creator/playlist.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (

"github.com/labstack/echo/v4"
"github.com/ystv/web-api/services/creator/types/playlist"
"github.com/ystv/web-api/utils"
)

// ListPlaylist handles listing all playlist metadata's
Expand Down Expand Up @@ -66,7 +65,7 @@ func (r *Repos) NewPlaylist(c echo.Context) error {
return echo.NewHTTPError(http.StatusBadRequest, err)
}

claims, err := utils.GetTokenEcho(c)
claims, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("PlaylistUpdate failed to get user ID: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down Expand Up @@ -97,7 +96,7 @@ func (r *Repos) UpdatePlaylist(c echo.Context) error {
err = fmt.Errorf("PlaylistUpdate: failed to bind json: %w", err)
return echo.NewHTTPError(http.StatusBadRequest, err)
}
claims, err := utils.GetTokenEcho(c)
claims, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("PlaylistUpdate failed to get user ID: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down
7 changes: 3 additions & 4 deletions controllers/v1/creator/video.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (

"github.com/labstack/echo/v4"
"github.com/ystv/web-api/services/creator/types/video"
"github.com/ystv/web-api/utils"
)

// GetVideo finds a video by ID
Expand Down Expand Up @@ -55,7 +54,7 @@ func (r *Repos) NewVideo(c echo.Context) error {
err = fmt.Errorf("VideoCreate bind fail: %w", err)
return echo.NewHTTPError(http.StatusBadRequest, err)
}
claims, err := utils.GetTokenEcho(c)
claims, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("VideoNew failed to get user ID: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down Expand Up @@ -86,7 +85,7 @@ func (r *Repos) UpdateVideoMeta(c echo.Context) error {
err = fmt.Errorf("failed to bind video object: %w", err)
return echo.NewHTTPError(http.StatusBadRequest, err)
}
t, err := utils.GetTokenEcho(c)
t, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("failed to get token: %w", err)
return echo.NewHTTPError(http.StatusBadRequest, err)
Expand Down Expand Up @@ -134,7 +133,7 @@ func (r *Repos) VideoList(c echo.Context) error {
// @Success 200 {array} video.Meta
// @Router /v1/internal/creator/video/my [get]
func (r *Repos) ListVideosByUser(c echo.Context) error {
claims, err := utils.GetTokenEcho(c)
claims, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("VideoNew failed to get user ID: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down
12 changes: 8 additions & 4 deletions controllers/v1/encoder/encoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import (
)

type EncoderController struct {
enc *encoder.Encoder
enc *encoder.Encoder
access *utils.Accesser
}

type (
Expand Down Expand Up @@ -45,8 +46,11 @@ type (
}
)

func NewEncoderController(enc *encoder.Encoder) *EncoderController {
return &EncoderController{enc: enc}
func NewEncoderController(enc *encoder.Encoder, access *utils.Accesser) *EncoderController {
return &EncoderController{
enc: enc,
access: access,
}
}

// TODO: look into adding the parameter object without
Expand All @@ -69,7 +73,7 @@ func (e *EncoderController) UploadRequest(c echo.Context) error {
r := Request{}
c.Bind(&r)

_, err := utils.GetTokenHTTP(r.HTTPRequest)
_, err := e.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("GetToken failed: %w", err)
return echo.NewHTTPError(http.StatusBadRequest, err)
Expand Down
7 changes: 3 additions & 4 deletions controllers/v1/misc/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"strconv"

"github.com/labstack/echo/v4"
"github.com/ystv/web-api/utils"
)

// GetLists handles listing mailing lists
Expand Down Expand Up @@ -38,7 +37,7 @@ func (r *Repos) GetLists(c echo.Context) error {
// @Success 200 {array} misc.List
// @Router /v1/internal/misc/lists/my [get]
func (r *Repos) GetListsByToken(c echo.Context) error {
p, err := utils.GetTokenEcho(c)
p, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("SetCrew: failed to get token: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down Expand Up @@ -112,7 +111,7 @@ func (r *Repos) SubscribeByToken(c echo.Context) error {
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, "Bad listID")
}
claims, err := utils.GetTokenEcho(c)
claims, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("SubscribeByToken failed to get user ID: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down Expand Up @@ -168,7 +167,7 @@ func (r *Repos) UnsubscribeByToken(c echo.Context) error {
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, "Bad listID")
}
claims, err := utils.GetTokenEcho(c)
claims, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("UnsubscribeByToken failed to get user ID: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down
11 changes: 8 additions & 3 deletions controllers/v1/misc/misc.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,19 @@ package misc
import (
"github.com/jmoiron/sqlx"
"github.com/ystv/web-api/services/misc"
"github.com/ystv/web-api/utils"
)

// Repos stores our dependencies
type Repos struct {
misc *misc.Store
misc *misc.Store
access *utils.Accesser
}

// NewRepos creates our data store
func NewRepos(db *sqlx.DB) *Repos {
return &Repos{misc.NewStore(db)}
func NewRepos(db *sqlx.DB, access *utils.Accesser) *Repos {
return &Repos{
misc: misc.NewStore(db),
access: access,
}
}
3 changes: 1 addition & 2 deletions controllers/v1/misc/quote.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (

"github.com/labstack/echo/v4"
"github.com/ystv/web-api/services/misc"
"github.com/ystv/web-api/utils"
)

// ListQuotes handles listing quotes by pagination
Expand Down Expand Up @@ -53,7 +52,7 @@ func (r *Repos) NewQuote(c echo.Context) error {
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err)
}
claims, err := utils.GetTokenEcho(c)
claims, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("NewQuote failed to get user ID: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down
27 changes: 11 additions & 16 deletions controllers/v1/misc/webcam.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"strings"

"github.com/labstack/echo/v4"
"github.com/ystv/web-api/utils"
)

// ListWebcams handles listing all webcams a user can access
Expand All @@ -21,17 +20,15 @@ import (
// @Success 200 {array} misc.Webcam
// @Router /v1/internal/misc/webcams [get]
func (r *Repos) ListWebcams(c echo.Context) error {
// Get user token
claims, err := utils.GetTokenEcho(c)
claims, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("ListWebcams failed to get user token: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
}
// Prepare slice of permission IDs
perms := []int{}
for _, permission := range claims.Permissions {
perms = append(perms, permission.PermissionID)
}

perms := []string{}
perms = append(perms, claims.Permissions...)

w, err := r.misc.ListWebcams(c.Request().Context(), perms)
if err != nil {
err = fmt.Errorf("failed to list webcams: %w", err)
Expand All @@ -52,18 +49,16 @@ func (r *Repos) GetWebcam(c echo.Context) error {
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, "Invalid camera ID")
}
// Get user token
claims, err := utils.GetTokenEcho(c)

claims, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("GetWebcam failed to get user token: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
}
// Prepare slice of permission IDs
perms := []int{}
for _, permission := range claims.Permissions {
perms = append(perms, permission.PermissionID)
}
// Get webcam URL and check user has permission for it

perms := []string{}
perms = append(perms, claims.Permissions...)

w, err := r.misc.GetWebcam(c.Request().Context(), cameraID, perms)
if err != nil {
err = fmt.Errorf("failed to get camera: %w", err)
Expand Down
9 changes: 7 additions & 2 deletions controllers/v1/people/people.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,19 @@ package people
import (
"github.com/jmoiron/sqlx"
"github.com/ystv/web-api/services/people"
"github.com/ystv/web-api/utils"
)

// Repo stores our dependencies
type Repo struct {
people *people.Store
access *utils.Accesser
}

// NewRepo creates our data store
func NewRepo(db *sqlx.DB) *Repo {
return &Repo{people.NewStore(db)}
func NewRepo(db *sqlx.DB, access *utils.Accesser) *Repo {
return &Repo{
people: people.NewStore(db),
access: access,
}
}
5 changes: 2 additions & 3 deletions controllers/v1/people/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"strconv"

"github.com/labstack/echo/v4"
"github.com/ystv/web-api/utils"
)

// UserByID finds a user by ID
Expand Down Expand Up @@ -62,7 +61,7 @@ func (r *Repo) UserByIDFull(c echo.Context) error {
// @Success 200 {object} people.User
// @Router /v1/internal/people/user [get]
func (r *Repo) UserByToken(c echo.Context) error {
claims, err := utils.GetTokenEcho(c)
claims, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("UserByToken failed to get token: %w", err)
return echo.NewHTTPError(http.StatusBadRequest, err)
Expand All @@ -84,7 +83,7 @@ func (r *Repo) UserByToken(c echo.Context) error {
// @Success 200 {object} people.UserFull
// @Router /v1/internal/people/user/full [get]
func (r *Repo) UserByTokenFull(c echo.Context) error {
claims, err := utils.GetTokenEcho(c)
claims, err := r.access.GetToken(c.Request())
if err != nil {
err = fmt.Errorf("UserByTokenFull failed to get token: %w", err)
return echo.NewHTTPError(http.StatusInternalServerError, err)
Expand Down
Loading

0 comments on commit 94e3645

Please sign in to comment.