diff --git a/go.mod b/go.mod index 5e5a8b5bea..57d01c38f2 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/gorilla/websocket v1.5.1 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/mitchellh/mapstructure v1.5.0 - github.com/openimsdk/protocol v0.0.72-alpha.47 + github.com/openimsdk/protocol v0.0.72-alpha.48 github.com/openimsdk/tools v0.0.50-alpha.16 github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.18.0 diff --git a/go.sum b/go.sum index 53109c8908..94553ceddb 100644 --- a/go.sum +++ b/go.sum @@ -319,8 +319,8 @@ github.com/onsi/gomega v1.25.0 h1:Vw7br2PCDYijJHSfBOWhov+8cAnUf8MfMaIOV323l6Y= github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= github.com/openimsdk/gomake v0.0.14-alpha.5 h1:VY9c5x515lTfmdhhPjMvR3BBRrRquAUCFsz7t7vbv7Y= github.com/openimsdk/gomake v0.0.14-alpha.5/go.mod h1:PndCozNc2IsQIciyn9mvEblYWZwJmAI+06z94EY+csI= -github.com/openimsdk/protocol v0.0.72-alpha.47 h1:FGHnEwsA05GxT3vnz7YH3fbVkuoO3P71ZZgkQQ71MjA= -github.com/openimsdk/protocol v0.0.72-alpha.47/go.mod h1:OZQA9FR55lseYoN2Ql1XAHYKHJGu7OMNkUbuekrKCM8= +github.com/openimsdk/protocol v0.0.72-alpha.48 h1:DVeT8Kej6OjB9bsxQ0q6FU160anwfPuVmAL/1J6VzqM= +github.com/openimsdk/protocol v0.0.72-alpha.48/go.mod h1:OZQA9FR55lseYoN2Ql1XAHYKHJGu7OMNkUbuekrKCM8= github.com/openimsdk/tools v0.0.50-alpha.16 h1:bC1AQvJMuOHtZm8LZRvN8L5mH1Ws2VYdL+TLTs1iGSc= github.com/openimsdk/tools v0.0.50-alpha.16/go.mod h1:h1cYmfyaVtgFbKmb1Cfsl8XwUOMTt8ubVUQrdGtsUh4= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= diff --git a/internal/rpc/third/application.go b/internal/rpc/third/application.go index a6556055c1..fd58e4071f 100644 --- a/internal/rpc/third/application.go +++ b/internal/rpc/third/application.go @@ -31,21 +31,38 @@ func (t *thirdServer) db2pbApplication(val *model.Application) *third.Applicatio Text: val.Text, Force: val.Force, Latest: val.Latest, + Hot: val.Hot, CreateTime: val.CreateTime.UnixMilli(), } } -func (t *thirdServer) LatestApplicationVersion(ctx context.Context, req *third.LatestApplicationVersionReq) (*third.LatestApplicationVersionResp, error) { - res, err := t.applicationDatabase.LatestVersion(ctx, req.Platform) +func (t *thirdServer) getLatestApplicationVersion(ctx context.Context, platform string, hot bool) (*third.ApplicationVersion, error) { + res, err := t.applicationDatabase.LatestVersion(ctx, platform, hot) if err == nil { - return &third.LatestApplicationVersionResp{Version: t.db2pbApplication(res)}, nil + return t.db2pbApplication(res), nil } else if IsNotFound(err) { - return &third.LatestApplicationVersionResp{}, nil + return nil, nil } else { return nil, err } } +func (t *thirdServer) LatestApplicationVersion(ctx context.Context, req *third.LatestApplicationVersionReq) (*third.LatestApplicationVersionResp, error) { + var ( + resp third.LatestApplicationVersionResp + err error + ) + resp.Version, err = t.getLatestApplicationVersion(ctx, req.Platform, false) + if err != nil { + return nil, err + } + resp.Hot, err = t.getLatestApplicationVersion(ctx, req.Platform, true) + if err != nil { + return nil, err + } + return &resp, nil +} + func (t *thirdServer) AddApplicationVersion(ctx context.Context, req *third.AddApplicationVersionReq) (*third.AddApplicationVersionResp, error) { if err := authverify.CheckAdmin(ctx, t.config.Share.IMAdminUserID); err != nil { return nil, err @@ -58,6 +75,7 @@ func (t *thirdServer) AddApplicationVersion(ctx context.Context, req *third.AddA Text: req.Text, Force: req.Force, Latest: req.Latest, + Hot: req.Hot, CreateTime: time.Now(), } if err := t.applicationDatabase.AddVersion(ctx, val); err != nil { @@ -81,6 +99,7 @@ func (t *thirdServer) UpdateApplicationVersion(ctx context.Context, req *third.U putUpdate(update, "text", req.Text) putUpdate(update, "force", req.Force) putUpdate(update, "latest", req.Latest) + putUpdate(update, "hot", req.Hot) if err := t.applicationDatabase.UpdateVersion(ctx, oid, update); err != nil { return nil, err } diff --git a/pkg/common/storage/cache/application.go b/pkg/common/storage/cache/application.go index 588732ec8d..bb23a3a17a 100644 --- a/pkg/common/storage/cache/application.go +++ b/pkg/common/storage/cache/application.go @@ -6,6 +6,6 @@ import ( ) type ApplicationCache interface { - LatestVersion(ctx context.Context, platform string) (*model.Application, error) + LatestVersion(ctx context.Context, platform string, hot bool) (*model.Application, error) DeleteCache(ctx context.Context, platforms []string) error } diff --git a/pkg/common/storage/cache/cachekey/application.go b/pkg/common/storage/cache/cachekey/application.go index 032adba3c1..d7835b289c 100644 --- a/pkg/common/storage/cache/cachekey/application.go +++ b/pkg/common/storage/cache/cachekey/application.go @@ -4,6 +4,12 @@ const ( ApplicationLatestVersion = "APPLICATION_LATEST_VERSION:" ) -func GetApplicationLatestVersionKey(platform string) string { - return ApplicationLatestVersion + platform +func GetApplicationLatestVersionKey(platform string, hot bool) string { + var hotStr string + if hot { + hotStr = "1:" + } else { + hotStr = "0:" + } + return ApplicationLatestVersion + hotStr + platform } diff --git a/pkg/common/storage/cache/redis/application.go b/pkg/common/storage/cache/redis/application.go index 4a7a4ced67..a858fa25bd 100644 --- a/pkg/common/storage/cache/redis/application.go +++ b/pkg/common/storage/cache/redis/application.go @@ -6,7 +6,6 @@ import ( "github.com/openimsdk/open-im-server/v3/pkg/common/storage/cache/cachekey" "github.com/openimsdk/open-im-server/v3/pkg/common/storage/database" "github.com/openimsdk/open-im-server/v3/pkg/common/storage/model" - "github.com/openimsdk/tools/utils/datautil" "github.com/redis/go-redis/v9" "time" ) @@ -27,9 +26,9 @@ type ApplicationRedisCache struct { expireTime time.Duration } -func (a *ApplicationRedisCache) LatestVersion(ctx context.Context, platform string) (*model.Application, error) { - return getCache(ctx, a.rcClient, cachekey.GetApplicationLatestVersionKey(platform), a.expireTime, func(ctx context.Context) (*model.Application, error) { - return a.db.LatestVersion(ctx, platform) +func (a *ApplicationRedisCache) LatestVersion(ctx context.Context, platform string, hot bool) (*model.Application, error) { + return getCache(ctx, a.rcClient, cachekey.GetApplicationLatestVersionKey(platform, hot), a.expireTime, func(ctx context.Context) (*model.Application, error) { + return a.db.LatestVersion(ctx, platform, hot) }) } @@ -37,7 +36,9 @@ func (a *ApplicationRedisCache) DeleteCache(ctx context.Context, platforms []str if len(platforms) == 0 { return nil } - return a.deleter.ExecDelWithKeys(ctx, datautil.Slice(platforms, func(platform string) string { - return cachekey.GetApplicationLatestVersionKey(platform) - })) + keys := make([]string, 0, len(platforms)*2) + for _, platform := range platforms { + keys = append(keys, cachekey.GetApplicationLatestVersionKey(platform, true), cachekey.GetApplicationLatestVersionKey(platform, false)) + } + return a.deleter.ExecDelWithKeys(ctx, keys) } diff --git a/pkg/common/storage/controller/application.go b/pkg/common/storage/controller/application.go index 72bca07efa..3888057721 100644 --- a/pkg/common/storage/controller/application.go +++ b/pkg/common/storage/controller/application.go @@ -10,7 +10,7 @@ import ( ) type ApplicationDatabase interface { - LatestVersion(ctx context.Context, platform string) (*model.Application, error) + LatestVersion(ctx context.Context, platform string, hot bool) (*model.Application, error) AddVersion(ctx context.Context, val *model.Application) error UpdateVersion(ctx context.Context, id primitive.ObjectID, update map[string]any) error DeleteVersion(ctx context.Context, id []primitive.ObjectID) error @@ -26,8 +26,8 @@ type applicationDatabase struct { cache cache.ApplicationCache } -func (a *applicationDatabase) LatestVersion(ctx context.Context, platform string) (*model.Application, error) { - return a.cache.LatestVersion(ctx, platform) +func (a *applicationDatabase) LatestVersion(ctx context.Context, platform string, hot bool) (*model.Application, error) { + return a.cache.LatestVersion(ctx, platform, hot) } func (a *applicationDatabase) AddVersion(ctx context.Context, val *model.Application) error { diff --git a/pkg/common/storage/database/application.go b/pkg/common/storage/database/application.go index c98ae74c82..50796be626 100644 --- a/pkg/common/storage/database/application.go +++ b/pkg/common/storage/database/application.go @@ -8,7 +8,7 @@ import ( ) type Application interface { - LatestVersion(ctx context.Context, platform string) (*model.Application, error) + LatestVersion(ctx context.Context, platform string, hot bool) (*model.Application, error) AddVersion(ctx context.Context, val *model.Application) error UpdateVersion(ctx context.Context, id primitive.ObjectID, update map[string]any) error DeleteVersion(ctx context.Context, id []primitive.ObjectID) error diff --git a/pkg/common/storage/database/mgo/application.go b/pkg/common/storage/database/mgo/application.go index e59c0560ab..e28965247d 100644 --- a/pkg/common/storage/database/mgo/application.go +++ b/pkg/common/storage/database/mgo/application.go @@ -18,6 +18,7 @@ func NewApplicationMgo(db *mongo.Database) (*ApplicationMgo, error) { Keys: bson.D{ {Key: "platform", Value: 1}, {Key: "version", Value: 1}, + {Key: "hot", Value: 1}, }, Options: options.Index().SetUnique(true), }, @@ -41,8 +42,8 @@ func (a *ApplicationMgo) sort() any { return bson.D{{"latest", -1}, {"_id", -1}} } -func (a *ApplicationMgo) LatestVersion(ctx context.Context, platform string) (*model.Application, error) { - return mongoutil.FindOne[*model.Application](ctx, a.coll, bson.M{"platform": platform}, options.FindOne().SetSort(a.sort())) +func (a *ApplicationMgo) LatestVersion(ctx context.Context, platform string, hot bool) (*model.Application, error) { + return mongoutil.FindOne[*model.Application](ctx, a.coll, bson.M{"platform": platform, "hot": hot}, options.FindOne().SetSort(a.sort())) } func (a *ApplicationMgo) AddVersion(ctx context.Context, val *model.Application) error { diff --git a/pkg/common/storage/model/application.go b/pkg/common/storage/model/application.go index f5bae2be65..b09b0e8948 100644 --- a/pkg/common/storage/model/application.go +++ b/pkg/common/storage/model/application.go @@ -8,6 +8,7 @@ import ( type Application struct { ID primitive.ObjectID `bson:"_id"` Platform string `bson:"platform"` + Hot bool `bson:"hot"` Version string `bson:"version"` Url string `bson:"url"` Text string `bson:"text"`