feat: user buy media
This commit is contained in:
@@ -2,7 +2,6 @@ package medias
|
||||
|
||||
import (
|
||||
"backend/pkg/consts"
|
||||
"backend/pkg/errorx"
|
||||
"backend/pkg/pg"
|
||||
"backend/providers/jwt"
|
||||
|
||||
@@ -22,13 +21,13 @@ func (c *Controller) List(ctx fiber.Ctx) error {
|
||||
filter := ListFilter{}
|
||||
if err := ctx.Bind().Body(&filter); err != nil {
|
||||
log.WithError(err).Error("parse body failed")
|
||||
return ctx.Status(fiber.StatusBadRequest).JSON(errorx.RequestParseError)
|
||||
return err
|
||||
}
|
||||
claim := ctx.Locals(consts.CtxKeyClaim).(*jwt.Claims)
|
||||
|
||||
items, err := c.svc.List(ctx.Context(), claim.TenantID, claim.UserID, &filter)
|
||||
if err != nil {
|
||||
return ctx.Status(fiber.StatusInternalServerError).JSON(errorx.InternalError)
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.JSON(items)
|
||||
@@ -43,14 +42,14 @@ func (c *Controller) Show(ctx fiber.Ctx) error {
|
||||
model, err := c.svc.GetMediaByHash(ctx.Context(), claim.TenantID, hash)
|
||||
if err != nil {
|
||||
log.WithField("action", "medias.Show").WithError(err).Error("GetMediaByHash")
|
||||
return ctx.Status(fiber.StatusInternalServerError).JSON(errorx.InternalError)
|
||||
return err
|
||||
}
|
||||
|
||||
resource := c.svc.ModelToListItem(ctx.Context(), model)
|
||||
resource.Bought, err = c.svc.HasUserBought(ctx.Context(), claim.TenantID, claim.UserID, model.ID)
|
||||
if err != nil {
|
||||
log.WithField("action", "medias.Show").WithError(err).Error("HasUserBought")
|
||||
return ctx.Status(fiber.StatusInternalServerError).JSON(errorx.InternalError)
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.JSON(resource)
|
||||
@@ -60,7 +59,7 @@ func (c *Controller) Show(ctx fiber.Ctx) error {
|
||||
func (c *Controller) MediaIndex(ctx fiber.Ctx) error {
|
||||
mediaType, err := pg.ParseMediaType(ctx.Params("type"))
|
||||
if err != nil {
|
||||
return ctx.Status(fiber.StatusInternalServerError).JSON(errorx.RequestParseError)
|
||||
return err
|
||||
}
|
||||
|
||||
hash := ctx.Params("hash")
|
||||
@@ -70,19 +69,19 @@ func (c *Controller) MediaIndex(ctx fiber.Ctx) error {
|
||||
model, err := c.svc.GetMediaByHash(ctx.Context(), claim.TenantID, hash)
|
||||
if err != nil {
|
||||
log.WithField("action", "medias.MediaIndex").WithError(err).Error("GetMediaByHash")
|
||||
return ctx.Status(fiber.StatusInternalServerError).JSON(errorx.InternalError)
|
||||
return err
|
||||
}
|
||||
|
||||
bought, err := c.svc.HasUserBought(ctx.Context(), claim.TenantID, claim.UserID, model.ID)
|
||||
if err != nil {
|
||||
log.WithField("action", "medias.MediaIndex").WithError(err).Error("HasUserBought")
|
||||
return ctx.Status(fiber.StatusInternalServerError).JSON(errorx.InternalError)
|
||||
return err
|
||||
}
|
||||
|
||||
playlist, err := c.svc.GetM3U8(ctx.Context(), claim.TenantID, mediaType, model.Hash, bought)
|
||||
if err != nil {
|
||||
log.WithField("action", "medias.MediaIndex").WithError(err).Error("GetMediaPlaylist")
|
||||
return ctx.Status(fiber.StatusInternalServerError).JSON(errorx.InternalError)
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.SendString(playlist.String())
|
||||
@@ -91,14 +90,14 @@ func (c *Controller) MediaIndex(ctx fiber.Ctx) error {
|
||||
func (c *Controller) MediaSegment(ctx fiber.Ctx) error {
|
||||
mediaType, err := pg.ParseMediaType(ctx.Params("type"))
|
||||
if err != nil {
|
||||
return ctx.Status(fiber.StatusInternalServerError).JSON(errorx.RequestParseError)
|
||||
return err
|
||||
}
|
||||
|
||||
segment := ctx.Params("segment")
|
||||
segments, err := c.hashIds.DecodeInt64WithError(segment)
|
||||
if err != nil {
|
||||
log.WithField("action", "medias.MediaSegment").WithError(err).Error("DecodeInt64WithError")
|
||||
return ctx.Status(fiber.StatusInternalServerError).JSON(errorx.RequestParseError)
|
||||
return err
|
||||
}
|
||||
|
||||
hash := ctx.Params("hash")
|
||||
@@ -108,9 +107,29 @@ func (c *Controller) MediaSegment(ctx fiber.Ctx) error {
|
||||
model, err := c.svc.GetMediaByHash(ctx.Context(), claim.TenantID, hash)
|
||||
if err != nil {
|
||||
log.WithField("action", "medias.MediaSegment").WithError(err).Error("GetMediaByHash")
|
||||
return ctx.Status(fiber.StatusInternalServerError).JSON(errorx.InternalError)
|
||||
return err
|
||||
}
|
||||
|
||||
filepath := c.svc.GetSegmentPath(ctx.Context(), mediaType, model.Hash, segments[0])
|
||||
return ctx.SendFile(filepath)
|
||||
}
|
||||
|
||||
// Checkout
|
||||
func (c *Controller) Checkout(ctx fiber.Ctx) error {
|
||||
hash := ctx.Params("hash")
|
||||
claim := fiber.Locals[*jwt.Claims](ctx, consts.CtxKeyClaim)
|
||||
log.Debug(claim)
|
||||
|
||||
model, err := c.svc.GetMediaByHash(ctx.Context(), claim.TenantID, hash)
|
||||
if err != nil {
|
||||
log.WithField("action", "medias.MediaSegment").WithError(err).Error("GetMediaByHash")
|
||||
return err
|
||||
}
|
||||
|
||||
if err := c.svc.Checkout(ctx.Context(), claim.TenantID, claim.UserID, model.ID); err != nil {
|
||||
log.WithField("action", "medias.MediaSegment").WithError(err).Error("Checkout")
|
||||
return err
|
||||
}
|
||||
|
||||
return ctx.JSON(nil)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user