Files
criollo/src/scripts/seed.ts

851 lines
22 KiB
TypeScript

import {
createApiKeysWorkflow,
createInventoryLevelsWorkflow,
createProductCategoriesWorkflow,
createProductsWorkflow,
createRegionsWorkflow,
createSalesChannelsWorkflow,
createShippingOptionsWorkflow,
createShippingProfilesWorkflow,
createStockLocationsWorkflow,
createTaxRegionsWorkflow,
linkSalesChannelsToApiKeyWorkflow,
linkSalesChannelsToStockLocationWorkflow,
updateStoresWorkflow,
} from "@medusajs/medusa/core-flows";
import { CreateInventoryLevelInput, ExecArgs } from "@medusajs/framework/types";
import {
ContainerRegistrationKeys,
Modules,
ProductStatus,
} from "@medusajs/framework/utils";
export default async function seedDemoData({ container }: ExecArgs) {
const logger = container.resolve(ContainerRegistrationKeys.LOGGER);
const link = container.resolve(ContainerRegistrationKeys.LINK);
const query = container.resolve(ContainerRegistrationKeys.QUERY);
const fulfillmentModuleService = container.resolve(Modules.FULFILLMENT);
const salesChannelModuleService = container.resolve(Modules.SALES_CHANNEL);
const storeModuleService = container.resolve(Modules.STORE);
const countries = ["gb", "de", "dk", "se", "fr", "es", "it"];
logger.info("Seeding store data...");
const [store] = await storeModuleService.listStores();
let defaultSalesChannel = await salesChannelModuleService.listSalesChannels({
name: "Default Sales Channel",
});
if (!defaultSalesChannel.length) {
// create the default sales channel
const { result: salesChannelResult } = await createSalesChannelsWorkflow(
container
).run({
input: {
salesChannelsData: [
{
name: "Default Sales Channel",
},
],
},
});
defaultSalesChannel = salesChannelResult;
}
await updateStoresWorkflow(container).run({
input: {
selector: { id: store.id },
update: {
supported_currencies: [
{
currency_code: "eur",
is_default: true,
},
{
currency_code: "usd",
},
],
default_sales_channel_id: defaultSalesChannel[0].id,
},
},
});
logger.info("Seeding region data...");
const { result: regionResult } = await createRegionsWorkflow(container).run({
input: {
regions: [
{
name: "Europe",
currency_code: "eur",
countries,
payment_providers: ["pp_system_default"],
},
],
},
});
const region = regionResult[0];
logger.info("Finished seeding regions.");
logger.info("Seeding tax regions...");
await createTaxRegionsWorkflow(container).run({
input: countries.map((country_code) => ({
country_code,
})),
});
logger.info("Finished seeding tax regions.");
logger.info("Seeding stock location data...");
const { result: stockLocationResult } = await createStockLocationsWorkflow(
container
).run({
input: {
locations: [
{
name: "European Warehouse",
address: {
city: "Copenhagen",
country_code: "DK",
address_1: "",
},
},
],
},
});
const stockLocation = stockLocationResult[0];
await link.create({
[Modules.STOCK_LOCATION]: {
stock_location_id: stockLocation.id,
},
[Modules.FULFILLMENT]: {
fulfillment_provider_id: "manual_manual",
},
});
logger.info("Seeding fulfillment data...");
const { result: shippingProfileResult } =
await createShippingProfilesWorkflow(container).run({
input: {
data: [
{
name: "Default",
type: "default",
},
],
},
});
const shippingProfile = shippingProfileResult[0];
const fulfillmentSet = await fulfillmentModuleService.createFulfillmentSets({
name: "European Warehouse delivery",
type: "shipping",
service_zones: [
{
name: "Europe",
geo_zones: [
{
country_code: "gb",
type: "country",
},
{
country_code: "de",
type: "country",
},
{
country_code: "dk",
type: "country",
},
{
country_code: "se",
type: "country",
},
{
country_code: "fr",
type: "country",
},
{
country_code: "es",
type: "country",
},
{
country_code: "it",
type: "country",
},
],
},
],
});
await link.create({
[Modules.STOCK_LOCATION]: {
stock_location_id: stockLocation.id,
},
[Modules.FULFILLMENT]: {
fulfillment_set_id: fulfillmentSet.id,
},
});
await createShippingOptionsWorkflow(container).run({
input: [
{
name: "Standard Shipping",
price_type: "flat",
provider_id: "manual_manual",
service_zone_id: fulfillmentSet.service_zones[0].id,
shipping_profile_id: shippingProfile.id,
type: {
label: "Standard",
description: "Ship in 2-3 days.",
code: "standard",
},
prices: [
{
currency_code: "usd",
amount: 10,
},
{
currency_code: "eur",
amount: 10,
},
{
region_id: region.id,
amount: 10,
},
],
rules: [
{
attribute: "enabled_in_store",
value: "true",
operator: "eq",
},
{
attribute: "is_return",
value: "false",
operator: "eq",
},
],
},
{
name: "Express Shipping",
price_type: "flat",
provider_id: "manual_manual",
service_zone_id: fulfillmentSet.service_zones[0].id,
shipping_profile_id: shippingProfile.id,
type: {
label: "Express",
description: "Ship in 24 hours.",
code: "express",
},
prices: [
{
currency_code: "usd",
amount: 10,
},
{
currency_code: "eur",
amount: 10,
},
{
region_id: region.id,
amount: 10,
},
],
rules: [
{
attribute: "enabled_in_store",
value: "true",
operator: "eq",
},
{
attribute: "is_return",
value: "false",
operator: "eq",
},
],
},
],
});
logger.info("Finished seeding fulfillment data.");
await linkSalesChannelsToStockLocationWorkflow(container).run({
input: {
id: stockLocation.id,
add: [defaultSalesChannel[0].id],
},
});
logger.info("Finished seeding stock location data.");
logger.info("Seeding publishable API key data...");
const { result: publishableApiKeyResult } = await createApiKeysWorkflow(
container
).run({
input: {
api_keys: [
{
title: "Webshop",
type: "publishable",
created_by: "",
},
],
},
});
const publishableApiKey = publishableApiKeyResult[0];
await linkSalesChannelsToApiKeyWorkflow(container).run({
input: {
id: publishableApiKey.id,
add: [defaultSalesChannel[0].id],
},
});
logger.info("Finished seeding publishable API key data.");
logger.info("Seeding product data...");
const { result: categoryResult } = await createProductCategoriesWorkflow(
container
).run({
input: {
product_categories: [
{
name: "Shirts",
is_active: true,
},
{
name: "Sweatshirts",
is_active: true,
},
{
name: "Pants",
is_active: true,
},
{
name: "Merch",
is_active: true,
},
],
},
});
await createProductsWorkflow(container).run({
input: {
products: [
{
title: "Medusa T-Shirt",
category_ids: [
categoryResult.find((cat) => cat.name === "Shirts")!.id,
],
description:
"Reimagine the feeling of a classic T-shirt. With our cotton T-shirts, everyday essentials no longer have to be ordinary.",
handle: "t-shirt",
weight: 400,
status: ProductStatus.PUBLISHED,
shipping_profile_id: shippingProfile.id,
images: [
{
url: "https://medusa-public-images.s3.eu-west-1.amazonaws.com/tee-black-front.png",
},
{
url: "https://medusa-public-images.s3.eu-west-1.amazonaws.com/tee-black-back.png",
},
{
url: "https://medusa-public-images.s3.eu-west-1.amazonaws.com/tee-white-front.png",
},
{
url: "https://medusa-public-images.s3.eu-west-1.amazonaws.com/tee-white-back.png",
},
],
options: [
{
title: "Size",
values: ["S", "M", "L", "XL"],
},
{
title: "Color",
values: ["Black", "White"],
},
],
variants: [
{
title: "S / Black",
sku: "SHIRT-S-BLACK",
options: {
Size: "S",
Color: "Black",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "S / White",
sku: "SHIRT-S-WHITE",
options: {
Size: "S",
Color: "White",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "M / Black",
sku: "SHIRT-M-BLACK",
options: {
Size: "M",
Color: "Black",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "M / White",
sku: "SHIRT-M-WHITE",
options: {
Size: "M",
Color: "White",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "L / Black",
sku: "SHIRT-L-BLACK",
options: {
Size: "L",
Color: "Black",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "L / White",
sku: "SHIRT-L-WHITE",
options: {
Size: "L",
Color: "White",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "XL / Black",
sku: "SHIRT-XL-BLACK",
options: {
Size: "XL",
Color: "Black",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "XL / White",
sku: "SHIRT-XL-WHITE",
options: {
Size: "XL",
Color: "White",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
],
sales_channels: [
{
id: defaultSalesChannel[0].id,
},
],
},
{
title: "Medusa Sweatshirt",
category_ids: [
categoryResult.find((cat) => cat.name === "Sweatshirts")!.id,
],
description:
"Reimagine the feeling of a classic sweatshirt. With our cotton sweatshirt, everyday essentials no longer have to be ordinary.",
handle: "sweatshirt",
weight: 400,
status: ProductStatus.PUBLISHED,
shipping_profile_id: shippingProfile.id,
images: [
{
url: "https://medusa-public-images.s3.eu-west-1.amazonaws.com/sweatshirt-vintage-front.png",
},
{
url: "https://medusa-public-images.s3.eu-west-1.amazonaws.com/sweatshirt-vintage-back.png",
},
],
options: [
{
title: "Size",
values: ["S", "M", "L", "XL"],
},
],
variants: [
{
title: "S",
sku: "SWEATSHIRT-S",
options: {
Size: "S",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "M",
sku: "SWEATSHIRT-M",
options: {
Size: "M",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "L",
sku: "SWEATSHIRT-L",
options: {
Size: "L",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "XL",
sku: "SWEATSHIRT-XL",
options: {
Size: "XL",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
],
sales_channels: [
{
id: defaultSalesChannel[0].id,
},
],
},
{
title: "Medusa Sweatpants",
category_ids: [
categoryResult.find((cat) => cat.name === "Pants")!.id,
],
description:
"Reimagine the feeling of classic sweatpants. With our cotton sweatpants, everyday essentials no longer have to be ordinary.",
handle: "sweatpants",
weight: 400,
status: ProductStatus.PUBLISHED,
shipping_profile_id: shippingProfile.id,
images: [
{
url: "https://medusa-public-images.s3.eu-west-1.amazonaws.com/sweatpants-gray-front.png",
},
{
url: "https://medusa-public-images.s3.eu-west-1.amazonaws.com/sweatpants-gray-back.png",
},
],
options: [
{
title: "Size",
values: ["S", "M", "L", "XL"],
},
],
variants: [
{
title: "S",
sku: "SWEATPANTS-S",
options: {
Size: "S",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "M",
sku: "SWEATPANTS-M",
options: {
Size: "M",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "L",
sku: "SWEATPANTS-L",
options: {
Size: "L",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "XL",
sku: "SWEATPANTS-XL",
options: {
Size: "XL",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
],
sales_channels: [
{
id: defaultSalesChannel[0].id,
},
],
},
{
title: "Medusa Shorts",
category_ids: [
categoryResult.find((cat) => cat.name === "Merch")!.id,
],
description:
"Reimagine the feeling of classic shorts. With our cotton shorts, everyday essentials no longer have to be ordinary.",
handle: "shorts",
weight: 400,
status: ProductStatus.PUBLISHED,
shipping_profile_id: shippingProfile.id,
images: [
{
url: "https://medusa-public-images.s3.eu-west-1.amazonaws.com/shorts-vintage-front.png",
},
{
url: "https://medusa-public-images.s3.eu-west-1.amazonaws.com/shorts-vintage-back.png",
},
],
options: [
{
title: "Size",
values: ["S", "M", "L", "XL"],
},
],
variants: [
{
title: "S",
sku: "SHORTS-S",
options: {
Size: "S",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "M",
sku: "SHORTS-M",
options: {
Size: "M",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "L",
sku: "SHORTS-L",
options: {
Size: "L",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
{
title: "XL",
sku: "SHORTS-XL",
options: {
Size: "XL",
},
prices: [
{
amount: 10,
currency_code: "eur",
},
{
amount: 15,
currency_code: "usd",
},
],
},
],
sales_channels: [
{
id: defaultSalesChannel[0].id,
},
],
},
],
},
});
logger.info("Finished seeding product data.");
logger.info("Seeding inventory levels.");
const { data: inventoryItems } = await query.graph({
entity: "inventory_item",
fields: ["id"],
});
const inventoryLevels: CreateInventoryLevelInput[] = [];
for (const inventoryItem of inventoryItems) {
const inventoryLevel = {
location_id: stockLocation.id,
stocked_quantity: 1000000,
inventory_item_id: inventoryItem.id,
};
inventoryLevels.push(inventoryLevel);
}
await createInventoryLevelsWorkflow(container).run({
input: {
inventory_levels: inventoryLevels,
},
});
logger.info("Finished seeding inventory levels data.");
}