Exemplo n.º 1
0
        public async Task<string> AsyncExecute(string input, ILambdaContext context) {

                var waqiProxy = Waqi.create("sometoken"); // add token
                var feeds = new List<string>();
                var stationFeedsObtained = new List<WaqiCityFeed>();

                feeds.AddRange(new string[]{@"mexico/guadalajara/tlaquepaque"
                , @"mexico/guadalajara/vallarta"
                , @"mexico/guadalajara/miravalle"
                });
                foreach (var feed in feeds) {
                    System.Console.WriteLine($"Requesting feed for:{feed}");
                    string mutableString = string.Empty;
                    try {
                        mutableString = await waqiProxy.getCityFeed(feed);
                            
                        if(mutableString != string.Empty) {
                            System.Console.WriteLine("found this result:\n");
                            System.Console.WriteLine(mutableString);
                            var wcf = JsonSerializer.Deserialize<WaqiCityFeed>(mutableString);
                            stationFeedsObtained.Add(wcf);
                        }
                    } catch(Exception e) { System.Console.WriteLine(e);}
                }
                var cityFeedDto = CityFeed.From(stationFeedsObtained);

                return JsonSerializer.Serialize(cityFeedDto).ToString();
                //System.Console.WriteLine(JsonSerializer.Serialize(cityFeedDto).ToString());
        }
Exemplo n.º 2
0
 public CityFeedTests()
 {
     // setup Guadalajara city with 2 default
     //var sample = Waqi.WaqiCityFeedResponse();
     //GuadalajaraCityStations.Add(sample);
     GuadalajaraCityStations.Add(Waqi.CreateWaqiCityFeedResponse(GuadalajaraCity, VallartaStation, int.Parse(VallartaStationId), MinAqi));
     GuadalajaraCityStations.Add(Waqi.CreateWaqiCityFeedResponse(GuadalajaraCity, TlaquepaqueStation, int.Parse(TlaquepaqueStationId), MaxAqi));
 }
Exemplo n.º 3
0
 public WaqiTests(ITestOutputHelper output)
 {
     /*mockClient = Mock.Of<HttpClient>();
      * Mock.Get(mockClient).Setup(it => it.GetStringAsync($"https://api.waqi.info/feed/Guadalajara/?token={TestToken}"))
      * .Returns(new Task<string>(() => Values.Waqi.WaqiCityFeedResponseJSON));
      * waqiProxy = Waqi.create(mockClient, TestToken);
      */
     waqiProxy   = Waqi.create(TestToken);
     this.output = output;
 }
Exemplo n.º 4
0
        public async Task <string> AsyncExecute(string input, ILambdaContext context)
        {
            var waqiProxy = Waqi.create(_token);
            var cities    = JsonSerializer.Deserialize <List <Latincoder.AirQuality.Model.Config.City> >(_citiesRaw); // default C# serialization
            // process multiple cities
            var stationFeedsByCity = from city in cities
                                     from station in city.Stations
                                     let feed = new { Uri = $"{city.Country}/{city.Name}/{station}", CityName = city.Name }
            group feed by $"{city.Country}-{city.Name}" into stationsByCity
            select stationsByCity;

            var cityFeedsDTO = new List <CityFeed>();

            foreach (var cityFeeds in stationFeedsByCity)
            {
                var feeds = from value in cityFeeds
                            select value.Uri;
                var stationFeedsObtained = new List <WaqiCityFeed>();
                foreach (var feed in feeds)
                {
                    System.Console.WriteLine($"Requesting feed for:{feed}");
                    string mutableString = string.Empty;
                    try {
                        mutableString = await waqiProxy.getCityFeed(feed);

                        if (mutableString != string.Empty)
                        {
                            System.Console.WriteLine("found this result:\n");
                            System.Console.WriteLine(mutableString);
                            var wcf = JsonSerializer.Deserialize <WaqiCityFeed>(mutableString);
                            stationFeedsObtained.Add(wcf);
                        }
                    } catch (Exception e) { System.Console.WriteLine(e); }
                }
                try {
                    cityFeedsDTO.Add(CityFeed.From(stationFeedsObtained));
                } catch (Exception e) { System.Console.WriteLine(e); }
            }
            var response = await sendCityFeed(cityFeedsDTO);

            System.Console.WriteLine(response.ToString());
            return("done");
        }
Exemplo n.º 5
0
        public async Task <string> AsyncExecute(System.IO.Stream input, ILambdaContext context)
        {
            _ = input;                                                                                                // discard
            var waqiProxy = Waqi.create(_token);
            var cities    = JsonSerializer.Deserialize <List <Latincoder.AirQuality.Model.Config.City> >(_citiesRaw); // default C# serialization
            // process multiple cities
            var stationFeedsByCity = from city in cities
                                     from station in city.Stations
                                     let feed = new { Uri = $"{city.Country}/{city.Name}/{station}", CityName = city.Name }
            group feed by $"{city.Country}-{city.Name}" into stationsByCity
            select stationsByCity;

            var cityFeedsDTO = new List <CityFeed>();

            foreach (var cityFeeds in stationFeedsByCity)
            {
                var feeds = from value in cityFeeds
                            select value.Uri;
                var stationFeedsObtained = new List <WaqiCityFeed>();
                foreach (var feed in feeds)
                {
                    System.Console.WriteLine($"Requesting feed for:{feed}");
                    string mutableString = string.Empty;
                    try {
                        mutableString = await waqiProxy.getCityFeed(feed);

                        if (mutableString != string.Empty)
                        {
                            System.Console.WriteLine("found this result:\n");
                            System.Console.WriteLine(mutableString);
                            var wcf = JsonSerializer.Deserialize <WaqiCityFeed>(mutableString);
                            stationFeedsObtained.Add(wcf);
                        }
                    } catch (Exception e) { System.Console.WriteLine(e); }
                }
                try {
                    cityFeedsDTO.Add(CityFeed.From(stationFeedsObtained));
                } catch (Exception e) { System.Console.WriteLine(e); }
            }

            var aqiTable             = Table.LoadTable(_dynamoClient, _AqiTableName);
            var notificationIsUrgent = NotificationValidator.CreateyValidator();

            notificationIsUrgent.AddRules(Rules.AqiAboveUnhealthyThreshold);
            // store in DynamoDB if meets notification criteria
            foreach (var feed in cityFeedsDTO)
            {
                // Gather previous and new feeds
                var prevFeedDoc = await aqiTable.GetItemAsync(CityFeedDocument.PartitionKeyName);

                var newFeed = prevFeedDoc != null?
                              CityFeedDocument.From(feed, prevFeedDoc[CityFeedDocument.FieldMaxAqi].AsInt()) :
                                  CityFeedDocument.From(feed);

                // if no previous stuff
                if (prevFeedDoc == null)
                {
                    Console.WriteLine($"FIRST TIME: Store in dynamo now for {feed.CityName}");
                    await aqiTable.PutItemAsync(newFeed);

                    continue;
                }

                var prevFeed = CityFeedDocument.ToDTO(prevFeedDoc);

                // each feed will has a custom validator with it's own criteria since this is done per city
                var notificationIsNotSpam = NotificationValidator.CreateyValidator();
                // spam means max aqi changed at least by 5 points, and is at least 20 minutes apart frm last notification
                notificationIsNotSpam.AddRules(
                    Rules.MinutesApartFrom(prevFeed, 30),
                    Rules.AbsoluteAqiChangedBy(prevFeed, 5));
                // urgent or meets criteria
                if (notificationIsUrgent.MeetsGlobalCriteria(feed) && notificationIsNotSpam.MeetsGlobalCriteria(feed))
                {
                    Console.WriteLine($"Store in dynamo now for {feed.CityName}");
                    await aqiTable.PutItemAsync(newFeed);
                }
                else
                {
                    Console.WriteLine("Does not meet rules...");
                }
            }

            return("done");
        }