miniflux-legacy/models/group.php
2016-04-17 19:44:45 -04:00

273 lines
5.8 KiB
PHP

<?php
namespace Model\Group;
use PicoDb\Database;
/**
* Get all groups
*
* @return array
*/
function get_all()
{
return Database::getInstance('db')
->table('groups')
->orderBy('title')
->findAll();
}
/**
* Get assoc array of group ids with assigned feeds ids
*
* @return array
*/
function get_map()
{
$result = Database::getInstance('db')
->table('feeds_groups')
->findAll();
// TODO: add PDO::FETCH_COLUMN|PDO::FETCH_GROUP to picodb and use it instead
// of the following lines
$map = array();
foreach ($result as $row) {
$group_id = $row['group_id'];
$feed_id = $row['feed_id'];
if (isset($map[$group_id])) {
$map[$group_id][] = $feed_id;
} else {
$map[$group_id] = array($feed_id);
}
}
return $map;
}
/**
* Get assoc array of feeds ids with assigned groups ids
*
* @return array
*/
function get_feeds_map()
{
$result = Database::getInstance('db')
->table('feeds_groups')
->findAll();
$map = array();
foreach ($result as $row) {
$map[$row['feed_id']][] = $row['group_id'];
}
return $map;
}
/**
* Get all groups assigned to feed
*
* @param integer $feed_id id of the feed
* @return array
*/
function get_feed_group_ids($feed_id)
{
return Database::getInstance('db')
->table('groups')
->join('feeds_groups', 'group_id', 'id')
->eq('feed_id', $feed_id)
->findAllByColumn('id');
}
function get_feed_groups($feed_id)
{
return Database::getInstance('db')
->table('groups')
->columns('groups.id', 'groups.title')
->join('feeds_groups', 'group_id', 'id')
->eq('feed_id', $feed_id)
->findAll();
}
/**
* Get the id of a group
*
* @param string $title group name
* @return mixed group id or false if not found
*/
function get_group_id($title)
{
return Database::getInstance('db')
->table('groups')
->eq('title', $title)
->findOneColumn('id');
}
/**
* Get all feed ids assigned to a group
*
* @param integer $group_id
* @return array
*/
function get_feeds_by_group($group_id)
{
return Database::getInstance('db')
->table('feeds_groups')
->eq('group_id', $group_id)
->findAllByColumn('feed_id');
}
/**
* Add a group to the Database
*
* Returns either the id of the new group or the id of an existing group with
* the same name
*
* @param string $title group name
* @return mixed id of the created group or false on error
*/
function create($title)
{
$data = array('title' => $title);
// check if the group already exists
$group_id = get_group_id($title);
// create group if missing
if ($group_id === false) {
Database::getInstance('db')
->table('groups')
->insert($data);
$group_id = get_group_id($title);
}
return $group_id;
}
/**
* Add groups to feed
*
* @param integer $feed_id feed id
* @param array $group_ids array of group ids
* @return boolean true on success, false on error
*/
function add($feed_id, array $group_ids)
{
foreach ($group_ids as $group_id) {
$data = array('feed_id' => $feed_id, 'group_id' => $group_id);
$result = Database::getInstance('db')
->table('feeds_groups')
->insert($data);
if ($result === false) {
return false;
}
}
return true;
}
/**
* Remove groups from feed
*
* @param integer $feed_id id of the feed
* @param array $group_ids array of group ids
* @return boolean true on success, false on error
*/
function remove($feed_id, array $group_ids)
{
$result = Database::getInstance('db')
->table('feeds_groups')
->eq('feed_id', $feed_id)
->in('group_id', $group_ids)
->remove();
// remove empty groups
if ($result) {
purge_groups();
}
return $result;
}
/**
* Remove all groups from feed
*
* @param integer $feed_id id of the feed
* @return boolean true on success, false on error
*/
function remove_all($feed_id)
{
$result = Database::getInstance('db')
->table('feeds_groups')
->eq('feed_id', $feed_id)
->remove();
// remove empty groups
if ($result) {
purge_groups();
}
return $result;
}
/**
* Purge orphaned groups from database
*/
function purge_groups()
{
$groups = Database::getInstance('db')
->table('groups')
->join('feeds_groups', 'group_id', 'id')
->isNull('feed_id')
->findAllByColumn('id');
if (! empty($groups)) {
Database::getInstance('db')
->table('groups')
->in('id', $groups)
->remove();
}
}
/**
* Update feed group associations
*
* @param integer $feed_id id of the feed to update
* @param array $group_ids valid groups ids for feed
* @param string $create_group group to create and assign to feed
* @return boolean
*/
function update_feed_groups($feed_id, array $group_ids, $create_group = '')
{
if ($create_group !== '') {
$id = create($create_group);
if ($id === false) {
return false;
}
if (! in_array($id, $group_ids)) {
$group_ids[] = $id;
}
}
$assigned = get_feed_group_ids($feed_id);
$superfluous = array_diff($assigned, $group_ids);
$missing = array_diff($group_ids, $assigned);
// remove no longer assigned groups from feed
if (! empty($superfluous) && ! remove($feed_id, $superfluous)) {
return false;
}
// add requested groups to feed
if (! empty($missing) && ! add($feed_id, $missing)) {
return false;
}
return true;
}