Effectstract is a Laravel application that exposes an api endpoint which accepts a Base64 Encoded PDF file and extracts text from it. The resulting text is stored in the application database and also returned from the endpoint.
Clone the repository
git clone https://github.com/rickwest/effectstract.git
Install the dependencies
composer install
Create .env
from example
cp .env.example .env
Add AWS Credentials to .env
AWS_ACCESS_KEY_ID={keyId}
AWS_SECRET_ACCESS_KEY={secret}
Effectstract utilizes Laravel Sail to make getting started locally as easy as possible. You will need docker installed and running.
Bring up the sail containers
./vendor/bin/sail up -d
Generate app key
./vendor/bin/sail artisan key:gen
Migrate database
./vendor/bin/sail artisan migrate
You should now be able to navigate to http://effectstract.test/ in your browser and see the default laravel home page.
You can send a test extraction request to the application via curl, or via a http client such as Postman. For example:
curl -H 'Content-Type: application/json' \
-d '{ "document":"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" }' \
-X POST \
http://effectstract.test/api/extract-text
./vendor/bin/sail artisan test
Validation - Not doing anything beyond the basic required
and string
validation. Would probably want to do further validation to ensure the string is a PDF etc. Made more difficult being a base64 encoded string, much easier when uploading a file as could leverage the Laravel file validation rules.
Text Extraction Interface - Although only a single implementation required in this case, for this kind of work and integration with a third party it makes sense to implement a generic interface and bind the implementation to the interface. This will make it much easier should it be necessary to change the third party text extraction service in future.
Utilise Queue - Depending on the required implementation, for example, if the extracted text is not required in the response then it would be more performant to push the text extraction to a queued job rather than doing it during the request lifecycle.
Testing - The tests hit AWS. Again this is probably not desirable especially on larger application or when running tests on CI. Unnecessarily hitting a third party during testing has a negative performance and cost impact. It might still be worth hitting a third party with a few tests to ensure no changes to the desired outcome in some instances, but mocking the third party would make sense rather than testing something that is outside developer control.
Error Handling - Might want to more gracefully handle exceptions etc