diff --git a/.gitignore b/.gitignore index 485dee6..2b6839d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .idea +gen/go +stub diff --git a/auth/v1/msg.proto b/auth/v1/msg.proto index 1a05e2e..270e4d5 100644 --- a/auth/v1/msg.proto +++ b/auth/v1/msg.proto @@ -1,11 +1,210 @@ syntax = "proto3"; package auth.v1; -// option go_package="auth/v1"; -import "base/v1/msg.proto"; +/* + Internal +*/ -message IdReq { - int64 id = 1; - base.v1.Empty empty=2; +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; + repeated Company company = 3; +} +message IdReqWithIAM { + int64 id = 1; + InternalIAM iam = 2; +} +message ReqWithIAMAndParams { + InternalIAM iam = 1; + optional bool accepted = 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 Company { + int64 id = 1; + string name = 2; + string name_fa = 3; + string location = 4; + bool can_provide_bnpl = 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; + string mobile = 21; + optional Company company = 22; + optional string employee_info = 23; +} + +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; +} + +// Status 0: Fail Verify, 1: Verified, 2: Does not Match user's credential +enum BankInfoStatusEnum { + FAIL_VERIFY = 0; + VERIFIED = 1; + DOES_NOT_MATCH = 2; +} +message BankInfo { + int64 id = 1; + string deposit_number = 2; + string iban_number = 3; + string card_number = 4; + BankInfoStatusEnum status = 5; + string updated_at = 6; + string created_at = 7; +} + +/* Two Factor Authentication */ +message IdReqWithIAMAndTFA { + int64 id = 1; + InternalIAM iam = 2; + string tfa_code = 3; +} +message TFAReq { + InternalIAM iam = 1; + optional string mobile = 2; + optional string email = 3; + optional string reason = 4; // issued jwt reason -> can be login, redeem, withdrawal +} + +// Two Factor Authentication Exchange Response +message TFAExRes { + InternalIAM iam = 1; + string secret = 2; + string qrcode_base64 = 3; +} +message CheckTFAReq { + InternalIAM iam = 1; + string code = 2; + optional string algorithm = 3; + optional string reason = 4; // Can be later used as a lookup } diff --git a/auth/v1/srv.proto b/auth/v1/srv.proto new file mode 100644 index 0000000..71f11de --- /dev/null +++ b/auth/v1/srv.proto @@ -0,0 +1,38 @@ +syntax = "proto3"; + +package auth.v1; + +import "auth/v1/msg.proto"; +import "base/v1/msg.proto"; + +service AuthorizationService { + rpc InternalAuthorizationDeleteCache(base.v1.Empty) returns (base.v1.StatusRes); + rpc InternalInitRoutes(InternalInitRoutesReq) returns (base.v1.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.v1.StatusRes) {} + + rpc UserGetBankInfoList(ReqWithIAMAndParams) returns (BankInfoList) {} + rpc UserUpdateBankInfo(UserUpdateBankInfoReq) returns (base.v1.StatusRes) {} + rpc UserRemoveBankInfo(IdReqWithIAM) returns (base.v1.StatusRes) {} + + rpc GetUser(GetUserReq) returns (User) {} + + // Two Factor Authentication + // For now it's only SMS-OTP - later will be Email-OTP or other methods can be + // added For HMAC-OTP there won't be a need to call this api + rpc SendTFAReq(TFAReq) returns (base.v1.StatusRes) {} + // For HMAC-OTP an initialization step must be added to exchange keys + rpc InitTFAReq(InternalIAM) returns (TFAExRes) {} + rpc CheckTFACode(CheckTFAReq) returns (base.v1.StatusRes) {} +} diff --git a/base/v1/msg.proto b/base/v1/msg.proto index 150bd15..9dc85cd 100644 --- a/base/v1/msg.proto +++ b/base/v1/msg.proto @@ -2,8 +2,6 @@ syntax = "proto3"; package base.v1; -// option go_package = "base/v1"; - message Empty {} message StatusRes { diff --git a/buf.gen.yaml b/buf.gen.yaml index 322b59e..5746cee 100644 --- a/buf.gen.yaml +++ b/buf.gen.yaml @@ -5,20 +5,41 @@ managed: enabled: true override: - file_option: go_package_prefix - value: ${package_name} + # FIXME: Change this to you're go.mod package name + value: github.com/nfel plugins: + # NOTE: golang + - remote: buf.build/grpc/go + # NOTE: grpc # go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest - # -remote buf.build/grpc/go - - local: protoc-gen-go-grpc - out: gen/go - opt: paths=source_relative + # - local: protoc-gen-go-grpc + out: stub/go + # NOTE: PB files # go install google.golang.org/protobuf/cmd/protoc-gen-go@latest - # -remote: buf.build/protocolbuffers/go:v1.31.0 - - local: protoc-gen-go - out: gen/go - opt: paths=source_relative + # - local: protoc-gen-go + - remote: buf.build/protocolbuffers/go:v1.30.0 + out: stub/go + # NOTE: doc + - local: protoc-gen-doc + opt: html,index.html,source_relative + out: stub/doc + # NOTE: Gateway + # - remote: buf.build/grpc-ecosystem/gateway:v2.16.2 + - local: protoc-gen-grpc-gateway + out: stub/go + # NOTE: SWAGGER json files + # - remote: buf.build/grpc-ecosystem/openapiv2:v2.16.2 + - local: protoc-gen-openapiv2 + opt: import_prefix=github.com/nfel + out: stub/go + # - local: protoc-gen-go-gin + # opt: + # # - plugin=handler + # # - plugin=service + # # - plugin=mix + # out: stub/go inputs: - # - directory: ./ - - git_repo: ssh://git@5.34.204.11/Kahroba/proto - branch: v2 + - directory: ./ + # - git_repo: ssh://git@5.34.204.11/Kahroba/proto + # branch: v2 diff --git a/buf.yaml b/buf.yaml index 948e927..5c77bb7 100644 --- a/buf.yaml +++ b/buf.yaml @@ -6,6 +6,9 @@ breaking: - PACKAGE lint: use: - - STANDARD + - BASIC + - PACKAGE_SAME_GO_PACKAGE + - PACKAGE_NO_IMPORT_CYCLE + - IMPORT_USED modules: - path: ./ diff --git a/template.buf.gen.yaml b/template.buf.gen.yaml new file mode 100644 index 0000000..ad3cf25 --- /dev/null +++ b/template.buf.gen.yaml @@ -0,0 +1,24 @@ +--- +version: v2 +clean: true +managed: + enabled: true + override: + - file_option: go_package_prefix + value: +plugins: + - remote: buf.build/grpc/go + out: stub/go + - remote: buf.build/protocolbuffers/go:v1.30.0 + out: stub/go + - local: protoc-gen-doc + opt: html,index.html,source_relative + out: stub/doc + - local: protoc-gen-grpc-gateway + out: stub/go + - local: protoc-gen-openapiv2 + out: stub/go +inputs: + - git_repo: ssh://git@5.34.204.11/Kahroba/proto + branch: v2 + diff --git a/wallet/v1/msg.proto b/wallet/v1/msg.proto new file mode 100644 index 0000000..cbf60d3 --- /dev/null +++ b/wallet/v1/msg.proto @@ -0,0 +1,379 @@ +syntax = "proto3"; + +package wallet.v1; + +import "auth/v1/msg.proto"; +import "base/v1/msg.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; +} + +/* + BNPL - not really but close name +*/ + +// enum BNPLPgState { +// +// } + +message GetUserBNPLInfoReq { + auth.v1.InternalIAM iam = 1; + base.v1.IdReq id = 2; +} + +enum BNPLPaymentsStatus { + PENDING_PAYMENT = 0; + PAYED = 1; + OVER_DUE = 2; + NOT_STARTED = 3; + NOT_YET_DUE = 4; + CANCELED = 5; +} +message BNPLPayments { + uint64 id = 1; + double amount = 2; + double amount_irr = 7; + bool is_paied = 3; + string due_date = 4; + string settlement_date = 5; + BNPLPaymentsStatus status = 6; +} + +message UserBNPLResp { + uint64 id = 1; + BNPLInfo bnpl = 2; + int32 current_step = 3; + optional float amount = 4; + optional PaymentPeriodInfo payment_period = 5; + optional bool accepted_terms = 6; + repeated BNPLPayments payments = 7; + optional string employee_id = 8; + optional auth.v1.Company company = 10; + auth.v1.InternalIAM iam = 11; + optional string updated_at = 12; + optional string created_at = 13; + Asset selected_asset = 14; +} + +message UserBNPLReq { + uint64 id = 1; + int64 bnpl_id = 2; + auth.v1.InternalIAM iam = 6; + optional string created_at = 3; + optional string employee_id = 4; + optional int64 company_id = 5; + optional float amount = 7; + optional PaymentPeriodInfo payment_period = 8; + optional bool has_agreed_contract = 9; + optional int32 current_step = 10; //Can be useful for admin to change the current step + optional int64 asset_id = 11; +} + +message PaymentPeriodInfo { + uint64 id = 1; + uint64 period = 2; + bool enabled = 3; +} +message BNPLInfo { + uint64 id = 1; + string description = 3; + repeated Asset supported_assets = 2; + optional bool enabled = 4; + float amount_start = 5; + float amount_end = 6; + float amount_steps = 7; + repeated PaymentPeriodInfo payment_period = 8; + repeated auth.v1.Company possible_companies = 11; + string updated_at = 12; + string created_at = 13; + string expires_at = 14; +} +message BNPLList { + repeated BNPLInfo list = 1; +} + +/* + 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 { + auth.v1.InternalIAM iam = 1; + int64 asset_id = 2; +} + +/* + Transaction +*/ + +message TransactionList { + repeated Transaction list = 1; + int64 total_count = 2; +} + +enum TransactionType { + UNKNOWN = 0; + BUY = 1; + SELL = 2; + TRANSFER = 3; + REDEEM = 4; +} +enum TransactionStatus { + UNDETERMINED = 0; + FAILED = -10; + SUSPENDED = -9; + CREATED = -1; + PENDING_TRX = 1; + SUCCESSFUL = 2; +} + +message Transaction { + int64 id = 1; + int64 asset_id = 2; + // Asset asset_info = 3; //Causing network overloading + optional int64 from_user_id = 4; + optional auth.v1.UserIdentityBasic from_user_info = 5; + optional int64 from_federation_id = 6; + optional Federation from_federation_info = 7; + optional int64 to_user_id = 8; + optional auth.v1.UserIdentityBasic to_user_info = 9; + optional int64 to_federation_id = 10; + optional Federation to_federation_info = 11; + double amount = 12; + TransactionStatus status = 13; + TransactionType type = 14; + string updated_at = 15; + string created_at = 16; + string tracking_code = 17; +} + +message UserGetTransactionListReq { + auth.v1.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 TransactionStatus status = 12; + optional TransactionType type = 13; + optional string tracking_code = 14; +} +/* + Buy +*/ + +message UserBuyAssetReq { + auth.v1.InternalIAM iam = 1; + int64 asset_id = 2; + double amount = 3; +} + +/* + Sell +*/ + +/* + Transfer +*/ + +message UserTransferAssetReq { + auth.v1.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 { + auth.v1.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 ref_id = 1; + string res_code = 2; + string sale_order_id = 3; + string sale_reference_id = 4; + string card_holder_info = 5; + string card_holder_pan = 6; + string final_amount = 7; +} + +message SaleConfirmRes { + string receipt_link = 1; +} + +message SaleManualReq { + auth.v1.InternalIAM iam = 1; + int64 asset_id = 2; + double amount = 3; + string paid_at = 4; + string rrn = 5; + string national_id = 6; +} + +/* + Redeem Token +*/ +message RedeemTokenReq { + auth.v1.InternalIAM iam = 1; + int64 asset_id = 2; + uint64 bank_info_id = 3; + double amount = 4; + optional string tfa_code = 5; +} +message CalculateRedeemTokenRes { + Asset asset = 1; + double free_balance = 2; + double total_balance = 3; + double request_amount = 4; + double profit_capital = 5; + double user_capital = 6; + optional auth.v1.BankInfo bank_info = 7; +} +message RedeemTokenRes { + uint64 id = 1; + int64 user_id = 2; + Asset asset = 3; + double free_balance = 4; + double total_balance = 5; + double request_amount = 6; + string created_at = 7; + bool is_paied = 8; + // receipt.Receipt receipt = 8; + double calculated_profit = 9; + optional auth.v1.BankInfo bank_info = 10; + optional string receipt = 11; +} +message RedeemTokenResList { + repeated RedeemTokenRes list = 1; +} diff --git a/wallet/v1/srv.proto b/wallet/v1/srv.proto new file mode 100644 index 0000000..340d497 --- /dev/null +++ b/wallet/v1/srv.proto @@ -0,0 +1,42 @@ +syntax = "proto3"; + +package wallet.v1; + +import "auth/v1/msg.proto"; +import "base/v1/msg.proto"; +import "wallet/v1/msg.proto"; + +service WalletService { + rpc InternalWalletDeleteCache(base.v1.Empty) returns (base.v1.StatusRes); + rpc InternalCreateFederation(auth.v1.InternalIAM) returns (base.v1.StatusRes); + + rpc AdminGetFederation(GetFederationReq) returns (Federation); + rpc UserGetFederation(auth.v1.InternalIAM) returns (Federation); + + rpc UserGetAssetList(base.v1.Empty) returns (AssetList); + rpc AdminGetAssetList(base.v1.Empty) returns (AssetList); + rpc GetAsset(GetAssetReq) returns (Asset); + + rpc UserInitWallet(UserInitWalletReq) returns (base.v1.StatusRes); + rpc UserGetWalletList(auth.v1.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.v1.StatusRes); + + // BNPL + rpc GetBNPLList(base.v1.Empty) returns (BNPLList); + rpc GetBNPLInfo(base.v1.IdReq) returns (BNPLInfo); + rpc GetUserBNPLInfo(GetUserBNPLInfoReq) returns (UserBNPLResp); + rpc SubmitBNPLForm(UserBNPLReq) returns (base.v1.StatusRes); + rpc UpdateBNPL(UserBNPLReq) returns (base.v1.StatusRes); + rpc CancleBNPL(auth.v1.IdReqWithIAM) returns (base.v1.StatusRes); + + // Redeem Token + rpc CalculateRedeemToken(RedeemTokenReq) returns (CalculateRedeemTokenRes); + rpc RedeemToken(RedeemTokenReq) returns (base.v1.StatusRes); + rpc RedeemTokenList(auth.v1.ReqWithIAMAndParams) returns (RedeemTokenResList); +}