Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
 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 ?? ""
     });
 }
Ejemplo n.º 5
0
        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
            });
        }