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