Skip to content

Commit 5978116

Browse files
feat: show Culture and Leisure Division's venues first in relevance sort
Dependent on changes made in unified-search PRs: - City-of-Helsinki/unified-search#209 - Add showCultureAndLeisureDivisionFirst parameter to unifiedSearch query & isCultureAndLeisureDivisionVenue to UnifiedSearchVenue type - City-of-Helsinki/unified-search#218 - Add eventCount in UnifiedSearchVenue type also: - update schemas & generated types - include isCultureAndLeisureDivisionVenue value in venue list to be able to verify results' sorting easier refs LIIKUNTA-684
1 parent 1cd12a5 commit 5978116

9 files changed

Lines changed: 123 additions & 316 deletions

File tree

apps/sports-helsinki/config/vitest/mockDataUtils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ export const fakeVenuesSearchList = (
453453
reservation: null,
454454
serviceOwner: null,
455455
targetGroups: [],
456+
isCultureAndLeisureDivisionVenue: true,
456457
},
457458
},
458459
};

apps/sports-helsinki/src/domain/search/combinedSearch/adapters/VenueSearchAdapter.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import type {
66
AppLanguage,
77
Coordinates,
88
OrderByDistance,
9-
UnifiedSearchLanguage,
109
} from '@events-helsinki/components/types';
1110
import {
1211
SortOrder,
@@ -43,6 +42,7 @@ class VenueSearchAdapter implements CombinedSearchAdapter<VenueSearchParams> {
4342
orderByName: VenueSearchParams['orderByName'];
4443
orderByDistance: VenueSearchParams['orderByDistance'];
4544
orderByAccessibilityProfile: VenueSearchParams['orderByAccessibilityProfile'];
45+
showCultureAndLeisureDivisionFirst: VenueSearchParams['showCultureAndLeisureDivisionFirst'];
4646
after?: VenueSearchParams['after'];
4747
first?: VenueSearchParams['first'];
4848

@@ -60,9 +60,7 @@ class VenueSearchAdapter implements CombinedSearchAdapter<VenueSearchParams> {
6060
// Initialize the object with default values
6161
Object.assign(this, initialVenueSearchAdapterValues);
6262

63-
this.language = appToUnifiedSearchLanguageMap[
64-
locale
65-
] as UnifiedSearchLanguage;
63+
this.language = appToUnifiedSearchLanguageMap[locale];
6664
this.text = input.text || initialVenueSearchAdapterValues.text;
6765
this.ontologyTreeIdOrSets =
6866
this.getOntologyTreeIdOrSets(input) ||
@@ -74,6 +72,7 @@ class VenueSearchAdapter implements CombinedSearchAdapter<VenueSearchParams> {
7472
? [ServiceOwnerType.MunicipalService]
7573
: initialVenueSearchAdapterValues.serviceOwnerTypes;
7674
this.mustHaveReservableResource = !!input.reservable;
75+
7776
if (input.venueOrderBy?.includes('name')) {
7877
this.orderByName = input.venueOrderBy.startsWith('-')
7978
? { order: SortOrder.Descending }
@@ -88,6 +87,10 @@ class VenueSearchAdapter implements CombinedSearchAdapter<VenueSearchParams> {
8887
} as OrderByDistance;
8988
} else if (isAccessibilityProfile(input.venueOrderBy)) {
9089
this.orderByAccessibilityProfile = input.venueOrderBy;
90+
} else {
91+
// Only show Culture and Leisure Division's venues first
92+
// if no other specific ordering is defined → means "Sort by relevance",
93+
this.showCultureAndLeisureDivisionFirst = true;
9194
}
9295
}
9396

apps/sports-helsinki/src/domain/search/combinedSearch/adapters/__tests__/CombinedSearchFormAdapter.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ describe('CombinedSearchFormAdapter', () => {
131131
first: AppConfig.pageSize,
132132
ontologyTreeIdOrSets: [['551']],
133133
openAt: null,
134+
showCultureAndLeisureDivisionFirst: true,
134135
},
135136
],
136137
[

apps/sports-helsinki/src/domain/search/combinedSearch/adapters/__tests__/VenueSearchAdapter.test.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,40 @@
1+
import type { Coordinates } from '@events-helsinki/components';
12
import {
3+
OrderDir,
24
SENIORS_ONTOLOGY_TREE_IDS,
5+
UnifiedSearchOrderBy,
36
YOUTH_ONTOLOGY_TREE_IDS,
47
} from '@events-helsinki/components';
58
import { SortOrder, TARGET_GROUPS } from '@events-helsinki/components/types';
69
import AppConfig from '../../../../app/AppConfig';
10+
import { initialCombinedSearchFormValues } from '../../constants';
711
import type { CombinedSearchAdapterInput } from '../../types';
812
import VenueSearchAdapter from '../VenueSearchAdapter';
913

1014
const locale = 'fi';
1115

16+
const TEST_GEOLOCATION = {
17+
latitude: 12.5,
18+
longitude: 34.75,
19+
} as const satisfies Coordinates;
20+
21+
const VENUE_ORDER_BY_RELEVANCE_COMBINATIONS = [
22+
undefined,
23+
null,
24+
'',
25+
`${UnifiedSearchOrderBy.relevance}-${OrderDir.asc}`,
26+
`${UnifiedSearchOrderBy.relevance}-${OrderDir.desc}`,
27+
] as const;
28+
29+
const VENUE_ORDER_BY_NAME_OR_DISTANCE_COMBINATIONS = [
30+
`${UnifiedSearchOrderBy.name}-${OrderDir.asc}`,
31+
`${UnifiedSearchOrderBy.name}-${OrderDir.desc}`,
32+
`${UnifiedSearchOrderBy.distance}-${OrderDir.asc}`,
33+
`${UnifiedSearchOrderBy.distance}-${OrderDir.desc}`,
34+
] as const;
35+
36+
const TEST_TEXTS = ['test', '', null, '*'] as const;
37+
1238
describe('VenueSearchAdapter', () => {
1339
describe('getQueryVariables', () => {
1440
it('converts the form values input to a desired search variables as an output', () => {
@@ -64,4 +90,61 @@ describe('VenueSearchAdapter', () => {
6490
);
6591
});
6692
});
93+
94+
describe('showCultureAndLeisureDivisionFirst is undefined', () => {
95+
it.each(VENUE_ORDER_BY_NAME_OR_DISTANCE_COMBINATIONS)(
96+
'when sorting by %s regardless of search text',
97+
(venueOrderBy) => {
98+
for (const text in TEST_TEXTS) {
99+
const input: CombinedSearchAdapterInput = {
100+
...initialCombinedSearchFormValues,
101+
text,
102+
venueOrderBy,
103+
};
104+
const adapter = new VenueSearchAdapter(
105+
input,
106+
locale,
107+
TEST_GEOLOCATION
108+
);
109+
expect(
110+
adapter.getQueryVariables()['showCultureAndLeisureDivisionFirst']
111+
).toBeUndefined();
112+
}
113+
}
114+
);
115+
});
116+
117+
describe('showCultureAndLeisureDivisionFirst set to true', () => {
118+
it('by default', () => {
119+
const adapter = new VenueSearchAdapter(
120+
initialCombinedSearchFormValues,
121+
locale,
122+
TEST_GEOLOCATION
123+
);
124+
expect(
125+
adapter.getQueryVariables()['showCultureAndLeisureDivisionFirst']
126+
).toStrictEqual(true);
127+
});
128+
129+
it.each(VENUE_ORDER_BY_RELEVANCE_COMBINATIONS)(
130+
'when sorting by %s regardless of search text',
131+
(venueOrderBy) => {
132+
for (const text in TEST_TEXTS) {
133+
const input: CombinedSearchAdapterInput = {
134+
...initialCombinedSearchFormValues,
135+
text,
136+
venueOrderBy,
137+
};
138+
const adapter = new VenueSearchAdapter(
139+
input,
140+
locale,
141+
TEST_GEOLOCATION
142+
);
143+
expect(
144+
adapter.getQueryVariables()['showCultureAndLeisureDivisionFirst']
145+
).toStrictEqual(true);
146+
}
147+
}
148+
);
149+
});
67150
});

apps/sports-helsinki/src/domain/search/combinedSearch/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ export type VenueSearchParams = Pick<
134134
| 'orderByName'
135135
| 'orderByDistance'
136136
| 'orderByAccessibilityProfile'
137+
| 'showCultureAndLeisureDivisionFirst'
137138
| 'after'
138139
| 'first'
139140
>;

packages/components/src/components/domain/unifiedSearch/graphql/unifiedSearchList.query.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export const SEARCH_LIST_QUERY = gql`
1818
$orderByAccessibilityProfile: AccessibilityProfile
1919
$showAccessibilityShortcomingsFor: AccessibilityProfile
2020
$mustHaveReservableResource: Boolean
21+
$showCultureAndLeisureDivisionFirst: Boolean
2122
$includeHaukiFields: Boolean = true
2223
) {
2324
unifiedSearch(
@@ -37,6 +38,7 @@ export const SEARCH_LIST_QUERY = gql`
3738
orderByDistance: $orderByDistance
3839
orderByName: $orderByName
3940
orderByAccessibilityProfile: $orderByAccessibilityProfile
41+
showCultureAndLeisureDivisionFirst: $showCultureAndLeisureDivisionFirst
4042
) {
4143
count
4244
pageInfo {
@@ -49,6 +51,7 @@ export const SEARCH_LIST_QUERY = gql`
4951
meta {
5052
id
5153
}
54+
isCultureAndLeisureDivisionVenue
5255
name {
5356
fi
5457
sv

0 commit comments

Comments
 (0)