Skip to content

Commit 62460bd

Browse files
committed
added CRUD methods for folders
1 parent 62b356c commit 62460bd

File tree

1 file changed

+117
-0
lines changed

1 file changed

+117
-0
lines changed

src/Resources/Emails/Folders.php

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
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

Comments
 (0)