feat: add comments
This commit is contained in:
@@ -51,6 +51,7 @@ type Server struct {
|
||||
oauthH *handler.OAuthHandler
|
||||
userH *handler.UserHandler
|
||||
postH *handler.PostHandler
|
||||
commentH *handler.CommentHandler
|
||||
bookmarkH *handler.BookmarkHandler
|
||||
collectionH *handler.CollectionHandler
|
||||
profileH *handler.ProfileHandler
|
||||
@@ -166,7 +167,8 @@ func (s *Server) initAuth(cfg *config.Config, logger *zap.Logger) {
|
||||
// (s.redis may be nil — LikeRepo then applies counts directly).
|
||||
likeRepo := repository.NewLikeRepo(s.pg, s.redis, logger)
|
||||
mentionRepo := repository.NewMentionRepo(s.pg)
|
||||
postSvc := service.NewPostService(postRepo, r2, likeRepo, mentionRepo)
|
||||
commentRepo := repository.NewCommentRepo(s.pg, logger)
|
||||
postSvc := service.NewPostService(postRepo, r2, likeRepo, mentionRepo, commentRepo)
|
||||
bookmarkSvc := service.NewBookmarkService(userRepo, bookmarkRepo)
|
||||
collectionSvc := service.NewCollectionService(userRepo, collectionRepo, postRepo, r2)
|
||||
|
||||
@@ -219,6 +221,13 @@ func (s *Server) initAuth(cfg *config.Config, logger *zap.Logger) {
|
||||
// the author (push + realtime; not the liker themselves).
|
||||
postSvc.SetNotifier(notifSvc)
|
||||
|
||||
// Comments: comment / reply / like / pin / report over the same Postgres
|
||||
// pool, with the notification seam so new comments notify the post author
|
||||
// and replies notify the comment they answer.
|
||||
commentSvc := service.NewCommentService(commentRepo)
|
||||
commentSvc.SetNotifier(notifSvc)
|
||||
s.commentH = handler.NewCommentHandler(commentSvc)
|
||||
|
||||
// Sādhana reminders: a background worker nudges users (email + push +
|
||||
// websocket) to chant / post a quote at their local time. Shares the
|
||||
// notification seam above so all three channels fire.
|
||||
@@ -239,7 +248,7 @@ func (s *Server) initAuth(cfg *config.Config, logger *zap.Logger) {
|
||||
s.relationH = handler.NewRelationshipHandler(graphSvc)
|
||||
s.notificationH = handler.NewNotificationHandler(notifSvc)
|
||||
s.postH = handler.NewPostHandler(postSvc, graphSvc)
|
||||
s.profileH = handler.NewProfileHandler(userRepo, postRepo, collectionRepo, graphSvc, likeRepo, mentionRepo)
|
||||
s.profileH = handler.NewProfileHandler(userRepo, postRepo, collectionRepo, graphSvc, likeRepo, mentionRepo, commentRepo)
|
||||
|
||||
// Sādhana streak: daily chanting log + the growing-plant state. Reads
|
||||
// the chanting half from sadhna_logs and the posting half from the
|
||||
@@ -647,6 +656,10 @@ func (s *Server) setupRouter() {
|
||||
r.Get("/{id}/likes", s.postH.ListLikes)
|
||||
// Tagged users on a post — public (read-only for non-authors).
|
||||
r.Get("/{id}/mentions", s.postH.ListMentions)
|
||||
// Comments — public read (viewer_has_liked populated when signed in).
|
||||
if s.commentH != nil {
|
||||
r.Get("/{id}/comments", s.commentH.List)
|
||||
}
|
||||
})
|
||||
// Protected — create / delete / image presign / "my posts" /
|
||||
// reshare actions.
|
||||
@@ -672,6 +685,37 @@ func (s *Server) setupRouter() {
|
||||
r.Delete("/{id}/mentions/{userID}", s.postH.RemoveMention)
|
||||
// Report a post (category + optional reason) → admin email.
|
||||
r.Post("/{id}/report", s.postH.Report)
|
||||
// Add a comment / reply (anyone signed in).
|
||||
if s.commentH != nil {
|
||||
r.Post("/{id}/comments", s.commentH.Create)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
// --- Social: comments (replies, likes, pin, delete, report) ---
|
||||
// Keyed by comment id; the post-scoped list/create live under /posts.
|
||||
r.Route("/comments", func(r chi.Router) {
|
||||
if s.commentH == nil {
|
||||
r.HandleFunc("/*", s.authUnavailable)
|
||||
return
|
||||
}
|
||||
// Public read — a thread's replies (viewer_has_liked when signed in).
|
||||
r.Group(func(r chi.Router) {
|
||||
r.Use(middleware.OptionalAuth(s.authIssuer, s.userRepo))
|
||||
r.Get("/{id}/replies", s.commentH.Replies)
|
||||
})
|
||||
// Protected — like / pin / delete / report.
|
||||
r.Group(func(r chi.Router) {
|
||||
r.Use(middleware.RequireAuth(s.authIssuer, s.userRepo))
|
||||
r.Post("/{id}/like", s.commentH.Like)
|
||||
r.Delete("/{id}/like", s.commentH.Unlike)
|
||||
// Pin / unpin — post author only (enforced in the service).
|
||||
r.Post("/{id}/pin", s.commentH.Pin)
|
||||
r.Delete("/{id}/pin", s.commentH.Unpin)
|
||||
// Delete — comment author or post author; removes the thread.
|
||||
r.Delete("/{id}", s.commentH.Delete)
|
||||
// Report a comment (category + optional reason).
|
||||
r.Post("/{id}/report", s.commentH.Report)
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user