public async Task <ActionResponse <EducationProgramDto> > Insert(EducationProgramDto entityDto)
        {
            try
            {
                using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                {
                    List <ClassTypeDto> classTypes = entityDto.ClassTypes != null ?
                                                     new List <ClassTypeDto>(entityDto.ClassTypes) : new List <ClassTypeDto>();
                    List <int> classTypeIds = entityDto.ClassTypeIds != null ?
                                              new List <int>(entityDto.ClassTypeIds) : new List <int>();
                    List <FileDto> files = entityDto.Files != null
                        ? new List <FileDto>(entityDto.Files) : new List <FileDto>();

                    var entityToAdd = mapper.Map <EducationProgramDto, EducationProgram>(entityDto);
                    unitOfWork.GetGenericRepository <EducationProgram>().Add(entityToAdd);
                    unitOfWork.Save();
                    mapper.Map(entityToAdd, entityDto);

                    entityDto.ClassTypeIds = classTypeIds;
                    if ((await ModifyClassTypes(entityDto))
                        .IsNotSuccess(out ActionResponse <EducationProgramDto> ctResponse, out entityDto))
                    {
                        return(ctResponse);
                    }

                    entityDto.Files = files;
                    if ((await ModifyFiles(entityDto))
                        .IsNotSuccess(out ActionResponse <EducationProgramDto> fileResponse, out entityDto))
                    {
                        return(fileResponse);
                    }

                    entityDto.Id = entityToAdd.Id;
                    scope.Complete();
                }

                if ((await GetById(entityDto.Id.Value))
                    .IsNotSuccess(out ActionResponse <EducationProgramDto> response, out entityDto))
                {
                    return(response);
                }

                return(await ActionResponse <EducationProgramDto> .ReturnSuccess(entityDto));
            }
            catch (Exception)
            {
                return(await ActionResponse <EducationProgramDto> .ReturnError("Greška prilikom upisa programa."));
            }
            finally
            {
                await cacheService.RefreshCache <List <EducationProgramDto> >();
            }
        }
        public async Task <ActionResponse <EducationProgramDto> > ModifyClassTypes(EducationProgramDto entityDto)
        {
            try
            {
                var entity = unitOfWork.GetGenericRepository <EducationProgram>()
                             .FindBy(e => e.Id == entityDto.Id, includeProperties: "EducationProgramClassTypes.ClassType");

                var currentClassTypes = entity.EducationProgramClassTypes.ToList();

                var newClassTypes = entityDto.ClassTypeIds;

                var classTypesToRemove = currentClassTypes
                                         .Where(cet => !newClassTypes.Contains(cet.Id))
                                         .Select(sf => new EducationProgramClassTypeDto
                {
                    Id                 = sf.Id,
                    ClassTypeId        = sf.ClassTypeId,
                    EducationProgramId = entityDto.Id
                }).ToList();

                var classTypesToAdd = newClassTypes
                                      .Where(nt => !currentClassTypes.Select(cct => cct.Id).Contains(nt))
                                      .Select(sf => new EducationProgramClassTypeDto
                {
                    ClassTypeId        = sf,
                    EducationProgramId = entityDto.Id
                }).ToList();

                if ((await RemoveClassTypes(classTypesToRemove))
                    .IsNotSuccess(out ActionResponse <List <EducationProgramClassTypeDto> > removeResponse))
                {
                    return(await ActionResponse <EducationProgramDto> .ReturnError("Neuspješno micanje tipova nastave s edukacijskog programa."));
                }

                if ((await AddClassTypes(classTypesToAdd)).IsNotSuccess(out ActionResponse <List <EducationProgramClassTypeDto> > addResponse, out classTypesToAdd))
                {
                    return(await ActionResponse <EducationProgramDto> .ReturnError("Neuspješno dodavanje tipova nastave edukacijskom programu."));
                }
                return(await ActionResponse <EducationProgramDto> .ReturnSuccess(entityDto, "Uspješno izmijenjeni tipovi nastave edukacijskog programa."));
            }
            catch (Exception)
            {
                return(await ActionResponse <EducationProgramDto> .ReturnError("Greška prilikom izmjene tipova nastave edukacijskog programa."));
            }
        }
        public async Task <ActionResponse <EducationProgramDto> > ModifyFiles(EducationProgramDto entityDto)
        {
            try
            {
                var entity = unitOfWork.GetGenericRepository <EducationProgram>()
                             .FindBy(e => e.Id == entityDto.Id, includeProperties: "Files.File");

                var currentFiles = mapper.Map <List <EducationProgramFile>, List <EducationProgramFileDto> >(entity.Files.ToList());

                var newFiles = entityDto.Files;

                var filesToRemove = currentFiles
                                    .Where(cet => !newFiles.Select(f => f.Id).Contains(cet.FileId)).ToList();

                var filesToAdd = newFiles
                                 .Where(nt => !currentFiles.Select(uec => uec.FileId).Contains(nt.Id))
                                 .Select(sf => new EducationProgramFileDto
                {
                    FileId             = sf.Id,
                    EducationProgramId = entityDto.Id
                })
                                 .ToList();

                if ((await RemoveFiles(filesToRemove))
                    .IsNotSuccess(out ActionResponse <List <EducationProgramFileDto> > removeResponse))
                {
                    return(await ActionResponse <EducationProgramDto> .ReturnError("Neuspješno micanje dokumenata iz programa."));
                }

                if ((await AddFiles(filesToAdd)).IsNotSuccess(out ActionResponse <List <EducationProgramFileDto> > addResponse, out filesToAdd))
                {
                    return(await ActionResponse <EducationProgramDto> .ReturnError("Neuspješno dodavanje dokumenata programu."));
                }
                return(await ActionResponse <EducationProgramDto> .ReturnSuccess(entityDto, "Uspješno izmijenjeni dokumenti programa."));
            }
            catch (Exception)
            {
                return(await ActionResponse <EducationProgramDto> .ReturnError("Greška prilikom izmjene dokumenata programa."));
            }
        }
Exemple #4
0
 public async Task <ActionResponse <EducationProgramDto> > Copy([FromBody] EducationProgramDto request)
 {
     return(await educationProgramService.Copy(request));
 }
        public async Task <ActionResponse <EducationProgramDto> > Copy(EducationProgramDto entityDto)
        {
            try
            {
                var response = await ActionResponse <EducationProgramDto> .ReturnSuccess(entityDto, "Program uspješno kopiran.");

                var entityDtoNewData = new EducationProgramDto
                {
                    Name    = entityDto.Name,
                    Version = entityDto.Version
                };

                if ((await GetById(entityDto.Id.Value))
                    .IsNotSuccess(out response, out EducationProgramDto oldEntityDto))
                {
                    return(response);
                }

                mapper.Map(oldEntityDto, entityDto);

                entityDto.Id      = null;
                entityDto.Name    = entityDtoNewData.Name;
                entityDto.Version = entityDtoNewData.Version;

                Dictionary <int, int> subjectDictionary = new Dictionary <int, int>();
                Dictionary <int, int> themeDictionary   = new Dictionary <int, int>();

                var subjectList = new List <SubjectDto>(entityDto.Subjects);
                var plan        = entityDto.Plan;

                entityDto.Subjects = null;
                entityDto.Plan     = null;

                using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                {
                    if ((await Insert(entityDto)).IsNotSuccess(out response, out entityDto))
                    {
                        return(response);
                    }

                    if (subjectList != null && subjectList.Count > 0)
                    {
                        subjectList.ForEach(async s =>
                        {
                            var oldSubjectId     = s.Id;
                            s.Id                 = null;
                            s.EducationProgramId = entityDto.Id;

                            var themesList = new List <ThemeDto>();
                            if (s.Themes != null && s.Themes.Count > 0)
                            {
                                themesList = new List <ThemeDto>(s.Themes);
                            }

                            if ((await subjectService.Insert(s))
                                .IsNotSuccess(out ActionResponse <SubjectDto> subjectResponse, out s))
                            {
                                response = await ActionResponse <EducationProgramDto> .ReturnError(subjectResponse.Message);
                                return;
                            }

                            subjectDictionary.Add(oldSubjectId.Value, s.Id.Value);

                            themesList.ForEach(async t =>
                            {
                                var oldThemeId = t.Id;
                                t.Id           = null;
                                t.SubjectId    = s.Id;

                                if ((await themeService.Insert(t))
                                    .IsNotSuccess(out ActionResponse <ThemeDto> themeResponse, out t))
                                {
                                    response = await ActionResponse <EducationProgramDto> .ReturnError(themeResponse.Message);
                                    return;
                                }

                                themeDictionary.Add(oldThemeId.Value, t.Id.Value);
                            });

                            if (response.IsNotSuccess())
                            {
                                return;
                            }
                        });

                        if (response.IsNotSuccess())
                        {
                            scope.Dispose();
                            return(response);
                        }
                    }

                    if (plan != null)
                    {
                        if ((await planService.GetById(plan.Id.Value))
                            .IsNotSuccess(out ActionResponse <PlanDto> planResponse, out plan))
                        {
                            response = await ActionResponse <EducationProgramDto> .ReturnError(planResponse.Message);

                            scope.Dispose();
                            return(response);
                        }

                        plan.Id = null;
                        plan.EducationProgramId = entityDto.Id;

                        if (plan.PlanDays != null && plan.PlanDays.Count > 0)
                        {
                            plan.PlanDays.ForEach(pd =>
                            {
                                pd.Id     = null;
                                pd.PlanId = null;

                                if (pd.PlanDaySubjects != null && pd.PlanDaySubjects.Count > 0)
                                {
                                    pd.PlanDaySubjects.ForEach(pds =>
                                    {
                                        pds.Id        = null;
                                        pds.PlanDayId = null;
                                        pds.SubjectId = subjectDictionary[pds.SubjectId.Value];

                                        if (pds.PlanDaySubjectThemes != null && pds.PlanDaySubjectThemes.Count > 0)
                                        {
                                            pds.PlanDaySubjectThemes.ForEach(pdst =>
                                            {
                                                pdst.Id = null;
                                                pdst.PlanDaySubjectId = null;
                                                pdst.ThemeId          = themeDictionary[pdst.ThemeId.Value];
                                            });
                                        }
                                    });
                                }
                            });
                        }

                        if ((await planService.Insert(plan)).IsNotSuccess(out planResponse, out plan))
                        {
                            response = await ActionResponse <EducationProgramDto> .ReturnError(planResponse.Message);

                            scope.Dispose();
                            return(response);
                        }
                    }

                    scope.Complete();
                }

                return(response);
            }
            catch
            {
                return(await ActionResponse <EducationProgramDto> .ReturnError("Greška prilikom kopiranja programa."));
            }
            finally
            {
                await cacheService.RefreshCache <List <EducationProgramDto> >();
            }
        }