File: /var/dev/farhangmoaser/web/models/app.js
/**
 * App Model
 * Version: 0.1
 * Author: Babak Vandad
 *
 * Abstraction layer for App table in MySQL db
 */
"use strict";
var md5 = require('md5');
// var mysql = require('../connectors/mysql').client();
class AppModel {
	/**
	 * Constructor
	 * @param  {object} conn db connection from db pool.
	 * @param  {Object} data values for table fields.
	 *                       At least on of `key` or `id` must be set.
	 */
	constructor(conn, data) {
		this.conn = conn;
		this.data = data;
	}
	field(key, value) {
		if(arguments.length==0) return;
		if(arguments.length==1)
			return this.data[key];
		else
			this.data[key] = value;
	}
	fields(){
		return this.data;
	}
	/**
	 * Reads the complete data object from db based on `key` or `id` fields.
	 * @return {Promise} Result of the operation
	 */
	load() {
		var self = this;
		return new Promise(function(resolve, reject){
			if(!self.data.key && !self.data.id) return reject('A valid key or an id is required.');
			var where = {};
			if(self.data.key) where = {key: self.data.key};
			if(self.data.id) where = {id: self.data.id};
			self.conn.query(`SELECT * FROM app WHERE ?`, where, function(err, rows, fields){
				if(err)
					return reject(err.message);
				if(!rows.length)
					return reject('Requested app not found.');
				var row = rows[0];
				self.data = row;
				resolve();
			});
		});
	}
	/**
	 * Increments the hit counter.
	 * IMPORTANT: Hence the hit limitations is a business rule we do not consider it in the model.
	 * @return {Promise} Result of the operation
	 */
	touch() {
		var self = this;
		return new Promise(function(resolve, reject){
			self.conn.query(`UPDATE app SET last_visit=CURRENT_TIMESTAMP, hit_count=hit_count+1 WHERE ?`, {id: self.data.id}, function(err){
				if(err)
					return reject('db error.');
				else
					return resolve();
			});
		});
	}
	/**
	 * Resets the hit counter
	 * @return {Promise} Result of the operation
	 */
	resetHitCounter() {
		var self = this;
		return new Promise(function(resolve, reject){
			self.conn.query(`UPDATE app SET last_visit=CURRENT_TIMESTAMP, hit_count=1, last_reset=CURRENT_TIMESTAMP WHERE ?`, {id: self.data.id}, function(err){
				if(err)
					return reject('db error.');
				else
					return resolve();
			});
		});
	}
}
module.exports = AppModel;