[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
}
func MustNewID(prefix string) string {
id, err := NewID(prefix)
if err != nil {
panic(err)
}
return *id
}
func ServerReqID() string {
// Generate a nanoid with a custom alphabet and length of 22
id, err := NewID("ser")

View File

@ -2,6 +2,7 @@ package filedata
import (
"fmt"
"github.com/ente-io/museum/ente"
)
@ -76,6 +77,11 @@ type PreviewUploadUrlRequest struct {
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 {
if g.Type != ente.PreviewVideo && g.Type != ente.PreviewImage {
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 {
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))
}
// GetS3FileObjectKey returns the object key for the file data stored in the S3 bucket.
func (r *Row) GetS3FileObjectKey() string {
if r.Type == ente.PreviewVideo {
return previewVideoPath(r.FileID, r.UserID)
} else if r.Type == ente.PreviewImage {
return previewImagePath(r.FileID, r.UserID)
}
//if r.Type == ente.PreviewVideo {
// return previewVideoPath(r.FileID, r.UserID)
//} else if r.Type == ente.PreviewImage {
// return previewImagePath(r.FileID, r.UserID)
//}
panic(fmt.Sprintf("unsupported object type %s", r.Type))
}

View File

@ -2,7 +2,9 @@ package filedata
import (
"fmt"
"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,
@ -13,39 +15,33 @@ func BasePrefix(fileID int64, ownerID int64) string {
func AllObjects(fileID int64, ownerID int64, oType ente.ObjectType) []string {
switch oType {
case ente.PreviewVideo:
return []string{previewVideoPath(fileID, ownerID), previewVideoPlaylist(fileID, ownerID)}
case ente.MlData:
return []string{derivedMetaPath(fileID, ownerID)}
case ente.PreviewImage:
return []string{previewImagePath(fileID, ownerID)}
default:
// throw panic saying current object type is not supported
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 {
case ente.PreviewVideo:
return previewVideoPath(fileID, ownerID)
case ente.PreviewImage:
return previewImagePath(fileID, ownerID)
return fmt.Sprintf("%s%s/%s", BasePrefix(fileID, ownerID), string(oType), id)
default:
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 {
return fmt.Sprintf("%s%s", BasePrefix(fileID, ownerID), string(ente.PreviewVideo))
}
func previewVideoPlaylist(fileID int64, ownerID int64) string {
return fmt.Sprintf("%s%s", previewVideoPath(fileID, ownerID), "_playlist.m3u8")
}
func previewImagePath(fileID int64, ownerID int64) string {
return fmt.Sprintf("%s%s", BasePrefix(fileID, ownerID), string(ente.PreviewImage))
func NewUploadID(oType ente.ObjectType) string {
if oType == ente.PreviewVideo {
return base.MustNewID("pv")
} else if oType == ente.PreviewImage {
return base.MustNewID("pi")
}
panic(fmt.Sprintf("object type %s is not supported", oType))
}
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)))
return
}
url, err := h.FileDataCtrl.PreviewUploadURL(c, request)
resp, err := h.FileDataCtrl.PreviewUploadURL(c, request)
if err != nil {
handler.Error(c, stacktrace.Propagate(err, ""))
return
}
c.JSON(http.StatusOK, gin.H{
"url": url,
})
c.JSON(http.StatusOK, resp)
}
func (h *FileHandler) GetPreviewURL(c *gin.Context) {

View File

@ -1,7 +1,6 @@
package filedata
import (
"fmt"
"github.com/ente-io/museum/ente"
"github.com/ente-io/museum/ente/filedata"
"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
}
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 {
return nil, err
}
@ -43,12 +42,16 @@ func (c *Controller) PreviewUploadURL(ctx *gin.Context, request filedata.Preview
if err != nil {
return nil, stacktrace.Propagate(err, "")
}
id := filedata.NewUploadID(request.Type)
// 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)
enteUrl, err := c.getUploadURL(bucketID, uploadUrl)
if err != nil {
return nil, stacktrace.Propagate(err, "")
}
return &enteUrl.URL, nil
return &filedata.PreviewUploadUrl{
Id: id,
Url: enteUrl.URL,
}, nil
}