diff --git a/authz/authz.go b/authz/authz.go index 2473d9c7..462eacea 100644 --- a/authz/authz.go +++ b/authz/authz.go @@ -92,7 +92,6 @@ p, *, *, POST, /api/buy-product, *, * p, *, *, GET, /api/get-payment, *, * p, *, *, POST, /api/update-payment, *, * p, *, *, POST, /api/invoice-payment, *, * -p, *, *, GET, /api/get-providers, *, * p, *, *, POST, /api/notify-payment, *, * p, *, *, POST, /api/unlink, *, * p, *, *, POST, /api/set-password, *, * diff --git a/controllers/product.go b/controllers/product.go index fa29e80d..2e2a7c4f 100644 --- a/controllers/product.go +++ b/controllers/product.go @@ -58,7 +58,10 @@ func (c *ApiController) GetProducts() { func (c *ApiController) GetProduct() { id := c.Input().Get("id") - c.Data["json"] = object.GetProduct(id) + product := object.GetProduct(id) + object.ExtendProductWithProviders(product) + + c.Data["json"] = product c.ServeJSON() } diff --git a/object/product.go b/object/product.go index 6548acc7..7b85f5b4 100644 --- a/object/product.go +++ b/object/product.go @@ -38,6 +38,8 @@ type Product struct { ReturnUrl string `xorm:"varchar(1000)" json:"returnUrl"` State string `xorm:"varchar(100)" json:"state"` + + ProviderObjs []*Provider `xorm:"-" json:"providerObjs"` } 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 } + +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) + } + } +} diff --git a/web/src/ProductBuyPage.js b/web/src/ProductBuyPage.js index 3c62f168..34e76d44 100644 --- a/web/src/ProductBuyPage.js +++ b/web/src/ProductBuyPage.js @@ -16,7 +16,6 @@ import React from "react"; import {Button, Descriptions, Spin} from "antd"; import i18next from "i18next"; import * as ProductBackend from "./backend/ProductBackend"; -import * as ProviderBackend from "./backend/ProviderBackend"; import * as Setting from "./Setting"; class ProductBuyPage extends React.Component { @@ -26,14 +25,12 @@ class ProductBuyPage extends React.Component { classes: props, productName: props.match?.params.productName, product: null, - providers: [], isPlacingOrder: false, }; } UNSAFE_componentWillMount() { this.getProduct(); - this.getPaymentProviders(); } 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() { if (this.props.product !== undefined) { return this.props.product; @@ -86,32 +74,6 @@ class ProductBuyPage extends React.Component { 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) { this.setState({ isPlacingOrder: true, @@ -176,12 +138,11 @@ class ProductBuyPage extends React.Component { if (product.state !== "Published") { 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."); } - const providers = this.getProviders(product); - return providers.map(provider => { + return product.providerObjs.map(provider => { return this.renderProviderButton(provider, product); }); }