const uuidv4 = require('uuid/v4'); import { Repository, Specification } from '../repository'; import { User } from '../../../entities/domain.models'; import { MongoClient } from 'mongodb'; import { mongo } from '../../credentials'; export class UserRepository implements Repository { private readonly COLLECTION_NAME = 'users'; async add(item: User): Promise { const db = await MongoClient.connect(mongo.development.connectionString); const dbo = db.db(mongo.development.databaseName); item.uuid = uuidv4(); await dbo.collection(this.COLLECTION_NAME).insertOne(item); return item; } update(item: User): void {} remove(item: User): void {} async find(specification: Specification): Promise { const db = await MongoClient.connect(mongo.development.connectionString); const dbo = db.db(mongo.development.databaseName); return dbo .collection(this.COLLECTION_NAME) .findOne(specification.toQuery()); } async findAll(specification: Specification): Promise { const db = await MongoClient.connect(mongo.development.connectionString); const dbo = db.db(mongo.development.databaseName); return dbo .collection(this.COLLECTION_NAME) .find(specification.toQuery()) .toArray() as Promise; } } export class FindUserByEmailSpecification implements Specification { constructor(private email: string) {} toQuery(): Object { return { email: this.email }; } }