Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import {
VendorUpdatePromotion,
} from "./validators";
import { vendorPromotionsRuleValueOptionsPathParamsGuard } from "../../../shared/infra/http/middlewares/vendor-promotions-rule-value-options-path-params-guard";
import { vendorPromotionsRuleAttributeOptionsPathParamsGuard } from "../../../shared/infra/http/middlewares/vendor-promotions-rule-attribute-options-path-params-guard";

export const vendorPromotionsMiddlewares: MiddlewareRoute[] = [
{
Expand Down Expand Up @@ -166,6 +167,7 @@ export const vendorPromotionsMiddlewares: MiddlewareRoute[] = [
method: ["GET"],
matcher: "/vendor/promotions/rule-attribute-options/:rule_type",
middlewares: [
vendorPromotionsRuleAttributeOptionsPathParamsGuard,
validateAndTransformQuery(
VendorGetPromotionRuleParams,
vendorRuleTransformQueryConfig.list
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { AuthenticatedMedusaRequest, MedusaResponse } from '@medusajs/framework'
import { validateRuleType } from '@medusajs/medusa/api/admin/promotions/utils/validate-rule-type'
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "@medusajs/framework";

import { getRuleAttributesMap } from '../../utils'
import "../../../../../shared/infra/http/middlewares/types"; // Import type augmentation
import { getRuleAttributesMap } from "../../utils";

/**
* @oas [get] /vendor/promotions/rule-attribute-options/{rule_type}
Expand Down Expand Up @@ -69,17 +72,16 @@ export const GET = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse
) => {
const { rule_type: ruleType } = req.params
const ruleType = req.normalized_rule_type || req.params.rule_type;

validateRuleType(ruleType)
const ruleAttributesMap = getRuleAttributesMap({
promotionType: req.query.promotion_type as string,
applicationMethodType: req.query.application_method_type as string,
});

const attributes =
getRuleAttributesMap({
promotionType: req.query.promotion_type as string,
applicationMethodType: req.query.application_method_type as string
})[ruleType] || []
const attributes = ruleAttributesMap[ruleType] || [];

res.json({
attributes
})
}
attributes,
});
};
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
import { AuthenticatedMedusaRequest, MedusaResponse } from '@medusajs/framework'
import {
ApplicationMethodTypeValues,
PromotionTypeValues,
RuleTypeValues
} from '@medusajs/framework/types'
AuthenticatedMedusaRequest,
MedusaResponse,
} from "@medusajs/framework";
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString
} from '@medusajs/framework/utils'
import { ruleQueryConfigurations } from '@medusajs/medusa/api/admin/promotions/utils/rule-query-configuration'
import { validateRuleAttribute } from '@medusajs/medusa/api/admin/promotions/utils/validate-rule-attribute'
import { validateRuleType } from '@medusajs/medusa/api/admin/promotions/utils/validate-rule-type'
remoteQueryObjectFromString,
} from "@medusajs/framework/utils";
import { ruleQueryConfigurations } from "@medusajs/medusa/api/admin/promotions/utils/rule-query-configuration";

import sellerCustomerGroup from '../../../../../../links/seller-customer-group'
import sellerProduct from '../../../../../../links/seller-product'
import { fetchSellerByAuthActorId } from '../../../../../../shared/infra/http/utils'
import sellerCustomerGroup from "../../../../../../links/seller-customer-group";
import sellerProduct from "../../../../../../links/seller-product";
import "../../../../../../shared/infra/http/middlewares/types";
import { fetchSellerByAuthActorId } from "../../../../../../shared/infra/http/utils";
import { getRuleAttributesMap } from "../../../utils";

/**
* @oas [get] /vendor/promotions/rule-attribute-options/{rule_type}
Expand Down Expand Up @@ -78,83 +76,112 @@ import { fetchSellerByAuthActorId } from '../../../../../../shared/infra/http/ut
* $ref: "#/components/schemas/VendorRuleAttributeOption"
*
*/

const vendorRuleQueryConfigurations = {
...ruleQueryConfigurations,
product: {
entryPoint: "product",
valueAttr: "id",
labelAttr: "title",
},
};

export const GET = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse
) => {
const query = req.scope.resolve(ContainerRegistrationKeys.QUERY)
const query = req.scope.resolve(ContainerRegistrationKeys.QUERY);

const ruleType = req.normalized_rule_type || req.params.rule_type;
const { rule_attribute_id: ruleAttributeId } = req.params;
const {
rule_type: ruleType,
rule_attribute_id: ruleAttributeId,
promotion_type: promotionType,
application_method_type: applicationMethodType
} = req.params
const queryConfig = ruleQueryConfigurations[ruleAttributeId]
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const filterableFields = req.filterableFields
application_method_type: applicationMethodType,
} = req.query;
const queryConfig = vendorRuleQueryConfigurations[ruleAttributeId];
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY);
const filterableFields = req.filterableFields;

if (!queryConfig) {
return res.status(400).json({
type: "invalid_data",
message: `Invalid rule attribute - ${ruleAttributeId}`,
});
}

if (filterableFields.value) {
filterableFields[queryConfig.valueAttr] = filterableFields.value
filterableFields[queryConfig.valueAttr] = filterableFields.value;

delete filterableFields.value
delete filterableFields.value;
}

validateRuleType(ruleType)
validateRuleAttribute({
promotionType: promotionType as PromotionTypeValues,
ruleType: ruleType as RuleTypeValues,
ruleAttributeId,
applicationMethodType: applicationMethodType as ApplicationMethodTypeValues
})
const ruleAttributesMap = getRuleAttributesMap({
promotionType: promotionType as string,
applicationMethodType: applicationMethodType as string,
});
const validAttributes = ruleAttributesMap[ruleType] || [];
const isValidAttribute = validAttributes.some(
(attr) => attr.id === ruleAttributeId
);

if (!isValidAttribute) {
return res.status(400).json({
type: "invalid_data",
message: `Invalid rule attribute - ${ruleAttributeId}. Valid attributes for ${ruleType}: ${validAttributes.map((a) => a.id).join(", ")}`,
});
}

delete filterableFields.promotion_type;
delete filterableFields.application_method_type;

const seller = await fetchSellerByAuthActorId(
req.auth_context.actor_id,
req.scope
)
);

if (queryConfig.entryPoint === 'product') {
if (queryConfig.entryPoint === "product") {
const { data: products } = await query.graph({
entity: sellerProduct.entryPoint,
fields: ['product_id'],
fields: ["product_id"],
filters: {
seller_id: seller.id
seller_id: seller.id,
},
withDeleted: true
})
withDeleted: true,
});

filterableFields['id'] = products.map((p) => p.product_id)
filterableFields["id"] = products.map((p) => p.product_id);
}

if (queryConfig.entryPoint === 'customer_group') {
if (queryConfig.entryPoint === "customer_group") {
const { data: groups } = await query.graph({
entity: sellerCustomerGroup.entryPoint,
fields: ['customer_group_id'],
fields: ["customer_group_id"],
filters: {
seller_id: seller.id
seller_id: seller.id,
},
withDeleted: true
})
withDeleted: true,
});

filterableFields['id'] = groups.map((p) => p.customer_group_id)
filterableFields["id"] = groups.map((p) => p.customer_group_id);
}

const { rows } = await remoteQuery(
remoteQueryObjectFromString({
entryPoint: queryConfig.entryPoint,
variables: {
filters: filterableFields,
...req.queryConfig.pagination
...req.queryConfig.pagination,
},
fields: [queryConfig.labelAttr, queryConfig.valueAttr]
fields: [queryConfig.labelAttr, queryConfig.valueAttr],
})
)
);

const values = rows.map((r) => ({
label: r[queryConfig.labelAttr],
value: r[queryConfig.valueAttr]
}))
value: r[queryConfig.valueAttr],
}));

res.json({
values
})
}
values,
});
};
Loading