HEX
Server: nginx/1.24.0
System: Linux nowruzgan 6.8.0-57-generic #59-Ubuntu SMP PREEMPT_DYNAMIC Sat Mar 15 17:40:59 UTC 2025 x86_64
User: babak (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/dev/farhangmoaser/web/models/purchase.js
"use strict";
var md5 = require('md5');

class PurchaseModel {

	/**
	 * Constructor
	 * @param  {Object} data values for table fields.
	 */
	constructor(conn, data) {
		this.data = data;
		this.conn = conn;
	}

	field(key, value) {
		if(arguments.length==0) return;
		if(arguments.length==1)
			return this.data[key];
		
		if(value===undefined)
			delete this.data[key];
		else
			this.data[key] = value;
	}

	fields(){

		return this.data;
	}

	save() {
		if(this.data.hasOwnProperty('id')) return this.update();
		else return this.add();
	}

	add() {
		var self = this;
		return new Promise(function(resolve, reject){
			var record = {};
			if(self.data.hasOwnProperty('user')) record.user = self.data.user;
			if(self.data.hasOwnProperty('book')) record.book = self.data.book;
			if(self.data.hasOwnProperty('value')) record.value = self.data.value;
			if(self.data.hasOwnProperty('dateStart')) record.dateStart = self.data.dateStart;
			if(self.data.hasOwnProperty('dateExpire')) record.dateExpire = self.data.dateExpire;
			if(self.data.hasOwnProperty('state')) record.state = self.data.state;

			self.conn.query(`INSERT INTO purchase SET ?`, record, function(err, result){
				if(err) return reject(err.message);
				self.data.id = result.insertId;
				resolve(self);
			})
		});
	}

	update() {
		var self = this;
		return new Promise(function(resolve, reject){
			if(!self.data.hasOwnProperty('id')) reject('id is required.');
			var record = {};

			if(self.data.hasOwnProperty('user')) record.user = self.data.user;
			if(self.data.hasOwnProperty('book')) record.book = self.data.book;
			if(self.data.hasOwnProperty('value')) record.value = self.data.value;
			if(self.data.hasOwnProperty('dateStart')) record.dateStart = self.data.dateStart;
			if(self.data.hasOwnProperty('dateExpire')) record.dateExpire = self.data.dateExpire;
			if(self.data.hasOwnProperty('state')) record.state = self.data.state;

			self.conn.query(`UPDATE purchase SET ? where ?`, [record, {id: self.data.id}], function(err, result){
				if(err) return reject(err.message);
				resolve(self);
			})
		});
	}

	delete() {
		var self = this;
		return new Promise(function(resolve, reject){
			if(!self.data.hasOwnProperty('id')) reject('id is required.');

			self.conn.query(`delete from purchase where ?`, {id: self.data.id}, function(err, result){
				if(err) return reject(err.message);
				resolve();
			})
		});
	}

	load(master) {
		var self = this;
		return new Promise(function(resolve, reject){
			if(!self.data.hasOwnProperty('id')) return reject('At least on of the id and email fields must be provided.');

			var table = master ? 'purchase' : 'purchase_details';

			self.conn.query(`SELECT * FROM ${table} WHERE ?`, {id: self.data.id}, function(err, rows, fields){
				if (err) return reject(err.message);
				if(rows.length) {
					self.data = rows[0];
					resolve(self);
				} else
					resolve(false);
			});
		});
	}

	static list(conn, query, limit, offset, orderBy) {
		if(!orderBy) orderBy = 'newest';
		var orderByStr = '';
		switch(orderBy){
			case 'newest':
				orderByStr = 'ORDER BY `created` DESC, id DESC';
				break;

			case 'oldest':
				orderByStr = 'ORDER BY `created` ASC, id ASC';
				break;

			case 'user:a-z':
				orderByStr = 'ORDER BY `user_sortable` ASC, id ASC';
				break;

			case 'user:z-a':
				orderByStr = 'ORDER BY `user_sortable` DESC, id DESC';
				break;

			case 'book:a-z':
				orderByStr = 'ORDER BY `book_title` ASC, id ASC';
				break;

			case 'book:z-a':
				orderByStr = 'ORDER BY `book_title` DESC, id DESC';
				break;
		}

		limit = limit || 100;
		offset = offset || 0;
		return new Promise(function(resolve, reject){
			var params = [offset, limit];
			var where = '';
			if(Object.keys(query).length) {
				where = 'WHERE !!';
				params.unshift(query);
			}

			var template = conn.format(`SELECT * FROM purchase_details ${where} ${orderByStr} limit ?, ?`, params);
			conn.query(template, query, function(err, rows, fields){
				if (err) return reject(err.message);
				resolve(rows);
			});
		});
	}

	static count(conn, query) {
		return new Promise(function(resolve, reject){
			var where = '';
			if(Object.keys(query).length)
				where = 'WHERE !!';

			var template = conn.format(`SELECT COUNT(*) AS sum FROM purchase_details ${where}`, query);
			conn.query(template, query, function(err, rows, fields){
				if (err) return reject(err.message);
				resolve(rows[0].sum);
			});
		});
	}
}

module.exports = PurchaseModel;