mirror of
https://github.com/kataras/iris.git
synced 2025-01-23 18:51:03 +01:00
ed45c77be5
Former-commit-id: ed635ee95de7160cde11eaabc0c1dcb0e460a620
98 lines
2.4 KiB
Go
98 lines
2.4 KiB
Go
// Package api contains the handlers for our HTTP Endpoints.
|
|
package api
|
|
|
|
import (
|
|
"time"
|
|
|
|
"myapp/service"
|
|
"myapp/sql"
|
|
|
|
"github.com/kataras/iris/v12"
|
|
"github.com/kataras/iris/v12/middleware/jwt"
|
|
"github.com/kataras/iris/v12/middleware/requestid"
|
|
)
|
|
|
|
// Router accepts any required dependencies and returns the main server's handler.
|
|
func Router(db sql.Database, secret string) func(iris.Party) {
|
|
return func(r iris.Party) {
|
|
j := jwt.HMAC(15*time.Minute, secret)
|
|
|
|
r.Use(requestid.New())
|
|
r.Use(verifyToken(j))
|
|
// Generate a token for testing by navigating to
|
|
// http://localhost:8080/token endpoint.
|
|
// Copy-paste it to a ?token=$token url parameter or
|
|
// open postman and put an Authentication: Bearer $token to get
|
|
// access on create, update and delete endpoinds.
|
|
|
|
r.Get("/token", writeToken(j))
|
|
|
|
var (
|
|
categoryService = service.NewCategoryService(db)
|
|
productService = service.NewProductService(db)
|
|
)
|
|
|
|
cat := r.Party("/category")
|
|
{
|
|
// TODO: new Use to add middlewares to specific
|
|
// routes per METHOD ( we already have the per path through parties.)
|
|
handler := NewCategoryHandler(categoryService)
|
|
|
|
cat.Get("/", handler.List)
|
|
cat.Post("/", handler.Create)
|
|
cat.Put("/", handler.Update)
|
|
|
|
cat.Get("/{id:int64}", handler.GetByID)
|
|
cat.Patch("/{id:int64}", handler.PartialUpdate)
|
|
cat.Delete("/{id:int64}", handler.Delete)
|
|
/* You can also do something like that:
|
|
cat.PartyFunc("/{id:int64}", func(c iris.Party) {
|
|
c.Get("/", handler.GetByID)
|
|
c.Post("/", handler.PartialUpdate)
|
|
c.Delete("/", handler.Delete)
|
|
})
|
|
*/
|
|
|
|
cat.Get("/{id:int64}/products", handler.ListProducts)
|
|
cat.Post("/{id:int64}/products", handler.InsertProducts(productService))
|
|
}
|
|
|
|
prod := r.Party("/product")
|
|
{
|
|
handler := NewProductHandler(productService)
|
|
|
|
prod.Get("/", handler.List)
|
|
prod.Post("/", handler.Create)
|
|
prod.Put("/", handler.Update)
|
|
|
|
prod.Get("/{id:int64}", handler.GetByID)
|
|
prod.Patch("/{id:int64}", handler.PartialUpdate)
|
|
prod.Delete("/{id:int64}", handler.Delete)
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
func writeToken(j *jwt.JWT) iris.Handler {
|
|
return func(ctx iris.Context) {
|
|
claims := jwt.Claims{
|
|
Issuer: "https://iris-go.com",
|
|
Audience: jwt.Audience{requestid.Get(ctx)},
|
|
}
|
|
|
|
j.WriteToken(ctx, claims)
|
|
}
|
|
}
|
|
|
|
func verifyToken(j *jwt.JWT) iris.Handler {
|
|
return func(ctx iris.Context) {
|
|
// Allow all GET.
|
|
if ctx.Method() == iris.MethodGet {
|
|
ctx.Next()
|
|
return
|
|
}
|
|
|
|
j.Verify(ctx)
|
|
}
|
|
}
|