using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Company.Domain.CameraBugReportAgg;
using MongoDB.Bson;
using MongoDB.Driver;
namespace CompanyManagement.Infrastructure.Mongo.CameraBugReportRepo;
///
/// پیادهسازی انبار گزارش خرابی دوربین برای MongoDB
///
public class CameraBugReportRepository : ICameraBugReportRepository
{
private readonly IMongoCollection _cameraBugReports;
public CameraBugReportRepository(IMongoDatabase database)
{
_cameraBugReports = database.GetCollection("CameraBugReports");
}
public async Task CreateAsync(CameraBugReport bugReport)
{
await _cameraBugReports.InsertOneAsync(bugReport);
}
public async Task UpdateAsync(CameraBugReport bugReport)
{
await _cameraBugReports.ReplaceOneAsync(
x => x.Id == bugReport.Id,
bugReport);
}
public async Task GetByIdAsync(Guid id)
{
return await _cameraBugReports
.Find(x => x.Id == id)
.FirstOrDefaultAsync();
}
public async Task> GetAllAsync()
{
return await _cameraBugReports
.Find(_ => true)
.ToListAsync();
}
public async Task> GetAllAsync(int skip, int take)
{
return await _cameraBugReports
.Find(_ => true)
.Skip(skip)
.Limit(take)
.SortByDescending(x => x.CreationDate)
.ToListAsync();
}
public async Task DeleteAsync(Guid id)
{
await _cameraBugReports.DeleteOneAsync(x => x.Id == id);
}
public async Task IsExistAsync(Guid id)
{
var result = await _cameraBugReports
.Find(x => x.Id == id)
.FirstOrDefaultAsync();
return result != null;
}
public async Task> FilterAsync(
CameraBugReportType? type = null,
CameraBugPriority? priority = null,
CameraBugReportStatus? status = null,
string searchTerm = null,
int skip = 0,
int take = 10)
{
var filterDefinition = BuildFilterDefinition(type, priority, status, searchTerm);
return await _cameraBugReports
.Find(filterDefinition)
.Skip(skip)
.Limit(take)
.SortByDescending(x => x.CreationDate)
.ToListAsync();
}
public async Task CountAsync(
CameraBugReportType? type = null,
CameraBugPriority? priority = null,
CameraBugReportStatus? status = null,
string searchTerm = null)
{
var filterDefinition = BuildFilterDefinition(type, priority, status, searchTerm);
var count = await _cameraBugReports.CountDocumentsAsync(filterDefinition);
return (int)count;
}
private FilterDefinition BuildFilterDefinition(
CameraBugReportType? type = null,
CameraBugPriority? priority = null,
CameraBugReportStatus? status = null,
string searchTerm = null)
{
var filters = new List>();
if (type.HasValue)
filters.Add(Builders.Filter.Eq(x => x.Type, type.Value));
if (priority.HasValue)
filters.Add(Builders.Filter.Eq(x => x.Priority, priority.Value));
if (status.HasValue)
filters.Add(Builders.Filter.Eq(x => x.Status, status.Value));
if (!string.IsNullOrEmpty(searchTerm))
{
var searchFilter = Builders.Filter.Or(
Builders.Filter.Regex(x => x.Title, new BsonRegularExpression(searchTerm, "i")),
Builders.Filter.Regex(x => x.Description, new BsonRegularExpression(searchTerm, "i")),
Builders.Filter.Regex(x => x.UserEmail, new BsonRegularExpression(searchTerm, "i"))
);
filters.Add(searchFilter);
}
if (filters.Count == 0)
return Builders.Filter.Empty;
return Builders.Filter.And(filters);
}
// Sync methods from IRepository interface (not used in MongoDB flow but required for interface implementation)
public CameraBugReport Get(long id)
{
throw new NotImplementedException("استفاده از GetByIdAsync برای MongoDB");
}
public List Get()
{
throw new NotImplementedException("استفاده از GetAllAsync برای MongoDB");
}
public void Create(CameraBugReport entity)
{
throw new NotImplementedException("استفاده از CreateAsync برای MongoDB");
}
public bool ExistsIgnoreQueryFilter(System.Linq.Expressions.Expression> expression)
{
throw new NotImplementedException("استفاده از IsExistAsync برای MongoDB");
}
public bool Exists(System.Linq.Expressions.Expression> expression)
{
throw new NotImplementedException("استفاده از FilterAsync برای MongoDB");
}
public void SaveChanges()
{
throw new NotImplementedException("MongoDB نیازی به SaveChanges ندارد");
}
public async Task SaveChangesAsync()
{
// MongoDB خودکار ذخیره میکند، بنابراین این متد خالی است
await Task.CompletedTask;
}
public Task BeginTransactionAsync()
{
throw new NotImplementedException("MongoDB اعاملات را بصورت متفاوت مدیریت میکند");
}
}