diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index acb5678d..deb8069b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -33,7 +33,7 @@ env: jobs: ci: name: API Lint, Build, Test, Deploy - runs-on: aws-runner + runs-on: seventv env: GOLANGCI_LINT_CACHE: /home/runner/.cache/golangci-lint concurrency: @@ -144,7 +144,7 @@ jobs: validate: name: API Deploy Validation needs: ci - runs-on: ubuntu-latest + runs-on: seventv permissions: pull-requests: write defaults: diff --git a/data/mutate/emote_set.active_emote.mutation.go b/data/mutate/emote_set.active_emote.mutation.go index 47cf98a2..8b68bf42 100644 --- a/data/mutate/emote_set.active_emote.mutation.go +++ b/data/mutate/emote_set.active_emote.mutation.go @@ -330,7 +330,7 @@ func (m *Mutate) EditEmotesInSet(ctx context.Context, esb *structures.EmoteSetBu TargetID: tgt.emote.ID, Wish: "personal_use", }) - if err := m.SendModRequestMessage(ctx, mb); err != nil { + if err := m.SendModRequestMessage(ctx, mb, 0); err != nil { z.Errorw("failed to send personal_use mod request message", "error", err) } } diff --git a/data/mutate/message.mod_request.go b/data/mutate/message.mod_request.go index 9142995a..58d34dc9 100644 --- a/data/mutate/message.mod_request.go +++ b/data/mutate/message.mod_request.go @@ -11,7 +11,7 @@ import ( "go.mongodb.org/mongo-driver/bson/primitive" ) -func (m *Mutate) SendModRequestMessage(ctx context.Context, mb *structures.MessageBuilder[structures.MessageDataModRequest]) error { +func (m *Mutate) SendModRequestMessage(ctx context.Context, mb *structures.MessageBuilder[structures.MessageDataModRequest], weight int32) error { if mb == nil { return errors.ErrInternalIncompleteMutation() } else if mb.IsTainted() { @@ -60,6 +60,7 @@ func (m *Mutate) SendModRequestMessage(ctx context.Context, mb *structures.Messa MessageID: msgID, Kind: structures.MessageKindModRequest, Timestamp: time.Now(), + Weight: weight, }) mb.MarkAsTainted() diff --git a/data/query/query.messages.go b/data/query/query.messages.go index bfc07eea..976792a9 100644 --- a/data/query/query.messages.go +++ b/data/query/query.messages.go @@ -2,10 +2,16 @@ package query import ( "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "strconv" "sync" + "time" "github.com/seventv/common/errors" "github.com/seventv/common/mongo" + "github.com/seventv/common/redis" "github.com/seventv/common/structures/v3" "github.com/seventv/common/structures/v3/aggregations" "go.mongodb.org/mongo-driver/bson" @@ -89,7 +95,7 @@ func (q *Query) Messages(ctx context.Context, filter bson.M, opt MessageQueryOpt qr := &QueryResult[structures.Message[bson.Raw]]{} if opt.Sort == nil { - opt.Sort = bson.M{"_id": -1} + opt.Sort = bson.D{{Key: "_id", Value: -1}} } if opt.UnreadOnly { @@ -119,9 +125,26 @@ func (q *Query) Messages(ctx context.Context, filter bson.M, opt MessageQueryOpt wg := sync.WaitGroup{} wg.Add(1) + h := sha256.New() + + fb, err := json.Marshal(filter) + if err == nil { + h.Write(fb) + } + + rKey := q.redis.ComposeKey("api", "messages", hex.EncodeToString(h.Sum(nil)), "count") + go func() { defer wg.Done() + count, err := q.redis.Get(ctx, rKey) + if err != redis.Nil { + n, _ := strconv.ParseInt(count, 10, 64) + + qr.setTotal(n) + return + } + cur, err := q.mongo.Collection(mongo.CollectionNameMessagesRead).Aggregate(ctx, aggregations.Combine( matcherPipeline, func() mongo.Pipeline { @@ -158,6 +181,8 @@ func (q *Query) Messages(ctx context.Context, filter bson.M, opt MessageQueryOpt } qr.setTotal(v.Count) + + q.redis.SetEX(ctx, rKey, v.Count, time.Minute*5) }() cur, err := q.mongo.Collection(mongo.CollectionNameMessagesRead).Aggregate(ctx, aggregations.Combine( @@ -180,6 +205,7 @@ func (q *Query) Messages(ctx context.Context, filter bson.M, opt MessageQueryOpt bson.M{ "timestamp": "$timestamp", "read": "$read", + "weight": "$weight", }, }, }, @@ -233,7 +259,7 @@ type ModRequestMessagesQueryOptions struct { Targets map[structures.ObjectKind]bool TargetIDs []primitive.ObjectID Filter bson.M - Sort bson.M + Sort bson.D Limit int SkipPermissionCheck bool } @@ -244,5 +270,5 @@ type MessageQueryOptions struct { UnreadOnly bool MessageFilter bson.M FilterRecipients []primitive.ObjectID - Sort bson.M + Sort bson.D } diff --git a/go.mod b/go.mod index cc229507..028547c5 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/nats-io/nats.go v1.28.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/prometheus/client_golang v1.14.0 - github.com/seventv/common v0.0.0-20231206031419-1ba3f2c093f6 + github.com/seventv/common v0.0.0-20231206143048-3810874764f0 github.com/seventv/compactdisc v0.0.0-20221006190906-ccfe99954e48 github.com/seventv/image-processor/go v0.0.0-20221128171540-d050701ac324 github.com/seventv/message-queue/go v0.0.0-20231201171845-1bb9d5db6881 diff --git a/go.sum b/go.sum index b52c9c97..1507ceec 100644 --- a/go.sum +++ b/go.sum @@ -356,6 +356,8 @@ github.com/seventv/common v0.0.0-20231202052307-1d4dd4479600 h1:qwu6BlOxmKPBe9S8 github.com/seventv/common v0.0.0-20231202052307-1d4dd4479600/go.mod h1:jHHFe3uNMyzb/ReDqMvaI/A1euvV/PW/G+2PhcWQqWw= github.com/seventv/common v0.0.0-20231206031419-1ba3f2c093f6 h1:A1aHPZxG5XU+rqpuWFm5oeUaV/CwcjVfFmdzdw7Kpzw= github.com/seventv/common v0.0.0-20231206031419-1ba3f2c093f6/go.mod h1:jHHFe3uNMyzb/ReDqMvaI/A1euvV/PW/G+2PhcWQqWw= +github.com/seventv/common v0.0.0-20231206143048-3810874764f0 h1:mcNiALWjv9uHzRn8E5LWor0JRTs8iJGkVle/zaNLKaE= +github.com/seventv/common v0.0.0-20231206143048-3810874764f0/go.mod h1:jHHFe3uNMyzb/ReDqMvaI/A1euvV/PW/G+2PhcWQqWw= github.com/seventv/compactdisc v0.0.0-20221006190906-ccfe99954e48 h1:IqWrtt/yob45YnOQ5Wwkbf8qP22eKVtg0WzfyEkGnFg= github.com/seventv/compactdisc v0.0.0-20221006190906-ccfe99954e48/go.mod h1:T+ldp0YQe03s44+A5HHHI/jB3ZmWqOIaNouEqAS+1Dk= github.com/seventv/image-processor/go v0.0.0-20221128171540-d050701ac324 h1:iU3wWepRTbkNoTAPR23m6TAW6Yb9pOMCYVr0K++OBAw= diff --git a/internal/api/gql/v3/resolvers/query/query.mod_requests.go b/internal/api/gql/v3/resolvers/query/query.mod_requests.go index dc7e174d..bec9e198 100644 --- a/internal/api/gql/v3/resolvers/query/query.mod_requests.go +++ b/internal/api/gql/v3/resolvers/query/query.mod_requests.go @@ -48,7 +48,7 @@ func (r *Resolver) ModRequests(ctx context.Context, afterIDArg *primitive.Object Actor: &actor, Filter: match, Limit: limit, - Sort: bson.M{"_id": 1}, + Sort: bson.D{{Key: "weight", Value: -1}, {Key: "_id", Value: 1}}, // bson.M{"_id": 1, "weight": -1}, Targets: map[structures.ObjectKind]bool{ structures.ObjectKindEmote: true, }, diff --git a/internal/api/rest/v3/routes/emotes/emotes.process.go b/internal/api/rest/v3/routes/emotes/emotes.process.go index 8f6d052d..97334af5 100644 --- a/internal/api/rest/v3/routes/emotes/emotes.process.go +++ b/internal/api/rest/v3/routes/emotes/emotes.process.go @@ -276,7 +276,10 @@ func (epl *EmoteProcessingListener) HandleResultEvent(ctx context.Context, evt t ActorCountryName: actorCountryName, ActorCountryCode: actorCountryCode, }) - if err = epl.Ctx.Inst().Mutate.SendModRequestMessage(ctx, mb); err != nil { + + rsWeight := utils.Ternary(emoteOwner.HasPermission(structures.RolePermissionFeatureMessagingPriority), 100, 0) + + if err = epl.Ctx.Inst().Mutate.SendModRequestMessage(ctx, mb, int32(rsWeight)); err != nil { zap.S().Errorw("failed to send mod request message for new emote", "error", err, "EMOTE_ID", id,