add handler
Az add handler egyetlen endpointot ad hozzá egy meglévő surface-hez: egy TypeSpec műveletet plusz egy handler-metódus vázat, beillesztve a surface kategória-fájljaiba és anchoraiba. Ezt használd minden alkalommal, amikor egy már add surface-szal scaffoldolt surface-hez adsz műveletet.
go tool gpsystem add handler <modul> <surface> <művelet> \
--method GET --path "/items/{id}"
| Flag | Default | Jelentés |
|---|---|---|
--method | GET | GET, POST, PUT, PATCH vagy DELETE |
--path | / | útvonal a surface base-éhez képest; a {név} szegmensek path-paraméterek lesznek |
--permission | nincs | RBAC permission a művelethez; @permission("...") decorator kerül a .tsp-be |
--policy | nincs | user-szintű policy neve; @policy("...") decorator kerül a .tsp-be; a nevet regisztrálni kell a surface policy/policy.go-jában |
--group | nincs (a --path első literál szegmense) | a handler-fájl kategóriája, pl. notifications; üres csoport a modul alap handler-fájljába kerül |
Mit csinál
- TypeSpec művelet-vázat szúr be a
gpsystem:operationsanchorhoz a<surface>.tsp-ben: a path-paraméterek deklarálva, POST/PUT/PATCH esetén@bodyparaméterrel, a visszatérési típus stubbal. --permission/--policyesetén a megfelelő decoratorok is felkerülnek, és a válasz-unió kibővülUnauthorized | Forbidden-nel; az érvényesítést a generált middleware végzi (lásd auth, rbac & policy).- Kiválasztja a kategória-fájlt, amibe a handler-metódus kerül, az
internal/modules/<modul>/surfaces/<surface>/http/alatt:<modul>_handler.goaz alap csoportnak,<modul>_<csoport>_handler.goegyébként. - A csoportot alapértelmezetten a
--pathelső nem-paraméter szegmenséből származtatja (/notifications/{id}/read->notifications);--group-pal felülírható. - Az adott kategória első művelete létrehozza a fájlt, a többi a fájl végi
// gpsystem:handlersanchornál új metódusként kerül be. - A stub törzsét úgy generálja, hogy 501 Not Implemented problem dokumentumot adjon vissza, így az endpoint azonnal látható és tesztelhető.
A handler.go mindvégig a Handler struct, a New és a //go:generate helye marad: saját handler-metódust nem tartalmaz.
A munkafolyamat
go tool gpsystem add handler news api getNews --method GET --path "/items/{id}"
mise run generate # létrejön a gen.GetNewsRequest / gen.GetNewsResponse
A getNews az /items/{id} útvonal miatt az items csoportba kerül:
internal/modules/news/surfaces/api/http/news_items_handler.go. Egy ugyanazon
csoportba tartozó további művelet (pl. deleteNews --path "/items/{id}")
ugyanabba a fájlba kerül, a meglévő metódus mellé.
Aztán cseréld le a stub törzsét: hívd a service-t, és a hibát a határon csomagold be, ugyanazzal a mintával, amit az add surface váz generál:
// internal/modules/news/surfaces/api/http/news_items_handler.go
func (h *Handler) GetNews(ctx context.Context, req gen.GetNewsRequest) (gen.GetNewsResponse, error) {
item, err := h.svc.GetByID(ctx, req.Id) // add hozzá a service metódust
if err != nil {
return nil, errs.Wrap(err, "api: get news") // stacket hordoz; a httperr rendereli
}
return mapper.ToGetNewsResponse(item), nil // add hozzá a mappert
}
add handler és a mise run generate között a projekt nem fordul: a handler olyan generált típusokra hivatkozik, amik még nem léteznek. Ez várt viselkedés; a generate lépés zárja be a rést.Finomítsd a műveletet a .tsp fájlban (modellek, hiba-uniók, lapozás), és futtasd újra a mise run generate-et: a szigorú interfész fordítási időben tartja becsületben a handleredet.