diff --git a/doc/postman_collection.json b/doc/postman_collection.json index 56bdced..3648bc7 100644 --- a/doc/postman_collection.json +++ b/doc/postman_collection.json @@ -115,7 +115,7 @@ "method": "GET", "header": [], "url": { - "raw": "{{base}}/users/:user_id/articles?length=10&page=1", + "raw": "{{base}}/users/:user_id/articles?length=10&page=1&recent=true", "host": [ "{{base}}" ], @@ -132,6 +132,10 @@ { "key": "page", "value": "1" + }, + { + "key": "recent", + "value": "true" } ], "variable": [ diff --git a/domain/repository/article.go b/domain/repository/article.go index 1c44b4c..16e52ca 100644 --- a/domain/repository/article.go +++ b/domain/repository/article.go @@ -11,6 +11,8 @@ type ArticleSearchOption struct { UserIDs []uint ExcludeUserIDs []uint Draft bool + + Recent bool } type IArticle interface { diff --git a/infrastructure/persistence/article.go b/infrastructure/persistence/article.go index c830046..de5ea2b 100644 --- a/infrastructure/persistence/article.go +++ b/infrastructure/persistence/article.go @@ -68,6 +68,12 @@ func (u article) Search(ctx context.Context, paging *util.Paging, option reposit db.Where("draft = ?", false). Where("published_at <= ?", time.Now()) } + + if option.Recent { + db.Order("created_at desc") + } else { + db.Order("created_at asc") + } return db }) diff --git a/interface/handler/helpers.go b/interface/handler/helpers.go index 5e20ee9..b22273f 100644 --- a/interface/handler/helpers.go +++ b/interface/handler/helpers.go @@ -25,3 +25,11 @@ func uintParam(c *gin.Context, key string) (uint, error) { } return uint(id), nil } + +func boolQuery(c *gin.Context, key string) (bool, error) { + value, err := strconv.ParseBool(c.Query(key)) + if err != nil { + return false, errors.NewUnexpected(err) + } + return value, nil +} diff --git a/interface/handler/user.go b/interface/handler/user.go index f7ee77f..fc2ee32 100644 --- a/interface/handler/user.go +++ b/interface/handler/user.go @@ -189,7 +189,12 @@ func (u User) Articles(ctx context.Context, c *gin.Context) error { return err } - articles, count, err := u.userUseCase.Articles(ctx, paging, id) + recent, err := boolQuery(c, "recent") + if err != nil { + recent = true + } + + articles, count, err := u.userUseCase.Articles(ctx, paging, id, recent) if err != nil { return err } diff --git a/usecase/user.go b/usecase/user.go index a19451f..242fe5b 100644 --- a/usecase/user.go +++ b/usecase/user.go @@ -35,7 +35,7 @@ type IUser interface { // Timeline のリターンがArticleになっているが、複数コンテンツに対応した場合にはinterface{}型になる Timeline(ctx context.Context, paging *util.Paging, kinds []TimelineKind) ([]*entity.Article, error) - Articles(ctx context.Context, paging *util.Paging, id uint) ([]*entity.Article, uint, error) + Articles(ctx context.Context, paging *util.Paging, id uint, recent bool) ([]*entity.Article, uint, error) Following(ctx context.Context, paging *util.Paging, id uint) ([]*entity.User, uint, error) Followers(ctx context.Context, paging *util.Paging, id uint) ([]*entity.User, uint, error) @@ -229,10 +229,11 @@ func (u user) Timeline(ctx context.Context, paging *util.Paging, kinds []Timelin return articles, nil } -func (u user) Articles(ctx context.Context, paging *util.Paging, id uint) ([]*entity.Article, uint, error) { +func (u user) Articles(ctx context.Context, paging *util.Paging, id uint, recent bool) ([]*entity.Article, uint, error) { return u.articleRepo.Search(ctx, paging, repository.ArticleSearchOption{ UserIDs: []uint{id}, Draft: ctx.UID() == id, + Recent: recent, }) }