medusa-strapi-plugin 0.0.14 → 0.0.17
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/.medusa/server/src/modules/strapi/service.js +41 -29
- package/CHANGELOG.md +79 -0
- package/package.json +1 -1
- package/src/admin/README.md +34 -0
- package/src/admin/lib/sdk.ts +9 -0
- package/src/admin/routes/strapi/page.tsx +44 -0
- package/src/admin/tsconfig.json +24 -0
- package/src/admin/vite-env.d.ts +1 -0
- package/src/api/README.md +123 -0
- package/src/api/admin/strapi/sync/route.ts +38 -0
- package/src/jobs/README.md +36 -0
- package/src/links/README.md +26 -0
- package/src/links/strapi-categories.ts +23 -0
- package/src/links/strapi-collections.ts +23 -0
- package/src/links/strapi-product-variants.ts +23 -0
- package/src/links/strapi-products.ts +23 -0
- package/src/modules/README.md +113 -0
- package/src/modules/strapi/index.ts +10 -0
- package/src/modules/strapi/loader/create-content-models.ts +144 -0
- package/src/modules/strapi/service.ts +610 -0
- package/src/providers/README.md +30 -0
- package/src/subscribers/README.md +54 -0
- package/src/subscribers/create-category.ts +25 -0
- package/src/subscribers/create-collection.ts +25 -0
- package/src/subscribers/create-product.ts +25 -0
- package/src/subscribers/create-variant.ts +25 -0
- package/src/subscribers/delete-category.ts +25 -0
- package/src/subscribers/delete-collection.ts +25 -0
- package/src/subscribers/delete-product.ts +25 -0
- package/src/subscribers/delete-variant.ts +25 -0
- package/src/subscribers/sync-categories.ts +44 -0
- package/src/subscribers/sync-collections.ts +44 -0
- package/src/subscribers/sync-products.ts +44 -0
- package/src/subscribers/update-category.ts +25 -0
- package/src/subscribers/update-collection.ts +25 -0
- package/src/subscribers/update-product.ts +25 -0
- package/src/subscribers/update-variant.ts +25 -0
- package/src/workflows/README.md +69 -0
- package/src/workflows/delete-categories-strapi.ts +20 -0
- package/src/workflows/delete-collections-strapi.ts +20 -0
- package/src/workflows/delete-product-variants-strapi.ts +20 -0
- package/src/workflows/delete-products-strapi.ts +20 -0
- package/src/workflows/steps/delete-categories-strapi.ts +29 -0
- package/src/workflows/steps/delete-collections-strapi.ts +31 -0
- package/src/workflows/steps/delete-product-variants-strapi.ts +31 -0
- package/src/workflows/steps/delete-products-strapi.ts +29 -0
- package/src/workflows/steps/upsert-categories-strapi.ts +84 -0
- package/src/workflows/steps/upsert-collections-strapi.ts +84 -0
- package/src/workflows/steps/upsert-product-variants-strapi.ts +83 -0
- package/src/workflows/steps/upsert-products-strapi.ts +81 -0
- package/src/workflows/upsert-categories-strapi.ts +30 -0
- package/src/workflows/upsert-collections-strapi.ts +30 -0
- package/src/workflows/upsert-product-variants-strapi.ts +30 -0
- package/src/workflows/upsert-products-strapi.ts +36 -0
|
@@ -11,6 +11,7 @@ var StrapiEntity;
|
|
|
11
11
|
StrapiEntity["VARIANT"] = "product-variants";
|
|
12
12
|
StrapiEntity["CATEGORY"] = "categories";
|
|
13
13
|
StrapiEntity["COLLECTION"] = "collections";
|
|
14
|
+
StrapiEntity["CATEGORY_ATTRIBUTE_DESCRIPTION"] = "category-attribute-descriptions";
|
|
14
15
|
})(StrapiEntity || (StrapiEntity = {}));
|
|
15
16
|
class StrapiModuleService {
|
|
16
17
|
constructor({ logger }, options) {
|
|
@@ -157,51 +158,62 @@ class StrapiModuleService {
|
|
|
157
158
|
return await this.updateEntry(entity, entry.documentId, updatePayload);
|
|
158
159
|
}
|
|
159
160
|
/**
|
|
160
|
-
* Auto-populates attribute override components on a category if they don't exist
|
|
161
|
+
* Auto-populates attribute override components and relations on a category if they don't exist
|
|
161
162
|
*/
|
|
162
163
|
async populateCategoryOverrides(categoryDocumentId, attributeValueDocumentIds) {
|
|
163
164
|
if (!attributeValueDocumentIds.length)
|
|
164
165
|
return;
|
|
165
166
|
try {
|
|
166
|
-
// 1. Fetch the category with its current overrides populated
|
|
167
|
-
const category = await this.makeRequest(`${StrapiEntity.CATEGORY}/${categoryDocumentId}?populate=attribute_overrides.attribute_value`);
|
|
167
|
+
// 1. Fetch the category with its current overrides and relations populated
|
|
168
|
+
const category = await this.makeRequest(`${StrapiEntity.CATEGORY}/${categoryDocumentId}?populate[0]=attribute_overrides.attribute_value&populate[1]=attribute_values`);
|
|
168
169
|
if (!category)
|
|
169
170
|
return;
|
|
170
171
|
const existingOverrides = category.attribute_overrides || [];
|
|
172
|
+
const existingRelations = category.attribute_values || [];
|
|
171
173
|
// 2. Determine which attribute values are missing
|
|
172
174
|
const existingAttributeValueIds = existingOverrides
|
|
173
175
|
.map((override) => override.attribute_value?.documentId)
|
|
174
176
|
.filter(Boolean);
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
177
|
+
const existingRelationIds = existingRelations
|
|
178
|
+
.map((rel) => rel.documentId)
|
|
179
|
+
.filter(Boolean);
|
|
180
|
+
const missingOverrides = attributeValueDocumentIds.filter((id) => !existingAttributeValueIds.includes(id));
|
|
181
|
+
const missingRelations = attributeValueDocumentIds.filter((id) => !existingRelationIds.includes(id));
|
|
182
|
+
if (missingOverrides.length === 0 && missingRelations.length === 0) {
|
|
183
|
+
this.logger.debug(`No new overrides or relations needed for category ${categoryDocumentId}`);
|
|
178
184
|
return;
|
|
179
185
|
}
|
|
180
|
-
// 3. Construct the
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
186
|
+
// 3. Construct the update payload
|
|
187
|
+
const payload = {};
|
|
188
|
+
if (missingOverrides.length > 0 || existingOverrides.length > 0) {
|
|
189
|
+
// We always pass existing if we are passing new overrides
|
|
190
|
+
// Strapi requires the full array to update components
|
|
191
|
+
payload.attribute_overrides = [
|
|
192
|
+
...existingOverrides.map((override) => ({
|
|
193
|
+
id: override.id, // Keep existing ID
|
|
194
|
+
attribute_value: override.attribute_value?.documentId,
|
|
195
|
+
description: override.description,
|
|
196
|
+
bottom_description: override.bottom_description,
|
|
197
|
+
})),
|
|
198
|
+
...missingOverrides.map((missingId) => ({
|
|
199
|
+
attribute_value: missingId,
|
|
200
|
+
// description and bottom_description stay empty for the editor
|
|
201
|
+
})),
|
|
202
|
+
];
|
|
203
|
+
}
|
|
204
|
+
if (missingRelations.length > 0) {
|
|
205
|
+
// Keep existing relations and add new ones to prevent deleting others in Strapi
|
|
206
|
+
payload.attribute_values = [
|
|
207
|
+
...existingRelationIds,
|
|
208
|
+
...missingRelations,
|
|
209
|
+
];
|
|
210
|
+
}
|
|
197
211
|
// 4. Update the category in Strapi
|
|
198
|
-
await this.updateEntry(StrapiEntity.CATEGORY, categoryDocumentId,
|
|
199
|
-
|
|
200
|
-
});
|
|
201
|
-
this.logger.debug(`Added ${missingAttributeValueIds.length} missing attribute overrides to category ${categoryDocumentId}`);
|
|
212
|
+
await this.updateEntry(StrapiEntity.CATEGORY, categoryDocumentId, payload);
|
|
213
|
+
this.logger.debug(`Added ${missingOverrides.length} overrides and ${missingRelations.length} relations to category ${categoryDocumentId}`);
|
|
202
214
|
}
|
|
203
215
|
catch (error) {
|
|
204
|
-
this.logger.error(`Failed to populate overrides for category ${categoryDocumentId}`, error);
|
|
216
|
+
this.logger.error(`Failed to populate overrides/relations for category ${categoryDocumentId}`, error);
|
|
205
217
|
}
|
|
206
218
|
}
|
|
207
219
|
/**
|
|
@@ -382,4 +394,4 @@ class StrapiModuleService {
|
|
|
382
394
|
}
|
|
383
395
|
}
|
|
384
396
|
exports.default = StrapiModuleService;
|
|
385
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3N0cmFwaS9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBT0EscURBQXdEO0FBQ3hELDRDQUFvQjtBQVlwQixJQUFLLFlBS0o7QUFMRCxXQUFLLFlBQVk7SUFDZixvQ0FBb0IsQ0FBQTtJQUNwQiw0Q0FBNEIsQ0FBQTtJQUM1Qix1Q0FBdUIsQ0FBQTtJQUN2QiwwQ0FBMEIsQ0FBQTtBQUM1QixDQUFDLEVBTEksWUFBWSxLQUFaLFlBQVksUUFLaEI7QUFFRCxNQUFxQixtQkFBbUI7SUFLdEMsWUFBWSxFQUFFLE1BQU0sRUFBd0IsRUFBRSxPQUFzQjtRQUNsRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsR0FBRyxPQUFPO1lBQ1YsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksSUFBSTtZQUM5QyxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsSUFBSSxVQUFVO1NBQ25ELENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkUsQ0FBQztJQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBc0I7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsMENBQTBDLENBQzNDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFdBQVcsQ0FDdkIsUUFBZ0IsRUFDaEIsVUFBd0MsRUFBRTtRQUUxQyxNQUFNLEdBQUcsR0FB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
|
|
397
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3N0cmFwaS9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBT0EscURBQXdEO0FBQ3hELDRDQUFvQjtBQVlwQixJQUFLLFlBTUo7QUFORCxXQUFLLFlBQVk7SUFDZixvQ0FBb0IsQ0FBQTtJQUNwQiw0Q0FBNEIsQ0FBQTtJQUM1Qix1Q0FBdUIsQ0FBQTtJQUN2QiwwQ0FBMEIsQ0FBQTtJQUMxQixrRkFBa0UsQ0FBQTtBQUNwRSxDQUFDLEVBTkksWUFBWSxLQUFaLFlBQVksUUFNaEI7QUFFRCxNQUFxQixtQkFBbUI7SUFLdEMsWUFBWSxFQUFFLE1BQU0sRUFBd0IsRUFBRSxPQUFzQjtRQUNsRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsR0FBRyxPQUFPO1lBQ1YsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksSUFBSTtZQUM5QyxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsSUFBSSxVQUFVO1NBQ25ELENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkUsQ0FBQztJQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBc0I7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsMENBQTBDLENBQzNDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFdBQVcsQ0FDdkIsUUFBZ0IsRUFDaEIsVUFBd0MsRUFBRTtR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
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
|
+
|
|
5
|
+
### [0.0.12](https://github.com/devx-commerce/medusa-strapi-plugin/compare/v0.0.12-beta.0...v0.0.12) (2025-10-06)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* enhance Strapi integration with new content type schemas and improved error handling ([296b5b6](https://github.com/devx-commerce/medusa-strapi-plugin/commit/296b5b69ddf3275479338e2c3a2f93bcb114b0d3))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* update STRAPI_URL in README and remove npm-publish workflow ([9945755](https://github.com/devx-commerce/medusa-strapi-plugin/commit/99457559431be7ecffc1646d1f2445584d27fbe8))
|
|
16
|
+
|
|
17
|
+
### 0.0.12-beta.0 (2025-09-02)
|
|
18
|
+
|
|
19
|
+
### [0.0.11](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.11-beta.0...v0.0.11) (2025-06-18)
|
|
20
|
+
|
|
21
|
+
### [0.0.11-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.8...v0.0.11-beta.0) (2025-06-18)
|
|
22
|
+
|
|
23
|
+
### [0.0.8-beta.8](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.7...v0.0.8-beta.8) (2025-06-05)
|
|
24
|
+
|
|
25
|
+
### [0.0.8-beta.7](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.6...v0.0.8-beta.7) (2025-06-05)
|
|
26
|
+
|
|
27
|
+
### [0.0.8-beta.6](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.5...v0.0.8-beta.6) (2025-06-05)
|
|
28
|
+
|
|
29
|
+
### [0.0.8-beta.5](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.4...v0.0.8-beta.5) (2025-06-04)
|
|
30
|
+
|
|
31
|
+
### [0.0.8-beta.4](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.3...v0.0.8-beta.4) (2025-06-04)
|
|
32
|
+
|
|
33
|
+
### [0.0.8-beta.3](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.2...v0.0.8-beta.3) (2025-06-03)
|
|
34
|
+
|
|
35
|
+
### [0.0.8-beta.2](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.1...v0.0.8-beta.2) (2025-06-03)
|
|
36
|
+
|
|
37
|
+
### [0.0.8-beta.1](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.8-beta.0...v0.0.8-beta.1) (2025-06-03)
|
|
38
|
+
|
|
39
|
+
### [0.0.8-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7...v0.0.8-beta.0) (2025-06-03)
|
|
40
|
+
|
|
41
|
+
### [0.0.7](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.6...v0.0.7) (2025-06-03)
|
|
42
|
+
|
|
43
|
+
### [0.0.7-beta.6](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.5...v0.0.7-beta.6) (2025-06-03)
|
|
44
|
+
|
|
45
|
+
### [0.0.7-beta.5](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.4...v0.0.7-beta.5) (2025-06-02)
|
|
46
|
+
|
|
47
|
+
### [0.0.7-beta.4](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.3...v0.0.7-beta.4) (2025-05-30)
|
|
48
|
+
|
|
49
|
+
### [0.0.7-beta.3](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.2...v0.0.7-beta.3) (2025-05-30)
|
|
50
|
+
|
|
51
|
+
### [0.0.7-beta.2](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.1...v0.0.7-beta.2) (2025-05-30)
|
|
52
|
+
|
|
53
|
+
### [0.0.7-beta.1](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.7-beta.0...v0.0.7-beta.1) (2025-05-30)
|
|
54
|
+
|
|
55
|
+
### [0.0.7-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.6...v0.0.7-beta.0) (2025-05-28)
|
|
56
|
+
|
|
57
|
+
### [0.0.6](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.6-beta.0...v0.0.6) (2025-05-28)
|
|
58
|
+
|
|
59
|
+
### [0.0.6-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.5...v0.0.6-beta.0) (2025-05-27)
|
|
60
|
+
|
|
61
|
+
### [0.0.5](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.5-beta.0...v0.0.5) (2025-05-24)
|
|
62
|
+
|
|
63
|
+
### [0.0.5-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.4...v0.0.5-beta.0) (2025-05-24)
|
|
64
|
+
|
|
65
|
+
### [0.0.4](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.4-beta.0...v0.0.4) (2025-05-23)
|
|
66
|
+
|
|
67
|
+
### [0.0.4-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.3...v0.0.4-beta.0) (2025-05-23)
|
|
68
|
+
|
|
69
|
+
### [0.0.3](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.3-beta.0...v0.0.3) (2025-05-23)
|
|
70
|
+
|
|
71
|
+
### [0.0.3-beta.0](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.2...v0.0.3-beta.0) (2025-05-23)
|
|
72
|
+
|
|
73
|
+
### [0.0.2](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.2-beta.2...v0.0.2) (2025-05-20)
|
|
74
|
+
|
|
75
|
+
### [0.0.2-beta.2](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.2-beta.1...v0.0.2-beta.2) (2025-05-20)
|
|
76
|
+
|
|
77
|
+
### [0.0.2-beta.1](https://github.com/devx-commerce/plugin-strapi/compare/v0.0.2-beta.0...v0.0.2-beta.1) (2025-05-20)
|
|
78
|
+
|
|
79
|
+
### 0.0.2-beta.0 (2025-05-20)
|
package/package.json
CHANGED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Admin Customizations
|
|
2
|
+
|
|
3
|
+
You can extend the Medusa Admin to add widgets and new pages.
|
|
4
|
+
Your customizations interact with API routes to provide merchants with custom functionalities.
|
|
5
|
+
|
|
6
|
+
> **Note:** Widgets can fetch data from your custom API routes for dynamic content.
|
|
7
|
+
|
|
8
|
+
## Example: Create a Widget
|
|
9
|
+
|
|
10
|
+
A widget is a React component that can be injected into an existing page in the admin dashboard.
|
|
11
|
+
|
|
12
|
+
For example, create the file `src/admin/widgets/product-widget.tsx` with the following content:
|
|
13
|
+
|
|
14
|
+
```tsx title="src/admin/widgets/product-widget.tsx"
|
|
15
|
+
import { defineWidgetConfig } from "@medusajs/admin-sdk";
|
|
16
|
+
|
|
17
|
+
// The widget
|
|
18
|
+
const ProductWidget = () => {
|
|
19
|
+
return (
|
|
20
|
+
<div>
|
|
21
|
+
<h2>Product Widget</h2>
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// The widget's configurations
|
|
27
|
+
export const config = defineWidgetConfig({
|
|
28
|
+
zone: "product.details.after",
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export default ProductWidget;
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
This inserts a widget with the text “Product Widget” at the end of a product’s details page.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { defineRouteConfig } from "@medusajs/admin-sdk";
|
|
2
|
+
import { Button, Container, Heading, toast } from "@medusajs/ui";
|
|
3
|
+
import { useMutation } from "@tanstack/react-query";
|
|
4
|
+
import { sdk } from "../../lib/sdk";
|
|
5
|
+
|
|
6
|
+
const StrapiSettingsPage = () => {
|
|
7
|
+
const { mutate, isPending } = useMutation({
|
|
8
|
+
mutationFn: () =>
|
|
9
|
+
sdk.client.fetch("/admin/strapi/sync", {
|
|
10
|
+
method: "POST",
|
|
11
|
+
body: {
|
|
12
|
+
entities: ["attributes"],
|
|
13
|
+
},
|
|
14
|
+
}),
|
|
15
|
+
onSuccess: () => {
|
|
16
|
+
toast.success("Sync to Strapi triggered successfully");
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<Container className="p-6">
|
|
22
|
+
<div className="flex flex-col gap-y-4">
|
|
23
|
+
<div>
|
|
24
|
+
<Heading level="h1">Strapi Settings</Heading>
|
|
25
|
+
</div>
|
|
26
|
+
<div>
|
|
27
|
+
<Button
|
|
28
|
+
variant="primary"
|
|
29
|
+
onClick={() => mutate()}
|
|
30
|
+
isLoading={isPending}
|
|
31
|
+
>
|
|
32
|
+
Sync to Strapi
|
|
33
|
+
</Button>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</Container>
|
|
37
|
+
);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export const config = defineRouteConfig({
|
|
41
|
+
label: "Strapi",
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
export default StrapiSettingsPage;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
|
|
9
|
+
/* Bundler mode */
|
|
10
|
+
"moduleResolution": "bundler",
|
|
11
|
+
"allowImportingTsExtensions": true,
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"noEmit": true,
|
|
15
|
+
"jsx": "react-jsx",
|
|
16
|
+
|
|
17
|
+
/* Linting */
|
|
18
|
+
"strict": true,
|
|
19
|
+
"noUnusedLocals": true,
|
|
20
|
+
"noUnusedParameters": true,
|
|
21
|
+
"noFallthroughCasesInSwitch": true
|
|
22
|
+
},
|
|
23
|
+
"include": ["."]
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="vite/client" />
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Custom API Routes
|
|
2
|
+
|
|
3
|
+
An API Route is a REST API endpoint.
|
|
4
|
+
API routes in a Medusa plugin are created in the `/src/api` directory of your plugin or Medusa application. The file’s name must be `route.ts` or `route.js`.
|
|
5
|
+
|
|
6
|
+
For example, to create a `GET` API Route at `/store/hello-world`, create the file `src/api/store/hello-world/route.ts` with the following content:
|
|
7
|
+
|
|
8
|
+
```ts
|
|
9
|
+
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
10
|
+
|
|
11
|
+
export async function GET(req: MedusaRequest, res: MedusaResponse) {
|
|
12
|
+
res.json({
|
|
13
|
+
message: "Hello world!",
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Supported HTTP methods
|
|
19
|
+
|
|
20
|
+
The file based routing supports the following HTTP methods:
|
|
21
|
+
|
|
22
|
+
- GET
|
|
23
|
+
- POST
|
|
24
|
+
- PUT
|
|
25
|
+
- PATCH
|
|
26
|
+
- DELETE
|
|
27
|
+
- OPTIONS
|
|
28
|
+
- HEAD
|
|
29
|
+
|
|
30
|
+
You can define a handler for each of these methods by exporting a function with the name of the method in the paths `route.ts` file.
|
|
31
|
+
|
|
32
|
+
For example:
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
36
|
+
|
|
37
|
+
export async function GET(req: MedusaRequest, res: MedusaResponse) {
|
|
38
|
+
// Handle GET requests
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function POST(req: MedusaRequest, res: MedusaResponse) {
|
|
42
|
+
// Handle POST requests
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export async function PUT(req: MedusaRequest, res: MedusaResponse) {
|
|
46
|
+
// Handle PUT requests
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Parameters
|
|
51
|
+
|
|
52
|
+
To create an API route that accepts a path parameter, create a directory within the route's path whose name is of the format `[param]`.
|
|
53
|
+
|
|
54
|
+
For example, if you want to define a route that takes a `productId` parameter, you can do so by creating a file called `/api/products/[productId]/route.ts`:
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
58
|
+
|
|
59
|
+
export async function GET(req: MedusaRequest, res: MedusaResponse) {
|
|
60
|
+
const { productId } = req.params;
|
|
61
|
+
|
|
62
|
+
res.json({
|
|
63
|
+
message: `You're looking for product ${productId}`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
To create an API route that accepts multiple path parameters, create within the file's path multiple directories whose names are of the format `[param]`.
|
|
69
|
+
|
|
70
|
+
For example, if you want to define a route that takes both a `productId` and a `variantId` parameter, you can do so by creating a file called `/api/products/[productId]/variants/[variantId]/route.ts`.
|
|
71
|
+
|
|
72
|
+
## Using the container
|
|
73
|
+
|
|
74
|
+
The Medusa container is available on `req.scope`. Use it to access modules' main services and other registered resources:
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
78
|
+
|
|
79
|
+
export const GET = async (req: MedusaRequest, res: MedusaResponse) => {
|
|
80
|
+
const productModuleService = req.scope.resolve("product");
|
|
81
|
+
|
|
82
|
+
const [, count] = await productModuleService.listAndCount();
|
|
83
|
+
|
|
84
|
+
res.json({
|
|
85
|
+
count,
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Middleware
|
|
91
|
+
|
|
92
|
+
You can apply middleware to your routes by creating a file called `/api/middlewares.ts`. This file must export a configuration object with what middleware you want to apply to which routes.
|
|
93
|
+
|
|
94
|
+
For example, if you want to apply a custom middleware function to the `/store/custom` route, you can do so by adding the following to your `/api/middlewares.ts` file:
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
import { defineMiddlewares } from "@medusajs/framework/http";
|
|
98
|
+
import type {
|
|
99
|
+
MedusaRequest,
|
|
100
|
+
MedusaResponse,
|
|
101
|
+
MedusaNextFunction,
|
|
102
|
+
} from "@medusajs/framework/http";
|
|
103
|
+
|
|
104
|
+
async function logger(
|
|
105
|
+
req: MedusaRequest,
|
|
106
|
+
res: MedusaResponse,
|
|
107
|
+
next: MedusaNextFunction,
|
|
108
|
+
) {
|
|
109
|
+
console.log("Request received");
|
|
110
|
+
next();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export default defineMiddlewares({
|
|
114
|
+
routes: [
|
|
115
|
+
{
|
|
116
|
+
matcher: "/store/custom",
|
|
117
|
+
middlewares: [logger],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
});
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
The `matcher` property can be either a string or a regular expression. The `middlewares` property accepts an array of middleware functions.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
2
|
+
|
|
3
|
+
export const POST = async (
|
|
4
|
+
req: MedusaRequest<{
|
|
5
|
+
entities?: string[];
|
|
6
|
+
}>,
|
|
7
|
+
res: MedusaResponse,
|
|
8
|
+
) => {
|
|
9
|
+
const eventService = req.scope.resolve("event_bus");
|
|
10
|
+
|
|
11
|
+
const defaultEntities = ["products", "collections", "categories"];
|
|
12
|
+
const requestedEntities = req.body?.entities || [];
|
|
13
|
+
|
|
14
|
+
const entityTypes = Array.from(
|
|
15
|
+
new Set([...defaultEntities, ...requestedEntities]),
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
await Promise.all(
|
|
20
|
+
entityTypes.map((type) =>
|
|
21
|
+
eventService.emit({
|
|
22
|
+
name: `strapi-${type}.sync`,
|
|
23
|
+
data: {},
|
|
24
|
+
}),
|
|
25
|
+
),
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
res.status(200).json({
|
|
29
|
+
message: "Strapi sync triggered successfully",
|
|
30
|
+
});
|
|
31
|
+
} catch (error) {
|
|
32
|
+
res.status(500).json({
|
|
33
|
+
message: `Failed to trigger Strapi sync: ${
|
|
34
|
+
error instanceof Error ? error.message : "Unknown error"
|
|
35
|
+
}`,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Custom scheduled jobs
|
|
2
|
+
|
|
3
|
+
A scheduled job is a function executed at a specified interval of time in the background of your Medusa application.
|
|
4
|
+
|
|
5
|
+
A scheduled job is created in a TypeScript or JavaScript file under the `src/jobs` directory.
|
|
6
|
+
|
|
7
|
+
For example, create the file `src/jobs/hello-world.ts` with the following content:
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import {
|
|
11
|
+
MedusaContainer
|
|
12
|
+
} from "@medusajs/framework/types";
|
|
13
|
+
|
|
14
|
+
export default async function myCustomJob(container: MedusaContainer) {
|
|
15
|
+
const productService = container.resolve("product")
|
|
16
|
+
|
|
17
|
+
const products = await productService.listAndCountProducts();
|
|
18
|
+
|
|
19
|
+
// Do something with the products
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const config = {
|
|
23
|
+
name: "daily-product-report",
|
|
24
|
+
schedule: "0 0 * * *", // Every day at midnight
|
|
25
|
+
};
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
A scheduled job file must export:
|
|
29
|
+
|
|
30
|
+
- The function to be executed whenever it’s time to run the scheduled job.
|
|
31
|
+
- A configuration object defining the job. It has three properties:
|
|
32
|
+
- `name`: a unique name for the job.
|
|
33
|
+
- `schedule`: a [cron expression](https://crontab.guru/).
|
|
34
|
+
- `numberOfExecutions`: an optional integer, specifying how many times the job will execute before being removed
|
|
35
|
+
|
|
36
|
+
The `handler` is a function that accepts one parameter, `container`, which is a `MedusaContainer` instance used to resolve services.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Module Links
|
|
2
|
+
|
|
3
|
+
A module link forms an association between two data models of different modules, while maintaining module isolation.
|
|
4
|
+
|
|
5
|
+
Learn more about links in [this documentation](https://docs.medusajs.com/learn/fundamentals/module-links)
|
|
6
|
+
|
|
7
|
+
For example:
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import BlogModule from "../modules/blog";
|
|
11
|
+
import ProductModule from "@medusajs/medusa/product";
|
|
12
|
+
import { defineLink } from "@medusajs/framework/utils";
|
|
13
|
+
|
|
14
|
+
export default defineLink(
|
|
15
|
+
ProductModule.linkable.product,
|
|
16
|
+
BlogModule.linkable.post,
|
|
17
|
+
);
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
This defines a link between the Product Module's `product` data model and the Blog Module's (custom module) `post` data model.
|
|
21
|
+
|
|
22
|
+
Then, in the Medusa application using this plugin, run the following command to sync the links to the database:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npx medusa db:migrate
|
|
26
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineLink, Modules } from "@medusajs/framework/utils";
|
|
2
|
+
import { STRAPI_MODULE } from "../modules/strapi";
|
|
3
|
+
|
|
4
|
+
export default defineLink(
|
|
5
|
+
{
|
|
6
|
+
linkable: {
|
|
7
|
+
serviceName: Modules.PRODUCT,
|
|
8
|
+
alias: "product_category",
|
|
9
|
+
primaryKey: "id",
|
|
10
|
+
},
|
|
11
|
+
field: "id",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
linkable: {
|
|
15
|
+
serviceName: STRAPI_MODULE,
|
|
16
|
+
alias: "cms_category",
|
|
17
|
+
primaryKey: "categoryId",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
readOnly: true,
|
|
22
|
+
},
|
|
23
|
+
);
|