@contractspec/example.marketplace 1.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +141 -0
- package/dist/docs/index.d.ts +1 -0
- package/dist/docs/index.js +1 -0
- package/dist/docs/marketplace.docblock.d.ts +1 -0
- package/dist/docs/marketplace.docblock.js +115 -0
- package/dist/docs/marketplace.docblock.js.map +1 -0
- package/dist/entities/index.d.ts +309 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +46 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/order.d.ts +105 -0
- package/dist/entities/order.d.ts.map +1 -0
- package/dist/entities/order.js +173 -0
- package/dist/entities/order.js.map +1 -0
- package/dist/entities/payout.d.ts +92 -0
- package/dist/entities/payout.d.ts.map +1 -0
- package/dist/entities/payout.js +162 -0
- package/dist/entities/payout.js.map +1 -0
- package/dist/entities/product.d.ts +93 -0
- package/dist/entities/product.d.ts.map +1 -0
- package/dist/entities/product.js +161 -0
- package/dist/entities/product.js.map +1 -0
- package/dist/entities/review.d.ts +83 -0
- package/dist/entities/review.d.ts.map +1 -0
- package/dist/entities/review.js +152 -0
- package/dist/entities/review.js.map +1 -0
- package/dist/entities/store.d.ts +60 -0
- package/dist/entities/store.d.ts.map +1 -0
- package/dist/entities/store.js +110 -0
- package/dist/entities/store.js.map +1 -0
- package/dist/example.d.ts +40 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/example.js +51 -0
- package/dist/example.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +27 -0
- package/dist/marketplace.feature.d.ts +12 -0
- package/dist/marketplace.feature.d.ts.map +1 -0
- package/dist/marketplace.feature.js +310 -0
- package/dist/marketplace.feature.js.map +1 -0
- package/dist/order/index.d.ts +5 -0
- package/dist/order/index.js +6 -0
- package/dist/order/order.enum.d.ts +10 -0
- package/dist/order/order.enum.d.ts.map +1 -0
- package/dist/order/order.enum.js +22 -0
- package/dist/order/order.enum.js.map +1 -0
- package/dist/order/order.event.d.ts +145 -0
- package/dist/order/order.event.d.ts.map +1 -0
- package/dist/order/order.event.js +216 -0
- package/dist/order/order.event.js.map +1 -0
- package/dist/order/order.operations.d.ts +368 -0
- package/dist/order/order.operations.d.ts.map +1 -0
- package/dist/order/order.operations.js +119 -0
- package/dist/order/order.operations.js.map +1 -0
- package/dist/order/order.presentation.d.ts +9 -0
- package/dist/order/order.presentation.d.ts.map +1 -0
- package/dist/order/order.presentation.js +86 -0
- package/dist/order/order.presentation.js.map +1 -0
- package/dist/order/order.schema.d.ts +165 -0
- package/dist/order/order.schema.d.ts.map +1 -0
- package/dist/order/order.schema.js +155 -0
- package/dist/order/order.schema.js.map +1 -0
- package/dist/payout/index.d.ts +5 -0
- package/dist/payout/index.js +6 -0
- package/dist/payout/payout.enum.d.ts +10 -0
- package/dist/payout/payout.enum.d.ts.map +1 -0
- package/dist/payout/payout.enum.js +17 -0
- package/dist/payout/payout.enum.js.map +1 -0
- package/dist/payout/payout.event.d.ts +63 -0
- package/dist/payout/payout.event.d.ts.map +1 -0
- package/dist/payout/payout.event.js +92 -0
- package/dist/payout/payout.event.js.map +1 -0
- package/dist/payout/payout.operations.d.ts +97 -0
- package/dist/payout/payout.operations.d.ts.map +1 -0
- package/dist/payout/payout.operations.js +53 -0
- package/dist/payout/payout.operations.js.map +1 -0
- package/dist/payout/payout.presentation.d.ts +8 -0
- package/dist/payout/payout.presentation.d.ts.map +1 -0
- package/dist/payout/payout.presentation.js +60 -0
- package/dist/payout/payout.presentation.js.map +1 -0
- package/dist/payout/payout.schema.d.ts +157 -0
- package/dist/payout/payout.schema.d.ts.map +1 -0
- package/dist/payout/payout.schema.js +116 -0
- package/dist/payout/payout.schema.js.map +1 -0
- package/dist/product/index.d.ts +5 -0
- package/dist/product/index.js +6 -0
- package/dist/product/product.enum.d.ts +10 -0
- package/dist/product/product.enum.d.ts.map +1 -0
- package/dist/product/product.enum.js +18 -0
- package/dist/product/product.enum.js.map +1 -0
- package/dist/product/product.event.d.ts +73 -0
- package/dist/product/product.event.d.ts.map +1 -0
- package/dist/product/product.event.js +120 -0
- package/dist/product/product.event.js.map +1 -0
- package/dist/product/product.operations.d.ts +273 -0
- package/dist/product/product.operations.d.ts.map +1 -0
- package/dist/product/product.operations.js +108 -0
- package/dist/product/product.operations.js.map +1 -0
- package/dist/product/product.presentation.d.ts +9 -0
- package/dist/product/product.presentation.d.ts.map +1 -0
- package/dist/product/product.presentation.js +86 -0
- package/dist/product/product.presentation.js.map +1 -0
- package/dist/product/product.schema.d.ts +218 -0
- package/dist/product/product.schema.d.ts.map +1 -0
- package/dist/product/product.schema.js +176 -0
- package/dist/product/product.schema.js.map +1 -0
- package/dist/review/index.d.ts +5 -0
- package/dist/review/index.js +6 -0
- package/dist/review/review.enum.d.ts +10 -0
- package/dist/review/review.enum.d.ts.map +1 -0
- package/dist/review/review.enum.js +16 -0
- package/dist/review/review.enum.js.map +1 -0
- package/dist/review/review.event.d.ts +55 -0
- package/dist/review/review.event.d.ts.map +1 -0
- package/dist/review/review.event.js +84 -0
- package/dist/review/review.event.js.map +1 -0
- package/dist/review/review.operations.d.ts +237 -0
- package/dist/review/review.operations.d.ts.map +1 -0
- package/dist/review/review.operations.js +106 -0
- package/dist/review/review.operations.js.map +1 -0
- package/dist/review/review.presentation.d.ts +8 -0
- package/dist/review/review.presentation.d.ts.map +1 -0
- package/dist/review/review.presentation.js +60 -0
- package/dist/review/review.presentation.js.map +1 -0
- package/dist/review/review.schema.d.ts +190 -0
- package/dist/review/review.schema.d.ts.map +1 -0
- package/dist/review/review.schema.js +156 -0
- package/dist/review/review.schema.js.map +1 -0
- package/dist/store/index.d.ts +5 -0
- package/dist/store/index.js +6 -0
- package/dist/store/store.enum.d.ts +10 -0
- package/dist/store/store.enum.d.ts.map +1 -0
- package/dist/store/store.enum.js +16 -0
- package/dist/store/store.enum.js.map +1 -0
- package/dist/store/store.event.d.ts +51 -0
- package/dist/store/store.event.d.ts.map +1 -0
- package/dist/store/store.event.js +80 -0
- package/dist/store/store.event.js.map +1 -0
- package/dist/store/store.operations.d.ts +131 -0
- package/dist/store/store.operations.d.ts.map +1 -0
- package/dist/store/store.operations.js +61 -0
- package/dist/store/store.operations.js.map +1 -0
- package/dist/store/store.presentation.d.ts +8 -0
- package/dist/store/store.presentation.d.ts.map +1 -0
- package/dist/store/store.presentation.js +60 -0
- package/dist/store/store.presentation.js.map +1 -0
- package/dist/store/store.schema.d.ts +84 -0
- package/dist/store/store.schema.d.ts.map +1 -0
- package/dist/store/store.schema.js +93 -0
- package/dist/store/store.schema.js.map +1 -0
- package/package.json +141 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import * as _contractspec_lib_schema658 from "@contractspec/lib.schema";
|
|
2
|
+
|
|
3
|
+
//#region src/entities/product.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Product status enum.
|
|
6
|
+
*/
|
|
7
|
+
declare const ProductStatusEnum: _contractspec_lib_schema658.EntityEnumDef;
|
|
8
|
+
/**
|
|
9
|
+
* Product type enum.
|
|
10
|
+
*/
|
|
11
|
+
declare const ProductTypeEnum: _contractspec_lib_schema658.EntityEnumDef;
|
|
12
|
+
/**
|
|
13
|
+
* Product entity - an item for sale on the marketplace.
|
|
14
|
+
*/
|
|
15
|
+
declare const ProductEntity: _contractspec_lib_schema658.EntitySpec<{
|
|
16
|
+
id: _contractspec_lib_schema658.EntityScalarField;
|
|
17
|
+
storeId: _contractspec_lib_schema658.EntityScalarField;
|
|
18
|
+
name: _contractspec_lib_schema658.EntityScalarField;
|
|
19
|
+
slug: _contractspec_lib_schema658.EntityScalarField;
|
|
20
|
+
description: _contractspec_lib_schema658.EntityScalarField;
|
|
21
|
+
shortDescription: _contractspec_lib_schema658.EntityScalarField;
|
|
22
|
+
status: _contractspec_lib_schema658.EntityEnumField;
|
|
23
|
+
type: _contractspec_lib_schema658.EntityEnumField;
|
|
24
|
+
price: _contractspec_lib_schema658.EntityScalarField;
|
|
25
|
+
compareAtPrice: _contractspec_lib_schema658.EntityScalarField;
|
|
26
|
+
currency: _contractspec_lib_schema658.EntityScalarField;
|
|
27
|
+
sku: _contractspec_lib_schema658.EntityScalarField;
|
|
28
|
+
barcode: _contractspec_lib_schema658.EntityScalarField;
|
|
29
|
+
quantity: _contractspec_lib_schema658.EntityScalarField;
|
|
30
|
+
trackInventory: _contractspec_lib_schema658.EntityScalarField;
|
|
31
|
+
allowBackorder: _contractspec_lib_schema658.EntityScalarField;
|
|
32
|
+
lowStockThreshold: _contractspec_lib_schema658.EntityScalarField;
|
|
33
|
+
weight: _contractspec_lib_schema658.EntityScalarField;
|
|
34
|
+
weightUnit: _contractspec_lib_schema658.EntityScalarField;
|
|
35
|
+
categoryId: _contractspec_lib_schema658.EntityScalarField;
|
|
36
|
+
tags: _contractspec_lib_schema658.EntityScalarField;
|
|
37
|
+
primaryImageId: _contractspec_lib_schema658.EntityScalarField;
|
|
38
|
+
seoTitle: _contractspec_lib_schema658.EntityScalarField;
|
|
39
|
+
seoDescription: _contractspec_lib_schema658.EntityScalarField;
|
|
40
|
+
attributes: _contractspec_lib_schema658.EntityScalarField;
|
|
41
|
+
reviewCount: _contractspec_lib_schema658.EntityScalarField;
|
|
42
|
+
averageRating: _contractspec_lib_schema658.EntityScalarField;
|
|
43
|
+
totalSold: _contractspec_lib_schema658.EntityScalarField;
|
|
44
|
+
createdAt: _contractspec_lib_schema658.EntityScalarField;
|
|
45
|
+
updatedAt: _contractspec_lib_schema658.EntityScalarField;
|
|
46
|
+
publishedAt: _contractspec_lib_schema658.EntityScalarField;
|
|
47
|
+
store: _contractspec_lib_schema658.EntityRelationField;
|
|
48
|
+
variants: _contractspec_lib_schema658.EntityRelationField;
|
|
49
|
+
orderItems: _contractspec_lib_schema658.EntityRelationField;
|
|
50
|
+
reviews: _contractspec_lib_schema658.EntityRelationField;
|
|
51
|
+
}>;
|
|
52
|
+
/**
|
|
53
|
+
* Product variant entity - variations of a product (size, color, etc.).
|
|
54
|
+
*/
|
|
55
|
+
declare const ProductVariantEntity: _contractspec_lib_schema658.EntitySpec<{
|
|
56
|
+
id: _contractspec_lib_schema658.EntityScalarField;
|
|
57
|
+
productId: _contractspec_lib_schema658.EntityScalarField;
|
|
58
|
+
name: _contractspec_lib_schema658.EntityScalarField;
|
|
59
|
+
options: _contractspec_lib_schema658.EntityScalarField;
|
|
60
|
+
price: _contractspec_lib_schema658.EntityScalarField;
|
|
61
|
+
compareAtPrice: _contractspec_lib_schema658.EntityScalarField;
|
|
62
|
+
sku: _contractspec_lib_schema658.EntityScalarField;
|
|
63
|
+
barcode: _contractspec_lib_schema658.EntityScalarField;
|
|
64
|
+
quantity: _contractspec_lib_schema658.EntityScalarField;
|
|
65
|
+
imageId: _contractspec_lib_schema658.EntityScalarField;
|
|
66
|
+
isActive: _contractspec_lib_schema658.EntityScalarField;
|
|
67
|
+
position: _contractspec_lib_schema658.EntityScalarField;
|
|
68
|
+
createdAt: _contractspec_lib_schema658.EntityScalarField;
|
|
69
|
+
updatedAt: _contractspec_lib_schema658.EntityScalarField;
|
|
70
|
+
product: _contractspec_lib_schema658.EntityRelationField;
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* Category entity - product categorization.
|
|
74
|
+
*/
|
|
75
|
+
declare const CategoryEntity: _contractspec_lib_schema658.EntitySpec<{
|
|
76
|
+
id: _contractspec_lib_schema658.EntityScalarField;
|
|
77
|
+
name: _contractspec_lib_schema658.EntityScalarField;
|
|
78
|
+
slug: _contractspec_lib_schema658.EntityScalarField;
|
|
79
|
+
description: _contractspec_lib_schema658.EntityScalarField;
|
|
80
|
+
parentId: _contractspec_lib_schema658.EntityScalarField;
|
|
81
|
+
path: _contractspec_lib_schema658.EntityScalarField;
|
|
82
|
+
level: _contractspec_lib_schema658.EntityScalarField;
|
|
83
|
+
position: _contractspec_lib_schema658.EntityScalarField;
|
|
84
|
+
imageId: _contractspec_lib_schema658.EntityScalarField;
|
|
85
|
+
isActive: _contractspec_lib_schema658.EntityScalarField;
|
|
86
|
+
createdAt: _contractspec_lib_schema658.EntityScalarField;
|
|
87
|
+
updatedAt: _contractspec_lib_schema658.EntityScalarField;
|
|
88
|
+
parent: _contractspec_lib_schema658.EntityRelationField;
|
|
89
|
+
children: _contractspec_lib_schema658.EntityRelationField;
|
|
90
|
+
}>;
|
|
91
|
+
//#endregion
|
|
92
|
+
export { CategoryEntity, ProductEntity, ProductStatusEnum, ProductTypeEnum, ProductVariantEntity };
|
|
93
|
+
//# sourceMappingURL=product.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product.d.ts","names":[],"sources":["../../src/entities/product.ts"],"sourcesContent":[],"mappings":";;;;;;AAUa,cAAA,iBAYX,EAAA,2BAAA,CAZ4B,aAY5B;AAKF;AAUA;;cAVa,iBAKX,2BAAA,CAL0B;;;;cAUf,2CAAa;MAsFxB,2BAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0DAtFwB;EAAA,WAAA,+CAAA;EA2Fb,KAAA,iDAiDX;EAAA,QAAA,iDAAA;;;;;;;cAjDW,kDAAoB;MAiD/B,2BAAA,CAAA;;;;;;;wDAjD+B;EAAA,QAAA,+CAAA;EAsDpB,OAAA,+CAsCX;EAAA,QAAA,+CAAA;;;;;;;;;cAtCW,4CAAc;MAsCzB,2BAAA,CAAA;;;;yDAtCyB;EAAA,IAAA,+CAAA"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { defineEntity, defineEntityEnum, field, index } from "@contractspec/lib.schema";
|
|
2
|
+
|
|
3
|
+
//#region src/entities/product.ts
|
|
4
|
+
/**
|
|
5
|
+
* Product status enum.
|
|
6
|
+
*/
|
|
7
|
+
const ProductStatusEnum = defineEntityEnum({
|
|
8
|
+
name: "ProductStatus",
|
|
9
|
+
values: [
|
|
10
|
+
"DRAFT",
|
|
11
|
+
"PENDING_REVIEW",
|
|
12
|
+
"ACTIVE",
|
|
13
|
+
"OUT_OF_STOCK",
|
|
14
|
+
"DISCONTINUED",
|
|
15
|
+
"REJECTED"
|
|
16
|
+
],
|
|
17
|
+
schema: "marketplace",
|
|
18
|
+
description: "Status of a product listing."
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Product type enum.
|
|
22
|
+
*/
|
|
23
|
+
const ProductTypeEnum = defineEntityEnum({
|
|
24
|
+
name: "ProductType",
|
|
25
|
+
values: [
|
|
26
|
+
"PHYSICAL",
|
|
27
|
+
"DIGITAL",
|
|
28
|
+
"SERVICE",
|
|
29
|
+
"SUBSCRIPTION"
|
|
30
|
+
],
|
|
31
|
+
schema: "marketplace",
|
|
32
|
+
description: "Type of product."
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Product entity - an item for sale on the marketplace.
|
|
36
|
+
*/
|
|
37
|
+
const ProductEntity = defineEntity({
|
|
38
|
+
name: "Product",
|
|
39
|
+
description: "A product listing on the marketplace.",
|
|
40
|
+
schema: "marketplace",
|
|
41
|
+
map: "product",
|
|
42
|
+
fields: {
|
|
43
|
+
id: field.id({ description: "Unique product ID" }),
|
|
44
|
+
storeId: field.foreignKey(),
|
|
45
|
+
name: field.string({ description: "Product name" }),
|
|
46
|
+
slug: field.string({ description: "URL-friendly identifier" }),
|
|
47
|
+
description: field.string({ isOptional: true }),
|
|
48
|
+
shortDescription: field.string({ isOptional: true }),
|
|
49
|
+
status: field.enum("ProductStatus", { default: "DRAFT" }),
|
|
50
|
+
type: field.enum("ProductType", { default: "PHYSICAL" }),
|
|
51
|
+
price: field.decimal({ description: "Base price" }),
|
|
52
|
+
compareAtPrice: field.decimal({
|
|
53
|
+
isOptional: true,
|
|
54
|
+
description: "Original price for showing discounts"
|
|
55
|
+
}),
|
|
56
|
+
currency: field.string({ default: "\"USD\"" }),
|
|
57
|
+
sku: field.string({ isOptional: true }),
|
|
58
|
+
barcode: field.string({ isOptional: true }),
|
|
59
|
+
quantity: field.int({ default: 0 }),
|
|
60
|
+
trackInventory: field.boolean({ default: true }),
|
|
61
|
+
allowBackorder: field.boolean({ default: false }),
|
|
62
|
+
lowStockThreshold: field.int({ default: 5 }),
|
|
63
|
+
weight: field.decimal({ isOptional: true }),
|
|
64
|
+
weightUnit: field.string({ default: "\"kg\"" }),
|
|
65
|
+
categoryId: field.string({ isOptional: true }),
|
|
66
|
+
tags: field.string({ isArray: true }),
|
|
67
|
+
primaryImageId: field.string({ isOptional: true }),
|
|
68
|
+
seoTitle: field.string({ isOptional: true }),
|
|
69
|
+
seoDescription: field.string({ isOptional: true }),
|
|
70
|
+
attributes: field.json({
|
|
71
|
+
isOptional: true,
|
|
72
|
+
description: "Custom product attributes"
|
|
73
|
+
}),
|
|
74
|
+
reviewCount: field.int({ default: 0 }),
|
|
75
|
+
averageRating: field.decimal({ default: 0 }),
|
|
76
|
+
totalSold: field.int({ default: 0 }),
|
|
77
|
+
createdAt: field.createdAt(),
|
|
78
|
+
updatedAt: field.updatedAt(),
|
|
79
|
+
publishedAt: field.dateTime({ isOptional: true }),
|
|
80
|
+
store: field.belongsTo("Store", ["storeId"], ["id"]),
|
|
81
|
+
variants: field.hasMany("ProductVariant"),
|
|
82
|
+
orderItems: field.hasMany("OrderItem"),
|
|
83
|
+
reviews: field.hasMany("Review")
|
|
84
|
+
},
|
|
85
|
+
indexes: [
|
|
86
|
+
index.unique(["storeId", "slug"]),
|
|
87
|
+
index.on(["storeId", "status"]),
|
|
88
|
+
index.on(["status", "publishedAt"]),
|
|
89
|
+
index.on(["categoryId", "status"]),
|
|
90
|
+
index.on(["averageRating"]),
|
|
91
|
+
index.on(["totalSold"]),
|
|
92
|
+
index.on(["price"])
|
|
93
|
+
],
|
|
94
|
+
enums: [ProductStatusEnum, ProductTypeEnum]
|
|
95
|
+
});
|
|
96
|
+
/**
|
|
97
|
+
* Product variant entity - variations of a product (size, color, etc.).
|
|
98
|
+
*/
|
|
99
|
+
const ProductVariantEntity = defineEntity({
|
|
100
|
+
name: "ProductVariant",
|
|
101
|
+
description: "A variant of a product with specific options.",
|
|
102
|
+
schema: "marketplace",
|
|
103
|
+
map: "product_variant",
|
|
104
|
+
fields: {
|
|
105
|
+
id: field.id(),
|
|
106
|
+
productId: field.foreignKey(),
|
|
107
|
+
name: field.string({ description: "Variant name (e.g., \"Large / Blue\")" }),
|
|
108
|
+
options: field.json({ description: "Variant options (e.g., {size: \"L\", color: \"Blue\"})" }),
|
|
109
|
+
price: field.decimal({ description: "Variant-specific price" }),
|
|
110
|
+
compareAtPrice: field.decimal({ isOptional: true }),
|
|
111
|
+
sku: field.string({ isOptional: true }),
|
|
112
|
+
barcode: field.string({ isOptional: true }),
|
|
113
|
+
quantity: field.int({ default: 0 }),
|
|
114
|
+
imageId: field.string({ isOptional: true }),
|
|
115
|
+
isActive: field.boolean({ default: true }),
|
|
116
|
+
position: field.int({ default: 0 }),
|
|
117
|
+
createdAt: field.createdAt(),
|
|
118
|
+
updatedAt: field.updatedAt(),
|
|
119
|
+
product: field.belongsTo("Product", ["productId"], ["id"], { onDelete: "Cascade" })
|
|
120
|
+
},
|
|
121
|
+
indexes: [
|
|
122
|
+
index.on(["productId", "sku"]),
|
|
123
|
+
index.on(["productId", "position"]),
|
|
124
|
+
index.on(["barcode"])
|
|
125
|
+
]
|
|
126
|
+
});
|
|
127
|
+
/**
|
|
128
|
+
* Category entity - product categorization.
|
|
129
|
+
*/
|
|
130
|
+
const CategoryEntity = defineEntity({
|
|
131
|
+
name: "Category",
|
|
132
|
+
description: "Product category for organization.",
|
|
133
|
+
schema: "marketplace",
|
|
134
|
+
map: "category",
|
|
135
|
+
fields: {
|
|
136
|
+
id: field.id(),
|
|
137
|
+
name: field.string(),
|
|
138
|
+
slug: field.string(),
|
|
139
|
+
description: field.string({ isOptional: true }),
|
|
140
|
+
parentId: field.string({ isOptional: true }),
|
|
141
|
+
path: field.string({ description: "Full path for hierarchical queries" }),
|
|
142
|
+
level: field.int({ default: 0 }),
|
|
143
|
+
position: field.int({ default: 0 }),
|
|
144
|
+
imageId: field.string({ isOptional: true }),
|
|
145
|
+
isActive: field.boolean({ default: true }),
|
|
146
|
+
createdAt: field.createdAt(),
|
|
147
|
+
updatedAt: field.updatedAt(),
|
|
148
|
+
parent: field.belongsTo("Category", ["parentId"], ["id"]),
|
|
149
|
+
children: field.hasMany("Category")
|
|
150
|
+
},
|
|
151
|
+
indexes: [
|
|
152
|
+
index.unique(["slug"]),
|
|
153
|
+
index.on(["parentId", "position"]),
|
|
154
|
+
index.on(["path"]),
|
|
155
|
+
index.on(["isActive"])
|
|
156
|
+
]
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
//#endregion
|
|
160
|
+
export { CategoryEntity, ProductEntity, ProductStatusEnum, ProductTypeEnum, ProductVariantEntity };
|
|
161
|
+
//# sourceMappingURL=product.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product.js","names":[],"sources":["../../src/entities/product.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\n\n/**\n * Product status enum.\n */\nexport const ProductStatusEnum = defineEntityEnum({\n name: 'ProductStatus',\n values: [\n 'DRAFT',\n 'PENDING_REVIEW',\n 'ACTIVE',\n 'OUT_OF_STOCK',\n 'DISCONTINUED',\n 'REJECTED',\n ] as const,\n schema: 'marketplace',\n description: 'Status of a product listing.',\n});\n\n/**\n * Product type enum.\n */\nexport const ProductTypeEnum = defineEntityEnum({\n name: 'ProductType',\n values: ['PHYSICAL', 'DIGITAL', 'SERVICE', 'SUBSCRIPTION'] as const,\n schema: 'marketplace',\n description: 'Type of product.',\n});\n\n/**\n * Product entity - an item for sale on the marketplace.\n */\nexport const ProductEntity = defineEntity({\n name: 'Product',\n description: 'A product listing on the marketplace.',\n schema: 'marketplace',\n map: 'product',\n fields: {\n id: field.id({ description: 'Unique product ID' }),\n\n // Store\n storeId: field.foreignKey(),\n\n // Identity\n name: field.string({ description: 'Product name' }),\n slug: field.string({ description: 'URL-friendly identifier' }),\n description: field.string({ isOptional: true }),\n shortDescription: field.string({ isOptional: true }),\n\n // Status\n status: field.enum('ProductStatus', { default: 'DRAFT' }),\n type: field.enum('ProductType', { default: 'PHYSICAL' }),\n\n // Pricing\n price: field.decimal({ description: 'Base price' }),\n compareAtPrice: field.decimal({\n isOptional: true,\n description: 'Original price for showing discounts',\n }),\n currency: field.string({ default: '\"USD\"' }),\n\n // Inventory\n sku: field.string({ isOptional: true }),\n barcode: field.string({ isOptional: true }),\n quantity: field.int({ default: 0 }),\n trackInventory: field.boolean({ default: true }),\n allowBackorder: field.boolean({ default: false }),\n lowStockThreshold: field.int({ default: 5 }),\n\n // Physical properties\n weight: field.decimal({ isOptional: true }),\n weightUnit: field.string({ default: '\"kg\"' }),\n\n // Categories\n categoryId: field.string({ isOptional: true }),\n tags: field.string({ isArray: true }),\n\n // Media (using file attachments)\n primaryImageId: field.string({ isOptional: true }),\n\n // SEO\n seoTitle: field.string({ isOptional: true }),\n seoDescription: field.string({ isOptional: true }),\n\n // Attributes\n attributes: field.json({\n isOptional: true,\n description: 'Custom product attributes',\n }),\n\n // Reviews\n reviewCount: field.int({ default: 0 }),\n averageRating: field.decimal({ default: 0 }),\n\n // Sales\n totalSold: field.int({ default: 0 }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n publishedAt: field.dateTime({ isOptional: true }),\n\n // Relations\n store: field.belongsTo('Store', ['storeId'], ['id']),\n variants: field.hasMany('ProductVariant'),\n orderItems: field.hasMany('OrderItem'),\n reviews: field.hasMany('Review'),\n },\n indexes: [\n index.unique(['storeId', 'slug']),\n index.on(['storeId', 'status']),\n index.on(['status', 'publishedAt']),\n index.on(['categoryId', 'status']),\n index.on(['averageRating']),\n index.on(['totalSold']),\n index.on(['price']),\n ],\n enums: [ProductStatusEnum, ProductTypeEnum],\n});\n\n/**\n * Product variant entity - variations of a product (size, color, etc.).\n */\nexport const ProductVariantEntity = defineEntity({\n name: 'ProductVariant',\n description: 'A variant of a product with specific options.',\n schema: 'marketplace',\n map: 'product_variant',\n fields: {\n id: field.id(),\n productId: field.foreignKey(),\n\n // Identity\n name: field.string({ description: 'Variant name (e.g., \"Large / Blue\")' }),\n\n // Options\n options: field.json({\n description: 'Variant options (e.g., {size: \"L\", color: \"Blue\"})',\n }),\n\n // Pricing\n price: field.decimal({ description: 'Variant-specific price' }),\n compareAtPrice: field.decimal({ isOptional: true }),\n\n // Inventory\n sku: field.string({ isOptional: true }),\n barcode: field.string({ isOptional: true }),\n quantity: field.int({ default: 0 }),\n\n // Media\n imageId: field.string({ isOptional: true }),\n\n // Status\n isActive: field.boolean({ default: true }),\n\n // Position\n position: field.int({ default: 0 }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n product: field.belongsTo('Product', ['productId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.on(['productId', 'sku']),\n index.on(['productId', 'position']),\n index.on(['barcode']),\n ],\n});\n\n/**\n * Category entity - product categorization.\n */\nexport const CategoryEntity = defineEntity({\n name: 'Category',\n description: 'Product category for organization.',\n schema: 'marketplace',\n map: 'category',\n fields: {\n id: field.id(),\n\n name: field.string(),\n slug: field.string(),\n description: field.string({ isOptional: true }),\n\n // Hierarchy\n parentId: field.string({ isOptional: true }),\n path: field.string({ description: 'Full path for hierarchical queries' }),\n level: field.int({ default: 0 }),\n\n // Display\n position: field.int({ default: 0 }),\n imageId: field.string({ isOptional: true }),\n\n // Status\n isActive: field.boolean({ default: true }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n parent: field.belongsTo('Category', ['parentId'], ['id']),\n children: field.hasMany('Category'),\n },\n indexes: [\n index.unique(['slug']),\n index.on(['parentId', 'position']),\n index.on(['path']),\n index.on(['isActive']),\n ],\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import * as _contractspec_lib_schema727 from "@contractspec/lib.schema";
|
|
2
|
+
|
|
3
|
+
//#region src/entities/review.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Review status enum.
|
|
6
|
+
*/
|
|
7
|
+
declare const ReviewStatusEnum: _contractspec_lib_schema727.EntityEnumDef;
|
|
8
|
+
/**
|
|
9
|
+
* Review type enum.
|
|
10
|
+
*/
|
|
11
|
+
declare const ReviewTypeEnum: _contractspec_lib_schema727.EntityEnumDef;
|
|
12
|
+
/**
|
|
13
|
+
* Review entity - customer reviews and ratings.
|
|
14
|
+
*/
|
|
15
|
+
declare const ReviewEntity: _contractspec_lib_schema727.EntitySpec<{
|
|
16
|
+
id: _contractspec_lib_schema727.EntityScalarField;
|
|
17
|
+
type: _contractspec_lib_schema727.EntityEnumField;
|
|
18
|
+
productId: _contractspec_lib_schema727.EntityScalarField;
|
|
19
|
+
storeId: _contractspec_lib_schema727.EntityScalarField;
|
|
20
|
+
orderId: _contractspec_lib_schema727.EntityScalarField;
|
|
21
|
+
orderItemId: _contractspec_lib_schema727.EntityScalarField;
|
|
22
|
+
authorId: _contractspec_lib_schema727.EntityScalarField;
|
|
23
|
+
rating: _contractspec_lib_schema727.EntityScalarField;
|
|
24
|
+
title: _contractspec_lib_schema727.EntityScalarField;
|
|
25
|
+
content: _contractspec_lib_schema727.EntityScalarField;
|
|
26
|
+
isVerifiedPurchase: _contractspec_lib_schema727.EntityScalarField;
|
|
27
|
+
status: _contractspec_lib_schema727.EntityEnumField;
|
|
28
|
+
hasMedia: _contractspec_lib_schema727.EntityScalarField;
|
|
29
|
+
helpfulCount: _contractspec_lib_schema727.EntityScalarField;
|
|
30
|
+
notHelpfulCount: _contractspec_lib_schema727.EntityScalarField;
|
|
31
|
+
moderatedBy: _contractspec_lib_schema727.EntityScalarField;
|
|
32
|
+
moderatedAt: _contractspec_lib_schema727.EntityScalarField;
|
|
33
|
+
moderationNote: _contractspec_lib_schema727.EntityScalarField;
|
|
34
|
+
hasResponse: _contractspec_lib_schema727.EntityScalarField;
|
|
35
|
+
createdAt: _contractspec_lib_schema727.EntityScalarField;
|
|
36
|
+
updatedAt: _contractspec_lib_schema727.EntityScalarField;
|
|
37
|
+
product: _contractspec_lib_schema727.EntityRelationField;
|
|
38
|
+
store: _contractspec_lib_schema727.EntityRelationField;
|
|
39
|
+
responses: _contractspec_lib_schema727.EntityRelationField;
|
|
40
|
+
votes: _contractspec_lib_schema727.EntityRelationField;
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Review response entity - seller responses to reviews.
|
|
44
|
+
*/
|
|
45
|
+
declare const ReviewResponseEntity: _contractspec_lib_schema727.EntitySpec<{
|
|
46
|
+
id: _contractspec_lib_schema727.EntityScalarField;
|
|
47
|
+
reviewId: _contractspec_lib_schema727.EntityScalarField;
|
|
48
|
+
authorId: _contractspec_lib_schema727.EntityScalarField;
|
|
49
|
+
content: _contractspec_lib_schema727.EntityScalarField;
|
|
50
|
+
createdAt: _contractspec_lib_schema727.EntityScalarField;
|
|
51
|
+
updatedAt: _contractspec_lib_schema727.EntityScalarField;
|
|
52
|
+
review: _contractspec_lib_schema727.EntityRelationField;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Review vote entity - helpfulness votes.
|
|
56
|
+
*/
|
|
57
|
+
declare const ReviewVoteEntity: _contractspec_lib_schema727.EntitySpec<{
|
|
58
|
+
id: _contractspec_lib_schema727.EntityScalarField;
|
|
59
|
+
reviewId: _contractspec_lib_schema727.EntityScalarField;
|
|
60
|
+
userId: _contractspec_lib_schema727.EntityScalarField;
|
|
61
|
+
isHelpful: _contractspec_lib_schema727.EntityScalarField;
|
|
62
|
+
createdAt: _contractspec_lib_schema727.EntityScalarField;
|
|
63
|
+
review: _contractspec_lib_schema727.EntityRelationField;
|
|
64
|
+
}>;
|
|
65
|
+
/**
|
|
66
|
+
* Review report entity - flagged reviews.
|
|
67
|
+
*/
|
|
68
|
+
declare const ReviewReportEntity: _contractspec_lib_schema727.EntitySpec<{
|
|
69
|
+
id: _contractspec_lib_schema727.EntityScalarField;
|
|
70
|
+
reviewId: _contractspec_lib_schema727.EntityScalarField;
|
|
71
|
+
reporterId: _contractspec_lib_schema727.EntityScalarField;
|
|
72
|
+
reason: _contractspec_lib_schema727.EntityScalarField;
|
|
73
|
+
details: _contractspec_lib_schema727.EntityScalarField;
|
|
74
|
+
status: _contractspec_lib_schema727.EntityScalarField;
|
|
75
|
+
resolvedBy: _contractspec_lib_schema727.EntityScalarField;
|
|
76
|
+
resolvedAt: _contractspec_lib_schema727.EntityScalarField;
|
|
77
|
+
resolution: _contractspec_lib_schema727.EntityScalarField;
|
|
78
|
+
createdAt: _contractspec_lib_schema727.EntityScalarField;
|
|
79
|
+
review: _contractspec_lib_schema727.EntityRelationField;
|
|
80
|
+
}>;
|
|
81
|
+
//#endregion
|
|
82
|
+
export { ReviewEntity, ReviewReportEntity, ReviewResponseEntity, ReviewStatusEnum, ReviewTypeEnum, ReviewVoteEntity };
|
|
83
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","names":[],"sources":["../../src/entities/review.ts"],"sourcesContent":[],"mappings":";;;;;;AAUa,cAAA,gBAKX,EAAA,2BAAA,CAL2B,aAK3B;AAKF;AAUA;;cAVa,gBAKX,2BAAA,CALyB;;;;cAUd,0CAAY;MAgEvB,2BAAA,CAAA;;;;;;;;;;;;;;;;;;;0DAhEuB;EAAA,SAAA,+CAAA;EAqEZ,OAAA,iDAyBX;EAAA,KAAA,iDAAA;;;;;;;cAzBW,oBAAoB,8BAAA,UAAA,CAAA;EAAA,EAAA,EAyB/B,2BAAA,CAAA,iBAzB+B;EA8BpB,QAAA,+CAoBX;EAAA,QAAA,+CAAA;;;;;;;;AAKF;AA6BE,cAtDW,gBAsDX,8BAtD2B,UAsD3B,CAAA;MAlCA,2BAAA,CAAA;;;;;;;;;;cAKW,kBAAkB,8BAAA,UAAA,CAAA;EAAA,EAAA,EA6B7B,2BAAA,CAAA,iBA7B6B"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { defineEntity, defineEntityEnum, field, index } from "@contractspec/lib.schema";
|
|
2
|
+
|
|
3
|
+
//#region src/entities/review.ts
|
|
4
|
+
/**
|
|
5
|
+
* Review status enum.
|
|
6
|
+
*/
|
|
7
|
+
const ReviewStatusEnum = defineEntityEnum({
|
|
8
|
+
name: "ReviewStatus",
|
|
9
|
+
values: [
|
|
10
|
+
"PENDING",
|
|
11
|
+
"APPROVED",
|
|
12
|
+
"REJECTED",
|
|
13
|
+
"FLAGGED"
|
|
14
|
+
],
|
|
15
|
+
schema: "marketplace",
|
|
16
|
+
description: "Status of a review."
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Review type enum.
|
|
20
|
+
*/
|
|
21
|
+
const ReviewTypeEnum = defineEntityEnum({
|
|
22
|
+
name: "ReviewType",
|
|
23
|
+
values: [
|
|
24
|
+
"PRODUCT",
|
|
25
|
+
"STORE",
|
|
26
|
+
"ORDER"
|
|
27
|
+
],
|
|
28
|
+
schema: "marketplace",
|
|
29
|
+
description: "Type of review."
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Review entity - customer reviews and ratings.
|
|
33
|
+
*/
|
|
34
|
+
const ReviewEntity = defineEntity({
|
|
35
|
+
name: "Review",
|
|
36
|
+
description: "A customer review on the marketplace.",
|
|
37
|
+
schema: "marketplace",
|
|
38
|
+
map: "review",
|
|
39
|
+
fields: {
|
|
40
|
+
id: field.id({ description: "Unique review ID" }),
|
|
41
|
+
type: field.enum("ReviewType", { default: "PRODUCT" }),
|
|
42
|
+
productId: field.string({ isOptional: true }),
|
|
43
|
+
storeId: field.string({ isOptional: true }),
|
|
44
|
+
orderId: field.string({ isOptional: true }),
|
|
45
|
+
orderItemId: field.string({ isOptional: true }),
|
|
46
|
+
authorId: field.foreignKey({ description: "Reviewer user ID" }),
|
|
47
|
+
rating: field.int({ description: "Rating 1-5" }),
|
|
48
|
+
title: field.string({ isOptional: true }),
|
|
49
|
+
content: field.string({ isOptional: true }),
|
|
50
|
+
isVerifiedPurchase: field.boolean({ default: false }),
|
|
51
|
+
status: field.enum("ReviewStatus", { default: "PENDING" }),
|
|
52
|
+
hasMedia: field.boolean({ default: false }),
|
|
53
|
+
helpfulCount: field.int({ default: 0 }),
|
|
54
|
+
notHelpfulCount: field.int({ default: 0 }),
|
|
55
|
+
moderatedBy: field.string({ isOptional: true }),
|
|
56
|
+
moderatedAt: field.dateTime({ isOptional: true }),
|
|
57
|
+
moderationNote: field.string({ isOptional: true }),
|
|
58
|
+
hasResponse: field.boolean({ default: false }),
|
|
59
|
+
createdAt: field.createdAt(),
|
|
60
|
+
updatedAt: field.updatedAt(),
|
|
61
|
+
product: field.belongsTo("Product", ["productId"], ["id"]),
|
|
62
|
+
store: field.belongsTo("Store", ["storeId"], ["id"]),
|
|
63
|
+
responses: field.hasMany("ReviewResponse"),
|
|
64
|
+
votes: field.hasMany("ReviewVote")
|
|
65
|
+
},
|
|
66
|
+
indexes: [
|
|
67
|
+
index.on([
|
|
68
|
+
"productId",
|
|
69
|
+
"status",
|
|
70
|
+
"createdAt"
|
|
71
|
+
]),
|
|
72
|
+
index.on([
|
|
73
|
+
"storeId",
|
|
74
|
+
"status",
|
|
75
|
+
"createdAt"
|
|
76
|
+
]),
|
|
77
|
+
index.on(["authorId"]),
|
|
78
|
+
index.on(["orderId"]),
|
|
79
|
+
index.on(["status"]),
|
|
80
|
+
index.on(["rating"]),
|
|
81
|
+
index.on(["isVerifiedPurchase", "status"])
|
|
82
|
+
],
|
|
83
|
+
enums: [ReviewStatusEnum, ReviewTypeEnum]
|
|
84
|
+
});
|
|
85
|
+
/**
|
|
86
|
+
* Review response entity - seller responses to reviews.
|
|
87
|
+
*/
|
|
88
|
+
const ReviewResponseEntity = defineEntity({
|
|
89
|
+
name: "ReviewResponse",
|
|
90
|
+
description: "A seller response to a review.",
|
|
91
|
+
schema: "marketplace",
|
|
92
|
+
map: "review_response",
|
|
93
|
+
fields: {
|
|
94
|
+
id: field.id(),
|
|
95
|
+
reviewId: field.foreignKey(),
|
|
96
|
+
authorId: field.foreignKey(),
|
|
97
|
+
content: field.string(),
|
|
98
|
+
createdAt: field.createdAt(),
|
|
99
|
+
updatedAt: field.updatedAt(),
|
|
100
|
+
review: field.belongsTo("Review", ["reviewId"], ["id"], { onDelete: "Cascade" })
|
|
101
|
+
},
|
|
102
|
+
indexes: [index.on(["reviewId"]), index.on(["authorId"])]
|
|
103
|
+
});
|
|
104
|
+
/**
|
|
105
|
+
* Review vote entity - helpfulness votes.
|
|
106
|
+
*/
|
|
107
|
+
const ReviewVoteEntity = defineEntity({
|
|
108
|
+
name: "ReviewVote",
|
|
109
|
+
description: "A helpfulness vote on a review.",
|
|
110
|
+
schema: "marketplace",
|
|
111
|
+
map: "review_vote",
|
|
112
|
+
fields: {
|
|
113
|
+
id: field.id(),
|
|
114
|
+
reviewId: field.foreignKey(),
|
|
115
|
+
userId: field.foreignKey(),
|
|
116
|
+
isHelpful: field.boolean(),
|
|
117
|
+
createdAt: field.createdAt(),
|
|
118
|
+
review: field.belongsTo("Review", ["reviewId"], ["id"], { onDelete: "Cascade" })
|
|
119
|
+
},
|
|
120
|
+
indexes: [index.unique(["reviewId", "userId"]), index.on(["userId"])]
|
|
121
|
+
});
|
|
122
|
+
/**
|
|
123
|
+
* Review report entity - flagged reviews.
|
|
124
|
+
*/
|
|
125
|
+
const ReviewReportEntity = defineEntity({
|
|
126
|
+
name: "ReviewReport",
|
|
127
|
+
description: "A report/flag on a review.",
|
|
128
|
+
schema: "marketplace",
|
|
129
|
+
map: "review_report",
|
|
130
|
+
fields: {
|
|
131
|
+
id: field.id(),
|
|
132
|
+
reviewId: field.foreignKey(),
|
|
133
|
+
reporterId: field.foreignKey(),
|
|
134
|
+
reason: field.string({ description: "Report reason category" }),
|
|
135
|
+
details: field.string({ isOptional: true }),
|
|
136
|
+
status: field.string({ default: "\"PENDING\"" }),
|
|
137
|
+
resolvedBy: field.string({ isOptional: true }),
|
|
138
|
+
resolvedAt: field.dateTime({ isOptional: true }),
|
|
139
|
+
resolution: field.string({ isOptional: true }),
|
|
140
|
+
createdAt: field.createdAt(),
|
|
141
|
+
review: field.belongsTo("Review", ["reviewId"], ["id"])
|
|
142
|
+
},
|
|
143
|
+
indexes: [
|
|
144
|
+
index.on(["reviewId"]),
|
|
145
|
+
index.on(["status"]),
|
|
146
|
+
index.on(["reporterId"])
|
|
147
|
+
]
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
//#endregion
|
|
151
|
+
export { ReviewEntity, ReviewReportEntity, ReviewResponseEntity, ReviewStatusEnum, ReviewTypeEnum, ReviewVoteEntity };
|
|
152
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","names":[],"sources":["../../src/entities/review.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\n\n/**\n * Review status enum.\n */\nexport const ReviewStatusEnum = defineEntityEnum({\n name: 'ReviewStatus',\n values: ['PENDING', 'APPROVED', 'REJECTED', 'FLAGGED'] as const,\n schema: 'marketplace',\n description: 'Status of a review.',\n});\n\n/**\n * Review type enum.\n */\nexport const ReviewTypeEnum = defineEntityEnum({\n name: 'ReviewType',\n values: ['PRODUCT', 'STORE', 'ORDER'] as const,\n schema: 'marketplace',\n description: 'Type of review.',\n});\n\n/**\n * Review entity - customer reviews and ratings.\n */\nexport const ReviewEntity = defineEntity({\n name: 'Review',\n description: 'A customer review on the marketplace.',\n schema: 'marketplace',\n map: 'review',\n fields: {\n id: field.id({ description: 'Unique review ID' }),\n\n // Type and target\n type: field.enum('ReviewType', { default: 'PRODUCT' }),\n productId: field.string({ isOptional: true }),\n storeId: field.string({ isOptional: true }),\n orderId: field.string({ isOptional: true }),\n orderItemId: field.string({ isOptional: true }),\n\n // Author\n authorId: field.foreignKey({ description: 'Reviewer user ID' }),\n\n // Content\n rating: field.int({ description: 'Rating 1-5' }),\n title: field.string({ isOptional: true }),\n content: field.string({ isOptional: true }),\n\n // Verification\n isVerifiedPurchase: field.boolean({ default: false }),\n\n // Status\n status: field.enum('ReviewStatus', { default: 'PENDING' }),\n\n // Media (using file attachments)\n hasMedia: field.boolean({ default: false }),\n\n // Helpfulness\n helpfulCount: field.int({ default: 0 }),\n notHelpfulCount: field.int({ default: 0 }),\n\n // Moderation\n moderatedBy: field.string({ isOptional: true }),\n moderatedAt: field.dateTime({ isOptional: true }),\n moderationNote: field.string({ isOptional: true }),\n\n // Response\n hasResponse: field.boolean({ default: false }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n product: field.belongsTo('Product', ['productId'], ['id']),\n store: field.belongsTo('Store', ['storeId'], ['id']),\n responses: field.hasMany('ReviewResponse'),\n votes: field.hasMany('ReviewVote'),\n },\n indexes: [\n index.on(['productId', 'status', 'createdAt']),\n index.on(['storeId', 'status', 'createdAt']),\n index.on(['authorId']),\n index.on(['orderId']),\n index.on(['status']),\n index.on(['rating']),\n index.on(['isVerifiedPurchase', 'status']),\n ],\n enums: [ReviewStatusEnum, ReviewTypeEnum],\n});\n\n/**\n * Review response entity - seller responses to reviews.\n */\nexport const ReviewResponseEntity = defineEntity({\n name: 'ReviewResponse',\n description: 'A seller response to a review.',\n schema: 'marketplace',\n map: 'review_response',\n fields: {\n id: field.id(),\n reviewId: field.foreignKey(),\n\n // Author (usually store owner)\n authorId: field.foreignKey(),\n\n // Content\n content: field.string(),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n review: field.belongsTo('Review', ['reviewId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [index.on(['reviewId']), index.on(['authorId'])],\n});\n\n/**\n * Review vote entity - helpfulness votes.\n */\nexport const ReviewVoteEntity = defineEntity({\n name: 'ReviewVote',\n description: 'A helpfulness vote on a review.',\n schema: 'marketplace',\n map: 'review_vote',\n fields: {\n id: field.id(),\n reviewId: field.foreignKey(),\n userId: field.foreignKey(),\n\n isHelpful: field.boolean(),\n\n createdAt: field.createdAt(),\n\n // Relations\n review: field.belongsTo('Review', ['reviewId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [index.unique(['reviewId', 'userId']), index.on(['userId'])],\n});\n\n/**\n * Review report entity - flagged reviews.\n */\nexport const ReviewReportEntity = defineEntity({\n name: 'ReviewReport',\n description: 'A report/flag on a review.',\n schema: 'marketplace',\n map: 'review_report',\n fields: {\n id: field.id(),\n reviewId: field.foreignKey(),\n reporterId: field.foreignKey(),\n\n reason: field.string({ description: 'Report reason category' }),\n details: field.string({ isOptional: true }),\n\n // Status\n status: field.string({ default: '\"PENDING\"' }),\n resolvedBy: field.string({ isOptional: true }),\n resolvedAt: field.dateTime({ isOptional: true }),\n resolution: field.string({ isOptional: true }),\n\n createdAt: field.createdAt(),\n\n // Relations\n review: field.belongsTo('Review', ['reviewId'], ['id']),\n },\n indexes: [\n index.on(['reviewId']),\n index.on(['status']),\n index.on(['reporterId']),\n ],\n});\n"],"mappings":";;;;;;AAUA,MAAa,mBAAmB,iBAAiB;CAC/C,MAAM;CACN,QAAQ;EAAC;EAAW;EAAY;EAAY;EAAU;CACtD,QAAQ;CACR,aAAa;CACd,CAAC;;;;AAKF,MAAa,iBAAiB,iBAAiB;CAC7C,MAAM;CACN,QAAQ;EAAC;EAAW;EAAS;EAAQ;CACrC,QAAQ;CACR,aAAa;CACd,CAAC;;;;AAKF,MAAa,eAAe,aAAa;CACvC,MAAM;CACN,aAAa;CACb,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,IAAI,MAAM,GAAG,EAAE,aAAa,oBAAoB,CAAC;EAGjD,MAAM,MAAM,KAAK,cAAc,EAAE,SAAS,WAAW,CAAC;EACtD,WAAW,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;EAC7C,SAAS,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;EAC3C,SAAS,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;EAC3C,aAAa,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;EAG/C,UAAU,MAAM,WAAW,EAAE,aAAa,oBAAoB,CAAC;EAG/D,QAAQ,MAAM,IAAI,EAAE,aAAa,cAAc,CAAC;EAChD,OAAO,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;EACzC,SAAS,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;EAG3C,oBAAoB,MAAM,QAAQ,EAAE,SAAS,OAAO,CAAC;EAGrD,QAAQ,MAAM,KAAK,gBAAgB,EAAE,SAAS,WAAW,CAAC;EAG1D,UAAU,MAAM,QAAQ,EAAE,SAAS,OAAO,CAAC;EAG3C,cAAc,MAAM,IAAI,EAAE,SAAS,GAAG,CAAC;EACvC,iBAAiB,MAAM,IAAI,EAAE,SAAS,GAAG,CAAC;EAG1C,aAAa,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;EAC/C,aAAa,MAAM,SAAS,EAAE,YAAY,MAAM,CAAC;EACjD,gBAAgB,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;EAGlD,aAAa,MAAM,QAAQ,EAAE,SAAS,OAAO,CAAC;EAG9C,WAAW,MAAM,WAAW;EAC5B,WAAW,MAAM,WAAW;EAG5B,SAAS,MAAM,UAAU,WAAW,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC;EAC1D,OAAO,MAAM,UAAU,SAAS,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC;EACpD,WAAW,MAAM,QAAQ,iBAAiB;EAC1C,OAAO,MAAM,QAAQ,aAAa;EACnC;CACD,SAAS;EACP,MAAM,GAAG;GAAC;GAAa;GAAU;GAAY,CAAC;EAC9C,MAAM,GAAG;GAAC;GAAW;GAAU;GAAY,CAAC;EAC5C,MAAM,GAAG,CAAC,WAAW,CAAC;EACtB,MAAM,GAAG,CAAC,UAAU,CAAC;EACrB,MAAM,GAAG,CAAC,SAAS,CAAC;EACpB,MAAM,GAAG,CAAC,SAAS,CAAC;EACpB,MAAM,GAAG,CAAC,sBAAsB,SAAS,CAAC;EAC3C;CACD,OAAO,CAAC,kBAAkB,eAAe;CAC1C,CAAC;;;;AAKF,MAAa,uBAAuB,aAAa;CAC/C,MAAM;CACN,aAAa;CACb,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,IAAI,MAAM,IAAI;EACd,UAAU,MAAM,YAAY;EAG5B,UAAU,MAAM,YAAY;EAG5B,SAAS,MAAM,QAAQ;EAGvB,WAAW,MAAM,WAAW;EAC5B,WAAW,MAAM,WAAW;EAG5B,QAAQ,MAAM,UAAU,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EACtD,UAAU,WACX,CAAC;EACH;CACD,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC;CAC1D,CAAC;;;;AAKF,MAAa,mBAAmB,aAAa;CAC3C,MAAM;CACN,aAAa;CACb,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,IAAI,MAAM,IAAI;EACd,UAAU,MAAM,YAAY;EAC5B,QAAQ,MAAM,YAAY;EAE1B,WAAW,MAAM,SAAS;EAE1B,WAAW,MAAM,WAAW;EAG5B,QAAQ,MAAM,UAAU,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EACtD,UAAU,WACX,CAAC;EACH;CACD,SAAS,CAAC,MAAM,OAAO,CAAC,YAAY,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC;CACtE,CAAC;;;;AAKF,MAAa,qBAAqB,aAAa;CAC7C,MAAM;CACN,aAAa;CACb,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,IAAI,MAAM,IAAI;EACd,UAAU,MAAM,YAAY;EAC5B,YAAY,MAAM,YAAY;EAE9B,QAAQ,MAAM,OAAO,EAAE,aAAa,0BAA0B,CAAC;EAC/D,SAAS,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;EAG3C,QAAQ,MAAM,OAAO,EAAE,SAAS,eAAa,CAAC;EAC9C,YAAY,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;EAC9C,YAAY,MAAM,SAAS,EAAE,YAAY,MAAM,CAAC;EAChD,YAAY,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;EAE9C,WAAW,MAAM,WAAW;EAG5B,QAAQ,MAAM,UAAU,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC;EACxD;CACD,SAAS;EACP,MAAM,GAAG,CAAC,WAAW,CAAC;EACtB,MAAM,GAAG,CAAC,SAAS,CAAC;EACpB,MAAM,GAAG,CAAC,aAAa,CAAC;EACzB;CACF,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as _contractspec_lib_schema18 from "@contractspec/lib.schema";
|
|
2
|
+
|
|
3
|
+
//#region src/entities/store.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Store status enum.
|
|
6
|
+
*/
|
|
7
|
+
declare const StoreStatusEnum: _contractspec_lib_schema18.EntityEnumDef;
|
|
8
|
+
/**
|
|
9
|
+
* Store type enum.
|
|
10
|
+
*/
|
|
11
|
+
declare const StoreTypeEnum: _contractspec_lib_schema18.EntityEnumDef;
|
|
12
|
+
/**
|
|
13
|
+
* Store entity - a seller's storefront on the marketplace.
|
|
14
|
+
*/
|
|
15
|
+
declare const StoreEntity: _contractspec_lib_schema18.EntitySpec<{
|
|
16
|
+
id: _contractspec_lib_schema18.EntityScalarField;
|
|
17
|
+
name: _contractspec_lib_schema18.EntityScalarField;
|
|
18
|
+
slug: _contractspec_lib_schema18.EntityScalarField;
|
|
19
|
+
description: _contractspec_lib_schema18.EntityScalarField;
|
|
20
|
+
status: _contractspec_lib_schema18.EntityEnumField;
|
|
21
|
+
type: _contractspec_lib_schema18.EntityEnumField;
|
|
22
|
+
ownerId: _contractspec_lib_schema18.EntityScalarField;
|
|
23
|
+
organizationId: _contractspec_lib_schema18.EntityScalarField;
|
|
24
|
+
logoFileId: _contractspec_lib_schema18.EntityScalarField;
|
|
25
|
+
bannerFileId: _contractspec_lib_schema18.EntityScalarField;
|
|
26
|
+
email: _contractspec_lib_schema18.EntityScalarField;
|
|
27
|
+
phone: _contractspec_lib_schema18.EntityScalarField;
|
|
28
|
+
website: _contractspec_lib_schema18.EntityScalarField;
|
|
29
|
+
country: _contractspec_lib_schema18.EntityScalarField;
|
|
30
|
+
currency: _contractspec_lib_schema18.EntityScalarField;
|
|
31
|
+
timezone: _contractspec_lib_schema18.EntityScalarField;
|
|
32
|
+
commissionRate: _contractspec_lib_schema18.EntityScalarField;
|
|
33
|
+
isVerified: _contractspec_lib_schema18.EntityScalarField;
|
|
34
|
+
verifiedAt: _contractspec_lib_schema18.EntityScalarField;
|
|
35
|
+
settings: _contractspec_lib_schema18.EntityScalarField;
|
|
36
|
+
metadata: _contractspec_lib_schema18.EntityScalarField;
|
|
37
|
+
totalProducts: _contractspec_lib_schema18.EntityScalarField;
|
|
38
|
+
totalOrders: _contractspec_lib_schema18.EntityScalarField;
|
|
39
|
+
totalRevenue: _contractspec_lib_schema18.EntityScalarField;
|
|
40
|
+
averageRating: _contractspec_lib_schema18.EntityScalarField;
|
|
41
|
+
createdAt: _contractspec_lib_schema18.EntityScalarField;
|
|
42
|
+
updatedAt: _contractspec_lib_schema18.EntityScalarField;
|
|
43
|
+
products: _contractspec_lib_schema18.EntityRelationField;
|
|
44
|
+
orders: _contractspec_lib_schema18.EntityRelationField;
|
|
45
|
+
payouts: _contractspec_lib_schema18.EntityRelationField;
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* Store category entity - categorization for stores.
|
|
49
|
+
*/
|
|
50
|
+
declare const StoreCategoryEntity: _contractspec_lib_schema18.EntitySpec<{
|
|
51
|
+
id: _contractspec_lib_schema18.EntityScalarField;
|
|
52
|
+
storeId: _contractspec_lib_schema18.EntityScalarField;
|
|
53
|
+
categoryId: _contractspec_lib_schema18.EntityScalarField;
|
|
54
|
+
isPrimary: _contractspec_lib_schema18.EntityScalarField;
|
|
55
|
+
createdAt: _contractspec_lib_schema18.EntityScalarField;
|
|
56
|
+
store: _contractspec_lib_schema18.EntityRelationField;
|
|
57
|
+
}>;
|
|
58
|
+
//#endregion
|
|
59
|
+
export { StoreCategoryEntity, StoreEntity, StoreStatusEnum, StoreTypeEnum };
|
|
60
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","names":[],"sources":["../../src/entities/store.ts"],"sourcesContent":[],"mappings":";;;;;;AAUa,cAAA,eAKX,EAAA,0BAAA,CAL0B,aAK1B;AAKF;AAUA;;cAVa,eAKX,0BAAA,CALwB;;;;cAUb,wCAAW;MA8EtB,0BAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;6DA9EsB;EAAA,SAAA,8CAAA;EAmFX,SAAA,8CAkBX;EAAA,QAAA,gDAAA;;;;;;;AAlB8B,cAAnB,mBAAmB,6BAAA,UAAA,CAAA;MAkB9B,0BAAA,CAAA"}
|