99
1010namespace OCA \Deck \ShareReview ;
1111
12+ use OCA \Deck \Db \Acl ;
1213use OCA \ShareReview \Sources \ISource ;
14+ use OCP \Constants ;
15+ use OCP \DB \Exception ;
16+ use OCP \DB \QueryBuilder \IQueryBuilder ;
1317use OCP \IDBConnection ;
18+ use OCP \Share \IShare ;
1419use Psr \Log \LoggerInterface ;
1520
1621class 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