Compare commits

..

2 commits

Author SHA1 Message Date
6b04ad9910 Release: merge develop for v2.1.0
Some checks failed
CI Pipeline / japa-tests (push) Failing after 1s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 7s
2025-11-13 11:42:59 +01:00
fbc34a7456 Merge branch 'develop'
Some checks failed
CI Pipeline / japa-tests (push) Has been cancelled
nerge latest hotfix updates from develop branch into master branch
2025-07-03 10:44:39 +02:00
5 changed files with 158 additions and 201 deletions

View file

@ -619,7 +619,7 @@ export default class DatasetsController {
}); });
} }
public async doiStore({ request, response, session, auth }: HttpContext) { public async doiStore({ request, response, auth }: HttpContext) {
const dataId = request.param('publish_id'); const dataId = request.param('publish_id');
const user = auth.user; const user = auth.user;
if (!user) { if (!user) {
@ -627,7 +627,10 @@ export default class DatasetsController {
} }
// Load dataset with minimal required relationships // Load dataset with minimal required relationships
const dataset = await Dataset.query().where('editor_id', user.id).where('publish_id', dataId).firstOrFail(); const dataset = await Dataset.query()
.where('editor_id', user.id) // Ensure the user is the editor of the dataset
.where('publish_id', dataId)
.firstOrFail();
const prefix = process.env.DATACITE_PREFIX || ''; const prefix = process.env.DATACITE_PREFIX || '';
const base_domain = process.env.BASE_DOMAIN || ''; const base_domain = process.env.BASE_DOMAIN || '';
@ -636,10 +639,9 @@ export default class DatasetsController {
const xmlMeta = (await Index.getDoiRegisterString(dataset)) as string; const xmlMeta = (await Index.getDoiRegisterString(dataset)) as string;
// Prepare DOI registration data // Prepare DOI registration data
const doiValue = `${prefix}/tethys.${dataset.publish_id}`; const doiValue = `${prefix}/tethys.${dataset.publish_id}`; //'10.21388/tethys.213'
const landingPageUrl = `https://doi.${getDomain(base_domain)}/${prefix}/tethys.${dataset.publish_id}`; const landingPageUrl = `https://doi.${getDomain(base_domain)}/${prefix}/tethys.${dataset.publish_id}`; //https://doi.dev.tethys.at/10.21388/tethys.213
try {
// Register DOI with DataCite // Register DOI with DataCite
const doiClient = new DoiClient(); const doiClient = new DoiClient();
const dataciteResponse = await doiClient.registerDoi(doiValue, xmlMeta, landingPageUrl); const dataciteResponse = await doiClient.registerDoi(doiValue, xmlMeta, landingPageUrl);
@ -650,30 +652,17 @@ export default class DatasetsController {
} }
// DOI registration successful - persist and index // DOI registration successful - persist and index
try {
// Save identifier
await this.persistDoiAndIndex(dataset, doiValue); await this.persistDoiAndIndex(dataset, doiValue);
return response return response.toRoute('editor.dataset.list').flash('message', 'You have successfully created a DOI for the dataset!');
.flash('message', 'You have successfully created a DOI for the dataset!')
.redirect()
.toRoute('editor.dataset.list');
} catch (error) { } catch (error) {
// logger.error(`${__filename}: DOI registration failed for dataset ${dataset.id}: ${error.message}`); logger.error(`${__filename}: Failed to persist DOI and index dataset ${dataset.id}: ${error.message}`);
throw new HttpException(error.message);
if (error instanceof DoiClientException) {
// Flash error for Inertia to pick up
session.flash('errors', {
doi: `DOI registration failed: ${error.message}`,
});
// Optionally also flash a warning for your warning display
session.flash('warning', error.message);
} else {
session.flash('errors', {
general: `An unexpected error occurred: ${error.message}`,
});
} }
return response.redirect().back(); // return response.toRoute('editor.dataset.list').flash('message', xmlMeta);
}
} }
/** /**

View file

@ -17,7 +17,7 @@ interface XslTParameter {
} }
export default { export default {
// opensearchNode: process.env.OPENSEARCH_HOST || 'localhost', // opensearchNode: process.env.OPENSEARCH_HOST || 'localhost',
client: new Client({ node: `${process.env.OPENSEARCH_HOST || 'localhost'}` }), // replace with your OpenSearch endpoint client: new Client({ node: `http://${process.env.OPENSEARCH_HOST || 'localhost'}` }), // replace with your OpenSearch endpoint
async getDoiRegisterString(dataset: Dataset): Promise<string | undefined> { async getDoiRegisterString(dataset: Dataset): Promise<string | undefined> {
try { try {

File diff suppressed because one or more lines are too long

View file

@ -62,19 +62,15 @@
</xsl:choose> </xsl:choose>
<!--<datacite:creator>--> <!--<datacite:creator>-->
<xsl:if test="PersonAuthor[normalize-space(concat(@FirstName, @LastName)) != '']">
<creators> <creators>
<xsl:apply-templates select="PersonAuthor" mode="oai_datacite"> <xsl:apply-templates select="PersonAuthor" mode="oai_datacite">
<xsl:sort select="@SortOrder"/> <xsl:sort select="@SortOrder"/>
</xsl:apply-templates> </xsl:apply-templates>
</creators> </creators>
</xsl:if>
<xsl:if test="TitleMain[normalize-space(@Value) != ''] or TitleAdditional[normalize-space(@Value) != '']">
<titles> <titles>
<xsl:apply-templates select="TitleMain" mode="oai_datacite" /> <xsl:apply-templates select="TitleMain" mode="oai_datacite" />
<xsl:apply-templates select="TitleAdditional" mode="oai_datacite" /> <xsl:apply-templates select="TitleAdditional" mode="oai_datacite" />
</titles> </titles>
</xsl:if>
<publisher> <publisher>
<!-- <xsl:value-of select="@PublisherName" /> --> <!-- <xsl:value-of select="@PublisherName" /> -->
<xsl:value-of select="@CreatingCorporation" /> <xsl:value-of select="@CreatingCorporation" />
@ -82,26 +78,22 @@
<publicationYear> <publicationYear>
<xsl:value-of select="ServerDatePublished/@Year" /> <xsl:value-of select="ServerDatePublished/@Year" />
</publicationYear> </publicationYear>
<xsl:if test="Subject[normalize-space(@Value) != '']">
<subjects> <subjects>
<xsl:apply-templates select="Subject" mode="oai_datacite" /> <xsl:apply-templates select="Subject" mode="oai_datacite" />
</subjects> </subjects>
</xsl:if>
<language> <language>
<xsl:value-of select="@Language" /> <xsl:value-of select="@Language" />
</language> </language>
<xsl:if test="PersonContributor[normalize-space(concat(@FirstName, @LastName)) != '']"> <xsl:if test="PersonContributor">
<contributors> <contributors>
<xsl:apply-templates select="PersonContributor" mode="oai_datacite"> <xsl:apply-templates select="PersonContributor" mode="oai_datacite">
<xsl:sort select="@SortOrder"/> <xsl:sort select="@SortOrder"/>
</xsl:apply-templates> </xsl:apply-templates>
</contributors> </contributors>
</xsl:if> </xsl:if>
<xsl:if test="(EmbargoDate and ($unixTimestamp &lt; EmbargoDate/@UnixTimestamp)) or CreatedAt">
<dates> <dates>
<xsl:call-template name="RdrDate2" /> <xsl:call-template name="RdrDate2" />
</dates> </dates>
</xsl:if>
<version> <version>
<xsl:choose> <xsl:choose>
<xsl:when test="@Version"> <xsl:when test="@Version">
@ -117,46 +109,42 @@
<!-- <xsl:value-of select="@Type" /> --> <!-- <xsl:value-of select="@Type" /> -->
</resourceType> </resourceType>
<xsl:if test="normalize-space(@landingpage) != ''">
<alternateIdentifiers> <alternateIdentifiers>
<xsl:call-template name="AlternateIdentifier" /> <xsl:call-template name="AlternateIdentifier" />
</alternateIdentifiers> </alternateIdentifiers>
</xsl:if>
<xsl:if test="Reference[normalize-space(@Type) != '' and normalize-space(@Relation) != '']"> <xsl:if test="Reference">
<relatedIdentifiers> <relatedIdentifiers>
<xsl:apply-templates select="Reference" mode="oai_datacite" /> <xsl:apply-templates select="Reference" mode="oai_datacite" />
</relatedIdentifiers> </relatedIdentifiers>
</xsl:if> </xsl:if>
<xsl:if test="Licence[normalize-space(@Name) != '' or normalize-space(@Url) != '']">
<rightsList> <rightsList>
<xsl:apply-templates select="Licence" mode="oai_datacite" /> <xsl:apply-templates select="Licence" mode="oai_datacite" />
</rightsList> </rightsList>
</xsl:if>
<xsl:if test="File">
<sizes> <sizes>
<size> <size>
<xsl:value-of select="count(File)" /> <xsl:value-of select="count(File)" />
<xsl:text> datasets</xsl:text> <xsl:text> datasets</xsl:text>
</size> </size>
</sizes> </sizes>
</xsl:if>
<xsl:if test="File[normalize-space(@MimeType) != '']">
<formats> <formats>
<xsl:apply-templates select="File/@MimeType" mode="oai_datacite" /> <xsl:apply-templates select="File/@MimeType" mode="oai_datacite" />
</formats> </formats>
</xsl:if>
<xsl:if test="TitleAbstract[normalize-space(@Value) != ''] or TitleAbstractAdditional[normalize-space(@Value) != '']">
<descriptions> <descriptions>
<xsl:apply-templates select="TitleAbstract" mode="oai_datacite" /> <xsl:apply-templates select="TitleAbstract" mode="oai_datacite" />
<xsl:apply-templates select="TitleAbstractAdditional" mode="oai_datacite" /> <xsl:apply-templates select="TitleAbstractAdditional" mode="oai_datacite" />
</descriptions> </descriptions>
</xsl:if>
<xsl:if test="Coverage[normalize-space(@XMin) != '' and normalize-space(@XMax) != '' and normalize-space(@YMin) != '' and normalize-space(@YMax) != '']">
<geoLocations> <geoLocations>
<xsl:apply-templates select="Coverage" mode="oai_datacite" /> <xsl:apply-templates select="Coverage" mode="oai_datacite" />
<!-- <geoLocation>
<geoLocationBox>
<westBoundLongitude>6.58987</westBoundLongitude>
<eastBoundLongitude>6.83639</eastBoundLongitude>
<southBoundLatitude>50.16</southBoundLatitude>
<northBoundLatitude>50.18691</northBoundLatitude>
</geoLocationBox>
</geoLocation> -->
</geoLocations> </geoLocations>
</xsl:if>
</resource> </resource>
</xsl:template> </xsl:template>
@ -188,40 +176,41 @@
<xsl:template match="Coverage" mode="oai_datacite" <xsl:template match="Coverage" mode="oai_datacite"
xmlns="http://datacite.org/schema/kernel-4"> xmlns="http://datacite.org/schema/kernel-4">
<xsl:if test="normalize-space(@XMin) != '' and normalize-space(@XMax) != '' and normalize-space(@YMin) != '' and normalize-space(@YMax) != ''">
<geoLocation> <geoLocation>
<geoLocationBox> <geoLocationBox>
<westBoundLongitude><xsl:value-of select="@XMin" /></westBoundLongitude> <westBoundLongitude>
<eastBoundLongitude><xsl:value-of select="@XMax" /></eastBoundLongitude> <xsl:value-of select="@XMin" />
<southBoundLatitude><xsl:value-of select="@YMin" /></southBoundLatitude> </westBoundLongitude>
<northBoundLatitude><xsl:value-of select="@YMax" /></northBoundLatitude> <eastBoundLongitude>
<xsl:value-of select="@XMax" />
</eastBoundLongitude>
<southBoundLatitude>
<xsl:value-of select="@YMin" />
</southBoundLatitude>
<northBoundLatitude>
<xsl:value-of select="@YMax" />
</northBoundLatitude>
</geoLocationBox> </geoLocationBox>
</geoLocation> </geoLocation>
</xsl:if>
</xsl:template> </xsl:template>
<!-- TitleAbstract template -->
<xsl:template match="TitleAbstract" mode="oai_datacite" <xsl:template match="TitleAbstract" mode="oai_datacite"
xmlns="http://datacite.org/schema/kernel-4"> xmlns="http://datacite.org/schema/kernel-4">
<xsl:if test="normalize-space(@Value) != ''">
<description> <description>
<xsl:attribute name="xml:lang"> <xsl:attribute name="xml:lang">
<xsl:value-of select="@Language" /> <xsl:value-of select="@Language" />
</xsl:attribute> </xsl:attribute>
<xsl:if test="@Type != ''"> <xsl:if test="@Type != ''">
<xsl:attribute name="descriptionType"> <xsl:attribute name="descriptionType">
<!-- <xsl:value-of select="@Type" /> -->
<xsl:text>Abstract</xsl:text> <xsl:text>Abstract</xsl:text>
</xsl:attribute> </xsl:attribute>
</xsl:if> </xsl:if>
<xsl:value-of select="@Value" /> <xsl:value-of select="@Value" />
</description> </description>
</xsl:if>
</xsl:template> </xsl:template>
<!-- TitleAbstractAdditional template -->
<xsl:template match="TitleAbstractAdditional" mode="oai_datacite" <xsl:template match="TitleAbstractAdditional" mode="oai_datacite"
xmlns="http://datacite.org/schema/kernel-4"> xmlns="http://datacite.org/schema/kernel-4">
<xsl:if test="normalize-space(@Value) != ''">
<description> <description>
<xsl:attribute name="xml:lang"> <xsl:attribute name="xml:lang">
<xsl:value-of select="@Language" /> <xsl:value-of select="@Language" />
@ -235,7 +224,6 @@
</xsl:if> </xsl:if>
<xsl:value-of select="@Value" /> <xsl:value-of select="@Value" />
</description> </description>
</xsl:if>
</xsl:template> </xsl:template>
<xsl:template name="CamelCaseWord"> <xsl:template name="CamelCaseWord">
@ -268,7 +256,6 @@
<xsl:template match="TitleMain" mode="oai_datacite" <xsl:template match="TitleMain" mode="oai_datacite"
xmlns="http://datacite.org/schema/kernel-4"> xmlns="http://datacite.org/schema/kernel-4">
<xsl:if test="normalize-space(@Value) != ''">
<title> <title>
<xsl:if test="@Language != ''"> <xsl:if test="@Language != ''">
<xsl:attribute name="xml:lang"> <xsl:attribute name="xml:lang">
@ -282,12 +269,9 @@
</xsl:if> </xsl:if>
<xsl:value-of select="@Value" /> <xsl:value-of select="@Value" />
</title> </title>
</xsl:if>
</xsl:template> </xsl:template>
<xsl:template match="TitleAdditional" mode="oai_datacite" <xsl:template match="TitleAdditional" mode="oai_datacite"
xmlns="http://datacite.org/schema/kernel-4"> xmlns="http://datacite.org/schema/kernel-4">
<xsl:if test="normalize-space(@Value) != ''">
<title> <title>
<xsl:if test="@Language != ''"> <xsl:if test="@Language != ''">
<xsl:attribute name="xml:lang"> <xsl:attribute name="xml:lang">
@ -310,12 +294,10 @@
</xsl:choose> </xsl:choose>
<xsl:value-of select="@Value" /> <xsl:value-of select="@Value" />
</title> </title>
</xsl:if>
</xsl:template> </xsl:template>
<xsl:template match="Subject" mode="oai_datacite" <xsl:template match="Subject" mode="oai_datacite"
xmlns="http://datacite.org/schema/kernel-4"> xmlns="http://datacite.org/schema/kernel-4">
<xsl:if test="normalize-space(@Value) != ''">
<subject> <subject>
<xsl:if test="@Language != ''"> <xsl:if test="@Language != ''">
<xsl:attribute name="xml:lang"> <xsl:attribute name="xml:lang">
@ -324,24 +306,21 @@
</xsl:if> </xsl:if>
<xsl:value-of select="@Value" /> <xsl:value-of select="@Value" />
</subject> </subject>
</xsl:if>
</xsl:template> </xsl:template>
<xsl:template name="AlternateIdentifier" match="AlternateIdentifier" mode="oai_datacite" <xsl:template name="AlternateIdentifier" match="AlternateIdentifier" mode="oai_datacite"
xmlns="http://datacite.org/schema/kernel-4"> xmlns="http://datacite.org/schema/kernel-4">
<xsl:if test="normalize-space(@landingpage) != ''">
<alternateIdentifier> <alternateIdentifier>
<xsl:attribute name="alternateIdentifierType"> <xsl:attribute name="alternateIdentifierType">
<xsl:text>url</xsl:text> <xsl:text>url</xsl:text>
</xsl:attribute> </xsl:attribute>
<!-- <xsl:variable name="identifier" select="concat($repURL, '/dataset/', @Id)" /> -->
<xsl:value-of select="@landingpage" /> <xsl:value-of select="@landingpage" />
</alternateIdentifier> </alternateIdentifier>
</xsl:if>
</xsl:template> </xsl:template>
<xsl:template match="Reference" mode="oai_datacite" <xsl:template match="Reference" mode="oai_datacite"
xmlns="http://datacite.org/schema/kernel-4"> xmlns="http://datacite.org/schema/kernel-4">
<xsl:if test="normalize-space(@Type) != '' and normalize-space(@Relation) != ''">
<relatedIdentifier> <relatedIdentifier>
<xsl:attribute name="relatedIdentifierType"> <xsl:attribute name="relatedIdentifierType">
<xsl:value-of select="@Type" /> <xsl:value-of select="@Type" />
@ -351,13 +330,10 @@
</xsl:attribute> </xsl:attribute>
<xsl:value-of select="@Value" /> <xsl:value-of select="@Value" />
</relatedIdentifier> </relatedIdentifier>
</xsl:if>
</xsl:template> </xsl:template>
<!-- PersonContributor template -->
<xsl:template match="PersonContributor" mode="oai_datacite" <xsl:template match="PersonContributor" mode="oai_datacite"
xmlns="http://datacite.org/schema/kernel-4"> xmlns="http://datacite.org/schema/kernel-4">
<xsl:if test="normalize-space(concat(@FirstName, @LastName)) != ''">
<contributor> <contributor>
<xsl:if test="@ContributorType != ''"> <xsl:if test="@ContributorType != ''">
<xsl:attribute name="contributorType"> <xsl:attribute name="contributorType">
@ -370,10 +346,9 @@
<xsl:value-of select="@NameType" /> <xsl:value-of select="@NameType" />
</xsl:attribute> </xsl:attribute>
</xsl:if> --> </xsl:if> -->
<xsl:value-of select="concat(@FirstName, ' ', @LastName)" /> <xsl:value-of select="concat(@FirstName, ' ',@LastName)" />
</contributorName> </contributorName>
</contributor> </contributor>
</xsl:if>
</xsl:template> </xsl:template>
<xsl:template match="PersonAuthor" mode="oai_datacite" <xsl:template match="PersonAuthor" mode="oai_datacite"
@ -428,11 +403,9 @@
<xsl:template match="File/@MimeType" mode="oai_datacite" <xsl:template match="File/@MimeType" mode="oai_datacite"
xmlns="http://datacite.org/schema/kernel-4"> xmlns="http://datacite.org/schema/kernel-4">
<xsl:if test="normalize-space(.) != ''">
<format> <format>
<xsl:value-of select="." /> <xsl:value-of select="." />
</format> </format>
</xsl:if>
</xsl:template> </xsl:template>
<xsl:template match="Licence" mode="oai_datacite" <xsl:template match="Licence" mode="oai_datacite"

View file

@ -51,11 +51,6 @@ const handleSubmit = async (e) => {
</SectionTitleLineWithButton> </SectionTitleLineWithButton>
<CardBox form @submit.prevent="handleSubmit"> <CardBox form @submit.prevent="handleSubmit">
<FormValidationErrors v-bind:errors="errors" /> <FormValidationErrors v-bind:errors="errors" />
<!-- Your existing warning display will show the warning -->
<!-- <div v-if="flash && flash.warning">
<p>{{ flash.warning }}</p>
</div> -->
<!-- <div class="flex flex-col md:flex-row items-center"> --> <!-- <div class="flex flex-col md:flex-row items-center"> -->
<!-- <div class="w-full"> <!-- <div class="w-full">