using MongoDB.Driver;
using System.Linq.Expressions;
namespace Core.Blueprint.Mongo
{
///
/// Interface for performing CRUD operations and queries on MongoDB collections.
/// The represents the type of documents in the collection,
/// which must implement the interface.
///
/// The type of document in the MongoDB collection, must implement .
public interface ICollectionsRepository where TDocument : IDocument
{
///
/// Retrieves all documents from the collection as an enumerable queryable result.
///
/// A containing an representing the collection's documents.
ValueTask> AsQueryable();
///
/// Filters the documents in the collection by the provided filter expression.
///
/// An expression used to filter the documents based on the provided condition.
/// A representing the asynchronous operation, with a result of an of filtered documents.
Task> FilterBy(
Expression> filterExpression);
///
/// Filters the documents in the collection by the provided filter expression and projects them to a different type.
///
/// The type to project the documents into.
/// An expression used to filter the documents.
/// An expression used to project the filtered documents into the type.
/// An representing the projected documents.
IEnumerable FilterBy(
Expression> filterExpression,
Expression> projectionExpression);
///
/// Filters documents in the collection based on the provided MongoDB filter definition.
///
/// A filter definition for MongoDB query.
/// A task that represents the asynchronous operation. The task result contains a list of documents that match the filter.
Task> FilterByMongoFilterAsync(FilterDefinition filterDefinition);
///
/// Finds a single document by the provided filter expression.
///
/// An expression used to filter the documents.
/// The first matching or null if no match is found.
TDocument FindOne(Expression> filterExpression);
///
/// Asynchronously finds a single document by the provided filter expression.
///
/// An expression used to filter the documents.
/// A representing the asynchronous operation, with the matching or null.
Task FindOneAsync(Expression> filterExpression);
///
/// Finds a document by its identifier.
///
/// The identifier of the document.
/// The document with the provided identifier or null if not found.
TDocument FindById(string id);
///
/// Asynchronously finds a document by its identifier.
///
/// The identifier of the document.
/// A representing the asynchronous operation, with the matching or null.
Task FindByIdAsync(string id);
///
/// Inserts a single document into the collection.
///
/// The document to insert.
void InsertOne(TDocument document);
///
/// Asynchronously inserts a single document into the collection.
///
/// The document to insert.
/// A representing the asynchronous operation.
Task InsertOneAsync(TDocument document);
///
/// Inserts multiple documents into the collection.
///
/// The collection of documents to insert.
void InsertMany(ICollection documents);
///
/// Asynchronously inserts multiple documents into the collection.
///
/// The collection of documents to insert.
/// A representing the asynchronous operation.
Task InsertManyAsync(ICollection documents);
///
/// Replaces an existing document with a new one.
///
/// The document to replace the existing one.
void ReplaceOne(TDocument document);
///
/// Asynchronously replaces an existing document with a new one.
///
/// The document to replace the existing one.
/// A representing the asynchronous operation.
Task ReplaceOneAsync(TDocument document);
///
/// Deletes a single document by the provided filter expression.
///
/// An expression used to filter the documents to delete.
void DeleteOne(Expression> filterExpression);
///
/// Asynchronously deletes a single document by the provided filter expression.
///
/// An expression used to filter the documents to delete.
/// A representing the asynchronous operation.
Task DeleteOneAsync(Expression> filterExpression);
///
/// Deletes a single document by its identifier.
///
/// The identifier of the document to delete.
void DeleteById(string id);
///
/// Asynchronously deletes a single document by its identifier.
///
/// The identifier of the document to delete.
/// A representing the asynchronous operation.
Task DeleteByIdAsync(string id);
///
/// Deletes multiple documents that match the provided filter expression.
///
/// An expression used to filter the documents to delete.
void DeleteMany(Expression> filterExpression);
///
/// Asynchronously deletes multiple documents that match the provided filter expression.
///
/// An expression used to filter the documents to delete.
/// A representing the asynchronous operation.
Task DeleteManyAsync(Expression> filterExpression);
///
/// Executes an aggregation pipeline and returns the first document in the result asynchronously.
///
/// The type of the output document you expect from the pipeline.
/// The aggregation pipeline definition to execute.
/// The first document from the aggregation result, or null if none found.
Task FindOnePipelineAsync(PipelineDefinition pipeline);
}
}