You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
426 lines
12 KiB
426 lines
12 KiB
/**
|
|
* @copyright Copyright (c) 2019 Marco Ambrosini <marcoambrosini@icloud.com>
|
|
*
|
|
* @author Marco Ambrosini <marcoambrosini@icloud.com>
|
|
*
|
|
* @license AGPL-3.0-or-later
|
|
*
|
|
* 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 '@nextcloud/axios'
|
|
import { loadState } from '@nextcloud/initial-state'
|
|
import { generateOcsUrl } from '@nextcloud/router'
|
|
import { CONVERSATION, SHARE } from '../constants.js'
|
|
|
|
/**
|
|
* Fetches the conversations from the server.
|
|
*
|
|
* @param {object} options options
|
|
*/
|
|
const fetchConversations = async function(options) {
|
|
options = options || {}
|
|
options.params = options.params || {}
|
|
options.params.includeStatus = true
|
|
return await axios.get(generateOcsUrl('apps/spreed/api/v4/room'), options)
|
|
}
|
|
|
|
/**
|
|
* Fetches a conversation from the server.
|
|
*
|
|
* @param {string} token The token of the conversation to be fetched.
|
|
*/
|
|
const fetchConversation = async function(token) {
|
|
return axios.get(generateOcsUrl('apps/spreed/api/v4/room/{token}', { token }))
|
|
}
|
|
|
|
/**
|
|
* Fetch listed conversations
|
|
*
|
|
* @param {string} searchText The string that will be used in the search query.
|
|
* @param {object} options options
|
|
*/
|
|
const searchListedConversations = async function({ searchText }, options) {
|
|
return axios.get(generateOcsUrl('apps/spreed/api/v4/listed-room'), Object.assign(options, {
|
|
params: {
|
|
searchTerm: searchText,
|
|
},
|
|
}))
|
|
}
|
|
|
|
/**
|
|
* Fetch possible conversations
|
|
*
|
|
* @param {object} data the wrapping object;
|
|
* @param {string} data.searchText The string that will be used in the search query.
|
|
* @param {string} [data.token] The token of the conversation (if any), or "new" for a new one
|
|
* @param {boolean} [data.onlyUsers] Only return users
|
|
* @param {object} options options
|
|
*/
|
|
const searchPossibleConversations = async function({ searchText, token, onlyUsers }, options) {
|
|
token = token || 'new'
|
|
onlyUsers = !!onlyUsers
|
|
const shareTypes = [
|
|
SHARE.TYPE.USER,
|
|
]
|
|
|
|
if (!onlyUsers) {
|
|
shareTypes.push(SHARE.TYPE.GROUP)
|
|
shareTypes.push(SHARE.TYPE.CIRCLE)
|
|
if (token !== 'new') {
|
|
shareTypes.push(SHARE.TYPE.EMAIL)
|
|
|
|
if (loadState('spreed', 'federation_enabled')) {
|
|
shareTypes.push(SHARE.TYPE.REMOTE)
|
|
}
|
|
}
|
|
}
|
|
|
|
return axios.get(generateOcsUrl('core/autocomplete/get'), Object.assign(options, {
|
|
params: {
|
|
search: searchText,
|
|
itemType: 'call',
|
|
itemId: token,
|
|
shareTypes,
|
|
},
|
|
}))
|
|
}
|
|
|
|
/**
|
|
* Create a new one to one conversation with the specified user.
|
|
*
|
|
* @param {string} userId The ID of the user with wich the new conversation will be opened.
|
|
*/
|
|
const createOneToOneConversation = async function(userId) {
|
|
try {
|
|
const response = await axios.post(generateOcsUrl('apps/spreed/api/v4/room'), { roomType: CONVERSATION.TYPE.ONE_TO_ONE, invite: userId })
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error creating new one to one conversation: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create a new group conversation.
|
|
*
|
|
* @param {string} invite The group/circle ID
|
|
* @param {string} source The source of the invite ID (defaults to groups)
|
|
*/
|
|
const createGroupConversation = async function(invite, source) {
|
|
try {
|
|
const response = await axios.post(generateOcsUrl('apps/spreed/api/v4/room'), { roomType: CONVERSATION.TYPE.GROUP, invite, source: source || 'groups' })
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error creating new group conversation: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create a new private conversation.
|
|
*
|
|
* @param {string} conversationName The name for the new conversation
|
|
*/
|
|
const createPrivateConversation = async function(conversationName) {
|
|
try {
|
|
const response = await axios.post(generateOcsUrl('apps/spreed/api/v4/room'), { roomType: CONVERSATION.TYPE.GROUP, roomName: conversationName })
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error creating new private conversation: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create a new private conversation.
|
|
*
|
|
* @param {string} conversationName The name for the new conversation
|
|
*/
|
|
const createPublicConversation = async function(conversationName) {
|
|
try {
|
|
const response = await axios.post(generateOcsUrl('apps/spreed/api/v4/room'), { roomType: CONVERSATION.TYPE.PUBLIC, roomName: conversationName })
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error creating new public conversation: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set a conversation's password
|
|
*
|
|
* @param {string} token the conversation's token
|
|
* @param {string} password the password to be set
|
|
*/
|
|
const setConversationPassword = async function(token, password) {
|
|
const response = await axios.put(generateOcsUrl('apps/spreed/api/v4/room/{token}/password', { token }), {
|
|
password,
|
|
})
|
|
return response
|
|
}
|
|
|
|
/**
|
|
* Set a conversation's name
|
|
*
|
|
* @param {string} token the conversation's token
|
|
* @param {string} name the name to be set
|
|
*/
|
|
const setConversationName = async function(token, name) {
|
|
const response = await axios.put(generateOcsUrl('apps/spreed/api/v4/room/{token}', { token }), {
|
|
roomName: name,
|
|
})
|
|
return response
|
|
}
|
|
|
|
/**
|
|
* Delete a conversation.
|
|
*
|
|
* @param {string} token The token of the conversation to be deleted.
|
|
*/
|
|
const deleteConversation = async function(token) {
|
|
try {
|
|
const response = await axios.delete(generateOcsUrl('apps/spreed/api/v4/room/{token}', { token }))
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error while deleting the conversation: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Clears the conversation history
|
|
*
|
|
* @param {string} token The token of the conversation to be deleted.
|
|
*/
|
|
const clearConversationHistory = async function(token) {
|
|
const response = await axios.delete(generateOcsUrl('apps/spreed/api/v1/chat/{token}', { token }))
|
|
return response
|
|
}
|
|
|
|
/**
|
|
* Add a conversation to the favorites
|
|
*
|
|
* @param {string} token The token of the conversation to be favorites
|
|
*/
|
|
const addToFavorites = async function(token) {
|
|
try {
|
|
const response = await axios.post(generateOcsUrl('apps/spreed/api/v4/room/{token}/favorite', { token }))
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error while adding the conversation to favorites: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remove a conversation from the favorites
|
|
*
|
|
* @param {string} token The token of the conversation to be removed from favorites
|
|
*/
|
|
const removeFromFavorites = async function(token) {
|
|
try {
|
|
const response = await axios.delete(generateOcsUrl('apps/spreed/api/v4/room/{token}/favorite', { token }))
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error while removing the conversation from favorites: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set notification level
|
|
*
|
|
* @param {string} token The token of the conversation to change the notification level
|
|
* @param {number} level The notification level to set.
|
|
*/
|
|
const setNotificationLevel = async function(token, level) {
|
|
try {
|
|
const response = await axios.post(generateOcsUrl('apps/spreed/api/v4/room/{token}/notify', { token }), { level })
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error while setting the notification level: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set call notifications
|
|
*
|
|
* @param {string} token The token of the conversation to change the call notification level
|
|
* @param {number} level The call notification level.
|
|
*/
|
|
const setNotificationCalls = async function(token, level) {
|
|
try {
|
|
const response = await axios.post(generateOcsUrl('apps/spreed/api/v4/room/{token}/notify-calls', { token }), { level })
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error while setting the call notification level: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Make the conversation public
|
|
*
|
|
* @param {string} token The token of the conversation to be removed from favorites
|
|
*/
|
|
const makePublic = async function(token) {
|
|
try {
|
|
const response = await axios.post(generateOcsUrl('apps/spreed/api/v4/room/{token}/public', { token }))
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error while making the conversation public: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Make the conversation private
|
|
*
|
|
* @param {string} token The token of the conversation to be removed from favorites
|
|
*/
|
|
const makePrivate = async function(token) {
|
|
try {
|
|
const response = await axios.delete(generateOcsUrl('apps/spreed/api/v4/room/{token}/public', { token }))
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error while making the conversation private: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Change the SIP enabled
|
|
*
|
|
* @param {string} token The token of the conversation to be modified
|
|
* @param {number} newState The new SIP state to set
|
|
*/
|
|
const setSIPEnabled = async function(token, newState) {
|
|
return axios.put(generateOcsUrl('apps/spreed/api/v4/room/{token}/webinar/sip', { token }), {
|
|
state: newState,
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Change the lobby state
|
|
*
|
|
* @param {string} token The token of the conversation to be modified
|
|
* @param {number} newState The new lobby state to set
|
|
* @param {number} timestamp The UNIX timestamp (in seconds) to set, if any
|
|
*/
|
|
const changeLobbyState = async function(token, newState, timestamp) {
|
|
try {
|
|
const response = await axios.put(generateOcsUrl('apps/spreed/api/v4/room/{token}/webinar/lobby', { token }), {
|
|
state: newState,
|
|
timer: timestamp,
|
|
})
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error while updating webinar lobby: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Change the read-only state
|
|
*
|
|
* @param {string} token The token of the conversation to be modified
|
|
* @param {number} readOnly The new read-only state to set
|
|
*/
|
|
const changeReadOnlyState = async function(token, readOnly) {
|
|
try {
|
|
const response = await axios.put(generateOcsUrl('apps/spreed/api/v4/room/{token}/read-only', { token }), {
|
|
state: readOnly,
|
|
})
|
|
return response
|
|
} catch (error) {
|
|
console.debug('Error while updating read-only state: ', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Change the listable scope
|
|
*
|
|
* @param {string} token The token of the conversation to be modified
|
|
* @param {number} listable The new listable scope to set
|
|
*/
|
|
const changeListable = async function(token, listable) {
|
|
const response = await axios.put(generateOcsUrl('apps/spreed/api/v4/room/{token}/listable', { token }), {
|
|
scope: listable,
|
|
})
|
|
return response
|
|
}
|
|
|
|
const setConversationDescription = async function(token, description) {
|
|
const response = await axios.put(generateOcsUrl('apps/spreed/api/v4/room/{token}/description', { token }), {
|
|
description,
|
|
})
|
|
return response
|
|
}
|
|
|
|
/**
|
|
* Set the default permissions for participants in a conversation.
|
|
*
|
|
* @param {string} token conversation token
|
|
* @param {number} permissions the type of permission to be granted. Valid values are
|
|
* any sums of 'DEFAULT', 'CUSTOM', 'CALL_START', 'CALL_JOIN', 'LOBBY_IGNORE',
|
|
* 'PUBLISH_AUDIO', 'PUBLISH_VIDEO', 'PUBLISH_SCREEN'.
|
|
*/
|
|
const setConversationPermissions = async (token, permissions) => {
|
|
await axios.put(generateOcsUrl('apps/spreed/api/v4/room/{token}/permissions/default', { token }),
|
|
{
|
|
permissions,
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Set the default permissions for participants in a call. These will be reset
|
|
* to default once the call has ended.
|
|
*
|
|
* @param {string} token conversation token
|
|
* @param {number} permissions the type of permission to be granted. Valid values are
|
|
* any sums of 'DEFAULT', 'CUSTOM', 'CALL_START', 'CALL_JOIN', 'LOBBY_IGNORE',
|
|
* 'PUBLISH_AUDIO', 'PUBLISH_VIDEO', 'PUBLISH_SCREEN'.
|
|
*/
|
|
const setCallPermissions = async (token, permissions) => {
|
|
await axios.put(generateOcsUrl('apps/spreed/api/v4/room/{token}/permissions/call', { token }),
|
|
{
|
|
permissions,
|
|
})
|
|
}
|
|
|
|
const validatePassword = async (password) => {
|
|
return await axios.post(generateOcsUrl('apps/password_policy/api/v1/validate'), {
|
|
password,
|
|
})
|
|
}
|
|
|
|
export {
|
|
fetchConversations,
|
|
fetchConversation,
|
|
searchListedConversations,
|
|
searchPossibleConversations,
|
|
createOneToOneConversation,
|
|
createGroupConversation,
|
|
createPrivateConversation,
|
|
createPublicConversation,
|
|
deleteConversation,
|
|
addToFavorites,
|
|
removeFromFavorites,
|
|
setNotificationLevel,
|
|
setNotificationCalls,
|
|
makePublic,
|
|
makePrivate,
|
|
setSIPEnabled,
|
|
changeLobbyState,
|
|
changeReadOnlyState,
|
|
changeListable,
|
|
setConversationPassword,
|
|
setConversationName,
|
|
setConversationDescription,
|
|
clearConversationHistory,
|
|
setConversationPermissions,
|
|
setCallPermissions,
|
|
validatePassword,
|
|
}
|