import { type User, type Profile, type Project } from "@shared/schema"; import { supabase } from "./supabase"; export interface IStorage { // Users getUser(id: string): Promise; getUserByUsername(username: string): Promise; // Profiles getProfiles(): Promise; getProfile(id: string): Promise; getProfileByUsername(username: string): Promise; updateProfile(id: string, data: Partial): Promise; // Projects getProjects(): Promise; getProject(id: string): Promise; // Metrics getMetrics(): Promise<{ totalProfiles: number; totalProjects: number; onlineUsers: number; verifiedUsers: number; totalXP: number; avgLevel: number; }>; } export class SupabaseStorage implements IStorage { async getUser(id: string): Promise { const { data, error } = await supabase .from('users') .select('*') .eq('id', id) .single(); if (error || !data) return undefined; return data as User; } async getUserByUsername(username: string): Promise { const { data, error } = await supabase .from('users') .select('*') .eq('username', username) .single(); if (error || !data) return undefined; return data as User; } async getProfiles(): Promise { const { data, error } = await supabase .from('profiles') .select('*') .order('created_at', { ascending: false }); if (error) return []; return data as Profile[]; } async getProfile(id: string): Promise { const { data, error } = await supabase .from('profiles') .select('*') .eq('id', id) .single(); if (error || !data) return undefined; return data as Profile; } async getProfileByUsername(username: string): Promise { const { data, error } = await supabase .from('profiles') .select('*') .eq('username', username) .single(); if (error || !data) return undefined; return data as Profile; } async updateProfile(id: string, updates: Partial): Promise { const { data, error } = await supabase .from('profiles') .update({ ...updates, updated_at: new Date().toISOString() }) .eq('id', id) .select() .single(); if (error || !data) return undefined; return data as Profile; } async getProjects(): Promise { const { data, error } = await supabase .from('projects') .select('*') .order('created_at', { ascending: false }); if (error) return []; return data as Project[]; } async getProject(id: string): Promise { const { data, error } = await supabase .from('projects') .select('*') .eq('id', id) .single(); if (error || !data) return undefined; return data as Project; } async getMetrics(): Promise<{ totalProfiles: number; totalProjects: number; onlineUsers: number; verifiedUsers: number; totalXP: number; avgLevel: number; }> { // Get profiles for metrics const profiles = await this.getProfiles(); const projects = await this.getProjects(); const onlineUsers = profiles.filter(p => p.status === 'online').length; const verifiedUsers = profiles.filter(p => p.is_verified).length; const totalXP = profiles.reduce((sum, p) => sum + (p.total_xp || 0), 0); const avgLevel = profiles.length > 0 ? profiles.reduce((sum, p) => sum + (p.level || 1), 0) / profiles.length : 1; return { totalProfiles: profiles.length, totalProjects: projects.length, onlineUsers, verifiedUsers, totalXP, avgLevel: Math.round(avgLevel * 10) / 10, }; } } export const storage = new SupabaseStorage();