conversation_stub.go 2.3 KB

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