1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/kanboard_ynh.git synced 2024-09-03 19:36:17 +02:00
kanboard_ynh/sources/app/Model/Project.php

488 lines
12 KiB
PHP
Raw Normal View History

2014-07-20 12:26:15 +02:00
<?php
namespace Model;
use SimpleValidator\Validator;
use SimpleValidator\Validators;
use Core\Security;
/**
* Project model
*
* @package model
* @author Frederic Guillot
*/
class Project extends Base
{
/**
* SQL table name for projects
*
* @var string
*/
const TABLE = 'projects';
/**
* Value for active project
*
* @var integer
*/
const ACTIVE = 1;
/**
* Value for inactive project
*
* @var integer
*/
const INACTIVE = 0;
/**
* Get a project by the id
*
* @access public
* @param integer $project_id Project id
* @return array
*/
public function getById($project_id)
{
return $this->db->table(self::TABLE)->eq('id', $project_id)->findOne();
}
/**
* Get a project by the name
*
* @access public
2015-01-16 14:23:05 +01:00
* @param string $name Project name
2014-07-20 12:26:15 +02:00
* @return array
*/
2015-01-16 14:23:05 +01:00
public function getByName($name)
2014-07-20 12:26:15 +02:00
{
2015-01-16 14:23:05 +01:00
return $this->db->table(self::TABLE)->eq('name', $name)->findOne();
2014-07-20 12:26:15 +02:00
}
/**
* Fetch project data by using the token
*
* @access public
* @param string $token Token
* @return array
*/
public function getByToken($token)
{
2014-10-22 19:59:09 +02:00
return $this->db->table(self::TABLE)->eq('token', $token)->eq('is_public', 1)->findOne();
2014-07-20 12:26:15 +02:00
}
/**
* Return the first project from the database (no sorting)
*
* @access public
* @return array
*/
public function getFirst()
{
return $this->db->table(self::TABLE)->findOne();
}
2014-11-23 20:13:38 +01:00
/**
* Return true if the project is private
*
* @access public
* @param integer $project_id Project id
* @return boolean
*/
public function isPrivate($project_id)
{
return (bool) $this->db->table(self::TABLE)->eq('id', $project_id)->eq('is_private', 1)->count();
}
2014-07-20 12:26:15 +02:00
/**
2015-02-25 17:29:06 +01:00
* Get all projects
2014-07-20 12:26:15 +02:00
*
* @access public
* @return array
*/
2015-02-25 17:29:06 +01:00
public function getAll()
2014-07-20 12:26:15 +02:00
{
2015-02-25 17:29:06 +01:00
return $this->db->table(self::TABLE)->asc('name')->findAll();
}
2014-07-20 12:26:15 +02:00
2015-02-25 17:29:06 +01:00
/**
* Get all project ids
*
* @access public
* @return array
*/
public function getAllIds()
{
return $this->db->table(self::TABLE)->asc('name')->findAllByColumn('id');
2014-07-20 12:26:15 +02:00
}
/**
* Return the list of all projects
*
* @access public
* @param bool $prepend If true, prepend to the list the value 'None'
* @return array
*/
public function getList($prepend = true)
{
if ($prepend) {
2015-02-25 17:29:06 +01:00
return array(t('None')) + $this->db->hashtable(self::TABLE)->asc('name')->getAll('id', 'name');
2014-07-20 12:26:15 +02:00
}
2015-02-25 17:29:06 +01:00
return $this->db->hashtable(self::TABLE)->asc('name')->getAll('id', 'name');
2014-07-20 12:26:15 +02:00
}
/**
* Get all projects with all its data for a given status
*
* @access public
* @param integer $status Proejct status: self::ACTIVE or self:INACTIVE
* @return array
*/
public function getAllByStatus($status)
{
return $this->db
->table(self::TABLE)
->asc('name')
->eq('is_active', $status)
->findAll();
}
/**
* Get a list of project by status
*
* @access public
* @param integer $status Project status: self::ACTIVE or self:INACTIVE
* @return array
*/
public function getListByStatus($status)
{
return $this->db
2015-02-25 17:29:06 +01:00
->hashtable(self::TABLE)
2014-07-20 12:26:15 +02:00
->asc('name')
->eq('is_active', $status)
2015-02-25 17:29:06 +01:00
->getAll('id', 'name');
2014-07-20 12:26:15 +02:00
}
/**
* Return the number of projects by status
*
* @access public
* @param integer $status Status: self::ACTIVE or self:INACTIVE
* @return integer
*/
public function countByStatus($status)
{
return $this->db
->table(self::TABLE)
->eq('is_active', $status)
->count();
}
2014-10-22 19:59:09 +02:00
/**
* Gather some task metrics for a given project
*
* @access public
* @param integer $project_id Project id
* @return array
*/
2015-02-25 17:29:06 +01:00
public function getTaskStats($project_id)
2014-10-22 19:59:09 +02:00
{
$stats = array();
$stats['nb_active_tasks'] = 0;
2015-01-16 14:23:05 +01:00
$columns = $this->board->getColumns($project_id);
$column_stats = $this->board->getColumnStats($project_id);
2014-10-22 19:59:09 +02:00
foreach ($columns as &$column) {
2015-01-16 14:23:05 +01:00
$column['nb_active_tasks'] = isset($column_stats[$column['id']]) ? $column_stats[$column['id']] : 0;
2014-10-22 19:59:09 +02:00
$stats['nb_active_tasks'] += $column['nb_active_tasks'];
}
$stats['columns'] = $columns;
2014-11-23 20:13:38 +01:00
$stats['nb_tasks'] = $this->taskFinder->countByProjectId($project_id);
2014-10-22 19:59:09 +02:00
$stats['nb_inactive_tasks'] = $stats['nb_tasks'] - $stats['nb_active_tasks'];
return $stats;
}
/**
2015-02-25 17:29:06 +01:00
* Get stats for each column of a project
2014-10-22 19:59:09 +02:00
*
2015-02-25 17:29:06 +01:00
* @access public
* @param array $project
* @return array
2014-10-22 19:59:09 +02:00
*/
2015-02-25 17:29:06 +01:00
public function getColumnStats(array &$project)
2014-10-22 19:59:09 +02:00
{
2015-02-25 17:29:06 +01:00
$project['columns'] = $this->board->getColumns($project['id']);
$stats = $this->board->getColumnStats($project['id']);
2014-10-22 19:59:09 +02:00
2015-02-25 17:29:06 +01:00
foreach ($project['columns'] as &$column) {
$column['nb_tasks'] = isset($stats[$column['id']]) ? $stats[$column['id']] : 0;
2014-10-22 19:59:09 +02:00
}
2015-02-25 17:29:06 +01:00
return $project;
2014-10-22 19:59:09 +02:00
}
/**
2015-02-25 17:29:06 +01:00
* Apply column stats to a collection of projects (filter callback)
2014-10-22 19:59:09 +02:00
*
2015-02-25 17:29:06 +01:00
* @access public
* @param array $projects
* @return array
2014-10-22 19:59:09 +02:00
*/
2015-02-25 17:29:06 +01:00
public function applyColumnStats(array $projects)
2014-10-22 19:59:09 +02:00
{
2015-02-25 17:29:06 +01:00
foreach ($projects as &$project) {
$this->getColumnStats($project);
2014-10-22 19:59:09 +02:00
}
2015-02-25 17:29:06 +01:00
return $projects;
}
2014-10-22 19:59:09 +02:00
2015-02-25 17:29:06 +01:00
/**
* Get project summary for a list of project
*
* @access public
* @param array $project_ids List of project id
* @return \PicoDb\Table
*/
public function getQueryColumnStats(array $project_ids)
{
if (empty($project_ids)) {
return $this->db->table(Project::TABLE)->limit(0);
2014-10-22 19:59:09 +02:00
}
2015-02-25 17:29:06 +01:00
return $this->db
->table(Project::TABLE)
->in('id', $project_ids)
->filter(array($this, 'applyColumnStats'));
2014-10-22 19:59:09 +02:00
}
2014-07-20 12:26:15 +02:00
/**
* Create a project
*
* @access public
2014-12-22 19:15:38 +01:00
* @param array $values Form values
* @param integer $user_id User who create the project
* @param bool $add_user Automatically add the user
* @return integer Project id
2014-07-20 12:26:15 +02:00
*/
2014-12-22 19:15:38 +01:00
public function create(array $values, $user_id = 0, $add_user = false)
2014-07-20 12:26:15 +02:00
{
$this->db->startTransaction();
2014-10-22 19:59:09 +02:00
$values['token'] = '';
$values['last_modified'] = time();
2014-11-23 20:13:38 +01:00
$values['is_private'] = empty($values['is_private']) ? 0 : 1;
2014-07-20 12:26:15 +02:00
if (! $this->db->table(self::TABLE)->save($values)) {
$this->db->cancelTransaction();
return false;
}
$project_id = $this->db->getConnection()->getLastId();
2014-10-22 19:59:09 +02:00
2014-11-23 20:13:38 +01:00
if (! $this->board->create($project_id, $this->board->getUserColumns())) {
$this->db->cancelTransaction();
return false;
}
2014-10-22 19:59:09 +02:00
2014-12-22 19:15:38 +01:00
if ($add_user && $user_id) {
2015-01-16 14:23:05 +01:00
$this->projectPermission->addManager($project_id, $user_id);
2014-10-22 19:59:09 +02:00
}
2014-07-20 12:26:15 +02:00
2015-01-16 14:23:05 +01:00
$this->category->createDefaultCategories($project_id);
2014-07-20 12:26:15 +02:00
$this->db->closeTransaction();
return (int) $project_id;
}
/**
* Check if the project have been modified
*
* @access public
* @param integer $project_id Project id
* @param integer $timestamp Timestamp
* @return bool
*/
public function isModifiedSince($project_id, $timestamp)
{
return (bool) $this->db->table(self::TABLE)
->eq('id', $project_id)
->gt('last_modified', $timestamp)
->count();
}
/**
* Update modification date
*
* @access public
* @param integer $project_id Project id
* @return bool
*/
public function updateModificationDate($project_id)
{
2014-10-22 19:59:09 +02:00
return $this->db->table(self::TABLE)->eq('id', $project_id)->update(array(
2014-07-20 12:26:15 +02:00
'last_modified' => time()
));
}
/**
* Update a project
*
* @access public
* @param array $values Form values
* @return bool
*/
public function update(array $values)
{
2014-10-22 19:59:09 +02:00
return $this->exists($values['id']) &&
$this->db->table(self::TABLE)->eq('id', $values['id'])->save($values);
2014-07-20 12:26:15 +02:00
}
/**
* Remove a project
*
* @access public
* @param integer $project_id Project id
* @return bool
*/
public function remove($project_id)
{
return $this->db->table(self::TABLE)->eq('id', $project_id)->remove();
}
2014-10-22 19:59:09 +02:00
/**
* Return true if the project exists
*
* @access public
* @param integer $project_id Project id
* @return boolean
*/
public function exists($project_id)
{
return $this->db->table(self::TABLE)->eq('id', $project_id)->count() === 1;
}
2014-07-20 12:26:15 +02:00
/**
* Enable a project
*
* @access public
* @param integer $project_id Project id
* @return bool
*/
public function enable($project_id)
{
2014-10-22 19:59:09 +02:00
return $this->exists($project_id) &&
$this->db
2014-07-20 12:26:15 +02:00
->table(self::TABLE)
->eq('id', $project_id)
2014-10-22 19:59:09 +02:00
->update(array('is_active' => 1));
2014-07-20 12:26:15 +02:00
}
/**
* Disable a project
*
* @access public
* @param integer $project_id Project id
* @return bool
*/
public function disable($project_id)
{
2014-10-22 19:59:09 +02:00
return $this->exists($project_id) &&
$this->db
->table(self::TABLE)
->eq('id', $project_id)
->update(array('is_active' => 0));
}
/**
* Enable public access for a project
*
* @access public
* @param integer $project_id Project id
* @return bool
*/
public function enablePublicAccess($project_id)
{
return $this->exists($project_id) &&
$this->db
->table(self::TABLE)
->eq('id', $project_id)
->save(array('is_public' => 1, 'token' => Security::generateToken()));
}
/**
* Disable public access for a project
*
* @access public
* @param integer $project_id Project id
* @return bool
*/
public function disablePublicAccess($project_id)
{
return $this->exists($project_id) &&
$this->db
2014-07-20 12:26:15 +02:00
->table(self::TABLE)
->eq('id', $project_id)
2014-10-22 19:59:09 +02:00
->save(array('is_public' => 0, 'token' => ''));
}
/**
* Common validation rules
*
* @access private
* @return array
*/
private function commonValidationRules()
{
return array(
new Validators\Integer('id', t('This value must be an integer')),
new Validators\Integer('is_active', t('This value must be an integer')),
new Validators\Required('name', t('The project name is required')),
new Validators\MaxLength('name', t('The maximum length is %d characters', 50), 50),
new Validators\Unique('name', t('This project must be unique'), $this->db->getConnection(), self::TABLE),
);
2014-07-20 12:26:15 +02:00
}
/**
* Validate project creation
*
* @access public
* @param array $values Form values
* @return array $valid, $errors [0] = Success or not, [1] = List of errors
*/
public function validateCreation(array $values)
{
2014-10-22 19:59:09 +02:00
$v = new Validator($values, $this->commonValidationRules());
2014-07-20 12:26:15 +02:00
return array(
$v->execute(),
$v->getErrors()
);
}
/**
* Validate project modification
*
* @access public
* @param array $values Form values
* @return array $valid, $errors [0] = Success or not, [1] = List of errors
*/
public function validateModification(array $values)
{
2014-10-22 19:59:09 +02:00
$rules = array(
new Validators\Required('id', t('This value is required')),
);
$v = new Validator($values, array_merge($rules, $this->commonValidationRules()));
2014-07-20 12:26:15 +02:00
return array(
$v->execute(),
$v->getErrors()
);
}
}