public async Task <ActionResult <Registration> > RegisterCamper(int portalId, int eventId,
                                                                        [FromBody] CamperOverrideModel camper)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            try
            {
                await ValidateCustomFields(portalId, camper.CustomFields);
            }
            catch (Exception ex)
            {
                return(BadRequest(ex.Message));
            }

            Event dbEvent = await _eventRepository.GetEventById(portalId, eventId);

            Registration dbRegistration = await Register(portalId, camper, dbEvent, camper.PaymentId);

            return(Ok(dbRegistration));
        }
        private async Task <Registration> Register(int portalId, CamperOverrideModel camper, Event dbEvent,
                                                   int?paymentId)
        {
            Camper dbCamper = await _camperRepository.CreateCamper(portalId, camper);

            if (!string.IsNullOrEmpty(camper.Coupon))
            {
                IEnumerable <Coupon> dbCoupons = await _couponRepository.GetCouponsByCode(portalId, camper.Coupon);

                List <Coupon> coupons = dbCoupons.ToList();

                if (coupons.Any())
                {
                    await _redeemedCouponRepository.RedeemCoupon(coupons.First().Id, dbCamper.Id);
                }
            }

            await SaveCustomFields(dbCamper.Id, camper.CustomFields);

            RegistrationModel registrationModel = new RegistrationModel
            {
                Event           = dbEvent,
                EventId         = dbEvent.Id,
                CamperId        = dbCamper.Id,
                IsActive        = true,
                StartingBalance = camper.StartingBalance,
            };

            Registration registration = await _registrationRepository.CreateRegistration(portalId, registrationModel);

            if (paymentId != null)
            {
                await _paymentDonationRepository.AddRegistrationPayment(paymentId.Value, registration.Id);
            }

            return(registration);
        }