19declare(strict_types=1);
28use ILIAS\MetaData\OERExposer\OAIPMH\DateHelper;
48 ExposedRecordsRepository $resource_status_repository,
53 $this->records_repository = $resource_status_repository;
56 $this->valid_md_prefix =
'oai_dc';
57 $this->default_set =
'default';
58 $this->max_list_size = 100;
64 return $this->writer->writeErrorResponse(
66 $this->writer->writeError(
68 'No valid OAI-PMH verb in request.'
73 return match ($request->
verb()) {
74 Verb::GET_RECORD => $this->
getRecord($request),
75 Verb::IDENTIFY => $this->
identify($request),
79 default => $this->writer->writeErrorResponse(
81 $this->writer->writeError(
83 'No valid OAI-PMH verb in request.'
101 $request->
argumentValue(Argument::MD_PREFIX) !== $this->valid_md_prefix
103 $errors[] = $this->writer->writeError(
104 Error::CANNOT_DISSEMINATE_FORMAT,
105 'This repository only supports oai_dc as metadata format.'
113 $errors[] = $this->writer->writeError(
114 Error::ID_DOES_NOT_EXIST,
115 'Identifier "' . $identifier .
'" is invalid for this repository.'
117 } elseif (is_null($record = $this->records_repository->getRecordByIdentifier(
118 $this->removePrefixFromIdentifier($identifier)
120 $errors[] = $this->writer->writeError(
121 Error::ID_DOES_NOT_EXIST,
122 'This repository does not have a record with identifier "' . $identifier .
'".'
127 if (!empty($errors)) {
128 return $this->writer->writeErrorResponse($request, ...$errors);
130 return $this->writer->writeResponse(
139 return $this->writer->writeErrorResponse(
148 return $this->writer->writeResponse(
150 ...$this->writer->writeIdentifyElements(
151 $this->settings->getOAIRepositoryName(),
153 $this->records_repository->getEarliestDatestamp(),
154 $this->settings->getOAIContactMail()
164 Verb::LIST_MD_FORMATS,
172 $errors[] = $this->writer->writeError(
173 Error::ID_DOES_NOT_EXIST,
174 'Identifier "' . $identifier .
'" is invalid for this repository.'
176 } elseif (!$this->records_repository->doesRecordWithIdentifierExist(
177 $this->removePrefixFromIdentifier($identifier)
179 $errors[] = $this->writer->writeError(
180 Error::ID_DOES_NOT_EXIST,
181 'This repository does not have a record with identifier "' . $identifier .
'".'
186 if (!empty($errors)) {
187 return $this->writer->writeErrorResponse($request, ...$errors);
189 return $this->writer->writeResponse(
191 $this->writer->writeMetadataFormat()
205 if ($request->
hasArgument(Argument::RESUMPTION_TOKEN)) {
206 $errors[] = $this->writer->writeError(
207 Error::BAD_RESUMTPION_TOKEN,
208 'ListSets does not issue resumption tokens.'
212 if (!empty($errors)) {
213 return $this->writer->writeErrorResponse($request, ...$errors);
215 return $this->writer->writeResponse(
217 $this->writer->writeSet($this->default_set, $this->default_set)
226 [Argument::MD_PREFIX],
228 [Argument::RESUMPTION_TOKEN]
231 Verb::LIST_IDENTIFIERS,
240 $errors[] = $this->writer->writeError(
241 Error::NO_RECORDS_MATCH,
242 "This repository only supports a trivial set named 'default'."
248 $request->
argumentValue(Argument::MD_PREFIX) !== $this->valid_md_prefix
250 $errors[] = $this->writer->writeError(
251 Error::CANNOT_DISSEMINATE_FORMAT,
252 'This repository only supports oai_dc as metadata format.'
256 $effective_request = clone $request;
258 if ($request->hasArgument(Argument::RESUMPTION_TOKEN)) {
259 $token = $request->argumentValue(Argument::RESUMPTION_TOKEN);
260 if (!$this->token_handler->isTokenValid(
$token)) {
261 $errors[] = $this->writer->writeError(
262 Error::BAD_RESUMTPION_TOKEN,
263 'Invalid resumption token for this repository.'
265 return $this->writer->writeErrorResponse($effective_request, ...$errors);
267 $effective_request = $this->token_handler->appendArgumentsFromTokenToRequest($effective_request,
$token);
268 $offset = $this->token_handler->getOffsetFromToken(
$token);
272 if ($effective_request->hasArgument(Argument::FROM_DATE)) {
273 $from_date_string = $effective_request->argumentValue(Argument::FROM_DATE);
274 if ($this->isStringValidAsDate($from_date_string)) {
275 $from_date = $this->getDateFromString($from_date_string);
277 $errors[] = $this->writer->writeError(
279 'The date "' . $from_date_string .
'" is invalid for this repository.'
284 if ($effective_request->hasArgument(Argument::UNTIL_DATE)) {
285 $until_date_string = $effective_request->argumentValue(Argument::UNTIL_DATE);
286 if ($this->isStringValidAsDate($until_date_string)) {
287 $until_date = $this->getDateFromString($until_date_string);
289 $errors[] = $this->writer->writeError(
291 'The date "' . $until_date_string .
'" is invalid for this repository.'
297 if ($effective_request->verb() === Verb::LIST_IDENTIFIERS) {
298 $record_infos = $this->records_repository->getRecordInfos(
301 $this->max_list_size,
304 foreach ($record_infos as
$info) {
305 $content_xmls[] = $this->writer->writeRecordHeader(
306 $this->
settings->getOAIIdentifierPrefix() . $info->identfifier(),
311 } elseif ($effective_request->verb() === Verb::LIST_RECORDS) {
312 $records = $this->records_repository->getRecords(
315 $this->max_list_size,
318 foreach ($records as $record) {
322 throw new \ilMDOERExposerException(
'Invalid verb handling.');
325 if (empty($content_xmls)) {
326 $errors[] = $this->writer->writeError(
327 Error::NO_RECORDS_MATCH,
328 'No matching records found.'
332 $count = $this->records_repository->getRecordCount($from_date, $until_date);
334 $request->hasArgument(Argument::RESUMPTION_TOKEN) ||
335 $this->max_list_size < $count
338 if ($offset + $this->max_list_size < $count) {
339 $new_token = $this->token_handler->generateToken(
340 $offset + $this->max_list_size,
345 $content_xmls[] = $this->writer->writeResumptionToken(
352 if (!empty($errors)) {
353 return $this->writer->writeErrorResponse($request, ...$errors);
355 return $this->writer->writeResponse(
363 if ($record->
infos()->isDeleted()) {
364 return $this->writer->writeDeletedRecord(
365 $this->
settings->getOAIIdentifierPrefix() . $record->
infos()->identfifier(),
366 $record->
infos()->datestamp()
369 return $this->writer->writeRecord(
370 $this->
settings->getOAIIdentifierPrefix() . $record->
infos()->identfifier(),
371 $record->
infos()->datestamp(),
378 if (empty($arguments)) {
379 $message = $verb->value .
' must come with additional arguments.';
382 foreach ($arguments as $argument) {
383 $arg_strings[] = $argument->value;
385 $message = implode(
', ', $arg_strings) .
386 ' is not a valid set of arguments for ' . $verb->value .
'.';
388 return $this->writer->writeError(
396 return str_starts_with($identifier, $this->
settings->getOAIIdentifierPrefix()) &&
397 substr($identifier, strlen($this->
settings->getOAIIdentifierPrefix())) !==
'';
402 if (str_starts_with($identifier, $this->
settings->getOAIIdentifierPrefix())) {
403 $identifier = substr($identifier, strlen($this->
settings->getOAIIdentifierPrefix()));