Browse Source

Update Database.svelte

Classic298 2 months ago
parent
commit
0d1b06d87c
1 changed files with 62 additions and 0 deletions
  1. 62 0
      src/lib/components/admin/Settings/Database.svelte

+ 62 - 0
src/lib/components/admin/Settings/Database.svelte

@@ -7,6 +7,7 @@
 	import { config, user } from '$lib/stores';
 	import { toast } from 'svelte-sonner';
 	import { getAllUserChats } from '$lib/apis/chats';
+	import { getAllUsers } from '$lib/apis/users';
 	import { exportConfig, importConfig } from '$lib/apis/configs';
 
 	const i18n = getContext('i18n');
@@ -20,6 +21,41 @@
 		saveAs(blob, `all-chats-export-${Date.now()}.json`);
 	};
 
+	const exportUsers = async () => {
+		const users = await getAllUsers(localStorage.token);
+
+		const headers = [
+			'id',
+			'name',
+			'email',
+			'role',
+			'profile_image_url',
+			'last_active_at',
+			'updated_at',
+			'created_at',
+			'api_key',
+			'settings',
+			'info'
+		];
+
+		const csv = [
+			headers.join(','),
+			...users.users.map((user) => {
+				return headers
+					.map((header) => {
+						if (header === 'settings' || header === 'info') {
+							return JSON.stringify(user[header]);
+						}
+						return user[header];
+					})
+					.join(',');
+			})
+		].join('\n');
+
+		const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
+		saveAs(blob, 'users.csv');
+	};
+
 	onMount(async () => {
 		// permissions = await getUserPermissions(localStorage.token);
 	});
@@ -180,6 +216,32 @@
 						{$i18n.t('Export All Chats (All Users)')}
 					</div>
 				</button>
+
+				<button
+					class=" flex rounded-md py-2 px-3 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition"
+					on:click={() => {
+						exportUsers();
+					}}
+				>
+					<div class=" self-center mr-3">
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							viewBox="0 0 16 16"
+							fill="currentColor"
+							class="w-4 h-4"
+						>
+							<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" />
+							<path
+								fill-rule="evenodd"
+								d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM8.75 7.75a.75.75 0 0 0-1.5 0v2.69L6.03 9.22a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l2.5-2.5a.75.75 0 1 0-1.06-1.06l-1.22 1.22V7.75Z"
+								clip-rule="evenodd"
+							/>
+						</svg>
+					</div>
+					<div class=" self-center text-sm font-medium">
+						{$i18n.t('Export Users')}
+					</div>
+				</button>
 			{/if}
 		</div>
 	</div>