public async Task<IHttpActionResult> PostTurnoutSwipe(TurnoutSwipeDto dto) { using (var reader = new StringReader(dto.Data)) { string line; while ((line = await reader.ReadLineAsync()) != null) { var match = Regex.Match(line, @"^([+-])\x02\w{2}(\w{8})\w{2}\x03\x03$"); if (!match.Success) continue; var sign = match.Groups[1].ToString(); var hexRfid = match.Groups[2].ToString(); var rfid = Convert.ToInt64(hexRfid, 16); var scout = await Db.Scouts.FirstOrDefaultAsync(s => s.Rfid == rfid); if (scout == null) continue; var point = new TurnoutPoint { Amount = sign == "+" ? 1 : -1, HouseId = scout.HouseId, Time = DateTime.Now }; Db.TurnoutPoints.Add(point); await Db.SaveChangesAsync(); ScoreUpdated(); } return Ok(); } }
private static async Task Run() { int last; using (var db = new DataContext()) { last = await db.BoxterSwipes .Select(bs => bs.SwipeId) .DefaultIfEmpty(0) .MaxAsync(); } while (true) { try { Thread.Sleep(DELAY); using (var httpClient = new HttpClient()) { var json = await httpClient.GetStringAsync(URL); var dtos = JsonConvert.DeserializeObject<BoxterImportDto[]>(json) .Where(bi => bi.Id > last) .OrderBy(bi => bi.Id) .ToList(); if (!dtos.Any()) continue; bool tournoutPointAdded = false; using (var db = new DataContext()) { foreach (var dto in dtos) { long rfid; try { rfid = Convert.ToInt64(dto.Tag); } catch { if (_isWarnEnabled) _log.Warn($"Rfid not valid: {dto.Tag}"); continue; } var scout = await db.Scouts.FirstOrDefaultAsync(s => s.Rfid == rfid); last = dto.Id; if (scout == null) { if (_isWarnEnabled) _log.Warn($"Rfid not found: {rfid}"); continue; } var swipe = new BoxterSwipe { SwipeId = dto.Id, Scout = scout, BoxId = dto.BoxId, BoxIdFriendly = dto.BoxIdFriendly, AppMode = dto.AppMode, AppResponse = dto.AppResponse, CreateDate = dto.CreateDate }; db.BoxterSwipes.Add(swipe); if (dto.AppMode.Equals("Bogen", StringComparison.InvariantCultureIgnoreCase)) { tournoutPointAdded = true; var point = new TurnoutPoint { Amount = int.Parse(dto.AppResponse), HouseId = scout.HouseId, Time = dto.CreateDate }; db.TurnoutPoints.Add(point); } await db.SaveChangesAsync(); } } if (tournoutPointAdded) await httpClient.PostAsync("http://localhost/Api/Turnout/", null); _log.Info("Got new data from Boxter"); } } catch (Exception ex) { if (_isErrorEnabled) _log.Error(ex); } } }