Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/calendar/controller/PhabricatorCalendarImportDropController.php
12256 views
1
<?php
2
3
final class PhabricatorCalendarImportDropController
4
extends PhabricatorCalendarController {
5
6
public function handleRequest(AphrontRequest $request) {
7
$viewer = $request->getViewer();
8
9
if (!$request->validateCSRF()) {
10
return new Aphront400Response();
11
}
12
13
$cancel_uri = $this->getApplicationURI();
14
15
$ids = $request->getStrList('h');
16
if ($ids) {
17
$files = id(new PhabricatorFileQuery())
18
->setViewer($viewer)
19
->withIDs($ids)
20
->setRaisePolicyExceptions(true)
21
->execute();
22
} else {
23
$files = array();
24
}
25
26
if (!$files) {
27
return $this->newDialog()
28
->setTitle(pht('Nothing Uploaded'))
29
->appendParagraph(
30
pht(
31
'Drag and drop .ics files to upload them and import them into '.
32
'Calendar.'))
33
->addCancelButton($cancel_uri, pht('Done'));
34
}
35
36
$engine = new PhabricatorCalendarICSFileImportEngine();
37
$imports = array();
38
foreach ($files as $file) {
39
$import = PhabricatorCalendarImport::initializeNewCalendarImport(
40
$viewer,
41
clone $engine);
42
43
$xactions = array();
44
$xactions[] = id(new PhabricatorCalendarImportTransaction())
45
->setTransactionType(
46
PhabricatorCalendarImportICSFileTransaction::TRANSACTIONTYPE)
47
->setNewValue($file->getPHID());
48
49
$editor = id(new PhabricatorCalendarImportEditor())
50
->setActor($viewer)
51
->setContinueOnNoEffect(true)
52
->setContinueOnMissingFields(true)
53
->setContentSourceFromRequest($request);
54
55
$editor->applyTransactions($import, $xactions);
56
57
$imports[] = $import;
58
}
59
60
$import_phids = mpull($imports, 'getPHID');
61
$events = id(new PhabricatorCalendarEventQuery())
62
->setViewer($viewer)
63
->withImportSourcePHIDs($import_phids)
64
->execute();
65
66
if (count($events) == 1) {
67
// The user imported exactly one event. This is consistent with dropping
68
// a .ics file from an email; just take them to the event.
69
$event = head($events);
70
$next_uri = $event->getURI();
71
} else if (count($imports) > 1) {
72
// The user imported multiple different files. Take them to a summary
73
// list of generated import activity.
74
$source_phids = implode(',', $import_phids);
75
$next_uri = '/calendar/import/log/?importSourcePHIDs='.$source_phids;
76
} else {
77
// The user imported one file, which had zero or more than one event.
78
// Take them to the import detail page.
79
$import = head($imports);
80
$next_uri = $import->getURI();
81
}
82
83
return id(new AphrontRedirectResponse())->setURI($next_uri);
84
}
85
86
}
87
88