<commit_before>﻿using System;
using System.Linq;
using System.ServiceModel;
using System.Web;
using Chiro.Cdf.Sso;
using Chiro.Gap.Domain;
using Chiro.Gap.Orm;
using Chiro.Gap.ServiceContracts;
using Chiro.Gap.ServiceContracts.FaultContracts;
using Chiro.Gap.WorkerInterfaces;
using GebruikersRecht = Chiro.Gap.ServiceContracts.DataContracts.GebruikersRecht;

namespace Chiro.Gap.Services
{
    /// <summary>
    /// Interface voor de service voor gebruikersrechtenbeheer.
    /// </summary>
    public class GebruikersService : IGebruikersService
    {
        private readonly IGelieerdePersonenManager _gelieerdePersonenManager;
        private readonly IGebruikersRechtenManager _gebruikersRechtenManager;
        private readonly IGroepenManager _groepenManager;

        /// <summary>
        /// Constructor, zorgt voor dependency injection
        /// </summary>
        /// <param name="gelieerdePersonenManager">businesslogica voor gelieerde personen</param>
        /// <param name="gebruikersRechtenManager">businesslogica voor gebruikersrechten</param>
        /// <param name="groepenManager">businesslogica voor groepen</param>
        public GebruikersService(
            IGelieerdePersonenManager gelieerdePersonenManager,
            IGebruikersRechtenManager gebruikersRechtenManager,
            IGroepenManager groepenManager)
        {
            _gelieerdePersonenManager = gelieerdePersonenManager;
            _gebruikersRechtenManager = gebruikersRechtenManager;
            _groepenManager = groepenManager;
        }

        /// <summary>
        /// Als de persoon met gegeven <paramref name="gelieerdePersoonID"/> nog geen account heeft, wordt er een
        /// account voor gemaakt. Aan die account worden dan de meegegeven <paramref name="gebruikersRechten"/>
        /// gekoppeld.  Gebruikersrechten zijn standaard 14 maanden geldig.
        /// </summary>
        /// <param name="gelieerdePersoonID">ID van gelieerde persoon die rechten moet krijgen</param>
        /// <param name="gebruikersRechten">Rechten die de account moet krijgen. Mag leeg zijn. Bestaande 
        /// gebruikersrechten worden zo mogelijk verlengd als ze in <paramref name="gebruikersRechten"/> 
        /// voorkomen, eventuele bestaande rechten niet in <paramref name="gebruikersRechten"/> blijven
        /// onaangeroerd.
        /// </param>
        public void RechtenToekennen(int gelieerdePersoonID, GebruikersRecht[] gebruikersRechten)
        {
            var groepIDs = gebruikersRechten == null ? null : gebruikersRechten.Select(gr => gr.GroepID).ToArray();

            // Haal gelieerde persoon op met eventuele bestaande gebruikersrechten en communicatie

            var gelieerdePersoon = _gelieerdePersonenManager.Ophalen(gelieerdePersoonID, PersoonsExtras.GebruikersRechten | PersoonsExtras.Groep | PersoonsExtras.Communicatie);
            var account = _gebruikersRechtenManager.AccountZoekenOfMaken(gelieerdePersoon);

            // Als we geen rechten moeten toekennen, zijn we klaar.

            if (groepIDs == null) return;

            // Momenteel ondersteunen we enkel nog GAV-rollen

            var nietOndersteund = (from gr in gebruikersRechten
                                   where gr.Rol != Rol.Gav
                                   select gr).FirstOrDefault();
            if (nietOndersteund != null)
            {
                throw new NotSupportedException(String.Format(Properties.Resources.RolNietOndersteund, nietOndersteund.Rol));
            }

            // Tamelijk nifty hier: We gaan op zoek naar de groepen waarvoor er nog geen rechten aan account gekoppeld is,
            // we koppelen die groepen daan aan de account, en bewaren die koppelingen in 'toegekendeRechten'.

            var toegekendeRechten = (from id in groepIDs
                                     let bestaandRecht = (from gr in account.GebruikersRecht
                                                          where gr.Groep.ID == id<commit_msg>Closes #1577 - vervallen gebruikersrecht terug toekennen<commit_after>﻿using System;
using System.Linq;
using System.ServiceModel;
using System.Web;
using Chiro.Cdf.Sso;
using Chiro.Gap.Domain;
using Chiro.Gap.Orm;
using Chiro.Gap.ServiceContracts;
using Chiro.Gap.ServiceContracts.FaultContracts;
using Chiro.Gap.WorkerInterfaces;
using GebruikersRecht = Chiro.Gap.ServiceContracts.DataContracts.GebruikersRecht;

namespace Chiro.Gap.Services
{
    /// <summary>
    /// Interface voor de service voor gebruikersrechtenbeheer.
    /// </summary>
    public class GebruikersService : IGebruikersService
    {
        private readonly IGelieerdePersonenManager _gelieerdePersonenManager;
        private readonly IGebruikersRechtenManager _gebruikersRechtenManager;
        private readonly IGroepenManager _groepenManager;

        /// <summary>
        /// Constructor, zorgt voor dependency injection
        /// </summary>
        /// <param name="gelieerdePersonenManager">businesslogica voor gelieerde personen</param>
        /// <param name="gebruikersRechtenManager">businesslogica voor gebruikersrechten</param>
        /// <param name="groepenManager">businesslogica voor groepen</param>
        public GebruikersService(
            IGelieerdePersonenManager gelieerdePersonenManager,
            IGebruikersRechtenManager gebruikersRechtenManager,
            IGroepenManager groepenManager)
        {
            _gelieerdePersonenManager = gelieerdePersonenManager;
            _gebruikersRechtenManager = gebruikersRechtenManager;
            _groepenManager = groepenManager;
        }

        /// <summary>
        /// Als de persoon met gegeven <paramref name="gelieerdePersoonID"/> nog geen account heeft, wordt er een
        /// account voor gemaakt. Aan die account worden dan de meegegeven <paramref name="gebruikersRechten"/>
        /// gekoppeld.  Gebruikersrechten zijn standaard 14 maanden geldig.
        /// </summary>
        /// <param name="gelieerdePersoonID">ID van gelieerde persoon die rechten moet krijgen</param>
        /// <param name="gebruikersRechten">Rechten die de account moet krijgen. Mag leeg zijn. Bestaande 
        /// gebruikersrechten worden zo mogelijk verlengd als ze in <paramref name="gebruikersRechten"/> 
        /// voorkomen, eventuele bestaande rechten niet in <paramref name="gebruikersRechten"/> blijven
        /// onaangeroerd.
        /// </param>
        public void RechtenToekennen(int gelieerdePersoonID, GebruikersRecht[] gebruikersRechten)
        {
            var groepIDs = gebruikersRechten == null ? null : gebruikersRechten.Select(gr => gr.GroepID).ToArray();

            // Haal gelieerde persoon op met eventuele bestaande gebruikersrechten en communicatie

            var gelieerdePersoon = _gelieerdePersonenManager.Ophalen(gelieerdePersoonID, PersoonsExtras.GebruikersRechten | PersoonsExtras.Groep | PersoonsExtras.Communicatie);
            var account = _gebruikersRechtenManager.AccountZoekenOfMaken(gelieerdePersoon);

            // Als we geen rechten moeten toekennen, zijn we klaar.

            if (groepIDs == null) return;

            // Momenteel ondersteunen we enkel nog GAV-rollen

            var nietOndersteund = (from gr in gebruikersRechten
                                   where gr.Rol != Rol.Gav
                                   select gr).FirstOrDefault();
            if (nietOndersteund != null)
            {
                throw new NotSupportedException(String.Format(Properties.Resources.RolNietOndersteund, nietOndersteund.Rol));
            }

            // Tamelijk nifty hier: We gaan op zoek naar de groepen waarvoor er nog geen rechten aan account gekoppeld is,
            // we koppelen die groepen daan aan de account, en bewaren die koppelingen in 'toegekendeRechten'.

            var toegekendeRechten = (from id in groepIDs
                                     let bestaandRecht = (from gr in account.GebruikersRecht
                                                          where gr.Groep.ID == id
                                                          && (gr.VervalDatum == null || gr.VervalDatum > DateTime.Now)
{'fraction_non_alphanumeric': 0.07584683357879234, 'fraction_numerical': 0.0009818360333824251, 'mean_word_length': 2.5322930212397052, 'pattern_counts': {'":': 0, '<': 43, '<?xml version=': 0, '>': 46, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 14, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4327850', 'n_tokens_mistral': 2379, 'n_tokens_neox': 2347, 'n_words': 560}