Files
sartron_Northblue 95afac750a first commit
2025-09-17 11:50:34 +04:00

169 lines
4.8 KiB
Dart

import 'package:postgres/postgres.dart';
import '../models/movie.dart';
import 'local_storage_service.dart';
class DatabaseService {
static const String host = 'localhost';
static const String database = 'flutterBDD';
static const String username = 'postgres';
static const String password = 'root';
static const int port = 5432;
static Connection? _connection;
static bool _useLocalStorage = false;
static Future<Connection> get connection async {
if (_connection == null && !_useLocalStorage) {
try {
_connection = await Connection.open(
Endpoint(
host: host,
port: port,
database: database,
username: username,
password: password,
),
);
await _createTables();
} catch (e) {
print('Erreur de connexion à PostgreSQL: $e');
print('Utilisation du stockage local à la place...');
_useLocalStorage = true;
throw Exception('PostgreSQL non disponible, utilisation du stockage local');
}
}
if (_useLocalStorage) {
throw Exception('Utilisation du stockage local');
}
return _connection!;
}
static Future<void> _createTables() async {
final conn = await connection;
await conn.execute('''
CREATE TABLE IF NOT EXISTS favorites (
id SERIAL PRIMARY KEY,
movie_id INTEGER NOT NULL,
title TEXT NOT NULL,
description TEXT,
image_url TEXT,
category TEXT,
director TEXT,
release_date TEXT,
rating REAL,
original_title TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''');
}
static Future<bool> addToFavorites(Movie movie) async {
try {
final conn = await connection;
final existing = await conn.execute(
Sql.named('SELECT id FROM favorites WHERE movie_id = @movieId'),
parameters: {'movieId': movie.id},
);
if (existing.isNotEmpty) {
return false;
}
await conn.execute(
Sql.named('''
INSERT INTO favorites (
movie_id, title, description, image_url, category,
director, release_date, rating, original_title
) VALUES (
@movieId, @title, @description, @imageUrl, @category,
@director, @releaseDate, @rating, @originalTitle
)
'''),
parameters: {
'movieId': movie.id,
'title': movie.title,
'description': movie.description,
'imageUrl': movie.imageUrl,
'category': movie.category,
'director': movie.director,
'releaseDate': movie.releaseDate,
'rating': movie.rating,
'originalTitle': movie.originalTitle,
},
);
return true;
} catch (e) {
print('Erreur PostgreSQL, utilisation du stockage local: $e');
return await LocalStorageService.addToFavorites(movie);
}
}
static Future<bool> removeFromFavorites(int movieId) async {
try {
final conn = await connection;
final result = await conn.execute(
Sql.named('DELETE FROM favorites WHERE movie_id = @movieId'),
parameters: {'movieId': movieId},
);
return result.length > 0;
} catch (e) {
print('Erreur PostgreSQL, utilisation du stockage local: $e');
return await LocalStorageService.removeFromFavorites(movieId);
}
}
static Future<bool> isFavorite(int movieId) async {
try {
final conn = await connection;
final result = await conn.execute(
Sql.named('SELECT id FROM favorites WHERE movie_id = @movieId'),
parameters: {'movieId': movieId},
);
return result.isNotEmpty;
} catch (e) {
print('Erreur PostgreSQL, utilisation du stockage local: $e');
return await LocalStorageService.isFavorite(movieId);
}
}
static Future<List<Movie>> getFavorites() async {
try {
final conn = await connection;
final results = await conn.execute(
Sql('SELECT * FROM favorites ORDER BY created_at DESC'),
);
return results.map((row) => Movie(
id: row[1] as int,
title: row[2] as String,
description: row[3] as String,
imageUrl: row[4] as String,
category: row[5] as String,
director: row[6] as String,
releaseDate: row[7] as String,
rating: (row[8] as double?) ?? 0.0,
originalTitle: row[9] as String,
isFeatured: false,
)).toList();
} catch (e) {
print('Erreur PostgreSQL, utilisation du stockage local: $e');
return await LocalStorageService.getFavorites();
}
}
static Future<void> close() async {
if (_connection != null) {
await _connection!.close();
_connection = null;
}
}
}