spark-server/internal/transport/tcp/handlers.go
zhr ae9a71034d feat: implement Spark IM V3 modular monolith
Add HTTP /v1 MVC, TCP send path, groups with server-side member-avatar collage, object-storage upload, and friends/favorites around the architecture-v3 layout.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 19:52:11 +08:00

61 lines
1.8 KiB
Go

package tcp
import (
"context"
"spark-server/internal/pkg/errs"
"spark-server/internal/pkg/i18n"
"spark-server/internal/transport/tcp/protocol"
"spark-server/internal/transport/tcp/session"
)
func (s *Server) registerDefaultHandlers() {
s.router.Register(protocol.CmdAuth, s.handleAuth)
s.router.Register(protocol.CmdGenerateMsgID, s.handleGenerateMsgID)
}
func (s *Server) handleAuth(ctx context.Context, conn *session.Conn, frame protocol.Frame) (*protocol.Frame, error) {
if s.auth == nil {
return nil, errs.ErrUnauthorized
}
req, err := protocol.DecodeAuthRequest(frame.Body)
if err != nil {
return nil, errs.ErrInvalidArgument
}
conn.SetLanguage(i18n.Parse(req.Language).String())
principal, err := s.auth.Authenticate(ctx, req.Token)
if err != nil {
return nil, err
}
if req.DeviceID != 0 && req.DeviceID != principal.DeviceID {
return nil, errs.ErrUnauthorized
}
conn.Authenticate(principal.UserID, principal.DeviceID)
if err := s.sessions.Bind(conn); err != nil {
return nil, err
}
conn.Activate()
body := protocol.EncodeOK(protocol.AuthResponse{UserID: principal.UserID, DeviceID: principal.DeviceID})
return &protocol.Frame{
Version: protocol.CurrentVersion, Command: protocol.CmdAuth,
RequestID: frame.RequestID, SequenceID: frame.SequenceID, Body: body,
}, nil
}
func (s *Server) handleGenerateMsgID(_ context.Context, conn *session.Conn, frame protocol.Frame) (*protocol.Frame, error) {
if s.ids == nil {
return nil, errs.ErrInternal
}
if !conn.Authenticated() {
return nil, errs.ErrUnauthorized
}
id, err := s.ids.NextMsgID()
if err != nil {
return nil, err
}
return &protocol.Frame{
Version: protocol.CurrentVersion, Command: protocol.CmdGenerateMsgID,
RequestID: frame.RequestID, SequenceID: frame.SequenceID, Body: protocol.EncodeMsgID(id),
}, nil
}