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  }