@hed-hog/catalog 0.0.285 → 0.0.286

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.
@@ -1,218 +1,231 @@
1
- export type CatalogResourceConfig = {
2
- resource: string;
3
- model: string;
4
- searchFields: string[];
5
- filterFields?: string[];
6
- fields: string[];
7
- defaultOrderBy?: Record<string, 'asc' | 'desc'>;
8
- statusField?: string;
9
- };
10
-
11
- export const catalogResources: CatalogResourceConfig[] = [
12
- {
13
- resource: 'brands',
14
- model: 'catalog_brand',
15
- searchFields: ['slug', 'name', 'normalized_name'],
16
- filterFields: ['status', 'logo_file_id'],
17
- fields: ['slug', 'name', 'normalized_name', 'logo_file_id', 'status', 'website_url'],
18
- statusField: 'status',
19
- },
20
- {
21
- resource: 'sites',
22
- model: 'catalog_site',
23
- searchFields: ['slug', 'name', 'domain'],
24
- filterFields: ['status', 'site_type', 'default_locale_id'],
25
- fields: ['slug', 'name', 'domain', 'status', 'site_type', 'default_locale_id', 'theme_settings_json', 'seo_defaults_json'],
26
- statusField: 'status',
27
- },
28
- {
29
- resource: 'products',
30
- model: 'catalog_product',
31
- searchFields: ['slug', 'name', 'model_name', 'sku', 'gtin'],
32
- filterFields: ['status', 'comparison_status', 'brand_id', 'category_id', 'primary_content_id', 'is_active'],
33
- fields: ['brand_id', 'category_id', 'primary_content_id', 'slug', 'name', 'short_description', 'description', 'model_name', 'sku', 'gtin', 'status', 'comparison_status', 'release_date', 'spec_snapshot_json', 'comparison_snapshot_json', 'is_active'],
34
- statusField: 'status',
35
- },
36
- {
37
- resource: 'product-categories',
38
- model: 'catalog_product_category',
39
- searchFields: [],
40
- filterFields: ['product_id', 'category_id', 'is_primary'],
41
- fields: ['product_id', 'category_id', 'is_primary', 'sort_order'],
42
- },
43
- {
44
- resource: 'product-images',
45
- model: 'catalog_product_image',
46
- searchFields: ['alt_text', 'role'],
47
- filterFields: ['product_id', 'file_id', 'role', 'is_primary'],
48
- fields: ['product_id', 'file_id', 'role', 'sort_order', 'is_primary', 'alt_text'],
49
- },
50
- {
51
- resource: 'product-sites',
52
- model: 'catalog_product_site',
53
- searchFields: ['canonical_slug', 'override_brand_name', 'seo_title'],
54
- filterFields: ['product_id', 'site_id', 'publication_status', 'is_featured'],
55
- fields: ['product_id', 'site_id', 'publication_status', 'canonical_slug', 'is_featured', 'visibility_score', 'override_brand_name', 'seo_title', 'seo_description'],
56
- statusField: 'publication_status',
57
- },
58
- {
59
- resource: 'attribute-groups',
60
- model: 'catalog_attribute_group',
61
- searchFields: ['slug', 'name'],
62
- filterFields: ['status'],
63
- fields: ['slug', 'name', 'status'],
64
- statusField: 'status',
65
- },
66
- {
67
- resource: 'attributes',
68
- model: 'catalog_attribute',
69
- searchFields: ['slug', 'label', 'description', 'unit'],
70
- filterFields: ['group_id', 'data_type', 'comparison_mode', 'is_filterable', 'is_sortable', 'is_required_for_comparison'],
71
- fields: ['group_id', 'slug', 'label', 'description', 'data_type', 'unit', 'comparison_mode', 'is_filterable', 'is_sortable', 'is_required_for_comparison', 'normalization_rule_json', 'display_order'],
72
- },
73
- {
74
- resource: 'category-attributes',
75
- model: 'catalog_category_attribute',
76
- searchFields: [],
77
- filterFields: ['category_id', 'attribute_id', 'is_required', 'is_highlighted', 'facet_mode'],
78
- fields: ['category_id', 'attribute_id', 'is_required', 'is_highlighted', 'display_order', 'weight', 'facet_mode'],
79
- },
80
- {
81
- resource: 'product-attributes',
82
- model: 'catalog_product_attribute_value',
83
- searchFields: ['value_text', 'normalized_text', 'source_type'],
84
- filterFields: ['product_id', 'attribute_id', 'is_verified'],
85
- fields: ['product_id', 'attribute_id', 'value_text', 'value_number', 'value_boolean', 'value_json', 'value_unit', 'normalized_text', 'normalized_number', 'source_type', 'confidence_score', 'is_verified'],
86
- },
87
- {
88
- resource: 'score-criteria',
89
- model: 'catalog_score_criterion',
90
- searchFields: ['slug', 'name'],
91
- filterFields: ['category_id', 'status', 'score_type'],
92
- fields: ['category_id', 'slug', 'name', 'weight', 'score_type', 'formula_json', 'display_order', 'status'],
93
- statusField: 'status',
94
- },
95
- {
96
- resource: 'product-scores',
97
- model: 'catalog_product_score',
98
- searchFields: ['score_label', 'summary', 'calculation_source'],
99
- filterFields: ['product_id', 'criterion_id', 'is_manual_override'],
100
- fields: ['product_id', 'criterion_id', 'score_value', 'score_label', 'summary', 'calculation_source', 'is_manual_override'],
101
- },
102
- {
103
- resource: 'comparisons',
104
- model: 'catalog_comparison',
105
- searchFields: ['slug', 'title', 'summary', 'verdict', 'eligibility_hash'],
106
- filterFields: ['category_id', 'site_id', 'primary_content_id', 'comparison_type', 'generation_mode', 'status'],
107
- fields: ['category_id', 'site_id', 'primary_content_id', 'slug', 'comparison_type', 'generation_mode', 'status', 'title', 'summary', 'intro', 'verdict', 'spec_snapshot_json', 'eligibility_hash', 'published_at'],
108
- statusField: 'status',
109
- },
110
- {
111
- resource: 'comparison-items',
112
- model: 'catalog_comparison_item',
113
- searchFields: ['badge_label'],
114
- filterFields: ['comparison_id', 'product_id', 'is_winner'],
115
- fields: ['comparison_id', 'product_id', 'sort_order', 'is_winner', 'badge_label'],
116
- },
117
- {
118
- resource: 'comparison-highlights',
119
- model: 'catalog_comparison_highlight',
120
- searchFields: ['highlight_type', 'title', 'body'],
121
- filterFields: ['comparison_id', 'product_id', 'attribute_id', 'highlight_type'],
122
- fields: ['comparison_id', 'product_id', 'attribute_id', 'highlight_type', 'title', 'body', 'sort_order'],
123
- },
124
- {
125
- resource: 'similarity-rules',
126
- model: 'catalog_similarity_rule',
127
- searchFields: ['rule_type'],
128
- filterFields: ['category_id', 'status'],
129
- fields: ['category_id', 'rule_type', 'rule_json', 'min_similarity_score', 'status'],
130
- statusField: 'status',
131
- },
132
- {
133
- resource: 'merchants',
134
- model: 'catalog_merchant',
135
- searchFields: ['slug', 'name'],
136
- filterFields: ['status', 'merchant_type', 'logo_file_id'],
137
- fields: ['slug', 'name', 'status', 'merchant_type', 'logo_file_id'],
138
- statusField: 'status',
139
- },
140
- {
141
- resource: 'affiliate-programs',
142
- model: 'catalog_affiliate_program',
143
- searchFields: ['slug', 'name', 'network_type', 'commission_type'],
144
- filterFields: ['merchant_id', 'status', 'network_type'],
145
- fields: ['merchant_id', 'slug', 'name', 'network_type', 'tracking_template', 'commission_type', 'default_commission_value', 'status'],
146
- statusField: 'status',
147
- },
148
- {
149
- resource: 'offers',
150
- model: 'catalog_offer',
151
- searchFields: ['external_offer_id', 'title', 'availability_status'],
152
- filterFields: ['product_id', 'merchant_id', 'affiliate_program_id', 'site_id', 'availability_status', 'is_featured'],
153
- fields: ['product_id', 'merchant_id', 'affiliate_program_id', 'site_id', 'external_offer_id', 'title', 'price_amount', 'price_currency', 'original_price_amount', 'installment_json', 'availability_status', 'affiliate_url', 'deep_link_url', 'priority_score', 'is_featured', 'valid_from', 'valid_until', 'last_seen_at'],
154
- },
155
- {
156
- resource: 'price-history',
157
- model: 'catalog_price_history',
158
- searchFields: ['availability_status'],
159
- filterFields: ['offer_id', 'product_id', 'availability_status'],
160
- fields: ['offer_id', 'product_id', 'captured_at', 'price_amount', 'original_price_amount', 'availability_status'],
161
- },
162
- {
163
- resource: 'click-events',
164
- model: 'catalog_click_event',
165
- searchFields: ['placement', 'session_hash', 'referrer_host'],
166
- filterFields: ['offer_id', 'product_id', 'site_id', 'comparison_id'],
167
- fields: ['offer_id', 'product_id', 'site_id', 'comparison_id', 'clicked_at', 'placement', 'utm_json', 'session_hash', 'referrer_host'],
168
- },
169
- {
170
- resource: 'site-categories',
171
- model: 'catalog_site_category',
172
- searchFields: ['visibility_status'],
173
- filterFields: ['site_id', 'category_id', 'is_primary', 'visibility_status'],
174
- fields: ['site_id', 'category_id', 'is_primary', 'visibility_status'],
175
- },
176
- {
177
- resource: 'content-relations',
178
- model: 'catalog_content_relation',
179
- searchFields: ['relation_type'],
180
- filterFields: ['site_id', 'content_id', 'product_id', 'comparison_id', 'relation_type'],
181
- fields: ['site_id', 'content_id', 'product_id', 'comparison_id', 'relation_type', 'sort_order'],
182
- },
183
- {
184
- resource: 'seo-rules',
185
- model: 'catalog_seo_page_rule',
186
- searchFields: ['page_type', 'rule_slug', 'canonical_strategy'],
187
- filterFields: ['site_id', 'category_id', 'status', 'page_type'],
188
- fields: ['site_id', 'category_id', 'page_type', 'rule_slug', 'status', 'generation_query_json', 'min_product_count', 'min_attribute_coverage', 'canonical_strategy', 'priority', 'template_json'],
189
- statusField: 'status',
190
- },
191
- {
192
- resource: 'import-sources',
193
- model: 'catalog_import_source',
194
- searchFields: ['slug', 'name', 'source_type'],
195
- filterFields: ['source_type', 'status'],
196
- fields: ['slug', 'name', 'source_type', 'config_json', 'status'],
197
- statusField: 'status',
198
- },
199
- {
200
- resource: 'import-runs',
201
- model: 'catalog_import_run',
202
- searchFields: ['status', 'idempotency_key'],
203
- filterFields: ['source_id', 'status'],
204
- fields: ['source_id', 'started_at', 'finished_at', 'status', 'stats_json', 'error_log', 'idempotency_key'],
205
- statusField: 'status',
206
- },
207
- {
208
- resource: 'product-tags',
209
- model: 'catalog_product_tag',
210
- searchFields: [],
211
- filterFields: ['product_id', 'tag_id'],
212
- fields: ['product_id', 'tag_id'],
213
- }
214
- ];
215
-
216
- export const catalogResourceMap = new Map(
217
- catalogResources.map((resource) => [resource.resource, resource]),
218
- );
1
+ export type CatalogResourceConfig = {
2
+ resource: string;
3
+ model: string;
4
+ searchFields: string[];
5
+ filterFields?: string[];
6
+ fields: string[];
7
+ defaultOrderBy?: Record<string, 'asc' | 'desc'>;
8
+ statusField?: string;
9
+ activeStatusValue?: string;
10
+ };
11
+
12
+ export const catalogResources: CatalogResourceConfig[] = [
13
+ {
14
+ resource: 'brands',
15
+ model: 'catalog_brand',
16
+ searchFields: ['slug', 'name', 'normalized_name'],
17
+ filterFields: ['status', 'logo_file_id'],
18
+ fields: ['slug', 'name', 'normalized_name', 'logo_file_id', 'status', 'website_url'],
19
+ statusField: 'status',
20
+ activeStatusValue: 'active',
21
+ },
22
+ {
23
+ resource: 'sites',
24
+ model: 'catalog_site',
25
+ searchFields: ['slug', 'name', 'domain'],
26
+ filterFields: ['status', 'site_type', 'default_locale_id'],
27
+ fields: ['slug', 'name', 'domain', 'status', 'site_type', 'default_locale_id', 'theme_settings_json', 'seo_defaults_json'],
28
+ statusField: 'status',
29
+ activeStatusValue: 'active',
30
+ },
31
+ {
32
+ resource: 'products',
33
+ model: 'catalog_product',
34
+ searchFields: ['slug', 'name', 'model_name', 'sku', 'gtin'],
35
+ filterFields: ['status', 'comparison_status', 'brand_id', 'category_id', 'primary_content_id', 'is_active'],
36
+ fields: ['brand_id', 'category_id', 'primary_content_id', 'slug', 'name', 'short_description', 'description', 'model_name', 'sku', 'gtin', 'status', 'comparison_status', 'release_date', 'spec_snapshot_json', 'comparison_snapshot_json', 'is_active'],
37
+ statusField: 'status',
38
+ activeStatusValue: 'published',
39
+ },
40
+ {
41
+ resource: 'product-categories',
42
+ model: 'catalog_product_category',
43
+ searchFields: [],
44
+ filterFields: ['product_id', 'category_id', 'is_primary'],
45
+ fields: ['product_id', 'category_id', 'is_primary', 'sort_order'],
46
+ },
47
+ {
48
+ resource: 'product-images',
49
+ model: 'catalog_product_image',
50
+ searchFields: ['alt_text', 'role'],
51
+ filterFields: ['product_id', 'file_id', 'role', 'is_primary'],
52
+ fields: ['product_id', 'file_id', 'role', 'sort_order', 'is_primary', 'alt_text'],
53
+ },
54
+ {
55
+ resource: 'product-sites',
56
+ model: 'catalog_product_site',
57
+ searchFields: ['canonical_slug', 'override_brand_name', 'seo_title'],
58
+ filterFields: ['product_id', 'site_id', 'publication_status', 'is_featured'],
59
+ fields: ['product_id', 'site_id', 'publication_status', 'canonical_slug', 'is_featured', 'visibility_score', 'override_brand_name', 'seo_title', 'seo_description'],
60
+ statusField: 'publication_status',
61
+ activeStatusValue: 'published',
62
+ },
63
+ {
64
+ resource: 'attribute-groups',
65
+ model: 'catalog_attribute_group',
66
+ searchFields: ['slug', 'name'],
67
+ filterFields: ['status'],
68
+ fields: ['slug', 'name', 'status'],
69
+ statusField: 'status',
70
+ activeStatusValue: 'active',
71
+ },
72
+ {
73
+ resource: 'attributes',
74
+ model: 'catalog_attribute',
75
+ searchFields: ['slug', 'label', 'description', 'unit'],
76
+ filterFields: ['group_id', 'data_type', 'comparison_mode', 'is_filterable', 'is_sortable', 'is_required_for_comparison'],
77
+ fields: ['group_id', 'slug', 'label', 'description', 'data_type', 'unit', 'comparison_mode', 'is_filterable', 'is_sortable', 'is_required_for_comparison', 'normalization_rule_json', 'display_order'],
78
+ },
79
+ {
80
+ resource: 'category-attributes',
81
+ model: 'catalog_category_attribute',
82
+ searchFields: [],
83
+ filterFields: ['category_id', 'attribute_id', 'is_required', 'is_highlighted', 'facet_mode'],
84
+ fields: ['category_id', 'attribute_id', 'is_required', 'is_highlighted', 'display_order', 'weight', 'facet_mode'],
85
+ },
86
+ {
87
+ resource: 'product-attributes',
88
+ model: 'catalog_product_attribute_value',
89
+ searchFields: ['value_text', 'normalized_text', 'source_type'],
90
+ filterFields: ['product_id', 'attribute_id', 'is_verified'],
91
+ fields: ['product_id', 'attribute_id', 'value_text', 'value_number', 'value_boolean', 'value_json', 'value_unit', 'normalized_text', 'normalized_number', 'source_type', 'confidence_score', 'is_verified'],
92
+ },
93
+ {
94
+ resource: 'score-criteria',
95
+ model: 'catalog_score_criterion',
96
+ searchFields: ['slug', 'name'],
97
+ filterFields: ['category_id', 'status', 'score_type'],
98
+ fields: ['category_id', 'slug', 'name', 'weight', 'score_type', 'formula_json', 'display_order', 'status'],
99
+ statusField: 'status',
100
+ activeStatusValue: 'active',
101
+ },
102
+ {
103
+ resource: 'product-scores',
104
+ model: 'catalog_product_score',
105
+ searchFields: ['score_label', 'summary', 'calculation_source'],
106
+ filterFields: ['product_id', 'criterion_id', 'is_manual_override'],
107
+ fields: ['product_id', 'criterion_id', 'score_value', 'score_label', 'summary', 'calculation_source', 'is_manual_override'],
108
+ },
109
+ {
110
+ resource: 'comparisons',
111
+ model: 'catalog_comparison',
112
+ searchFields: ['slug', 'title', 'summary', 'verdict', 'eligibility_hash'],
113
+ filterFields: ['category_id', 'site_id', 'primary_content_id', 'comparison_type', 'generation_mode', 'status'],
114
+ fields: ['category_id', 'site_id', 'primary_content_id', 'slug', 'comparison_type', 'generation_mode', 'status', 'title', 'summary', 'intro', 'verdict', 'spec_snapshot_json', 'eligibility_hash', 'published_at'],
115
+ statusField: 'status',
116
+ activeStatusValue: 'published',
117
+ },
118
+ {
119
+ resource: 'comparison-items',
120
+ model: 'catalog_comparison_item',
121
+ searchFields: ['badge_label'],
122
+ filterFields: ['comparison_id', 'product_id', 'is_winner'],
123
+ fields: ['comparison_id', 'product_id', 'sort_order', 'is_winner', 'badge_label'],
124
+ },
125
+ {
126
+ resource: 'comparison-highlights',
127
+ model: 'catalog_comparison_highlight',
128
+ searchFields: ['highlight_type', 'title', 'body'],
129
+ filterFields: ['comparison_id', 'product_id', 'attribute_id', 'highlight_type'],
130
+ fields: ['comparison_id', 'product_id', 'attribute_id', 'highlight_type', 'title', 'body', 'sort_order'],
131
+ },
132
+ {
133
+ resource: 'similarity-rules',
134
+ model: 'catalog_similarity_rule',
135
+ searchFields: ['rule_type'],
136
+ filterFields: ['category_id', 'status'],
137
+ fields: ['category_id', 'rule_type', 'rule_json', 'min_similarity_score', 'status'],
138
+ statusField: 'status',
139
+ activeStatusValue: 'active',
140
+ },
141
+ {
142
+ resource: 'merchants',
143
+ model: 'catalog_merchant',
144
+ searchFields: ['slug', 'name'],
145
+ filterFields: ['status', 'merchant_type', 'logo_file_id'],
146
+ fields: ['slug', 'name', 'status', 'merchant_type', 'logo_file_id'],
147
+ statusField: 'status',
148
+ activeStatusValue: 'active',
149
+ },
150
+ {
151
+ resource: 'affiliate-programs',
152
+ model: 'catalog_affiliate_program',
153
+ searchFields: ['slug', 'name', 'network_type', 'commission_type'],
154
+ filterFields: ['merchant_id', 'status', 'network_type'],
155
+ fields: ['merchant_id', 'slug', 'name', 'network_type', 'tracking_template', 'commission_type', 'default_commission_value', 'status'],
156
+ statusField: 'status',
157
+ activeStatusValue: 'active',
158
+ },
159
+ {
160
+ resource: 'offers',
161
+ model: 'catalog_offer',
162
+ searchFields: ['external_offer_id', 'title', 'availability_status'],
163
+ filterFields: ['product_id', 'merchant_id', 'affiliate_program_id', 'site_id', 'availability_status', 'is_featured'],
164
+ fields: ['product_id', 'merchant_id', 'affiliate_program_id', 'site_id', 'external_offer_id', 'title', 'price_amount', 'price_currency', 'original_price_amount', 'installment_json', 'availability_status', 'affiliate_url', 'deep_link_url', 'priority_score', 'is_featured', 'valid_from', 'valid_until', 'last_seen_at'],
165
+ },
166
+ {
167
+ resource: 'price-history',
168
+ model: 'catalog_price_history',
169
+ searchFields: ['availability_status'],
170
+ filterFields: ['offer_id', 'product_id', 'availability_status'],
171
+ fields: ['offer_id', 'product_id', 'captured_at', 'price_amount', 'original_price_amount', 'availability_status'],
172
+ },
173
+ {
174
+ resource: 'click-events',
175
+ model: 'catalog_click_event',
176
+ searchFields: ['placement', 'session_hash', 'referrer_host'],
177
+ filterFields: ['offer_id', 'product_id', 'site_id', 'comparison_id'],
178
+ fields: ['offer_id', 'product_id', 'site_id', 'comparison_id', 'clicked_at', 'placement', 'utm_json', 'session_hash', 'referrer_host'],
179
+ },
180
+ {
181
+ resource: 'site-categories',
182
+ model: 'catalog_site_category',
183
+ searchFields: ['visibility_status'],
184
+ filterFields: ['site_id', 'category_id', 'is_primary', 'visibility_status'],
185
+ fields: ['site_id', 'category_id', 'is_primary', 'visibility_status'],
186
+ },
187
+ {
188
+ resource: 'content-relations',
189
+ model: 'catalog_content_relation',
190
+ searchFields: ['relation_type'],
191
+ filterFields: ['site_id', 'content_id', 'product_id', 'comparison_id', 'relation_type'],
192
+ fields: ['site_id', 'content_id', 'product_id', 'comparison_id', 'relation_type', 'sort_order'],
193
+ },
194
+ {
195
+ resource: 'seo-rules',
196
+ model: 'catalog_seo_page_rule',
197
+ searchFields: ['page_type', 'rule_slug', 'canonical_strategy'],
198
+ filterFields: ['site_id', 'category_id', 'status', 'page_type'],
199
+ fields: ['site_id', 'category_id', 'page_type', 'rule_slug', 'status', 'generation_query_json', 'min_product_count', 'min_attribute_coverage', 'canonical_strategy', 'priority', 'template_json'],
200
+ statusField: 'status',
201
+ activeStatusValue: 'active',
202
+ },
203
+ {
204
+ resource: 'import-sources',
205
+ model: 'catalog_import_source',
206
+ searchFields: ['slug', 'name', 'source_type'],
207
+ filterFields: ['source_type', 'status'],
208
+ fields: ['slug', 'name', 'source_type', 'config_json', 'status'],
209
+ statusField: 'status',
210
+ activeStatusValue: 'active',
211
+ },
212
+ {
213
+ resource: 'import-runs',
214
+ model: 'catalog_import_run',
215
+ searchFields: ['status', 'idempotency_key'],
216
+ filterFields: ['source_id', 'status'],
217
+ fields: ['source_id', 'started_at', 'finished_at', 'status', 'stats_json', 'error_log', 'idempotency_key'],
218
+ statusField: 'status',
219
+ },
220
+ {
221
+ resource: 'product-tags',
222
+ model: 'catalog_product_tag',
223
+ searchFields: [],
224
+ filterFields: ['product_id', 'tag_id'],
225
+ fields: ['product_id', 'tag_id'],
226
+ }
227
+ ];
228
+
229
+ export const catalogResourceMap = new Map(
230
+ catalogResources.map((resource) => [resource.resource, resource]),
231
+ );