Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: migrate ebook routes #742

Merged
merged 24 commits into from Oct 29, 2023
Merged

Conversation

Monirzadeh
Copy link
Collaborator

@Monirzadeh Monirzadeh commented Sep 29, 2023

this Pull request should remove legacy api for ebook.

TODO :

  • API for download ebook
    • force user to login for use this API
    • this will use for batch download ebook in UI
    • other device can send request for specific bookmark and get epub file
    • don't get content from internet each time get that from database.
  • UI update to use new API
    • if you select pdf article it take time. something slow down processes.
  • API for update ebook files
  • API for serve ebook files
  • Batch download use same route as update cache
  • remove part of code that no need them anymore
    this list will be update
  • Update Swagger
  • Add new unit test

@fmartingr
Copy link
Member

Hey @Monirzadeh, thinking about it I believe is best to move the download route outside of the API, since it does not return structured data (JSON), and that we use GET requests for the download so they are easier to call and can be easily cached in browsers as well.

We can have /bookmarks/<id>/ebook/ to donwload a single ebook. I'm not sure about the bulk download, since I believe is not working right now, and we can use the frontend to call each download URL independently.

What do you think?

@fmartingr fmartingr changed the title Ebooks API v1 refactor: migrate ebook routes Sep 30, 2023
@Monirzadeh
Copy link
Collaborator Author

Monirzadeh commented Sep 30, 2023

Hey @Monirzadeh, thinking about it I believe is best to move the download route outside of the API, since it does not return structured data (JSON), and that we use GET requests for the download so they are easier to call and can be easily cached in browsers as well.

We can have /bookmarks/<id>/ebook/ to donwload a single ebook. I'm not sure about the bulk download, since I believe is not working right now, and we can use the frontend to call each download URL independently.

What do you think?

i am not sure if i get your point correctly.
i send multiple id in api call to generate ebook (if not exist or return file if file exist) and download each them with /bookmarks/<id>/ebook/ for now.
bulk download working for me.

if your point is we don't need multiple id and we should done that one by one. i write that this way because later when i finish shiori plugin for koreader(some part done but not complite). in this method if other application (here koreader) want 100 ebook than we just send one request with list of bookmark we want.

can you please link the part of code you need to change?

@fmartingr
Copy link
Member

So, if I get your comment. You want

  1. Migrate the API call to generate the ebooks of multiple bookmarks all at once. That would be POST /api/v1/bookmarks/ebooks/ json={"bookmark_ids": ["id1", "id2"]}. You sent an array of bookmarks IDs and bookmarks are generated on the server.
  2. Ebooks are downloaded individually using /bookmarks/<id>/ebook/.

Is this correct?

I think my mistake was to think that the /api/v1/bookmarks/ebooks/ was the endpoint that downloaded the ebooks.

@Monirzadeh
Copy link
Collaborator Author

Monirzadeh commented Sep 30, 2023

So, if I get your comment. You want

1. Migrate the API call to **generate** the ebooks of multiple bookmarks all at once. That would be `POST /api/v1/bookmarks/ebooks/ json={"bookmark_ids": ["id1", "id2"]}`. You sent an array of bookmarks IDs and bookmarks are generated on the server.

2. Ebooks are downloaded individually using `/bookmarks/<id>/ebook/`.

Is this correct?

I think my mistake was to think that the /api/v1/bookmarks/ebooks/ was the endpoint that downloaded the ebooks.

@fmartingr yes that is correct. in general i think about that this way
we can interact with ebook in three ways

  1. Ebooks are downloaded individually using /bookmarks/<id>/ebook/ that just serve file if file not exist it will return 404.

  2. PUT /api/v1/bookmarks/ebooks/ json={"bookmark_ids": ["id1", "id2"]} if file exist not update ebook(just return as succsesful in response that user can get that from 1) if file not exist generate that.

  3. Update cache API that generate ebook if not exist and if it was exist update ebook file too. (we don't need cover that in this PR)

should i use POST instead of PUT?

update: somthing like this
file

@fmartingr
Copy link
Member

Love your diagram, it's super clean now :)

should i use POST instead of PUT?

Ummm, I see it more as a POST since we are potentially creating content, but I'm 0/5 on that to be honest.

I will do a full review later in the day once I have some more focus time.

@fmartingr
Copy link
Member

Hey @Monirzadeh, I have been thinking a bit about this route.

Isn't this route the same as the update cache route (/api/cache currently) but only for ebooks? Could we migrate the cache route and use that to generate the ebooks sending the appropriate payload?

We could have:

PUT /api/v1/bookmaks/cache
Content-Type: application/json
Authorization: Bearer xxx

{
  "bookmark_ids": [1,2,3],
  "generate_archive": bool,
  "generate_ebook": bool,
  "keep_metadata": bool,
}

Do we have this second endpoint for a specific reason?

@Monirzadeh
Copy link
Collaborator Author

Monirzadeh commented Oct 4, 2023

uld have:

i specific think about Dowload ebook for other programs that need interact with shiori (like koreader) they just request specific bookmark for download. in this situation they don't need to control last epub version on server they just get that if exist or generate if not exist. (we don't have real separate user yet)

if we want move to your solution apps should send more request.

  1. send request to get list of ebub situation of a list of bookmark.
  2. send request for generate cache that not exist epub
  3. send request for download exist epub
  4. when generate epub finish send one more request to download them

with separate API for download

  1. one request for bookmark that program need
  2. download request for get them

we can think about that again before merge.
that path is equal with this function we have that before

func (h *Handler) ApiDownloadEbook(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {

@fmartingr
Copy link
Member

/api/v1/bookmaks/cache

Mhmmm I don't agree with your first description.

For example if you want to download ebooks for bookmarks [1,2,3] as a client you would:

  1. Request the ebooks to be generated: PUT /api/v1/bookmaks/cache {"bookmark_ids": [1,2,3], "generate_ebook": true}
  2. Download each ebook: GET /bookmark/<bookmark id>/ebook/ per bookmark.

We could even generate the ebook on the fly on the download ebook endpoint using a parameter, to generate it if is not generated previously: (GET /bookmark/<bookmark id>/ebook/?generate=true or something like that)

@Monirzadeh
Copy link
Collaborator Author

  1. equest the ebooks to be generated: PUT /api/v1/bookmaks/cache {"bookmark_ids": [1,2,3], "generate_ebook": true}

currently if file is exist cache update that epub. we should avoid that.
do you mean we need another option beside currently function that PUT /api/v1/bookmaks/cache {"bookmark_ids": [1,2,3], "generate_ebook": true} only generate for bookmark that don't have ebook write?

  1. current function endpoint can update ebook
  2. new option (with same end point) that just generate files for file not exist

@Monirzadeh
Copy link
Collaborator Author

Hi @fmartingr
Please Review this PR and if it have not major problem i go forward and update unit test.

Copy link
Member

@fmartingr fmartingr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey, just reviewed this! Awesome work. I don't have much time these days to move things forward and all my time goes into reviews, so super happy seeing you contribute to the new API!

I left you some notes and changes around, and as a general comment I see you instantiate new loggers in handlers (or at least I saw one around), but know that there is one under r.deps.Log ;)

internal/http/routes/api/v1/bookmarks.go Outdated Show resolved Hide resolved
internal/http/routes/api/v1/bookmarks.go Show resolved Hide resolved
internal/http/routes/bookmark.go Outdated Show resolved Hide resolved
internal/http/routes/bookmark.go Outdated Show resolved Hide resolved
internal/http/routes/bookmark.go Outdated Show resolved Hide resolved
internal/http/routes/bookmark.go Outdated Show resolved Hide resolved
internal/http/routes/bookmark.go Outdated Show resolved Hide resolved
internal/view/login.html Show resolved Hide resolved
Copy link
Member

@fmartingr fmartingr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome 👍

@fmartingr fmartingr merged commit 5e9847a into go-shiori:master Oct 29, 2023
6 checks passed
@Monirzadeh
Copy link
Collaborator Author

unit test is missing
should i add that later in another pull request?

@fmartingr
Copy link
Member

unit test is missing should i add that later in another pull request?

Yeah, is better that way so we don't keep coming back to the same changes 👍

@fmartingr fmartingr added this to the 1.6.0 milestone Oct 29, 2023
@Monirzadeh Monirzadeh self-assigned this Feb 5, 2024
truecharts-admin added a commit to truecharts/charts that referenced this pull request Mar 17, 2024
…0@628826c by renovate (#19427)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/go-shiori/shiori](https://togithub.com/go-shiori/shiori) |
minor | `v1.5.5` -> `v1.6.0` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the Dependency
Dashboard for more information.

---

### Release Notes

<details>
<summary>go-shiori/shiori (ghcr.io/go-shiori/shiori)</summary>

###
[`v1.6.0`](https://togithub.com/go-shiori/shiori/releases/tag/v1.6.0)

[Compare
Source](https://togithub.com/go-shiori/shiori/compare/v1.5.5...v1.6.0)

It's finally here! After some work we have started moving towards **a
more usable and open API** for others to consume, with **proper session
handling** (no more random logouts on server shutdowns!), improvements
to **ePubs**, UX and some more!

See details below for more information (important notes are the breaking
changes) and please fill an issue if you see anything weird, better be
safe than sorry!

#### Breaking changes

- The `serve` command is considered deprecated and will be removed in a
future release. Right now just proxies to a new `server` command that is
the one that should be used from now on.
- The **server** command uses a new http backend. This **should be
transparent to users** and all things should keep working as usual, but
that meant refactoring some of the underlying systems too, so
experiences may vary between deployments and operating systems. Please
fill an issue if you see that something is not working as expected.
- We are moving the API to a more stable, documented and with a proper
code structure. Right now there's a mix between old and new endpoints
until migration is completed. Check [the
documentation](https://togithub.com/go-shiori/shiori/blob/master/docs/APIv1.md)
for more information on the new API and [this roadmap
filter](https://togithub.com/orgs/go-shiori/projects/2/views/11) to see
progress on the API migration.
- Authentication to the API now uses JWTs instead of session tokens and
the **endpoint has changed to a new one**, please check the
documentation mentioned above. This means that there's no longer logout
issues when the server is restarted or when you log in in other
computer/browser.
- The `--webroot` flag **no longer modifies the routes internally**, is
up to the user to proxy the routes properly to Shiori without the prefix
used to serve it.
That means that if you want to serve Shiori under `domain.com/shiori`
you need to send the path back to Shiori without the `/shiori` prefix so
routes keep working. This can be done in most reverse proxies that we're
aware of. We provided [a sample configuration for
Nginx](https://togithub.com/go-shiori/shiori/blob/master/docs/Configuration.md#reverse-proxies-and-the-webroot-path).
PRs are welcome for other reverse proxies.
- The `shiori/gopher` initial user is a full fledged user instead of
being hardcoded into Shiori. If you want a new user you need to create a
new owner user and then remove the `shiori` user.

#### Release cadence

Right now the release cadence has been slow because we made too many
changes at once and we had to test and finish everything before doing
this release. Plan moving forward is to iterate and release faster so
we're planning smaller milestones to provide new features and fixes
faster to you.

I will post an update announcement when [the
roadmap](https://togithub.com/orgs/go-shiori/projects/2/views/4) is
reviewed.

#### What's Changed

- APIv1: Start working on new REST API. Refactor logic in domains. by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#497
- Run legacy API and new API at the same time. by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#648
- fix: docker buildx tags by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#650
- Allow JWT authentication into legacy APIs by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#651
- Show version in login page by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#652
- fix: package-name in cleanup tag by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#655
- fix: pr tag prune using other action by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#656
- fix: title is never retrieved when adding bookmark by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#664
- Show Shiori version on server command by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#669
- chore: remove irc badge from README by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#674
- fix: title overwritten if user has defined it by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#684
- Proper SQLite default database and warn SHIORI_DBMS users by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#667
- chore: remove verbose logger by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#685
- Fix CI incorrectly tagging RC releases and disables docker builds on
forks by [@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#686
- preserve fragment in URLs
([#&#8203;315](https://togithub.com/go-shiori/shiori/issues/315)) by
[@&#8203;arakimo](https://togithub.com/arakimo) in
[go-shiori/shiori#687
- Swagger improvements by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#666
- fix: Ensure bookmark files are correctly downloaded before deleting
current ones by [@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#683
- fix(db): handle usage of special characters in searches by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#721
- fix: properly parse mysql connection string, docs update by
[@&#8203;rutkai](https://togithub.com/rutkai) in
[go-shiori/shiori#730
- deps: upgrade to Go 1.21 by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#698
- deps: upgrade github.com/gofrs/uuid to v5 by
[@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#736
- feat: build css from less files locally by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#735
- refactor: Migrate ePub generation to go-epub by
[@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#679
- chore(deps): bump the all group with 6 updates by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[go-shiori/shiori#738
- chore(deps): bump the all group with 1 update by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[go-shiori/shiori#740
- feat: use new JWT auth in all frontend API calls by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#743
- chore(deps): bump the all group with 1 update by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[go-shiori/shiori#746
- fix: styles-check and swag-check monitor just needed directory not
project root by [@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#747
- feat: allow resize the dialogbox for bigger/hidpi screens by
[@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#732
- feat: allow per-user settings and store them in database by
[@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#639
- fix: Remove unneeded variable and unify the way send token in header
by [@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#763
- add create ebook by default in settings by
[@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#761
- fix: Actions in overlays on mobile hard to press by
[@&#8203;cbe](https://togithub.com/cbe) in
[go-shiori/shiori#759
- fix: Use webp as thumbnail by
[@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#758
- Update documentation for add links to shiori in android devices from
share menu by [@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#757
- Fix typos by [@&#8203;shirayu](https://togithub.com/shirayu) in
[go-shiori/shiori#756
- chore(deps): bump the all group with 1 update by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[go-shiori/shiori#767
- refactor: migrate ebook routes by
[@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#742
- Make suggestions tapable/clickable by
[@&#8203;cbe](https://togithub.com/cbe) in
[go-shiori/shiori#765
- chore: frontend formatting by [@&#8203;cbe](https://togithub.com/cbe)
in
[go-shiori/shiori#764
- ci: add codecov reporting by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#776
- deps: update go dependencies by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#777
- fix typo by [@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#778
- docs: example deployment for kubernetes by
[@&#8203;JPFrancoia](https://togithub.com/JPFrancoia) in
[go-shiori/shiori#754
- Add Documentation>CLI>Add bookmark by
[@&#8203;LLKoder](https://togithub.com/LLKoder) in
[go-shiori/shiori#794
- fix: generate coverage profile by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#797
- fix: use noreferer to prevent exposing shiori instance url to archived
websites by [@&#8203;istiak101](https://togithub.com/istiak101) in
[go-shiori/shiori#802
- deps: upgrade by [@&#8203;fmartingr](https://togithub.com/fmartingr)
in
[go-shiori/shiori#804
- refactor: migrate bookmark static pages to new http server by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#775
- Fixed lint errors after refactor by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#806
- docs: updated configuration page by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#808
- fix: force usage of shiori prefix for environment variables in
configuration by [@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#807
- deps: updated docker image versions by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#809
- chore(deps): bump the all group with 3 updates by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[go-shiori/shiori#812
- chore(deps): bump the all group with 3 updates by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[go-shiori/shiori#815
- chore(deps): bump the all group with 3 updates by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[go-shiori/shiori#830
- fix: fixes path issues on windows by
[@&#8203;Monirzadeh](https://togithub.com/Monirzadeh) in
[go-shiori/shiori#829
- fix: regressions and documentation from 1.5.5 upgrade by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#837
- fix: update go-epub to latest version to avoid filename errors on
windows by [@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#840
- fix: point go-epub go correct repository by
[@&#8203;fmartingr](https://togithub.com/fmartingr) in
[go-shiori/shiori#842
- feat: allow authentication using proxy request header by
[@&#8203;PterX](https://togithub.com/PterX) in
[go-shiori/shiori#836

#### New Contributors

- [@&#8203;arakimo](https://togithub.com/arakimo) made their first
contribution in
[go-shiori/shiori#687
- [@&#8203;rutkai](https://togithub.com/rutkai) made their first
contribution in
[go-shiori/shiori#730
- [@&#8203;cbe](https://togithub.com/cbe) made their first contribution
in
[go-shiori/shiori#759
- [@&#8203;shirayu](https://togithub.com/shirayu) made their first
contribution in
[go-shiori/shiori#756
- [@&#8203;JPFrancoia](https://togithub.com/JPFrancoia) made their first
contribution in
[go-shiori/shiori#754
- [@&#8203;LLKoder](https://togithub.com/LLKoder) made their first
contribution in
[go-shiori/shiori#794
- [@&#8203;istiak101](https://togithub.com/istiak101) made their first
contribution in
[go-shiori/shiori#802
- [@&#8203;PterX](https://togithub.com/PterX) made their first
contribution in
[go-shiori/shiori#836

**Full Changelog**:
go-shiori/shiori@v1.5.5...v1.6.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://togithub.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNTIuMCIsInVwZGF0ZWRJblZlciI6IjM3LjI1Mi4wIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIn0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants