diff --git a/application/article/api/article.api b/application/article/api/article.api index 36c1c79..89b824e 100644 --- a/application/article/api/article.api +++ b/application/article/api/article.api @@ -28,6 +28,26 @@ type ( AuthorId string `json:"author_id"` AuthorName string `json:"author_name"` } + + ArticleListRequest { + AuthorId int64 `form:"author_id"` + Cursor int64 `form:"cursor"` + PageSize int64 `form:"page_size"` + SortType int32 `form:"sort_type"` + ArticleId int64 `form:"article_id"` + } + + ArticleInfo { + ArticleId int64 `json:"article_id"` + Title string `json:"title"` + Content string `json:"content"` + Description string `json:"description"` + Cover string `json:"cover"` + } + + ArticleListResponse { + Articles []ArticleInfo `json:"articles"` + } ) @server ( @@ -41,4 +61,6 @@ service article-api { post /publish (PublishRequest) returns (PublishResponse) @handler ArticleDetailHandler get /detail (ArticleDetailRequest) returns (ArticleDetailResponse) + @handler ArticleListHandler + get /list (ArticleListRequest) returns (ArticleListResponse) } \ No newline at end of file diff --git a/application/article/api/internal/handler/articlelisthandler.go b/application/article/api/internal/handler/articlelisthandler.go new file mode 100644 index 0000000..f0ff466 --- /dev/null +++ b/application/article/api/internal/handler/articlelisthandler.go @@ -0,0 +1,28 @@ +package handler + +import ( + "net/http" + + "beyond/application/article/api/internal/logic" + "beyond/application/article/api/internal/svc" + "beyond/application/article/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" +) + +func ArticleListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.ArticleListRequest + if err := httpx.Parse(r, &req); err != nil { + httpx.ErrorCtx(r.Context(), w, err) + return + } + + l := logic.NewArticleListLogic(r.Context(), svcCtx) + resp, err := l.ArticleList(&req) + if err != nil { + httpx.ErrorCtx(r.Context(), w, err) + } else { + httpx.OkJsonCtx(r.Context(), w, resp) + } + } +} diff --git a/application/article/api/internal/handler/routes.go b/application/article/api/internal/handler/routes.go index 8ac9b9e..6d34816 100644 --- a/application/article/api/internal/handler/routes.go +++ b/application/article/api/internal/handler/routes.go @@ -27,6 +27,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { Path: "/detail", Handler: ArticleDetailHandler(serverCtx), }, + { + Method: http.MethodGet, + Path: "/list", + Handler: ArticleListHandler(serverCtx), + }, }, //rest.WithJwt(serverCtx.Config.Auth.AccessSecret), rest.WithPrefix("/v1/article"), diff --git a/application/article/api/internal/logic/articlelistlogic.go b/application/article/api/internal/logic/articlelistlogic.go new file mode 100644 index 0000000..829a9a1 --- /dev/null +++ b/application/article/api/internal/logic/articlelistlogic.go @@ -0,0 +1,55 @@ +package logic + +import ( + "context" + + "beyond/application/article/api/internal/svc" + "beyond/application/article/api/internal/types" + "beyond/application/article/rpc/article" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ArticleListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewArticleListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ArticleListLogic { + return &ArticleListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *ArticleListLogic) ArticleList(req *types.ArticleListRequest) (resp *types.ArticleListResponse, err error) { + articles, err := l.svcCtx.ArticleRPC.Articles(l.ctx, &article.ArticlesRequest{ + UserId: req.AuthorId, + Cursor: req.Cursor, + PageSize: req.PageSize, + SortType: req.SortType, + ArticleId: req.ArticleId, + }) + if err != nil { + logx.Errorf("get articles req: %v err: %v", req, err) + return nil, err + } + if articles == nil || len(articles.Articles) == 0 { + return &types.ArticleListResponse{}, nil + } + articleInfos := make([]types.ArticleInfo, 0, len(articles.Articles)) + for _, a := range articles.Articles { + articleInfos = append(articleInfos, types.ArticleInfo{ + ArticleId: a.Id, + Title: a.Title, + Description: a.Description, + Cover: a.Cover, + }) + } + + return &types.ArticleListResponse{ + Articles: articleInfos, + }, nil +} diff --git a/application/article/api/internal/types/types.go b/application/article/api/internal/types/types.go index caeccd8..04f663b 100644 --- a/application/article/api/internal/types/types.go +++ b/application/article/api/internal/types/types.go @@ -28,3 +28,23 @@ type ArticleDetailResponse struct { AuthorId string `json:"author_id"` AuthorName string `json:"author_name"` } + +type ArticleListRequest struct { + AuthorId int64 `form:"author_id"` + Cursor int64 `form:"cursor"` + PageSize int64 `form:"page_size"` + SortType int32 `form:"sort_type"` + ArticleId int64 `form:"article_id"` +} + +type ArticleInfo struct { + ArticleId int64 `json:"article_id"` + Title string `json:"title"` + Content string `json:"content"` + Description string `json:"description"` + Cover string `json:"cover"` +} + +type ArticleListResponse struct { + Articles []ArticleInfo `json:"articles"` +}