public async Task <ICollection <TransponderBagSet> > ResetBagAsync(string licenseIssuerId, string discipline, string name, IEnumerable <int> sets) { var now = DateTime.UtcNow; using (var transaction = context.BeginTransaction(IsolationLevel.RepeatableRead)) try { var bag = await context.TransponderBags.Include(b => b.Sets).FirstOrDefaultAsync( b => b.LicenseIssuerId == licenseIssuerId && b.Discipline == discipline && b.Name == name); if (bag == null) { throw new TransponderBagNotFoundException(); } foreach (var set in bag.Sets.ToList()) { context.TransponderBagSets.Remove(set); } await context.SaveChangesAsync(); var bagSets = new List <TransponderBagSet>(); foreach (var setNumber in sets) { var set = await context.TransponderSets.FirstOrDefaultAsync( s => s.LicenseIssuerId == licenseIssuerId && s.Discipline == discipline && s.Number == setNumber); var bagSet = new TransponderBagSet { Bag = bag, Set = set, Added = now }; context.TransponderBagSets.Add(bagSet); bagSets.Add(bagSet); await context.SaveChangesAsync(); } transaction.Commit(); return(bagSets); } catch { transaction.Rollback(); throw; } }
public async Task ResetVenueSubscriptionsAsync(string issuerId, string discipline, ICollection <string> keys, string venueCode, string venueDiscipline, int?season) { var calculator = calculatorManager.Find(discipline); if (calculator == null) { throw new InvalidDisciplineException(); } season = season ?? calculator.CurrentSeason; var validFrom = calculator.SeasonStarts(season.Value); var validTo = calculator.SeasonEnds(season.Value); using (var transaction = context.BeginTransaction(IsolationLevel.Serializable)) try { var venue = await context.Venues.FirstOrDefaultAsync(v => v.Code == venueCode && v.Discipline == venueDiscipline); if (venue == null) { throw new VenueNotFoundException(); } if (!discipline.StartsWith(venue.Discipline)) { throw new InvalidDisciplineException(); } var existing = await context.PersonLicenseVenueSubscriptions.Where(s => s.VenueCode == venueCode && s.VenueDiscipline == venueDiscipline).ToListAsync(); foreach (var subscription in existing) { context.PersonLicenseVenueSubscriptions.Remove(subscription); await context.SaveChangesAsync(); } foreach (var key in keys) { var subscription = new PersonLicenseVenueSubscription { LicenseIssuerId = issuerId, LicenseDiscipline = discipline, LicenseKey = key, ValidFrom = validFrom, ValidTo = validTo, Issued = DateTime.UtcNow, Venue = venue }; context.PersonLicenseVenueSubscriptions.Add(subscription); try { await context.SaveChangesAsync(); } catch (Exception e) { throw new PersonLicenseNotFoundException(issuerId, discipline, key, e); } } transaction.Commit(); } catch { transaction.Rollback(); throw; } }