Control access to buy products
I believe that good start is to implement EventSubscriber listening on ProductEvents::FILTER_VARIATIONS event. It was introduced to filter out some product variations based on different aspects, such as stock, date, etc.