rickwest / effectstract

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Effectstract

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.

Getting started

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}

Running the application

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.


Sending a request

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

Running the tests

./vendor/bin/sail artisan test

Limitations/Notes

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

About


Languages

Language:PHP 73.9%Language:Blade 25.8%Language:JavaScript 0.3%