Example #1
0
        public async Task <StatusResponse> Handle(ProgramarDescargaCommand request, CancellationToken cancellationToken)
        {
            var sr = new StatusResponse
            {
                StatusCode = 200,
                Success    = true,
            };

            Model.Contenido contenido   = null;
            var             hdinicio    = _appSettings.Settings.HORA_DESCARGA_INICIO;
            var             hdintervalo = _appSettings.Settings.HORA_DESCARGA_INTERVALO;
            int             sintervalo  = _appSettings.Settings.SERVIDOR_INTERVALO;

            DateTime dHoraInicio     = DateTime.ParseExact(hdinicio, "hh:mm:ss", null);
            TimeSpan tsHoraIntervalo = hdintervalo;

            var valid = Validacion(request);

            if (valid.Any())
            {
                sr.Messages.AddRange(valid);
                sr.Success = false;
                //Return 1
                return(await Task.FromResult(sr));
            }

            /*
             * if (!string.IsNullOrWhiteSpace(request.idContenido))
             * {
             *  var filter = Builders<Model.Contenido>.Filter.Where(s => s.id == ObjectId.Parse(request.idContenido) &&
             *                                                           s.estado == EstadoContenido.Cargado &&
             *                                                           s.esEliminado == false &&
             *                                                           s.esActivo == true);
             *  contenido = await _contenidoCollection.Context().Find<Model.Contenido>(filter)
             *                                                            .FirstOrDefaultAsync();
             * }
             * else
             */
            //{
            //ultimo Contenido Cargado
            var filter = Builders <Model.Contenido> .Filter.Where(s => s.estado == EstadoContenido.Cargado &&
                                                                  s.esEliminado == false &&
                                                                  s.esActivo == true);

            contenido = await _contenidoCollection.Context().Find <Model.Contenido>(filter)
                        .Limit(1)
                        .SortByDescending(f => f.fechaCreacion)
                        .FirstOrDefaultAsync();

            //}

            if (contenido == null)
            {
                sr.Messages.Add("No se encuentra disponible contenido para descargar");
                sr.Success = false;
                //Return 2
                return(await Task.FromResult(sr));
            }

            var validDescargado = _descargaRepository.FirstOrDefault(x =>
                                                                     x.macServidor.ToUpper() == request.macServidor.ToUpper() &&
                                                                     x.esActivo == true &&
                                                                     x.esEliminado == false &&
                                                                     (x.estado == EstadoDescarga.Descargado) &&
                                                                     x.contenido.id == contenido.id
                                                                     );

            if (validDescargado != null)
            {
                sr.Messages.Add($"Ya se realizó una descarga para el servidor [{request.macServidor}] con el archivo [{contenido.archivo}]");
                sr.Success = false;
                //Return 3
                return(await Task.FromResult(sr));
            }

            var validDescarga = _descargaRepository.FirstOrDefault(x =>
                                                                   x.macServidor.ToUpper() == request.macServidor.ToUpper() &&
                                                                   x.esActivo == true &&
                                                                   x.esEliminado == false &&
                                                                   (x.estado == EstadoDescarga.Programado || x.estado == EstadoDescarga.Descargando) &&
                                                                   x.contenido.id == contenido.id
                                                                   );

            if (validDescarga != null)
            {
                sr.Messages.Add($"Hay una descarga programada con el contenido [{contenido.archivo}]");
                sr.Success = false;
                //sr.StatusCode = 100;
                //Return 3
                return(await Task.FromResult(sr));
            }

            var pNow        = DateTime.Now;
            var currentTime = new TimeSpan(pNow.Hour, pNow.Minute, pNow.Second);
            var startTime   = new TimeSpan(dHoraInicio.Hour, dHoraInicio.Minute, dHoraInicio.Second);

            var dProgramadas = _descargaRepository.Query(x =>
                                                         //x.ipServidor == request.ipServidor &&
                                                         x.esActivo == true &&
                                                         x.esEliminado == false &&
                                                         (x.estado == EstadoDescarga.Programado || x.estado == EstadoDescarga.Descargando) &&
                                                         x.contenido.id == contenido.id
                                                         );

            if (currentTime >= startTime)
            {
                dHoraInicio = dHoraInicio.AddDays(1);
            }

            if (dProgramadas.Any())
            {
                var maxFechaProgramada        = dProgramadas.Max(p => p.fechaProgramada);
                var countDescargasProgramadas = dProgramadas.Count(c => c.fechaProgramada == maxFechaProgramada) + 1;
                if (countDescargasProgramadas <= sintervalo)
                {
                    dHoraInicio = maxFechaProgramada;
                }
                else
                {
                    dHoraInicio = maxFechaProgramada.Add(tsHoraIntervalo);
                }
            }

            var r = await _descargaRepository.InsertOneAsync(new Model.Descarga
            {
                contenido = new Model.ContenidoDescarga
                {
                    id            = contenido.id,
                    nombre        = contenido.nombre,
                    fechaCreacion = (contenido.fechaModificacion == null ? contenido.fechaCreacion : contenido.fechaModificacion.Value),
                    descripcion   = contenido.descripcion,
                    archivo       = contenido.archivo,
                    pesoMb        = contenido.pesoMb
                },
                fechaProgramada = dHoraInicio,
                macServidor     = request.macServidor,
                estado          = EstadoDescarga.Programado,
                esActivo        = true,
                fechaCreacion   = DateTime.Now
            });

            sr.Messages.Add($"La descarga ha sido programada correctamente para servidor [mac:{request.macServidor}]");

            return(await Task.FromResult(sr));
        }
        public async Task <StatusResponse> Handle(ProgramarTodoDescargaCommand request, CancellationToken cancellationToken)
        {
            var sr = new StatusResponse
            {
                StatusCode = 200,
                Success    = true,
            };

            Model.Contenido contenido = null;

            var hdinicio    = _appSettings.Settings.HORA_DESCARGA_INICIO;
            var hdintervalo = _appSettings.Settings.HORA_DESCARGA_INTERVALO;
            int sintervalo  = _appSettings.Settings.SERVIDOR_INTERVALO;

            DateTime dHoraInicio     = DateTime.ParseExact(hdinicio, "hh:mm:ss", null);
            TimeSpan tsHoraIntervalo = hdintervalo;


            if (!string.IsNullOrWhiteSpace(request.idContenido))
            {
                var filter = Builders <Model.Contenido> .Filter.Where(s => s.id == ObjectId.Parse(request.idContenido) &&
                                                                      s.estado == EstadoContenido.Cargado &&
                                                                      s.esEliminado == false &&
                                                                      s.esActivo == true);

                contenido = await _contenidoCollection.Context().Find <Model.Contenido>(filter)
                            .FirstOrDefaultAsync();
            }
            else
            {
                //ultimo Contenido Cargado
                var filter = Builders <Model.Contenido> .Filter.Where(s => s.estado == EstadoContenido.Cargado &&
                                                                      s.esEliminado == false &&
                                                                      s.esActivo == true);

                contenido = await _contenidoCollection.Context().Find <Model.Contenido>(filter)
                            .Limit(1)
                            .SortByDescending(f => f.fechaCreacion)
                            .FirstOrDefaultAsync();
            }


            if (contenido == null)
            {
                sr.Messages.Add("No se encuentra disponible contenido para descargar");
                sr.Success = false;
                //Return 2
                return(await Task.FromResult(sr));
            }

            var pNow        = DateTime.Now;
            var currentTime = new TimeSpan(pNow.Hour, pNow.Minute, pNow.Second);
            var startTime   = new TimeSpan(dHoraInicio.Hour, dHoraInicio.Minute, dHoraInicio.Second);

            if (currentTime >= startTime)
            {
                dHoraInicio = dHoraInicio.AddDays(1);
            }

            var serversActivos = _servidorRepository.Query(x => x.esActivo == true).ToList();

            int interval = sintervalo;
            int count    = serversActivos.Count();

            var macs = serversActivos.Select(g => g.mac);

            var validDescargas = _descargaRepository.Query(x =>
                                                           macs.Contains(x.macServidor) &&
                                                           x.esActivo == true &&
                                                           x.esEliminado == false &&
                                                           (x.estado == EstadoDescarga.Programado || x.estado == EstadoDescarga.Descargando) &&
                                                           x.contenido.id == contenido.id).ToList();

            for (int i = 0; i < count; i = i + interval)
            {
                if (i + interval > count)
                {
                    interval = count - i;
                }
                var rangeServers = serversActivos.GetRange(i, interval);

                var nDescargas = new List <Model.Descarga>();

                foreach (var server in rangeServers)
                {
                    var qProgramcion = validDescargas.FirstOrDefault(h => h.macServidor == server.mac);

                    if (qProgramcion != null)
                    {
                        sr.Messages.Add($"Hay una descarga programada para el servidor [mac:{server.mac}] con el contenido [{contenido.nombre}]");
                    }
                    else
                    {
                        nDescargas.Add(new Model.Descarga
                        {
                            contenido = new Model.ContenidoDescarga
                            {
                                id            = contenido.id,
                                nombre        = contenido.nombre,
                                fechaCreacion = (contenido.fechaModificacion == null ? contenido.fechaCreacion : contenido.fechaModificacion.Value),
                                descripcion   = contenido.descripcion,
                                archivo       = contenido.archivo,
                                pesoMb        = contenido.pesoMb
                            },
                            fechaProgramada = dHoraInicio,
                            macServidor     = server.mac,
                            estado          = EstadoDescarga.Programado,
                            esActivo        = true,
                            fechaCreacion   = DateTime.Now
                        });
                        //sr.Messages.Add($"La descarga ha sido programada correctamente para servidor [{server.ip}]");
                    }
                }
                if (nDescargas.Any())
                {
                    await _descargaRepository.InsertManyAsync(nDescargas, true);

                    dHoraInicio = dHoraInicio.Add(tsHoraIntervalo);
                }
            }
            sr.Success = true;

            return(await Task.FromResult(sr));
        }