silverstripe-terraformers / open-archive-initiative-repository
控制器和服务,允许您作为开放存档倡议存储库提供数据
Requires
- php: >=8.1
- silverstripe/framework: ^5
- silverstripe/siteconfig: ^5.2
- symbiote/silverstripe-queuedjobs: ^5.0
Requires (Dev)
- phpunit/phpunit: ^9.5
- slevomat/coding-standard: ~6.0
README
要求
- SilverStripe ^4.10
- PHP ^7.4
安装
composer require silverstripe-terraformers/open-archive-initiative-repository
目标
本模块的目标是为您提供一个简单的方式来开始将网站内容作为开放存档倡议初始存储库提供服务。
本模块不包括任何帮助您成为开放存档倡议收割机的内容。
我们对OAI规范还不够熟悉,所以我们会尽最大努力确保一切正确。已构建内容的测试覆盖率非常高,但如果我们在规范中犯了一些错误,这并不能解决问题,所以请准备贡献您的想法和/或代码来帮助改进这个模块。
支持的元数据格式
我们目前只支持oai_dc
,但我们将会尽最大努力以允许您轻松补充此模块以支持额外的元数据格式。
支持的动词
识别
存储库名称:默认使用您在CMS管理员邮箱中设置的网站标题:使用环境变量OAI_API_ADMIN_EMAIL
设置
请查看OaiController::Identify()
。那里有许多选项,您可以配置不同的值。
列出元数据格式
此端点的响应基于您为OaiController::$supported_formats
指定的配置。
列出记录
此端点需要请求包含一个匹配您为OaiController::$supported_formats
指定的配置之一的metadataPrefix
参数值。
此端点的输出基于您的当前OAI记录
过滤支持
from
:指定基于日期戳的选择性收割的下限。必须提供UTC+0日期时间。until
:指定基于日期戳的选择性收割的上限。必须提供UTC+0日期时间。resumptionToken
:默认为1小时过期时间。可以通过OaiController::$resumption_token_expiry
配置更新。set
:待定
列出标识符
与列出记录相同的支持。唯一的区别是,列出标识符只为每个OAI记录提供headers
。
列出集合(待定)
待定
获取记录
要求收割机提供metadataPrefix
和identifier
。
OAI记录
通过API提供的数据全部由OaiRecords
驱动。
每个OaiRecord
都与您的其中一个DataObjects
相关联,但它索引了所有它关心的内容,以便在API获取数据时不需要您获取相关联的DataObjects
。
何时/何地更新OaiRecords
的数据?请参阅OAI记录管理器。
配置
OAI记录管理器
有两个“记录管理器”扩展可以应用于适当的DataObjects
。这些管理器的目的是控制我们何时触发对DataObjects
的OAI记录更新。
OaiRecordManager
:这是标准的管理器,应用于那些特别不是Versioned
的DataObjects
。VersionedOaiRecordManager
:这是对上述管理器的扩展,并稍微调整了我们要使用的模型操作。这应适用于所有是Versioned
的DataObjects
。
使用错误的DataObject
管理器可能会导致OAI记录在预期之外的时间更新。
所有OaiRecords
的更新都通过队列作业执行。请参阅上述OaiRecordManager::triggerOaiRecordUpdate()
的docblock,了解使用队列作业的理由。
OAI字段
此模块不对如何填充OAI记录数据做出任何假设。因此,您需要指定您的DataObjects
如何映射到预期的OAI字段。
您可以在OaiRecord
中查看MANAGED_FIELDS的列表。所有这些都可以在需要多个字段时添加CSV值。
关于CSV解析的说明:如果您预计某些属性可能包含逗号,那么您可能需要映射到适当在引号中包装属性值的方法。请参阅OaiRecord以获取支持的封装。
在配置字段映射时,数组键应映射到Oai字段,值可以映射到您类中的一个属性或方法。我们使用relField()
从您的类中获取数据,因此您可以使用此框架方法支持的任何映射。
在您的类中配置oai_fields
。
private static array $oai_fields = [ // Key = the OAI field name (Title) // Value = a property on your model (Title) 'Title' => 'Title', // Key = the OAI field name (Description) // Value = a method in your model (getDescription) 'Description' => 'getDescription', ];
在yaml中配置oai_fields
。
App\MyClass: oai_fields: Title: Title Description: getDescription
路由
API的路由为
/api/v1/oai
如果您需要更改此路由,可以通过覆盖路由配置来完成。
--- name: myapp-openarchive-routes After: - '#rootroutes' - '#coreroutes' - '#terraformers-openarchive-routes' --- SilverStripe\Control\Director: rules: 'api/v1/oai': MyApp\OpenArchive\OaiController
填充您初始的OAI记录集合
由于模块无法知道您希望将OaiRecordManager
应用到哪些DataObjects
,我们选择不添加任何dev任务来填充初始的OaiRecords
。但是,下面是一个示例构建任务,您可能需要修改/拥有/使用。
在此示例中,我们将OaiRecordManager
应用于Page
和File
。
<?php namespace App\Tasks; ... imports class CreateInitialOaiRecords extends BuildTask { private static $segment = 'create-initial-oai-records'; // phpcs:ignore protected $title = 'Create Initial OAI Records'; // phpcs:ignore protected $description = 'Create/update OAI Records for all Pages and Documents'; // phpcs:ignore /** * @param HTTPRequest $request * @return void */ public function run($request) // phpcs:ignore SlevomatCodingStandard.TypeHints { $classes = [ Page::class, File::class, ]; foreach ($classes as $class) { // Set our stage to LIVE so that we only fetch DataObjects that are available on the frontend. This isn't // totally necessary since the Queued Job will validate this itself, but it saves us from queueing Jobs that // we know we don't need /** @var DataList|OaiRecordManager[] $dataObjects */ $dataObjects = Versioned::withVersionedMode(static function () use ($class): DataList { Versioned::set_stage(Versioned::LIVE); return DataObject::get($class); }); // Easy as, just triggerOaiRecordUpdate(). This method + the queued job will take care of the rest foreach ($dataObjects as $dataObject) { $dataObject->triggerOaiRecordUpdate(); } } echo 'Finished queueing OAI Record update Jobs'; } }
许可证
请参阅许可
维护者
- Chris Penny chris.penny@gmail.com
- Melissa Wu melissa.wu@silverstripe.com
开发和贡献
如果您想为此模块做出贡献,请确保提交pull request并与模块维护者进行讨论。