Skip to content

Commit

Permalink
Get media feature
Browse files Browse the repository at this point in the history
- Postman update
- Add a cute cate pic
- Test: 200 | OK

Author: [email protected]
  • Loading branch information
thanhpp committed Dec 4, 2021
1 parent feafcbc commit 7acac01
Show file tree
Hide file tree
Showing 11 changed files with 192 additions and 1 deletion.
30 changes: 30 additions & 0 deletions docs/Zola.postman_collection.json
Original file line number Diff line number Diff line change
Expand Up @@ -1181,6 +1181,36 @@
"body": "{\n \"code\": 9992,\n \"message\": \"locked post\",\n \"data\": null\n}"
}
]
},
{
"name": "get_media",
"request": {
"auth": {
"type": "bearer",
"bearer": [
{
"key": "token",
"value": "{{token}}",
"type": "string"
}
]
},
"method": "GET",
"header": [],
"url": {
"raw": "{{zola}}/post/{{new_post_id}}/media/117a6982-4242-42e8-b7de-c9106437ae31",
"host": [
"{{zola}}"
],
"path": [
"post",
"{{new_post_id}}",
"media",
"117a6982-4242-42e8-b7de-c9106437ae31"
]
}
},
"response": []
}
]
},
Expand Down
29 changes: 29 additions & 0 deletions internal/laclongquan/application/posthandler_media.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package application

import (
"context"

"github.com/thanhpp/zola/internal/laclongquan/domain/entity"
)

func (p PostHandler) GetMedia(ctx context.Context, userID, postID, mediaID string) (*entity.Media, error) {
user, err := p.userRepo.GetByID(ctx, userID)
if err != nil {
return nil, err
}

post, err := p.repo.GetByID(ctx, postID)
if err != nil {
return nil, err
}

var relation *entity.Relation
if userID != post.CreatorUUID().String() {
relation, err = p.relationRepo.GetRelationBetween(ctx, userID, post.CreatorUUID().String())
if err != nil {
return nil, err
}
}

return post.CanUserGetMedia(user, relation, mediaID)
}
22 changes: 22 additions & 0 deletions internal/laclongquan/domain/entity/post.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,28 @@ func (p *Post) AddMedia(m Media) error {
return nil
}

func (p Post) CanUserGetMedia(user *User, relation *Relation, mediaID string) (*Media, error) {
if user.IsLocked() {
return nil, ErrLockedUser
}

if p.IsLocked() {
return nil, ErrLockedPost
}

if user.ID().String() != p.Creator() && relation == nil || (relation != nil && relation.IsFriend()) {
return nil, ErrPermissionDenied
}

for i := range p.media {
if mediaID == p.media[i].ID() {
return &p.media[i], nil
}
}

return nil, ErrPostNotContainsMedia
}

func (p *Post) RemoveMedia(ids ...string) ([]*Media, error) {
var (
deleted = make([]*Media, 0, len(ids))
Expand Down
4 changes: 3 additions & 1 deletion internal/laclongquan/domain/repository/postrepo.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,16 @@ import (
)

var (
ErrPostNotFound = errors.New("post not found")
ErrPostNotFound = errors.New("post not found")
ErrMediaNotFound = errors.New("media not found")
)

type PostUpdateFn func(ctx context.Context, post *entity.Post) (*entity.Post, error)

type PostRepository interface {
// read
GetByID(ctx context.Context, id string) (*entity.Post, error)
GetMediaByID(ctx context.Context, id string) (*entity.Media, error)

// write
Create(ctx context.Context, post *entity.Post) error
Expand Down
1 change: 1 addition & 0 deletions internal/laclongquan/domain/repository/relationrepo.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (

var (
ErrRelationNotFound = errors.New("relation not found")
ErrSameUser = errors.New("same user")
)

type RelationRepository interface {
Expand Down
16 changes: 16 additions & 0 deletions internal/laclongquan/infrastructure/adapter/gormdb/postdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,22 @@ func (p postGorm) getByIDTx(ctx context.Context, tx *gorm.DB, id string, expect
return nil
}

func (p postGorm) GetMediaByID(ctx context.Context, id string) (*entity.Media, error) {
var (
mediaDB = new(MediaDB)
)

err := p.db.WithContext(ctx).Model(p.mediaModel).Where("media_uuid = ?", id).Take(mediaDB).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, repository.ErrMediaNotFound
}
return nil, err
}

return p.unmarshalMedia(mediaDB)
}

func (p postGorm) Create(ctx context.Context, post *entity.Post) error {
postDB := p.marshalPost(post)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ func (r relationGorm) unmarshal(relationDB *RelationDB) (*entity.Relation, error
}

func (r relationGorm) GetRelationBetween(ctx context.Context, userIDA, userIDB string) (*entity.Relation, error) {
if userIDA == userIDB {
return nil, repository.ErrSameUser
}

var relationDB = new(RelationDB)

if err := r.db.WithContext(ctx).Model(r.model).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ var (
ErrInvalidPostID = errors.New("invalid post id")
ErrInvalidUserID = errors.New("invalid user id")
ErrInvalidCommentID = errors.New("invalid comment id")
ErrInvalidMediaID = errors.New("invalid media id")
)

func getClaimsFromCtx(c *gin.Context) (*auth.Claims, error) {
Expand Down Expand Up @@ -81,6 +82,16 @@ func getPostID(c *gin.Context) (uuid.UUID, error) {
return postUUID, nil
}

func getMediaID(c *gin.Context) (uuid.UUID, error) {
mediaID := c.Param("mediaid")
mediaUUID, err := uuid.Parse(mediaID)
if err != nil {
return uuid.Nil, ErrInvalidMediaID
}

return mediaUUID, nil
}

func getCommentID(c *gin.Context) (uuid.UUID, error) {
commentID := c.Param("commentid")
commentUUID, err := uuid.Parse(commentID)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package controller

import (
"fmt"

"github.com/gin-gonic/gin"
"github.com/thanhpp/zola/internal/laclongquan/domain/entity"
"github.com/thanhpp/zola/internal/laclongquan/domain/repository"
"github.com/thanhpp/zola/pkg/logger"
"github.com/thanhpp/zola/pkg/responsevalue"
)

func (ctrl PostController) GetMedia(c *gin.Context) {
userID, err := getUserUUIDFromClaims(c)
if err != nil {
logger.Errorf("get user id from claims error: %v", err)
ginAbortNotAcceptable(c, responsevalue.CodeInvalidateUser, "invalid user", nil)
return
}

postID, err := getPostID(c)
if err != nil {
logger.Errorf("get post id error: %v", err)
ginAbortNotAcceptable(c, responsevalue.CodeInvalidParameterType, "invalid post id", nil)
return
}

mediaID, err := getMediaID(c)
if err != nil {
logger.Errorf("get media id error: %v", err)
ginAbortNotAcceptable(c, responsevalue.CodeInvalidParameterType, "invalid media id", nil)
return
}

media, err := ctrl.handler.GetMedia(c, userID.String(), postID.String(), mediaID.String())
if err != nil {
logger.Errorf("get media error: %v", err)
switch err {
case repository.ErrUserNotFound:
ginAbortNotAcceptable(c, responsevalue.CodeInvalidateUser, "user not found", nil)
return

case repository.ErrPostNotFound:
ginAbortInternalError(c, responsevalue.CodePostNotExist, "post not found", nil)
return

case repository.ErrRelationNotFound:
ginAbortNotAcceptable(c, responsevalue.CodeInvalidParameterValue, "relation not found", nil)
return

case entity.ErrLockedUser:
ginAbortNotAcceptable(c, responsevalue.CodeInvalidateUser, "locked user", nil)
return

case entity.ErrLockedPost:
ginAbortNotAcceptable(c, responsevalue.CodeActionHasBeenDone, "locked post", nil)
return

case entity.ErrPermissionDenied:
ginAbortNotAcceptable(c, responsevalue.CodeInvalidAccess, "permission denied", nil)
return

case entity.ErrPostNotContainsMedia:
ginAbortNotAcceptable(c, responsevalue.CodeInvalidParameterValue, "post not contains media", nil)
return
}

ginAbortInternalError(c, responsevalue.CodeUnknownError, responsevalue.MsgUnknownError, nil)
}

fmt.Println(media.Path())
c.File(media.Path())
}
3 changes: 3 additions & 0 deletions internal/laclongquan/infrastructure/port/httpserver/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ func (s *HTTPServer) newRouter() *gin.Engine {
postGr.POST("/:postid/comment", postCtrl.CreateComment)
postGr.PUT("/:postid/comment/:commentid", postCtrl.UpdateComment)
postGr.DELETE("/:postid/comment/:commentid", postCtrl.DeleteComment)

// media
postGr.GET("/:postid/media/:mediaid", postCtrl.GetMedia)
}

reportGr := r.Group("/report")
Expand Down
Binary file added test/add_post/cat-pic.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 7acac01

Please sign in to comment.