2025-01-29 19:12:54 +08:00

61 lines
1.5 KiB
Go

package services
import (
"context"
"fmt"
"time"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/gap"
wproto "git.solsynth.dev/hypernet/wallet/pkg/proto"
"github.com/rs/zerolog/log"
"github.com/samber/lo"
)
const DiscountFileSize = 52428800 // 50 MiB
// PlaceOrder create a transaction if needed for user
// Pricing according here: https://kb.solsynth.dev/solar-network/wallet#file-uploads
func PlaceOrder(user uint, filesize int64, withDiscount bool) error {
if filesize <= DiscountFileSize && withDiscount {
// Discount included
return nil
}
var amount float64
if withDiscount {
billableSize := filesize - DiscountFileSize
amount = float64(billableSize) / 1024 / 1024 * 1
} else if filesize > DiscountFileSize {
amount = 50 + float64(filesize-DiscountFileSize)/1024/1024*5
} else {
amount = float64(filesize) / 1024 / 1024 * 1
}
if !withDiscount {
amount += 10 // Service fee
}
conn, err := gap.Nx.GetClientGrpcConn("wa")
if err != nil {
return fmt.Errorf("unable to connect wallet: %v", err)
}
wc := wproto.NewPaymentServiceClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)
defer cancel()
resp, err := wc.MakeTransactionWithAccount(ctx, &wproto.MakeTransactionWithAccountRequest{
PayerAccountId: lo.ToPtr(uint64(user)),
Amount: amount,
Remark: "File Uploading Fee",
})
if err != nil {
return err
}
log.Info().
Uint64("transaction", resp.Id).Float64("amount", amount).Bool("discount", withDiscount).
Msg("Order placed for charge file uploading fee...")
return nil
}