Move webhook to project notification type

This commit is contained in:
Frederic Guillot
2015-10-17 12:30:05 -04:00
parent 3543f45c2d
commit 472f94efee
18 changed files with 311 additions and 129 deletions

View File

@@ -13,7 +13,7 @@ use Pimple\Container;
abstract class NotificationType extends Base
{
/**
* Mail transport instances
* Container
*
* @access private
* @var \Pimple\Container
@@ -21,13 +21,21 @@ abstract class NotificationType extends Base
private $classes;
/**
* Mail transport instances
* Notification type labels
*
* @access private
* @var array
*/
private $labels = array();
/**
* Hidden notification types
*
* @access private
* @var array
*/
private $hiddens = array();
/**
* Constructor
*
@@ -47,15 +55,24 @@ abstract class NotificationType extends Base
* @param string $type
* @param string $label
* @param string $class
* @param boolean $hidden
* @return NotificationType
*/
public function setType($type, $label, $class)
public function setType($type, $label, $class, $hidden = false)
{
$container = $this->container;
$this->labels[$type] = $label;
if ($hidden) {
$this->hiddens[] = $type;
} else {
$this->labels[$type] = $label;
}
$this->classes[$type] = function () use ($class, $container) {
return new $class($container);
};
return $this;
}
/**
@@ -80,4 +97,15 @@ abstract class NotificationType extends Base
{
return $this->labels;
}
/**
* Get all hidden notification types
*
* @access public
* @return array
*/
public function getHiddenTypes()
{
return $this->hiddens;
}
}

View File

@@ -20,8 +20,6 @@ class OverdueNotification extends Base
$tasks = $this->taskFinder->getOverdueTasks();
foreach ($this->groupByColumn($tasks, 'project_id') as $project_id => $project_tasks) {
// Get the list of users that should receive notifications for each projects
$users = $this->userNotification->getUsersWithNotificationEnabled($project_id);
foreach ($users as $user) {

View File

@@ -0,0 +1,29 @@
<?php
namespace Kanboard\Model;
/**
* Project Notification
*
* @package model
* @author Frederic Guillot
*/
class ProjectNotification extends Base
{
/**
* Send notifications
*
* @access public
* @param integer $project_id
* @param string $event_name
* @param array $event_data
*/
public function sendNotifications($project_id, $event_name, array $event_data)
{
$project = $this->project->getById($project_id);
foreach ($this->projectNotificationType->getSelectedTypes($project_id) as $type) {
$this->projectNotificationType->getType($type)->notifyProject($project, $event_name, $event_data);
}
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace Kanboard\Model;
/**
* Project Notification Type
*
* @package model
* @author Frederic Guillot
*/
class ProjectNotificationType extends NotificationType
{
/**
* SQL table name
*
* @var string
*/
const TABLE = 'project_has_notification_types';
/**
* Get selected notification types for a given project
*
* @access public
* @param integer $project_id
* @return array
*/
public function getSelectedTypes($project_id)
{
$selectedTypes = $this->db
->table(self::TABLE)
->eq('project_id', $project_id)
->asc('notification_type')
->findAllByColumn('notification_type');
return array_merge($this->getHiddenTypes(), $selectedTypes);
}
/**
* Save notification types for a given project
*
* @access public
* @param integer $project_id
* @param string[] $types
* @return boolean
*/
public function saveSelectedTypes($project_id, array $types)
{
$results = array();
$this->db->table(self::TABLE)->eq('project_id', $project_id)->remove();
foreach ($types as $type) {
$results[] = $this->db->table(self::TABLE)->insert(array('project_id' => $project_id, 'notification_type' => $type));
}
return ! in_array(false, $results);
}
}

View File

@@ -1,34 +0,0 @@
<?php
namespace Kanboard\Model;
/**
* Webhook model
*
* @package model
* @author Frederic Guillot
*/
class Webhook extends Base
{
/**
* Call the external URL
*
* @access public
* @param array $values Event payload
*/
public function notify(array $values)
{
$url = $this->config->get('webhook_url');
$token = $this->config->get('webhook_token');
if (! empty($url)) {
if (strpos($url, '?') !== false) {
$url .= '&token='.$token;
} else {
$url .= '?token='.$token;
}
return $this->httpClient->postJson($url, $values);
}
}
}