You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
package mongodb
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"errors"
|
|
|
|
"gitea.russia9.dev/Russia9/chatwars-spy/pkg/domain"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
func NewUserRepo(database *mongo.Database) domain.UserRepo {
|
|
|
|
return &userRepo{Collection: database.Collection("users")}
|
|
|
|
}
|
|
|
|
|
|
|
|
type userRepo struct {
|
|
|
|
Collection *mongo.Collection
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *userRepo) Store(ctx context.Context, object *domain.User) error {
|
|
|
|
cursor := r.Collection.FindOne(ctx, bson.M{"_id": object.ID})
|
|
|
|
if errors.Is(cursor.Err(), mongo.ErrNoDocuments) {
|
|
|
|
object.FirstSeen = time.Now()
|
|
|
|
object.LastSeen = time.Now()
|
|
|
|
_, err := r.Collection.InsertOne(ctx, object)
|
|
|
|
return err
|
|
|
|
} else if cursor.Err() != nil {
|
|
|
|
return cursor.Err()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get old user
|
|
|
|
var old domain.User
|
|
|
|
err := cursor.Decode(&old)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get old guild if empty
|
|
|
|
if object.Guild == "" {
|
|
|
|
object.Guild = old.Guild
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set old values
|
|
|
|
object.FirstSeen = old.FirstSeen
|
|
|
|
object.Source = old.Source
|
|
|
|
|
|
|
|
// Set LastSeen date
|
|
|
|
object.LastSeen = time.Now()
|
|
|
|
|
|
|
|
// Update object in DB
|
|
|
|
_, err = r.Collection.ReplaceOne(ctx, bson.M{"_id": object.ID}, object)
|
|
|
|
return err
|
|
|
|
}
|