cloud fixes

This commit is contained in:
SPRINX0\prochazka
2025-05-26 12:06:33 +02:00
parent 716c3573fd
commit 98e4fabd2e
3 changed files with 51 additions and 8 deletions

View File

@@ -70,7 +70,10 @@ module.exports = {
grantFolder_meta: true, grantFolder_meta: true,
async grantFolder({ inviteLink }) { async grantFolder({ inviteLink }) {
const m = inviteLink.match(/^dbgate\:\/\/folder\/v1\/([a-zA-Z]+)\?mode=(read|write|admin)$/); const m = inviteLink.match(/^dbgate\:\/\/folder\/v1\/([a-zA-Z0-9]+)\?mode=(read|write|admin)$/);
if (!m) {
throw new Error('Invalid invite link format');
}
const invite = m[1]; const invite = m[1];
const mode = m[2]; const mode = m[2];
@@ -93,6 +96,12 @@ module.exports = {
return resp; return resp;
}, },
getInviteToken_meta: true,
async getInviteToken({ folid, role }) {
const resp = await callCloudApiGet(`invite-token/${folid}/${role}`);
return resp;
},
refreshContent_meta: true, refreshContent_meta: true,
async refreshContent() { async refreshContent() {
socket.emitChanged('cloud-content-changed'); socket.emitChanged('cloud-content-changed');

View File

@@ -56,13 +56,15 @@ function startCloudTokenChecking(sid, callback) {
} }
try { try {
// console.log(`Checking cloud token for session: ${DBGATE_IDENTITY_URL}/api/get-token/${sid}`);
const resp = await axios.default.get(`${DBGATE_IDENTITY_URL}/api/get-token/${sid}`, { const resp = await axios.default.get(`${DBGATE_IDENTITY_URL}/api/get-token/${sid}`, {
headers: { headers: {
...getLicenseHttpHeaders(), ...getLicenseHttpHeaders(),
}, },
}); });
// console.log('CHECK RESP:', resp.data);
if (resp.data.status == 'ok') { if (resp.data.email) {
clearInterval(interval); clearInterval(interval);
callback(resp.data); callback(resp.data);
} }

View File

@@ -31,6 +31,7 @@
import { showModal } from '../modals/modalTools'; import { showModal } from '../modals/modalTools';
import InputTextModal from '../modals/InputTextModal.svelte'; import InputTextModal from '../modals/InputTextModal.svelte';
import ConfirmModal from '../modals/ConfirmModal.svelte'; import ConfirmModal from '../modals/ConfirmModal.svelte';
import { showSnackbarInfo } from '../utility/snackbar';
let publicFilter = ''; let publicFilter = '';
let cloudFilter = ''; let cloudFilter = '';
@@ -56,9 +57,10 @@
return data; return data;
}); });
$: contentGroupTitleMap = _.fromPairs(($cloudContentList || []).map(x => [x.folid, x.name])); $: contentGroupMap = _.keyBy($cloudContentList || [], x => x.folid);
// $: console.log('cloudContentFlat', cloudContentFlat); // $: console.log('cloudContentFlat', cloudContentFlat);
// $: console.log('contentGroupMap', contentGroupMap);
async function handleRefreshContent() { async function handleRefreshContent() {
await apiCall('cloud/refresh-content'); await apiCall('cloud/refresh-content');
@@ -115,7 +117,7 @@
function createGroupContextMenu(folder) { function createGroupContextMenu(folder) {
const handleRename = () => { const handleRename = () => {
showModal(InputTextModal, { showModal(InputTextModal, {
value: contentGroupTitleMap[folder], value: contentGroupMap[folder]?.name,
label: 'New folder name', label: 'New folder name',
header: 'Rename folder', header: 'Rename folder',
onConfirm: async name => { onConfirm: async name => {
@@ -129,7 +131,7 @@
const handleDelete = () => { const handleDelete = () => {
showModal(ConfirmModal, { showModal(ConfirmModal, {
message: `Really delete folder ${contentGroupTitleMap[folder]}? All folder content will be deleted!`, message: `Really delete folder ${contentGroupMap[folder]?.name}? All folder content will be deleted!`,
header: 'Delete folder', header: 'Delete folder',
onConfirm: () => { onConfirm: () => {
apiCall('cloud/delete-folder', { apiCall('cloud/delete-folder', {
@@ -139,9 +141,39 @@
}); });
}; };
const handleCopyInviteLink = async role => {
const { inviteToken } = await apiCall(`cloud/get-invite-token`, {
folid: folder,
role,
});
const inviteLink = `dbgate://folder/v1/${inviteToken}?mode=${role}`;
navigator.clipboard.writeText(inviteLink);
showSnackbarInfo(`Invite link (${role}) copied to clipboard`);
};
return [ return [
{ text: 'Rename', onClick: handleRename }, contentGroupMap[folder]?.role == 'admin' && [
{ text: 'Delete', onClick: handleDelete }, { text: 'Rename', onClick: handleRename },
{ text: 'Delete', onClick: handleDelete },
],
contentGroupMap[folder]?.role == 'admin' &&
!contentGroupMap[folder]?.isPrivate && {
text: 'Copy invite link',
submenu: [
{
text: 'Admin',
onClick: () => handleCopyInviteLink('admin'),
},
{
text: 'Write',
onClick: () => handleCopyInviteLink('write'),
},
{
text: 'Read',
onClick: () => handleCopyInviteLink('read'),
},
],
},
]; ];
} }
</script> </script>
@@ -172,7 +204,7 @@
module={cloudContentAppObject} module={cloudContentAppObject}
emptyGroupNames={emptyCloudContent} emptyGroupNames={emptyCloudContent}
groupFunc={data => data.folid} groupFunc={data => data.folid}
mapGroupTitle={folid => contentGroupTitleMap[folid]} mapGroupTitle={folid => contentGroupMap[folid]?.name}
filter={publicFilter} filter={publicFilter}
subItemsComponent={() => SubCloudItemsList} subItemsComponent={() => SubCloudItemsList}
expandIconFunc={plusExpandIcon} expandIconFunc={plusExpandIcon}