Skip to content

Commit a624b34

Browse files
author
VuXfi
committed
feat: implement ProductModifier class with validation logic for order modifiers
1 parent ed3bf67 commit a624b34

File tree

18 files changed

+224
-35
lines changed

18 files changed

+224
-35
lines changed

adapters/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export declare class Adapter {
3636
private static instancePromotionAdapter;
3737
private static instanceDeliveryAdapter;
3838
private static instanceMF;
39-
static WEBRESTO_MODULES_PATH: any;
39+
static WEBRESTO_MODULES_PATH: string;
4040
static getOTPAdapter(adapterName?: string): Promise<OTPAdapter>;
4141
static getPromotionAdapter(adapter?: string | PromotionAdapter, initParams?: {
4242
[key: string]: string | number | boolean;

adapters/mediafile/default/local.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ export default class LocalMediaFileAdapter extends MediaFileAdapter {
3939
loadMediaFilesProcessQueue: LoadMediaFilesProcess[];
4040
constructor(config: BaseConfig);
4141
getNameByUrl(url: string, ext: string, options?: any, salt?: string): string;
42-
protected getPrefix(type?: MediaFileTypes, absolute?: boolean): any;
43-
getOriginalFilePath(url: string, type: MediaFileTypes, absolute?: boolean): any;
42+
protected getPrefix(type?: MediaFileTypes, absolute?: boolean): string;
43+
getOriginalFilePath(url: string, type: MediaFileTypes, absolute?: boolean): string;
4444
protected download(loadMediaFilesProcess: LoadMediaFilesProcess): Promise<string>;
4545
private loadMediaFiles;
4646
}

interfaces/Modifier.d.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
import { DishRecord } from "../models/Dish";
22
import { GroupRecord } from "../models/Group";
3+
export interface OrderModifier {
4+
id: string;
5+
/**
6+
* Default for amount is 1
7+
* This will be changed in a future version to have stricter rules
8+
*/
9+
amount?: number;
10+
dish?: DishRecord;
11+
modifierId?: string;
12+
}
313
interface BaseModifier {
414
/**
515
* restocore dishId
@@ -20,16 +30,6 @@ interface BaseModifier {
2030
*/
2131
freeOfChargeAmount?: number | null;
2232
}
23-
export interface OrderModifier {
24-
id: string;
25-
/**
26-
* Default for amount is 1
27-
* This will be changed in a future version to have stricter rules
28-
*/
29-
amount?: number;
30-
dish?: DishRecord;
31-
modifierId?: string;
32-
}
3333
export interface Modifier extends BaseModifier {
3434
/**
3535
* rmsId

interfaces/Modifier.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@
44
import { DishRecord } from "../models/Dish";
55
import { GroupRecord } from "../models/Group";
66

7+
export interface OrderModifier {
8+
id: string // means rmsId
9+
/**
10+
* Default for amount is 1
11+
* This will be changed in a future version to have stricter rules
12+
*/
13+
amount?: number
14+
dish?: DishRecord // TODO: refactor to delete it from OrderModifier
15+
modifierId?: string // TODO: refactor to delete it from OrderModifier
16+
}
17+
18+
19+
720
interface BaseModifier {
821
/**
922
* restocore dishId
@@ -25,16 +38,6 @@ interface BaseModifier {
2538
freeOfChargeAmount?: number | null;
2639
}
2740

28-
export interface OrderModifier {
29-
id: string // means rmsId
30-
/**
31-
* Default for amount is 1
32-
* This will be changed in a future version to have stricter rules
33-
*/
34-
amount?: number
35-
dish?: DishRecord // TODO: refactor to delete it from OrderModifier
36-
modifierId?: string // TODO: refactor to delete it from OrderModifier
37-
}
3841

3942
export interface Modifier extends BaseModifier {
4043
/**
@@ -43,6 +46,7 @@ export interface Modifier extends BaseModifier {
4346
id: string;
4447
}
4548

49+
4650
export interface GroupModifier extends BaseModifier {
4751
id?: string; // id не обязательный для поддержки вирутальных групп
4852
childModifiers: Modifier[];

interfaces/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export declare class Adapter {
2929
private static instancePromotionAdapter;
3030
private static instanceDeliveryAdapter;
3131
private static instanceMF;
32-
static WEBRESTO_MODULES_PATH: any;
32+
static WEBRESTO_MODULES_PATH: string;
3333
static getOTPAdapter(adapterName?: string): Promise<OTPAdapter>;
3434
static getPromotionAdapter(adapter?: string | PromotionAdapter, initParams?: {
3535
[key: string]: string | number | boolean;

libs/BackupHandler.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import * as tar from 'tar';
12
interface BaseOptions {
23
isDeleted: boolean;
34
concepts: string[];
@@ -12,7 +13,7 @@ export declare class BackupHandler {
1213
private groups;
1314
private dishes;
1415
workDir: string;
15-
tar: any;
16+
tar: typeof tar;
1617
exportToTar(filePath: string, options?: Partial<BackupOptions>): Promise<void>;
1718
importFromTar(filePath: string, options?: Partial<RestoreOptions>): Promise<void>;
1819
private createJSON;

libs/ProductModifier.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { GroupModifier, OrderModifier } from "../interfaces/Modifier";
2+
export declare class ProductModifier {
3+
private productModifiers;
4+
constructor(productModifiers: GroupModifier[]);
5+
validate(orderModifiers: OrderModifier[]): void;
6+
private validateGroupOrThrow;
7+
}

libs/ProductModifier.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
exports.ProductModifier = void 0;
4+
class ProductModifier {
5+
constructor(productModifiers) {
6+
this.productModifiers = productModifiers;
7+
}
8+
validate(orderModifiers) {
9+
for (const group of this.productModifiers) {
10+
this.validateGroupOrThrow(group, orderModifiers);
11+
}
12+
}
13+
validateGroupOrThrow(group, orderModifiers) {
14+
const { id: groupId, childModifiers, minAmount = 0, maxAmount = Infinity } = group;
15+
const allowedModifierIds = new Set(childModifiers.map(m => m.id));
16+
const relevantOrderMods = orderModifiers.filter(mod => allowedModifierIds.has(mod.id));
17+
const selectedAmount = relevantOrderMods.reduce((sum, mod) => sum + (mod.amount ?? 1), 0);
18+
if (selectedAmount < minAmount) {
19+
throw new Error(`Group ${groupId ?? '[no id]'}: minimum required modifiers is ${minAmount}, but got ${selectedAmount}`);
20+
}
21+
if (selectedAmount > maxAmount) {
22+
throw new Error(`Group ${groupId ?? '[no id]'}: maximum allowed modifiers is ${maxAmount}, but got ${selectedAmount}`);
23+
}
24+
}
25+
}
26+
exports.ProductModifier = ProductModifier;

libs/ProductModifier.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { GroupModifier, OrderModifier } from "../interfaces/Modifier";
2+
3+
export class ProductModifier {
4+
private productModifiers: GroupModifier[];
5+
6+
constructor(productModifiers: GroupModifier[]) {
7+
this.productModifiers = productModifiers;
8+
}
9+
10+
validate(orderModifiers: OrderModifier[]): void {
11+
for (const group of this.productModifiers) {
12+
this.validateGroupOrThrow(group, orderModifiers);
13+
}
14+
}
15+
16+
private validateGroupOrThrow(group: GroupModifier, orderModifiers: OrderModifier[]): void {
17+
const { id: groupId, childModifiers, minAmount = 0, maxAmount = Infinity } = group;
18+
19+
const allowedModifierIds = new Set(childModifiers.map(m => m.id));
20+
21+
const relevantOrderMods = orderModifiers.filter(mod => allowedModifierIds.has(mod.id));
22+
23+
const selectedAmount = relevantOrderMods.reduce((sum, mod) => sum + (mod.amount ?? 1), 0);
24+
25+
if (selectedAmount < minAmount) {
26+
throw new Error(
27+
`Group ${groupId ?? '[no id]'}: minimum required modifiers is ${minAmount}, but got ${selectedAmount}`
28+
);
29+
}
30+
31+
if (selectedAmount > maxAmount) {
32+
throw new Error(
33+
`Group ${groupId ?? '[no id]'}: maximum allowed modifiers is ${maxAmount}, but got ${selectedAmount}`
34+
);
35+
}
36+
}
37+
}

libs/adminpanel/models/bind.d.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@ export declare const models: {
99
title: string;
1010
icon: string;
1111
list: {
12-
fields: FieldsModels;
12+
fields: import("sails-adminpanel/interfaces/adminpanelConfig").FieldsModels;
1313
};
14-
edit: CreateUpdateConfig;
15-
add: CreateUpdateConfig;
14+
edit: import("sails-adminpanel/interfaces/adminpanelConfig").CreateUpdateConfig;
15+
add: import("sails-adminpanel/interfaces/adminpanelConfig").CreateUpdateConfig;
1616
};
1717
groups: {
1818
model: string;
1919
title: string;
2020
icon: string;
2121
list: {
22-
fields: FieldsModels;
22+
fields: import("sails-adminpanel/interfaces/adminpanelConfig").FieldsModels;
2323
};
24-
edit: CreateUpdateConfig;
25-
add: CreateUpdateConfig;
24+
edit: import("sails-adminpanel/interfaces/adminpanelConfig").CreateUpdateConfig;
25+
add: import("sails-adminpanel/interfaces/adminpanelConfig").CreateUpdateConfig;
2626
};
2727
orders: {
2828
model: string;

0 commit comments

Comments
 (0)