Skip to content

Commit 7a8d52b

Browse files
committed
add middleware which sets user from session
1 parent 0a02a1c commit 7a8d52b

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

internal/handlers/status.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
11
package handlers
22

33
import (
4+
"fmt"
45
"net/http"
6+
"sandbox-go-api-sqlboiler-rest-auth/models"
57

68
"github.com/labstack/echo/v4"
79
)
810

11+
type CookieValue struct {
12+
UserID int
13+
Name string
14+
}
15+
916
func (h *Handlers) GetStatus(c echo.Context) error {
17+
var u *models.User
18+
uv := c.Get("user")
19+
if uv != nil {
20+
u = uv.(*models.User)
21+
fmt.Println("user data?", u)
22+
} else {
23+
fmt.Println("not set user session")
24+
}
1025
return c.String(http.StatusOK, "server is running")
1126
}

internal/routes/middlewares.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package routes
22

33
import (
4+
"database/sql"
45
"fmt"
6+
"sandbox-go-api-sqlboiler-rest-auth/internal/scookie"
7+
"sandbox-go-api-sqlboiler-rest-auth/models"
58
"time"
69

710
"go.uber.org/zap"
@@ -10,6 +13,40 @@ import (
1013
"github.com/labstack/echo/v4"
1114
)
1215

16+
func SessionRestorer(db *sql.DB) echo.MiddlewareFunc {
17+
return func(next echo.HandlerFunc) echo.HandlerFunc {
18+
return func(c echo.Context) error {
19+
fmt.Println("test middleware")
20+
sc := scookie.NewSecureCookie()
21+
22+
cv, err := c.Cookie("session")
23+
if err != nil {
24+
return next(c)
25+
}
26+
27+
var dv string
28+
err = sc.Decode("session", cv.Value, &dv)
29+
if err != nil {
30+
return echo.NewHTTPError(500, "cannot decode cookie", err)
31+
}
32+
fmt.Println("got cookie(session id): ", dv)
33+
34+
sess, err := models.FindSession(c.Request().Context(), db, dv)
35+
if err != nil {
36+
// maybe wrong cookie id?
37+
return echo.NewHTTPError(500, "cannot get cookie, but got session id", dv, err)
38+
}
39+
user, err := sess.User().One(c.Request().Context(), db)
40+
if err != nil {
41+
return echo.NewHTTPError(500, "cannod find user from session relation", dv, err)
42+
}
43+
fmt.Println("got user in middleware", user)
44+
c.Set("user", user)
45+
return next(c)
46+
}
47+
}
48+
}
49+
1350
func ZapLogger(log *zap.Logger) echo.MiddlewareFunc {
1451
return func(next echo.HandlerFunc) echo.HandlerFunc {
1552
return func(c echo.Context) error {

internal/routes/routes.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
func NewRouter(db *sql.DB, l *zap.Logger) *echo.Echo {
1818
h := handlers.NewHandler(db, l)
1919
e := echo.New()
20-
bindRouteMiddlewares(e, l)
20+
bindRouteMiddlewares(e, l, db)
2121

2222
// routes
2323
e.GET("/api/status", h.GetStatus)
@@ -40,13 +40,14 @@ func bindRoutes(e *echo.Echo, h *handlers.Handlers) {
4040
e.DELETE("/api/v1/users/:id", h.DeleteUser)
4141
}
4242

43-
func bindRouteMiddlewares(e *echo.Echo, logger *zap.Logger) {
43+
func bindRouteMiddlewares(e *echo.Echo, logger *zap.Logger, db *sql.DB) {
4444
// middlewares
4545
e.Pre(middleware.RemoveTrailingSlash())
4646
e.Use(ZapLogger(logger))
4747
e.Use(middleware.RateLimiter(middleware.NewRateLimiterMemoryStore(20)))
4848
e.Use(middleware.SecureWithConfig(middleware.SecureConfig{}))
4949
e.Use(middleware.TimeoutWithConfig(middleware.TimeoutConfig{}))
50+
e.Use(SessionRestorer(db))
5051

5152
// middlewares if production
5253
//e.Use(middleware.CORSWithConfig(middleware.CORSConfig{

0 commit comments

Comments
 (0)