public async Task <UserLaneData> CreateLaneAsync(UserLaneData lane, Guid identUserId, string username)
        {
            _securityService.GuardAction(SecurityActions.Loadshop_Ui_Profile_Favorites_Add_Edit);

            ConvertStatesToAbbreviations(lane);
            ValidateUserLane(lane);
            var dbLane = await _context.UserLanes.SingleOrDefaultAsync(x => x.UserLaneId.ToString() == lane.UserLaneId);

            if (dbLane != null)
            {
                throw new Exception($"User Lane already exists");
            }
            if (lane.EquipmentIds?.Count() == 0)
            {
                throw new Exception("Must have at least on equipment type selected");
            }
            var user = await _context.Users.SingleOrDefaultAsync(x => x.IdentUserId == identUserId);

            if (user == null)
            {
                throw new Exception("Invalid userId");
            }

            lane.UserLaneId = Guid.NewGuid().ToString();
            lane.UserId     = user.UserId.ToString();
            dbLane          = _mapper.Map <UserLaneEntity>(lane);
            foreach (var laneNotification in lane.UserLaneMessageTypes)
            {
                if (laneNotification.Selected)
                {
                    var dbLaneNotification = _mapper.Map <UserLaneMessageTypeEntity>(laneNotification);
                    dbLane.UserLaneMessageTypes.Add(dbLaneNotification);
                }
            }
            if (dbLane.UserLaneEquipments == null)
            {
                dbLane.UserLaneEquipments = new List <UserLaneEquipmentEntity>();
            }

            foreach (var equipment in lane.EquipmentIds)
            {
                var e = new UserLaneEquipmentEntity()
                {
                    EquipmentId = equipment
                };
                dbLane.UserLaneEquipments.Add(e);
            }

            _context.UserLanes.Add(dbLane);
            await _context.SaveChangesAsync(username);

            return(await GetSavedLaneAsync(dbLane.UserLaneId));
        }
        public async Task <UserLaneData> UpdateLaneAsync(UserLaneData lane, Guid identUserId, string username)
        {
            _securityService.GuardAction(SecurityActions.Loadshop_Ui_Profile_Favorites_Add_Edit);

            ConvertStatesToAbbreviations(lane);
            ValidateUserLane(lane);
            var dbLane = await _context.UserLanes.SingleOrDefaultAsync(x => x.UserLaneId.ToString() == lane.UserLaneId);

            if (dbLane == null)
            {
                throw new Exception($"User Lane not found");
            }
            if (lane.EquipmentIds?.Count() == 0)
            {
                throw new Exception("Must have at least on equipment type selected");
            }
            var user = await _context.Users.SingleOrDefaultAsync(x => x.IdentUserId == identUserId);

            if (user == null)
            {
                throw new Exception("Invalid userId");
            }

            lane.UserId = user.UserId.ToString();
            dbLane      = _mapper.Map(lane, dbLane);

            if (lane.OrigLat.HasValue && lane.OrigLng.HasValue && !dbLane.OrigDH.HasValue)
            {
                dbLane.OrigDH = DefaultDHMiles;
            }

            if (lane.DestLat.HasValue && lane.DestLng.HasValue && !dbLane.DestDH.HasValue)
            {
                dbLane.DestDH = DefaultDHMiles;
            }

            foreach (var laneNotification in lane.UserLaneMessageTypes)
            {
                var dbLaneNotification = await _context.UserLaneMessageTypes
                                         .SingleOrDefaultAsync(x => x.UserLaneId == dbLane.UserLaneId && x.MessageTypeId == laneNotification.MessageTypeId);

                if (laneNotification.Selected && dbLaneNotification == null)
                {
                    dbLaneNotification            = _mapper.Map <UserLaneMessageTypeEntity>(laneNotification);
                    dbLaneNotification.UserLaneId = dbLane.UserLaneId;
                    _context.UserLaneMessageTypes.Add(dbLaneNotification);
                }
                if (!laneNotification.Selected && dbLaneNotification != null)
                {
                    _context.UserLaneMessageTypes.Remove(dbLaneNotification);
                }
            }

            foreach (var equipmentId in lane.EquipmentIds)
            {
                var dbLaneEquipment = await _context.UserLaneEquipments
                                      .SingleOrDefaultAsync(x => x.UserLaneId == dbLane.UserLaneId && x.EquipmentId == equipmentId);

                if (dbLaneEquipment == null)
                {
                    dbLaneEquipment = new UserLaneEquipmentEntity()
                    {
                        EquipmentId = equipmentId,
                        UserLaneId  = dbLane.UserLaneId
                    };
                    _context.UserLaneEquipments.Add(dbLaneEquipment);
                }
            }

            var dbLaneEquipments = await _context.UserLaneEquipments.Where(x => x.UserLaneId == dbLane.UserLaneId).ToListAsync();

            foreach (var dbLaneEquipment in dbLaneEquipments)
            {
                if (!lane.EquipmentIds.Contains(dbLaneEquipment.EquipmentId))
                {
                    _context.UserLaneEquipments.Remove(dbLaneEquipment);
                }
            }
            await _context.SaveChangesAsync(username);

            return(await GetSavedLaneAsync(dbLane.UserLaneId));
        }