AeThex-OS/server/storage.ts
sirpiglr 5f40710e82 Add new admin dashboard sections and enhance Aegis monitor functionality
Introduce new admin routes for sites, logs, and achievements, refactor Aegis monitor to display real data from alerts and auth_logs, and implement JWT token generation for authentication.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 279f1558-c0e3-40e4-8217-be7e9f4c6eca
Replit-Commit-Checkpoint-Type: intermediate_checkpoint
Replit-Commit-Event-Id: 48e7daad-43dd-4684-8441-ff2ea20129e1
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/b984cb14-1d19-4944-922b-bc79e821ed35/279f1558-c0e3-40e4-8217-be7e9f4c6eca/HbU8yEz
Replit-Helium-Checkpoint-Created: true
2025-12-15 23:00:05 +00:00

229 lines
5.8 KiB
TypeScript

import { type User, type Profile, type Project } from "@shared/schema";
import { supabase } from "./supabase";
export interface IStorage {
// Users
getUser(id: string): Promise<User | undefined>;
getUserByUsername(username: string): Promise<User | undefined>;
// Sessions
createSession(session: { user_id: string; username: string; token: string; expires_at: string }): Promise<any>;
// Profiles
getProfiles(): Promise<Profile[]>;
getProfile(id: string): Promise<Profile | undefined>;
getProfileByUsername(username: string): Promise<Profile | undefined>;
updateProfile(id: string, data: Partial<Profile>): Promise<Profile | undefined>;
// Projects
getProjects(): Promise<Project[]>;
getProject(id: string): Promise<Project | undefined>;
// Sites
getSites(): Promise<any[]>;
// Auth Logs
getAuthLogs(): Promise<any[]>;
// Achievements
getAchievements(): Promise<any[]>;
// Applications
getApplications(): Promise<any[]>;
// Alerts
getAlerts(): Promise<any[]>;
// 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<User | undefined> {
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<User | undefined> {
const { data, error } = await supabase
.from('users')
.select('*')
.eq('username', username)
.single();
if (error || !data) return undefined;
return data as User;
}
async createSession(session: { user_id: string; username: string; token: string; expires_at: string }): Promise<any> {
const { data, error } = await supabase
.from('sessions')
.insert(session)
.select()
.single();
if (error) throw error;
return data;
}
async getProfiles(): Promise<Profile[]> {
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<Profile | undefined> {
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<Profile | undefined> {
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<Profile>): Promise<Profile | undefined> {
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<Project[]> {
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<Project | undefined> {
const { data, error } = await supabase
.from('projects')
.select('*')
.eq('id', id)
.single();
if (error || !data) return undefined;
return data as Project;
}
async getSites(): Promise<any[]> {
const { data, error } = await supabase
.from('aethex_sites')
.select('*')
.order('last_check', { ascending: false });
if (error) return [];
return data || [];
}
async getAuthLogs(): Promise<any[]> {
const { data, error } = await supabase
.from('auth_logs')
.select('*')
.order('created_at', { ascending: false })
.limit(100);
if (error) return [];
return data || [];
}
async getAchievements(): Promise<any[]> {
const { data, error } = await supabase
.from('achievements')
.select('*')
.order('name', { ascending: true });
if (error) return [];
return data || [];
}
async getApplications(): Promise<any[]> {
const { data, error } = await supabase
.from('applications')
.select('*')
.order('submitted_at', { ascending: false });
if (error) return [];
return data || [];
}
async getAlerts(): Promise<any[]> {
const { data, error } = await supabase
.from('aethex_alerts')
.select('*')
.order('created_at', { ascending: false })
.limit(50);
if (error) return [];
return data || [];
}
async getMetrics(): Promise<{
totalProfiles: number;
totalProjects: number;
onlineUsers: number;
verifiedUsers: number;
totalXP: number;
avgLevel: number;
}> {
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();