Skip to content

Commit

Permalink
feat: context
Browse files Browse the repository at this point in the history
  • Loading branch information
viquitorreis committed Apr 16, 2024
1 parent 334861f commit 167cbf5
Show file tree
Hide file tree
Showing 13 changed files with 2,261 additions and 120 deletions.
76 changes: 75 additions & 1 deletion docs/context.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,77 @@
# Context no Tupã
Você pode acessar o context da requisição a partir da propriedade Context dentro da struct do **Tupa**

Em breve mais sobre o **Context**.
## Context em Middlewares

Podemos facilmente adicionar contexto a uma requisição. No Tupâ existem várias formas de se trabalhar com o contexto través do **TupaContext**. Por exemplo você pode colocar um novo context com o método `SetContext()`, que vai colocar o método na requisição. Para obter o valor do contexto, você pode obter o contexto com os métodos `GetCtx()`, `CtxValue(ctx)`.

* `GetCtx()`: retorna o context inteiro da requisição
* `CtxValue(ctx)`: retorna o contexto específico de acordo com a key especificada

Vamos adicionar um **Contexto** no middleware *MiddlewareSampleRoute()*. Lembrando que em primeiro lugar é chamado os middlewares especificos de rota, e só então os globais.

```golang
func main() {
server := tupa.NewAPIServer(":6969")
exampleManager()
server.RegisterRoutes(tupa.GetRoutes())
server.New()
}

func exampleManager() {
tupa.AddRoutes(tupa.MiddlewareChain{MiddlewareSampleCats}, SampleRouteManager)
}

func MiddlewareSampleCats(next tupa.APIFunc) tupa.APIFunc {
return func(tc *tupa.TupaContext) error {
return next(tc)
}
}

func MiddlewareSampleRoute(next tupa.APIFunc) tupa.APIFunc {
return func(tc *tupa.TupaContext) error {
catsCtxKey := "ctxcats"
ctxMsg := "contexto de alguém interessado em gatos"
newCtx := context.WithValue(tc.Request().Context(), catsCtxKey, ctxMsg)
tc.SetContext(newCtx)

return next(tc)
}
}

func SampleRouteManager() []tupa.RouteInfo {
return []tupa.RouteInfo{
{
Path: "/cats",
Method: "GET",
Handler: func(tc *tupa.TupaContext) error {
ctxFull := tc.GetCtx()
fmt.Println(ctxFull)

ctxValue := tc.CtxValue("ctxcats").(string)
fmt.Println(ctxValue)

ctxVal := tc.GetCtx().Value("ctxcats").(string)
fmt.Println(ctxVal)

resp, err := http.Get("https://cdn2.thecatapi.com/images/dN6eoeLjY.jpg")
if err != nil {
return err
}
defer resp.Body.Close()
_, err = io.Copy(*tc.Response(), resp.Body)
return err
},
Middlewares: []tupa.MiddlewareFunc{MiddlewareSampleRoute},
},
}
}

```

**output:**
```
context.Background.WithValue(type *http.contextKey, val <not Stringer>).WithValue(type *http.contextKey, val [::1]:6969).WithCancel.WithCancel.WithValue(type mux.contextKey, val <not Stringer>).WithValue(type mux.contextKey, val <not Stringer>).WithValue(type string, val contexto de alguém interessado em gatos)
contexto de alguém interessado em gatos
contexto de alguém interessado em gatos
```
5 changes: 2 additions & 3 deletions docs/middlewares.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@
<li><a href="#middlewares-grupo-rotas-especificos">Middlewares em conjuntos de rotas + especificos de rotas</a></li>
</ul>

Usar middlewares no Tupã é muito fácil, podemos implementar middlewares tanto a nível de *rota* quando para *conjuntos de rotas*.

Usar middlewares no Tupã é muito fácil, podemos implementar middlewares tanto a nível de *rota* quando para *conjuntos de rotas*.

<a id="middlewares-simples"></a>
## Middlewares simples
Expand Down Expand Up @@ -124,7 +123,7 @@ Esse código vai colocar nosso middleware como anteriormente, porém agora está
<a id="middlewares-grupo-rotas-especificos"></a>
## Middlewares em conjuntos de rotas + rota específica

Podemos também adicionar os middlewares para conjuntos de rotas e específicos de rota juntos. Nesse caso a ordem será que os **especificos de rota** terão precedência sobre os de *grupo*. Vejamos no código a seguir:
Podemos também adicionar os middlewares para conjuntos de rotas e específicos de rota juntos. Nesse caso a ordem será que os **especificos de rota** terão precedência sobre os de *grupo* na execução. Vejamos no código a seguir:

```golang
func main() {
Expand Down
32 changes: 6 additions & 26 deletions site/404.html
Original file line number Diff line number Diff line change
Expand Up @@ -246,11 +246,11 @@


<li class="md-nav__item">
<a href="/Iuptec/tupa/usage.md" class="md-nav__link">
<a href="/Iuptec/tupa/context/" class="md-nav__link">


<span class="md-ellipsis">
Como usar
Context
</span>


Expand All @@ -266,11 +266,11 @@


<li class="md-nav__item">
<a href="/Iuptec/tupa/examples.md" class="md-nav__link">
<a href="/Iuptec/tupa/examples/" class="md-nav__link">


<span class="md-ellipsis">
Examplos
Exemplos
</span>


Expand All @@ -286,27 +286,7 @@


<li class="md-nav__item">
<a href="/Iuptec/tupa/api.md" class="md-nav__link">


<span class="md-ellipsis">
API
</span>


</a>
</li>









<li class="md-nav__item">
<a href="/Iuptec/tupa/contributing.md" class="md-nav__link">
<a href="/Iuptec/tupa/contributing/" class="md-nav__link">


<span class="md-ellipsis">
Expand All @@ -326,7 +306,7 @@


<li class="md-nav__item">
<a href="/Iuptec/tupa/license.md" class="md-nav__link">
<a href="/Iuptec/tupa/license/" class="md-nav__link">


<span class="md-ellipsis">
Expand Down
Loading

0 comments on commit 167cbf5

Please sign in to comment.