%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/cospend/lib/Db/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/cospend/lib/Db/ProjectMapper.php |
<?php
/**
* Nextcloud - cospend
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Julien Veyssier <julien-nc@posteo.net>
* @copyright Julien Veyssier 2019
*/
namespace OCA\Cospend\Db;
use DateTime;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\AppFramework\Db\QBMapper;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\IL10N;
/**
* @extends QBMapper<Project>
*/
class ProjectMapper extends QBMapper {
public const TABLE_NAME = 'cospend_projects';
public const ARCHIVED_TS_UNSET = -1;
public const ARCHIVED_TS_NOW = 0;
public function __construct(
IDBConnection $db,
private IL10N $l10n,
) {
parent::__construct($db, self::TABLE_NAME, Project::class);
}
public function createProject(
string $name, string $id, ?string $contact_email, array $defaultCategories, array $defaultPaymentModes,
string $userid = '', bool $createDefaultCategories = true, bool $createDefaultPaymentModes = true
): array {
$qb = $this->db->getQueryBuilder();
$qb->select('id')
->from($this->getTableName(), 'p')
->where(
$qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_STR))
);
$req = $qb->executeQuery();
$dbId = null;
while ($row = $req->fetch()) {
$dbId = $row['id'];
break;
}
$req->closeCursor();
$qb = $qb->resetQueryParts();
if ($dbId === null) {
// check if id is valid
if (strpos($id, '/') !== false) {
return ['message' => $this->l10n->t('Invalid project id')];
}
if ($contact_email === null) {
$contact_email = '';
}
$ts = (new DateTime())->getTimestamp();
$qb->insert($this->getTableName())
->values([
'userid' => $qb->createNamedParameter($userid, IQueryBuilder::PARAM_STR),
'id' => $qb->createNamedParameter($id, IQueryBuilder::PARAM_STR),
'name' => $qb->createNamedParameter($name, IQueryBuilder::PARAM_STR),
'email' => $qb->createNamedParameter($contact_email, IQueryBuilder::PARAM_STR),
'lastchanged' => $qb->createNamedParameter($ts, IQueryBuilder::PARAM_INT)
]);
$qb->executeStatement();
$qb = $qb->resetQueryParts();
// create default categories
if ($createDefaultCategories) {
foreach ($defaultCategories as $category) {
$icon = urlencode($category['icon']);
$color = $category['color'];
$name = $category['name'];
$qb->insert('cospend_categories')
->values([
'projectid' => $qb->createNamedParameter($id, IQueryBuilder::PARAM_STR),
'encoded_icon' => $qb->createNamedParameter($icon, IQueryBuilder::PARAM_STR),
'color' => $qb->createNamedParameter($color, IQueryBuilder::PARAM_STR),
'name' => $qb->createNamedParameter($name, IQueryBuilder::PARAM_STR),
]);
$qb->executeStatement();
$qb = $qb->resetQueryParts();
}
}
// create default payment modes
if ($createDefaultPaymentModes) {
foreach ($defaultPaymentModes as $pm) {
$icon = urlencode($pm['icon']);
$color = $pm['color'];
$name = $pm['name'];
$oldId = $pm['old_id'];
$qb->insert('cospend_paymentmodes')
->values([
'projectid' => $qb->createNamedParameter($id, IQueryBuilder::PARAM_STR),
'encoded_icon' => $qb->createNamedParameter($icon, IQueryBuilder::PARAM_STR),
'color' => $qb->createNamedParameter($color, IQueryBuilder::PARAM_STR),
'name' => $qb->createNamedParameter($name, IQueryBuilder::PARAM_STR),
'old_id' => $qb->createNamedParameter($oldId, IQueryBuilder::PARAM_STR),
]);
$qb->executeStatement();
$qb = $qb->resetQueryParts();
}
}
return ['id' => $id];
} else {
return ['message' => $this->l10n->t('A project with id "%1$s" already exists', [$id])];
}
}
/**
* @param string $id
* @return Project|null
*/
public function find(string $id): ?Project {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where(
$qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_STR))
);
try {
return $this->findEntity($qb);
} catch (DoesNotExistException | MultipleObjectsReturnedException |\OCP\DB\Exception $e) {
return null;
}
}
/**
* @param string $userId
* @return array
* @throws \OCP\DB\Exception
*/
public function getProjects(string $userId): array {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where(
$qb->expr()->eq('userid', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR))
);
return $this->findEntities($qb);
}
/**
* @param string $projectId
* @return void
* @throws \OCP\DB\Exception
*/
public function deleteBillOwersOfProject(string $projectId): void {
// old style
/*
$query = 'DELETE FROM `*PREFIX*cospend_bill_owers`
WHERE `billid` IN (
SELECT `id` FROM `*PREFIX*cospend_bills` WHERE `projectid` = ?
)';
$this->db->executeQuery($query, [$projectId]);
*/
// inspired from the tables app
$qb = $this->db->getQueryBuilder();
$qb2 = $this->db->getQueryBuilder();
$qb2->select('id')
->from('cospend_bills')
->where(
$qb2->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
$qb->delete('cospend_bill_owers')
->where(
$qb2->expr()->in('billid', $qb->createFunction($qb2->getSQL()), IQueryBuilder::PARAM_STR_ARRAY)
);
$qb->executeStatement();
$qb->resetQueryParts();
}
/**
* Touch a project
*
* @param string $projectId
* @param int $timestamp
* @return void
* @throws \OCP\DB\Exception
*/
public function updateProjectLastChanged(string $projectId, int $timestamp): void {
$qb = $this->db->getQueryBuilder();
$qb->update($this->getTableName());
$qb->set('lastchanged', $qb->createNamedParameter($timestamp, IQueryBuilder::PARAM_INT));
$qb->where(
$qb->expr()->eq('id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
$qb->executeStatement();
$qb->resetQueryParts();
}
}