mirror of
https://github.com/R0m1k3/Regisflow.git
synced 2026-10-11 17:29:48 +02:00
Adds API endpoint to check default admin password status and hides credentials. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 91318273-c764-4fd4-be04-bdc12c38af32 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/0715008c-7244-40f4-befc-26c014852236/22c32c18-bf03-4830-a5c9-ef4544d0e27f.jpg
221 lines
6.3 KiB
TypeScript
221 lines
6.3 KiB
TypeScript
import {
|
|
users,
|
|
stores,
|
|
sales,
|
|
type User,
|
|
type InsertUser,
|
|
type Store,
|
|
type InsertStore,
|
|
type Sale,
|
|
type InsertSale,
|
|
} from "@shared/schema";
|
|
import { db } from "./db";
|
|
import { eq, and, gte, lte, desc } from "drizzle-orm";
|
|
import bcrypt from "bcryptjs";
|
|
|
|
export interface IStorage {
|
|
// User operations
|
|
getUser(id: number): Promise<User | undefined>;
|
|
getUserByUsername(username: string): Promise<User | undefined>;
|
|
createUser(user: InsertUser): Promise<User>;
|
|
updateUser(id: number, user: Partial<InsertUser>): Promise<User | undefined>;
|
|
deleteUser(id: number): Promise<void>;
|
|
getAllUsers(): Promise<User[]>;
|
|
|
|
// Store operations
|
|
getStore(id: number): Promise<Store | undefined>;
|
|
createStore(store: InsertStore): Promise<Store>;
|
|
getAllStores(): Promise<Store[]>;
|
|
updateStore(id: number, store: Partial<InsertStore>): Promise<Store | undefined>;
|
|
deleteStore(id: number): Promise<void>;
|
|
|
|
// Sale operations
|
|
getSale(id: number): Promise<Sale | undefined>;
|
|
createSale(sale: InsertSale): Promise<Sale>;
|
|
getSalesByStore(storeId: number, startDate?: string, endDate?: string): Promise<Sale[]>;
|
|
deleteSale(id: number): Promise<void>;
|
|
|
|
// Auth operations
|
|
authenticateUser(username: string, password: string): Promise<User | null>;
|
|
hashPassword(password: string): Promise<string>;
|
|
initializeDefaults(): Promise<{ defaultAdminCredentials?: { username: string; password: string } }>;
|
|
isUsingDefaultPassword(): Promise<boolean>;
|
|
}
|
|
|
|
export class DatabaseStorage implements IStorage {
|
|
// User operations
|
|
async getUser(id: number): Promise<User | undefined> {
|
|
const [user] = await db.select().from(users).where(eq(users.id, id));
|
|
return user;
|
|
}
|
|
|
|
async getUserByUsername(username: string): Promise<User | undefined> {
|
|
const [user] = await db.select().from(users).where(eq(users.username, username));
|
|
return user;
|
|
}
|
|
|
|
async createUser(userData: InsertUser): Promise<User> {
|
|
// Hash password if provided
|
|
if (userData.password) {
|
|
userData.password = await this.hashPassword(userData.password);
|
|
}
|
|
|
|
const [user] = await db
|
|
.insert(users)
|
|
.values(userData)
|
|
.returning();
|
|
return user;
|
|
}
|
|
|
|
async updateUser(id: number, userData: Partial<InsertUser>): Promise<User | undefined> {
|
|
// Hash password if provided
|
|
if (userData.password) {
|
|
userData.password = await this.hashPassword(userData.password);
|
|
}
|
|
|
|
const [user] = await db
|
|
.update(users)
|
|
.set(userData)
|
|
.where(eq(users.id, id))
|
|
.returning();
|
|
return user;
|
|
}
|
|
|
|
async getAllUsers(): Promise<User[]> {
|
|
return await db.select().from(users).orderBy(desc(users.createdAt));
|
|
}
|
|
|
|
async deleteUser(id: number): Promise<void> {
|
|
await db.delete(users).where(eq(users.id, id));
|
|
}
|
|
|
|
// Store operations
|
|
async getStore(id: number): Promise<Store | undefined> {
|
|
const [store] = await db.select().from(stores).where(eq(stores.id, id));
|
|
return store;
|
|
}
|
|
|
|
async createStore(storeData: InsertStore): Promise<Store> {
|
|
const [store] = await db
|
|
.insert(stores)
|
|
.values(storeData)
|
|
.returning();
|
|
return store;
|
|
}
|
|
|
|
async getAllStores(): Promise<Store[]> {
|
|
return await db.select().from(stores).orderBy(desc(stores.createdAt));
|
|
}
|
|
|
|
async updateStore(id: number, storeData: Partial<InsertStore>): Promise<Store | undefined> {
|
|
const [store] = await db
|
|
.update(stores)
|
|
.set(storeData)
|
|
.where(eq(stores.id, id))
|
|
.returning();
|
|
return store;
|
|
}
|
|
|
|
async deleteStore(id: number): Promise<void> {
|
|
await db.delete(stores).where(eq(stores.id, id));
|
|
}
|
|
|
|
// Sale operations
|
|
async getSale(id: number): Promise<Sale | undefined> {
|
|
const [sale] = await db.select().from(sales).where(eq(sales.id, id));
|
|
return sale;
|
|
}
|
|
|
|
async createSale(saleData: InsertSale): Promise<Sale> {
|
|
const [sale] = await db
|
|
.insert(sales)
|
|
.values(saleData)
|
|
.returning();
|
|
return sale;
|
|
}
|
|
|
|
async getSalesByStore(storeId: number, startDate?: string, endDate?: string): Promise<Sale[]> {
|
|
let query = db.select().from(sales).where(eq(sales.storeId, storeId));
|
|
|
|
if (startDate && endDate) {
|
|
query = db.select().from(sales).where(
|
|
and(
|
|
eq(sales.storeId, storeId),
|
|
gte(sales.dateVente, startDate),
|
|
lte(sales.dateVente, endDate)
|
|
)
|
|
);
|
|
}
|
|
|
|
return await query.orderBy(desc(sales.timestamp));
|
|
}
|
|
|
|
async deleteSale(id: number): Promise<void> {
|
|
await db.delete(sales).where(eq(sales.id, id));
|
|
}
|
|
|
|
// Auth operations
|
|
async authenticateUser(username: string, password: string): Promise<User | null> {
|
|
const user = await this.getUserByUsername(username);
|
|
if (!user || !user.isActive) {
|
|
return null;
|
|
}
|
|
|
|
const isValid = await bcrypt.compare(password, user.password);
|
|
return isValid ? user : null;
|
|
}
|
|
|
|
async hashPassword(password: string): Promise<string> {
|
|
return await bcrypt.hash(password, 12);
|
|
}
|
|
|
|
// Check if admin still uses default password
|
|
async isUsingDefaultPassword(): Promise<boolean> {
|
|
const adminUser = await this.getUserByUsername('admin');
|
|
if (!adminUser) {
|
|
return false;
|
|
}
|
|
|
|
// Check if the stored password hash matches the default password "admin123"
|
|
return await bcrypt.compare('admin123', adminUser.password);
|
|
}
|
|
|
|
// Initialize default admin user and store if none exist
|
|
async initializeDefaults(): Promise<{ defaultAdminCredentials?: { username: string; password: string } }> {
|
|
const existingUsers = await this.getAllUsers();
|
|
|
|
if (existingUsers.length === 0) {
|
|
// Create default store
|
|
const defaultStore = await this.createStore({
|
|
name: "Magasin Principal",
|
|
address: "À définir",
|
|
isActive: true,
|
|
});
|
|
|
|
// Create default admin user
|
|
const defaultPassword = "admin123";
|
|
const adminUser = await this.createUser({
|
|
username: "admin",
|
|
password: defaultPassword,
|
|
email: "admin@example.com",
|
|
firstName: "Administrateur",
|
|
lastName: "Principal",
|
|
role: "admin",
|
|
storeId: defaultStore.id,
|
|
isActive: true,
|
|
});
|
|
|
|
return {
|
|
defaultAdminCredentials: {
|
|
username: "admin",
|
|
password: defaultPassword
|
|
}
|
|
};
|
|
}
|
|
|
|
return {};
|
|
}
|
|
}
|
|
|
|
export const storage = new DatabaseStorage();
|