conversation_stub.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package handlers
  2. import (
  3. "log/slog"
  4. "net/http"
  5. "strconv"
  6. "github.com/mk6i/open-oscar-server/state"
  7. )
  8. // ConversationStubHandler serves Web AIM conversation/imlog endpoints the
  9. // client calls when syncing chat focus and read state.
  10. type ConversationStubHandler struct {
  11. SessionManager *state.WebAPISessionManager
  12. Logger *slog.Logger
  13. }
  14. func (h *ConversationStubHandler) ok(w http.ResponseWriter, r *http.Request) {
  15. resp := BaseResponse{}
  16. resp.Response.StatusCode = 200
  17. resp.Response.StatusText = "OK"
  18. SendResponse(w, r, resp, h.Logger)
  19. }
  20. // Update records active/focus time for a conversation (fire-and-forget).
  21. func (h *ConversationStubHandler) Update(w http.ResponseWriter, r *http.Request) {
  22. h.ok(w, r)
  23. }
  24. // Close acknowledges a conversation was closed in the client.
  25. func (h *ConversationStubHandler) Close(w http.ResponseWriter, r *http.Request) {
  26. h.ok(w, r)
  27. }
  28. // MarkRead acknowledges IM log read state for a buddy.
  29. func (h *ConversationStubHandler) MarkRead(w http.ResponseWriter, r *http.Request) {
  30. h.ok(w, r)
  31. }
  32. // FetchStoredIMs returns stored IM history for a conversation partner.
  33. func (h *ConversationStubHandler) FetchStoredIMs(w http.ResponseWriter, r *http.Request, sess *state.WebAPISession) {
  34. partner := r.URL.Query().Get("to")
  35. if partner == "" {
  36. SendError(w, http.StatusBadRequest, "missing required parameter: to")
  37. return
  38. }
  39. q := state.StoredIMQuery{
  40. PartnerAimID: partner,
  41. SortOrder: r.URL.Query().Get("sortOrder"),
  42. SkipMsgID: r.URL.Query().Get("skipMsgId"),
  43. StopMsgID: r.URL.Query().Get("stopMsgId"),
  44. }
  45. if n := r.URL.Query().Get("nToGet"); n != "" {
  46. if v, err := strconv.Atoi(n); err == nil {
  47. q.NToGet = v
  48. }
  49. }
  50. if start := r.URL.Query().Get("startTime"); start != "" {
  51. if v, err := strconv.ParseInt(start, 10, 64); err == nil {
  52. q.StartTime = v
  53. }
  54. }
  55. if end := r.URL.Query().Get("endTime"); end != "" {
  56. if v, err := strconv.ParseInt(end, 10, 64); err == nil {
  57. q.EndTime = v
  58. }
  59. }
  60. msgs := sess.GetStoredIMs(q)
  61. resp := BaseResponse{}
  62. resp.Response.StatusCode = 200
  63. resp.Response.StatusText = "OK"
  64. resp.Response.Data = map[string]interface{}{
  65. "msgs": msgs,
  66. }
  67. SendResponse(w, r, resp, h.Logger)
  68. }