Shootset is a marketplace where customers can search and book models for photo shooting. Users can sign up as customers or models. Platform works similar as other e-commerce websites because of same flow “add to cart and order” and “add to shoot and book”.
Account type switcher is used by users to switch their account between customer and model because there are cases where they are both.
Booking system is the most complex feature on the platform from the side of human-system interaction. Goal was to cover all the cases and solve them with buttons in order to decrease number of messaging and speed booking process. Problem is that there are a lot of cases which need to cover.
Messaging is attached to booking and it is allowed only if there is a booking request.
Search filters are synced with attributes that model can set. When searching by location there is a radius filter also.
Notification system is important for the booking process. It triggers on every change of the booking status and speeds up booking process time.
Reviews for both sides, customer and model, per booking are available. By default, models are sorted by reviews so they are important part of search engine.
Shootset is running on Symfony 2 PHP framework, rendered with Twig template engine and hosted on Amazon Web Services. Amazon S3 server is used for cloud storage. Mailing server is also on Amazon EC2 thanks to mail-in-a-box. For sending notification emails Amazon SES is doing the job.
After 2000+ users main search query speed slowed down to up to 10 seconds. After optimizing query, indexing database and removing “n+1” issues query was down to 200ms. In some more complex queries Doctrine is slowing down the request.
For photography product one of the important thing is to have good photos. Good photos means heavy files. Challenge was to optimize and resize photos when they are uploaded but also don’t slow down uploading. To avoid upload loading time, all images are optimized and resized with cron job after their are being uploaded. It works similar as TinyPNG. For compressing jpg I’m using ImageMagic and for png PngQuant.