using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Dpz.Core.Infrastructure;
using Dpz.Core.Infrastructure.Entity;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
namespace Dpz.Core.MongodbAccess;
public interface IRepository
{
IMongoDatabase Database { get; }
}
public interface IRepository<T> : IRepository where T : IBaseEntity
{
/// <summary>
/// 获取 该实体Mongodb的集合
/// </summary>
IMongoCollection<T> Collection { get; }
/// <summary>
/// Queryable
/// </summary>
IMongoQueryable<T> MongodbQueryable { get; }
/// <summary>
/// 查询数据
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
IMongoQueryable<T> SearchFor(Expression<Func<T, bool>> predicate);
/// <summary>
/// 数据查询
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
IFindFluent<T, T> SearchFor(FilterDefinition<T> filter);
/// <summary>
/// 异步 数据查询
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
IAsyncEnumerable<T> SearchForAsync(FilterDefinition<T> filter);
#region 异步方法
/// <summary>
/// (异步)根据 Id 获取单条记录,不存在将会返回null
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<T?> FindAsync(object id);
/// <summary>
/// 插入数据
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
Task InsertAsync(params T[] source);
/// <summary>
/// 插入数据
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
Task InsertAsync(IReadOnlyCollection<T> source);
/// <summary>
/// 删除数据
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
Task<DeleteResult> DeleteAsync(Expression<Func<T, bool>> filter);
/// <summary>
/// 删除数据
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
Task<DeleteResult> DeleteAsync(FilterDefinition<T> filter);
/// <summary>
/// 根据ID删除
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<DeleteResult> DeleteAsync(object id);
/// <summary>
/// 根据查询条件更新数据
/// </summary>
/// <param name="predicate"></param>
/// <param name="update"></param>
/// <returns></returns>
Task<UpdateResult> UpdateAsync(Expression<Func<T, bool>> predicate, UpdateDefinition<T> update);
/// <summary>
/// 根据实体修改数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <exception cref="ArgumentException">If the entity no exists property 'id',then will throw exception.</exception>
Task<ReplaceOneResult> UpdateAsync(T entity);
/// <summary>
/// 批量修改实体
/// </summary>
/// <param name="entities"></param>
/// <returns></returns>
Task<BulkWriteResult<T>> UpdateAsync(IEnumerable<T> entities);
#endregion
}