* generate ebook
* serve ebook file
* Update ebook.go not download same image twice anymore
* download ebook request api/ui part
* fix typo
* add stylesheet
* update hasEbook status
* download link update after ebook generate
update bookmark command in ui
* download ebook with bookmark title
* Apply suggestions from code review for better error handling
Co-authored-by: Felipe Martin <812088+fmartingr@users.noreply.github.com>
* Update internal/view/js/page/home.js fix typo
Co-authored-by: Felipe Martin <812088+fmartingr@users.noreply.github.com>
* import error lib and retuen missing error
* move ebook download action to update cache
* replace io/ioutil with io
* add missing error handling
* update Archive now always update ebook
* replace panic error with 404
* remove ebook with delete action
* add download ebook link to content page
* remove tags that not work correctly right now
* if file is pdf not generate ebook
* update style.css
* Revert "update style.css"
This reverts commit 519e10d6ce.
* remove download limit for api
* fix missing fmt.Errorf and change to errors.Wrap
* fix double panic
* return 404 if bookmark not exist
* change function name to GenerateEbook
* not isFatalErr anymore
* add unit test
* remove uneeded field for unit test
---------
Co-authored-by: Felipe Martin <812088+fmartingr@users.noreply.github.com>
* fix(real_ip): get user real ip from headers of request
* fix(real_ip): compatible with those header with multiple IP values separated by commas
* test(real_ip): add benchmark for IPv4 and IPv6 private address check
* fix(real_ip): check empty, then remove leading and tailing comma char, finally locate first IP field
* test(real_ip): move checker logic into utils and add more unit test cases
* test(real_ip): write unit tests covering all code branches of the `util-ip` module
* refactor(real_ip): use one-line `testify.assert.Panics` to capture intended panic in test case
* chore(real_ip): add module private variable `UserRealIpHeaderCandidates`
put those headers together, make it easy to manage in one place
* doc(real_ip): write docstring for each function in the `utils-ip` module
* chore(real_ip): choose more concrete and unambiguous name for test helper function
It is to avoid polluting the module name-space with too general names.
* chore(naming): change function names according to code style
* refactor(real_ip): simplify the code indicated by 'gosimple' and `golangci`
* chore(naming): rename the `utils-ip` file to `utils_ip` to match with the rest of the file structure
---------
Co-authored-by: Felipe Martin <812088+fmartingr@users.noreply.github.com>
* [sqlite] Added has_content column and relevant migration
* Fix typo in docstring
* [sqlite] Fetch content for bookmarks separately
* [sqlite] Store has_content alongside with bookmark
* [sqlite] Rename variable to distinguish it from main query
* [sqlite] Use by-reference instead of no-op copy
* [sqlite] Reduce queries count from ≈30 to 1 to fetch tags
* Lint fixes
* Make minor logging improvements
* Wrap entire migration in transaction block
* Added «down» migration
* Drop workaround for old SQLite versions
* Fix for infinite redirect loop
path.Join trims the trailing slash if the path isn't /, use configured
root instead.
* Add repo root independence
This makes the workflows agnostic of the repository root, making it
possible to build in forked repos.
* Add HTTP request logging
* Fix proper RootPath handler
* Add logging for all resources
This adds proper logging for all resources, including errors. Logging
is on by default, but can be turned off.
* Report effective length of written data