diff --git a/src/modules/ie-objects/elasticsearch/queryBuilder.spec.ts b/src/modules/ie-objects/elasticsearch/queryBuilder.spec.ts index 1b45194b..c8e9d4b8 100644 --- a/src/modules/ie-objects/elasticsearch/queryBuilder.spec.ts +++ b/src/modules/ie-objects/elasticsearch/queryBuilder.spec.ts @@ -596,7 +596,7 @@ describe('QueryBuilder', () => { ); }); - it('Should produce a terms query on dcterms_rights_statement when freely-reusable is selected', () => { + it('Should produce a bool/should query on dcterms_rights_statement and reuse_category when freely-reusable is selected', () => { const queryObject = QueryBuilder.build( { page: 1, @@ -613,12 +613,13 @@ describe('QueryBuilder', () => { ); const queryString = JSON.stringify(queryObject); expect(queryString).toContain('dcterms_rights_statement'); + expect(queryString).toContain('reuse_category'); expect(queryString).toContain('https://creativecommons.org/publicdomain/mark/1.0/'); // Should not include URIs from other categories expect(queryString).not.toContain('https://rightsstatements.org/page/InC/1.0/'); }); - it('Should apply reusability filter using dcterms rights statements for all 3 reusability categories', () => { + it('Should apply reusability filter using dcterms rights statements and reuse_category for all 3 reusability categories', () => { const queryObject = QueryBuilder.build( { page: 1, @@ -640,7 +641,9 @@ describe('QueryBuilder', () => { const queryString = JSON.stringify(queryObject); expect(queryString).toContain('https://creativecommons.org/publicdomain/mark/1.0/'); expect(queryString).toContain('https://rightsstatements.org/page/UND/1.0/'); - expect(queryString).toContain('REUSABILITY_DCTERMS_RIGHTS_STATEMENT'); + expect(queryString).toContain('REUSABILITY_DCTERMS_RIGHTS_STATEMENT_NEWSPAPERS'); + expect(queryString).toContain('REUSABILITY_REUSE_CATEGORY_AUDIO_VIDEO'); + expect(queryString).toContain('reuse_category'); }); it('Should apply reusability filters in the public limited metadata branch', () => { @@ -661,7 +664,9 @@ describe('QueryBuilder', () => { const publicLimitedBranch = JSON.stringify(queryObject.query.bool.should[0]); expect(publicLimitedBranch).toContain('PUBLIC-METDATA_LTD'); - expect(publicLimitedBranch).toContain('REUSABILITY_DCTERMS_RIGHTS_STATEMENT'); + expect(publicLimitedBranch).toContain('REUSABILITY_DCTERMS_RIGHTS_STATEMENT_NEWSPAPERS'); + expect(publicLimitedBranch).toContain('REUSABILITY_REUSE_CATEGORY_AUDIO_VIDEO'); + expect(publicLimitedBranch).toContain('reuse_category'); expect(publicLimitedBranch).toContain('https://rightsstatements.org/page/UND/1.0/'); }); @@ -684,7 +689,7 @@ describe('QueryBuilder', () => { expect(queryString).not.toContain('dcterms_rights_statement'); }); - it('Should apply dcterms rights statements for reusable-with-conditions category', () => { + it('Should apply dcterms rights statements and reuse_category for reusable-with-conditions category', () => { const queryObject = QueryBuilder.build( { page: 1, @@ -701,7 +706,9 @@ describe('QueryBuilder', () => { ); const queryString = JSON.stringify(queryObject); - expect(queryString).toContain('REUSABILITY_DCTERMS_RIGHTS_STATEMENT'); + expect(queryString).toContain('REUSABILITY_DCTERMS_RIGHTS_STATEMENT_NEWSPAPERS'); + expect(queryString).toContain('REUSABILITY_REUSE_CATEGORY_AUDIO_VIDEO'); + expect(queryString).toContain('reuse_category'); expect(queryString).toContain('https://rightsstatements.org/page/NoC-CR/1.0/'); }); diff --git a/src/modules/ie-objects/elasticsearch/queryBuilder.ts b/src/modules/ie-objects/elasticsearch/queryBuilder.ts index 4f7b7757..ad22ceed 100644 --- a/src/modules/ie-objects/elasticsearch/queryBuilder.ts +++ b/src/modules/ie-objects/elasticsearch/queryBuilder.ts @@ -3,10 +3,7 @@ import jsep from 'jsep'; import { clamp, compact, forEach, isArray, isEmpty, isNil, uniq } from 'lodash'; import { IeObjectsQueryDto, SearchFilter } from '../dto/ie-objects.dto'; -import { - buildFreeTextFilter, - convertNodeToEsQueryFilterObjects, -} from '../helpers/convert-node-to-es-query-filter-objects'; +import { buildFreeTextFilter, convertNodeToEsQueryFilterObjects, } from '../helpers/convert-node-to-es-query-filter-objects'; import { encodeSearchterm } from '../helpers/encode-search-term'; import { IeObjectLicense } from '../ie-objects.types'; @@ -661,9 +658,22 @@ export class QueryBuilder { const reusabilityQueries = [ rightsStatementUris.length ? { - terms: { - _name: 'REUSABILITY_DCTERMS_RIGHTS_STATEMENT', - dcterms_rights_statement: rightsStatementUris, + bool: { + should: [ + { + terms: { + _name: 'REUSABILITY_DCTERMS_RIGHTS_STATEMENT_NEWSPAPERS', + dcterms_rights_statement: rightsStatementUris, + }, + }, + { + terms: { + _name: 'REUSABILITY_REUSE_CATEGORY_AUDIO_VIDEO', + 'reuse_category.id': rightsStatementUris, + }, + }, + ], + minimum_should_match: 1, }, } : null, diff --git a/src/modules/material-requests/services/material-requests.service.ts b/src/modules/material-requests/services/material-requests.service.ts index 75654de2..661d73e1 100644 --- a/src/modules/material-requests/services/material-requests.service.ts +++ b/src/modules/material-requests/services/material-requests.service.ts @@ -1,9 +1,30 @@ import { parse } from 'node:path'; -import { AssetsService, DataService, Locale, StillsObjectType, VideoStillsService, } from '@meemoo/admin-core-api'; -import { BadRequestException, Injectable, InternalServerErrorException, NotFoundException, } from '@nestjs/common'; +import { + AssetsService, + DataService, + Locale, + StillsObjectType, + VideoStillsService, +} from '@meemoo/admin-core-api'; +import { + BadRequestException, + Injectable, + InternalServerErrorException, + NotFoundException, +} from '@nestjs/common'; import { type IPagination, Pagination } from '@studiohyperdrive/pagination'; import { mapLimit } from 'blend-promise-utils'; -import { compact, groupBy, intersection, isArray, isEmpty, isNil, kebabCase, noop, set, } from 'lodash'; +import { + compact, + groupBy, + intersection, + isArray, + isEmpty, + isNil, + kebabCase, + noop, + set, +} from 'lodash'; import { CreateMaterialRequestDto, diff --git a/src/modules/organisations/mocks/organisations.mocks.ts b/src/modules/organisations/mocks/organisations.mocks.ts index 379edd26..5e476979 100644 --- a/src/modules/organisations/mocks/organisations.mocks.ts +++ b/src/modules/organisations/mocks/organisations.mocks.ts @@ -1,4 +1,9 @@ -import { ContactPointType, type GqlOrganisation, type Organisation, PostalAddressType, } from '../organisations.types'; +import { + ContactPointType, + type GqlOrganisation, + type Organisation, + PostalAddressType, +} from '../organisations.types'; import { IeObjectSector } from '~modules/ie-objects/ie-objects.types'; diff --git a/src/modules/sitemap/services/sitemap.service.ts b/src/modules/sitemap/services/sitemap.service.ts index 114b4dbc..d793ed28 100644 --- a/src/modules/sitemap/services/sitemap.service.ts +++ b/src/modules/sitemap/services/sitemap.service.ts @@ -1,4 +1,9 @@ -import { AssetsService, ContentPagesService, DataService, DbContentPage, } from '@meemoo/admin-core-api'; +import { + AssetsService, + ContentPagesService, + DataService, + DbContentPage, +} from '@meemoo/admin-core-api'; import { Injectable, InternalServerErrorException } from '@nestjs/common'; import { format } from 'date-fns'; import { compact, kebabCase, uniqBy } from 'lodash'; diff --git a/src/modules/users/services/users.service.ts b/src/modules/users/services/users.service.ts index 99e26497..a05f113c 100644 --- a/src/modules/users/services/users.service.ts +++ b/src/modules/users/services/users.service.ts @@ -1,6 +1,11 @@ import { convertUserInfoToCommonUser, DataService, UserInfoType } from '@meemoo/admin-core-api'; import { Injectable, Logger, NotFoundException } from '@nestjs/common'; -import { AvoAuthIdpType, AvoUserCommonUser, AvoUserHetArchiefUser, PermissionName, } from '@viaa/avo2-types'; +import { + AvoAuthIdpType, + AvoUserCommonUser, + AvoUserHetArchiefUser, + PermissionName, +} from '@viaa/avo2-types'; import { GetUserByEmailDocument, @@ -35,7 +40,13 @@ import { getOrganisationAddress } from '~modules/organisations/helpers/get-organ import { customError } from '~shared/helpers/custom-error'; import type { UpdateResponse } from '~shared/types/types'; import { CreateOrUpdateUserDto, UpdateAcceptedTosDto, UpdateUserLangDto } from '../dto/users.dto'; -import { type GqlPermissionData, type GqlUser, GroupIdToName, type GroupName, type User, } from '../types'; +import { + type GqlPermissionData, + type GqlUser, + GroupIdToName, + type GroupName, + type User, +} from '../types'; @Injectable() export class UsersService {