You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

147 lines
4.3 KiB

import 'package:flutter/services.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart' as sqflite_ffi;
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:youmazgestion/Models/users.dart';
import 'dart:io';
class AuthDatabase {
static final AuthDatabase instance = AuthDatabase._init();
late Database _database;
AuthDatabase._init() {
sqflite_ffi.sqfliteFfiInit();
}
Future<void> initDatabase() async {
_database = await _initDB('usersDb.db');
await _createDB(_database, 1);
}
Future<Database> get database async {
if (_database.isOpen) return _database;
_database = await _initDB('usersDb.db');
return _database;
}
Future<Database> _initDB(String filePath) async {
// Obtenez le répertoire de stockage local de l'application
final documentsDirectory = await getApplicationDocumentsDirectory();
final path = join(documentsDirectory.path, filePath);
// Vérifiez si le fichier de base de données existe déjà dans le répertoire de stockage local
bool dbExists = await File(path).exists();
if (!dbExists) {
// Si le fichier n'existe pas, copiez-le depuis le dossier assets/database
ByteData data = await rootBundle.load('assets/database/$filePath');
List<int> bytes =
data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
await File(path).writeAsBytes(bytes);
}
// Ouvrez la base de données
return await databaseFactoryFfi.openDatabase(path);
}
Future<void> _createDB(Database db, int version) async {
final resultUsers = await db.rawQuery(
"SELECT name FROM sqlite_master WHERE type='table' AND name='users'");
if (resultUsers.isEmpty) {
await db.execute('''
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
lastname TEXT,
email TEXT,
password TEXT,
username TEXT,
role TEXT
)
''');
}
}
Future<int> createUser(Users user) async {
final db = await database;
return await db.insert('users', user.toMap());
}
Future<int> deleteUser(int id) async {
final db = await database;
return await db.delete('users', where: 'id = ?', whereArgs: [id]);
}
Future<int> updateUser(Users user) async {
final db = await database;
return await db
.update('users', user.toMap(), where: 'id = ?', whereArgs: [user.id]);
}
Future<int> getUserCount() async {
final db = await database;
List<Map<String, dynamic>> x =
await db.rawQuery('SELECT COUNT (*) from users');
int result = Sqflite.firstIntValue(x)!;
return result;
}
// verify username and password existe
Future<bool> verifyUser(String username, String password) async {
final db = await database;
List<Map<String, dynamic>> x = await db.rawQuery(
'SELECT COUNT (*) from users WHERE username = ? AND password = ?',
[username, password]);
int result = Sqflite.firstIntValue(x)!;
if (result == 1) {
return true;
} else {
return false;
}
}
//recuperer un user grace a son username
Future<Users> getUser(String username) async {
try {
final db = await database;
List<Map<String, dynamic>> x = await db
.rawQuery('SELECT * from users WHERE username = ?', [username]);
print(x.first);
Users user = Users.fromMap(x.first);
print(user);
return user;
} catch (e) {
print(e);
rethrow;
}
}
Future<Map<String, String>?> getUserCredentials(String username, String password) async {
final db = await database;
List<Map<String, dynamic>> result = await db.rawQuery(
'SELECT username, role FROM users WHERE username = ? AND password = ?',
[username, password],
);
if (result.isNotEmpty) {
print('username '+result[0]['username']);
return {
'username': result[0]['username'],
'role': result[0]['role'],
};
} else {
return null; // Aucun utilisateur trouvé
}
}
Future<List<Users>> getAllUsers() async {
final db = await database;
const orderBy = 'id ASC';
final result = await db.query('users', orderBy: orderBy);
return result.map((json) => Users.fromMap(json)).toList();
}
}