88 lines
2.5 KiB
Go
88 lines
2.5 KiB
Go
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
|
||
}
|