Add ExtendProductWithProviders().

This commit is contained in:
Gucheng Wang
2022-08-07 15:44:57 +08:00
parent 2ea58cd639
commit 32b4d98c2a
4 changed files with 19 additions and 43 deletions

View File

@ -92,7 +92,6 @@ p, *, *, POST, /api/buy-product, *, *
p, *, *, GET, /api/get-payment, *, * p, *, *, GET, /api/get-payment, *, *
p, *, *, POST, /api/update-payment, *, * p, *, *, POST, /api/update-payment, *, *
p, *, *, POST, /api/invoice-payment, *, * p, *, *, POST, /api/invoice-payment, *, *
p, *, *, GET, /api/get-providers, *, *
p, *, *, POST, /api/notify-payment, *, * p, *, *, POST, /api/notify-payment, *, *
p, *, *, POST, /api/unlink, *, * p, *, *, POST, /api/unlink, *, *
p, *, *, POST, /api/set-password, *, * p, *, *, POST, /api/set-password, *, *

View File

@ -58,7 +58,10 @@ func (c *ApiController) GetProducts() {
func (c *ApiController) GetProduct() { func (c *ApiController) GetProduct() {
id := c.Input().Get("id") id := c.Input().Get("id")
c.Data["json"] = object.GetProduct(id) product := object.GetProduct(id)
object.ExtendProductWithProviders(product)
c.Data["json"] = product
c.ServeJSON() c.ServeJSON()
} }

View File

@ -38,6 +38,8 @@ type Product struct {
ReturnUrl string `xorm:"varchar(1000)" json:"returnUrl"` ReturnUrl string `xorm:"varchar(1000)" json:"returnUrl"`
State string `xorm:"varchar(100)" json:"state"` State string `xorm:"varchar(100)" json:"state"`
ProviderObjs []*Provider `xorm:"-" json:"providerObjs"`
} }
func GetProductCount(owner, field, value string) int { func GetProductCount(owner, field, value string) int {
@ -209,3 +211,14 @@ func BuyProduct(id string, providerName string, user *User, host string) (string
return payUrl, err return payUrl, err
} }
func ExtendProductWithProviders(product *Product) {
product.ProviderObjs = []*Provider{}
m := getProviderMap(product.Owner)
for _, providerItem := range product.Providers {
if provider, ok := m[providerItem]; ok {
product.ProviderObjs = append(product.ProviderObjs, provider)
}
}
}

View File

@ -16,7 +16,6 @@ import React from "react";
import {Button, Descriptions, Spin} from "antd"; import {Button, Descriptions, Spin} from "antd";
import i18next from "i18next"; import i18next from "i18next";
import * as ProductBackend from "./backend/ProductBackend"; import * as ProductBackend from "./backend/ProductBackend";
import * as ProviderBackend from "./backend/ProviderBackend";
import * as Setting from "./Setting"; import * as Setting from "./Setting";
class ProductBuyPage extends React.Component { class ProductBuyPage extends React.Component {
@ -26,14 +25,12 @@ class ProductBuyPage extends React.Component {
classes: props, classes: props,
productName: props.match?.params.productName, productName: props.match?.params.productName,
product: null, product: null,
providers: [],
isPlacingOrder: false, isPlacingOrder: false,
}; };
} }
UNSAFE_componentWillMount() { UNSAFE_componentWillMount() {
this.getProduct(); this.getProduct();
this.getPaymentProviders();
} }
getProduct() { getProduct() {
@ -45,15 +42,6 @@ class ProductBuyPage extends React.Component {
}); });
} }
getPaymentProviders() {
ProviderBackend.getProviders("admin")
.then((res) => {
this.setState({
providers: res.filter(provider => provider.category === "Payment"),
});
});
}
getProductObj() { getProductObj() {
if (this.props.product !== undefined) { if (this.props.product !== undefined) {
return this.props.product; return this.props.product;
@ -86,32 +74,6 @@ class ProductBuyPage extends React.Component {
return `${this.getCurrencySymbol(product)}${product?.price} (${this.getCurrencyText(product)})`; return `${this.getCurrencySymbol(product)}${product?.price} (${this.getCurrencyText(product)})`;
} }
getProviders(product) {
if (this.state.providers.length === 0 || product.providers.length === 0) {
return [];
}
let providerMap = {};
this.state.providers.forEach(provider => {
providerMap[provider.name] = provider;
});
return product.providers.map(providerName => providerMap[providerName]);
}
getPayUrl(product, provider) {
if (product === null || provider === null) {
return "";
}
return `https://${provider.type}`;
// if (provider.type === "WeChat") {
// return `${endpoint}?client_id=${provider.clientId}&redirect_uri=${redirectUri}&scope=${scope}&response_type=code&state=${state}`;
// } else if (provider.type === "GitHub") {
// return `${endpoint}?client_id=${provider.clientId}&redirect_uri=${redirectUri}&scope=${scope}&response_type=code&state=${state}`;
// }
}
buyProduct(product, provider) { buyProduct(product, provider) {
this.setState({ this.setState({
isPlacingOrder: true, isPlacingOrder: true,
@ -176,12 +138,11 @@ class ProductBuyPage extends React.Component {
if (product.state !== "Published") { if (product.state !== "Published") {
return i18next.t("product:This product is currently not in sale."); return i18next.t("product:This product is currently not in sale.");
} }
if (product.providers.length === 0) { if (product.providerObjs.length === 0) {
return i18next.t("product:There is no payment channel for this product."); return i18next.t("product:There is no payment channel for this product.");
} }
const providers = this.getProviders(product); return product.providerObjs.map(provider => {
return providers.map(provider => {
return this.renderProviderButton(provider, product); return this.renderProviderButton(provider, product);
}); });
} }