Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

[Feature Request] Automatic REST API: Support for Nested Resource Endpoints (Hierarchical Routing)

未关闭
#2,374 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
5/5
预计耗时
一周以上
新手友好度
15/100
Issue 类型
功能
描述清晰度
基本清楚
活跃度
停滞
技术栈
typescript
领域
api

调研方向

This is a design-level request with no pointer into the code: the payload names only ZenStack's automatic REST API, the .zmodel schema and the REST plugin configuration. Read how the REST plugin maps models to flat routes and how ZModel attributes are parsed, then weigh a schema attribute (the suggested @@http.path) against plugin config. "Done" means nested routes like GET /threads/1/comments that scope children to their parent, auto-set the foreign key on POST, and 404 on mismatch — but the approach needs maintainer agreement first.

由索引模型根据 Issue 内容生成。

描述

Description

Is your feature request related to a problem? Please describe.
Currently, ZenStack's automatic REST API generates "flat" endpoints for all models (e.g., /thread/1 and /comment/2). While functional, this doesn't reflect the logical ownership and hierarchy of data. For resources that are strictly dependent on a parent—such as a Comment that must always belong to a Thread—a flat structure lacks semantic clarity and forces the client to manually manage foreign keys in every request.

Without nested routing, the API doesn't express the constraint that a child resource's lifecycle is bound to its parent.

Describe the solution you'd like
I would like the ability to configure hierarchical or "nested" endpoints within the automatic REST API. This would allow for URLs like:
GET /threads/:threadId/comments/:commentId

Key Requirements:

  • Logical Scoping: Accessing a child via a nested route should automatically apply a filter to ensure the child actually belongs to the specified parent.
  • Simplified Creation: A POST to /threads/1/comments should automatically associate the new comment with threadId: 1 without requiring the ID in the request body.
  • ZModel Configuration: Ideally, this could be defined in the .zmodel file using an attribute (e.g., @@http.path) or via the plugin configuration to specify parent-child relationships for routing.

Example Structure:
If a Thread has many Comments:

  • GET /threads/1/comments — Fetches all comments for thread 1.
  • POST /threads/1/comments — Creates a comment specifically for thread 1.
  • GET /threads/1/comments/2 — Fetches comment 2, but only if it belongs to thread 1 (returning 404 otherwise).

Describe alternatives you've considered

  • Flat Endpoints with Filters: Using GET /comment?threadId=1. While this works, it is less RESTful and doesn't enforce the hierarchy at the routing level.
  • Custom Hooks/Routes: Writing manual Next.js or Express routes to wrap the ZenStack logic. This defeats the purpose of an "Automatic" REST API and increases boilerplate.

Additional context
Hierarchical routing is a staple of mature REST frameworks. For instance:

  • Ruby on Rails allows resources :threads do resources :comments end.
  • NestJS and Express developers frequently implement this to improve API discoverability and security through implicit scoping.

This feature would make ZenStack-generated APIs feel significantly more professional and "opinionated" in a way that aligns with standard REST best practices.

References:

主要语言
TypeScript
星标
2.9k
派生
157
平均合并
2 天 46 分钟
30 天内合并 PR
17

环境准备

这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

zenstackhq/zenstack 的其他 Issue

查看 zenstackhq/zenstack 的全部 Issue

相似的 Issue

更多 TypeScript Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。