using DigitalData.Core.Infrastructure; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Application.Interfaces.Repositories; using Microsoft.EntityFrameworkCore; using DigitalData.Core.Exceptions; using EnvelopeGenerator.Domain; using EnvelopeGenerator.Domain.Constants; namespace EnvelopeGenerator.Infrastructure.Repositories; [Obsolete("Use TempRepo")] public class EnvelopeReceiverRepository : CRUDRepository, IEnvelopeReceiverRepository { public EnvelopeReceiverRepository(EGDbContext dbContext) : base(dbContext, dbContext.EnvelopeReceivers) { } private IQueryable ReadWhere(string? uuid = null, string? signature = null, bool withEnvelope = false, bool withReceiver = false, bool readOnly = true) { var query = readOnly ? _dbSet.AsNoTracking() : _dbSet; if (uuid is not null) query = query.Where(er => er.Envelope != null && er.Envelope.Uuid == uuid); if (signature is not null) query = query.Where(er => er.Receiver != null && er.Receiver.Signature == signature); if (withEnvelope) query = query .Include(er => er.Envelope).ThenInclude(e => e!.Documents!).ThenInclude(d => d.Elements!.Where(e => signature == null || e.Receiver!.Signature == signature)) .Include(er => er.Envelope).ThenInclude(e => e!.Histories) .Include(er => er.Envelope).ThenInclude(e => e!.User); if (withReceiver) query = query.Include(er => er.Receiver); return query; } public async Task> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false, bool readOnly = true) => await ReadWhere(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly).ToListAsync(); public async Task> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true, bool readOnly = true) => await ReadWhere(signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly).ToListAsync(); public async Task ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true) { var query = ReadWhere(uuid: uuid, signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver, readOnly: readOnly); return await query.FirstOrDefaultAsync(); } public async Task ReadAccessCodeAsync(string uuid, string signature, bool readOnly = true) => await ReadWhere(uuid: uuid, signature: signature, readOnly: readOnly) .Select(er => er.AccessCode) .FirstOrDefaultAsync(); public async Task CountAsync(string uuid, string signature) => await ReadWhere(uuid: uuid, signature: signature).CountAsync(); private IQueryable ReadById(int envelopeId, int receiverId, bool withEnvelope = true, bool withReceiver = true, bool readOnly = true) { var query = readOnly ? _dbSet.AsNoTracking() : _dbSet; if (withEnvelope) query = query .Include(er => er.Envelope).ThenInclude(e => e!.Documents!).ThenInclude(d => d.Elements!.Where(e => e.Receiver!.Id == receiverId)) .Include(er => er.Envelope).ThenInclude(e => e!.Histories) .Include(er => er.Envelope).ThenInclude(e => e!.User); if (withReceiver) query = query.Include(er => er.Receiver); return query.Where(er => er.EnvelopeId == envelopeId && er.ReceiverId == receiverId); } public async Task ReadByIdAsync(int envelopeId, int receiverId, bool readOnly = true) => await ReadById(envelopeId: envelopeId, receiverId: receiverId, readOnly: readOnly) .FirstOrDefaultAsync(); public async Task ReadAccessCodeByIdAsync(int envelopeId, int receiverId, bool readOnly = true) => await ReadById(envelopeId: envelopeId, receiverId: receiverId, readOnly: readOnly) .Select(er => er.AccessCode) .FirstOrDefaultAsync(); public async Task> ReadByUsernameAsync(string username, EnvelopeStatus? min_status = null, EnvelopeStatus? max_status = null, params EnvelopeStatus[] ignore_statuses) { var query = _dbSet.AsNoTracking().Where(er => er.Envelope!.User!.Username == username); if (min_status is not null) query = query.Where(er => er.Envelope!.Status >= min_status); if (max_status is not null) query = query.Where(er => er.Envelope!.Status <= max_status); foreach (var ignore_status in ignore_statuses) query = query.Where(er => er.Envelope!.Status != ignore_status); return await query.Include(er => er.Envelope).Include(er => er.Receiver).ToListAsync(); } public async Task ReadLastByReceiverAsync(string? email = null, int? id = null, string? signature = null) { var parameters = new[] { email, id?.ToString(), signature }.Count(p => p != null); if (parameters == 0) throw new BadRequestException("You must provide either 'email', 'id', or 'signature' for the query."); if (parameters > 1) throw new BadRequestException("Please provide only one parameter: either 'email', 'id', or 'signature'."); var query = _dbSet.AsNoTracking(); if(email is not null) query = query.Where(er => er.Receiver!.EmailAddress == email); if (id is not null) query = query.Where(er => er.Receiver!.Id == id); if (signature is not null) query = query.Where(er => er.Receiver!.Signature == signature); return await query.OrderBy(er => er.EnvelopeId).LastOrDefaultAsync(); } }