add payment link func.

This commit is contained in:
olivermrbl
2021-02-18 13:22:55 +01:00
parent 283f8fbe54
commit c4164e4b66
12 changed files with 171 additions and 4 deletions

View File

@@ -341,4 +341,68 @@ describe("/admin/draft-orders", () => {
expect(response.data.count).toEqual(0);
});
});
describe("DELETE /admin/draft-orders/:id", () => {
beforeEach(async () => {
try {
await adminSeeder(dbConnection);
await draftOrderSeeder(dbConnection);
} catch (err) {
console.log(err);
throw err;
}
});
afterEach(async () => {
const manager = dbConnection.manager;
await manager.query(`DELETE FROM "line_item"`);
await manager.query(`DELETE FROM "money_amount"`);
await manager.query(`DELETE FROM "product_variant"`);
await manager.query(`DELETE FROM "product"`);
await manager.query(`DELETE FROM "shipping_method"`);
await manager.query(`DELETE FROM "shipping_option"`);
await manager.query(`DELETE FROM "discount"`);
await manager.query(`DELETE FROM "payment_provider"`);
await manager.query(`DELETE FROM "payment_session"`);
await manager.query(`UPDATE "payment" SET order_id=NULL`);
await manager.query(`DELETE FROM "order"`);
await manager.query(`UPDATE "draft_order" SET order_id=NULL`);
await manager.query(`DELETE FROM "draft_order"`);
await manager.query(`DELETE FROM "cart"`);
await manager.query(`DELETE FROM "payment"`);
await manager.query(`DELETE FROM "customer"`);
await manager.query(`DELETE FROM "address"`);
await manager.query(
`UPDATE "country" SET region_id=NULL WHERE iso_2 = 'us'`
);
await manager.query(
`UPDATE "country" SET region_id=NULL WHERE iso_2 = 'de'`
);
await manager.query(`DELETE FROM "region"`);
await manager.query(`DELETE FROM "user"`);
});
it("lists draft orders", async () => {
const api = useApi();
const response = await api
.delete("/admin/draft-orders/test-draft-order", {
headers: {
Authorization: "Bearer test_token",
},
})
.catch((err) => {
console.log(err);
});
expect(response.status).toEqual(200);
expect(response.data).toEqual({
id: "test-draft-order",
object: "draft-order",
deleted: true,
});
});
});
});

View File

@@ -40,7 +40,7 @@ export default async (req, res) => {
.allow(0)
.optional(),
})
.required(),
.optional(),
metadata: Validator.object().optional(),
requires_shipping: Validator.boolean().default(true),
})

View File

@@ -0,0 +1,15 @@
export default async (req, res) => {
const { id } = req.params
try {
const draftOrderService = req.scope.resolve("draftOrderService")
await draftOrderService.delete(id)
res.json({
id,
object: "draft-order",
deleted: true,
})
} catch (err) {
throw err
}
}

View File

@@ -14,6 +14,11 @@ export default app => {
route.post("/:id", middlewares.wrap(require("./update-draft-order").default))
route.delete(
"/:id",
middlewares.wrap(require("./delete-draft-order").default)
)
route.delete(
"/:id/line-items/:line_id",
middlewares.wrap(require("./delete-line-item").default)

View File

@@ -4,6 +4,7 @@ export default async (req, res) => {
const schema = Validator.object().keys({
name: Validator.string(),
swap_link_template: Validator.string(),
payment_link_template: Validator.string(),
default_currency_code: Validator.string(),
currencies: Validator.array().items(Validator.string()),
})

View File

@@ -21,6 +21,7 @@ export class draftOrders1613384784316 implements MigrationInterface {
await queryRunner.query(`ALTER TABLE "draft_order" ADD CONSTRAINT "FK_5bd11d0e2a9628128e2c26fd0a6" FOREIGN KEY ("cart_id") REFERENCES "cart"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "draft_order" ADD CONSTRAINT "FK_8f6dd6c49202f1466ebf21e77da" FOREIGN KEY ("order_id") REFERENCES "order"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "order" ADD CONSTRAINT "FK_727b872f86c7378474a8fa46147" FOREIGN KEY ("draft_order_id") REFERENCES "draft_order"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "store" ADD "payment_link_template" character varying`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
@@ -41,6 +42,7 @@ export class draftOrders1613384784316 implements MigrationInterface {
await queryRunner.query(`DROP INDEX "IDX_e87cc617a22ef4edce5601edab"`);
await queryRunner.query(`DROP TABLE "draft_order"`);
await queryRunner.query(`DROP TYPE "draft_order_status_enum"`);
await queryRunner.query(`ALTER TABLE "store" DROP COLUMN "payment_link_template"`);
}
}

View File

@@ -0,0 +1,14 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class paymentLinkTemplate1613634008478 implements MigrationInterface {
name = 'paymentLinkTemplate1613634008478'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "store" ADD "payment_link_template" character varying`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "store" DROP COLUMN "payment_link_template"`);
}
}

View File

@@ -49,7 +49,7 @@ export class DraftOrder {
@Column({ nullable: true })
cart_id: string
@OneToOne(() => Cart)
@OneToOne(() => Cart, { onDelete: "CASCADE" })
@JoinColumn({ name: "cart_id" })
cart: Cart

View File

@@ -50,6 +50,9 @@ export class Store {
@Column({ nullable: true })
swap_link_template: string
@Column({ nullable: true })
payment_link_template: string
@CreateDateColumn({ type: "timestamptz" })
created_at: Date

View File

@@ -229,6 +229,29 @@ class DraftOrderService extends BaseService {
return draftOrder
}
/**
* Deletes draft order idempotently.
* @param {string} draftOrderId - id of draft order to delete
* @return {Promise} empty promise
*/
async delete(draftOrderId) {
return this.atomicPhase_(async manager => {
const draftOrderRepo = manager.getCustomRepository(
this.draftOrderRepository_
)
const draftOrder = await draftOrderRepo.findOne({
where: { id: draftOrderId },
})
if (!draftOrder) return Promise.resolve()
await draftOrderRepo.remove(draftOrder)
return Promise.resolve()
})
}
async listAndCount(
selector,
config = { skip: 0, take: 50, order: { created_at: "DESC" } }
@@ -503,12 +526,25 @@ class DraftOrderService extends BaseService {
draftOrder.status = "completed"
draftOrder.order_id = result.id
console.log(draftOrder)
await draftOrderRepo.save(draftOrder)
return result
})
}
async registerCartCompletion(doId, orderId) {
return this.atomicPhase_(async manager => {
const draftOrderRepo = manager.getCustomRepository(
this.draftOrderRepository_
)
const draftOrder = await this.retrieve(doId)
draftOrder.status = "completed"
draftOrder.order_id = orderId
await draftOrderRepo.save(draftOrder)
})
}
}
export default DraftOrderService

View File

@@ -223,7 +223,14 @@ class PaymentProviderService extends BaseService {
*/
retrieveProvider(providerId) {
try {
const provider = this.container_[`pp_${providerId}`]
let provider
if (providerId === "system") {
console.log(this.container_)
provider = this.container_[`systemPaymentProviderService`]
} else {
provider = this.container_[`pp_${providerId}`]
}
return provider
} catch (err) {
throw new MedusaError(

View File

@@ -6,6 +6,7 @@ class OrderSubscriber {
giftCardService,
totalsService,
orderService,
draftOrderService,
regionService,
}) {
this.manager_ = manager
@@ -17,11 +18,15 @@ class OrderSubscriber {
this.orderService_ = orderService
this.draftOrderService_ = draftOrderService
this.regionService_ = regionService
this.eventBus_ = eventBusService
this.eventBus_.subscribe("order.placed", this.handleOrderPlaced)
this.eventBus_.subscribe("order.placed", this.updateDraftOrder)
}
handleOrderPlaced = async data => {
@@ -54,6 +59,21 @@ class OrderSubscriber {
})
)
}
updateDraftOrder = async data => {
const order = await this.orderService_.retrieve(data.id)
const draftOrder = await this.draftOrderService_.retrieveByCartId(
order.cart_id
)
if (draftOrder) {
await this.draftOrderService_.registerCartCompletion(
draftOrder.id,
order.id
)
}
}
}
export default OrderSubscriber