24 дек. 2018 г.
Всем привет. Не так давно делал тестовое задание для одной компании. Вакансия Senior PHP Developer, на удаленку. Нужно было сделать web сервис на Laravel, который будет загружать ресурсы по http.
Дословно задание выглядит так:
You need to develop a web-application which will download particular resource by specified url. The same resources can be downloaded multiple times.
Url can be passed via web API method or with CLI command. There should be a simple html page showing status of all jobs (for complete jobs there also should be an url to download target file).
The same should be available via CLI command and web API. It should save downloaded urls in storage configured in Laravel (local driver can be used).
Requirements: Laravel 5, PHP 7, any SQL DB **
Acceptance:
- should use DB to persist task information
- should use job queue to download resources
- should use Laravel storage to store downloaded resources
- REST API method / CLI command / web page to enqueue url to download
- REST API method / CLI command / web page to view list of download tasks with statuses (pending/downloading/complete/error) and ability to download resource for completed tasks (url to resource in Laravel storage)
- unit tests
- no paging nor css is required for html page
- no authentication/authorization (no separation by users)
Url добавляется через web-форму, либо через console, либо через REST. Дальше создается задача на скачивание - сущность в БД. Статус устанвливается pending.
Кроме этого создается служба(Job), которая отвечает за загрузку ресурса по url и сохранения его локально. Для этого использовал File Storage и Queues.
File storage предоставляет абстракцию для файловой системы, что довольно удобно. Также поддерживаются разные драйверы, например local, SFTP, Amazon S3, Rackspace.
Queue представляет встроенный механизм для работы с очередями. Поддерживаются разные драйверы: sync, database, Redis, Beanstalkd, Amazon SQS. Для простоты и наглядности использовал database.
В результате, все работает, как заявлено. Также написал тесты на реализованный функционал. К сожалению, задание не прошло проверку.
Code a little bit messy. No validation of url, no error handling in url downloading
Что ж, возможно... В конце концов, это всего лишь тестовое задание. Понятно, что этот код не пойдет в production и нужно реализовать минимальный функционал, описаный в задании. В требованиях про валидацию url сказано не было. К тому же, в случае некорректного url Job падает и задача помечается как failed. Немного расстроился, но не сильно. Зато попрактиковался. Код доступен на github.
На этом пока все, спасибо за внимание!