diff --git a/buf.gen.yaml b/buf.gen.yaml new file mode 100644 index 0000000..32e4268 --- /dev/null +++ b/buf.gen.yaml @@ -0,0 +1,25 @@ +--- +version: v2 +clean: true +managed: + enabled: true + override: + - file_option: go_package_prefix + value: alert/src/stub/go +plugins: + - local: protoc-gen-go-grpc + out: src/stub/go + opt: + - paths=source_relative + - require_unimplemented_servers=false + - local: protoc-gen-go + out: src/stub/go + opt: paths=source_relative + - local: protoc-gen-grpc-gateway + out: src/stub/go + opt: paths=source_relative + - local: protoc-gen-openapiv2 + out: src/stub/swag +inputs: + - git_repo: https://git.kahrobatoken.com/Kahroba/proto.git + branch: v2 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..ced9675 --- /dev/null +++ b/go.mod @@ -0,0 +1,17 @@ +module alert + +go 1.23.2 + +require ( + github.com/BurntSushi/toml v1.4.0 + github.com/kavenegar/kavenegar-go v0.0.0-20240205151018-77039f51467d + github.com/spf13/cobra v1.8.1 + google.golang.org/protobuf v1.35.2 +) + +require ( + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect +) + +replace github.com/kavenegar/kavenegar-go v0.0.0-20240205151018-77039f51467d => github.com/nfel/kavenegar-go v1.0.3 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..b3ebf29 --- /dev/null +++ b/go.sum @@ -0,0 +1,20 @@ +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/nfel/kavenegar-go v1.0.3 h1:ux8YWhG0NmOa0dZpW8cL+qzKusoOewIiw5tufWececU= +github.com/nfel/kavenegar-go v1.0.3/go.mod h1:d+IJ22oTlPtjxl9DMQ4JgqVhnfW1qAfjxkc2UNy98ZY= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/makefile b/makefile new file mode 100644 index 0000000..8f87889 --- /dev/null +++ b/makefile @@ -0,0 +1,46 @@ +.PHONY: all test clean build + +OUT=./tmp/main +GOOS=linux +GOARCH=amd64 +DOCKER_IMG= +DOCKER_REG= +all: tidy build run + +# Ignore +tidy: + @echo -ne "Formating Code \r" + @go fmt ./... + @rm $(OUT) + @go mod tidy -v + @go mod vendor + +test: + @echo -ne "Running Tests \r" + @go test ./... + +build-proto: + @echo -ne "Generating Proto Stubs\r" + @buf generate + +build-docker: + @echo -ne "Generating Docker Image\r" + @docker build . --no-cache -t $(DOCKER_IMG) + @docker tag $(DOCKER_IMG) $(DOCKER_REG)/$(DOCKER_IMG) + +build-bin: + @echo -ne "Building Binary \r" + @if [[ "$OSTYPE" == "linux-gnu" ]]; then\ + go build -o $(OUT) .;\ + else\ + env GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o $(OUT) .;\ + fi + @if ! [ -f "$(OUT)" ]; then\ + echo -ne "could'nt build the binary file. exit the process...";\ + exit 1;\ + fi + +run: + @./$(OUT) serve --conf ./cfg.toml + +build: build-proto build-bin diff --git a/src/cfg/cfg.go b/src/cfg/cfg.go new file mode 100644 index 0000000..30e10e4 --- /dev/null +++ b/src/cfg/cfg.go @@ -0,0 +1,106 @@ +package cfg + +import ( + "log" + "os" + + "github.com/BurntSushi/toml" +) + +var Cfg *Config + +type Config struct { + Version string `toml:"version" json:"version" yaml:"version"` + Environment CfgEnvironment `toml:"environment" json:"environment" yaml:"environment"` + GRPCConnectionTimeOutMinute int `toml:"grpc_connection_timeout_minute" json:"grpc_connection_time_out_minute" yaml:"grpc_connection_time_out_minute"` + SystemWalletAddress string `toml:"system_wallet_address" json:"system_wallet_address" yaml:"system_wallet_address"` + Peers Peer `toml:"peers" json:"peers" yaml:"peers"` + Log LogPath `toml:"log" json:"log" yaml:"log"` + LogLevel LogLevel `toml:"log-level" json:"log_level" yaml:"log_level"` + GRPC ConnectionCfg `toml:"grpc" json:"grpc" yaml:"grpc"` + REST ConnectionCfg `json:"rest" toml:"rest" yaml:"rest"` + DB DBCfg `toml:"db" json:"db" yaml:"db"` + Redis RedisCfg `toml:"redis" json:"redis" yaml:"redis"` + RabbitMQ RabbitMQCfg `toml:"rabbitmq" json:"rabbit_mq" yaml:"rabbit_mq"` + SystemEncryption EncryptionCfg `toml:"system_encryption" json:"system_encryption" yaml:"system_encryption"` + Kavenegar KavenegarCfg `toml:"kavenegar" json:"kavenegar" yaml:"kavenegar"` + MellatIPG IPGCfg `toml:"mellat-ipg" json:"mellat_ipg" yaml:"mellat_ipg"` + ReceiptURL string `toml:"receipt-url" json:"receipt_url" yaml:"receipt_url"` + HardCoded HardCodedCfg `json:"hard_coded" toml:"hard_coded" yaml:"hard_coded"` +} + +type HardCodedCfg struct { + BNPLIDUsedInRedeem uint `toml:"bnpl-id-used-in-redeem" json:"bnplid_used_in_redeem" yaml:"bnplid_used_in_redeem"` + NullBuyAndSellAssetPrice float64 `toml:"null-buy-and-sell-asset-price" json:"null_buy_and_sell_asset_price" yaml:"null_buy_and_sell_asset_price"` +} + +type IPGCfg struct { + // by default is "https://api.kahrobatoken.com/v1/public/wallet/confirm-sale" + BaseUrl string `toml:"base-url" json:"base_url" yaml:"base_url"` + TerminalId int64 `toml:"terminal-id" json:"terminal_id" yaml:"terminal_id"` + UserName string `toml:"username" json:"user_name" yaml:"user_name"` + Password string `toml:"password" json:"password" yaml:"password"` + CallbackUrl string `toml:"callback-url" json:"callback_url" yaml:"callback_url"` +} + +type KavenegarCfg struct { + BaseUrl string `toml:"base-url" json:"base_url" yaml:"base_url"` + ApiKey string `toml:"api-key" json:"api_key" yaml:"api_key"` + Sender string `toml:"sender" json:"sender" yaml:"sender"` + Template string `toml:"template" json:"template" yaml:"template"` +} + +type EncryptionCfg struct { + Public string `toml:"public" json:"public" yaml:"public"` + Private string `toml:"private" json:"private" yaml:"private"` +} + +type RabbitMQCfg struct { + Host string `toml:"host" json:"host" yaml:"host"` + Port int `toml:"port" json:"port" yaml:"port"` + User string `toml:"user" json:"user" yaml:"user"` + Password string `toml:"password" json:"password" yaml:"password"` +} + +type DBCfg struct { + Host string `toml:"host" json:"host" yaml:"host"` + Port int `toml:"port" json:"port" yaml:"port"` + Name string `toml:"name" json:"name" yaml:"name"` + User string `toml:"user" json:"user" yaml:"user"` + Password string `toml:"password" json:"password" yaml:"password"` +} + +type Peer struct { + Wallet string `json:"wallet" toml:"wallet" yaml:"wallet"` + Authorization string `toml:"authorization" json:"authorization" yaml:"authorization"` + Notification string `toml:"notification" json:"notification" yaml:"notification"` +} + +type ConnectionCfg struct { + Port int `toml:"port" json:"port" yaml:"port"` + Host string `toml:"host" json:"host" yaml:"host"` + TLS bool `toml:"tls" json:"tls" yaml:"tls"` +} +type RedisCfg struct { + Host string `toml:"host" json:"host" yaml:"host"` + Port int `toml:"port" json:"port" yaml:"port"` + User string `toml:"user" json:"user" yaml:"user"` + Password string `toml:"password" json:"password" yaml:"password"` + DB int `toml:"db" json:"db" yaml:"db"` +} +type LogPath struct { + Level string `toml:"level" json:"level" yaml:"level"` + ErrorPath string `toml:"error-path" json:"error_path" yaml:"error_path"` + InfoPath string `toml:"info-path" json:"info_path" yaml:"info_path"` + DebugPath string `toml:"debug-path" json:"debug_path" yaml:"debug_path"` +} + +func ParseConfig(path string, dest interface{}) { + content, err := os.ReadFile(path) + if err != nil { + log.Fatalln(err) + } + if _, err := toml.Decode(string(content), dest); err != nil { + log.Fatalln(err) + } +} diff --git a/src/cfg/environment.go b/src/cfg/environment.go new file mode 100644 index 0000000..11ab169 --- /dev/null +++ b/src/cfg/environment.go @@ -0,0 +1,10 @@ +package cfg + +type CfgEnvironment string + +const ( + Local CfgEnvironment = "local" + Development CfgEnvironment = "development" + Staging CfgEnvironment = "staging" + Production CfgEnvironment = "production" +) diff --git a/src/cfg/log.go b/src/cfg/log.go new file mode 100644 index 0000000..f59ef01 --- /dev/null +++ b/src/cfg/log.go @@ -0,0 +1,15 @@ +package cfg + +// LogLevel log level +type LogLevel int + +const ( + // Silent silent log level + Silent LogLevel = iota + 1 + // Error error log level + Error + // Warn warn log level + Warn + // Info info log level + Info +) diff --git a/src/cmd/serve.go b/src/cmd/serve.go new file mode 100644 index 0000000..72c91cc --- /dev/null +++ b/src/cmd/serve.go @@ -0,0 +1,16 @@ +package cmd + +import ( + "github.com/spf13/cobra" +) + +var serveCmd = &cobra.Command{ + Use: "grpc", + Short: "Start the grpc server", + Run: func(cmd *cobra.Command, args []string) { + serveGrpc() + }, +} + +func serveGrpc() { +} diff --git a/src/internal/domain/main.go b/src/internal/domain/main.go new file mode 100644 index 0000000..360ebad --- /dev/null +++ b/src/internal/domain/main.go @@ -0,0 +1,5 @@ +package domain + +func Func() { + println("Hello") +} diff --git a/src/internal/domain/sms/kavenegar/main.go b/src/internal/domain/sms/kavenegar/main.go new file mode 100644 index 0000000..178e1cf --- /dev/null +++ b/src/internal/domain/sms/kavenegar/main.go @@ -0,0 +1,38 @@ +package kavenegar + +import ( + "fmt" + + "alert/src/cfg" + + "github.com/kavenegar/kavenegar-go" +) + +var api *kavenegar.Kavenegar + +func Init() { + _api := kavenegar.New(cfg.Cfg.Kavenegar.ApiKey) + api = _api +} + +func SendMsg() { + sender := "" + receptor := []string{"", ""} + message := "Hello Go!" + if res, err := api.Message.Send(sender, receptor, message, nil); err != nil { + switch err := err.(type) { + case *kavenegar.APIError: + fmt.Println(err.Error()) + case *kavenegar.HTTPError: + fmt.Println(err.Error()) + default: + fmt.Println(err.Error()) + } + } else { + for _, r := range res { + fmt.Println("MessageID = ", r.MessageID) + fmt.Println("Status = ", r.Status) + //... + } + } +} diff --git a/src/main.go b/src/main.go new file mode 100644 index 0000000..da29a2c --- /dev/null +++ b/src/main.go @@ -0,0 +1,4 @@ +package main + +func main() { +} diff --git a/src/ports/grpc/buf.gen.yaml b/src/ports/grpc/buf.gen.yaml new file mode 100644 index 0000000..a3a6f37 --- /dev/null +++ b/src/ports/grpc/buf.gen.yaml @@ -0,0 +1,15 @@ +version: v2 +managed: + enabled: true +plugins: + - remote: buf.build/grpc/go + out: pb + opt: + - paths=source_relative + - require_unimplemented_servers=false + - remote: buf.build/protocolbuffers/go + out: pb + opt: + - paths=source_relative +inputs: + - directory: pb diff --git a/src/ports/grpc/buf.yaml b/src/ports/grpc/buf.yaml new file mode 100644 index 0000000..18ce987 --- /dev/null +++ b/src/ports/grpc/buf.yaml @@ -0,0 +1,9 @@ +version: v2 +lint: + use: + - DEFAULT +breaking: + use: + - FILE +modules: + - path: ./proto/pb diff --git a/src/ports/grpc/main.go b/src/ports/grpc/main.go new file mode 100644 index 0000000..21e034e --- /dev/null +++ b/src/ports/grpc/main.go @@ -0,0 +1 @@ +package grpc diff --git a/src/ports/grpc/proto/.DS_Store b/src/ports/grpc/proto/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/src/ports/grpc/proto/.DS_Store differ diff --git a/src/ports/grpc/proto/README.md b/src/ports/grpc/proto/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/ports/grpc/proto/authorization.proto b/src/ports/grpc/proto/authorization.proto new file mode 100644 index 0000000..bdcb013 --- /dev/null +++ b/src/ports/grpc/proto/authorization.proto @@ -0,0 +1,28 @@ +syntax = "proto3"; + +package authorization; + +import "base_message.proto"; +import "authorization_message.proto"; + +service AuthorizationService { + rpc InternalAuthorizationDeleteCache(base.Empty) returns(base.StatusRes); + rpc InternalInitRoutes(InternalInitRoutesReq) returns (base.StatusRes){} + rpc InternalGetUserIdentityBasic(GetUserReq) returns(UserIdentityBasic){} + rpc InternalGetUserIAM(GetUserReq) returns(InternalIAM){} + rpc CheckIAM(CheckIAMReq) returns (InternalIAM){} + + rpc UserLoginSendOTP(UserSendOtpReq) returns (UserSendOtpRes){} + rpc UserLoginWithOTP(UserLoginReq) returns (UserAccessTokenRes){} + rpc UserGetAccessTokenByRefreshToken(UserRefreshTokenReq) returns (UserAccessTokenRes){} + + rpc UserGetUserPermission(InternalIAM) returns (PermissionList){} + + rpc UserGetIdentity(InternalIAM) returns (Identity){} + rpc UserUpdateIdentity(UserUpdateIdentityReq) returns (base.StatusRes){} + + rpc UserGetBankInfoList(InternalIAM) returns (BankInfoList){} + rpc UserUpdateBankInfo(UserUpdateBankInfoReq) returns (base.StatusRes){} + + rpc GetUser(GetUserReq) returns (User){} +} \ No newline at end of file diff --git a/src/ports/grpc/proto/authorization_message.proto b/src/ports/grpc/proto/authorization_message.proto new file mode 100644 index 0000000..8bbf771 --- /dev/null +++ b/src/ports/grpc/proto/authorization_message.proto @@ -0,0 +1,159 @@ +syntax = "proto3"; + +package authorization; + +/* + Internal + */ + +message InternalInitRoutesReq{ + repeated InternalRoute routes = 1; +} +message InternalRoute { + string path = 1; + string method = 2; + string handler = 3; +} + +/* Role Permission */ +message Role{ + int64 id = 1; + string title = 2; + string Key = 3; + string type = 4; +} +message Permission{ + int64 id = 1; + string title = 2; + string key = 3; + string route = 4; + string method = 5; +} + +message PermissionList { + repeated Permission list = 1; +} + +/* + UserSendOtp + */ + +message UserSendOtpReq { + string mobile = 1; +} +message UserSendOtpRes { + int64 expired_at = 1; +} + +/* + UserLogin + */ + +message UserLoginReq { + string mobile = 1; + string otp_code = 2; +} +message UserRefreshTokenReq { + string refresh_token = 1; +} +message UserAccessTokenRes { + string access_token = 1; + int64 access_expired_at = 2; + string refresh_token = 3; +} + +/* + IAM + */ + +message CheckIAMReq{ + string access_token = 1; + string route = 2; + string method = 3; +} + +message InternalIAM { + User user = 1; + IdentityBasic identity = 2; +} + +/* + User + */ +message GetUserReq { + int64 user_id = 1; + string national_id =2; +} + +message User { + int64 id = 1; + string national_id = 2; + string mobile = 3; + string email = 4; + repeated int64 roles = 5; +} + +message Identity { + string national_id = 1; + string national_serial_id = 2; + string first_name = 3; + string first_name_en = 4; + string last_name = 5; + string last_name_en = 6; + string father_name = 7; + int64 birthdate = 8; + string birthdate_time = 9; + bool is_alive = 10; + int32 gender = 11; + string serial_number = 12; + string serial_type = 13; + string shenasname_number = 14; + string shenasname_seri = 15; + string shenasname_serial = 16; + int32 status = 17; + string updated_at = 18; + string created_at = 19; + string email = 20; + +} + +message IdentityBasic { + string first_name = 1; + string last_name = 2; +} + +message UserIdentityBasic { + int64 id = 1; + string national_id = 2; + string mobile = 3; + string first_name = 4; + string last_name = 5; +} + +message UserUpdateIdentityReq { + InternalIAM iam = 1; + string national_id = 2; + string birthdate = 3; + string email = 4; +} + +message UserUpdateBankInfoReq { + InternalIAM iam = 1; + string deposit_number = 2; + string iban_number = 3; + string card_number = 4; +} + +message BankInfoList { + repeated BankInfo list = 1; +} + +message BankInfo { + int64 id = 1; + string deposit_number = 2; + string iban_number = 3; + string card_number = 4; + int32 status = 5; + string updated_at = 6; + string created_at = 7; +} \ No newline at end of file diff --git a/src/ports/grpc/proto/base_message.proto b/src/ports/grpc/proto/base_message.proto new file mode 100644 index 0000000..aa5b1a7 --- /dev/null +++ b/src/ports/grpc/proto/base_message.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +package base; + +message Empty {} + +message StatusRes { + bool success = 1; +} + +message IdRes { + int64 id = 1; +} +message IdReq { + int64 id = 1; +} \ No newline at end of file diff --git a/src/ports/grpc/proto/wallet.proto b/src/ports/grpc/proto/wallet.proto new file mode 100644 index 0000000..75372a6 --- /dev/null +++ b/src/ports/grpc/proto/wallet.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; + +package wallet; + +import "base_message.proto"; +import "authorization_message.proto"; +import "wallet_message.proto"; + +service WalletService { + rpc InternalWalletDeleteCache(base.Empty) returns(base.StatusRes); + rpc InternalCreateFederation(authorization.InternalIAM) returns(base.StatusRes); + + rpc AdminGetFederation(GetFederationReq) returns(Federation); + rpc UserGetFederation(authorization.InternalIAM) returns(Federation); + + rpc UserGetAssetList(base.Empty) returns(AssetList); + rpc AdminGetAssetList(base.Empty) returns(AssetList); + rpc GetAsset(GetAssetReq) returns(Asset); + + rpc UserInitWallet(UserInitWalletReq) returns(base.StatusRes); + rpc UserGetWalletList(authorization.InternalIAM) returns(WalletList); + rpc UserTransferAsset(UserTransferAssetReq) returns(UserTransferRes); + + rpc UserGetTransactionList(UserGetTransactionListReq) returns(TransactionList); + + rpc SaleGetToken(SaleGetTokenReq) returns(SaleGetTokenRes); + rpc SaleConfirm(SaleConfirmReq) returns(SaleConfirmRes); + rpc AdminManualSaleDeposit(SaleManualReq) returns (base.StatusRes); +} \ No newline at end of file diff --git a/src/ports/grpc/proto/wallet_message.proto b/src/ports/grpc/proto/wallet_message.proto new file mode 100644 index 0000000..457d3c8 --- /dev/null +++ b/src/ports/grpc/proto/wallet_message.proto @@ -0,0 +1,244 @@ +syntax = "proto3"; + +package wallet; + +import "authorization_message.proto"; + +/* + INTERNAL DATA + */ + +message InternalTransactionData { + int64 transaction_id = 1; +} + +/* + Federation +*/ + +message Federation { + int64 id = 1; + int64 user_id = 2; + string ed_public = 3; + string ed_public_hash = 4; + int32 status = 5; + string created_at = 6; + string system_wallet_address = 7; +} + +message GetFederationReq { + optional int64 federation_id = 1; + optional int64 user_id = 2; + optional string ed_public = 3; + optional string ed_public_hash = 4; +} + +/* + Asset +*/ + +message AssetList { + repeated Asset list = 1; +} + + +message Asset { + int64 id = 1; + string name = 2; + string code = 3; + string issuer = 4; + int32 decimal = 5; + double limit_amount = 6; + string anchor = 7; + string image = 8; + string description = 9; + string url = 10; + int64 buy_unit_price = 11; + int64 sell_unit_price = 12; + double buy_min_amount = 13; + double buy_max_amount = 14; + double sell_min_amount = 15; + double sell_max_amount = 16; + double buy_fee_amount = 17; + int64 buy_fee_price = 18; + double sell_fee_amount = 19; + int64 sell_fee_price = 20; + double withdraw_min_amount = 21; + double withdraw_max_amount = 22; + bool is_active = 23; + bool can_buy = 24; + bool can_sell = 25; + bool can_deposit = 26; + bool can_withdraw = 27; + string updated_at = 28; + string created_at = 29; + repeated string images = 30; + int32 status = 31; + AssetMeta meta = 32; +} + +message GetAssetReq { + optional int64 id = 1; + optional string code = 3; +} + +message AssetMeta { + PropertyMeta property = 1; +} + +message PropertyMeta { + string description = 1; + string builder_description = 2; + string white_paper_url = 3; + string expert_report_url = 4; + string project_catalog_url = 5; + string ownership_document_url = 6; + double total_area_meters = 7; + int32 total_unit_count = 8; + string usage_type = 9; + string completion_date = 10; + string user_agreement_url = 11; +} + +/* + Wallet +*/ + +message WalletList { + repeated Wallet list = 1; +} + +message Wallet { + int64 id = 1; + int64 user_id = 2; + int64 asset_id = 3; + Asset asset_info = 4; + int64 federation_id = 5; + Federation federation_info = 6; + double balance = 7; + string updated_at = 8; + string created_at = 9; + string wallet_code = 10; +} + +message UserInitWalletReq { + authorization.InternalIAM iam = 1; + int64 asset_id = 2; +} + +/* + Transaction +*/ + +message TransactionList { + repeated Transaction list = 1; + int64 total_count = 2; +} + +message Transaction { + int64 id = 1; + int64 asset_id = 2; + Asset asset_info = 3; + optional int64 from_user_id = 4; + optional authorization.UserIdentityBasic from_user_info = 5; + optional int64 from_federation_id = 6; + optional Federation from_federation_info = 7; + optional int64 to_user_id = 8; + optional authorization.UserIdentityBasic to_user_info = 9; + optional int64 to_federation_id = 10; + optional Federation to_federation_info = 11; + double amount = 12; + int32 status = 13; + int32 type = 14; + string updated_at = 15; + string created_at = 16; + string tracking_code = 17; +} + +message UserGetTransactionListReq { + authorization.InternalIAM iam = 1; + optional int32 page_index = 2; + optional int32 page_size = 3; + optional int64 id = 4; + optional int64 asset_id = 5; + optional int64 from_user_id = 6; + optional int64 from_federation_id = 7; + optional int64 to_user_id = 8; + optional int64 to_federation_id = 9; + optional double amount_from = 10; + optional double amount_to = 11; + optional int32 status = 12; + optional int32 type = 13; + optional string tracking_code = 14; +} +/* + Buy +*/ + +message UserBuyAssetReq { + authorization.InternalIAM iam = 1; + int64 asset_id = 2; + double amount = 3; +} + +/* + Sell +*/ + +/* + Transfer +*/ + +message UserTransferAssetReq { + authorization.InternalIAM iam = 1; + int64 asset_id = 2; + double amount = 3; + string to_wallet_address = 4; + string to_wallet_memo = 5; +} + +message UserTransferRes { + int64 transaction_id = 1; + string tracking_code = 2; +} + +// represent the information regarding the sale of the token +message SaleGetTokenReq { + authorization.InternalIAM iam = 1; + int64 asset_id = 2; + double amount = 3; +} + +// represent the information regarding the ipg gateway +message SaleGetTokenRes { + string url = 1; + int64 unit_price = 2; + int64 total_price = 3; + double amount = 4; + string asset = 5; +} + +message SaleConfirmReq { + string RefId=1; + string ResCode=2; + string SaleOrderId=3; + string SaleReferenceId=4; + string CardHolderInfo=5; + string CardHolderPan=6; + string FinalAmount=7; +} + +message SaleConfirmRes { + string receiptLink=1; +} + +message SaleManualReq { + authorization.InternalIAM iam = 1; + int64 asset_id = 2; + double amount = 3; + string paid_at = 4; + string rrn = 5; + string national_id = 6; +} + + diff --git a/src/ports/rest/main.go b/src/ports/rest/main.go new file mode 100644 index 0000000..6a44bd2 --- /dev/null +++ b/src/ports/rest/main.go @@ -0,0 +1,7 @@ +/* +package rpc is meant to communicate with other microservices via RPC (like AMQP) +*/ +package rest + +func Execute() { +} diff --git a/src/ports/rpc/docs.go b/src/ports/rpc/docs.go new file mode 100644 index 0000000..c755592 --- /dev/null +++ b/src/ports/rpc/docs.go @@ -0,0 +1,4 @@ +/* +package rpc is meant to communicate with other microservices via RPC (like AMQP) +*/ +package rpc