bestchains / bestchains-contracts

Bestchains contracts is a library for secure smart contract development.
Apache License 2.0
2 stars 3 forks source link

add code generator #22

Open bjwswang opened 1 year ago

bjwswang commented 1 year ago
  1. Contract call code generator with this FabricClient

  2. Restful API handlers with Fiber

bjwswang commented 1 year ago

Sample for Contract call generator

package main

import (
    "github.com/bestchains/bc-explorer/pkg/network"
    "github.com/bestchains/bestchains-contracts/library"
    gwclient "github.com/hyperledger/fabric-gateway/pkg/client"
    "github.com/pkg/errors"
)

// Code Generator
type Basic struct {
    contract *gwclient.Contract
}

func NewBasic(client *network.FabricClient, contract string) (*Basic, error) {
    if client == nil || contract == "" {
        return nil, errors.New("invalid arguments")
    }

    basic := &Basic{
        contract: client.Channel("").GetContract(contract),
    }

    return basic, nil
}

func (basic *Basic) Total() (uint64, error) {
    result, err := basic.contract.EvaluateTransaction("Total")
    if err != nil {
        return 0, err
    }
    return library.BytesToUint64(result)
}

func (basic *Basic) PutValue(val string) (string, error) {
    kid, err := basic.contract.SubmitTransaction("PutValue", val)
    if err != nil {
        return "", err
    }

    return string(kid), nil
}

func (basic *Basic) GetValueByIndex(index string) (string, error) {
    result, err := basic.contract.EvaluateTransaction("GetValueByIndex", index)
    if err != nil {
        return "", err
    }
    return string(result), nil
}

func (basic *Basic) GetValueByKID(kid string) (string, error) {
    result, err := basic.contract.EvaluateTransaction("GetValueByKID", kid)
    if err != nil {
        return "", err
    }
    return string(result), nil
}
bjwswang commented 1 year ago

Sample for Fiber handler

package main

import (
    "github.com/gofiber/fiber/v2"
)

type KeyValue struct {
    Index string `json:"index,omitempty"`
    KID   string `json:"kid,omitempty"`
    Value string `json:"value,omitempty"`
}

type handler struct {
    basic *Basic
}

func NewBasicHandler(basic *Basic) handler {
    return handler{
        basic: basic,
    }
}

func (h *handler) Total(ctx *fiber.Ctx) error {
    total, err := h.basic.Total()
    if err != nil {
        return fiber.NewError(fiber.StatusInternalServerError, err.Error())
    }
    return ctx.JSON(map[string]interface{}{
        "total": total,
    })
}

func (h *handler) PutValue(ctx *fiber.Ctx) error {
    var err error

    kv := new(KeyValue)
    err = ctx.BodyParser(kv)
    if err != nil {
        return fiber.NewError(fiber.StatusBadRequest, err.Error())
    }

    kid, err := h.basic.PutValue(kv.Value)
    if err != nil {
        return fiber.NewError(fiber.StatusInternalServerError, err.Error())
    }

    return ctx.JSON(&KeyValue{
        KID: kid,
    })

}

func (h *handler) GetValueByIndex(ctx *fiber.Ctx) error {
    index := ctx.Params("index")
    value, err := h.basic.GetValueByIndex(index)
    if err != nil {
        return fiber.NewError(fiber.StatusInternalServerError, err.Error())
    }
    return ctx.JSON(&KeyValue{
        Index: index,
        Value: value,
    })
}

func (h *handler) GetValueByKID(ctx *fiber.Ctx) error {
    kid := ctx.Params("kid")
    value, err := h.basic.GetValueByKID(kid)
    if err != nil {
        return fiber.NewError(fiber.StatusInternalServerError, err.Error())
    }
    return ctx.JSON(&KeyValue{
        KID:   kid,
        Value: value,
    })
}
bjwswang commented 1 year ago

any possible to integrate AI with this auto generator ?