package handlers import ( //"encoding/json" "messenger/internal/api/middleware" "messenger/internal/api/responses" //"messenger/internal/models" "messenger/internal/service" "net/http" "strconv" "time" "github.com/go-chi/chi/v5" ) type MessageHandler struct { messageService *service.MessageService chatService *service.ChatService } func NewMessageHandler(messageService *service.MessageService, chatService *service.ChatService) *MessageHandler { return &MessageHandler{ messageService: messageService, chatService: chatService, } } func (h *MessageHandler) GetMessages(w http.ResponseWriter, r *http.Request) { user := middleware.GetUserFromContext(r.Context()) if user == nil { responses.Unauthorized(w, "user not found") return } chatID, err := strconv.ParseInt(chi.URLParam(r, "id"), 10, 64) if err != nil { responses.BadRequest(w, "invalid chat id") return } limit := 50 if l := r.URL.Query().Get("limit"); l != "" { if parsed, err := strconv.Atoi(l); err == nil && parsed > 0 && parsed <= 100 { limit = parsed } } var before time.Time if b := r.URL.Query().Get("before"); b != "" { if parsed, err := time.Parse(time.RFC3339, b); err == nil { before = parsed } } messages, err := h.messageService.GetChatHistory(r.Context(), chatID, user.ID, limit, before) if err != nil { responses.InternalServerError(w, err.Error()) return } responses.Success(w, http.StatusOK, messages) } func (h *MessageHandler) MarkAsRead(w http.ResponseWriter, r *http.Request) { user := middleware.GetUserFromContext(r.Context()) if user == nil { responses.Unauthorized(w, "user not found") return } messageID, err := strconv.ParseInt(chi.URLParam(r, "id"), 10, 64) if err != nil { responses.BadRequest(w, "invalid message id") return } if err := h.messageService.MarkMessageAsRead(r.Context(), messageID, user.ID); err != nil { responses.InternalServerError(w, err.Error()) return } responses.Success(w, http.StatusOK, map[string]string{"message": "marked as read"}) }