summaryrefslogtreecommitdiff
path: root/includes/classes/LibertyQuota.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/classes/LibertyQuota.php')
-rw-r--r--includes/classes/LibertyQuota.php248
1 files changed, 248 insertions, 0 deletions
diff --git a/includes/classes/LibertyQuota.php b/includes/classes/LibertyQuota.php
new file mode 100644
index 0000000..4feb6a4
--- /dev/null
+++ b/includes/classes/LibertyQuota.php
@@ -0,0 +1,248 @@
+<?php
+/**
+ * $Header$
+ *
+ * Copyright (c) 2004 bitweaver.org
+ * Copyright (c) 2003 tikwiki.org
+ * Copyright (c) 2002-2003, Luis Argerich, Garland Foster, Eduardo Polidor, et. al.
+ * All Rights Reserved. See below for details and a complete list of authors.
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See http://www.gnu.org/copyleft/lesser.html for details
+ *
+ * $Id$
+ * @package quota
+ */
+
+/**
+ * required setup
+ */
+
+namespace Bitweaver\Quota;
+use Bitweaver\BitBase;
+use Bitweaver\Liberty\LibertyBase;
+
+/**
+ * Quota class to illustrate best practices when creating a new bitweaver package that
+ * builds on core bitweaver functionality, such as the Liberty CMS engine
+ *
+ * @package quota
+ * @subpackage LibertyQuota
+ *
+ * created 2004/8/15
+ *
+ * @author spider <spider@steelsun.com>
+ *
+ * @version $Revision$
+ */
+class LibertyQuota extends LibertyBase {
+ /**
+ * Primary key for our mythical Quota class object & table
+ * @public
+ */
+ public $mQuotaId;
+
+ /**
+ * During initialisation, be sure to call our base constructors
+ **/
+ public function __construct( $pQuotaId=NULL, $pContentId=NULL ) {
+ $this->mQuotaId = $pQuotaId;
+ parent::__construct();
+ }
+
+
+ /**
+ * Any method named Store inherently implies data will be written to the database
+ * @param array pParamHash be sure to pass by reference in case we need to make modifcations to the hash
+ **/
+ public function store( &$pParamHash ) {
+ if( $this->verify( $pParamHash ) ) {
+ $this->mDb->StartTrans();
+ $table = BIT_DB_PREFIX."quotas";
+ if( $this->mQuotaId ) {
+ $result = $this->mDb->associateUpdate( $table, $pParamHash['quota_store'], [ "quota_id" => $pParamHash['quota_id'] ] );
+ } else {
+ $this->mQuotaId = $this->mDb->GenID( 'quota_id_seq' );
+ $pParamHash['quota_store']['quota_id'] = $this->mQuotaId;
+ $result = $this->mDb->associateInsert( $table, $pParamHash['quota_store'] );
+ }
+ $this->load();
+ $this->mDb->CompleteTrans();
+ }
+ return( count( $this->mErrors ) == 0 );
+ }
+
+ /**
+ * Make sure the data is safe to store
+ * @param array pParamHash be sure to pass by reference in case we need to make modifcations to the hash
+ **/
+ public function verify( &$pParamHash ) {
+ if( isset( $pParamHash['description'] ) ) {
+ // insure we don't have column overflow, etc.
+ $pParamHash['quota_store']['description'] = trim( $pParamHash['description'], 0, 160 );
+ }
+ if( !empty( $pParamHash['title'] ) ) {
+ // insure we don't have column overflow, etc.
+ $pParamHash['quota_store']['title'] = substr( trim( $pParamHash['title'] ), 0, 160 );
+ } else {
+ $this->mErrors['title'] = "Your quota needs a title";
+ }
+
+ if( empty( $pParamHash['disk_usage'] ) || !is_numeric( $pParamHash['disk_usage'] ) ) {
+ $this->mErrors['disk_usage'] = "Invalid disk usage quantity";
+ } else {
+ $pParamHash['quota_store']['disk_usage'] = $pParamHash['disk_usage'] * 1000000;
+ }
+
+ if( empty( $pParamHash['monthly_transfer'] ) || !is_numeric( $pParamHash['monthly_transfer'] ) ) {
+ $this->mErrors['monthly_transfer'] = "Invalid disk usage quantity";
+ } else {
+ $pParamHash['quota_store']['monthly_transfer'] = $pParamHash['monthly_transfer'] * 1000000;
+ }
+
+ return( count( $this->mErrors ) == 0 );
+ }
+
+ /**
+ * Load the data from the database
+ * @param array pParamHash be sure to pass by reference in case we need to make modifcations to the hash
+ **/
+ public function load() {
+ if( $this->mQuotaId ) {
+ // LibertyContent::load() assumes you have joined already, and will not execute any sql!
+ // This is a significant performance optimization
+ $query = "SELECT qo.* FROM `".BIT_DB_PREFIX."quotas` qo WHERE qo.`quota_id`=?";
+ $result = $this->mDb->query( $query, [ $this->mQuotaId ] );
+ if ( $result && $result->numRows() ) {
+ $this->mInfo = $result->fields;
+ $query = "SELECT ug.`group_id`, ug.* FROM `".BIT_DB_PREFIX."users_groups` ug INNER JOIN `".BIT_DB_PREFIX."quotas_group_map` qgm ON( ug.`group_id`=qgm.`group_id` ) WHERE qgm.`quota_id`=?";
+ if( $rs = $this->mDb->query( $query, [ $this->mQuotaId ] ) ) {
+ $this->mInfo['quota_groups'] = $rs->fields;
+ }
+ }
+ }
+ return count( $this->mInfo ) == 0;
+ }
+
+ /**
+ *
+ **/
+ public function getList() {
+ $query = "SELECT qo.`quota_id`, qo.* FROM `".BIT_DB_PREFIX."quotas` qo";
+ $ret = $this->mDb->getAssoc($query);
+ return $ret;
+ }
+
+ /**
+ *
+ **/
+ function getQuotaMenu( $pName='quota_menu', $pSelectId=NULL ) {
+ $query = "SELECT qo.`title`, qo.`quota_id` FROM `".BIT_DB_PREFIX."quotas` qo";
+ if( $rs = $this->mDb->query($query) ) {
+ $ret = $rs->GetMenu2( $pName, $pSelectId );
+ }
+ return ( $ret );
+ }
+
+ function getQuotaGroups() {
+ $sql = "SELECT ug.`group_id`, ug.*, qgm.`quota_id`
+ FROM `".BIT_DB_PREFIX."users_groups` ug LEFT OUTER JOIN `".BIT_DB_PREFIX."quotas_group_map` qgm ON( qgm.`group_id`=ug.`group_id` )
+ WHERE ug.`user_id`=".ROOT_USER_ID."
+ ORDER BY ug.`group_name` ASC";
+ return $this->mDb->getAssoc( $sql );
+ }
+
+
+
+ /**
+ *
+ **/
+ function assignQuotaToGroup( $pQuotaId, $pGroupId ) {
+ if( is_numeric( $pQuotaId ) && is_numeric( $pGroupId ) ) {
+ $hasRow = $this->mDb->getOne( 'SELECT `quota_id` FROM `'.BIT_DB_PREFIX.'quotas_group_map` WHERE `group_id`=?', [ $pGroupId ] );
+ if( $hasRow ) {
+ $query = 'UPDATE `'.BIT_DB_PREFIX.'quotas_group_map` SET `quota_id`=? WHERE `group_id`=?';
+ $rs = $this->mDb->query( $query, [ $pQuotaId, $pGroupId ] );
+ } else {
+ $query = 'INSERT INTO `'.BIT_DB_PREFIX.'quotas_group_map` (`quota_id`, `group_id`) VALUES (?,?)';
+ $rs = $this->mDb->query( $query, [ $pQuotaId, $pGroupId ] );
+ }
+ } elseif( is_numeric( $pGroupId ) && empty( $pQuotaId ) ) {
+ $query = 'DELETE FROM `'.BIT_DB_PREFIX.'quotas_group_map` WHERE `group_id`=?';
+ $rs = $this->mDb->query( $query, [ $pGroupId ] );
+ }
+ }
+
+
+ /**
+ * returns the quota and consumption if a user is under usage level
+ **/
+ function isUserUnderQuota( $pUserId ) {
+ $ret = FALSE;
+ if( is_numeric( $pUserId ) ) {
+ $query = 'SELECT MAX(qo.`disk_usage`) AS `disk_usage`
+ FROM `'.BIT_DB_PREFIX.'users_users` uu
+ INNER JOIN `'.BIT_DB_PREFIX.'users_groups_map` ugm ON ( ugm.`user_id`=uu.`user_id` )
+ INNER JOIN `'.BIT_DB_PREFIX.'quotas_group_map` qgm ON( qgm.`group_id`=ugm.`group_id` )
+ INNER JOIN `'.BIT_DB_PREFIX.'quotas` qo ON( qo.`quota_id`=qgm.`quota_id` )
+ WHERE uu.`user_id`=?';
+ if( $rs = $this->mDb->query( $query, [ $pUserId ] ) ) {
+ $diskQuota = $rs->fields['disk_usage'];
+ $diskConsumed = $this->getUserUsage( $pUserId );
+ if( $diskQuota == NULL || $diskQuota > $diskConsumed ) {
+ $ret = [ $diskQuota, $diskConsumed ];
+ }
+ }
+ }
+ return $ret;
+ }
+
+
+ /**
+ * Given a user_id, this will return the max quota for the given user. If the user belongs to more than one group, it will chose the max values
+ * @param integer pUserId user_id of the user for usage to be calculated for
+ * @return integer an integer of the total bytes used
+ */
+ public function getUserQuota( $pUserId ) {
+ $ret = 0;
+ if( is_numeric( $pUserId ) ) {
+ $query = 'SELECT MAX(qo.`disk_usage`) AS `disk_usage`
+ FROM `'.BIT_DB_PREFIX.'users_users` uu
+ INNER JOIN `'.BIT_DB_PREFIX.'users_groups_map` ugm ON ( ugm.`user_id`=uu.`user_id` )
+ INNER JOIN `'.BIT_DB_PREFIX.'quotas_group_map` qgm ON( qgm.`group_id`=ugm.`group_id` )
+ INNER JOIN `'.BIT_DB_PREFIX.'quotas` qo ON( qo.`quota_id`=qgm.`quota_id` )
+ WHERE uu.`user_id`=?';
+ $ret = $this->mDb->getOne( $query, [ $pUserId ] );
+ }
+ return $ret;
+ }
+
+ /**
+ * Given a user_id, this will return this disk space used for the given user
+ * @param integer pUserId user_id of the user for usage to be calculated for
+ * @return integer an integer of the total bytes used
+ */
+ public function getUserUsage( $pUserId ) {
+ $ret = 0;
+ if( is_numeric( $pUserId ) ) {
+ // INNER JOIN on attachments so orphans are not counted
+ $ret = $this->mDb->getOne( "SELECT SUM(`file_size`) FROM `".BIT_DB_PREFIX."liberty_files` lf INNER JOIN `".BIT_DB_PREFIX."liberty_attachments` la ON (lf.`file_id`=la.`foreign_id`) WHERE lf.`user_id`=?", array( $pUserId ) );
+ }
+ return $ret;
+ }
+
+ /**
+ * Generates the URL to the quota page
+ * @return string the link to display the page.
+ */
+ public function getDisplayUrl() {
+ $ret = NULL;
+ if( BitBase::verifyId( $this->mQuotaId ) ) {
+ $ret = QUOTA_PKG_URL."index.php?quota_id=".$this->mQuotaId;
+ }
+ return $ret;
+ }
+
+ public function isValid() {
+ return @BitBase::verifyId( $this->mQuotaId );
+ }
+
+}