feat: implement Hybrid SSR for bookshelf page
- Add LibraryData type to templates/types.go - Update bookshelf template to accept libraries parameter - Render libraries server-side for faster initial page load - Libraries now populated from server data instead of AJAX fetch - JavaScript still uses API for dynamic content (bookshelf items) - Update /bookshelf route to fetch libraries server-side before render - Properly handle UUID and pgtype.Text conversions - Maintain API endpoint compatibility for JavaScript calls This improves initial page load performance while preserving dynamic functionality via API calls.
This commit is contained in:
+31
-10
@@ -339,20 +339,41 @@ func main() {
|
||||
|
||||
// Bookshelf route (protected) - new default for logged-in users
|
||||
protected.GET("/bookshelf", func(c echo.Context) error {
|
||||
userID := c.Get("user_id").(string)
|
||||
userEmail := c.Get("user_email").(string)
|
||||
userUsername := c.Get("user_username").(string)
|
||||
userRole := c.Get("user_role").(string)
|
||||
user := c.Get("user").(database.Users)
|
||||
userUUID := uuid.UUID(user.ID.Bytes)
|
||||
|
||||
user := templates.User{
|
||||
ID: userID,
|
||||
Email: userEmail,
|
||||
Username: userUsername,
|
||||
Role: userRole,
|
||||
// Fetch libraries server-side for SSR
|
||||
librariesData, err := libraryHandler.GetUserVisibleLibrariesData(c.Request().Context(), pgtype.UUID{Bytes: userUUID, Valid: true})
|
||||
if err != nil {
|
||||
return c.HTML(http.StatusInternalServerError, "Error loading libraries")
|
||||
}
|
||||
|
||||
// Convert to template format
|
||||
libraries := make([]templates.LibraryData, len(librariesData))
|
||||
for i, lib := range librariesData {
|
||||
libUUID := uuid.UUID(lib.ID.Bytes)
|
||||
description := ""
|
||||
if lib.Description.Valid {
|
||||
description = lib.Description.String
|
||||
}
|
||||
libraries[i] = templates.LibraryData{
|
||||
ID: libUUID.String(),
|
||||
Name: lib.Name,
|
||||
Description: description,
|
||||
TypeName: lib.TypeName,
|
||||
}
|
||||
}
|
||||
|
||||
userTemplate := templates.User{
|
||||
ID: userUUID.String(),
|
||||
Email: user.Email,
|
||||
Username: user.Username,
|
||||
Role: user.Role,
|
||||
}
|
||||
|
||||
// Render template WITH libraries data (SSR)
|
||||
var buf bytes.Buffer
|
||||
err := templates.BookShelf(user).Render(c.Request().Context(), &buf)
|
||||
err = templates.BookShelf(userTemplate, libraries).Render(c.Request().Context(), &buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user