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); } }
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(); } }
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()); } } }