Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/lib/actions/analytics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ export enum Submit {
FilterApply = 'submit_filter_apply',
UserCreate = 'submit_user_create',
UserDelete = 'submit_user_delete',
UserDeleteAll = 'submit_user_delete_all',
UserUpdateEmail = 'submit_user_update_email',
UserUpdateLabels = 'submit_user_update_labels',
UserUpdateName = 'submit_user_update_name',
Expand All @@ -234,8 +235,10 @@ export enum Submit {
UserUpdateVerificationEmail = 'submit_user_update_verification_email',
UserUpdateVerificationPhone = 'submit_user_update_verification_phone',
UserIdentityDelete = 'submit_user_identity_delete',
UserIdentityDeleteAll = 'submit_user_identity_delete_all',
UserTargetCreate = 'submit_user_target_create',
UserTargetDelete = 'submit_user_target_delete',
UserTargetDeleteAll = 'submit_user_target_delete_all',
UserAuthenticatorDelete = 'submit_user_authenticator_delete',
OrganizationCreate = 'submit_organization_create',
OrganizationDelete = 'submit_organization_delete',
Expand All @@ -250,11 +253,13 @@ export enum Submit {
MemberDelete = 'submit_member_delete',
MembershipUpdate = 'submit_membership_update',
MembershipUpdateStatus = 'submit_membership_update_status',
MembershipDeleteAll = 'submit_membership_delete_all',
MessagingTargetUpdate = 'submit_messaging_target_update',
MessagingUpdateHtmlMode = 'submit_update_html_mode',
ProviderUpdate = 'submit_provider_update',
TeamCreate = 'submit_team_create',
TeamDelete = 'submit_team_delete',
TeamDeleteAll = 'submit_team_delete_all',
TeamUpdatePreferences = 'submit_team_update_preferences',
TeamUpdateName = 'submit_team_update_name',
AuthLimitUpdate = 'submit_auth_limit_update',
Expand Down Expand Up @@ -355,6 +360,7 @@ export enum Submit {
BucketUpdateExtensions = 'submit_bucket_update_extensions',
FileCreate = 'submit_file_create',
FileDelete = 'submit_file_delete',
FileDeleteAll = 'submit_file_delete_all',
FileUpdatePermissions = 'submit_file_update_permissions',
FileTokenCreate = 'submit_file_token',
FileTokenDelete = 'submit_file_delete',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<script lang="ts" context="module">
export let showCreateUser = writable(false);
export let showDeleteAllUsers = writable(false);
</script>

<script lang="ts">
Expand All @@ -20,6 +21,7 @@
import type { Models } from '@appwrite.io/console';
import { writable } from 'svelte/store';
import Create from './createUser.svelte';
import DeleteAllUsers from './deleteAllUsers.svelte';
import { Badge, Icon, Table, Layout, Typography } from '@appwrite.io/pink-svelte';
import { Tag } from '@appwrite.io/pink-svelte';
import { IconDuplicate, IconPlus } from '@appwrite.io/pink-icons-svelte';
Expand Down Expand Up @@ -60,6 +62,11 @@
</Layout.Stack>
<Layout.Stack direction="row" alignItems="center" justifyContent="flex-end">
<ViewSelector view={View.Table} {columns} hideView />
{#if data.users.total}
<Button secondary on:click={() => ($showDeleteAllUsers = true)} size="s">
<span class="text">Delete All</span>
</Button>
{/if}
<Button on:click={() => ($showCreateUser = true)} event="create_user" size="s">
<Icon size="s" icon={IconPlus} slot="start" />
<span class="text">Create user</span>
Expand Down Expand Up @@ -178,3 +185,4 @@
</Container>

<Create bind:showCreate={$showCreateUser} on:created={userCreated} />
<DeleteAllUsers bind:showDeleteAll={$showDeleteAllUsers} />
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<script lang="ts">
import { invalidateAll } from '$app/navigation';
import { page } from '$app/state';
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
import Confirm from '$lib/components/confirm.svelte';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';

export let showDeleteAll = false;

let error: string;

async function deleteAllUsers() {
try {
const users = await sdk
.forProject(page.params.region, page.params.project)
.users.list();

if (users.users.length === 0) {
addNotification({
type: 'info',
message: 'No users to delete'
});
showDeleteAll = false;
return;
}

const promises = users.users.map((user) =>
sdk.forProject(page.params.region, page.params.project).users.delete(user.$id)
);

await Promise.all(promises);
showDeleteAll = false;
await invalidateAll();

addNotification({
type: 'success',
message: `${users.users.length} user${users.users.length > 1 ? 's' : ''} have been deleted`
});
trackEvent(Submit.UserDeleteAll);
} catch (e) {
error = e.message;
trackError(e, Submit.UserDeleteAll);
}
}
</script>

<Confirm onSubmit={deleteAllUsers} title="Delete all users" bind:open={showDeleteAll} bind:error>
Are you sure you want to delete all users? This action is irreversible.
</Confirm>
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<script lang="ts" context="module">
export let showCreateTeam = writable(false);
export let showDeleteAllTeams = writable(false);
</script>

<script lang="ts">
Expand All @@ -13,6 +14,7 @@
PaginationWithLimit
} from '$lib/components';
import Create from '../createTeam.svelte';
import DeleteAllTeams from './deleteAllTeams.svelte';
import { goto } from '$app/navigation';
import { Container } from '$lib/layout';
import { base } from '$app/paths';
Expand All @@ -38,6 +40,11 @@
<SearchQuery placeholder="Search by name" />
</Layout.Stack>
<Layout.Stack direction="row" alignItems="center" justifyContent="flex-end">
{#if data.teams.total}
<Button secondary on:click={() => ($showDeleteAllTeams = true)} size="s">
<span class="text">Delete All</span>
</Button>
{/if}
<Button on:mousedown={() => ($showCreateTeam = true)} event="create_user" size="s">
<Icon icon={IconPlus} slot="start" size="s" />
Create team
Expand Down Expand Up @@ -94,3 +101,4 @@
</Container>

<Create bind:showCreate={$showCreateTeam} on:created={teamCreated} />
<DeleteAllTeams bind:showDeleteAll={$showDeleteAllTeams} />
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<script lang="ts">
import { invalidateAll } from '$app/navigation';
import { page } from '$app/state';
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
import Confirm from '$lib/components/confirm.svelte';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';

export let showDeleteAll = false;

let error: string;

async function deleteAllTeams() {
try {
const teams = await sdk
.forProject(page.params.region, page.params.project)
.teams.list();

if (teams.teams.length === 0) {
addNotification({
type: 'info',
message: 'No teams to delete'
});
showDeleteAll = false;
return;
}

const promises = teams.teams.map((team) =>
sdk.forProject(page.params.region, page.params.project).teams.delete(team.$id)
);

await Promise.all(promises);

showDeleteAll = false;

await invalidateAll();

addNotification({
type: 'success',
message: `${teams.teams.length} team${teams.teams.length > 1 ? 's' : ''} have been deleted`
});
trackEvent(Submit.TeamDeleteAll);
} catch (e) {
error = e.message;
trackError(e, Submit.TeamDeleteAll);
}
}
</script>

<Confirm onSubmit={deleteAllTeams} title="Delete all teams" bind:open={showDeleteAll} bind:error>
Are you sure you want to delete all teams? This action is irreversible.
</Confirm>
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<script lang="ts">
import { invalidateAll } from '$app/navigation';
import { page } from '$app/state';
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
import Confirm from '$lib/components/confirm.svelte';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
import { user } from './store';

export let showDeleteAll = false;

let error: string;

async function deleteAllIdentities() {
try {
const identities = await sdk
.forProject(page.params.region, page.params.project)
.users.listIdentities([], '1000');

if (identities.identities.length === 0) {
addNotification({
type: 'info',
message: 'No identities to delete'
});
showDeleteAll = false;
return;
}

const promises = identities.identities.map((identity) =>
sdk
.forProject(page.params.region, page.params.project)
.users.deleteIdentity(identity.$id)
);

await Promise.all(promises);
showDeleteAll = false;
await invalidateAll();

addNotification({
type: 'success',
message: `${identities.identities.length} identit${identities.identities.length > 1 ? 'ies' : 'y'} for ${$user?.name || 'User'} have been deleted`
});
trackEvent(Submit.UserIdentityDeleteAll);
} catch (e) {
error = e.message;
trackError(e, Submit.UserIdentityDeleteAll);
}
}
</script>

<Confirm
onSubmit={deleteAllIdentities}
title="Delete all identities"
bind:open={showDeleteAll}
bind:error>
Are you sure you want to delete all identities for {$user?.name || 'User'}? This action is
irreversible.
</Confirm>
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<script lang="ts">
import { invalidateAll } from '$app/navigation';
import { page } from '$app/state';
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
import Confirm from '$lib/components/confirm.svelte';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
import { user } from './store';

export let showDeleteAll = false;

let error: string;

async function deleteAllMemberships() {
try {
const memberships = await sdk
.forProject(page.params.region, page.params.project)
.users.listMemberships(page.params.user);

if (memberships.memberships.length === 0) {
addNotification({
type: 'info',
message: 'No memberships to delete'
});
showDeleteAll = false;
return;
}

const promises = memberships.memberships.map((membership) =>
sdk
.forProject(page.params.region, page.params.project)
.teams.deleteMembership(membership.teamId, membership.$id)
);

await Promise.all(promises);
showDeleteAll = false;
await invalidateAll();

addNotification({
type: 'success',
message: `${memberships.memberships.length} membership${memberships.memberships.length > 1 ? 's' : ''} for ${$user?.name || 'User'} have been deleted`
});
trackEvent(Submit.MembershipDeleteAll);
} catch (e) {
error = e.message;
trackError(e, Submit.MembershipDeleteAll);
}
}
</script>

<Confirm
onSubmit={deleteAllMemberships}
title="Delete all memberships"
bind:open={showDeleteAll}
bind:error>
Are you sure you want to delete all memberships for {$user?.name || 'User'}? This action is
irreversible.
</Confirm>
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<script lang="ts">
import { invalidateAll } from '$app/navigation';
import { page } from '$app/state';
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
import Confirm from '$lib/components/confirm.svelte';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
import { user } from './store';

export let showDeleteAll = false;

let error: string;

async function deleteAllTargets() {
try {
const targets = await sdk
.forProject(page.params.region, page.params.project)
.users.listTargets(page.params.user, ['1000']);

if (targets.targets.length === 0) {
addNotification({
type: 'info',
message: 'No targets to delete'
});
showDeleteAll = false;
return;
}

const promises = targets.targets.map((target) =>
sdk
.forProject(page.params.region, page.params.project)
.users.deleteTarget(page.params.user, target.$id)
);

await Promise.all(promises);

showDeleteAll = false;

await invalidateAll();

addNotification({
type: 'success',
message: `${targets.targets.length} target${targets.targets.length > 1 ? 's' : ''} for ${$user?.name || 'User'} have been deleted`
});
trackEvent(Submit.UserTargetDeleteAll);
} catch (e) {
error = e.message;
trackError(e, Submit.UserTargetDeleteAll);
}
}
</script>

<Confirm
onSubmit={deleteAllTargets}
title="Delete all targets"
bind:open={showDeleteAll}
bind:error>
Are you sure you want to delete all targets for {$user?.name || 'User'}? This action is
irreversible.
</Confirm>
Loading