import { MongoClient, ObjectId } from 'mongodb';
import { RolesDAO } from './RolesDAO.js';
import RoleModel from '../Model/RoleModel.js';
import dotenv from 'dotenv'
/**
* DAO pour la gestion des rôles avec MongoDB.
* @extends RolesDAO
* @class
*/
export class RolesMongoDAO extends RolesDAO {
/**
* Constructeur de la classe RolesMongoDAO.
* Initialise la connexion à la base de données MongoDB.
*/
constructor() {
super();
dotenv.config();
const uri = process.env.MONGODB_URI
const dbName = process.env.DB_NAME
this.client = new MongoClient(uri);
this.dbName = dbName;
}
/**
* Initialise la connexion à la base de données et à la collection.
*/
async init() {
await this.client.connect();
this.db = this.client.db(this.dbName);
this.collection = this.db.collection('roles');
}
/**
* Ferme la connexion à la base de données.
*/
async close()
{
await this.client.close();
}
/**
* Récupère les rôles selon les filtres spécifiés.
* @param {object} filters - Les filtres à appliquer (id, name).
* @returns {Array} - Liste des rôles trouvés.
*/
async getRoles(filters) {
const mongoFilters = {};
if (filters._id) mongoFilters._id = new ObjectId(filters._id); // Utilisation correcte de _id
if (filters.name) mongoFilters.name = filters.name;
const roles = await this.collection.find(mongoFilters).toArray();
return roles.map(role => new RoleModel(role)); // Instancie chaque rôle avec le modèle
}
/**
* Met à jour un rôle existant.
* @param {string} id - L'identifiant du rôle à mettre à jour.
* @param {object} role - Les nouvelles données du rôle.
* @returns {object} - Résultat de la mise à jour.
*/
async updateRole(id, role) {
return await this.collection.updateOne(
{ _id: new ObjectId(id) }, // Utilisation de _id
{ $set: { name: role.name, permissions: role.permissions } }
);
}
/**
* Supprime un rôle existant.
* @param {string} id - L'identifiant du rôle à supprimer.
* @returns {object} - Résultat de la suppression.
*/
async deleteRole(id) {
return await this.collection.deleteOne({ _id: new ObjectId(id) });
}
/**
* Crée un nouveau rôle.
* @param {object} role - Les données du rôle à créer.
* @returns {object} - Résultat de l'insertion.
*/
async createRole(role) {
const result = await this.collection.insertOne(role);
return { _id: result.insertedId, ...role }; // Retourne le rôle avec son _id
}
}