Esempio n. 1
0
        public async Task <bool> CheckMaxFailedTimes(EthEventDTO eventDto, int maxTimes = 3)
        {
            var eventDB = await covidUnitOfWork.EthEvents.GetFullById(eventDto.Id);

            if (eventDB == null)
            {
                await covidUnitOfWork.EthEvents.AddAsync(eventDto);

                await covidUnitOfWork.CommitAsync();

                return(false);
            }

            if (eventDB.IndexedParameters[0].Value == eventDto.IndexedParameters[0].Value)
            {
                eventDB.FailedTimes++;
                if (eventDB.FailedTimes >= maxTimes)
                {
                    return(true);
                }

                covidUnitOfWork.EthEvents.Update(eventDB);
                await covidUnitOfWork.CommitAsync();

                return(false);
            }

            logger.LogCritical("The ids of the Events are not unique", eventDto, eventDB);
            return(true);
        }
        public static RegisteredCredential From(EthEventDTO eventDto)
        {
            var ret = new RegisteredCredential()
            {
                IsRevoked          = false,
                HashId             = eventDto.IndexedParameters[0].Value,
                CitizenAddress     = eventDto.NonIndexedParameters[0].Value,
                SubjectHashId      = eventDto.NonIndexedParameters[1].Value,
                StartDate          = DateTimeOffset.FromUnixTimeMilliseconds(long.Parse(eventDto.NonIndexedParameters[2].Value)).DateTime.ToUniversalTime(),
                CredentialCreation = DateTimeOffset.FromUnixTimeMilliseconds(long.Parse(eventDto.NonIndexedParameters[3].Value)).DateTime.ToUniversalTime(),
                Sex            = Enum.Parse <Sex>(eventDto.NonIndexedParameters[4].Value),
                Age            = short.Parse(eventDto.NonIndexedParameters[5].Value),
                CredentialType = Enum.Parse <CredentialType>(eventDto.NonIndexedParameters[7].Value),
                Reason         = Enum.Parse <InterruptionReason>(eventDto.NonIndexedParameters[8].Value)
            };

            var hasher  = new Geohasher();
            var hash    = Hex.HexToString(eventDto.NonIndexedParameters[6].Value);
            var decoded = hasher.Decode(hash);

            ret.Location = new Point(decoded.Item2, decoded.Item1);
            ret.Lat      = ret.Location.Coordinate.X;
            ret.Lon      = ret.Location.Coordinate.Y;
            SetSymptoms(ret, eventDto.NonIndexedParameters[9].Value);
            return(ret);
        }
 private async Task <bool> CheckEventIsNotInALoop(EthEventDTO eventDTO)
 {
     try
     {
         return(await _failedEthEventsService.CheckMaxFailedTimes(eventDTO));
     }
     catch (Exception e)
     {
         _logger.LogCritical(e, "EthEvent is trap: ", eventDTO);
         return(true);
     }
 }
Esempio n. 4
0
        public async Task RevokeCredential(EthEventDTO ethEvent)
        {
            var hash       = ethEvent.IndexedParameters[0].Value.ToString();
            var credential = await covidUnitOfWork.Credentials
                             .SingleOrDefaultAsync(x => x.HashId == hash);

            if (credential != null)
            {
                credential.IsRevoked = true;
                covidUnitOfWork.Credentials.Update(credential);
                await covidUnitOfWork.CommitAsync();
            }
        }
Esempio n. 5
0
        public async Task ImportAsync(EthEventDTO ethEvent)
        {
            var credential = RegisteredCredential.From(ethEvent);

            try
            {
                var country = await this.covidUnitOfWork.Countries.SingleOrDefaultAsync(x => x.Geom.Contains(credential.Location));

                var state = await this.covidUnitOfWork.States.SingleOrDefaultAsync(x => x.Geom.Contains(credential.Location));

                credential.CountryGid = country.Gid;
                credential.StateGid   = state.Gid;
                await covidUnitOfWork.Credentials.AddAsync(credential);

                await covidUnitOfWork.CommitAsync();
            }
            catch (Exception e)
            {
                throw new Exception($"Error on EthEvent transaction hash: {ethEvent.TransactionHash}", e);
            }
        }
        public async Task <ActionResult> Post(EthEventDTO eventDTO)
        {
            if (eventDTO == null || eventDTO.Status != "CONFIRMED")
            {
                return(Ok());
            }
            try
            {
                var name = eventDTO.Name.ToLowerInvariant();
                if (name == "credentialregistered")
                {
                    await _credentialService.ImportAsync(eventDTO);

                    return(Ok());
                }
                else if (name == "credentialrevoked")
                {
                    await _credentialService.RevokeCredential(eventDTO);

                    return(Ok());
                }

                return(StatusCode(500, $"The event {name} is not supported"));
            }
            catch (Exception e)
            {
                ///Since Eventum if failed keep trying, no more than 3 times
                if (!await CheckEventIsNotInALoop(eventDTO))
                {
                    var guid = Guid.NewGuid();
                    _logger.LogError(e, $"Error on Post. Id: {guid}", eventDTO);
                    return(StatusCode(500, $"Error Id {guid}"));
                }
                {
                    _logger.LogCritical(e, "EthEvent is in a loop: ", eventDTO);
                    return(Ok());
                }
            }
        }