/// <summary> /// Controleer of <paramref name="filter"/> geen zaken probeert op te vragen waarvoor /// je geen rechten hebt. /// </summary> /// <param name="filter">Een lidfilter</param> private void SecurityCheck(LidFilter filter) { // Check security // We verwachten minstens 1 van volgende zaken: // GroepID, GroepsWerkJaarID, AfdelingID, FunctieID // Als je recht hebt op groep, groepswerkjaar, afdeling of functie // dan krijg je resultaat. Securitygewijze is dat geen probleem, want // alle zoekvoorwaarden worden 'ge-and'. // Heb je geen rechten op groep, groepswerjaar, afdeling of functie, // dan krijg je een exception (te veel geknoei) Groep groep = null; if (filter.GroepID != null) { groep = _groepenRepo.ByID(filter.GroepID.Value); } else if (filter.GroepsWerkJaarID != null) { groep = _groepsWerkJarenRepo.ByID(filter.GroepsWerkJaarID.Value, "Groep").Groep; } else if (filter.AfdelingID != null) { groep = _afdelingenRepo.ByID(filter.AfdelingID.Value, "Groep").ChiroGroep; } else if (filter.FunctieID != null) { groep = _functiesRepo.ByID(filter.FunctieID.Value, "Groep").Groep; } if (!_autorisatieMgr.IsGav(groep)) { throw FaultExceptionHelper.GeenGav(); } }
public List <LidOverzicht> LijstZoekenLidOverzicht(LidFilter filter, bool metAdressen) { // Onderstaande throwt een exception als de filter zaken bevat waar je geen rechten op // hebt. SecurityCheck(filter); List <LidOverzicht> resultaat; var leden = Zoeken(filter, metAdressen); // mappen if (metAdressen) { resultaat = _mappingHelper.Map <IList <Lid>, List <LidOverzicht> >(leden.ToList()); } else { // TODO: Waarom wordt er hier twee keer gemapt? // Misschien om informatie expliciet niet mee te nemen? var list = _mappingHelper.Map <IList <Lid>, List <LidOverzichtZonderAdres> >(leden.ToList()); resultaat = _mappingHelper.Map <IList <LidOverzichtZonderAdres>, List <LidOverzicht> >(list); } return(resultaat); }
public List <PersoonLidInfo> LijstZoekenPersoonLidInfo(LidFilter filter) { // Onderstaande throwt een exception als de filter zaken bevat waar je geen rechten op // hebt. SecurityCheck(filter); var leden = Zoeken(filter, true); var resultaat = _mappingHelper.Map <IList <Lid>, List <PersoonLidInfo> >(leden.ToList()); return(resultaat); }
/// <summary> /// Zoekt alle leden die voldoen aan de gegeven <paramref name="filter"/>. Als /// <paramref name="metAdressen"/> <c>true</c> is, dan worden de adressen eager /// geload. /// </summary> /// <param name="filter">bepaalt de te zoeken leden</param> /// <param name="metAdressen">Als <c>true</c>, dan worden de adressen eager geload.</param> /// <returns>Enumerable voor de gevonden leden.</returns> private IEnumerable <Lid> Zoeken(LidFilter filter, bool metAdressen) { // Let op. Deze method is zorgvuldig geschreven opdat de lidinfo na 2 of 4 query's // (alnaargelang met of zonder adressen) allemaal geladen zou zijn. // Oorspronkelijk waren dat er een 10-tal per lid. (zie #1587) // Als je hier iets aanpast, controleer dan de gegenereerde query's. Of als je niet weet hoe daaraan // te beginnen, geef mij (johan) een seintje. var teLadenDependencies = new List <string> { "GelieerdePersoon.Communicatie.CommunicatieType", "Functie", "GelieerdePersoon.Persoon", "AfdelingsJaar.Afdeling" }; if (metAdressen) { teLadenDependencies.Add("GelieerdePersoon.PersoonsAdres.Adres"); } // Het lukt me niet om afdelingen eager te loaden, vermoedelijk omdat // die anders gekoppeld zijn aan kinderen en aan leiding. Dus ik doe // nu al het werk dubbel, 1 keer voor kinderen, 1 keer voor leiding. // Op het einde voeg ik de resultaten samen. var kinderen = (from ld in _kinderenRepo.Select(teLadenDependencies.ToArray()) where ld.UitschrijfDatum == null && (filter.GroepID == null || ld.GroepsWerkJaar.Groep.ID == filter.GroepID) && (filter.GroepsWerkJaarID == null || ld.GroepsWerkJaar.ID == filter.GroepsWerkJaarID) && (filter.FunctieID == null || ld.Functie.Any(e => e.ID == filter.FunctieID)) && (filter.ProbeerPeriodeNa == null || !ld.EindeInstapPeriode.HasValue || filter.ProbeerPeriodeNa < ld.EindeInstapPeriode.Value) && (filter.HeeftVoorkeurAdres == null || (ld.GelieerdePersoon.PersoonsAdres != null && filter.HeeftVoorkeurAdres == true) || (ld.GelieerdePersoon.PersoonsAdres == null && filter.HeeftVoorkeurAdres == false)) && (filter.HeeftTelefoonNummer == null || ld.GelieerdePersoon.Communicatie.Any( e => e.CommunicatieType.ID == (int)CommunicatieTypeEnum.TelefoonNummer) == filter.HeeftTelefoonNummer) && (filter.HeeftEmailAdres == null || ld.GelieerdePersoon.Communicatie.Any( e => e.CommunicatieType.ID == (int)CommunicatieTypeEnum.Email) == filter.HeeftEmailAdres) && (filter.HeeftVerdachtEmailAdres == null || ld.GelieerdePersoon.Communicatie.Any( e => e.CommunicatieType.ID == (int)CommunicatieTypeEnum.Email && e.IsVerdacht == filter.HeeftVerdachtEmailAdres)) && (filter.AfdelingID == null || filter.AfdelingID == ld.AfdelingsJaar.Afdeling.ID) select ld).ToList(); var leiding = (from ld in _leidingRepo.Select(teLadenDependencies.ToArray()) where ld.UitschrijfDatum == null && (filter.GroepID == null || ld.GroepsWerkJaar.Groep.ID == filter.GroepID) && (filter.GroepsWerkJaarID == null || ld.GroepsWerkJaar.ID == filter.GroepsWerkJaarID) && (filter.FunctieID == null || ld.Functie.Any(e => e.ID == filter.FunctieID)) && (filter.ProbeerPeriodeNa == null || !ld.EindeInstapPeriode.HasValue || filter.ProbeerPeriodeNa < ld.EindeInstapPeriode.Value) && (filter.HeeftVoorkeurAdres == null || (ld.GelieerdePersoon.PersoonsAdres != null && filter.HeeftVoorkeurAdres == true) || (ld.GelieerdePersoon.PersoonsAdres == null && filter.HeeftVoorkeurAdres == false)) && (filter.HeeftTelefoonNummer == null || ld.GelieerdePersoon.Communicatie.Any( e => e.CommunicatieType.ID == (int)CommunicatieTypeEnum.TelefoonNummer) == filter.HeeftTelefoonNummer) && (filter.HeeftEmailAdres == null || ld.GelieerdePersoon.Communicatie.Any( e => e.CommunicatieType.ID == (int)CommunicatieTypeEnum.Email) == filter.HeeftEmailAdres) && (filter.HeeftVerdachtEmailAdres == null || ld.GelieerdePersoon.Communicatie.Any( e => e.CommunicatieType.ID == (int)CommunicatieTypeEnum.Email && e.IsVerdacht == filter.HeeftVerdachtEmailAdres)) && (filter.AfdelingID == null || ld.AfdelingsJaar.Any(aj => aj.Afdeling.ID == filter.AfdelingID)) select ld).ToList(); IEnumerable <Lid> leden; // Als lidtype=LidType.Geen, dan gaan we ervan uit dat dit een vergissing is, en de gebruiker // LidType.Alles bedoelt. if (filter.LidType != LidType.Leiding) { // Er zijn maar 2 lidtypes: Kind of Leiding. // Als de gebruiker niet expliciet naar de leiding vraagt, dan mogen we de kinderen // opleveren. leden = kinderen; } else { leden = new List <Lid>(); } if (filter.LidType != LidType.Kind) { // Tenzij de user enkel de kinderen vraagt, leveren we de leiding op. leden = leden.Union(leiding); } if (metAdressen) { // Laad hier meteen alle adressen in 1 query. Entity Framework zal ze koppelen // aan de gelieerde personen die we al hebben. En zo vermijden we bij het mappen // een adresquery voor iedere gelieerde persoon. var gpIDs = (from l in leden select l.GelieerdePersoon.ID).ToList(); // Resharper melding afzetten hieronder. Het is wel degelijk de bedoeling dat de query's worden // geevalueerd // ReSharper disable UnusedVariable var buitenlandseAdressen = (from adr in _buitenlandseAdressenRepo.Select("PersoonsAdres.GelieerdePersoon", "Land") where adr.PersoonsAdres.Any(pa => pa.GelieerdePersoon.Any(gp => gpIDs.Contains(gp.ID))) select adr).ToList(); var belgischeAdressen = (from adr in _belgischeAdressenRepo.Select("PersoonsAdres.GelieerdePersoon", "StraatNaam", "Woonplaats") where adr.PersoonsAdres.Any(pa => pa.GelieerdePersoon.Any(gp => gpIDs.Contains(gp.ID))) select adr).ToList(); // ReSharper restore UnusedVariable } return(leden); }
public List <LidOverzicht> LijstZoekenLidOverzicht(LidFilter filter, bool metAdressen) { throw new NotImplementedException(); }
public List <PersoonLidInfo> LijstZoekenPersoonLidInfo(LidFilter filter) { throw new NotImplementedException(); }