[Koha-bugs] [Bug 36369] New: Make APIClient be more useful
bugzilla-daemon at bugs.koha-community.org
bugzilla-daemon at bugs.koha-community.org
Wed Mar 20 15:20:05 CET 2024
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=36369
Bug ID: 36369
Summary: Make APIClient be more useful
Change sponsored?: ---
Product: Koha
Version: master
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P5 - low
Component: Architecture, internals, and plumbing
Assignee: koha-bugs at lists.koha-community.org
Reporter: tomascohen at gmail.com
QA Contact: testopia at bugs.koha-community.org
I file this report for discussion.
In my opinion, there's too much duplicated code on the API client libraries.
And the APIClient "class" is just a shortcut to avoid instantiating the
module-specific API clients:
```javascript
import ERMAPIClient from "./erm-api-client";
...
export const APIClient = {
erm: new ERMAPIClient(),
```
Then used everywhere like this:
```javascript
import { APIClient } from "../../fetch/api-client.js"
...
const client = APIClient.erm
await client.agreements.count().then(
```
IMHO, we need a real APIClient class that would implement generic methods like:
```javascript
create: params =>
this.post({
endpoint: params.endpoint ? params.endpoint : "/",
body: params.resource,
headers: params.headers
}),
...
getAll: params =>
this.get({
endpoint: params.endpoint ? params.endpoint : "/",
params.query,
headers: params.headers,
}),
...
count: params =>
this.count({
endpoint: params.endpoint ? params.endpoint : "/",
"?" +
new URLSearchParams({
_page: 1,
_per_page: 1,
...(params.query && { q: JSON.stringify(params.query) }),
}),
}),
```
and the API Client classes (like ERMAPIClient) should inherit from it, somehow.
For doing so, we will face another design roadblock:
While I uderstand that ERMAPIClient is a single place to have all the ERM
module-needed API actions, it still feels weird from an OOP perspective how
things are organized.
I feel like we should have individual classes, like:
```javascript
export RecordSourcesAPIClient extends APIClient
```
and then have a new type of class along this lines:
```javascript
import CitiesAPIClient from "./cities-api-client";
import RecordSourcesAPIClient from "./record-sources-api-client";
...
export const AdminAPIClient = {
cities: new CitiesAPIClient(),
record_sources: new RecordSourcesAPIClient(),
...
};
```
this way, we will avoid repeating ourselves (less bugs!) and the code is (I
expect) more reusable.
I also think the `embed` handling should just be a list for the different
methods, like:
embed: [ 'patron', 'patron.category' ]
and generically handled by APIClient. No need to build the headers manually
everywhere.
--
You are receiving this mail because:
You are the assignee for the bug.
You are watching all bug changes.
More information about the Koha-bugs
mailing list