bart.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package handler
  2. import (
  3. "context"
  4. "io"
  5. "log/slog"
  6. "github.com/mk6i/retro-aim-server/server/oscar"
  7. "github.com/mk6i/retro-aim-server/server/oscar/middleware"
  8. "github.com/mk6i/retro-aim-server/state"
  9. "github.com/mk6i/retro-aim-server/wire"
  10. )
  11. type BARTService interface {
  12. UpsertItem(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, inBody wire.SNAC_0x10_0x02_BARTUploadQuery) (wire.SNACMessage, error)
  13. RetrieveItem(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, inBody wire.SNAC_0x10_0x04_BARTDownloadQuery) (wire.SNACMessage, error)
  14. }
  15. func NewBARTHandler(logger *slog.Logger, bartService BARTService) BARTHandler {
  16. return BARTHandler{
  17. BARTService: bartService,
  18. RouteLogger: middleware.RouteLogger{
  19. Logger: logger,
  20. },
  21. }
  22. }
  23. type BARTHandler struct {
  24. BARTService
  25. middleware.RouteLogger
  26. }
  27. func (h BARTHandler) UploadQuery(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  28. inBody := wire.SNAC_0x10_0x02_BARTUploadQuery{}
  29. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  30. return err
  31. }
  32. outSNAC, err := h.UpsertItem(ctx, sess, inFrame, inBody)
  33. if err != nil {
  34. return err
  35. }
  36. h.LogRequestAndResponse(ctx, inFrame, outSNAC, outSNAC.Frame, outSNAC.Body)
  37. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  38. }
  39. func (h BARTHandler) DownloadQuery(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  40. inBody := wire.SNAC_0x10_0x04_BARTDownloadQuery{}
  41. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  42. return err
  43. }
  44. outSNAC, err := h.RetrieveItem(ctx, sess, inFrame, inBody)
  45. if err != nil {
  46. return err
  47. }
  48. h.LogRequestAndResponse(ctx, inFrame, outSNAC, outSNAC.Frame, outSNAC.Body)
  49. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  50. }