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:
2026-02-02 16:46:45 -05:00
parent 7c4a37175b
commit a89d5c599d
4 changed files with 124 additions and 25 deletions
+31 -10
View File
@@ -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
}