import { users, apiTokens, ldapConnections, activityLogs } from "@shared/schema"; import type { User, InsertUser, ApiToken, InsertApiToken, LdapConnection, InsertLdapConnection, ActivityLog, InsertActivityLog } from "@shared/schema"; import session from "express-session"; import createMemoryStore from "memorystore"; const MemoryStore = createMemoryStore(session); export interface IStorage { // Users getUser(id: number): Promise; getUserByUsername(username: string): Promise; createUser(user: InsertUser): Promise; updateUser(id: number, user: Partial): Promise; deleteUser(id: number): Promise; listUsers(filters?: any): Promise; // API Tokens getApiToken(id: number): Promise; getApiTokenByToken(token: string): Promise; createApiToken(token: InsertApiToken & { token: string }): Promise; updateApiToken(id: number, token: Partial): Promise; deleteApiToken(id: number): Promise; listApiTokens(userId?: number): Promise; // LDAP Connections getLdapConnection(id: number): Promise; createLdapConnection(connection: InsertLdapConnection): Promise; updateLdapConnection(id: number, connection: Partial): Promise; deleteLdapConnection(id: number): Promise; listLdapConnections(): Promise; // Activity Logs createActivityLog(log: InsertActivityLog): Promise; listActivityLogs(limit?: number): Promise; // Session Store sessionStore: session.SessionStore; } export class MemStorage implements IStorage { private users: Map; private apiTokens: Map; private ldapConnections: Map; private activityLogs: ActivityLog[]; currentUserId: number; currentTokenId: number; currentConnectionId: number; currentLogId: number; sessionStore: session.SessionStore; constructor() { this.users = new Map(); this.apiTokens = new Map(); this.ldapConnections = new Map(); this.activityLogs = []; this.currentUserId = 1; this.currentTokenId = 1; this.currentConnectionId = 1; this.currentLogId = 1; this.sessionStore = new MemoryStore({ checkPeriod: 86400000, // 24 hours }); } // Users async getUser(id: number): Promise { return this.users.get(id); } async getUserByUsername(username: string): Promise { return Array.from(this.users.values()).find( (user) => user.username.toLowerCase() === username.toLowerCase(), ); } async createUser(insertUser: InsertUser): Promise { const id = this.currentUserId++; const createdAt = new Date(); const user: User = { ...insertUser, id, createdAt }; this.users.set(id, user); return user; } async updateUser(id: number, updates: Partial): Promise { const user = this.users.get(id); if (!user) return undefined; const updatedUser = { ...user, ...updates }; this.users.set(id, updatedUser); return updatedUser; } async deleteUser(id: number): Promise { return this.users.delete(id); } async listUsers(filters?: any): Promise { const users = Array.from(this.users.values()); if (!filters) return users; // Apply filters if provided return users.filter(user => { for (const [key, value] of Object.entries(filters)) { if (user[key as keyof User] !== value) { return false; } } return true; }); } // API Tokens async getApiToken(id: number): Promise { return this.apiTokens.get(id); } async getApiTokenByToken(token: string): Promise { return Array.from(this.apiTokens.values()).find( (apiToken) => apiToken.token === token, ); } async createApiToken(tokenData: InsertApiToken & { token: string }): Promise { const id = this.currentTokenId++; const createdAt = new Date(); const apiToken: ApiToken = { ...tokenData, id, createdAt, lastUsedAt: null }; this.apiTokens.set(id, apiToken); return apiToken; } async updateApiToken(id: number, updates: Partial): Promise { const token = this.apiTokens.get(id); if (!token) return undefined; const updatedToken = { ...token, ...updates }; this.apiTokens.set(id, updatedToken); return updatedToken; } async deleteApiToken(id: number): Promise { return this.apiTokens.delete(id); } async listApiTokens(userId?: number): Promise { const tokens = Array.from(this.apiTokens.values()); if (userId === undefined) return tokens; return tokens.filter(token => token.userId === userId); } // LDAP Connections async getLdapConnection(id: number): Promise { return this.ldapConnections.get(id); } async createLdapConnection(connectionData: InsertLdapConnection): Promise { const id = this.currentConnectionId++; const ldapConnection: LdapConnection = { ...connectionData, id, status: "disconnected", lastConnected: null }; this.ldapConnections.set(id, ldapConnection); return ldapConnection; } async updateLdapConnection(id: number, updates: Partial): Promise { const connection = this.ldapConnections.get(id); if (!connection) return undefined; const updatedConnection = { ...connection, ...updates }; this.ldapConnections.set(id, updatedConnection); return updatedConnection; } async deleteLdapConnection(id: number): Promise { return this.ldapConnections.delete(id); } async listLdapConnections(): Promise { return Array.from(this.ldapConnections.values()); } // Activity Logs async createActivityLog(logData: InsertActivityLog): Promise { const id = this.currentLogId++; const timestamp = new Date(); const log: ActivityLog = { ...logData, id, timestamp }; this.activityLogs.push(log); return log; } async listActivityLogs(limit = 10): Promise { // Sort by timestamp descending (newest first) return [...this.activityLogs] .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime()) .slice(0, limit); } } export const storage = new MemStorage();