91 lines
1.9 KiB
Go
91 lines
1.9 KiB
Go
package ws
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"lone-services/pkg/redis"
|
|
|
|
jsoniter "github.com/json-iterator/go"
|
|
)
|
|
|
|
func Publish(ctx context.Context, sessionID string, resp Response) error {
|
|
if redis.Client == nil {
|
|
return fmt.Errorf("ws: redis not initialized")
|
|
}
|
|
if sessionID == "" {
|
|
return fmt.Errorf("ws: session_id empty")
|
|
}
|
|
|
|
var dataRaw []byte
|
|
if resp.Data != nil {
|
|
b, err := jsoniter.Marshal(resp.Data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
dataRaw = b
|
|
}
|
|
|
|
evt := Event{
|
|
SessionID: sessionID,
|
|
Code: resp.Code,
|
|
Message: resp.Message,
|
|
Data: dataRaw,
|
|
}
|
|
payload, err := jsoniter.Marshal(evt)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return redis.Client.Publish(ctx, RedisChannelQRPush, payload).Err()
|
|
}
|
|
|
|
func UpdateSessionAndPublish(ctx context.Context, sessionID string, status int, data interface{}) error {
|
|
if redis.Client == nil {
|
|
return fmt.Errorf("ws: redis not initialized")
|
|
}
|
|
if sessionID == "" {
|
|
return fmt.Errorf("ws: session_id empty")
|
|
}
|
|
|
|
sess := Session{Status: status}
|
|
if old, err := GetSession(ctx, sessionID); err == nil && old != nil {
|
|
sess.ClientCode = old.ClientCode
|
|
}
|
|
if data != nil {
|
|
b, err := jsoniter.Marshal(data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
sess.Data = b
|
|
}
|
|
|
|
raw, err := jsoniter.Marshal(sess)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
key := RedisKeyQRSession + sessionID
|
|
if err := redis.Client.Set(ctx, key, raw, SessionTTL).Err(); err != nil {
|
|
return err
|
|
}
|
|
return Publish(ctx, sessionID, Success(data))
|
|
}
|
|
|
|
func GetSession(ctx context.Context, sessionID string) (*Session, error) {
|
|
if redis.Client == nil {
|
|
return nil, fmt.Errorf("ws: redis not initialized")
|
|
}
|
|
if sessionID == "" {
|
|
return nil, fmt.Errorf("ws: session_id empty")
|
|
}
|
|
|
|
val, err := redis.Client.Get(ctx, RedisKeyQRSession+sessionID).Result()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var sess Session
|
|
if err := jsoniter.UnmarshalFromString(val, &sess); err != nil {
|
|
return nil, err
|
|
}
|
|
return &sess, nil
|
|
}
|