using LSFE.MobApp.Contracts; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using SQLite; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace LSFE.MobApp.Services { public class Repository : IRepository where T : class, new() { private readonly SQLiteAsyncConnection _database; private readonly ILogger> _logger; public Repository(SQLiteAsyncConnection database, ILogger> logger) { _database = database; _logger = logger; } public async Task> GetAllAsync() { try { return await _database.Table().ToListAsync(); } catch (Exception ex) { _logger.LogError(ex, "Error getting all {EntityType}", typeof(T).Name); throw; } } public async Task GetByIdAsync(int id) { try { return await _database.Table().Where(x => GetIdProperty(x).Equals(id)).FirstOrDefaultAsync(); } catch (Exception ex) { _logger.LogError(ex, "Error getting {EntityType} by id {Id}", typeof(T).Name, id); throw; } } public async Task> GetActiveAsync() { try { var isActiveProp = typeof(T).GetProperty("IsActive"); if (isActiveProp != null && isActiveProp.PropertyType == typeof(bool)) { // Build expression: x => x.IsActive var parameter = Expression.Parameter(typeof(T), "x"); var property = Expression.Property(parameter, isActiveProp); var lambda = Expression.Lambda>(property, parameter); return await _database.Table().Where(lambda).ToListAsync(); } return await GetAllAsync(); } catch (Exception ex) { _logger.LogError(ex, "Error getting active {EntityType}", typeof(T).Name); throw; } } public async Task SaveAsync(T item) { try { return await _database.InsertAsync(item); } catch (Exception ex) { _logger.LogError(ex, "Error saving {EntityType}", typeof(T).Name); throw; } } public async Task UpdateAsync(T item) { try { return await _database.UpdateAsync(item); } catch (Exception ex) { _logger.LogError(ex, "Error updating {EntityType}", typeof(T).Name); throw; } } public async Task DeleteAsync(T item) { try { return await _database.DeleteAsync(item); } catch (Exception ex) { _logger.LogError(ex, "Error deleting {EntityType}", typeof(T).Name); throw; } } public async Task TruncateAsync() { try { return await _database.DeleteAllAsync(); } catch (Exception ex) { _logger.LogError(ex, "Error truncating table {EntityType}", typeof(T).Name); throw; } } public async Task DeleteAsync(int id) { try { var item = await GetByIdAsync(id); if (item != null) { return await DeleteAsync(item); } return 0; } catch (Exception ex) { _logger.LogError(ex, "Error deleting {EntityType} by id {Id}", typeof(T).Name, id); throw; } } public async Task> QueryAsync(string query, params object[] args) { try { return await _database.QueryAsync(query, args); } catch (Exception ex) { _logger.LogError(ex, "Error executing query for {EntityType}", typeof(T).Name); throw; } } public async Task FirstOrDefaultAsync(Expression> predicate) { try { return await _database.Table().Where(predicate).FirstOrDefaultAsync(); } catch (Exception ex) { _logger.LogError(ex, "Error getting first {EntityType}", typeof(T).Name); throw; } } public async Task> WhereAsync(Expression> predicate) { try { return await _database.Table().Where(predicate).ToListAsync(); } catch (Exception ex) { _logger.LogError(ex, "Error filtering {EntityType}", typeof(T).Name); throw; } } private object GetIdProperty(T item) { return typeof(T).GetProperty("Id")?.GetValue(item); } } }