All files / node-collections-boilerplate-nahid/storage MongoStorage.js

95.83% Statements 46/48
80% Branches 8/10
100% Functions 13/13
95.74% Lines 45/47
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134    2x 2x   2x                       36x   36x   36x                 36x       36x 36x 36x 36x 36x                 39x 39x 39x 39x   14x         611x 14x   39x           208x 208x 208x               210x 210x 210x   1x   209x 209x           2x 2x   2x 2x 2x   2x           2x                 207x 207x   207x 207x 207x   207x   1x       206x               2x  
"use strict";
 
const mongodb = require('mongodb');
const Storage = require('./Storage');
 
const MONGO_BULK_RECORDS_GET_COUNT = 1024;
 
/**
 * Mongodb collection as storage.
 * 
 * Requires ```mongodb``` package.
 */
class MongoStorage extends Storage
{
  /** @override */
  connect()
  {
    return new Promise((resolve, reject) =>
    {
      mongodb.MongoClient.connect(this.connectionString, (err, db) =>
      {
        Iif (err)
        {
          reject(err);
        }
        else
        {
          /**
           * reference to driver database object
           */
          this.database = db;
          /**
           * reference to driver collection object
           */
          this.collection = db.collection(this.collectionName);
          resolve();
          let index = {};
          index[this.primaryKey] = 1;
          this.collection.createIndex(index);
        }
      });
    });
  }
 
  /** @override */
  async readAllRecords()
  {
    let collection = this.collection;
    const count = await collection.count({}, {});
    let records = [];
    while (records.length < count)
    {
      const items = await
      collection.find({})
        .skip(records.length)
        .limit(MONGO_BULK_RECORDS_GET_COUNT)
        .toArray();
      items.forEach(item => delete item._id);
      records = records.concat(items);
    }
    return records;
  }
 
  /** @override */
  async createRecord(record)
  {
    let collection = this.collection;
    await collection.insertOne(record, {});
    return await this.readRecord({
      _id: record._id
    });
  }
 
  /** @override */
  async readRecord(record)
  {
    let collection = this.collection;
    const found = await collection.findOne(record, {});
    if (!found)
    {
      throw new Error('Not found.');
    }
    delete found._id;
    return found;
  }
 
  /** @override */
  updateRecord(record)
  {
    let collection = this.collection;
    return new Promise((resolve, reject) =>
    {
      let query = {};
      query[this.primaryKey] = record[this.primaryKey];
      collection.updateOne(query, record, {}, (err, result) =>
      {
        Iif (err)
        {
          reject(err);
        }
        else
        {
          resolve(record);
        }
      });
    });
  }
 
  /** @override */
  deleteRecord(record)
  {
    let collection = this.collection;
    return new Promise((resolve, reject) =>
    {
      let query = {};
      query[this.primaryKey] = record[this.primaryKey];
      collection.deleteOne(query, {}, (err, result) =>
      {
        if (err || result.deletedCount === 0)
        {
          reject(err);
        }
        else
        {
          resolve(record);
        }
      });
    });
  }
 
}
 
module.exports = MongoStorage;