feat(medusa,types): add promotion list/get endpoint (#6110)

what:

- adds get promotion endpoint (RESOLVES CORE-1677)
- adds list promotions endpoint (RESOLVES CORE-1676)
- uses new API routes
This commit is contained in:
Riqwan Thamir
2024-01-18 17:01:19 +01:00
committed by GitHub
parent 6941627679
commit a12c28b7d5
20 changed files with 809 additions and 23 deletions

View File

@@ -2,6 +2,247 @@
"namespaces": ["public"],
"name": "public",
"tables": [
{
"columns": {
"id": {
"name": "id",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"mappedType": "text"
},
"name": {
"name": "name",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"mappedType": "text"
},
"description": {
"name": "description",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"mappedType": "text"
},
"currency": {
"name": "currency",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"mappedType": "text"
},
"campaign_identifier": {
"name": "campaign_identifier",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"mappedType": "text"
},
"starts_at": {
"name": "starts_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"length": 6,
"mappedType": "datetime"
},
"ends_at": {
"name": "ends_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"length": 6,
"mappedType": "datetime"
},
"created_at": {
"name": "created_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"updated_at": {
"name": "updated_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"deleted_at": {
"name": "deleted_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"length": 6,
"mappedType": "datetime"
}
},
"name": "campaign",
"schema": "public",
"indexes": [
{
"keyName": "IDX_campaign_identifier_unique",
"columnNames": ["campaign_identifier"],
"composite": false,
"primary": false,
"unique": true
},
{
"keyName": "campaign_pkey",
"columnNames": ["id"],
"composite": false,
"primary": true,
"unique": true
}
],
"checks": [],
"foreignKeys": {}
},
{
"columns": {
"id": {
"name": "id",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"mappedType": "text"
},
"type": {
"name": "type",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"enumItems": ["spend", "usage"],
"mappedType": "enum"
},
"campaign_id": {
"name": "campaign_id",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"mappedType": "text"
},
"limit": {
"name": "limit",
"type": "numeric",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"default": "null",
"mappedType": "decimal"
},
"used": {
"name": "used",
"type": "numeric",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"default": "0",
"mappedType": "decimal"
},
"created_at": {
"name": "created_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"updated_at": {
"name": "updated_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"deleted_at": {
"name": "deleted_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"length": 6,
"mappedType": "datetime"
}
},
"name": "campaign_budget",
"schema": "public",
"indexes": [
{
"columnNames": ["type"],
"composite": false,
"keyName": "IDX_campaign_budget_type",
"primary": false,
"unique": false
},
{
"columnNames": ["campaign_id"],
"composite": false,
"keyName": "campaign_budget_campaign_id_unique",
"primary": false,
"unique": true
},
{
"keyName": "campaign_budget_pkey",
"columnNames": ["id"],
"composite": false,
"primary": true,
"unique": true
}
],
"checks": [],
"foreignKeys": {
"campaign_budget_campaign_id_foreign": {
"constraintName": "campaign_budget_campaign_id_foreign",
"columnNames": ["campaign_id"],
"localTableName": "public.campaign_budget",
"referencedColumnNames": ["id"],
"referencedTableName": "public.campaign",
"updateRule": "cascade"
}
}
},
{
"columns": {
"id": {
@@ -22,6 +263,15 @@
"nullable": false,
"mappedType": "text"
},
"campaign_id": {
"name": "campaign_id",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"mappedType": "text"
},
"is_automatic": {
"name": "is_automatic",
"type": "boolean",
@@ -108,7 +358,17 @@
}
],
"checks": [],
"foreignKeys": {}
"foreignKeys": {
"promotion_campaign_id_foreign": {
"constraintName": "promotion_campaign_id_foreign",
"columnNames": ["campaign_id"],
"localTableName": "public.promotion",
"referencedColumnNames": ["id"],
"referencedTableName": "public.campaign",
"deleteRule": "set null",
"updateRule": "cascade"
}
}
},
{
"columns": {
@@ -156,7 +416,7 @@
"autoincrement": false,
"primary": false,
"nullable": false,
"enumItems": ["order", "shipping", "item"],
"enumItems": ["order", "shipping_methods", "items"],
"mappedType": "enum"
},
"allocation": {

View File

@@ -1,9 +1,26 @@
import { Migration } from "@mikro-orm/migrations"
export class Migration20240102130345 extends Migration {
export class Migration20240117090706 extends Migration {
async up(): Promise<void> {
this.addSql(
'create table "promotion" ("id" text not null, "code" text not null, "is_automatic" boolean not null default false, "type" text check ("type" in (\'standard\', \'buyget\')) not null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "promotion_pkey" primary key ("id"));'
'create table "campaign" ("id" text not null, "name" text not null, "description" text null, "currency" text null, "campaign_identifier" text not null, "starts_at" timestamptz null, "ends_at" timestamptz null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "campaign_pkey" primary key ("id"));'
)
this.addSql(
'alter table "campaign" add constraint "IDX_campaign_identifier_unique" unique ("campaign_identifier");'
)
this.addSql(
'create table "campaign_budget" ("id" text not null, "type" text check ("type" in (\'spend\', \'usage\')) not null, "campaign_id" text not null, "limit" numeric null default null, "used" numeric not null default 0, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "campaign_budget_pkey" primary key ("id"));'
)
this.addSql(
'create index "IDX_campaign_budget_type" on "campaign_budget" ("type");'
)
this.addSql(
'alter table "campaign_budget" add constraint "campaign_budget_campaign_id_unique" unique ("campaign_id");'
)
this.addSql(
'create table "promotion" ("id" text not null, "code" text not null, "campaign_id" text null, "is_automatic" boolean not null default false, "type" text check ("type" in (\'standard\', \'buyget\')) not null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "promotion_pkey" primary key ("id"));'
)
this.addSql('create index "IDX_promotion_code" on "promotion" ("code");')
this.addSql('create index "IDX_promotion_type" on "promotion" ("type");')
@@ -12,7 +29,7 @@ export class Migration20240102130345 extends Migration {
)
this.addSql(
'create table "application_method" ("id" text not null, "value" numeric null, "max_quantity" numeric null, "type" text check ("type" in (\'fixed\', \'percentage\')) not null, "target_type" text check ("target_type" in (\'order\', \'shipping\', \'item\')) not null, "allocation" text check ("allocation" in (\'each\', \'across\')) null, "promotion_id" text not null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "application_method_pkey" primary key ("id"));'
'create table "application_method" ("id" text not null, "value" numeric null, "max_quantity" numeric null, "type" text check ("type" in (\'fixed\', \'percentage\')) not null, "target_type" text check ("target_type" in (\'order\', \'shipping_methods\', \'items\')) not null, "allocation" text check ("allocation" in (\'each\', \'across\')) null, "promotion_id" text not null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "application_method_pkey" primary key ("id"));'
)
this.addSql(
'create index "IDX_application_method_type" on "application_method" ("type");'
@@ -52,6 +69,14 @@ export class Migration20240102130345 extends Migration {
'create index "IDX_promotion_rule_promotion_rule_value_id" on "promotion_rule_value" ("promotion_rule_id");'
)
this.addSql(
'alter table "campaign_budget" add constraint "campaign_budget_campaign_id_foreign" foreign key ("campaign_id") references "campaign" ("id") on update cascade;'
)
this.addSql(
'alter table "promotion" add constraint "promotion_campaign_id_foreign" foreign key ("campaign_id") references "campaign" ("id") on update cascade on delete set null;'
)
this.addSql(
'alter table "application_method" add constraint "application_method_promotion_id_foreign" foreign key ("promotion_id") references "promotion" ("id") on update cascade;'
)

View File

@@ -368,9 +368,7 @@ export default class PromotionModuleService<
return await this.baseRepository_.serialize<PromotionTypes.PromotionDTO>(
promotion,
{
populate: true,
}
{ populate: true }
)
}
@@ -388,12 +386,31 @@ export default class PromotionModuleService<
return await this.baseRepository_.serialize<PromotionTypes.PromotionDTO[]>(
promotions,
{
populate: true,
}
{ populate: true }
)
}
@InjectManager("baseRepository_")
async listAndCount(
filters: PromotionTypes.FilterablePromotionProps = {},
config: FindConfig<PromotionTypes.PromotionDTO> = {},
@MedusaContext() sharedContext: Context = {}
): Promise<[PromotionTypes.PromotionDTO[], number]> {
const [promotions, count] = await this.promotionService_.listAndCount(
filters,
config,
sharedContext
)
return [
await this.baseRepository_.serialize<PromotionTypes.PromotionDTO[]>(
promotions,
{ populate: true }
),
count,
]
}
async create(
data: PromotionTypes.CreatePromotionDTO,
sharedContext?: Context
@@ -899,9 +916,7 @@ export default class PromotionModuleService<
return await this.baseRepository_.serialize<PromotionTypes.CampaignDTO>(
campaign,
{
populate: true,
}
{ populate: true }
)
}
@@ -919,9 +934,7 @@ export default class PromotionModuleService<
return await this.baseRepository_.serialize<PromotionTypes.CampaignDTO[]>(
campaigns,
{
populate: true,
}
{ populate: true }
)
}