private async Task UpdateRider(Data.Rider rider, Rider request) { rider.Number = request.Number; rider.FirstName = request.FirstName; rider.LastName = request.LastName; rider.Sex = Data.SexConverter.FromProto(request.Sex); rider.YearOfBirth = request.YearOfBirth; rider.Category = string.IsNullOrEmpty(request.Category) ? null : await dbContext.RaceCategories.FirstOrDefaultAsync(c => c.RaceId == rider.RaceId && c.Code == request.Category); rider.City = request.City; rider.Team = request.Team; }
public override async Task <Rider> add(AddRiderRequest request, ServerCallContext context) { var rider = new Data.Rider() { RaceId = request.RaceId }; await UpdateRider(rider, request.Rider); dbContext.Riders.Add(rider); await dbContext.SaveChangesAsync(); return(ToProtoRider(rider)); }
public override async Task <Rider> update(Rider request, ServerCallContext context) { Data.Rider Rider = await dbContext.Riders.FindAsync(request.Id); if (Rider == null) { throw new ArgumentException($"Rider not found by Id: '{request.Id}"); } await UpdateRider(Rider, request); await dbContext.SaveChangesAsync(); return(ToProtoRider(Rider)); }
private static Rider ToProtoRider(Data.Rider r) { return(new Rider { Id = r.Id, Number = r.Number ?? "", FirstName = r.FirstName ?? "", LastName = r.LastName ?? "", Sex = Data.SexConverter.ToProto(r.Sex), YearOfBirth = r.YearOfBirth, Category = r.Category?.Code ?? "", CategoryName = r.Category?.Name ?? "", City = r.City ?? "", Team = r.Team ?? "" }); }
public override async Task <ImportRidersResponse> importRiders(ImportRidersRequest request, ServerCallContext context) { int added = 0, failed = 0, existed = 0; int raceId = request.RaceId; const string SEPARATOR = ";"; var race = await dbContext.Races.Include(r => r.Categories).FirstOrDefaultAsync(r => r.Id == raceId); if (race == null) { throw new Exception($"Race not found by Id: {raceId}"); } var allRiders = await dbContext.Riders.Where(r => r.RaceId == raceId).ToListAsync(); var rows = request.Content.Split('\n'); if (request.SkipFirstRow) { rows = rows.Skip(1).ToArray(); } var columnTypes = request.Columns; foreach (var row in rows) { var items = row.Split(SEPARATOR); Data.Rider rider = new Data.Rider() { RaceId = request.RaceId }; for (var i = 0; i < columnTypes.Count; i++) { if (items.Length <= i) { break; } string value = items[i]; if (!string.IsNullOrWhiteSpace(value)) { switch (columnTypes[i]) { case RiderImportColumnType.City: rider.City = value; break; case RiderImportColumnType.Firstlastname: var splited = value.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries); if (splited.Length == 2) { rider.FirstName = splited[0].Trim(); rider.LastName = splited[1].Trim(); } break; case RiderImportColumnType.Firstname: rider.FirstName = value.Trim(); break; case RiderImportColumnType.Lastname: rider.LastName = value.Trim(); break; case RiderImportColumnType.Lastfirstname: splited = value.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries); if (splited.Length == 2) { rider.LastName = splited[0].Trim(); rider.FirstName = splited[1].Trim(); } break; case RiderImportColumnType.Sex: rider.Sex = items[i].StartsWith("ж", StringComparison.CurrentCultureIgnoreCase) ? Data.Sex.Female : Data.Sex.Male; break; case RiderImportColumnType.Team: rider.Team = value; break; case RiderImportColumnType.Year: if (int.TryParse(value, out int year) && year > 1900 && year < DateTime.UtcNow.Year) { rider.YearOfBirth = year; } break; } } } if (string.IsNullOrWhiteSpace(rider.FirstName) || string.IsNullOrWhiteSpace(rider.LastName)) { failed++; } else { var existingRider = allRiders.FirstOrDefault(r => r.FirstName.Equals(rider.FirstName, StringComparison.CurrentCultureIgnoreCase) && r.LastName.Equals(rider.LastName, StringComparison.CurrentCultureIgnoreCase)); if (existingRider == null) { // determine category rider.Category = race.Categories.FirstOrDefault(cat => cat != null && (cat.MinYearOfBirth != null || cat.MaxYearOfBirth != null) // skip categories without years && (cat.Sex == null || cat.Sex == rider.Sex) && (cat.MinYearOfBirth == null || cat.MinYearOfBirth <= rider.YearOfBirth) && (cat.MaxYearOfBirth == null || cat.MaxYearOfBirth >= rider.YearOfBirth) ); dbContext.Add(rider); added++; } else { // update only City and Team if set if (!string.IsNullOrWhiteSpace(rider.City)) { existingRider.City = rider.City; } if (!string.IsNullOrWhiteSpace(rider.Team)) { existingRider.Team = rider.Team; } dbContext.Update(existingRider); existed++; } } } await dbContext.SaveChangesAsync(); string result = $"Всего: {added + existed + failed}Добавлено: {added}"; if (existed > 0) { result += $", повторов: {existed}"; } if (failed > 0) { result += $", игнорировано: {failed}"; } return(new ImportRidersResponse() { Result = result }); }