mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-23 15:08:22 +02:00
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:
1 parent
7e6dccfadf
commit
6a863cdaf2
2 files changed
+170
-2
No files matched your search
+7
-1
@@ -25,7 +25,13 @@ export async function hashPassword(password: string) {
|
|||||||
async function comparePasswords(supplied: string, stored: string) {
|
async function comparePasswords(supplied: string, stored: string) {
|
||||||
console.log('🔐 comparePasswords:', { supplied: 'HIDDEN', stored: stored?.substring(0, 20) + '...', hasFormat: stored?.includes('.') });
|
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('.')) {
|
if (!stored || !stored.includes('.')) {
|
||||||
console.error('❌ Invalid password format:', { stored });
|
console.error('❌ Invalid password format:', { stored });
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
+163
-1
@@ -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');
|
||||||
Reference in new issue
Block a user