Skip to content

Commit a1fbf55

Browse files
authored
Added PORTRAIT_IMAGE custom compliance (#936)
1 parent 2092d3a commit a1fbf55

File tree

4 files changed

+53
-2
lines changed

4 files changed

+53
-2
lines changed

packages/common/src/i18n/translations/image.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,4 +416,18 @@ export const complianceIssueLabels: Record<ComplianceIssue, ImageLabels> = {
416416
nl: 'Zorg ervoor dat de foto van goede kwaliteit is.',
417417
},
418418
},
419+
[ComplianceIssue.PORTRAIT_IMAGE]: {
420+
title: {
421+
en: 'Portrait Image',
422+
fr: 'Image en mode portrait',
423+
de: 'Hochformatbild',
424+
nl: 'Portretfoto',
425+
},
426+
description: {
427+
en: 'The picture is in portrait mode, please take it in landscape',
428+
fr: 'L’image est en mode portrait, veuillez la prendre en mode paysage',
429+
de: 'Das Bild ist im Hochformat, bitte fotografieren Sie im Querformat',
430+
nl: 'De foto is in portretstand, neem deze alstublieft in landschapmodus',
431+
},
432+
},
419433
};

packages/network/src/api/image/mappers.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
ImageSubtype,
1111
ImageType,
1212
MonkEntityType,
13+
PixelDimensions,
1314
VehiclePart,
1415
} from '@monkvision/types';
1516
import { ApiImage, ApiImageComplianceResults } from '../models';
@@ -134,6 +135,13 @@ function applyCustomComplianceThresholds(
134135
return complianceIssues;
135136
}
136137

138+
function applyCustomCompliances(issues: string[], imageDimensions?: PixelDimensions) {
139+
if (imageDimensions && imageDimensions.height > imageDimensions.width) {
140+
return [...issues, ComplianceIssue.PORTRAIT_IMAGE];
141+
}
142+
return issues;
143+
}
144+
137145
function filterCompliances(issues: string[], validIssues: ComplianceIssue[]): ComplianceIssue[] {
138146
return (issues as ComplianceIssue[]).filter((issue) => validIssues.includes(issue));
139147
}
@@ -146,6 +154,7 @@ function mapCompliance(
146154
sightId?: string,
147155
complianceResult?: ApiImageComplianceResults,
148156
complianceOptions?: ComplianceOptions,
157+
imageDimensions?: PixelDimensions,
149158
): {
150159
status: ImageStatus;
151160
complianceIssues?: ComplianceIssue[];
@@ -163,7 +172,11 @@ function mapCompliance(
163172
complianceResult,
164173
customComplianceThresholds,
165174
);
166-
const filteredCompliances = filterCompliances(newIssuesAfterCustomThresholds, complianceIssues);
175+
const newIssuesAfterCustomCompliances = applyCustomCompliances(
176+
newIssuesAfterCustomThresholds,
177+
imageDimensions,
178+
);
179+
const filteredCompliances = filterCompliances(newIssuesAfterCustomCompliances, complianceIssues);
167180
if (filteredCompliances.length === 0) {
168181
return { status: ImageStatus.SUCCESS };
169182
}
@@ -180,7 +193,12 @@ export function mapApiImage(
180193
complianceOptions?: ComplianceOptions,
181194
): Image {
182195
const sightId = image.additional_data?.sight_id;
183-
const { status, complianceIssues } = mapCompliance(sightId, image.compliances, complianceOptions);
196+
const { status, complianceIssues } = mapCompliance(
197+
sightId,
198+
image.compliances,
199+
complianceOptions,
200+
{ width: image.image_width, height: image.image_height },
201+
);
184202
return {
185203
id: image.id,
186204
entityType: MonkEntityType.IMAGE,

packages/network/test/api/image/mappers.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const EXPECTED_DEFAULT_COMPLIANCE_ISSUES = [
2525
ComplianceIssue.TOO_ZOOMED,
2626
ComplianceIssue.NOT_ZOOMED_ENOUGH,
2727
ComplianceIssue.MISSING,
28+
ComplianceIssue.PORTRAIT_IMAGE,
2829
];
2930

3031
const EXPECTED_COMPLIANCE_ISSUES_ORDER = [
@@ -39,6 +40,7 @@ const EXPECTED_COMPLIANCE_ISSUES_ORDER = [
3940
ComplianceIssue.HIDDEN_PARTS,
4041
ComplianceIssue.MISSING_PARTS,
4142
ComplianceIssue.WRONG_CENTER_PART,
43+
ComplianceIssue.PORTRAIT_IMAGE,
4244
ComplianceIssue.REFLECTIONS,
4345
ComplianceIssue.SNOWNESS,
4446
ComplianceIssue.WETNESS,
@@ -322,6 +324,17 @@ describe('Image API Mappers', () => {
322324
expect(result.complianceIssues).toEqual(EXPECTED_COMPLIANCE_ISSUES_ORDER);
323325
});
324326

327+
it('should properly apply custom compliances', () => {
328+
const apiImage = createApiImage();
329+
apiImage.image_height = 2000;
330+
apiImage.image_width = 500;
331+
332+
const result = mapApiImage(apiImage, '', '', { enableCompliance: true });
333+
console.log('result:', result);
334+
335+
expect(result.status).toEqual(ImageStatus.NOT_COMPLIANT);
336+
});
337+
325338
it('should properly apply custom thresholds', () => {
326339
const apiImage = createApiImage();
327340
apiImage.compliances = {

packages/types/src/state/image.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,17 @@ export enum ComplianceIssue {
189189
INTERIOR_NOT_SUPPORTED = 'interior_not_supported',
190190
MISSING = 'missing',
191191
LOW_QUALITY = 'low_quality',
192+
193+
// Custom issue(s)
194+
PORTRAIT_IMAGE = 'portrait_image',
192195
}
193196

194197
/**
195198
* The order of priority of compliance issues in the SDK. This array is used to sort compliance issue arrays. The
196199
* smaller the index, the higher the priority of the compliance issue.
197200
*/
198201
export const COMPLIANCE_ISSUES_PRIORITY = [
202+
// TODO: remove before release
199203
ComplianceIssue.NO_VEHICLE,
200204

201205
ComplianceIssue.BLURRINESS,
@@ -209,6 +213,7 @@ export const COMPLIANCE_ISSUES_PRIORITY = [
209213
ComplianceIssue.HIDDEN_PARTS,
210214
ComplianceIssue.MISSING_PARTS,
211215
ComplianceIssue.WRONG_CENTER_PART,
216+
ComplianceIssue.PORTRAIT_IMAGE,
212217

213218
ComplianceIssue.REFLECTIONS,
214219
ComplianceIssue.SNOWNESS,
@@ -254,6 +259,7 @@ export const DEFAULT_COMPLIANCE_ISSUES = [
254259
// ComplianceIssue.INTERIOR_NOT_SUPPORTED,
255260
ComplianceIssue.MISSING,
256261
// ComplianceIssue.LOW_QUALITY,
262+
ComplianceIssue.PORTRAIT_IMAGE,
257263
];
258264

259265
/**

0 commit comments

Comments
 (0)