52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
import type { PageServerLoad } from './$types';
|
|
import { isS3Enabled } from '$lib/server/storage';
|
|
import { getVisibleLevels } from '$lib/server/visibility';
|
|
|
|
export const load: PageServerLoad = async ({ locals, parent, url }) => {
|
|
const { member } = await parent();
|
|
const searchQuery = url.searchParams.get('q') || '';
|
|
|
|
// Get visible visibility levels
|
|
const visibleLevels = getVisibleLevels(member?.role);
|
|
|
|
// Build query
|
|
let query = locals.supabase
|
|
.from('documents')
|
|
.select('*')
|
|
.in('visibility', visibleLevels)
|
|
.order('created_at', { ascending: false });
|
|
|
|
// Apply server-side search if query provided
|
|
if (searchQuery.trim()) {
|
|
// Use ilike for simple substring search (works without tsvector)
|
|
// Also try full-text search via textSearch if available
|
|
query = query.or(`title.ilike.%${searchQuery}%,description.ilike.%${searchQuery}%,file_name.ilike.%${searchQuery}%`);
|
|
}
|
|
|
|
const { data: documents } = await query;
|
|
|
|
// Fetch categories
|
|
const { data: categories } = await locals.supabase
|
|
.from('document_categories')
|
|
.select('*')
|
|
.eq('is_active', true)
|
|
.order('sort_order', { ascending: true });
|
|
|
|
// Resolve active URL for each document based on current storage settings
|
|
const s3Enabled = await isS3Enabled();
|
|
const documentsWithActiveUrl = (documents || []).map((doc: any) => ({
|
|
...doc,
|
|
// Compute active URL based on storage setting
|
|
active_url: s3Enabled
|
|
? (doc.file_url_s3 || doc.file_path)
|
|
: (doc.file_url_local || doc.file_path)
|
|
}));
|
|
|
|
return {
|
|
documents: documentsWithActiveUrl,
|
|
categories: categories || [],
|
|
searchQuery
|
|
};
|
|
};
|
|
|