thread-master/apps/backend/internal/module/radar/repository/watch_mongo.go

88 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package repository
import (
"context"
"apps/backend/internal/module/radar/domain"
"github.com/zeromicro/go-zero/core/stores/mon"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo/options"
)
func (s *MonStore) SaveWatch(ctx context.Context, w *domain.RadarWatch) error {
_, err := s.watches.ReplaceOne(ctx, bson.M{"_id": w.ID}, w, options.Replace().SetUpsert(true))
return err
}
func (s *MonStore) GetWatch(ctx context.Context, id string) (*domain.RadarWatch, error) {
var w domain.RadarWatch
err := s.watches.FindOne(ctx, &w, bson.M{"_id": id})
if err == mon.ErrNotFound {
return nil, domain.ErrNotFound
}
if err != nil {
return nil, err
}
return &w, nil
}
func (s *MonStore) ListWatches(ctx context.Context, ownerUID int64, f domain.WatchListFilter) ([]*domain.RadarWatch, int64, error) {
q := bson.M{"owner_uid": ownerUID}
if f.Status != "" {
q["status"] = f.Status
}
total, err := s.watches.CountDocuments(ctx, q)
if err != nil {
return nil, 0, err
}
page, ps := f.Page, f.PageSize
if page < 1 {
page = 1
}
if ps < 1 {
ps = 20
}
var list []*domain.RadarWatch
err = s.watches.Find(ctx, &list, q, options.Find().
SetSort(bson.D{{Key: "created_at", Value: -1}}).
SetSkip(int64((page-1)*ps)).
SetLimit(int64(ps)))
return list, total, err
}
func (s *MonStore) ListActiveWatches(ctx context.Context, ownerUID int64) ([]*domain.RadarWatch, error) {
var list []*domain.RadarWatch
err := s.watches.Find(ctx, &list,
bson.M{"owner_uid": ownerUID, "status": domain.WatchActive},
options.Find().SetSort(bson.D{{Key: "created_at", Value: 1}}))
return list, err
}
func (s *MonStore) ListAllActiveWatches(ctx context.Context) ([]*domain.RadarWatch, error) {
var list []*domain.RadarWatch
err := s.watches.Find(ctx, &list,
bson.M{"status": domain.WatchActive},
options.Find().SetSort(bson.D{
{Key: "owner_uid", Value: 1},
{Key: "created_at", Value: 1},
}))
return list, err
}
func (s *MonStore) CountActiveWatches(ctx context.Context, ownerUID int64) (int64, error) {
return s.watches.CountDocuments(ctx, bson.M{"owner_uid": ownerUID, "status": domain.WatchActive})
}
// TouchWatchSweptAt 只動 last_swept_at避免與使用者同時編輯關鍵字互相覆蓋。
func (s *MonStore) TouchWatchSweptAt(ctx context.Context, id string, at int64) error {
res, err := s.watches.UpdateOne(ctx, bson.M{"_id": id}, bson.M{"$set": bson.M{"last_swept_at": at}})
if err != nil {
return err
}
if res.MatchedCount == 0 {
return domain.ErrNotFound
}
return nil
}