From 506a12c06c6a4c1a2d641afdd5ddcf36ee857f03 Mon Sep 17 00:00:00 2001 From: Travis Shears Date: Sun, 28 Sep 2025 09:21:17 +0200 Subject: [PATCH] use new PocketBaseClient in microblog package --- internal/microblog/handler.go | 6 +- internal/microblog/microblog.go | 222 ++++++++++++++++---------------- test_pocketbase.go | 6 +- 3 files changed, 119 insertions(+), 115 deletions(-) diff --git a/internal/microblog/handler.go b/internal/microblog/handler.go index 07ceee0..42c1629 100644 --- a/internal/microblog/handler.go +++ b/internal/microblog/handler.go @@ -1,6 +1,8 @@ package microblog import ( + "gemini_site/internal/pocketbase" + gemini "github.com/kulak/gemini" ) @@ -10,6 +12,6 @@ type Handler interface { } // NewHandler creates a new microblog handler -func NewHandler() Handler { - return NewMicroBlog() +func NewHandler(pbClient *pocketbase.PocketBaseClient) Handler { + return NewMicroBlog(pbClient) } diff --git a/internal/microblog/microblog.go b/internal/microblog/microblog.go index b511535..ebdc7d7 100644 --- a/internal/microblog/microblog.go +++ b/internal/microblog/microblog.go @@ -3,8 +3,8 @@ package microblog import ( "encoding/json" "fmt" - "sort" - "strings" + "gemini_site/internal/pocketbase" + "log/slog" "time" gemini "github.com/kulak/gemini" @@ -48,149 +48,149 @@ type pbPost struct { // MicroBlog manages blog posts type MicroBlog struct { - posts []Post + pbClient *pocketbase.PocketBaseClient } // NewMicroBlog creates a new microblog instance -func NewMicroBlog() *MicroBlog { +func NewMicroBlog(pbClient *pocketbase.PocketBaseClient) *MicroBlog { mb := &MicroBlog{ - posts: make([]Post, 0), + pbClient: pbClient, } - - // Add some sample posts - mb.addSamplePosts() - return mb } -// addSamplePosts adds some initial content -func (mb *MicroBlog) addSamplePosts() { - samplePosts := []Post{ - { - ID: "1", - Title: "Welcome to the Gemini Microblog", - Content: "This is the first post on our Gemini-powered microblog! It's simple, fast, and distraction-free.", - Author: "Admin", - Timestamp: time.Now().Add(-2 * time.Hour), - }, - { - ID: "2", - Title: "The Beauty of Simplicity", - Content: "Gemini protocol encourages us to focus on content over presentation. This microblog embodies that philosophy.", - Author: "Admin", - Timestamp: time.Now().Add(-1 * time.Hour), - }, - } +// // Add some sample posts +// mb.addSamplePosts() - mb.posts = append(mb.posts, samplePosts...) -} +// return mb +// } + +// addSamplePosts adds some initial content +// func (mb *MicroBlog) addSamplePosts() { +// samplePosts := []Post{ +// { +// ID: "1", +// Title: "Welcome to the Gemini Microblog", +// Content: "This is the first post on our Gemini-powered microblog! It's simple, fast, and distraction-free.", +// Author: "Admin", +// Timestamp: time.Now().Add(-2 * time.Hour), +// }, +// { +// ID: "2", +// Title: "The Beauty of Simplicity", +// Content: "Gemini protocol encourages us to focus on content over presentation. This microblog embodies that philosophy.", +// Author: "Admin", +// Timestamp: time.Now().Add(-1 * time.Hour), +// }, +// } + +// mb.posts = append(mb.posts, samplePosts...) +// } // AddPost adds a new post to the blog -func (mb *MicroBlog) AddPost(title, content, author string) string { - id := fmt.Sprintf("%d", time.Now().Unix()) - post := Post{ - ID: id, - Title: title, - Content: content, - Author: author, - Timestamp: time.Now(), - } +// func (mb *MicroBlog) AddPost(title, content, author string) string { +// id := fmt.Sprintf("%d", time.Now().Unix()) +// post := Post{ +// ID: id, +// Title: title, +// Content: content, +// Author: author, +// Timestamp: time.Now(), +// } - mb.posts = append(mb.posts, post) - return id -} +// mb.posts = append(mb.posts, post) +// return id +// } // GetPost retrieves a post by ID -func (mb *MicroBlog) GetPost(id string) (*Post, bool) { - for _, post := range mb.posts { - if post.ID == id { - return &post, true - } - } - return nil, false -} +// func (mb *MicroBlog) GetPost(id string) (*Post, bool) { +// for _, post := range mb.posts { +// if post.ID == id { +// return &post, true +// } +// } +// return nil, false +// } // GetRecentPosts returns the most recent posts -func (mb *MicroBlog) GetRecentPosts(limit int) []Post { - // Sort posts by timestamp (newest first) - sortedPosts := make([]Post, len(mb.posts)) - copy(sortedPosts, mb.posts) - - sort.Slice(sortedPosts, func(i, j int) bool { - return sortedPosts[i].Timestamp.After(sortedPosts[j].Timestamp) - }) - - if limit > 0 && len(sortedPosts) > limit { - return sortedPosts[:limit] +func (mb *MicroBlog) GetRecentPosts(limit int) ([]post, error) { + res, err := mb.pbClient.GetList("micro_blog_posts", 1, limit, "-posted") + if err != nil { + return nil, fmt.Errorf("failed to fetch posts from pocketbase: %w", err) } - return sortedPosts + var rawPosts []pbPost + if err := json.Unmarshal(res.Items, &rawPosts); err != nil { + return nil, fmt.Errorf("failed to decode response: %w", err) + } + slog.Info("Posts from pocketbase", "rawPosts", rawPosts) + return nil, fmt.Errorf("todo: %w", err) } // HandleBlogRequest handles Gemini requests for the microblog func (mb *MicroBlog) HandleBlogRequest(w gemini.ResponseWriter, req *gemini.Request) { - path := req.URL.Path + // path := req.URL.Path - switch { - case path == "/microblog" || path == "/microblog/": - mb.serveBlogIndex(w, req) - case strings.HasPrefix(path, "/microblog/post/"): - postID := strings.TrimPrefix(path, "/microblog/post/") - mb.servePost(w, req, postID) - default: - w.WriteStatusMsg(gemini.StatusNotFound, "Blog page not found") - } + // switch { + // case path == "/microblog" || path == "/microblog/": + // mb.serveBlogIndex(w, req) + // case strings.HasPrefix(path, "/microblog/post/"): + // postID := strings.TrimPrefix(path, "/microblog/post/") + // mb.servePost(w, req, postID) + // default: + // w.WriteStatusMsg(gemini.StatusNotFound, "Blog page not found") + // } } // serveBlogIndex serves the main blog page with recent posts -func (mb *MicroBlog) serveBlogIndex(w gemini.ResponseWriter, req *gemini.Request) { - w.WriteStatusMsg(gemini.StatusSuccess, "text/gemini") +// func (mb *MicroBlog) serveBlogIndex(w gemini.ResponseWriter, req *gemini.Request) { +// w.WriteStatusMsg(gemini.StatusSuccess, "text/gemini") - var content strings.Builder - content.WriteString("# Gemini Microblog\n\n") +// var content strings.Builder +// content.WriteString("# Gemini Microblog\n\n") - posts := mb.GetRecentPosts(10) +// posts := mb.GetRecentPosts(10) - if len(posts) == 0 { - content.WriteString("No posts yet. Be the first to write something!\n\n") - } else { - content.WriteString("## Recent Posts\n\n") +// if len(posts) == 0 { +// content.WriteString("No posts yet. Be the first to write something!\n\n") +// } else { +// content.WriteString("## Recent Posts\n\n") - for _, post := range posts { - content.WriteString(fmt.Sprintf("=> /blog/post/%s %s\n", post.ID, post.Title)) - content.WriteString(fmt.Sprintf(" By %s on %s\n\n", - post.Author, - post.Timestamp.Format("2006-01-02 15:04"))) - } - } +// for _, post := range posts { +// content.WriteString(fmt.Sprintf("=> /blog/post/%s %s\n", post.ID, post.Title)) +// content.WriteString(fmt.Sprintf(" By %s on %s\n\n", +// post.Author, +// post.Timestamp.Format("2006-01-02 15:04"))) +// } +// } - content.WriteString("## Actions\n\n") - content.WriteString("=> /blog/new Write a new post\n") - content.WriteString("=> / Back to home\n") +// content.WriteString("## Actions\n\n") +// content.WriteString("=> /blog/new Write a new post\n") +// content.WriteString("=> / Back to home\n") - w.WriteBody([]byte(content.String())) -} +// w.WriteBody([]byte(content.String())) +// } // servePost serves a single blog post -func (mb *MicroBlog) servePost(w gemini.ResponseWriter, req *gemini.Request, postID string) { - post, found := mb.GetPost(postID) - if !found { - w.WriteStatusMsg(gemini.StatusNotFound, "Post not found") - return - } +// func (mb *MicroBlog) servePost(w gemini.ResponseWriter, req *gemini.Request, postID string) { +// post, found := mb.GetPost(postID) +// if !found { +// w.WriteStatusMsg(gemini.StatusNotFound, "Post not found") +// return +// } - w.WriteStatusMsg(gemini.StatusSuccess, "text/gemini") +// w.WriteStatusMsg(gemini.StatusSuccess, "text/gemini") - var content strings.Builder - content.WriteString(fmt.Sprintf("# %s\n\n", post.Title)) - content.WriteString(fmt.Sprintf("By %s on %s\n\n", - post.Author, - post.Timestamp.Format("2006-01-02 15:04"))) - content.WriteString("---\n\n") - content.WriteString(post.Content) - content.WriteString("\n\n---\n\n") - content.WriteString("=> /blog Back to blog\n") - content.WriteString("=> / Back to home\n") +// var content strings.Builder +// content.WriteString(fmt.Sprintf("# %s\n\n", post.Title)) +// content.WriteString(fmt.Sprintf("By %s on %s\n\n", +// post.Author, +// post.Timestamp.Format("2006-01-02 15:04"))) +// content.WriteString("---\n\n") +// content.WriteString(post.Content) +// content.WriteString("\n\n---\n\n") +// content.WriteString("=> /blog Back to blog\n") +// content.WriteString("=> / Back to home\n") - w.WriteBody([]byte(content.String())) -} +// w.WriteBody([]byte(content.String())) +// } diff --git a/test_pocketbase.go b/test_pocketbase.go index c4aed1a..df5caa4 100644 --- a/test_pocketbase.go +++ b/test_pocketbase.go @@ -4,15 +4,17 @@ import ( "fmt" "log" + "gemini_site/internal/microblog" "gemini_site/internal/pocketbase" ) func main() { pbClient := pocketbase.NewPocketBaseClient() - res, err := pbClient.GetList("micro_blog_posts", 1, 10, "-posted") + mb := microblog.NewMicroBlog(pbClient) + res, err := mb.GetRecentPosts(2) + // res, err := pbClient.GetList("micro_blog_posts", 1, 10, "-posted") fmt.Println("Getting page 1 of microblog posts") // posts, err := client.GetPosts(1) - if err != nil { log.Printf("Error getting posts: %v", err) } else {