public async Task <ActionResponse <InstitutionDto> > Insert(InstitutionDto institution)
        {
            try
            {
                using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                {
                    List <FileDto> files = institution.Files != null
                        ? new List <FileDto>(institution.Files) : new List <FileDto>();

                    GoverningCouncilDto governingCouncil = institution.GoverningCouncil;

                    var institutionToAdd = mapper.Map <InstitutionDto, Institution>(institution);
                    unitOfWork.GetGenericRepository <Institution>().Add(institutionToAdd);
                    unitOfWork.Save();

                    institution.Id    = institutionToAdd.Id;
                    institution.Files = files;
                    if ((await ModifyFiles(institution))
                        .IsNotSuccess(out ActionResponse <InstitutionDto> fileResponse, out institution))
                    {
                        return(fileResponse);
                    }

                    institution.GoverningCouncil = governingCouncil;
                    institution.GoverningCouncil.InstitutionId = institution.Id;
                    if ((await ModifyGoverningCouncil(institution)).IsNotSuccess(out fileResponse, out institution))
                    {
                        return(fileResponse);
                    }

                    scope.Complete();
                }
                return(await GetInstitution());
            }
            catch (Exception)
            {
                return(await ActionResponse <InstitutionDto> .ReturnError("Greška prilikom unosa podataka za instituciju."));
            }
        }
        public async Task <ActionResponse <GoverningCouncilDto> > ModifyCouncilMembers(GoverningCouncilDto entityDto)
        {
            try
            {
                var entity = unitOfWork.GetGenericRepository <GoverningCouncil>()
                             .FindBy(e => e.Id == entityDto.Id.Value, includeProperties: "GoverningCouncilMembers");

                var currentCouncilMembers = entity.GoverningCouncilMembers.ToList();
                var newCouncilMembers     = entityDto.GoverningCouncilMembers;

                var membersToRemove = mapper.Map <List <GoverningCouncilMemberDto> >(currentCouncilMembers.Where(cem => !newCouncilMembers
                                                                                                                 .Select(ncm => ncm.Id).Contains(cem.Id)));

                var membersToAdd = newCouncilMembers
                                   .Where(ncm => !ncm.Id.HasValue ||
                                          !currentCouncilMembers.Select(ccm => ccm.Id).Contains(ncm.Id.Value))
                                   .Select(ncm =>
                {
                    ncm.GoverningCouncilId = entity.Id;
                    return(ncm);
                })
                                   .ToList();

                var membersToModify = newCouncilMembers
                                      .Where(ncm => ncm.Id.HasValue && currentCouncilMembers.Select(ccm => ccm.Id).Contains(ncm.Id.Value))
                                      .ToList();

                if ((await RemoveCouncilMembers(membersToRemove))
                    .IsNotSuccess(out ActionResponse <List <GoverningCouncilMemberDto> > actionResponse))
                {
                    return(await ActionResponse <GoverningCouncilDto> .ReturnError("Neuspješna promjena članova upravnog vijeća."));
                }

                if ((await AddCouncilMembers(membersToAdd))
                    .IsNotSuccess(out actionResponse))
                {
                    return(await ActionResponse <GoverningCouncilDto> .ReturnError("Neuspješna promjena članova upravnog vijeća."));
                }

                if ((await UpdateCouncilMembers(membersToModify))
                    .IsNotSuccess(out actionResponse))
                {
                    return(await ActionResponse <GoverningCouncilDto> .ReturnError(actionResponse.Message));
                }

                return(await ActionResponse <GoverningCouncilDto> .ReturnSuccess(entityDto, "Uspješno ažurirani članovi upravnog vijeća."));
            }
            catch (Exception)
            {
                return(await ActionResponse <GoverningCouncilDto> .ReturnError("Greška prilikom ažuriranja članova upravnog vijeća."));
            }
        }
        public async Task <ActionResponse <GoverningCouncilDto> > UpdateGoverningCouncil(GoverningCouncilDto entityDto)
        {
            try
            {
                List <GoverningCouncilMemberDto> councilMembers = new List <GoverningCouncilMemberDto>(entityDto.GoverningCouncilMembers);

                var entityToUpdate = mapper.Map <GoverningCouncilDto, GoverningCouncil>(entityDto);
                unitOfWork.GetGenericRepository <GoverningCouncil>().Update(entityToUpdate);
                unitOfWork.Save();

                mapper.Map(entityToUpdate, entityDto);

                entityDto.GoverningCouncilMembers = councilMembers;
                if ((await ModifyCouncilMembers(entityDto))
                    .IsNotSuccess(out ActionResponse <GoverningCouncilDto> response, out entityDto))
                {
                    return(response);
                }

                return(await ActionResponse <GoverningCouncilDto> .ReturnSuccess(entityDto, "Upravno vijeće za instituciju uspješno ažurirano."));
            }
            catch (Exception)
            {
                return(await ActionResponse <GoverningCouncilDto> .ReturnError("Greška prilikom unosa podataka za upravno vijeće."));
            }
        }