public async Task AddSubscription(string email, string host, int port, int pollingFreaquency, int gracePeriod) { ServiceProvider serviceProvider = await serviceProviderRepository.GetByHostAndPort(host, port); TimeSpan requestedPollingFrequency = GetTimeSpan(pollingFreaquency); // If service provider is not found add new one serviceProvider = serviceProvider == null ? new ServiceProvider() { Host = host, Port = port, PollingFrequency = requestedPollingFrequency } : serviceProvider; // If service provider is existing always update the service provider with the maximum polling freaquency serviceProvider.PollingFrequency = serviceProvider.PollingFrequency > requestedPollingFrequency? requestedPollingFrequency : serviceProvider.PollingFrequency; List <ServiceProvider> serviceProvidersToUpdate = new List <ServiceProvider>(); serviceProvidersToUpdate.Add(serviceProvider); // Update database with service provider details await serviceProviderRepository.Upsert(serviceProvidersToUpdate); // Refreash service provider after inserting to map the subscription for user if (serviceProvider.Id == 0) { serviceProvider = await serviceProviderRepository.GetByHostAndPort(host, port); } // if service provider not found in the user, update the subscription User user = await userRepository.GetUserByEmail(email); if (user.Subscriptions.Where(s => s.Service.Id == serviceProvider.Id).Count() == 0) { ServiceSubscription serviceSubscription = new ServiceSubscription() { Service = serviceProvider, PollingFrequency = requestedPollingFrequency, GracePeriod = GetTimeSpan(gracePeriod) }; user.Subscriptions.Add(serviceSubscription); List <User> usersToUpdate = new List <User>(); usersToUpdate.Add(user); await userRepository.Upsert(usersToUpdate); } }