optimize delete media content that had upload when create tweet failed

pull/156/head
alimy 3 years ago
parent ffb2bac3e0
commit dd53d048f6

@ -184,7 +184,7 @@ func (s *tweetManageServant) DeletePost(post *model.Post) ([]string, error) {
} }
// 删推文 // 删推文
if err := (post).Delete(tx); err != nil { if err := post.Delete(tx); err != nil {
return err return err
} }

@ -21,13 +21,15 @@ const (
CONTENT_TYPE_CHARGE_ATTACHMENT CONTENT_TYPE_CHARGE_ATTACHMENT
) )
var mediaContentType = []PostContentT{ var (
mediaContentType = []PostContentT{
CONTENT_TYPE_IMAGE, CONTENT_TYPE_IMAGE,
CONTENT_TYPE_VIDEO, CONTENT_TYPE_VIDEO,
CONTENT_TYPE_AUDIO, CONTENT_TYPE_AUDIO,
CONTENT_TYPE_ATTACHMENT, CONTENT_TYPE_ATTACHMENT,
CONTENT_TYPE_CHARGE_ATTACHMENT, CONTENT_TYPE_CHARGE_ATTACHMENT,
} }
)
type PostContent struct { type PostContent struct {
*Model *Model

@ -102,11 +102,29 @@ func tagsFrom(originTags []string) []string {
} }
// CreatePost 创建文章 // CreatePost 创建文章
// TODO: maybe have bug need optimize for use transaction to create post // TODO: 推文+推文内容需要在一个事务中添加,后续优化
func CreatePost(c *gin.Context, userID int64, param PostCreationReq) (*model.Post, error) { func CreatePost(c *gin.Context, userID int64, param PostCreationReq) (post *model.Post, err error) {
// 获取媒体内容
mediaContents := make([]string, 0, len(param.Contents))
for _, item := range param.Contents {
switch item.Type {
case model.CONTENT_TYPE_IMAGE,
model.CONTENT_TYPE_VIDEO,
model.CONTENT_TYPE_AUDIO,
model.CONTENT_TYPE_ATTACHMENT,
model.CONTENT_TYPE_CHARGE_ATTACHMENT:
mediaContents = append(mediaContents, item.Content)
}
}
defer func() {
if err != nil {
deleteOssObjects(mediaContents)
}
}()
ip := c.ClientIP() ip := c.ClientIP()
tags := tagsFrom(param.Tags) tags := tagsFrom(param.Tags)
post := &model.Post{ post = &model.Post{
UserID: userID, UserID: userID,
Tags: strings.Join(tags, ","), Tags: strings.Join(tags, ","),
IP: ip, IP: ip,
@ -114,7 +132,7 @@ func CreatePost(c *gin.Context, userID int64, param PostCreationReq) (*model.Pos
AttachmentPrice: param.AttachmentPrice, AttachmentPrice: param.AttachmentPrice,
Visibility: param.Visibility, Visibility: param.Visibility,
} }
post, err := ds.CreatePost(post) post, err = ds.CreatePost(post)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -137,7 +155,7 @@ func CreatePost(c *gin.Context, userID int64, param PostCreationReq) (*model.Pos
Type: item.Type, Type: item.Type,
Sort: item.Sort, Sort: item.Sort,
} }
if _, err := ds.CreatePostContent(postContent); err != nil { if _, err = ds.CreatePostContent(postContent); err != nil {
return nil, err return nil, err
} }
} }
@ -199,11 +217,21 @@ func DeletePost(user *model.User, id int64) *errcode.Error {
return errcode.DeletePostFailed return errcode.DeletePostFailed
} }
// 删除推文的媒体内容, 宽松处理错误(就是不处理) // 删除推文的媒体内容
deleteOssObjects(mediaContents)
// 删除索引
DeleteSearchPost(post)
return nil
}
// deleteOssObjects 删除推文的媒体内容, 宽松处理错误(就是不处理), 后续完善
func deleteOssObjects(mediaContents []string) {
mediaContentsSize := len(mediaContents) mediaContentsSize := len(mediaContents)
if mediaContentsSize > 1 { if mediaContentsSize > 1 {
objectKeys := make([]string, 0, mediaContentsSize) objectKeys := make([]string, 0, mediaContentsSize)
for _, cUrl := range mediaContents { for _, cUrl := range objectKeys {
objectKeys = append(objectKeys, oss.ObjectKey(cUrl)) objectKeys = append(objectKeys, oss.ObjectKey(cUrl))
} }
// TODO: 优化处理尽量使用channel传递objectKeys使用可控数量的Goroutine集中处理object删除动作后续完善 // TODO: 优化处理尽量使用channel传递objectKeys使用可控数量的Goroutine集中处理object删除动作后续完善
@ -211,11 +239,6 @@ func DeletePost(user *model.User, id int64) *errcode.Error {
} else if mediaContentsSize == 1 { } else if mediaContentsSize == 1 {
oss.DeleteObject(oss.ObjectKey(mediaContents[0])) oss.DeleteObject(oss.ObjectKey(mediaContents[0]))
} }
// 删除索引
DeleteSearchPost(post)
return nil
} }
func LockPost(id int64) error { func LockPost(id int64) error {

Loading…
Cancel
Save