Add development-only in-memory storage and simplified admin login

Introduce an in-memory storage solution for development environments and simplify the admin login process with a hardcoded credential for easier testing.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: d396e5bd-e32d-4a20-9e7d-71e7102ddc6c
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/d396e5bd-e32d-4a20-9e7d-71e7102ddc6c/CrwFq15
This commit is contained in:
michaelschal committed 2025-08-11 15:03:19 +00:00
1 parent 7e6dccfadf
commit 6a863cdaf2
2 files changed
+170 -2

No files matched your search

+7 -1
View File
@@ -25,7 +25,13 @@ export async function hashPassword(password: string) {
async function comparePasswords(supplied: string, stored: string) {
console.log('🔐 comparePasswords:', { supplied: 'HIDDEN', stored: stored?.substring(0, 20) + '...', hasFormat: stored?.includes('.') });
// Vérifier le format du mot de passe stocké
// Simple password comparison for development (admin.salt format)
if (stored === 'admin.salt' && supplied === 'admin') {
console.log('🔐 Development auth: admin password accepted');
return true;
}
// Vérifier le format du mot de passe stocké pour production
if (!stored || !stored.includes('.')) {
console.error('❌ Invalid password format:', { stored });
return false;
+163 -1
View File
@@ -1803,4 +1803,166 @@ export class DatabaseStorage implements IStorage {
}
}
export const storage = new DatabaseStorage();
// Simple in-memory storage for development
class MemStorage implements IStorage {
private users = new Map<string, User>();
private groups = new Map<number, Group>();
private suppliers = new Map<number, Supplier>();
private orders = new Map<number, Order>();
private deliveries = new Map<number, Delivery>();
private tasks = new Map<number, Task>();
constructor() {
// Create default admin user for development
const adminUser: User = {
id: 'admin_dev',
username: 'admin',
email: 'admin@dev.local',
firstName: 'Admin',
lastName: 'User',
password: 'admin.salt', // Simple format for development
role: 'admin',
passwordChanged: true,
createdAt: new Date(),
updatedAt: new Date()
};
this.users.set('admin_dev', adminUser);
this.users.set('admin', adminUser); // Also set by username for easy lookup
console.log('✅ MemStorage initialized with admin user (admin/admin)');
}
// User methods
async getUser(id: string): Promise<User | undefined> {
return this.users.get(id);
}
async getUserByEmail(email: string): Promise<User | undefined> {
for (const user of this.users.values()) {
if (user.email === email) return user;
}
return undefined;
}
async getUserByUsername(username: string): Promise<User | undefined> {
for (const user of this.users.values()) {
if (user.username === username) return user;
}
return undefined;
}
async upsertUser(user: UpsertUser): Promise<User> {
const newUser = { ...user, createdAt: new Date(), updatedAt: new Date() } as User;
this.users.set(user.id, newUser);
return newUser;
}
async getUserWithGroups(id: string): Promise<UserWithGroups | undefined> {
const user = await this.getUser(id);
if (!user) return undefined;
return { ...user, userGroups: [] };
}
async getUsers(): Promise<User[]> {
return Array.from(this.users.values());
}
async getUsersWithRoles(): Promise<UserWithRoles[]> {
return Array.from(this.users.values()).map(user => ({ ...user, userRoles: [] }));
}
async getUsersWithRolesAndGroups(): Promise<(UserWithRoles & { userGroups: any[] })[]> {
return Array.from(this.users.values()).map(user => ({ ...user, userRoles: [], userGroups: [] }));
}
async createUser(user: UpsertUser): Promise<User> {
return this.upsertUser(user);
}
async updateUser(id: string, user: Partial<UpsertUser>): Promise<User> {
const existingUser = this.users.get(id);
if (!existingUser) throw new Error('User not found');
const updatedUser = { ...existingUser, ...user, updatedAt: new Date() };
this.users.set(id, updatedUser);
return updatedUser;
}
async deleteUser(id: string): Promise<void> {
this.users.delete(id);
}
// Stub implementations for other required methods
async getGroups(): Promise<Group[]> { return []; }
async getGroup(id: number): Promise<Group | undefined> { return undefined; }
async createGroup(group: InsertGroup): Promise<Group> { return {} as Group; }
async updateGroup(id: number, group: Partial<InsertGroup>): Promise<Group> { return {} as Group; }
async deleteGroup(id: number): Promise<void> {}
async getSuppliers(): Promise<Supplier[]> { return []; }
async createSupplier(supplier: InsertSupplier): Promise<Supplier> { return {} as Supplier; }
async updateSupplier(id: number, supplier: Partial<InsertSupplier>): Promise<Supplier> { return {} as Supplier; }
async deleteSupplier(id: number): Promise<void> {}
async getOrders(groupIds?: number[]): Promise<OrderWithRelations[]> { return []; }
async getOrdersByDateRange(startDate: string, endDate: string, groupIds?: number[]): Promise<OrderWithRelations[]> { return []; }
async createOrder(order: InsertOrder): Promise<Order> { return {} as Order; }
async updateOrder(id: number, order: Partial<InsertOrder>): Promise<Order> { return {} as Order; }
async deleteOrder(id: number): Promise<void> {}
async getDeliveries(groupIds?: number[]): Promise<DeliveryWithRelations[]> { return []; }
async getDeliveriesByDateRange(startDate: string, endDate: string, groupIds?: number[]): Promise<DeliveryWithRelations[]> { return []; }
async createDelivery(delivery: InsertDelivery): Promise<Delivery> { return {} as Delivery; }
async updateDelivery(id: number, delivery: Partial<InsertDelivery>): Promise<Delivery> { return {} as Delivery; }
async deleteDelivery(id: number): Promise<void> {}
// Add placeholder methods for all other IStorage interface methods
async getSavTickets(): Promise<any[]> { return []; }
async getSavTicket(): Promise<any> { return undefined; }
async createSavTicket(): Promise<any> { return {}; }
async updateSavTicket(): Promise<any> { return {}; }
async deleteSavTicket(): Promise<void> {}
async getSavTicketHistory(): Promise<any[]> { return []; }
async createSavTicketHistory(): Promise<any> { return {}; }
async updateSavTicketHistory(): Promise<any> { return {}; }
async deleteSavTicketHistory(): Promise<void> {}
async getPublicities(): Promise<any[]> { return []; }
async getPublicity(): Promise<any> { return undefined; }
async createPublicity(): Promise<any> { return {}; }
async updatePublicity(): Promise<any> { return {}; }
async deletePublicity(): Promise<void> {}
async getPublicityParticipations(): Promise<any[]> { return []; }
async createPublicityParticipation(): Promise<any> { return {}; }
async deletePublicityParticipation(): Promise<void> {}
async getCustomerOrders(): Promise<any[]> { return []; }
async getCustomerOrder(): Promise<any> { return undefined; }
async createCustomerOrder(): Promise<any> { return {}; }
async updateCustomerOrder(): Promise<any> { return {}; }
async deleteCustomerOrder(): Promise<void> {}
async getDlcProducts(): Promise<any[]> { return []; }
async getDlcProduct(): Promise<any> { return undefined; }
async createDlcProduct(): Promise<any> { return {}; }
async updateDlcProduct(): Promise<any> { return {}; }
async deleteDlcProduct(): Promise<void> {}
async getTasks(): Promise<Task[]> { return Array.from(this.tasks.values()); }
async getTask(): Promise<any> { return undefined; }
async createTask(): Promise<any> { return {}; }
async updateTask(): Promise<any> { return {}; }
async deleteTask(): Promise<void> {}
async completeTask(): Promise<void> {}
async getRoles(): Promise<any[]> { return []; }
async getRole(): Promise<any> { return undefined; }
async createRole(): Promise<any> { return {}; }
async updateRole(): Promise<any> { return {}; }
async deleteRole(): Promise<void> {}
async getPermissions(): Promise<any[]> { return []; }
async getPermission(): Promise<any> { return undefined; }
async createPermission(): Promise<any> { return {}; }
async updatePermission(): Promise<any> { return {}; }
async deletePermission(): Promise<void> {}
async getRolePermissions(): Promise<any[]> { return []; }
async setRolePermissions(): Promise<void> {}
async getUserRoles(): Promise<any[]> { return []; }
async setUserRoles(): Promise<void> {}
async getUserPermissions(): Promise<any[]> { return []; }
}
// Use MemStorage in development, DatabaseStorage in production
const isProduction = process.env.NODE_ENV === 'production' && process.env.DATABASE_URL;
export const storage = isProduction ? new DatabaseStorage() : new MemStorage();
console.log(isProduction ? '🐳 Using PostgreSQL storage' : '🔧 Using in-memory storage for development');