package repository import ( "amocrm/internal/models" "context" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo/options" "time" ) // test + func (r *Repository) WebhookCreate(ctx context.Context, tokens models.Token) error { filter := bson.M{"AccountID": tokens.AccountID} update := bson.M{ "$set": tokens, } opts := options.Update().SetUpsert(true) _, err := r.tokens.UpdateOne(ctx, filter, update, opts) if err != nil { return err } return nil } // test + func (r *Repository) WebhookUpdate(ctx context.Context, tokens models.Token) error { filter := bson.M{"AccountID": tokens.AccountID} // токены обновляются каждый раз при обновлении access токена update := bson.M{ "$set": bson.M{ "AccessToken": tokens.AccessToken, "RefreshToken": tokens.RefreshToken, "Expiration": tokens.Expiration, "CreatedAt": tokens.CreatedAt, }, } _, err := r.tokens.UpdateOne(ctx, filter, update) if err != nil { return err } return nil } // test + // воркер запускается каждые 5 минут, поэтомму ищем токены котторые исекают менее чем через 10 минут отдаем их на обноление func (r *Repository) CheckExpired(ctx context.Context) ([]models.Token, error) { tenMinutesAgo := time.Now().Add(-10 * time.Second).Unix() filter := bson.M{ "Expiration": bson.M{ "$lte": tenMinutesAgo, }, } cursor, err := r.tokens.Find(ctx, filter) if err != nil { return nil, err } defer cursor.Close(ctx) var tokens []models.Token if err := cursor.All(ctx, &tokens); err != nil { return nil, err } return tokens, nil } // test + func (r *Repository) GetAllTokens(ctx context.Context) ([]models.Token, error) { cursor, err := r.tokens.Find(ctx, bson.M{}) if err != nil { return nil, err } defer cursor.Close(ctx) var tokens []models.Token if err := cursor.All(ctx, &tokens); err != nil { return nil, err } return tokens, nil } func (r *Repository) WebhookDelete(ctx context.Context) error { //TODO:IMPLEMENT ME return nil }