Mega push vol 5, working on messaging now

This commit is contained in:
AlacrisDevs
2026-02-07 01:31:55 +02:00
parent d8bbfd9dc3
commit e55881b38b
77 changed files with 8478 additions and 1554 deletions

View File

@@ -19,27 +19,17 @@ export const load: LayoutServerLoad = async ({ params, locals }) => {
error(404, 'Organization not found');
}
// Now fetch membership, members, and activity in parallel (all depend on org.id)
const [membershipResult, membersResult, activityResult] = await Promise.all([
// Now fetch membership, members, activity, and user profile in parallel (all depend on org.id)
const [membershipResult, membersResult, activityResult, profileResult, docCountResult, folderCountResult, kanbanCountResult] = await Promise.all([
locals.supabase
.from('org_members')
.select('role')
.select('role, role_id')
.eq('org_id', org.id)
.eq('user_id', user.id)
.single(),
locals.supabase
.from('org_members')
.select(`
id,
user_id,
role,
profiles:user_id (
id,
email,
full_name,
avatar_url
)
`)
.select('id, user_id, role')
.eq('org_id', org.id)
.limit(10),
locals.supabase
@@ -58,23 +48,87 @@ export const load: LayoutServerLoad = async ({ params, locals }) => {
`)
.eq('org_id', org.id)
.order('created_at', { ascending: false })
.limit(10)
.limit(10),
locals.supabase
.from('profiles')
.select('id, email, full_name, avatar_url')
.eq('id', user.id)
.single(),
locals.supabase
.from('documents')
.select('id', { count: 'exact', head: true })
.eq('org_id', org.id)
.eq('type', 'document'),
locals.supabase
.from('documents')
.select('id', { count: 'exact', head: true })
.eq('org_id', org.id)
.eq('type', 'folder'),
locals.supabase
.from('documents')
.select('id', { count: 'exact', head: true })
.eq('org_id', org.id)
.eq('type', 'kanban')
]);
const { data: membership } = membershipResult;
const { data: members } = membersResult;
const { data: rawMembers } = membersResult;
const { data: recentActivity } = activityResult;
const { data: profile } = profileResult;
const stats = {
memberCount: (rawMembers ?? []).length,
documentCount: docCountResult.count ?? 0,
folderCount: folderCountResult.count ?? 0,
kanbanCount: kanbanCountResult.count ?? 0,
};
if (!membership) {
error(403, 'You are not a member of this organization');
}
// Resolve user's permissions from their custom org_role (if assigned)
let userPermissions: string[] | null = null;
if (membership.role_id) {
const { data: roleData } = await locals.supabase
.from('org_roles')
.select('permissions')
.eq('id', membership.role_id)
.single();
if (roleData?.permissions && Array.isArray(roleData.permissions)) {
userPermissions = roleData.permissions as string[];
}
}
// Fetch profiles separately since org_members.user_id FK points to auth.users, not profiles
const memberUserIds = (rawMembers ?? []).map(m => m.user_id).filter((id): id is string => id !== null);
let memberProfilesMap: Record<string, { id: string; email: string; full_name: string | null; avatar_url: string | null }> = {};
if (memberUserIds.length > 0) {
const { data: memberProfiles } = await locals.supabase
.from('profiles')
.select('id, email, full_name, avatar_url')
.in('id', memberUserIds);
if (memberProfiles) {
memberProfilesMap = Object.fromEntries(memberProfiles.map(p => [p.id, p]));
}
}
const members = (rawMembers ?? []).map(m => ({
...m,
profiles: (m.user_id ? memberProfilesMap[m.user_id] : null) ?? null
}));
return {
org,
role: membership.role,
userRole: membership.role, // kept for backwards compat — same as role
members: members ?? [],
userRole: membership.role,
userPermissions,
members,
recentActivity: recentActivity ?? [],
user
stats,
user,
profile: profile ?? { id: user.id, email: user.email ?? '', full_name: null, avatar_url: null }
};
};