github.com/soulteary/pocket-bookcase@v0.0.0-20240428065142-0b5a9a0fc98a/internal/http/routes/legacy.go (about) 1 package routes 2 3 import ( 4 "net/http" 5 "time" 6 7 "github.com/gin-gonic/gin" 8 "github.com/gofrs/uuid/v5" 9 "github.com/julienschmidt/httprouter" 10 "github.com/pkg/errors" 11 "github.com/sirupsen/logrus" 12 "github.com/soulteary/pocket-bookcase/internal/config" 13 "github.com/soulteary/pocket-bookcase/internal/dependencies" 14 "github.com/soulteary/pocket-bookcase/internal/model" 15 "github.com/soulteary/pocket-bookcase/internal/webserver" 16 ) 17 18 type LegacyAPIRoutes struct { 19 logger *logrus.Logger 20 cfg *config.Config 21 deps *dependencies.Dependencies 22 legacyHandler *webserver.Handler 23 } 24 25 func (r *LegacyAPIRoutes) convertHttprouteParams(params gin.Params) httprouter.Params { 26 routerParams := httprouter.Params{} 27 for _, p := range params { 28 routerParams = append(routerParams, httprouter.Param{ 29 Key: p.Key, 30 Value: p.Value, 31 }) 32 } 33 return routerParams 34 } 35 36 func (r *LegacyAPIRoutes) handle(handler func(w http.ResponseWriter, r *http.Request, ps httprouter.Params)) gin.HandlerFunc { 37 return func(ctx *gin.Context) { 38 handler(ctx.Writer, ctx.Request, r.convertHttprouteParams(ctx.Params)) 39 } 40 } 41 42 func (r *LegacyAPIRoutes) HandleLogin(account model.Account, expTime time.Duration) (string, error) { 43 // Create session ID 44 sessionID, err := uuid.NewV4() 45 if err != nil { 46 return "", errors.Wrap(err, "failed to create session ID") 47 } 48 49 // Save session ID to cache 50 strSessionID := sessionID.String() 51 r.legacyHandler.SessionCache.Set(strSessionID, account, expTime) 52 53 return strSessionID, nil 54 } 55 56 func (r *LegacyAPIRoutes) HandleLogout(c *gin.Context) error { 57 sessionID := r.legacyHandler.GetSessionID(c.Request) 58 r.legacyHandler.SessionCache.Delete(sessionID) 59 return nil 60 } 61 62 func (r *LegacyAPIRoutes) Setup(g *gin.Engine) { 63 r.legacyHandler = webserver.GetLegacyHandler(webserver.Config{ 64 DB: r.deps.Database, 65 DataDir: r.cfg.Storage.DataDir, 66 RootPath: r.cfg.Http.RootPath, 67 Log: false, // Already done by gin 68 }, r.deps) 69 r.legacyHandler.PrepareSessionCache() 70 r.legacyHandler.PrepareTemplates() 71 72 legacyGroup := g.Group("/") 73 74 // Use a custom recovery handler to expose the errors that the frontend catch to redirect to 75 // the login page and display messages. 76 // This will be improved in the new API. 77 legacyGroup.Use(gin.CustomRecovery(func(c *gin.Context, err any) { 78 c.Data(http.StatusInternalServerError, "text/plain", []byte(err.(error).Error())) 79 })) 80 81 legacyGroup.POST("/api/logout", r.handle(r.legacyHandler.ApiLogout)) 82 83 // router.GET(jp("/api/tags"), withLogging(hdl.apiGetTags)) 84 legacyGroup.GET("/api/tags", r.handle(r.legacyHandler.ApiGetTags)) 85 // router.PUT(jp("/api/tag"), withLogging(hdl.apiRenameTag)) 86 legacyGroup.PUT("/api/tags", r.handle(r.legacyHandler.ApiRenameTag)) 87 // router.GET(jp("/api/bookmarks"), withLogging(hdl.apiGetBookmarks)) 88 legacyGroup.GET("/api/bookmarks", r.handle(r.legacyHandler.ApiGetBookmarks)) 89 // router.POST(jp("/api/bookmarks"), withLogging(hdl.apiInsertBookmark)) 90 legacyGroup.POST("/api/bookmarks", r.handle(r.legacyHandler.ApiInsertBookmark)) 91 // router.DELETE(jp("/api/bookmarks"), withLogging(hdl.apiDeleteBookmark)) 92 legacyGroup.DELETE("/api/bookmarks", r.handle(r.legacyHandler.ApiDeleteBookmark)) 93 // router.PUT(jp("/api/bookmarks"), withLogging(hdl.apiUpdateBookmark)) 94 legacyGroup.PUT("/api/bookmarks", r.handle(r.legacyHandler.ApiUpdateBookmark)) 95 // router.PUT(jp("/api/bookmarks/tags"), withLogging(hdl.apiUpdateBookmarkTags)) 96 legacyGroup.PUT("/api/bookmarks/tags", r.handle(r.legacyHandler.ApiUpdateBookmarkTags)) 97 // router.POST(jp("/api/bookmarks/ext"), withLogging(hdl.apiInsertViaExtension)) 98 legacyGroup.POST("/api/bookmarks/ext", r.handle(r.legacyHandler.ApiInsertViaExtension)) 99 // router.DELETE(jp("/api/bookmarks/ext"), withLogging(hdl.apiDeleteViaExtension)) 100 legacyGroup.DELETE("/api/bookmarks/ext", r.handle(r.legacyHandler.ApiDeleteViaExtension)) 101 102 // router.GET(jp("/api/accounts"), withLogging(hdl.apiGetAccounts)) 103 legacyGroup.GET("/api/accounts", r.handle(r.legacyHandler.ApiGetAccounts)) 104 // router.PUT(jp("/api/accounts"), withLogging(hdl.apiUpdateAccount)) 105 legacyGroup.PUT("/api/accounts", r.handle(r.legacyHandler.ApiUpdateAccount)) 106 // router.POST(jp("/api/accounts"), withLogging(hdl.apiInsertAccount)) 107 legacyGroup.POST("/api/accounts", r.handle(r.legacyHandler.ApiInsertAccount)) 108 // router.DELETE(jp("/api/accounts"), withLogging(hdl.apiDeleteAccount)) 109 legacyGroup.DELETE("/api/accounts", r.handle(r.legacyHandler.ApiDeleteAccount)) 110 } 111 112 func NewLegacyAPIRoutes(logger *logrus.Logger, deps *dependencies.Dependencies, cfg *config.Config) *LegacyAPIRoutes { 113 return &LegacyAPIRoutes{ 114 logger: logger, 115 cfg: cfg, 116 deps: deps, 117 } 118 }