Beispiel #1
0
        ///<summary>
        ///Elimina una tarea
        ///</summary>
        ///<param name="id">identificador de la tarea</param>
        public void DeleteJob(string id)
        {
            BackgroundJob.Delete(id);
            var rel = _context.JobRepository.FirstOrDefault(item => item.IdJob.Equals(id));

            if (rel == null)
            {
                var list = _context.JobRepository.Where(item => item.IdJob.Contains($"{id}_") && item.FechaEjecucion > DateTime.Now).ToList();
                if (list.Count > 1)
                {
                    foreach (var job in list)
                    {
                        if (job.IdJob.Split("_")[0].Equals(id))
                        {
                            rel = job;
                        }
                    }
                }
                else
                {
                    rel = list[0];
                }
            }
            _context.Entry(rel).State = Microsoft.EntityFrameworkCore.EntityState.Deleted;
            _context.SaveChanges();
        }
        ///<summary>
        ///Elimina una tarea
        ///</summary>
        ///<param name="id">identificador de la tarea</param>
        public void DeleteJob(string id)
        {
            BackgroundJob.Delete(id);
            var rel = _context.JobRepository.FirstOrDefault(item => item.IdJob.Equals(id));

            _context.Entry(rel).State = Microsoft.EntityFrameworkCore.EntityState.Deleted;
            _context.SaveChanges();
        }
        ///<summary>
        ///Método para programar una tarea
        ///</summary>
        ///<param name="idRepository">identificador del repositorio a sincronizar</param>
        ///<param name="fechaInicio">Fecha de la ejecución</param>
        ///<param name="fecha">Fecha desde la que se quiere sincronizar</param>
        ///<param name="set">tipo del objeto, usado para filtrar por agrupaciones
        ///<param name="codigo_objeto">codigo del objeto a sincronizar, es necesario pasar el parametro set si se quiere pasar este parámetro</param>
        public string ProgramPublishRepositoryJob(Guid idRepository, DateTime fechaInicio, DateTime?fecha = null, string set = null, string codigoObjeto = null)
        {
            string        id            = BackgroundJob.Schedule(() => PublishRepositories(idRepository, fecha, set, codigoObjeto), fechaInicio);
            JobRepository jobRepository = new JobRepository()
            {
                IdJob        = id,
                IdRepository = idRepository
            };

            _context.JobRepository.Add(jobRepository);
            _context.SaveChanges();
            return(id);
        }
        ///<summary>
        ///Método para la sincronización de repositorios
        ///</summary>
        ///<param name="idRepositoryGuid">identificador del repositorio a sincronizar</param>
        /// <param name="pSet">tipo del objeto, usado para filtrar por agrupaciones</param>
        /// <param name="codigoObjeto">codigo del objeto a sincronizar, es necesario pasar el parametro set si se quiere pasar este parámetro</param>
        public string PublishRepositories(Guid idRepositoryGuid, PerformContext context, string pSet = null, string codigoObjeto = null)
        {
            string           idRepository     = idRepositoryGuid.ToString();
            RepositoryConfig repositoryConfig = _context.RepositoryConfig.Include(item => item.RepositoryConfigSet).FirstOrDefault(x => x.RepositoryConfigID == idRepositoryGuid);
            //Nos quedariamos con la fecha de la fila que tenga en el 'set' lo que viene en el pSet, si viene nulo, habría que coger la fila que tenga '-' en caso de que exista
            DateTime?fecha  = null;
            string   setAux = "-";

            if (!string.IsNullOrEmpty(pSet))
            {
                setAux = pSet;
            }
            if (repositoryConfig.RepositoryConfigSet.FirstOrDefault(x => x.Set == setAux) != null)
            {
                fecha = repositoryConfig.RepositoryConfigSet.FirstOrDefault(x => x.Set == setAux).LastUpdate;
            }

            string   idJob    = context.BackgroundJob.Id;
            DateTime fechaJob = context.BackgroundJob.CreatedAt;
            var      discover = _context.ProcessDiscoverStateJob.FirstOrDefault(item => item.JobId.Equals(idJob));

            if (discover == null)
            {
                ProcessDiscoverStateJob discoveryState = new ProcessDiscoverStateJob()
                {
                    Id    = Guid.NewGuid(),
                    JobId = idJob,
                    State = "Pending"
                };
                _context.ProcessDiscoverStateJob.Add(discoveryState);
                _context.SaveChanges();
            }
            try
            {
                object objeto = new
                {
                    repository_identifier = idRepositoryGuid,
                    codigo_objeto         = codigoObjeto,
                    fecha_from            = fecha,
                    set              = pSet,
                    job_id           = idJob,
                    job_created_date = fechaJob
                };
                string result = _serviceApi.CallPostApi($"sync/execute", objeto, _token);///{idRepository}
                result = JsonConvert.DeserializeObject <string>(result);

                #region Actualizamos ProcessDiscoverStateJob
                string state;
                //Actualizamos a error si existen items en estado error o con problemas de desambiguación
                if (_context.DiscoverItem.Any(x => x.JobID == idJob && (x.Status == DiscoverItem.DiscoverItemStatus.Error.ToString() || x.Status == DiscoverItem.DiscoverItemStatus.ProcessedDissambiguationProblem.ToString())))
                {
                    state = "Error";
                }
                else if (_context.DiscoverItem.Any(x => x.JobID == idJob && (x.Status == DiscoverItem.DiscoverItemStatus.Pending.ToString())))
                {
                    //Actualizamos a 'Pending' si aún existen items pendientes
                    state = "Pending";
                }
                else
                {
                    //Actualizamos a Success si no existen items en estado error ni con problemas de desambiguación y no hay ninguno pendiente
                    state = "Success";
                }
                ProcessDiscoverStateJob processDiscoverStateJob = _context.ProcessDiscoverStateJob.FirstOrDefault(item => item.JobId.Equals(idJob));
                if (processDiscoverStateJob != null)
                {
                    processDiscoverStateJob.State = state;
                }
                else
                {
                    processDiscoverStateJob = new ProcessDiscoverStateJob()
                    {
                        State = state, JobId = idJob
                    };
                    _context.ProcessDiscoverStateJob.Add(processDiscoverStateJob);
                }
                _context.SaveChanges();
                #endregion


                return(result);
            }
            catch (Exception ex)
            {
                string timeStamp = CreateTimeStamp();
                CreateLoggin(timeStamp, idRepository);
                Log.Error($"{ex.Message}\n{ex.StackTrace}\n");
                throw new Exception(ex.Message);
                //return ex.Message;
            }
        }