All notable changes to this project will be documented in this file.
Unreleased
v0.2.0 – 2026-08-09
Added
- Added
File.access_status/1to fetch the access status of a file. This operation is compatible with DSpace 9 and up. - Added
ResourceUpdatestruct to represent an update to be performed on a resource. - Core Resources'
update/3functions and other functions that update resources now also acceptResourceUpdatestructs besides plain maps. - Added
Versionstruct to represent an API compatibility target. - Added
Operation.Errorstruct which is returned whenOperation.perform/3detects an operation would fail because the targeted DSpace instance would not support it or the client configuration would be insufficient to execute the operation successfully. - Added
API.put_cris_version/2to update the struct with a CRIS fork version string. - Added
API.load_version/1to update the struct with version information from the server. - Added a
:langoption toItem.fetch/2to specify the preferred return language for metadata values. The default (all languages) was chosen to work around a bug imported from the CRIS fork into DSpace recently. Impact should be minimal in most scenarios (where items do not have metadata explicitly stored in many languages), the"allLanguages"projection requested is more performant server-side since it skips language filtering logic (Thanks, Luca!) - Added
t:Resource.preferred_language/0to represent the preferred language for metadata when retrieving a resource. - Added
Transform.not_found_on_no_content/2to transform 204 responses into 404 errors for endpoints that conceptually fetch a single resource but are implemented as "searches" and thus return an empty result instead of a not found error. - Added
Operation.JSON.put_param/2,Operation.JSON.put_header/2, andOperation.JSON.put_lang/2to update JSON operation structs. - Added a
Modelbehaviour with encoding functionality for resource types to prepare supporting more specific data structures for API resources in a future release. - Query params are now included in the URI struct that is used for the
request_urlfield ofHTTP.Response,HTTP.Error, andAPI.Errorstructs for better debugging and logging.
Changed
Item.fetch/2now returns metadata in all languages by default (BREAKING CHANGE).Item.submit/2has been renamed toItem.submit_draft/2for naming consistency (BREAKING CHANGE).Item.parent/1has been renamed toItem.fetch_parent/1for naming consistency (BREAKING CHANGE).User.fetch_by_email/1now returns a:not_foundAPI.Errorinstead of an empty map if no user exists with the given email (BREAKING CHANGE).Community.fetch_parent/1now returns a:not_foundAPI.Errorinstead of an empty map if the given community doesn't have a parent (BREAKING CHANGE).Auth.delete_api_key/0now returns:okinstead of an empty map on success for consistency within the codebase (BREAKING CHANGE).- A value for
api_versionin theAPIstruct will prevent operations from making requests to the server if the operation is not supported and return anOperation.Errorinstead (BREAKING CHANGE). - The
APIstruct now includes acris_versionfield - The
Operation.JSONstruct now includes asupported_versionsfield StreamBuilder.new/3signature changed to(operation, client, options)(BREAKING CHANGE).- Streamable operations no longer capture themselves in
stream_impl, the field now holds a plain function reference - Type
t:Resource.resource_update/0has been renamed tot:Resource.update/0(BREAKING CHANGE). - Module
Metadata.Valuehas been renamed toModel.MetadataValue(BREAKING CHANGE). MetadataValue.placeholder/0andMetadataValue.placeholder?/0have been replaced withMetadataValue.placeholder/1andMetadataValue.placeholder?/1to optionally allow setting a custom placeholder text value. The default placeholder value used by the DSpace community editions is used when no custom value is provided.- (BREAKING CHANGE)
tokens_from_response/1,token_from_response/1,access_token_from_response/1andcsrf_token_from_response/1have been moved from theAuthto theTransformmodule.
Removed
- The
APIstruct does not contain a default value forapi_versionanymore (BREAKING CHANGE).
Fixed
- Fixed a bug where
Metadata.find_fields/1wouldn't transform results correctly and wasn't streamable.
Documentation
- Added a section that explains version compatibility configuration to the
APIstruct - Various improvements to documentation.
Development
- External tests that assert known buggy DSpace behavior are now tagged with
@bug. - External tests that require the DSpace server to be able to connect to live third-party APIs
during test runs are now tagged with
:requires_third_party_apito filter them out in environments that do not have access to the Internet. - Introduced a 10d dependency cooldown.
- Simplified Docker setup.
- Added .editorconfig
- Various enhancements to the test suite.
- Various improvements to CI workflows.
v0.1.1 – 2026-07-08
Fixed
- Fixed a bug where file uploads were not setting headers correctly.
- Fixed a bug where a logout operation could return an error struct even on success.
- Fixed a bug where response streaming could fail because of an incorrectly accepted request override option.
Documentation
- Various improvements to documentation.
Development
- Fixed a bug where the assetstore in the DSpace stack for external testing wasn't set up correctly.
- Migrated the test suite from Bypass to Sham.
- Minor enhancements to the external tests.
v0.1.0 – 2026-07-05
Added
- Added
API.next_page/2helper function. Item.create_draft/1now accepts a:fromoption to create a draft from an external source DSpace provides an integration for.Item.create/2now adds sensible defaults for key fields unlikely to be customized by the caller to the payload (such astypewhich will always beitem).
Changed
Item.submit/3now returns:publishedinstead of:archivedon success for more consistent terminology throughout the codebase (BREAKING CHANGE).- Improved reliability of CSRF token parsing.
Documentation
- Various improvements to documentation.
Development
- Added Github actions CI workflows.
v0.1.0-alpha2 – 2026-07-01
Added
- Initialize from proof of concept repo.
Development
- Hex package setup.