All files / service db.js

100% Statements 22/22
100% Branches 2/2
100% Functions 6/6
100% Lines 21/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 832x 2x 2x 2x         2x       2x 2x       2x 2x 2x       2x                         3x   3x 3x   2x                           2x                       3x       3x 3x         3x         2x
const { MongoClient, ObjectId } = require('mongodb');
const { ObjectID, Binary } = require('mongodb');
const { retryPromise } = require('../util/promise-util');
const fs = require('fs').promises;
 
class Db {
 
    constructor(mongodbUrl) {
        this.mongodbUrl = mongodbUrl;
    }
 
    async connect() {
        this.client = await retryPromise(
            () => MongoClient.connect(this.mongodbUrl),
            3000,
            10
        );
        this.db = this.client.db();
        this.images = this.db.collection('images');
        return this;
    }
 
    async disconnect() {
        await this.client.close();
    }
 
    /**
     * @param {{
     * image: string,
     * name: stirng, 
     * format: string, 
     * formatPriority: number,
     * profile: {width: number, height: number, name: string}
     * }} records 
     */
    async add(records) {
        const id = ObjectID();
 
        for (let record of records) {
            const buffer = await fs.readFile(record.image);
 
            await this.images.insertOne({
                id,
                name: record.name,
                data: Binary(buffer),
                created: new Date(),
                format: record.format,
                formatPriority: record.formatPriority,
                width: record.profile.width,
                height: record.profile.height,
                profile: record.profile.name,
                size: 35958
            });
        }
 
        return id;
    }
 
    /**
     * 
     * @param {{
     * id: string, 
     * profile: string, 
     * formats: [string]
     * }} query 
     */
    async find(query) {
        const q = {
            $or: [{ id: query.id }, { name: query.id }],
            format: { $in: query.formats }
        }
        if (query.profile) q.profile = query.profile
        const sort = {
            width: -1,
            heigh: -1,
            formatPriority: 1
        }
        return (await this.images.find(q).limit(1).sort(sort).toArray())[0]
    }
 
}
 
module.exports = Db