[server] Return both objectID and url for previewUrl

This commit is contained in:
Neeraj Gupta 2024-09-06 12:01:16 +05:30
parent 41c242a0ee
commit aa482ea227
5 changed files with 42 additions and 33 deletions

View File

@ -30,6 +30,14 @@ func NewID(prefix string) (*string, error) {
return &result, nil return &result, nil
} }
func MustNewID(prefix string) string {
id, err := NewID(prefix)
if err != nil {
panic(err)
}
return *id
}
func ServerReqID() string { func ServerReqID() string {
// Generate a nanoid with a custom alphabet and length of 22 // Generate a nanoid with a custom alphabet and length of 22
id, err := NewID("ser") id, err := NewID("ser")

View File

@ -2,6 +2,7 @@ package filedata
import ( import (
"fmt" "fmt"
"github.com/ente-io/museum/ente" "github.com/ente-io/museum/ente"
) )
@ -76,6 +77,11 @@ type PreviewUploadUrlRequest struct {
Type ente.ObjectType `form:"type" binding:"required"` Type ente.ObjectType `form:"type" binding:"required"`
} }
type PreviewUploadUrl struct {
Id string `json:"id" binding:"required"`
Url string `json:"url" binding:"required"`
}
func (g *PreviewUploadUrlRequest) Validate() error { func (g *PreviewUploadUrlRequest) Validate() error {
if g.Type != ente.PreviewVideo && g.Type != ente.PreviewImage { if g.Type != ente.PreviewVideo && g.Type != ente.PreviewImage {
return ente.NewBadRequestWithMessage(fmt.Sprintf("unsupported object type %s", g.Type)) return ente.NewBadRequestWithMessage(fmt.Sprintf("unsupported object type %s", g.Type))
@ -106,18 +112,16 @@ func (r *Row) S3FileMetadataObjectKey() string {
if r.Type == ente.MlData { if r.Type == ente.MlData {
return derivedMetaPath(r.FileID, r.UserID) return derivedMetaPath(r.FileID, r.UserID)
} }
if r.Type == ente.PreviewVideo {
return previewVideoPlaylist(r.FileID, r.UserID)
}
panic(fmt.Sprintf("S3FileMetadata should not be written for %s type", r.Type)) panic(fmt.Sprintf("S3FileMetadata should not be written for %s type", r.Type))
} }
// GetS3FileObjectKey returns the object key for the file data stored in the S3 bucket. // GetS3FileObjectKey returns the object key for the file data stored in the S3 bucket.
func (r *Row) GetS3FileObjectKey() string { func (r *Row) GetS3FileObjectKey() string {
if r.Type == ente.PreviewVideo { //if r.Type == ente.PreviewVideo {
return previewVideoPath(r.FileID, r.UserID) // return previewVideoPath(r.FileID, r.UserID)
} else if r.Type == ente.PreviewImage { //} else if r.Type == ente.PreviewImage {
return previewImagePath(r.FileID, r.UserID) // return previewImagePath(r.FileID, r.UserID)
} //}
panic(fmt.Sprintf("unsupported object type %s", r.Type)) panic(fmt.Sprintf("unsupported object type %s", r.Type))
} }

View File

@ -2,7 +2,9 @@ package filedata
import ( import (
"fmt" "fmt"
"github.com/ente-io/museum/ente" "github.com/ente-io/museum/ente"
"github.com/ente-io/museum/ente/base"
) )
// BasePrefix returns the base prefix for all objects related to a file. To check if the file data is deleted, // BasePrefix returns the base prefix for all objects related to a file. To check if the file data is deleted,
@ -13,39 +15,33 @@ func BasePrefix(fileID int64, ownerID int64) string {
func AllObjects(fileID int64, ownerID int64, oType ente.ObjectType) []string { func AllObjects(fileID int64, ownerID int64, oType ente.ObjectType) []string {
switch oType { switch oType {
case ente.PreviewVideo:
return []string{previewVideoPath(fileID, ownerID), previewVideoPlaylist(fileID, ownerID)}
case ente.MlData: case ente.MlData:
return []string{derivedMetaPath(fileID, ownerID)} return []string{derivedMetaPath(fileID, ownerID)}
case ente.PreviewImage:
return []string{previewImagePath(fileID, ownerID)}
default: default:
// throw panic saying current object type is not supported // throw panic saying current object type is not supported
panic(fmt.Sprintf("object type %s is not supported", oType)) panic(fmt.Sprintf("object type %s is not supported", oType))
} }
} }
func PreviewUrl(fileID int64, ownerID int64, oType ente.ObjectType) string { func CompleteObjectKey(fileID int64, ownerID int64, oType ente.ObjectType, id string) string {
switch oType { switch oType {
case ente.PreviewVideo: case ente.PreviewVideo:
return previewVideoPath(fileID, ownerID)
case ente.PreviewImage: case ente.PreviewImage:
return previewImagePath(fileID, ownerID) return fmt.Sprintf("%s%s/%s", BasePrefix(fileID, ownerID), string(oType), id)
default: default:
panic(fmt.Sprintf("object type %s is not supported", oType)) panic(fmt.Sprintf("object type %s is not supported", oType))
} }
panic(fmt.Sprintf("object type %s is not supported", oType))
} }
func previewVideoPath(fileID int64, ownerID int64) string { func NewUploadID(oType ente.ObjectType) string {
return fmt.Sprintf("%s%s", BasePrefix(fileID, ownerID), string(ente.PreviewVideo)) if oType == ente.PreviewVideo {
} return base.MustNewID("pv")
} else if oType == ente.PreviewImage {
func previewVideoPlaylist(fileID int64, ownerID int64) string { return base.MustNewID("pi")
return fmt.Sprintf("%s%s", previewVideoPath(fileID, ownerID), "_playlist.m3u8") }
} panic(fmt.Sprintf("object type %s is not supported", oType))
func previewImagePath(fileID int64, ownerID int64) string {
return fmt.Sprintf("%s%s", BasePrefix(fileID, ownerID), string(ente.PreviewImage))
} }
func derivedMetaPath(fileID int64, ownerID int64) string { func derivedMetaPath(fileID int64, ownerID int64) string {

View File

@ -70,14 +70,12 @@ func (h *FileHandler) GetPreviewUploadURL(c *gin.Context) {
handler.Error(c, stacktrace.Propagate(ente.ErrBadRequest, fmt.Sprintf("Request binding failed %s", err))) handler.Error(c, stacktrace.Propagate(ente.ErrBadRequest, fmt.Sprintf("Request binding failed %s", err)))
return return
} }
url, err := h.FileDataCtrl.PreviewUploadURL(c, request) resp, err := h.FileDataCtrl.PreviewUploadURL(c, request)
if err != nil { if err != nil {
handler.Error(c, stacktrace.Propagate(err, "")) handler.Error(c, stacktrace.Propagate(err, ""))
return return
} }
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, resp)
"url": url,
})
} }
func (h *FileHandler) GetPreviewURL(c *gin.Context) { func (h *FileHandler) GetPreviewURL(c *gin.Context) {

View File

@ -1,7 +1,6 @@
package filedata package filedata
import ( import (
"fmt"
"github.com/ente-io/museum/ente" "github.com/ente-io/museum/ente"
"github.com/ente-io/museum/ente/filedata" "github.com/ente-io/museum/ente/filedata"
"github.com/ente-io/museum/pkg/utils/auth" "github.com/ente-io/museum/pkg/utils/auth"
@ -31,7 +30,7 @@ func (c *Controller) GetPreviewUrl(ctx *gin.Context, request filedata.GetPreview
return &enteUrl.URL, nil return &enteUrl.URL, nil
} }
func (c *Controller) PreviewUploadURL(ctx *gin.Context, request filedata.PreviewUploadUrlRequest) (*string, error) { func (c *Controller) PreviewUploadURL(ctx *gin.Context, request filedata.PreviewUploadUrlRequest) (*filedata.PreviewUploadUrl, error) {
if err := request.Validate(); err != nil { if err := request.Validate(); err != nil {
return nil, err return nil, err
} }
@ -43,12 +42,16 @@ func (c *Controller) PreviewUploadURL(ctx *gin.Context, request filedata.Preview
if err != nil { if err != nil {
return nil, stacktrace.Propagate(err, "") return nil, stacktrace.Propagate(err, "")
} }
id := filedata.NewUploadID(request.Type)
// note: instead of the final url, give a temp url for upload purpose. // note: instead of the final url, give a temp url for upload purpose.
uploadUrl := fmt.Sprintf("%s_temp_upload", filedata.PreviewUrl(request.FileID, fileOwnerID, request.Type)) uploadUrl := filedata.CompleteObjectKey(request.FileID, fileOwnerID, request.Type, id)
bucketID := c.S3Config.GetBucketID(request.Type) bucketID := c.S3Config.GetBucketID(request.Type)
enteUrl, err := c.getUploadURL(bucketID, uploadUrl) enteUrl, err := c.getUploadURL(bucketID, uploadUrl)
if err != nil { if err != nil {
return nil, stacktrace.Propagate(err, "") return nil, stacktrace.Propagate(err, "")
} }
return &enteUrl.URL, nil return &filedata.PreviewUploadUrl{
Id: id,
Url: enteUrl.URL,
}, nil
} }