using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
namespace gehGassi.Core.Interfaces
{
///
/// Schnittstellenbeschreibung für einen Service für die Verwaltung von Entitäten
///
/// Typ des Service
public interface IService where T : class
{
#region Get
///
/// Gibt eine Entität anhand der eindeutigen Id zurück
///
/// Id der Entität
/// Entität oder null, wenn nicht gefunden
T Get(object id);
///
/// Gibt eine Entität anhand der eindeutigen Id zurück
///
/// Id der Entität
/// Entität oder null, wenn nicht gefunden
Task GetAsync(object id);
///
/// Gibt alle Entitäten zurück
///
/// Liste aller Entitäten
IEnumerable GetAll();
///
/// Gibt alle Entitäten zurück
///
/// Liste aller Entitäten
Task> GetAllAsync();
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
///
/// Kriterien
/// Liste gefundener Entitäten
IEnumerable Find(Expression> predicate);
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
///
/// Kriterien
/// Liste gefundener Entitäten
Task> FindAsync(Expression> predicate);
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
///
/// Kriterien
/// Liste gefundener Entitäten
IQueryable Query(Expression> predicate);
///
/// Gibt eine Entität oder den Default wert zurück
///
/// Kriterien
/// Gefundene entität oder Default-Wert
T SingleOrDefault(Expression> predicate);
///
/// Gibt eine Entität oder den Default wert zurück.
/// Exception wenn mehr als 1 gefunden
///
/// Kriterien
/// Gefundene entität oder Default-Wert
Task SingleOrDefaultAsync(Expression> predicate);
///
/// Gibt eine Entität oder den Default wert zurück
///
/// Kriterien
/// Gefundene entität oder Default-Wert
Task FirstOrDefaultAsync(Expression> predicate);
#endregion
#region CRUD
///
/// Fügt eine Entität zum Repository hinzu
///
/// Entität
void Add(T entity);
///
/// Fügt eine Liste von Entitäten zum Repository hinzu
///
/// List von Entitäten
void AddRange(IEnumerable entities);
///
/// Entfernt eine Entität aus dem Repository
///
/// Zu entfernende Entität
void Remove(T entity);
///
/// Entfernt eine Liste von Entitäten aus dem Repository
///
/// Liste von Entitäten
void RemoveRange(IEnumerable entities);
#endregion
#region Count
///
/// Gibt die Anzahl aller Entitäten zurück
///
/// Anzahl
int Count();
///
/// Gibt die Anzahl aller Entitäten zurück
///
/// Anzahl
Task CountAsync();
#endregion
#region Commit / UnitOfWork
///
/// Schließt Daten-Änderungen ab und speichert die selben
///
/// Benutzername
/// Gibt an, dass kein Audit-Eintrag erstellt werden soll, auch wenn Audit aktiviert ist
int Commit(string userName, bool noAudit = false);
///
/// Schließt Daten-Änderungen ab und speichert die selben
///
/// Benutzername
/// Gibt an, dass kein Audit-Eintrag erstellt werden soll, auch wenn Audit aktiviert ist
Task CommitAsync(string userName, bool noAudit = false);
#endregion
}
}