rename all necessary columns

Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
This commit is contained in:
Julien Veyssier
2024-09-21 16:46:23 +02:00
parent a8a9fcf958
commit 3d30542699
29 changed files with 611 additions and 242 deletions

View File

@@ -3,7 +3,7 @@
<id>cospend</id>
<name>Cospend</name>
<summary> </summary><description> </description>
<version>3.0.1</version>
<version>3.0.2</version>
<licence>agpl</licence>
<author mail="julien-nc@posteo.net">Julien Veyssier</author>
<namespace>Cospend</namespace>

View File

@@ -157,7 +157,8 @@ class ApiController extends OCSController {
/**
* Get federated project list
*
* @return DataResponse<Http::STATUS_OK, CospendFullProjectInfo[], array{}>
* @return DataResponse<Http::STATUS_OK, list<array{id: int, remoteProjectId: string, remoteProjectName: string, remoteServerUrl: string, state: int, userId: string, inviterCloudId: string, inviterDisplayName: string}>, array{}>
* @throws Exception
*
* 200: Project list
*/

View File

@@ -220,11 +220,11 @@ class PublicApiController extends OCSController {
#[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT, tags: ['Public-API_Projects'])]
public function publicGetProjectInfo(string $token): DataResponse {
$share = $this->shareMapper->getLinkOrFederatedShareByToken($token);
$projectInfo = $this->localProjectService->getProjectInfo($share->getProjectid());
$projectInfo = $this->localProjectService->getProjectInfo($share->getProjectId());
if ($projectInfo !== null) {
unset($projectInfo['userid']);
// set the visible access level for frontend
$projectInfo['myaccesslevel'] = $share->getAccesslevel() ;
$projectInfo['myaccesslevel'] = $share->getAccessLevel() ;
return new DataResponse($projectInfo);
}
return new DataResponse(

View File

@@ -51,23 +51,6 @@ class BillMapper extends QBMapper {
return $this->mapRowToEntity($row);
}
/**
* Delete bill owers of given bill
*
* @param int $billId
* @return int
* @throws \OCP\DB\Exception
*/
public function deleteBillOwersOfBill(int $billId): int {
$qb = $this->db->getQueryBuilder();
$qb->delete('cospend_bill_owers')
->where(
$qb->expr()->eq('billid', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_INT))
);
$nbDeleted = $qb->executeStatement();
return $nbDeleted;
}
public function deleteDeletedBills(string $projectId): void {
// first delete the bill owers
$qb = $this->db->getQueryBuilder();
@@ -84,7 +67,7 @@ class BillMapper extends QBMapper {
$qb->delete('cospend_bill_owers')
->where(
$qb2->expr()->in('billid', $qb->createFunction($qb2->getSQL()), IQueryBuilder::PARAM_STR_ARRAY)
$qb2->expr()->in('bill_id', $qb->createFunction($qb2->getSQL()), IQueryBuilder::PARAM_STR_ARRAY)
);
$qb->executeStatement();
@@ -130,7 +113,7 @@ class BillMapper extends QBMapper {
$qb->delete('cospend_bill_owers')
->where(
$qb2->expr()->in('billid', $qb->createFunction($qb2->getSQL()), IQueryBuilder::PARAM_STR_ARRAY)
$qb2->expr()->in('bill_id', $qb->createFunction($qb2->getSQL()), IQueryBuilder::PARAM_STR_ARRAY)
);
$nbBillOwersDeleted = $qb->executeStatement();
$qb = $this->db->getQueryBuilder();
@@ -258,11 +241,11 @@ class BillMapper extends QBMapper {
$qb = $this->db->getQueryBuilder();
$qb->select('memberid', 'm.name', 'm.weight', 'm.activated')
$qb->select('bo.member_id', 'm.name', 'm.weight', 'm.activated')
->from('cospend_bill_owers', 'bo')
->innerJoin('bo', 'cospend_members', 'm', $qb->expr()->eq('bo.memberid', 'm.id'))
->innerJoin('bo', 'cospend_members', 'm', $qb->expr()->eq('bo.member_id', 'm.id'))
->where(
$qb->expr()->eq('bo.billid', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('bo.bill_id', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_INT))
);
$req = $qb->executeQuery();
@@ -270,7 +253,7 @@ class BillMapper extends QBMapper {
$dbWeight = (float)$row['weight'];
$dbName = $row['name'];
$dbActivated = (((int)$row['activated']) === 1);
$dbOwerId = (int)$row['memberid'];
$dbOwerId = (int)$row['member_id'];
$billOwers[] = [
'id' => $dbOwerId,
'weight' => $dbWeight,
@@ -342,10 +325,10 @@ class BillMapper extends QBMapper {
$qb = $this->db->getQueryBuilder();
$qb->select('bi.id', 'what', 'comment', 'timestamp', 'amount', 'payer_id', 'repeat',
'payment_mode', 'payment_mode_id', 'category_id', 'bi.last_changed', 'repeat_all_active', 'repeat_until', 'repeat_frequency',
'deleted', 'memberid', 'm.name', 'm.weight', 'm.activated')
'deleted', 'bo.member_id', 'm.name', 'm.weight', 'm.activated')
->from('cospend_bill_owers', 'bo')
->innerJoin('bo', 'cospend_bills', 'bi', $qb->expr()->eq('bo.billid', 'bi.id'))
->innerJoin('bo', 'cospend_members', 'm', $qb->expr()->eq('bo.memberid', 'm.id'))
->innerJoin('bo', 'cospend_bills', 'bi', $qb->expr()->eq('bo.bill_id', 'bi.id'))
->innerJoin('bo', 'cospend_members', 'm', $qb->expr()->eq('bo.member_id', 'm.id'))
->where(
$qb->expr()->eq('bi.project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
@@ -432,7 +415,7 @@ class BillMapper extends QBMapper {
$dbWeight = (float)$row['weight'];
$dbName = $row['name'];
$dbActivated = ((int)$row['activated']) === 1;
$dbOwerId = (int)$row['memberid'];
$dbOwerId = (int)$row['member_id'];
$billDict[$dbBillId]['owers'][] = [
'id' => $dbOwerId,
'weight' => $dbWeight,
@@ -602,11 +585,11 @@ class BillMapper extends QBMapper {
$billOwers = [];
$billOwerIds = [];
$qb->select('memberid', 'm.name', 'm.weight', 'm.activated')
$qb->select('bo.member_id', 'm.name', 'm.weight', 'm.activated')
->from('cospend_bill_owers', 'bo')
->innerJoin('bo', 'cospend_members', 'm', $qb->expr()->eq('bo.memberid', 'm.id'))
->innerJoin('bo', 'cospend_members', 'm', $qb->expr()->eq('bo.member_id', 'm.id'))
->where(
$qb->expr()->eq('bo.billid', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('bo.bill_id', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_INT))
);
$qb->setFirstResult(0);
$req = $qb->executeQuery();
@@ -614,7 +597,7 @@ class BillMapper extends QBMapper {
$dbWeight = (float)$row['weight'];
$dbName = $row['name'];
$dbActivated = ((int)$row['activated']) === 1;
$dbOwerId = (int)$row['memberid'];
$dbOwerId = (int)$row['member_id'];
$billOwers[] = [
'id' => $dbOwerId,
'weight' => $dbWeight,
@@ -711,7 +694,7 @@ class BillMapper extends QBMapper {
$qb->select(
'b.id', 'what', 'comment', 'amount', 'timestamp',
'payment_mode', 'payment_mode_id', 'category_id',
'pr.currency_name', 'me.name', 'me.userid'
'pr.currency_name', 'me.name', 'me.user_id'
)
->from($this->getTableName(), 'b')
->innerJoin('b', 'cospend_projects', 'pr', $qb->expr()->eq('b.project_id', 'pr.id'))
@@ -741,7 +724,7 @@ class BillMapper extends QBMapper {
$dbCategoryId = (int)$row['category_id'];
$dbProjectCurrencyName = $row['currency_name'];
$dbPayerName = $row['name'];
$dbPayerUserId = $row['userid'];
$dbPayerUserId = $row['user_id'];
$bills[] = [
'id' => $dbBillId,
'projectId' => $projectId,

View File

@@ -15,28 +15,28 @@ namespace OCA\Cospend\Db;
use OCP\AppFramework\Db\Entity;
/**
* @method int getBillid()
* @method void setBillid(int $billid)
* @method int getMemberid()
* @method void setMemberid(int $memberid)
* @method int getBillId()
* @method void setBillId(int $billId)
* @method int getMemberId()
* @method void setMemberId(int $memberId)
**/
class BillOwer extends Entity implements \JsonSerializable {
protected int $billid = 0;
protected int $memberid = 0;
protected int $billId = 0;
protected int $memberId = 0;
public function __construct() {
$this->addType('id', 'integer');
$this->addType('billid', 'integer');
$this->addType('memberid', 'integer');
$this->addType('bill_id', 'integer');
$this->addType('member_id', 'integer');
}
#[\ReturnTypeWillChange]
public function jsonSerialize() {
return [
'id' => $this->getId(),
'billid' => $this->getBillid(),
'memberid' => $this->getMemberid(),
'billid' => $this->getBillId(),
'memberid' => $this->getMemberId(),
];
}
}

View File

@@ -54,7 +54,7 @@ class BillOwerMapper extends QBMapper {
$qb = $this->db->getQueryBuilder();
$qb->delete($this->getTableName())
->where(
$qb->expr()->eq('billid', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_INT))
$qb->expr()->eq('bill_id', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_INT))
);
$nbDeleted = $qb->executeStatement();
return $nbDeleted;
@@ -70,7 +70,7 @@ class BillOwerMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('billid', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_STR)));
->where($qb->expr()->eq('bill_id', $qb->createNamedParameter($billId, IQueryBuilder::PARAM_STR)));
return $this->findEntities($qb);
}

View File

@@ -11,8 +11,8 @@ namespace OCA\Cospend\Db;
use OCP\AppFramework\Db\Entity;
/**
* @method void setProjectid(string $projectid)
* @method string getProjectid()
* @method void setProjectId(string $projectId)
* @method string getProjectId()
* @method void setName(string|null $name)
* @method string|null getName()
* @method void setColor(string|null $color)
@@ -23,14 +23,14 @@ use OCP\AppFramework\Db\Entity;
* @method int getOrder()
*/
class Category extends Entity implements \JsonSerializable {
protected string $projectid = '';
protected string $projectId = '';
protected ?string $name = null;
protected ?string $color = null;
protected ?string $encodedIcon = null;
protected int $order = 0;
public function __construct() {
$this->addType('projectid', 'string');
$this->addType('project_id', 'string');
$this->addType('name', 'string');
$this->addType('color', 'string');
$this->addType('encoded_icon', 'string');
@@ -40,7 +40,7 @@ class Category extends Entity implements \JsonSerializable {
public function jsonSerialize(): array {
return [
'id' => $this->getId(),
'projectid' => $this->getProjectid(),
'projectid' => $this->getProjectId(),
'name' => $this->getName(),
'color' => $this->getColor(),
'icon' => $this->getEncodedIcon() === null ? null : urldecode($this->getEncodedIcon()),

View File

@@ -61,7 +61,7 @@ class CategoryMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
->andWhere($qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
return $this->findEntity($qb);
}
@@ -76,7 +76,7 @@ class CategoryMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
->where($qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
return $this->findEntities($qb);
}

View File

@@ -11,20 +11,20 @@ namespace OCA\Cospend\Db;
use OCP\AppFramework\Db\Entity;
/**
* @method void setProjectid(string $projectid)
* @method string getProjectid()
* @method void setProjectId(string $projectId)
* @method string getProjectId()
* @method void setName(string|null $name)
* @method string|null getName()
* @method void setExchangeRate(float|null $exchangeRate)
* @method float|null getExchangeRate()
*/
class Currency extends Entity implements \JsonSerializable {
protected string $projectid = '';
protected string $projectId = '';
protected ?string $name = null;
protected ?float $exchangeRate = null;
public function __construct() {
$this->addType('projectid', 'string');
$this->addType('project_id', 'string');
$this->addType('name', 'string');
$this->addType('exchange_rate', 'float');
}
@@ -32,7 +32,7 @@ class Currency extends Entity implements \JsonSerializable {
public function jsonSerialize(): array {
return [
'id' => $this->getId(),
'projectid' => $this->getProjectid(),
'projectid' => $this->getProjectId(),
'name' => $this->getName(),
'exchange_rate' => $this->getExchangeRate(),
];

View File

@@ -61,7 +61,7 @@ class CurrencyMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
->andWhere($qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
return $this->findEntity($qb);
}
@@ -76,7 +76,7 @@ class CurrencyMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
->where($qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
return $this->findEntities($qb);
}

View File

@@ -19,68 +19,68 @@ use OCP\IAvatarManager;
/**
* @method int getId()
* @method void setId(int $id)
* @method string getProjectid()
* @method void setProjectid(string $projectid)
* @method string getProjectId()
* @method void setProjectId(string $projectId)
* @method string getName()
* @method void setName(string $name)
* @method float getWeight()
* @method void setWeight(float $weight)
* @method int getActivated()
* @method void setActivated(int $activated)
* @method int getLastchanged()
* @method void setLastchanged(int $lastchanged)
* @method int getLastChanged()
* @method void setLastChanged(int $lastChanged)
* @method string getColor()
* @method void setColor(string $color)
* @method string|null getUserid()
* @method void setUserid(string|null $userid)
* @method string|null getUserId()
* @method void setUserId(string|null $userId)
*/
class Member extends Entity implements \JsonSerializable {
protected $projectid;
protected $name;
protected $weight;
protected $activated;
protected $lastchanged;
protected $color;
protected $userid;
protected string $projectId = '';
protected string $name = '';
protected float $weight = 0;
protected int $activated = 1;
protected int $lastChanged = 0;
protected ?string $color = null;
protected ?string $userId = null;
private $avatarManager;
public function __construct() {
$this->addType('id', 'integer');
$this->addType('projectid', 'string');
$this->addType('project_id', 'string');
$this->addType('name', 'string');
$this->addType('weight', 'float');
$this->addType('activated', 'integer');
$this->addType('lastchanged', 'integer');
$this->addType('last_changed', 'integer');
$this->addType('color', 'string');
$this->addType('userid', 'string');
$this->addType('user_id', 'string');
$this->avatarManager = \OC::$server->get(IAvatarManager::class);
}
#[\ReturnTypeWillChange]
public function jsonSerialize() {
return [
'id' => $this->id,
'name' => $this->name,
'weight' => $this->weight,
'activated' => $this->activated === 1,
'lastchanged' => $this->lastchanged,
'userid' => $this->userid,
'id' => $this->getId(),
'name' => $this->getName(),
'weight' => $this->getWeight(),
'activated' => $this->getActivated() === 1,
'lastchanged' => $this->getLastChanged(),
'userid' => $this->getUserId(),
'color' => $this->getColorArray(),
];
}
private function getColorArray(): array {
if ($this->color === null) {
$av = $this->avatarManager->getGuestAvatar($this->name);
$avBgColor = $av->avatarBackgroundColor($this->name);
if ($this->getColor() === null) {
$av = $this->avatarManager->getGuestAvatar($this->getName());
$avBgColor = $av->avatarBackgroundColor($this->getName());
return [
'r' => $avBgColor->red(),
'g' => $avBgColor->green(),
'b' => $avBgColor->blue(),
];
}
return Utils::hexToRgb($this->color);
return Utils::hexToRgb($this->getColor());
}
}

View File

@@ -23,12 +23,11 @@ use OCP\IDBConnection;
* @extends QBMapper<Member>
*/
class MemberMapper extends QBMapper {
public const TABLE_NAME = 'cospend_members';
public function __construct(
IDBConnection $db,
) {
parent::__construct($db, self::TABLE_NAME, Member::class);
parent::__construct($db, 'cospend_members', Member::class);
}
/**
@@ -39,9 +38,9 @@ class MemberMapper extends QBMapper {
public function getMemberByName(string $projectId, string $name): ?Member {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from(self::TABLE_NAME)
->from($this->getTableName())
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('name', $qb->createNamedParameter($name, IQueryBuilder::PARAM_STR))
@@ -62,12 +61,12 @@ class MemberMapper extends QBMapper {
public function getMemberByUserid(string $projectId, string $userId): ?Member {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from(self::TABLE_NAME)
->from($this->getTableName())
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('userid', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('user_id', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR))
);
try {
@@ -85,9 +84,9 @@ class MemberMapper extends QBMapper {
public function getMemberById(string $projectId, int $memberId): ?Member {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from(self::TABLE_NAME)
->from($this->getTableName())
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('id', $qb->createNamedParameter($memberId, IQueryBuilder::PARAM_INT))
@@ -119,13 +118,13 @@ class MemberMapper extends QBMapper {
}
$qb->select('*')
->from(self::TABLE_NAME)
->from($this->getTableName())
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
if ($lastchanged !== null) {
$qb->andWhere(
$qb->expr()->gt('lastchanged', $qb->createNamedParameter($lastchanged, IQueryBuilder::PARAM_INT))
$qb->expr()->gt('last_changed', $qb->createNamedParameter($lastchanged, IQueryBuilder::PARAM_INT))
);
}
$qb->orderBy($sqlOrder, 'ASC');
@@ -149,11 +148,11 @@ class MemberMapper extends QBMapper {
$qb = $this->db->getQueryBuilder();
$qb->select('bi.id')
->from('cospend_bill_owers', 'bo')
->innerJoin('bo', 'cospend_bills', 'bi', $qb->expr()->eq('bo.billid', 'bi.id'))
->innerJoin('bo', self::TABLE_NAME, 'm', $qb->expr()->eq('bo.memberid', 'm.id'));
->innerJoin('bo', 'cospend_bills', 'bi', $qb->expr()->eq('bo.bill_id', 'bi.id'))
->innerJoin('bo', $this->getTableName(), 'm', $qb->expr()->eq('bo.member_id', 'm.id'));
$or = $qb->expr()->orx();
$or->add($qb->expr()->eq('bi.payer_id', $qb->createNamedParameter($memberId, IQueryBuilder::PARAM_INT)));
$or->add($qb->expr()->eq('bo.memberid', $qb->createNamedParameter($memberId, IQueryBuilder::PARAM_INT)));
$or->add($qb->expr()->eq('bo.member_id', $qb->createNamedParameter($memberId, IQueryBuilder::PARAM_INT)));
$qb->where($or);
if ($deleted !== null) {
$qb->andWhere(

View File

@@ -11,8 +11,8 @@ namespace OCA\Cospend\Db;
use OCP\AppFramework\Db\Entity;
/**
* @method void setProjectid(string $projectid)
* @method string getProjectid()
* @method void setProjectId(string $projectId)
* @method string getProjectId()
* @method void setName(string|null $name)
* @method string|null getName()
* @method void setColor(string|null $color)
@@ -25,7 +25,7 @@ use OCP\AppFramework\Db\Entity;
* @method string|null getOldId()
*/
class PaymentMode extends Entity implements \JsonSerializable {
protected string $projectid = '';
protected string $projectId = '';
protected ?string $name = null;
protected ?string $color = null;
protected ?string $encodedIcon = null;
@@ -33,7 +33,7 @@ class PaymentMode extends Entity implements \JsonSerializable {
protected ?string $oldId = null;
public function __construct() {
$this->addType('projectid', 'string');
$this->addType('project_id', 'string');
$this->addType('name', 'string');
$this->addType('color', 'string');
$this->addType('encoded_icon', 'string');
@@ -44,7 +44,7 @@ class PaymentMode extends Entity implements \JsonSerializable {
public function jsonSerialize(): array {
return [
'id' => $this->getId(),
'projectid' => $this->getProjectid(),
'projectid' => $this->getProjectId(),
'name' => $this->getName(),
'color' => $this->getColor(),
'icon' => $this->getEncodedIcon() === null ? null : urldecode($this->getEncodedIcon()),

View File

@@ -61,7 +61,7 @@ class PaymentModeMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
->andWhere($qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
return $this->findEntity($qb);
}
@@ -76,7 +76,7 @@ class PaymentModeMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
->where($qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
return $this->findEntities($qb);
}

View File

@@ -31,14 +31,14 @@ use OCP\AppFramework\Db\Entity;
* @method void setCategorySort(string $categorySort)
* @method string getPaymentModeSort()
* @method void setPaymentModeSort(string $paymentModeSort)
* @method string getCurrencyName()
* @method void setCurrencyName(string $currencyName)
* @method int getArchivedTs()
* @method void setArchivedTs(int $archivedTs)
* @method string|null getCurrencyName()
* @method void setCurrencyName(string|null $currencyName)
* @method int|null getArchivedTs()
* @method void setArchivedTs(int|null $archivedTs)
*/
class Project extends Entity implements \JsonSerializable {
protected ?string $userId = null;
protected string $userId = '';
protected string $name = '';
protected string $autoExport = 'n';
protected int $lastChanged = 0;
@@ -64,17 +64,17 @@ class Project extends Entity implements \JsonSerializable {
#[\ReturnTypeWillChange]
public function jsonSerialize() {
return [
'id' => $this->id,
'userid' => $this->userId,
'name' => $this->name,
'id' => $this->getId(),
'userid' => $this->getUserId(),
'name' => $this->getName(),
'email' => '',
'autoexport' => $this->autoExport,
'lastchanged' => $this->lastChanged,
'deletiondisabled' => $this->deletionDisabled === 1,
'categorysort' => $this->categorySort,
'paymentmodesort' => $this->paymentModeSort,
'currencyname' => $this->currencyName,
'archived_ts' => $this->archivedTs,
'autoexport' => $this->getAutoExport(),
'lastchanged' => $this->getLastChanged(),
'deletiondisabled' => $this->getDeletionDisabled() === 1,
'categorysort' => $this->getCategorySort(),
'paymentmodesort' => $this->getPaymentModeSort(),
'currencyname' => $this->getCurrencyName(),
'archived_ts' => $this->getArchivedTs(),
];
}
}

View File

@@ -108,7 +108,7 @@ class ProjectMapper extends QBMapper {
if ($createDefaultCategories) {
foreach ($defaultCategories as $defaultCategory) {
$category = new Category();
$category->setProjectid($insertedProject->getId());
$category->setProjectId($insertedProject->getId());
$category->setName($defaultCategory['name']);
$category->setColor($defaultCategory['color']);
$category->setEncodedIcon(urlencode($defaultCategory['icon']));
@@ -119,7 +119,7 @@ class ProjectMapper extends QBMapper {
if ($createDefaultPaymentModes) {
foreach ($defaultPaymentModes as $defaultPm) {
$paymentMode = new PaymentMode();
$paymentMode->setProjectid($insertedProject->getId());
$paymentMode->setProjectId($insertedProject->getId());
$paymentMode->setName($defaultPm['name']);
$paymentMode->setColor($defaultPm['color']);
$paymentMode->setEncodedIcon(urlencode($defaultPm['icon']));
@@ -175,7 +175,7 @@ class ProjectMapper extends QBMapper {
$qb->delete('cospend_bill_owers')
->where(
$qb2->expr()->in('billid', $qb->createFunction($qb2->getSQL()), IQueryBuilder::PARAM_STR_ARRAY)
$qb2->expr()->in('bill_id', $qb->createFunction($qb2->getSQL()), IQueryBuilder::PARAM_STR_ARRAY)
);
$qb->executeStatement();
}

View File

@@ -11,14 +11,14 @@ namespace OCA\Cospend\Db;
use OCP\AppFramework\Db\Entity;
/**
* @method void setProjectid(string $projectid)
* @method string getProjectid()
* @method void setUserid(string|null $userid)
* @method string|null getUserid()
* @method void setProjectId(string $projectId)
* @method string getProjectId()
* @method void setUserId(string|null $userId)
* @method string|null getUserId()
* @method void setType(string $type)
* @method string getType()
* @method void setAccesslevel(int $accesslevel)
* @method int getAccesslevel()
* @method void setAccessLevel(int $accessLevel)
* @method int getAccessLevel()
* @method void setManuallyAdded(int $manuallyAdded)
* @method int getManuallyAdded()
* @method void setLabel(string|null $label)
@@ -37,10 +37,10 @@ class Share extends Entity implements \JsonSerializable {
public const TYPE_GROUP = 'g';
public const TYPE_CIRCLE = 'c';
protected string $projectid = '';
protected ?string $userid = null;
protected string $projectId = '';
protected ?string $userId = null;
protected string $type = self::TYPE_USER;
protected int $accesslevel = 2;
protected int $accessLevel = 2;
protected int $manuallyAdded = 1;
protected ?string $label = null;
protected ?string $password = null;
@@ -48,10 +48,10 @@ class Share extends Entity implements \JsonSerializable {
protected ?int $state = null;
public function __construct() {
$this->addType('projectid', 'string');
$this->addType('userid', 'string');
$this->addType('project_id', 'string');
$this->addType('user_id', 'string');
$this->addType('type', 'string');
$this->addType('accesslevel', 'integer');
$this->addType('access_level', 'integer');
$this->addType('manually_added', 'integer');
$this->addType('label', 'string');
$this->addType('password', 'string');
@@ -62,10 +62,10 @@ class Share extends Entity implements \JsonSerializable {
public function jsonSerialize(): array {
return [
'id' => $this->getId(),
'projectid' => $this->getProjectid(),
'userid' => $this->getUserid(),
'projectid' => $this->getProjectId(),
'userid' => $this->getUserId(),
'type' => $this->getType(),
'accesslevel' => $this->getAccesslevel(),
'accesslevel' => $this->getAccessLevel(),
'manuallyAdded' => $this->getManuallyAdded() === 1,
'label' => $this->getLabel(),
'password' => $this->getPassword(),

View File

@@ -63,7 +63,7 @@ class ShareMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
->andWhere($qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
if ($type !== null) {
$qb->andWhere($qb->expr()->eq('type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_STR)));
@@ -87,7 +87,7 @@ class ShareMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('userid', $qb->createNamedParameter($token, IQueryBuilder::PARAM_STR)))
->where($qb->expr()->eq('user_id', $qb->createNamedParameter($token, IQueryBuilder::PARAM_STR)))
->andWhere($qb->expr()->eq('type', $qb->createNamedParameter(Share::TYPE_PUBLIC_LINK, IQueryBuilder::PARAM_STR)));
return $this->findEntity($qb);
@@ -108,7 +108,7 @@ class ShareMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('userid', $qb->createNamedParameter($token, IQueryBuilder::PARAM_STR)));
->where($qb->expr()->eq('user_id', $qb->createNamedParameter($token, IQueryBuilder::PARAM_STR)));
$or = $qb->expr()->orx();
$or->add($qb->expr()->eq('type', $qb->createNamedParameter(Share::TYPE_FEDERATION, IQueryBuilder::PARAM_STR)));
@@ -137,11 +137,11 @@ class ShareMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)))
->where($qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)))
->andWhere($qb->expr()->eq('user_cloud_id', $qb->createNamedParameter($userCloudId, IQueryBuilder::PARAM_STR)));
if ($token !== null) {
$qb->andWhere($qb->expr()->eq('userid', $qb->createNamedParameter($token, IQueryBuilder::PARAM_STR)));
$qb->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($token, IQueryBuilder::PARAM_STR)));
}
return $this->findEntity($qb);
@@ -157,7 +157,7 @@ class ShareMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('userid', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)))
->where($qb->expr()->eq('user_id', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)))
->andWhere($qb->expr()->eq('type', $qb->createNamedParameter(Share::TYPE_USER, IQueryBuilder::PARAM_STR)));
return $this->findEntities($qb);
@@ -181,8 +181,8 @@ class ShareMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)))
->andWhere($qb->expr()->eq('userid', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
->where($qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)))
->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
if ($type !== null) {
$qb->andWhere($qb->expr()->eq('type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_STR)));
@@ -202,7 +202,7 @@ class ShareMapper extends QBMapper {
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
->where($qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR)));
if ($type !== null) {
$qb->andWhere($qb->expr()->eq('type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_STR)));

View File

@@ -227,7 +227,7 @@ class CloudFederationProviderCospend implements ICloudFederationProvider {
} catch (Exception) {
throw new ShareNotFound(FederationManager::OCM_RESOURCE_NOT_FOUND);
}
if ($share->getUserid() !== $sharedSecret) {
if ($share->getUserId() !== $sharedSecret) {
throw new AuthenticationFailedException();
}
return $share;

View File

@@ -65,7 +65,7 @@ class PublicAuthMiddleware extends Middleware {
/** @var CospendPublicAuth $cospendAuthAttr */
$cospendAuthAttr = $attribute->newInstance();
$minLevel = $cospendAuthAttr->getMinimumLevel();
if ($share->getAccesslevel() < $minLevel) {
if ($share->getAccessLevel() < $minLevel) {
throw new CospendPublicAuthNotValidException(
$this->l->t('Insufficient access level'), Http::STATUS_UNAUTHORIZED,
$paramToken, $paramPassword, 'insufficient permissions'
@@ -73,7 +73,7 @@ class PublicAuthMiddleware extends Middleware {
}
}
$controller->projectId = $share->getProjectid();
$controller->projectId = $share->getProjectId();
}
}

View File

@@ -0,0 +1,182 @@
<?php
declare(strict_types=1);
namespace OCA\Cospend\Migration;
use Closure;
use OCA\Cospend\AppInfo\Application;
use OCP\DB\ISchemaWrapper;
use OCP\DB\Types;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
class Version030000Date20240921142937 extends SimpleMigrationStep {
public function __construct(
private IDBConnection $connection,
) {
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
* @return null|ISchemaWrapper
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
$schemaChanged = false;
if ($schema->hasTable('cospend_bill_owers')) {
$table = $schema->getTable('cospend_bill_owers');
if (!$table->hasColumn('bill_id')) {
$table->addColumn('bill_id', Types::BIGINT, [
'notnull' => true,
'unsigned' => true,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('member_id')) {
$table->addColumn('member_id', Types::BIGINT, [
'notnull' => true,
'unsigned' => true,
]);
$schemaChanged = true;
}
}
if ($schema->hasTable('cospend_categories')) {
$table = $schema->getTable('cospend_categories');
if (!$table->hasColumn('project_id')) {
$table->addColumn('project_id', Types::STRING, [
'notnull' => true,
'length' => 64,
]);
$schemaChanged = true;
}
}
if ($schema->hasTable('cospend_currencies')) {
$table = $schema->getTable('cospend_currencies');
if (!$table->hasColumn('project_id')) {
$table->addColumn('project_id', Types::STRING, [
'notnull' => true,
'length' => 64,
]);
$schemaChanged = true;
}
}
if ($schema->hasTable('cospend_paymentmodes')) {
$table = $schema->getTable('cospend_paymentmodes');
if (!$table->hasColumn('project_id')) {
$table->addColumn('project_id', Types::STRING, [
'notnull' => true,
'length' => 64,
]);
$schemaChanged = true;
}
}
if ($schema->hasTable('cospend_shares')) {
$table = $schema->getTable('cospend_shares');
if (!$table->hasColumn('project_id')) {
$table->addColumn('project_id', Types::STRING, [
'notnull' => true,
'length' => 64,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('user_id')) {
$table->addColumn('user_id', Types::STRING, [
'notnull' => false,
'length' => 64,
'default' => null,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('access_level')) {
$table->addColumn('access_level', Types::INTEGER, [
'notnull' => true,
'default' => Application::ACCESS_LEVEL_PARTICIPANT,
]);
$schemaChanged = true;
}
}
if ($schema->hasTable('cospend_members')) {
$table = $schema->getTable('cospend_members');
if (!$table->hasColumn('project_id')) {
$table->addColumn('project_id', Types::STRING, [
'notnull' => true,
'length' => 64,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('user_id')) {
$table->addColumn('user_id', Types::STRING, [
'notnull' => false,
'length' => 64,
'default' => null,
]);
$schemaChanged = true;
}
if (!$table->hasColumn('last_changed')) {
$table->addColumn('last_changed', Types::BIGINT, [
'notnull' => true,
'default' => 0,
'unsigned' => true,
]);
$schemaChanged = true;
}
}
return $schemaChanged ? $schema : null;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
$qb = $this->connection->getQueryBuilder();
$qb->update('cospend_bill_owers');
$qb->set('bill_id', 'billid');
$qb->set('member_id', 'memberid');
$qb->executeStatement();
$qb = $this->connection->getQueryBuilder();
$qb->update('cospend_categories');
$qb->set('project_id', 'projectid');
$qb->executeStatement();
$qb = $this->connection->getQueryBuilder();
$qb->update('cospend_currencies');
$qb->set('project_id', 'projectid');
$qb->executeStatement();
$qb = $this->connection->getQueryBuilder();
$qb->update('cospend_paymentmodes');
$qb->set('project_id', 'projectid');
$qb->executeStatement();
$qb = $this->connection->getQueryBuilder();
$qb->update('cospend_shares');
$qb->set('project_id', 'projectid');
$qb->set('user_id', 'userid');
$qb->set('access_level', 'accesslevel');
$qb->executeStatement();
$qb = $this->connection->getQueryBuilder();
$qb->update('cospend_members');
$qb->set('project_id', 'projectid');
$qb->set('user_id', 'userid');
$qb->set('last_changed', 'lastchanged');
$qb->executeStatement();
}
}

View File

@@ -0,0 +1,105 @@
<?php
declare(strict_types=1);
namespace OCA\Cospend\Migration;
use Closure;
use OCP\DB\ISchemaWrapper;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
class Version030000Date20240921143001 extends SimpleMigrationStep {
public function __construct() {
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
* @return null|ISchemaWrapper
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
$schemaChanged = false;
if ($schema->hasTable('cospend_bill_owers')) {
$table = $schema->getTable('cospend_bill_owers');
// drop columns that have been renamed
if ($table->hasColumn('bill_id') && $table->hasColumn('billid')) {
$table->dropColumn('billid');
$schemaChanged = true;
}
if ($table->hasColumn('member_id') && $table->hasColumn('memberid')) {
$table->dropColumn('memberid');
$schemaChanged = true;
}
}
if ($schema->hasTable('cospend_categories')) {
$table = $schema->getTable('cospend_categories');
// drop columns that have been renamed
if ($table->hasColumn('project_id') && $table->hasColumn('projectid')) {
$table->dropColumn('projectid');
$schemaChanged = true;
}
}
if ($schema->hasTable('cospend_currencies')) {
$table = $schema->getTable('cospend_currencies');
// drop columns that have been renamed
if ($table->hasColumn('project_id') && $table->hasColumn('projectid')) {
$table->dropColumn('projectid');
$schemaChanged = true;
}
}
if ($schema->hasTable('cospend_paymentmodes')) {
$table = $schema->getTable('cospend_paymentmodes');
// drop columns that have been renamed
if ($table->hasColumn('project_id') && $table->hasColumn('projectid')) {
$table->dropColumn('projectid');
$schemaChanged = true;
}
}
if ($schema->hasTable('cospend_shares')) {
$table = $schema->getTable('cospend_shares');
// drop columns that have been renamed
if ($table->hasColumn('project_id') && $table->hasColumn('projectid')) {
$table->dropColumn('projectid');
$schemaChanged = true;
}
if ($table->hasColumn('user_id') && $table->hasColumn('userid')) {
$table->dropColumn('userid');
$schemaChanged = true;
}
if ($table->hasColumn('access_level') && $table->hasColumn('accesslevel')) {
$table->dropColumn('accesslevel');
$schemaChanged = true;
}
}
if ($schema->hasTable('cospend_members')) {
$table = $schema->getTable('cospend_members');
// drop columns that have been renamed
if ($table->hasColumn('project_id') && $table->hasColumn('projectid')) {
$table->dropColumn('projectid');
$schemaChanged = true;
}
if ($table->hasColumn('user_id') && $table->hasColumn('userid')) {
$table->dropColumn('userid');
$schemaChanged = true;
}
if ($table->hasColumn('last_changed') && $table->hasColumn('lastchanged')) {
$table->dropColumn('lastchanged');
$schemaChanged = true;
}
}
return $schemaChanged ? $schema : null;
}
}

View File

@@ -115,7 +115,7 @@ class CospendSearchProvider implements IProvider {
$resultBills = array_slice($resultBills, $offset, $limit);
// build formatted
$formattedResults = array_map(function (array $bill) use ($projectsById):SearchResultEntry {
$formattedResults = array_map(function (array $bill) use ($projectsById): SearchResultEntry {
$projectId = $bill['projectId'];
$thumbnailUrl = $this->getThumbnailUrl($bill);
return new SearchResultEntry(

View File

@@ -20,6 +20,7 @@ use OCA\Cospend\Db\Invitation;
use OCA\Cospend\Db\InvitationMapper;
use OCA\Cospend\Utils;
use OCP\DB\Exception;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Files\File;
use OCP\Files\Folder;
@@ -47,13 +48,19 @@ class CospendService {
) {
}
/**
* @param string $userId
* @return list<array{id: int, remoteProjectId: string, remoteProjectName: string, remoteServerUrl: string, state: int, userId: string, inviterCloudId: string, inviterDisplayName: string}>
* @throws Exception
*/
public function getFederatedProjects(string $userId): array {
$invitations = $this->invitationMapper->getInvitationsForUser($userId, Invitation::STATE_ACCEPTED);
return array_map(static function (Invitation $invitation) {
$jsonInvitations = array_map(static function (Invitation $invitation) {
$jsonInvitation = $invitation->jsonSerialize();
unset($jsonInvitation['accessToken']);
return $jsonInvitation;
}, $invitations);
return array_values($jsonInvitations);
}
/**

View File

@@ -206,8 +206,8 @@ class LocalProjectService implements IProjectService {
// is the project shared with the user ?
try {
$userShare = $this->shareMapper->getShareByProjectAndUser($projectId, $userId, Share::TYPE_USER);
if ($userShare->getAccesslevel() > $userMaxAccessLevel) {
$userMaxAccessLevel = $userShare->getAccesslevel();
if ($userShare->getAccessLevel() > $userMaxAccessLevel) {
$userMaxAccessLevel = $userShare->getAccessLevel();
}
} catch (\Throwable $e) {
}
@@ -217,8 +217,8 @@ class LocalProjectService implements IProjectService {
$groupShares = $this->shareMapper->getSharesOfProject($projectId, Share::TYPE_GROUP);
foreach ($groupShares as $groupShare) {
$groupId = $groupShare->getUserid();
$accessLevel = $groupShare->getAccesslevel();
$groupId = $groupShare->getUserId();
$accessLevel = $groupShare->getAccessLevel();
if ($this->groupManager->groupExists($groupId)
&& $this->groupManager->get($groupId)->inGroup($user)
&& $accessLevel > $userMaxAccessLevel
@@ -232,8 +232,8 @@ class LocalProjectService implements IProjectService {
if ($circlesEnabled) {
$circleShares = $this->shareMapper->getSharesOfProject($projectId, Share::TYPE_CIRCLE);
foreach ($circleShares as $circleShare) {
$circleId = $circleShare->getUserid();
$accessLevel = $circleShare->getAccesslevel();
$circleId = $circleShare->getUserId();
$accessLevel = $circleShare->getAccessLevel();
if ($this->isUserInCircle($userId, $circleId) && $accessLevel > $userMaxAccessLevel) {
$userMaxAccessLevel = $accessLevel;
}
@@ -257,7 +257,7 @@ class LocalProjectService implements IProjectService {
*/
public function getShareAccessLevel(string $projectId, int $shId): int {
$share = $this->shareMapper->getProjectShareById($projectId, $shId);
return $share->getAccesslevel();
return $share->getAccessLevel();
}
/**
@@ -293,28 +293,22 @@ class LocalProjectService implements IProjectService {
$this->projectMapper->deleteBillOwersOfProject($projectId);
$associatedTableNames = [
// 'cospend_bills',
'cospend_members',
'cospend_shares',
'cospend_currencies',
'cospend_categories',
'cospend_paymentmodes'
'cospend_bills' => 'project_id',
'cospend_members' => 'project_id',
'cospend_shares' => 'project_id',
'cospend_currencies' => 'project_id',
'cospend_categories' => 'project_id',
'cospend_paymentmodes' => 'project_id',
];
$qb = $this->db->getQueryBuilder();
foreach ($associatedTableNames as $tableName) {
foreach ($associatedTableNames as $tableName => $projectIdColumn) {
$qb = $this->db->getQueryBuilder();
$qb->delete($tableName)
->where(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq($projectIdColumn, $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
$qb->executeStatement();
$qb = $this->db->getQueryBuilder();
}
$qb->delete('cospend_bills')
->where(
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
);
$qb->executeStatement();
$this->projectMapper->delete($dbProjectToDelete);
}
@@ -1005,8 +999,8 @@ class LocalProjectService implements IProjectService {
// insert bill owers
foreach ($owerIds as $owerId) {
$billOwer = new BillOwer();
$billOwer->setBillid($insertedBillId);
$billOwer->setMemberid((int)$owerId);
$billOwer->setBillId($insertedBillId);
$billOwer->setMemberId((int)$owerId);
$this->billOwerMapper->insert($billOwer);
}
@@ -1376,7 +1370,7 @@ class LocalProjectService implements IProjectService {
// UPDATE
$ts = (new DateTime())->getTimestamp();
$dbMember->setLastchanged($ts);
$dbMember->setLastChanged($ts);
if ($weight !== null) {
$dbMember->setWeight($weight);
@@ -1394,7 +1388,7 @@ class LocalProjectService implements IProjectService {
}
if ($userId !== null) {
$dbMember->setUserid($userId === '' ? null : $userId);
$dbMember->setUserId($userId === '' ? null : $userId);
}
$this->memberMapper->update($dbMember);
@@ -1505,10 +1499,10 @@ class LocalProjectService implements IProjectService {
}
$ts = (new DateTime())->getTimestamp();
$newMember->setLastchanged($ts);
$newMember->setProjectid($projectId);
$newMember->setLastChanged($ts);
$newMember->setProjectId($projectId);
if ($userId !== null) {
$newMember->setUserid($userId);
$newMember->setUserId($userId);
}
$newMember->setActivated($active ? 1 : 0);
$newMember->setName($name);
@@ -1645,9 +1639,9 @@ class LocalProjectService implements IProjectService {
// shared with user
$qb->select('p.id', 'p.name')
->from('cospend_projects', 'p')
->innerJoin('p', 'cospend_shares', 's', $qb->expr()->eq('p.id', 's.projectid'))
->innerJoin('p', 'cospend_shares', 's', $qb->expr()->eq('p.id', 's.project_id'))
->where(
$qb->expr()->eq('s.userid', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('s.user_id', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('s.type', $qb->createNamedParameter(Share::TYPE_USER, IQueryBuilder::PARAM_STR))
@@ -1669,15 +1663,15 @@ class LocalProjectService implements IProjectService {
// get group with which a project is shared
$candidateGroupIds = [];
$qb->select('userid')
$qb->select('user_id')
->from('cospend_shares', 's')
->where(
$qb->expr()->eq('type', $qb->createNamedParameter(Application::SHARE_TYPE_GROUP, IQueryBuilder::PARAM_STR))
)
->groupBy('userid');
->groupBy('user_id');
$req = $qb->executeQuery();
while ($row = $req->fetch()) {
$groupId = $row['userid'];
$groupId = $row['user_id'];
$candidateGroupIds[] = $groupId;
}
$req->closeCursor();
@@ -1690,9 +1684,9 @@ class LocalProjectService implements IProjectService {
// get projects shared with this group
$qb->select('p.id', 'p.name')
->from('cospend_projects', 'p')
->innerJoin('p', 'cospend_shares', 's', $qb->expr()->eq('p.id', 's.projectid'))
->innerJoin('p', 'cospend_shares', 's', $qb->expr()->eq('p.id', 's.project_id'))
->where(
$qb->expr()->eq('s.userid', $qb->createNamedParameter($candidateGroupId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('s.user_id', $qb->createNamedParameter($candidateGroupId, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('s.type', $qb->createNamedParameter(Application::SHARE_TYPE_GROUP, IQueryBuilder::PARAM_STR))
@@ -1715,15 +1709,15 @@ class LocalProjectService implements IProjectService {
if ($circlesEnabled) {
// get circles with which a project is shared
$candidateCircleIds = [];
$qb->select('userid')
$qb->select('user_id')
->from('cospend_shares', 's')
->where(
$qb->expr()->eq('type', $qb->createNamedParameter(Application::SHARE_TYPE_CIRCLE, IQueryBuilder::PARAM_STR))
)
->groupBy('userid');
->groupBy('user_id');
$req = $qb->executeQuery();
while ($row = $req->fetch()) {
$circleId = $row['userid'];
$circleId = $row['user_id'];
$candidateCircleIds[] = $circleId;
}
$req->closeCursor();
@@ -1735,9 +1729,9 @@ class LocalProjectService implements IProjectService {
// get projects shared with this circle
$qb->select('p.id', 'p.name')
->from('cospend_projects', 'p')
->innerJoin('p', 'cospend_shares', 's', $qb->expr()->eq('p.id', 's.projectid'))
->innerJoin('p', 'cospend_shares', 's', $qb->expr()->eq('p.id', 's.project_id'))
->where(
$qb->expr()->eq('s.userid', $qb->createNamedParameter($candidateCircleId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('s.user_id', $qb->createNamedParameter($candidateCircleId, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('s.type', $qb->createNamedParameter(Application::SHARE_TYPE_CIRCLE, IQueryBuilder::PARAM_STR))
@@ -1834,7 +1828,7 @@ class LocalProjectService implements IProjectService {
->from($dbTable, $alias)
->innerJoin($alias, 'cospend_bills', 'bill', $qb->expr()->eq($alias . '.id', 'bill.' . $billTableField))
->where(
$qb->expr()->eq($alias . '.projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq($alias . '.project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('bill.deleted', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))
@@ -1860,7 +1854,7 @@ class LocalProjectService implements IProjectService {
->from($dbTable, $alias)
->innerJoin($alias, 'cospend_bills', 'bill', $qb->expr()->eq($alias . '.id', 'bill.' . $billTableField))
->where(
$qb->expr()->eq($alias . '.projectid', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
$qb->expr()->eq($alias . '.project_id', $qb->createNamedParameter($projectId, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('bill.deleted', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))
@@ -1926,10 +1920,10 @@ class LocalProjectService implements IProjectService {
$shares = $this->shareMapper->getSharesOfProject($projectId, Share::TYPE_USER);
foreach ($shares as $share) {
if (array_key_exists($share->getUserid(), $userIdToName)) {
$name = $userIdToName[$share->getUserid()];
if (array_key_exists($share->getUserId(), $userIdToName)) {
$name = $userIdToName[$share->getUserId()];
} else {
$user = $this->userManager->get($share->getUserid());
$user = $this->userManager->get($share->getUserId());
if ($user !== null) {
$userIdToName[$user->getUID()] = $user->getDisplayName();
$name = $user->getDisplayName();
@@ -1991,7 +1985,7 @@ class LocalProjectService implements IProjectService {
$groupShares = $this->shareMapper->getSharesOfProject($projectId, Share::TYPE_GROUP);
foreach ($groupShares as $groupShare) {
$groupId = $groupShare->getUserid();
$groupId = $groupShare->getUserId();
if (array_key_exists($groupId, $groupIdToName)) {
$name = $groupIdToName[$groupId];
} else {
@@ -2005,7 +1999,7 @@ class LocalProjectService implements IProjectService {
}
$jsonGroupShare = $groupShare->jsonSerialize();
$jsonGroupShare['name'] = $name;
$jsonGroupShare['groupid'] = $groupShare->getUserid();
$jsonGroupShare['groupid'] = $groupShare->getUserId();
$jsonGroupShares[] = $jsonGroupShare;
}
@@ -2037,7 +2031,7 @@ class LocalProjectService implements IProjectService {
$circleShares = $this->shareMapper->getSharesOfProject($projectId, Share::TYPE_CIRCLE);
foreach ($circleShares as $circleShare) {
$jsonCircleShare = $circleShare->jsonSerialize();
$circleId = $circleShare->getUserid();
$circleId = $circleShare->getUserId();
$circle = $circlesManager->getCircle($circleId);
$jsonCircleShare['name'] = $circle->getDisplayName();
$jsonCircleShare['circleid'] = $circleId;
@@ -2253,8 +2247,8 @@ class LocalProjectService implements IProjectService {
// insert bill owers
foreach ($owerIds as $owerId) {
$billOwer = new BillOwer();
$billOwer->setBillid($billId);
$billOwer->setMemberid((int)$owerId);
$billOwer->setBillId($billId);
$billOwer->setMemberId((int)$owerId);
$this->billOwerMapper->insert($billOwer);
}
}
@@ -2713,7 +2707,7 @@ class LocalProjectService implements IProjectService {
*/
public function createPaymentMode(string $projectId, string $name, ?string $icon, string $color, ?int $order = 0): int {
$pm = new PaymentMode();
$pm->setProjectid($projectId);
$pm->setProjectId($projectId);
$pm->setName($name);
$pm->setOrder(is_null($order) ? 0 : $order);
$pm->setColor($color);
@@ -2810,7 +2804,7 @@ class LocalProjectService implements IProjectService {
*/
public function createCategory(string $projectId, string $name, ?string $icon, string $color, ?int $order = 0): int {
$category = new Category();
$category->setProjectid($projectId);
$category->setProjectId($projectId);
$category->setName($name);
$category->setOrder(is_null($order) ? 0 : $order);
$category->setColor($color);
@@ -2915,7 +2909,7 @@ class LocalProjectService implements IProjectService {
$currency = new Currency();
$currency->setName($name);
$currency->setExchangeRate($rate);
$currency->setProjectid($projectId);
$currency->setProjectId($projectId);
$insertedCurrency = $this->currencyMapper->insert($currency);
return $insertedCurrency->getId();
}
@@ -3004,10 +2998,10 @@ class LocalProjectService implements IProjectService {
);
$newShare = new Share();
$newShare->setProjectid($projectId);
$newShare->setUserid($shareToken);
$newShare->setProjectId($projectId);
$newShare->setUserId($shareToken);
$newShare->setType(Share::TYPE_FEDERATION);
$newShare->setAccesslevel($accessLevel);
$newShare->setAccessLevel($accessLevel);
$newShare->setUserCloudId($userCloudId);
$newShare->setState(Invitation::STATE_PENDING);
$insertedShare = $this->shareMapper->insert($newShare);
@@ -3040,7 +3034,7 @@ class LocalProjectService implements IProjectService {
throw new CospendBasicException('Share does not exist', Http::STATUS_BAD_REQUEST);
}
if ($share->getProjectid() !== $projectId) {
if ($share->getProjectId() !== $projectId) {
throw new CospendBasicException('Wrong projectId in the share to delete', Http::STATUS_BAD_REQUEST);
}
@@ -3049,7 +3043,7 @@ class LocalProjectService implements IProjectService {
$this->backendNotifier->sendRemoteUnShare(
$cloudId->getRemote(),
$projectId,
$share->getUserid(),
$share->getUserId(),
);
$this->shareMapper->delete($share);
@@ -3096,10 +3090,10 @@ class LocalProjectService implements IProjectService {
}
$share = new Share();
$share->setProjectid($projectId);
$share->setUserid($userId);
$share->setProjectId($projectId);
$share->setUserId($userId);
$share->setType(Share::TYPE_USER);
$share->setAccesslevel($accesslevel);
$share->setAccessLevel($accesslevel);
$share->setManuallyAdded($manually_added ? 1 : 0);
$insertedShare = $this->shareMapper->insert($share);
@@ -3156,10 +3150,10 @@ class LocalProjectService implements IProjectService {
ISecureRandom::CHAR_HUMAN_READABLE
);
$share = new Share();
$share->setProjectid($projectId);
$share->setUserid($shareToken);
$share->setProjectId($projectId);
$share->setUserId($shareToken);
$share->setType(Share::TYPE_PUBLIC_LINK);
$share->setAccesslevel($accesslevel);
$share->setAccessLevel($accesslevel);
$share->setLabel($label);
$share->setPassword($password);
$insertedShare = $this->shareMapper->insert($share);
@@ -3212,7 +3206,7 @@ class LocalProjectService implements IProjectService {
public function editShareAccessLevel(string $projectId, int $shId, int $accessLevel): array {
try {
$share = $this->shareMapper->getProjectShareById($projectId, $shId);
$share->setAccesslevel($accessLevel);
$share->setAccessLevel($accessLevel);
$this->shareMapper->update($share);
return ['success' => true];
} catch (DoesNotExistException $e) {
@@ -3268,7 +3262,7 @@ class LocalProjectService implements IProjectService {
} catch (DoesNotExistException $e) {
return ['message' => $this->l10n->t('No such share')];
}
$dbUserId = $share->getUserid();
$dbUserId = $share->getUserId();
$this->shareMapper->delete($share);
// activity
@@ -3387,10 +3381,10 @@ class LocalProjectService implements IProjectService {
}
$share = new Share();
$share->setProjectid($projectId);
$share->setUserid($groupId);
$share->setProjectId($projectId);
$share->setUserId($groupId);
$share->setType(Share::TYPE_GROUP);
$share->setAccesslevel($accessLevel);
$share->setAccessLevel($accessLevel);
$insertedShare = $this->shareMapper->insert($share);
// activity
@@ -3420,7 +3414,7 @@ class LocalProjectService implements IProjectService {
} catch (DoesNotExistException $e) {
return ['message' => $this->l10n->t('No such share')];
}
$dbGroupId = $share->getUserid();
$dbGroupId = $share->getUserId();
$this->shareMapper->delete($share);
// activity
$projectObj = $this->projectMapper->find($projectId);
@@ -3476,10 +3470,10 @@ class LocalProjectService implements IProjectService {
}
$share = new Share();
$share->setProjectid($projectId);
$share->setUserid($circleId);
$share->setProjectId($projectId);
$share->setUserId($circleId);
$share->setType(Share::TYPE_CIRCLE);
$share->setAccesslevel($accesslevel);
$share->setAccessLevel($accesslevel);
$insertedShare = $this->shareMapper->insert($share);
// activity
@@ -3509,7 +3503,7 @@ class LocalProjectService implements IProjectService {
public function deleteCircleShare(string $projectId, int $shId, ?string $fromUserId = null): array {
try {
$share = $this->shareMapper->getProjectShareById($projectId, $shId, Share::TYPE_CIRCLE);
$dbCircleId = $share->getUserid();
$dbCircleId = $share->getUserId();
$this->shareMapper->delete($share);
// activity

View File

@@ -36,37 +36,37 @@ class UserService {
// get user shares from project id
$qb = $this->dbconnection->getQueryBuilder();
$qb->select('userid')
$qb->select('user_id')
->from('cospend_shares', 's')
->where(
$qb->expr()->eq('type', $qb->createNamedParameter(Application::SHARE_TYPE_USER, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectid, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectid, IQueryBuilder::PARAM_STR))
);
$req = $qb->executeQuery();
while ($row = $req->fetch()) {
if (!in_array($row['userid'], $userIds)) {
array_push($userIds, $row['userid']);
if (!in_array($row['user_id'], $userIds)) {
$userIds[] = $row['user_id'];
}
}
$req->closeCursor();
$qb = $this->dbconnection->getQueryBuilder();
// get group shares from project id
$qb->select('userid')
$qb->select('user_id')
->from('cospend_shares', 's')
->where(
$qb->expr()->eq('type', $qb->createNamedParameter(Application::SHARE_TYPE_GROUP, IQueryBuilder::PARAM_STR))
)
->andWhere(
$qb->expr()->eq('projectid', $qb->createNamedParameter($projectid, IQueryBuilder::PARAM_STR))
$qb->expr()->eq('project_id', $qb->createNamedParameter($projectid, IQueryBuilder::PARAM_STR))
);
$req = $qb->executeQuery();
/** @var string[] $groupIds */
$groupIds = [];
while ($row = $req->fetch()) {
$groupIds[] = (string)$row['userid'];
$groupIds[] = (string)$row['user_id'];
}
$req->closeCursor();
// get users of groups

View File

@@ -1238,7 +1238,45 @@
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/FullProjectInfo"
"type": "object",
"required": [
"id",
"remoteProjectId",
"remoteProjectName",
"remoteServerUrl",
"state",
"userId",
"inviterCloudId",
"inviterDisplayName"
],
"properties": {
"id": {
"type": "integer",
"format": "int64"
},
"remoteProjectId": {
"type": "string"
},
"remoteProjectName": {
"type": "string"
},
"remoteServerUrl": {
"type": "string"
},
"state": {
"type": "integer",
"format": "int64"
},
"userId": {
"type": "string"
},
"inviterCloudId": {
"type": "string"
},
"inviterDisplayName": {
"type": "string"
}
}
}
}
}
@@ -1247,6 +1285,16 @@
}
}
}
},
"500": {
"description": "",
"content": {
"text/plain": {
"schema": {
"type": "string"
}
}
}
}
}
}

View File

@@ -1188,7 +1188,45 @@
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/FullProjectInfo"
"type": "object",
"required": [
"id",
"remoteProjectId",
"remoteProjectName",
"remoteServerUrl",
"state",
"userId",
"inviterCloudId",
"inviterDisplayName"
],
"properties": {
"id": {
"type": "integer",
"format": "int64"
},
"remoteProjectId": {
"type": "string"
},
"remoteProjectName": {
"type": "string"
},
"remoteServerUrl": {
"type": "string"
},
"state": {
"type": "integer",
"format": "int64"
},
"userId": {
"type": "string"
},
"inviterCloudId": {
"type": "string"
},
"inviterDisplayName": {
"type": "string"
}
}
}
}
}
@@ -1197,6 +1235,16 @@
}
}
}
},
"500": {
"description": "",
"content": {
"text/plain": {
"schema": {
"type": "string"
}
}
}
}
}
}

View File

@@ -140,6 +140,8 @@ class LocalProjectServiceTest extends TestCase {
'newproject',
'superprojS',
'tsl',
'tdm',
'testGetSettlement',
];
foreach ($projIds as $projId) {
try {