summaryrefslogtreecommitdiffstats
path: root/src/services/api.js.orig
blob: 511e5321608ba6adba5c3017df8b5d371099926b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>
 *
 * @author John Molakvoæ <skjnldsv@protonmail.com>
 *
 * @license GNU AGPL version 3 or any later version
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 */

import axios from 'axios'

const requestToken = document.getElementsByTagName('head')[0].getAttribute('data-requesttoken')
const tokenHeaders = { headers: { requesttoken: requestToken } }

const sanitize = function(url) {
	return url.replace(/\/$/, '') // Remove last url slash
}

export default {

	/**
	 * This Promise is used to chain a request that require an admin password confirmation
	 * Since chaining Promise have a very precise behavior concerning catch and then,
	 * you'll need to be careful when using it.
	 * e.g
	 * // store
	 * 	action(context) {
	 *		return api.requireAdmin().then((response) => {
	 *			return api.get('url')
	 *				.then((response) => {API success})
	 *				.catch((error) => {API failure});
	 *		}).catch((error) => {requireAdmin failure});
	 *	}
	 * // vue
	 *	this.$store.dispatch('action').then(() => {always executed})
	 *
	 * Since Promise.then().catch().then() will always execute the last then
	 * this.$store.dispatch('action').then will always be executed
	 *
	 * If you want requireAdmin failure to also catch the API request failure
	 * you will need to throw a new error in the api.get.catch()
	 *
	 * e.g
	 *	api.requireAdmin().then((response) => {
	 *		api.get('url')
	 *			.then((response) => {API success})
	 *			.catch((error) => {throw error;});
	 *	}).catch((error) => {requireAdmin OR API failure});
	 *
	 * @returns {Promise}
	 */
	requireAdmin() {
		return new Promise(function(resolve, reject) {
			// TODO: migrate the OC.dialog to Vue and avoid this mess
			// wait for password confirmation
			let passwordTimeout
			let waitForpassword = function() {
				if (OC.PasswordConfirmation.requiresPasswordConfirmation()) {
					passwordTimeout = setTimeout(waitForpassword, 500)
					return
				}
				clearTimeout(passwordTimeout)
				clearTimeout(promiseTimeout)
				resolve()
			}

			// automatically reject after 5s if not resolved
			let promiseTimeout = setTimeout(() => {
				clearTimeout(passwordTimeout)
				// close dialog
				if (document.getElementsByClassName('oc-dialog-close').length > 0) {
					document.getElementsByClassName('oc-dialog-close')[0].click()
				}
				OC.Notification.showTemporary(t('settings', 'You did not enter the password in time'))
				reject(new Error('Password request cancelled'))
			}, 7000)

			// request password
			OC.PasswordConfirmation.requirePasswordConfirmation()
			waitForpassword()
		})
	},
	get(url) {
		return axios.get(sanitize(url), tokenHeaders)
			.then((response) => Promise.resolve(response))
			.catch((error) => Promise.reject(error))
	},
	post(url, data) {
		return axios.post(sanitize(url), data, tokenHeaders)
			.then((response) => Promise.resolve(response))
			.catch((error) => Promise.reject(error))
	},
	patch(url, data) {
		return axios.patch(sanitize(url), data, tokenHeaders)
			.then((response) => Promise.resolve(response))
			.catch((error) => Promise.reject(error))
	},
	put(url, data) {
		return axios.put(sanitize(url), data, tokenHeaders)
			.then((response) => Promise.resolve(response))
			.catch((error) => Promise.reject(error))
	},
	delete(url, data) {
		return axios.delete(sanitize(url), { data: data, headers: tokenHeaders.headers })
			.then((response) => Promise.resolve(response))
			.catch((error) => Promise.reject(error))
<<<<<<< HEAD
	},
	all(promises) {
		return axios.all(promises)
			.then((response) => Promise.resolve(response))
			.catch((error) => Promise.reject(error))

=======
>>>>>>> added api.js with axios and worked on getting the matching users and groups based on input
	}
}