package handler import ( "context" "io" "log/slog" "github.com/mk6i/retro-aim-server/server/oscar" "github.com/mk6i/retro-aim-server/server/oscar/middleware" "github.com/mk6i/retro-aim-server/state" "github.com/mk6i/retro-aim-server/wire" ) type BARTService interface { UpsertItem(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, inBody wire.SNAC_0x10_0x02_BARTUploadQuery) (wire.SNACMessage, error) RetrieveItem(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, inBody wire.SNAC_0x10_0x04_BARTDownloadQuery) (wire.SNACMessage, error) } func NewBARTHandler(logger *slog.Logger, bartService BARTService) BARTHandler { return BARTHandler{ BARTService: bartService, RouteLogger: middleware.RouteLogger{ Logger: logger, }, } } type BARTHandler struct { BARTService middleware.RouteLogger } func (h BARTHandler) UploadQuery(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error { inBody := wire.SNAC_0x10_0x02_BARTUploadQuery{} if err := wire.UnmarshalBE(&inBody, r); err != nil { return err } outSNAC, err := h.UpsertItem(ctx, sess, inFrame, inBody) if err != nil { return err } h.LogRequestAndResponse(ctx, inFrame, outSNAC, outSNAC.Frame, outSNAC.Body) return rw.SendSNAC(outSNAC.Frame, outSNAC.Body) } func (h BARTHandler) DownloadQuery(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error { inBody := wire.SNAC_0x10_0x04_BARTDownloadQuery{} if err := wire.UnmarshalBE(&inBody, r); err != nil { return err } outSNAC, err := h.RetrieveItem(ctx, sess, inFrame, inBody) if err != nil { return err } h.LogRequestAndResponse(ctx, inFrame, outSNAC, outSNAC.Frame, outSNAC.Body) return rw.SendSNAC(outSNAC.Frame, outSNAC.Body) }