Add shipping cost groups and reject spam contact-form SMS.

Wire cart/checkout shipping fees with category groups and static rates, reject gibberish contact submissions, and SMS only valid Iranian mobiles.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-10-02 21:52:41 +03:30
co-authored by Cursor
parent 1a49576752
commit 88ef4e82a1
19 changed files with 1501 additions and 25 deletions
+52
View File
@@ -161,6 +161,7 @@ model Business {
storeItemVariants StoreItemVariant[]
storeItems StoreItem[]
storeLoanMethods StoreLoanMethod[]
shippingCostGroups ShippingCostGroup[]
storeSpecials StoreSpecial[]
transactions Transaction[]
userProductTechnicalFieldValues UserProductTechnicalFieldValue[]
@@ -443,6 +444,7 @@ model Category {
assignments CategoryAssignment[]
technicalForm CategoryTechnicalForm?
variations CategoryVariation[]
shippingCostGroupCategories ShippingCostGroupCategory[]
website_category_group_items website_category_group_items[]
@@unique([businessId, entityType, slug], map: "categories_business_entity_slug_unique")
@@ -943,6 +945,7 @@ model City {
updatedAt DateTime @default(now()) @updatedAt @map("updated_at") @db.Timestamptz(6)
parent City? @relation("CityTree", fields: [parentId], references: [id], onDelete: Cascade, onUpdate: NoAction)
children City[] @relation("CityTree")
shippingCostCityRates ShippingCostGroupCityRate[]
userProductsAsCity UserProduct[] @relation("UserProductCity")
userProductsAsCountry UserProduct[] @relation("UserProductCountry")
userProductsAsDistrict UserProduct[] @relation("UserProductDistrict")
@@ -1254,6 +1257,55 @@ model StoreLoanMethod {
@@map("store_loan_methods")
}
model ShippingCostGroup {
id BigInt @id @default(autoincrement())
businessId BigInt @map("business_id")
nameFa String @map("name") @db.VarChar(255)
nameEn String @map("name_en") @db.VarChar(255)
description String?
methods String[] @default([])
defaultAmount Decimal @default(0) @map("default_amount") @db.Decimal(12, 2)
sortOrder Int @default(0) @map("sort_order")
isActive Boolean @default(true) @map("is_active")
isDefault Boolean @default(false) @map("is_default")
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6)
updatedAt DateTime @default(now()) @updatedAt @map("updated_at") @db.Timestamptz(6)
business Business @relation(fields: [businessId], references: [id], onDelete: Cascade, onUpdate: NoAction)
cityRates ShippingCostGroupCityRate[]
categories ShippingCostGroupCategory[]
@@index([businessId], map: "idx_shipping_cost_groups_business_id")
@@index([businessId, sortOrder], map: "idx_shipping_cost_groups_business_sort_order")
@@map("shipping_cost_groups")
}
model ShippingCostGroupCityRate {
id BigInt @id @default(autoincrement())
shippingCostGroupId BigInt @map("shipping_cost_group_id")
cityId BigInt @map("city_id")
amount Decimal @db.Decimal(12, 2)
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6)
updatedAt DateTime @default(now()) @updatedAt @map("updated_at") @db.Timestamptz(6)
shippingCostGroup ShippingCostGroup @relation(fields: [shippingCostGroupId], references: [id], onDelete: Cascade, onUpdate: NoAction)
city City @relation(fields: [cityId], references: [id], onDelete: Cascade, onUpdate: NoAction)
@@unique([shippingCostGroupId, cityId], map: "shipping_cost_group_city_rates_unique")
@@index([shippingCostGroupId], map: "idx_shipping_cost_group_city_rates_group_id")
@@index([cityId], map: "idx_shipping_cost_group_city_rates_city_id")
@@map("shipping_cost_group_city_rates")
}
model ShippingCostGroupCategory {
shippingCostGroupId BigInt @map("shipping_cost_group_id")
categoryId BigInt @map("category_id")
shippingCostGroup ShippingCostGroup @relation(fields: [shippingCostGroupId], references: [id], onDelete: Cascade, onUpdate: NoAction)
category Category @relation(fields: [categoryId], references: [id], onDelete: Cascade, onUpdate: NoAction)
@@id([shippingCostGroupId, categoryId])
@@index([categoryId], map: "idx_shipping_cost_group_categories_category_id")
@@map("shipping_cost_group_categories")
}
model website_brand_group_items {
id BigInt @id @default(autoincrement())
group_id BigInt