Skip to content

Commit 58f8796

Browse files
feat(sharereview): implement getShares() with board name lookup via JOIN
Assisted-by: Claude Code:claude-sonnet-4-6 Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
1 parent 19dba8b commit 58f8796

1 file changed

Lines changed: 81 additions & 1 deletion

File tree

lib/ShareReview/ShareReviewSource.php

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@
99

1010
namespace OCA\Deck\ShareReview;
1111

12+
use OCA\Deck\Db\Acl;
1213
use OCA\ShareReview\Sources\ISource;
14+
use OCP\Constants;
15+
use OCP\DB\Exception;
16+
use OCP\DB\QueryBuilder\IQueryBuilder;
1317
use OCP\IDBConnection;
18+
use OCP\Share\IShare;
1419
use Psr\Log\LoggerInterface;
1520

1621
class ShareReviewSource implements ISource {
@@ -29,11 +34,86 @@ public function getName(): string {
2934
return 'Deck';
3035
}
3136

37+
/**
38+
* @return list<array{id: int, app: string, object: string, initiator: string, type: int, recipient: string, permissions: int, password: bool, time: string, action: string}>
39+
*/
3240
public function getShares(): array {
33-
return [];
41+
$rawShares = $this->fetchAllShares();
42+
$appName = $this->getName();
43+
$formatted = [];
44+
foreach ($rawShares as $share) {
45+
$formatted[] = [
46+
'id' => (int)$share['id'],
47+
'app' => $appName,
48+
'object' => $this->resolveObjectName($share),
49+
'initiator' => (string)$share['board_owner'],
50+
'type' => $this->mapParticipantType((int)$share['type']),
51+
'recipient' => (string)$share['participant'],
52+
'permissions' => $this->computePermissions($share),
53+
'password' => false,
54+
'time' => '1970-01-01 01:00:00',
55+
'action' => '',
56+
];
57+
}
58+
return $formatted;
3459
}
3560

3661
public function deleteShare(string $shareId): bool {
3762
return false;
3863
}
64+
65+
/** @return list<array<string, mixed>> */
66+
private function fetchAllShares(): array {
67+
try {
68+
$qb = $this->db->getQueryBuilder();
69+
$qb->select(
70+
'a.id', 'a.type', 'a.participant',
71+
'a.permission_edit', 'a.permission_share', 'a.permission_manage'
72+
)
73+
->addSelect($qb->createFunction('b.title AS board_title'))
74+
->addSelect($qb->createFunction('b.owner AS board_owner'))
75+
->from(self::ACL_TABLE, 'a')
76+
->leftJoin('a', self::BOARDS_TABLE, 'b', $qb->expr()->eq('a.board_id', 'b.id'))
77+
->orderBy('a.id', 'ASC');
78+
$result = $qb->executeQuery();
79+
$rows = $result->fetchAll();
80+
$result->closeCursor();
81+
return $rows;
82+
} catch (Exception $e) {
83+
$this->logger->error('Deck ShareReview: failed to fetch shares: {message}', ['message' => $e->getMessage()]);
84+
return [];
85+
}
86+
}
87+
88+
/** @param array<string, mixed> $share */
89+
private function resolveObjectName(array $share): string {
90+
$title = (string)($share['board_title'] ?? '');
91+
$boardId = (int)$share['id'];
92+
return ($title !== '' ? $title : "Board $boardId") . ' (Board)';
93+
}
94+
95+
private function mapParticipantType(int $type): int {
96+
return match($type) {
97+
Acl::PERMISSION_TYPE_USER => IShare::TYPE_USER,
98+
Acl::PERMISSION_TYPE_GROUP => IShare::TYPE_GROUP,
99+
Acl::PERMISSION_TYPE_REMOTE => IShare::TYPE_REMOTE,
100+
Acl::PERMISSION_TYPE_CIRCLE => IShare::TYPE_CIRCLE,
101+
default => IShare::TYPE_USER,
102+
};
103+
}
104+
105+
/** @param array<string, mixed> $share */
106+
private function computePermissions(array $share): int {
107+
$permissions = Constants::PERMISSION_READ;
108+
if ($share['permission_edit']) {
109+
$permissions |= Constants::PERMISSION_UPDATE | Constants::PERMISSION_CREATE | Constants::PERMISSION_DELETE;
110+
}
111+
if ($share['permission_share']) {
112+
$permissions |= Constants::PERMISSION_SHARE;
113+
}
114+
if ($share['permission_manage']) {
115+
$permissions |= self::PERMISSION_MANAGE;
116+
}
117+
return $permissions;
118+
}
39119
}

0 commit comments

Comments
 (0)