1+ <?php
2+
3+ namespace Dcblogdev \MsGraph \Resources \Emails ;
4+
5+ use Dcblogdev \MsGraph \Facades \MsGraph ;
6+ use Dcblogdev \MsGraph \Validators \EmailFolderCopyValidator ;
7+ use Dcblogdev \MsGraph \Validators \EmailFolderStoreValidator ;
8+ use Dcblogdev \MsGraph \Validators \EmailFolderUpdateValidator ;
9+ use Dcblogdev \MsGraph \Validators \GraphQueryValidator ;
10+
11+ class Folders extends MsGraph
12+ {
13+ public function get (array $ params = [], bool $ sort = false , array $ priorityOrder = []): array
14+ {
15+ GraphQueryValidator::validate ($ params );
16+
17+ $ queryString = http_build_query ($ params , '' , '& ' , PHP_QUERY_RFC3986 );
18+ $ url = 'me/mailFolders ' .(! empty ($ queryString ) ? "? $ queryString " : '' );
19+
20+ $ folders = MsGraph::get ($ url );
21+
22+ if (! isset ($ folders ['value ' ])) {
23+ return $ folders ;
24+ }
25+
26+ $ allFolders = $ this ->fetchSubfolders ($ folders ['value ' ]);
27+
28+ if ($ sort ) {
29+ $ allFolders = $ this ->sortFolders ($ allFolders , $ priorityOrder );
30+ }
31+
32+ return array_merge ($ folders , ['value ' => $ allFolders ]);
33+ }
34+
35+ public function find (string $ id ): array
36+ {
37+ return MsGraph::get ('me/mailFolders/ ' .$ id );
38+ }
39+
40+ public function store (array $ data ): array
41+ {
42+ EmailFolderStoreValidator::validate ($ data );
43+
44+ return MsGraph::post ('me/mailFolders ' , $ data );
45+ }
46+
47+ public function update (array $ data , string $ id ): array
48+ {
49+ EmailFolderUpdateValidator::validate ($ data );
50+
51+ return MsGraph::patch ('me/mailFolders/ ' .$ id , $ data );
52+ }
53+
54+ public function copy (array $ data , string $ id ): array
55+ {
56+ EmailFolderCopyValidator::validate ($ data );
57+
58+ return MsGraph::post ('me/mailFolders/ ' .$ id .'/copy ' , $ data );
59+ }
60+
61+ public function move (array $ data , string $ id ): array
62+ {
63+ EmailFolderCopyValidator::validate ($ data );
64+
65+ return MsGraph::post ('me/mailFolders/ ' .$ id .'/copy ' , $ data );
66+ }
67+
68+ public function delete (string $ id ): void
69+ {
70+ MsGraph::delete ('me/mailFolders/ ' .$ id );
71+ }
72+
73+ protected function fetchSubfolders (array $ folders ): array
74+ {
75+ foreach ($ folders as &$ folder ) {
76+ $ subfolders = MsGraph::get ("me/mailFolders/ {$ folder ['id ' ]}/childFolders? \$top=500 " );
77+ $ folder ['subfolders ' ] = ! empty ($ subfolders ['value ' ]) ? $ this ->fetchSubfolders ($ subfolders ['value ' ]) : [];
78+ }
79+
80+ return $ folders ;
81+ }
82+
83+ protected function sortFolders (array $ folders , array $ priorityOrder = []): array
84+ {
85+ // Default folder priority if none provided
86+ $ defaultPriority = [
87+ 'Inbox ' => 1 ,
88+ 'Archive ' => 2 ,
89+ 'Drafts ' => 3 ,
90+ 'Sent Items ' => 4 ,
91+ 'Deleted Items ' => 5 ,
92+ 'Conversation History ' => 6 ,
93+ 'Junk Email ' => 7 ,
94+ ];
95+
96+ // Use provided priority order or fallback to default
97+ $ priority = ! empty ($ priorityOrder ) ? $ priorityOrder : $ defaultPriority ;
98+
99+ usort ($ folders , function ($ a , $ b ) use ($ priority ) {
100+ $ aPriority = $ priority [$ a ['displayName ' ]] ?? 100 ;
101+ $ bPriority = $ priority [$ b ['displayName ' ]] ?? 100 ;
102+
103+ return $ aPriority === $ bPriority
104+ ? strcmp ($ a ['displayName ' ], $ b ['displayName ' ])
105+ : $ aPriority <=> $ bPriority ;
106+ });
107+
108+ // Sort subfolders recursively
109+ foreach ($ folders as &$ folder ) {
110+ if (! empty ($ folder ['subfolders ' ])) {
111+ $ folder ['subfolders ' ] = $ this ->sortFolders ($ folder ['subfolders ' ]);
112+ }
113+ }
114+
115+ return $ folders ;
116+ }
117+ }
0 commit comments