Bug 32939: Have a generic fetch function for POST and PUT requests in vue modules
[koha.git] / koha-tmpl / intranet-tmpl / prog / js / vue / fetch / erm.js
1 import { setError } from "../messages";
2
3 //TODO: all of these functions should be deleted and reimplemented in the components using ERMAPIClient
4
5 export const fetchLicense = function (license_id) {
6     if (!license_id) return;
7     const apiUrl = "/api/v1/erm/licenses/" + license_id;
8     return myFetch(apiUrl, {
9         headers: {
10             "x-koha-embed": "user_roles,user_roles.patron,vendor,documents",
11         },
12     });
13 };
14
15 export const fetchLicenses = function () {
16     const apiUrl = "/api/v1/erm/licenses?_per_page=-1";
17     return myFetch(apiUrl, {
18         headers: {
19             "x-koha-embed": "vendor.name",
20         },
21     });
22 };
23
24 export const fetchPatron = function (patron_id) {
25     if (!patron_id) return;
26     const apiUrl = "/api/v1/patrons/" + patron_id;
27     return myFetch(apiUrl);
28 };
29
30 export const fetchVendors = function () {
31     const apiUrl = "/api/v1/acquisitions/vendors?_per_page=-1";
32     return myFetch(apiUrl);
33 };
34
35 const _createEditPackage = function (method, erm_package) {
36     let apiUrl = "/api/v1/erm/eholdings/local/packages";
37
38     if (method == "PUT") {
39         apiUrl += "/" + erm_package.package_id;
40     }
41     delete erm_package.package_id;
42     delete erm_package.resources;
43     delete erm_package.vendor;
44     delete erm_package.resources_count;
45     delete erm_package.is_selected;
46
47     erm_package.package_agreements = erm_package.package_agreements.map(
48         ({ package_id, agreement, ...keepAttrs }) => keepAttrs
49     );
50
51     const options = {
52         method: method,
53         body: JSON.stringify(erm_package),
54         headers: {
55             "Content-Type": "application/json;charset=utf-8",
56         },
57     };
58
59     return myFetch(apiUrl, options, 1);
60 };
61
62 export const createPackage = function (erm_package) {
63     return _createEditPackage("POST", erm_package);
64 };
65 export const editPackage = function (erm_package) {
66     return _createEditPackage("PUT", erm_package);
67 };
68
69 const _fetchPackage = function (apiUrl, package_id) {
70     if (!package_id) return;
71     return myFetch(apiUrl, {
72         headers: {
73             "x-koha-embed":
74                 "package_agreements,package_agreements.agreement,resources+count,vendor",
75         },
76     });
77 };
78 export const fetchLocalPackage = function (package_id) {
79     const apiUrl = "/api/v1/erm/eholdings/local/packages/" + package_id;
80     return _fetchPackage(apiUrl, package_id);
81 };
82 export const fetchEBSCOPackage = function (package_id) {
83     const apiUrl = "/api/v1/erm/eholdings/ebsco/packages/" + package_id;
84     return _fetchPackage(apiUrl, package_id);
85 };
86
87 export const _fetchPackages = function (apiUrl) {
88     return myFetch(apiUrl, {
89         headers: {
90             "x-koha-embed": "resources+count,vendor.name",
91         },
92     });
93 };
94 export const fetchLocalPackages = function () {
95     const apiUrl = "/api/v1/erm/eholdings/local/packages?_per_page=-1";
96     return _fetchPackages(apiUrl);
97 };
98 export const fetchEBSCOPackages = function () {
99     const apiUrl = "/api/v1/erm/eholdings/ebsco/packages";
100     return _fetchPackages(apiUrl);
101 };
102
103 export const fetchLocalPackageCount = function (filters) {
104     const q = filters
105         ? {
106               "me.name": { like: "%" + filters.package_name + "%" },
107               ...(filters.content_type
108                   ? { "me.content_type": filters.content_type }
109                   : {}),
110           }
111         : {};
112
113     const params = {
114         _page: 1,
115         _per_page: 1,
116         q: JSON.stringify(q),
117     };
118     var apiUrl = "/api/v1/erm/eholdings/local/packages";
119     return myFetchTotal(apiUrl + "?" + new URLSearchParams(params));
120 };
121
122 export const _fetchTitle = function (apiUrl, title_id) {
123     if (!title_id) return;
124     return myFetch(apiUrl, {
125         headers: {
126             "x-koha-embed": "resources,resources.package",
127         },
128     });
129 };
130 export const fetchLocalTitle = function (title_id) {
131     const apiUrl = "/api/v1/erm/eholdings/local/titles/" + title_id;
132     return _fetchTitle(apiUrl, title_id);
133 };
134 export const fetchEBSCOTitle = function (title_id) {
135     const apiUrl = "/api/v1/erm/eholdings/ebsco/titles/" + title_id;
136     return _fetchTitle(apiUrl, title_id);
137 };
138
139 export const fetchLocalTitleCount = function (filters) {
140     const q = filters
141         ? {
142               ...(filters.publication_title
143                   ? {
144                         "me.publication_title": {
145                             like: "%" + filters.publication_title + "%",
146                         },
147                     }
148                   : {}),
149               ...(filters.publication_type
150                   ? { "me.publication_type": filters.publication_type }
151                   : {}),
152           }
153         : undefined;
154     const params = {
155         _page: 1,
156         _per_page: 1,
157         ...(q ? { q: JSON.stringify(q) } : {}),
158     };
159     var apiUrl = "/api/v1/erm/eholdings/local/titles";
160     return myFetchTotal(apiUrl + "?" + new URLSearchParams(params));
161 };
162
163 export const _fetchResource = function (apiUrl, resource_id) {
164     if (!resource_id) return;
165     return myFetch(apiUrl, {
166         headers: {
167             "x-koha-embed": "title,package,vendor",
168         },
169     });
170 };
171 export const fetchLocalResource = function (resource_id) {
172     const apiUrl = "/api/v1/erm/eholdings/local/resources/" + resource_id;
173     return _fetchResource(apiUrl, resource_id);
174 };
175 export const fetchEBSCOResource = function (resource_id) {
176     const apiUrl = "/api/v1/erm/eholdings/ebsco/resources/" + resource_id;
177     return _fetchResource(apiUrl, resource_id);
178 };
179
180 export const _fetchResources = async function (apiUrl) {
181     return await myFetch(apiUrl);
182 };
183
184 export const fetchLocalResources = function () {
185     const apiUrl = "/api/v1/erm/eholdings/local/resources";
186     return _fetchResources(apiUrl);
187 };
188 export const fetchEBSCOResources = function () {
189     const apiUrl = "/api/v1/erm/eholdings/ebsco/resources";
190     return _fetchResources(apiUrl);
191 };
192
193 export const myFetch = async function (url, options, return_response) {
194     let r;
195     await fetch(url, options || {})
196         .then((response) => checkError(response, return_response))
197         .then(
198             (result) => {
199                 r = result;
200             },
201             (error) => {
202                 setError(error.toString());
203             }
204         )
205         .catch((error) => {
206             setError(error);
207         });
208     return r;
209 };
210 export const myFetchTotal = async function (url, options) {
211     let r;
212     await myFetch(url, options, 1).then(
213         (response) => {
214             if (response) {
215                 r = response.headers.get("X-Total-Count");
216             }
217         },
218         (error) => {
219             setError(error.toString());
220         }
221     );
222     return r;
223 };
224
225 export const checkError = function (response, return_response) {
226     if (response.status >= 200 && response.status <= 299) {
227         return return_response ? response : response.json();
228     } else {
229         console.log("Server returned an error:");
230         console.log(response);
231         throw Error("%s (%s)".format(response.statusText, response.status));
232     }
233 };