Added ownership reference + wallet creation methods
This commit is contained in:
11
api/pkg/db/chainassets/assets.go
Normal file
11
api/pkg/db/chainassets/assets.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package chainassets
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/tech/sendico/pkg/model"
|
||||
)
|
||||
|
||||
type DB interface {
|
||||
Resolve(ctx context.Context, chainAsset model.ChainAssetKey) (*model.ChainAssetDescription, error)
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package db
|
||||
import (
|
||||
"github.com/tech/sendico/pkg/auth"
|
||||
"github.com/tech/sendico/pkg/db/account"
|
||||
"github.com/tech/sendico/pkg/db/chainassets"
|
||||
"github.com/tech/sendico/pkg/db/confirmation"
|
||||
mongoimpl "github.com/tech/sendico/pkg/db/internal/mongo"
|
||||
"github.com/tech/sendico/pkg/db/invitation"
|
||||
@@ -22,6 +23,8 @@ type Factory interface {
|
||||
NewRefreshTokensDB() (refreshtokens.DB, error)
|
||||
NewConfirmationsDB() (confirmation.DB, error)
|
||||
|
||||
NewChainAsstesDB() (chainassets.DB, error)
|
||||
|
||||
NewAccountDB() (account.DB, error)
|
||||
NewOrganizationDB() (organization.DB, error)
|
||||
NewInvitationsDB() (invitation.DB, error)
|
||||
|
||||
73
api/pkg/db/internal/mongo/chainassetsdb/db.go
Normal file
73
api/pkg/db/internal/mongo/chainassetsdb/db.go
Normal file
@@ -0,0 +1,73 @@
|
||||
package chainassetsdb
|
||||
|
||||
import (
|
||||
ri "github.com/tech/sendico/pkg/db/repository/index"
|
||||
"github.com/tech/sendico/pkg/db/template"
|
||||
"github.com/tech/sendico/pkg/mlogger"
|
||||
"github.com/tech/sendico/pkg/model"
|
||||
"github.com/tech/sendico/pkg/mservice"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
type ChainAssetsDB struct {
|
||||
template.DBImp[*model.ChainAssetDescription]
|
||||
}
|
||||
|
||||
func Create(logger mlogger.Logger, db *mongo.Database) (*ChainAssetsDB, error) {
|
||||
p := &ChainAssetsDB{
|
||||
DBImp: *template.Create[*model.ChainAssetDescription](logger, mservice.ChainAssets, db),
|
||||
}
|
||||
|
||||
// 1) Canonical lookup: enforce single (chain, tokenSymbol)
|
||||
if err := p.Repository.CreateIndex(&ri.Definition{
|
||||
Name: "idx_chain_symbol",
|
||||
Unique: true,
|
||||
Keys: []ri.Key{
|
||||
{Field: "asset.chain", Sort: ri.Asc},
|
||||
{Field: "asset.tokenSymbol", Sort: ri.Asc},
|
||||
},
|
||||
}); err != nil {
|
||||
p.Logger.Error("failed index (chain, symbol) unique", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 2) Prevent duplicate contracts inside the same chain, but only when contract exists
|
||||
if err := p.Repository.CreateIndex(&ri.Definition{
|
||||
Name: "idx_chain_contract_unique",
|
||||
Unique: true,
|
||||
Sparse: true,
|
||||
Keys: []ri.Key{
|
||||
{Field: "asset.chain", Sort: ri.Asc},
|
||||
{Field: "asset.contractAddress", Sort: ri.Asc},
|
||||
},
|
||||
}); err != nil {
|
||||
p.Logger.Error("failed index (chain, contract) unique", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 3) Fast contract lookup, skip docs without contractAddress (native assets)
|
||||
if err := p.Repository.CreateIndex(&ri.Definition{
|
||||
Name: "idx_contract_lookup",
|
||||
Sparse: true,
|
||||
Keys: []ri.Key{
|
||||
{Field: "asset.contractAddress", Sort: ri.Asc},
|
||||
},
|
||||
}); err != nil {
|
||||
p.Logger.Error("failed index contract lookup", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 4) List assets per chain
|
||||
if err := p.Repository.CreateIndex(&ri.Definition{
|
||||
Name: "idx_chain_list",
|
||||
Keys: []ri.Key{
|
||||
{Field: "asset.chain", Sort: ri.Asc},
|
||||
},
|
||||
}); err != nil {
|
||||
p.Logger.Error("failed index chain list", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return p, nil
|
||||
}
|
||||
18
api/pkg/db/internal/mongo/chainassetsdb/resolve.go
Normal file
18
api/pkg/db/internal/mongo/chainassetsdb/resolve.go
Normal file
@@ -0,0 +1,18 @@
|
||||
package chainassetsdb
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/tech/sendico/pkg/db/repository"
|
||||
"github.com/tech/sendico/pkg/model"
|
||||
)
|
||||
|
||||
func (db *ChainAssetsDB) Resolve(ctx context.Context, chainAsset model.ChainAssetKey) (*model.ChainAssetDescription, error) {
|
||||
var assetDescription model.ChainAssetDescription
|
||||
assetField := repository.Field("asset")
|
||||
q := repository.Query().And(
|
||||
repository.Query().Filter(assetField.Dot("chain"), chainAsset.Chain),
|
||||
repository.Query().Filter(assetField.Dot("tokenSymbol"), chainAsset.TokenSymbol),
|
||||
)
|
||||
return &assetDescription, db.DBImp.FindOne(ctx, q, &assetDescription)
|
||||
}
|
||||
@@ -10,8 +10,10 @@ import (
|
||||
"github.com/mitchellh/mapstructure"
|
||||
"github.com/tech/sendico/pkg/auth"
|
||||
"github.com/tech/sendico/pkg/db/account"
|
||||
"github.com/tech/sendico/pkg/db/chainassets"
|
||||
"github.com/tech/sendico/pkg/db/confirmation"
|
||||
"github.com/tech/sendico/pkg/db/internal/mongo/accountdb"
|
||||
"github.com/tech/sendico/pkg/db/internal/mongo/chainassetsdb"
|
||||
"github.com/tech/sendico/pkg/db/internal/mongo/confirmationdb"
|
||||
"github.com/tech/sendico/pkg/db/internal/mongo/invitationdb"
|
||||
"github.com/tech/sendico/pkg/db/internal/mongo/organizationdb"
|
||||
@@ -312,6 +314,10 @@ func collectReplicaHosts(configuredHosts []string, replicaSet, defaultPort, host
|
||||
return hosts
|
||||
}
|
||||
|
||||
func (db *DB) NewChainAsstesDB() (chainassets.DB, error) {
|
||||
return chainassetsdb.Create(db.logger, db.db())
|
||||
}
|
||||
|
||||
func (db *DB) Permissions() auth.Provider {
|
||||
return db
|
||||
}
|
||||
|
||||
@@ -44,6 +44,9 @@ func (r *MongoRepository) CreateIndex(def *ri.Definition) error {
|
||||
if def.PartialFilter != nil {
|
||||
opts.SetPartialFilterExpression(def.PartialFilter.BuildQuery())
|
||||
}
|
||||
if def.Sparse {
|
||||
opts.SetSparse(def.Sparse)
|
||||
}
|
||||
|
||||
_, err := r.collection.Indexes().CreateOne(
|
||||
context.Background(),
|
||||
|
||||
@@ -18,6 +18,7 @@ type Key struct {
|
||||
type Definition struct {
|
||||
Keys []Key // mandatory, at least one element
|
||||
Unique bool // unique constraint?
|
||||
Sparse bool // sparse?
|
||||
TTL *int32 // seconds; nil means “no TTL”
|
||||
Name string // optional explicit name
|
||||
PartialFilter builder.Query // optional: partialFilterExpression for conditional indexes
|
||||
|
||||
26
api/pkg/model/chainasset.go
Normal file
26
api/pkg/model/chainasset.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"github.com/tech/sendico/pkg/db/storable"
|
||||
"github.com/tech/sendico/pkg/mservice"
|
||||
)
|
||||
|
||||
type ChainAssetKey struct {
|
||||
Chain ChainNetwork `bson:"chain" json:"chain" yaml:"chain" mapstructure:"chain"`
|
||||
TokenSymbol string `bson:"tokenSymbol" json:"tokenSymbol" yaml:"tokenSymbol" mapstructure:"tokenSymbol"`
|
||||
}
|
||||
|
||||
type ChainAsset struct {
|
||||
ChainAssetKey `bson:",inline" json:",inline"`
|
||||
ContractAddress *string `bson:"contractAddress,omitempty" json:"contractAddress,omitempty"`
|
||||
}
|
||||
|
||||
type ChainAssetDescription struct {
|
||||
storable.Storable `bson:",inline" json:",inline"`
|
||||
Describable `bson:",inline" json:",inline"`
|
||||
Asset ChainAsset `bson:"asset" json:"asset"`
|
||||
}
|
||||
|
||||
func Collection(*ChainAssetDescription) mservice.Type {
|
||||
return mservice.ChainAssets
|
||||
}
|
||||
11
api/pkg/model/chains.go
Normal file
11
api/pkg/model/chains.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package model
|
||||
|
||||
type ChainNetwork string
|
||||
|
||||
const (
|
||||
ChainNetworkARB ChainNetwork = "arbitrum_one"
|
||||
ChainNetworkEthMain ChainNetwork = "ethereum_mainnet"
|
||||
ChainNetworkTronMain ChainNetwork = "tron_mainnet"
|
||||
ChainNetworkTronNile ChainNetwork = "tron_nile"
|
||||
ChainNetworkUnspecified ChainNetwork = "unspecified"
|
||||
)
|
||||
@@ -5,50 +5,51 @@ import "github.com/tech/sendico/pkg/merrors"
|
||||
type Type = string
|
||||
|
||||
const (
|
||||
Accounts Type = "accounts" // Represents user accounts in the system
|
||||
Confirmations Type = "confirmations" // Represents confirmation code flows
|
||||
Amplitude Type = "amplitude" // Represents analytics integration with Amplitude
|
||||
Discovery Type = "discovery" // Represents service discovery registry
|
||||
Site Type = "site" // Represents public site endpoints
|
||||
Changes Type = "changes" // Tracks changes made to resources
|
||||
Clients Type = "clients" // Represents client information
|
||||
ChainGateway Type = "chain_gateway" // Represents chain gateway microservice
|
||||
MntxGateway Type = "mntx_gateway" // Represents Monetix gateway microservice
|
||||
PaymentGateway Type = "payment_gateway" // Represents payment gateway microservice
|
||||
FXOracle Type = "fx_oracle" // Represents FX oracle microservice
|
||||
FeePlans Type = "fee_plans" // Represents fee plans microservice
|
||||
FilterProjects Type = "filter_projects" // Represents comments on tasks or other resources
|
||||
Invitations Type = "invitations" // Represents invitations sent to users
|
||||
Invoices Type = "invoices" // Represents invoices
|
||||
Logo Type = "logo" // Represents logos for organizations or projects
|
||||
Ledger Type = "ledger" // Represents ledger microservice
|
||||
LedgerAccounts Type = "ledger_accounts" // Represents ledger accounts microservice
|
||||
LedgerBalances Type = "ledger_balances" // Represents ledger account balances microservice
|
||||
LedgerEntries Type = "ledger_journal_entries" // Represents ledger journal entries microservice
|
||||
LedgerOutbox Type = "ledger_outbox" // Represents ledger outbox microservice
|
||||
LedgerParties Type = "ledger_parties" // Represents ledger account owner parties microservice
|
||||
LedgerPlines Type = "ledger_posting_lines" // Represents ledger journal posting lines microservice
|
||||
PaymentOrchestrator Type = "payment_orchestrator" // Represents payment orchestration microservice
|
||||
ChainWallets Type = "chain_wallets" // Represents managed chain wallets
|
||||
ChainWalletBalances Type = "chain_wallet_balances" // Represents managed chain wallet balances
|
||||
ChainTransfers Type = "chain_transfers" // Represents chain transfers
|
||||
ChainDeposits Type = "chain_deposits" // Represents chain deposits
|
||||
Notifications Type = "notifications" // Represents notifications sent to users
|
||||
Organizations Type = "organizations" // Represents organizations in the system
|
||||
Payments Type = "payments" // Represents payments service
|
||||
PaymentRoutes Type = "payment_routes" // Represents payment routing definitions
|
||||
Accounts Type = "accounts" // Represents user accounts in the system
|
||||
Confirmations Type = "confirmations" // Represents confirmation code flows
|
||||
Amplitude Type = "amplitude" // Represents analytics integration with Amplitude
|
||||
Discovery Type = "discovery" // Represents service discovery registry
|
||||
Site Type = "site" // Represents public site endpoints
|
||||
Changes Type = "changes" // Tracks changes made to resources
|
||||
Clients Type = "clients" // Represents client information
|
||||
ChainGateway Type = "chain_gateway" // Represents chain gateway microservice
|
||||
MntxGateway Type = "mntx_gateway" // Represents Monetix gateway microservice
|
||||
PaymentGateway Type = "payment_gateway" // Represents payment gateway microservice
|
||||
FXOracle Type = "fx_oracle" // Represents FX oracle microservice
|
||||
FeePlans Type = "fee_plans" // Represents fee plans microservice
|
||||
FilterProjects Type = "filter_projects" // Represents comments on tasks or other resources
|
||||
Invitations Type = "invitations" // Represents invitations sent to users
|
||||
Invoices Type = "invoices" // Represents invoices
|
||||
Logo Type = "logo" // Represents logos for organizations or projects
|
||||
Ledger Type = "ledger" // Represents ledger microservice
|
||||
LedgerAccounts Type = "ledger_accounts" // Represents ledger accounts microservice
|
||||
LedgerBalances Type = "ledger_balances" // Represents ledger account balances microservice
|
||||
LedgerEntries Type = "ledger_journal_entries" // Represents ledger journal entries microservice
|
||||
LedgerOutbox Type = "ledger_outbox" // Represents ledger outbox microservice
|
||||
LedgerParties Type = "ledger_parties" // Represents ledger account owner parties microservice
|
||||
LedgerPlines Type = "ledger_posting_lines" // Represents ledger journal posting lines microservice
|
||||
PaymentOrchestrator Type = "payment_orchestrator" // Represents payment orchestration microservice
|
||||
ChainAssets Type = "chain_assets" // Represents managed chain assets
|
||||
ChainWallets Type = "chain_wallets" // Represents managed chain wallets
|
||||
ChainWalletBalances Type = "chain_wallet_balances" // Represents managed chain wallet balances
|
||||
ChainTransfers Type = "chain_transfers" // Represents chain transfers
|
||||
ChainDeposits Type = "chain_deposits" // Represents chain deposits
|
||||
Notifications Type = "notifications" // Represents notifications sent to users
|
||||
Organizations Type = "organizations" // Represents organizations in the system
|
||||
Payments Type = "payments" // Represents payments service
|
||||
PaymentRoutes Type = "payment_routes" // Represents payment routing definitions
|
||||
PaymentPlanTemplates Type = "payment_plan_templates" // Represents payment plan templates
|
||||
PaymentMethods Type = "payment_methods" // Represents payment methods service
|
||||
Permissions Type = "permissions" // Represents permissiosns service
|
||||
Policies Type = "policies" // Represents access control policies
|
||||
PolicyAssignements Type = "policy_assignments" // Represents policy assignments database
|
||||
Recipients Type = "recipients" // Represents payment recipients
|
||||
RefreshTokens Type = "refresh_tokens" // Represents refresh tokens for authentication
|
||||
Roles Type = "roles" // Represents roles in access control
|
||||
Storage Type = "storage" // Represents statuses of tasks or projects
|
||||
Tenants Type = "tenants" // Represents tenants managed in the system
|
||||
Wallets Type = "wallets" // Represents workflows for tasks or projects
|
||||
Workflows Type = "workflows" // Represents workflows for tasks or projects
|
||||
PaymentMethods Type = "payment_methods" // Represents payment methods service
|
||||
Permissions Type = "permissions" // Represents permissiosns service
|
||||
Policies Type = "policies" // Represents access control policies
|
||||
PolicyAssignements Type = "policy_assignments" // Represents policy assignments database
|
||||
Recipients Type = "recipients" // Represents payment recipients
|
||||
RefreshTokens Type = "refresh_tokens" // Represents refresh tokens for authentication
|
||||
Roles Type = "roles" // Represents roles in access control
|
||||
Storage Type = "storage" // Represents statuses of tasks or projects
|
||||
Tenants Type = "tenants" // Represents tenants managed in the system
|
||||
Wallets Type = "wallets" // Represents workflows for tasks or projects
|
||||
Workflows Type = "workflows" // Represents workflows for tasks or projects
|
||||
)
|
||||
|
||||
func StringToSType(s string) (Type, error) {
|
||||
|
||||
Reference in New Issue
Block a user