-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathModule.php
More file actions
executable file
·157 lines (144 loc) · 8.37 KB
/
Module.php
File metadata and controls
executable file
·157 lines (144 loc) · 8.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<?php
namespace ArchivesspaceConnector;
use Omeka\Module\AbstractModule;
use Laminas\ServiceManager\ServiceLocatorInterface;
use Laminas\View\Renderer\PhpRenderer;
use Laminas\Mvc\Controller\AbstractController;
use Laminas\EventManager\SharedEventManagerInterface;
use Laminas\Mvc\MvcEvent;
use Composer\Semver\Comparator;
class Module extends AbstractModule
{
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
public function onBootstrap(MvcEvent $event)
{
parent::onBootstrap($event);
$acl = $this->getServiceLocator()->get('Omeka\Acl');
$acl->allow(
null,
['ArchivesspaceConnector\Api\Adapter\ArchivesspaceItemAdapter'],
['search', 'read']
);
}
public function install(ServiceLocatorInterface $serviceLocator)
{
$connection = $serviceLocator->get('Omeka\Connection');
$connection->exec("CREATE TABLE archivesspace_item (id INT AUTO_INCREMENT NOT NULL, item_id INT NOT NULL, job_id INT NOT NULL, aspace_api_url VARCHAR(255) NOT NULL, aspace_target_path VARCHAR(255) NOT NULL, last_modified DATETIME NOT NULL, UNIQUE INDEX UNIQ_3A789461126F525E (item_id), INDEX IDX_3A789461BE04EA9 (job_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB;");
$connection->exec("CREATE TABLE archivesspace_item_set (id INT AUTO_INCREMENT NOT NULL, item_set_id INT NOT NULL, job_id INT NOT NULL, aspace_api_url VARCHAR(255) NOT NULL, aspace_target_path VARCHAR(255) NOT NULL, last_modified DATETIME NOT NULL, UNIQUE INDEX UNIQ_F3159620960278D7 (item_set_id), INDEX IDX_F3159620BE04EA9 (job_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB;");
$connection->exec("CREATE TABLE archivesspace_import (id INT AUTO_INCREMENT NOT NULL, job_id INT NOT NULL, undo_job_id INT DEFAULT NULL, rerun_job_id INT DEFAULT NULL, added_items INT NOT NULL, updated_items INT NOT NULL, added_item_sets INT NOT NULL, updated_item_sets INT NOT NULL, comment LONGTEXT DEFAULT NULL, hierarchy_id INT NOT NULL, UNIQUE INDEX UNIQ_898F0D5DBE04EA9 (job_id), UNIQUE INDEX UNIQ_898F0D5D4C276F75 (undo_job_id), UNIQUE INDEX UNIQ_898F0D5D7071F49C (rerun_job_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB;");
$connection->exec("ALTER TABLE archivesspace_item ADD CONSTRAINT FK_3A789461126F525E FOREIGN KEY (item_id) REFERENCES item (id) ON DELETE CASCADE;");
$connection->exec("ALTER TABLE archivesspace_item ADD CONSTRAINT FK_3A789461BE04EA9 FOREIGN KEY (job_id) REFERENCES job (id);");
$connection->exec("ALTER TABLE archivesspace_item_set ADD CONSTRAINT FK_F3159620960278D7 FOREIGN KEY (item_set_id) REFERENCES item_set (id) ON DELETE CASCADE;");
$connection->exec("ALTER TABLE archivesspace_item_set ADD CONSTRAINT FK_F3159620BE04EA9 FOREIGN KEY (job_id) REFERENCES job (id);");
$connection->exec("ALTER TABLE archivesspace_import ADD CONSTRAINT FK_898F0D5DBE04EA9 FOREIGN KEY (job_id) REFERENCES job (id);");
$connection->exec("ALTER TABLE archivesspace_import ADD CONSTRAINT FK_898F0D5D4C276F75 FOREIGN KEY (undo_job_id) REFERENCES job (id);");
$connection->exec("ALTER TABLE archivesspace_import ADD CONSTRAINT FK_898F0D5D7071F49C FOREIGN KEY (rerun_job_id) REFERENCES job (id);");
}
public function uninstall(ServiceLocatorInterface $serviceLocator)
{
$connection = $serviceLocator->get('Omeka\Connection');
$connection->exec("ALTER TABLE archivesspace_item DROP FOREIGN KEY FK_3A789461126F525E;");
$connection->exec("ALTER TABLE archivesspace_item DROP FOREIGN KEY FK_3A789461BE04EA9;");
$connection->exec("ALTER TABLE archivesspace_item_set DROP FOREIGN KEY FK_F3159620960278D7;");
$connection->exec("ALTER TABLE archivesspace_item_set DROP FOREIGN KEY FK_F3159620BE04EA9;");
$connection->exec("ALTER TABLE archivesspace_import DROP FOREIGN KEY FK_898F0D5DBE04EA9;");
$connection->exec("ALTER TABLE archivesspace_import DROP FOREIGN KEY FK_898F0D5D4C276F75;");
$connection->exec("ALTER TABLE archivesspace_import DROP FOREIGN KEY FK_898F0D5D7071F49C;");
$connection->exec('DROP TABLE archivesspace_item');
$connection->exec('DROP TABLE archivesspace_item_set');
$connection->exec('DROP TABLE archivesspace_import');
}
public function attachListeners(SharedEventManagerInterface $sharedEventManager)
{
$sharedEventManager->attach(
'Omeka\Controller\Admin\Item',
'view.show.sidebar',
[$this, 'showSource']
);
$sharedEventManager->attach(
'Omeka\Controller\Admin\ItemSet',
'view.show.sidebar',
[$this, 'showSource']
);
$sharedEventManager->attach(
\Omeka\Api\Adapter\ItemAdapter::class,
'api.search.query',
[$this, 'itemSearch']
);
$sharedEventManager->attach(
\Omeka\Api\Adapter\ItemSetAdapter::class,
'api.search.query',
[$this, 'itemSetSearch']
);
}
public function showSource($event)
{
$api = $this->getServiceLocator()->get('Omeka\ApiManager');
$view = $event->getTarget();
$resource = $view->resource;
switch (get_class($resource)) {
case 'Omeka\Api\Representation\ItemRepresentation':
$response = $api->search('archivesspace_items', ['item_id' => $resource->id()]);
$archivesspaceResources = $response->getContent();
if (!empty($archivesspaceResources)) {
$archivesspaceResource = $archivesspaceResources[0];
$resourceTitle = $view->translate('link');
}
break;
case 'Omeka\Api\Representation\ItemSetRepresentation':
$response = $api->search('archivesspace_item_sets', ['item_set_id' => $resource->id()]);
$archivesspaceResources = $response->getContent();
if (!empty($archivesspaceResources)) {
$archivesspaceResource = $archivesspaceResources[0];
$resourceTitle = $view->translate('link');
}
break;
default:
return;
}
if (!empty($archivesspaceResource)) {
$targetPath = trim($archivesspaceResource->targetPath(), '/');
$parsedUrl = parse_url($archivesspaceResource->apiUrl());
$resourceLink = sprintf('%s://%s/%s', $parsedUrl['scheme'], $parsedUrl['host'], $targetPath);
echo '<div class="meta-group">';
echo '<h4>' . $view->translate('Original') . '</h4>';
echo '<div class="value"><a href="' . $resourceLink . '" target="_blank">' . $resourceTitle . '</a></div>';
echo '<div class="value">' . $view->translate('Last Modified: ') . ' ' . $view->i18n()->dateFormat($archivesspaceResource->lastModified()) . '</div></div>';
}
}
public function itemSearch($event)
{
$query = $event->getParam('request')->getContent();
if (isset($query['archivesspace_import_id'])) {
$qb = $event->getParam('queryBuilder');
$adapter = $event->getTarget();
$importItemAlias = $adapter->createAlias();
$qb->innerJoin(
\ArchivesspaceConnector\Entity\ArchivesspaceItem::class, $importItemAlias,
'WITH', "$importItemAlias.item = omeka_root.id"
)->andWhere($qb->expr()->eq(
"$importItemAlias.job",
$adapter->createNamedParameter($qb, $query['archivesspace_import_id'])
));
}
}
public function itemSetSearch($event)
{
$query = $event->getParam('request')->getContent();
if (isset($query['archivesspace_import_id'])) {
$qb = $event->getParam('queryBuilder');
$adapter = $event->getTarget();
$importItemSetAlias = $adapter->createAlias();
$qb->innerJoin(
\ArchivesspaceConnector\Entity\ArchivesspaceItemSet::class, $importItemSetAlias,
'WITH', "$importItemSetAlias.itemSet = omeka_root.id"
)->andWhere($qb->expr()->eq(
"$importItemSetAlias.job",
$adapter->createNamedParameter($qb, $query['archivesspace_import_id'])
));
}
}
}