mirror of
https://github.com/supabase/supabase.git
synced 2026-05-15 07:14:04 +08:00
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Ivan Vasilov <vasilov.ivan@gmail.com>
79 lines
2.3 KiB
TypeScript
79 lines
2.3 KiB
TypeScript
import * as Sentry from '@sentry/nextjs'
|
|
import { SupportCategories } from '@supabase/shared-types/out/constants'
|
|
|
|
import { createSupportStorageClient } from './support-storage-client'
|
|
import type { ExtendedSupportCategories } from './Support.constants'
|
|
import type {
|
|
GenerateAttachmentURLsData,
|
|
GenerateAttachmentURLsVariables,
|
|
} from '@/data/support/generate-attachment-urls-mutation'
|
|
import { getMirroredBreadcrumbs, getOwnershipOfBreadcrumbSnapshot } from '@/lib/breadcrumbs'
|
|
import { uuidv4 } from '@/lib/helpers'
|
|
import { sanitizeArrayOfObjects } from '@/lib/sanitize'
|
|
|
|
export type DashboardBreadcrumb = Sentry.Breadcrumb
|
|
|
|
export const DASHBOARD_LOG_BUCKET = 'dashboard-logs'
|
|
|
|
export const DASHBOARD_LOG_CATEGORIES: ExtendedSupportCategories[] = [
|
|
SupportCategories.DASHBOARD_BUG,
|
|
]
|
|
|
|
export const getSanitizedBreadcrumbs = (): unknown[] => {
|
|
const breadcrumbs = getOwnershipOfBreadcrumbSnapshot() ?? getMirroredBreadcrumbs()
|
|
return sanitizeArrayOfObjects(breadcrumbs)
|
|
}
|
|
|
|
export const uploadDashboardLog = async ({
|
|
userId,
|
|
sanitizedLogs,
|
|
uploadDashboardLogFn,
|
|
}: {
|
|
userId: string | undefined
|
|
sanitizedLogs: unknown[]
|
|
uploadDashboardLogFn: (
|
|
vars: GenerateAttachmentURLsVariables
|
|
) => Promise<GenerateAttachmentURLsData>
|
|
}): Promise<string[]> => {
|
|
if (!userId) {
|
|
console.error(
|
|
'[SupportForm > uploadDashboardLog] Cannot upload dashboard log: user ID is undefined'
|
|
)
|
|
return []
|
|
}
|
|
|
|
if (sanitizedLogs.length === 0) return []
|
|
|
|
try {
|
|
const supportStorageClient = createSupportStorageClient()
|
|
const objectKey = `${userId}/${uuidv4()}.json`
|
|
const body = new Blob([JSON.stringify(sanitizedLogs, null, 2)], {
|
|
type: 'application/json',
|
|
})
|
|
|
|
const { error: uploadError } = await supportStorageClient.storage
|
|
.from(DASHBOARD_LOG_BUCKET)
|
|
.upload(objectKey, body, {
|
|
cacheControl: '3600',
|
|
contentType: 'application/json',
|
|
upsert: false,
|
|
})
|
|
|
|
if (uploadError) {
|
|
console.error(
|
|
'[SupportForm > uploadDashboardLog] Failed to upload dashboard log to support storage bucket',
|
|
uploadError
|
|
)
|
|
return []
|
|
}
|
|
|
|
return uploadDashboardLogFn({
|
|
bucket: DASHBOARD_LOG_BUCKET,
|
|
filenames: [objectKey],
|
|
})
|
|
} catch (error) {
|
|
console.error('[SupportForm] Unexpected error uploading dashboard log', error)
|
|
return []
|
|
}
|
|
}
|