Documentation
¶
Index ¶
- Constants
- type APIKey
- type APIKeyPage
- type Account
- func (a *Account) CryptoAddresses() ([]*CryptoAddress, error)
- func (a *Account) HasIVMSRecord() bool
- func (a *Account) NumAddresses() int64
- func (a *Account) Params() []any
- func (a *Account) Scan(scanner Scanner) error
- func (a *Account) ScanSummary(scanner Scanner) error
- func (a *Account) SetCryptoAddresses(addresses []*CryptoAddress)
- type AccountsPage
- type ComplianceAuditLog
- type ComplianceAuditLogPage
- type ComplianceAuditLogPageInfo
- type Contact
- type ContactsPage
- type Counterparty
- func (c *Counterparty) Contacts() ([]*Contact, error)
- func (c *Counterparty) HasContact(email string) (bool, error)
- func (c *Counterparty) NormalizedWebsite() (out string, err error)
- func (c *Counterparty) Params() []any
- func (c *Counterparty) Scan(scanner Scanner) error
- func (c *Counterparty) ScanSummary(scanner Scanner) error
- func (c *Counterparty) SetContacts(contacts []*Contact)
- type CounterpartyPage
- type CounterpartyPageInfo
- type CounterpartySourceInfo
- type CryptoAddress
- type CryptoAddressPage
- type EnvelopeStorage
- type Model
- type PageInfo
- type Permission
- type PreparedTransaction
- type ResetPasswordLink
- type ResetPasswordLinkPage
- type Role
- type Scanner
- type SearchQuery
- type SecureEnvelope
- type SecureEnvelopePage
- type Sunrise
- type SunrisePage
- type Transaction
- func (t *Transaction) NumEnvelopes() int64
- func (t *Transaction) Params() []any
- func (t *Transaction) Scan(scanner Scanner) error
- func (t *Transaction) ScanWithCount(scanner Scanner) error
- func (t *Transaction) SecureEnvelopes() ([]*SecureEnvelope, error)
- func (t *Transaction) SetNumEnvelopes(count int64)
- func (t *Transaction) SetSecureEnvelopes(envelopes []*SecureEnvelope)
- func (t *Transaction) Update(other *Transaction)
- type TransactionCounts
- type TransactionPage
- type TransactionPageInfo
- type TravelAddressFactory
- type User
- type UserPage
- type UserPageInfo
- type VASPCategories
Constants ¶
const ( FieldCommonName = "common_name" FieldName = "name" FieldLEI = "lei" )
const ( CounterpartyUnknown = "unknown" VirtualAssetUnknown = "UNK" )
const DefaultPageSize = uint32(50)
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type APIKey ¶
type APIKey struct {
Model
Description sql.NullString
ClientID string
Secret string
LastSeen sql.NullTime
// contains filtered or unexported fields
}
func (APIKey) Permissions ¶
func (*APIKey) ScanSummary ¶
func (*APIKey) SetPermissions ¶
type APIKeyPage ¶
type Account ¶
type Account struct {
Model
CustomerID sql.NullString // Account ID of internal user record (optional)
FirstName sql.NullString // First name (forename) of user
LastName sql.NullString // Last name (surname) of user
TravelAddress sql.NullString // Generated TravelAddress for this user
IVMSRecord *ivms101.Person // IVMS101 record for the account
// contains filtered or unexported fields
}
Account holds information about a user account for the local VASP including identifying information to link the account to the user record and IVMS101 data. Accounts automatically generate a TravelAddress for creating travel rule transactions with the specified VASPs. Accounts can also be associated with one or more wallet addresses for specific crypto currencies and networks.
func (*Account) CryptoAddresses ¶
func (a *Account) CryptoAddresses() ([]*CryptoAddress, error)
Returns associated crypto addresses if they are cached on the account model, returns an ErrMissingAssociation error if they are not cached.
func (*Account) HasIVMSRecord ¶ added in v1.0.0
ScanSummary returns whether the account has an IVMS101 record, otherwise the record itself is checked. This returns true if the record is not nil/null but does not inspect the record to determine if it is zero valued.
func (*Account) NumAddresses ¶ added in v1.0.0
ScanSummary counts the number of crypto addresses associated with the account, otherwise the length of the internal addresses list is returned.
func (*Account) ScanSummary ¶
ScanSummary scans only the summary information into the account model.
func (*Account) SetCryptoAddresses ¶
func (a *Account) SetCryptoAddresses(addresses []*CryptoAddress)
Used by store implementations to cache associated crypto addresses on the account.
type AccountsPage ¶
type ComplianceAuditLog ¶ added in v1.1.0
type ComplianceAuditLog struct {
// ID is a unique indentifier for a ComplianceAuditLog
ID ulid.ULID
// ActorID can be a ULID or UUID, depending on the ActorType
ActorID []byte
// ActorType allows us to decode the ActorID and is human-readable
ActorType enum.Actor
// ResourceID can be a ULID or UUID, depending on the ResourceType
ResourceID []byte
// ResourceType allows us to decode the ResourceID and is human-readable
ResourceType enum.Resource
// ResourceModified is the time the resource was modified at
ResourceModified time.Time
// Action is the type of change made in the database
Action enum.Action
// ChangeNotes is an optional string that can include further details
ChangeNotes sql.NullString
// Signature is a cryptographic Signature that can be used to verify that an
// instance of a ComplianceAuditLog was not modified
Signature []byte
// KeyID is the identification for the public key that can verify this log
KeyID string
// Algorithm is the identification for the algorithm that can verify this log
Algorithm string
}
ComplianceAuditLog stores the information necessary to track changes to specific database tables and entries, such as transactions, users, api keys, etc. A ComplianceAuditLog entry in the database is meant to be immutable, and to prove this each ComplianceAuditLog entry contains a cryptographic Signature that can be verified against the other field data.
func (*ComplianceAuditLog) Data ¶ added in v1.2.0
func (l *ComplianceAuditLog) Data() (data []byte)
Returns the concatenated field data for an audit log, not including the signature metadata fields.
func (*ComplianceAuditLog) IsFilled ¶ added in v1.2.0
func (l *ComplianceAuditLog) IsFilled() error
Returns nil if the audit log is filled with data, otherwise returns an error.
func (*ComplianceAuditLog) Params ¶ added in v1.1.0
func (l *ComplianceAuditLog) Params() []any
func (*ComplianceAuditLog) Scan ¶ added in v1.1.0
func (l *ComplianceAuditLog) Scan(scanner Scanner) error
func (*ComplianceAuditLog) ScanSummary ¶ added in v1.1.0
func (l *ComplianceAuditLog) ScanSummary(scanner Scanner) error
type ComplianceAuditLogPage ¶ added in v1.1.0
type ComplianceAuditLogPage struct {
Logs []*ComplianceAuditLog `json:"logs"`
Page *ComplianceAuditLogPageInfo `json:"page"`
}
type ComplianceAuditLogPageInfo ¶ added in v1.1.0
type ComplianceAuditLogPageInfo struct {
PageInfo
// Maximum number of records to query from database
// TODO: remove this once proper pagination has been implemented
Limit int
// ResourceTypes filters results to include only these enum.Resource values
ResourceTypes []string
// ResourceID filters results by a specific resource ID
ResourceID string
// ResourceTypes filters results to include only these enum.Actor values
ActorTypes []string
// ActorID filters results by a specific actor ID
ActorID string
// After filters results to include logs with ResourceModified on or after this time (inclusive)
After time.Time
// Before filters results to include logs with ResourceModified before this time (exclusive)
Before time.Time
// DetailedLogs will return the full log entry if true (otherwise List
// returns only summary info)
DetailedLogs bool
}
Options for listing ComplianceAuditLog objects from the store interface. ResourceTypes and ResourceID are mutually exclusive, as well as ActorTypes and ActorID; if both of either pair are provided in an object, then only the ID field(s) will be used to filter the result. After and Before may be used with any other combination. These options will be concatenated into the SQL query using 'AND' logic.
func ComplianceAuditLogPageInfoFrom ¶ added in v1.1.0
func ComplianceAuditLogPageInfoFrom(in *ComplianceAuditLogPageInfo) (out *ComplianceAuditLogPageInfo)
Copies the page info from the input into a new object, or creates a new zero'ed object if the input is nil.
type Contact ¶ added in v0.28.0
type Contact struct {
Model
Name string // The full name of the contact
Email string // A unique address for the contact (professional email) must be lowercase
Role string // A description of what the contact does at the counterparty
CounterpartyID ulid.ULID // Reference to the counterparty the contact is associated with
// contains filtered or unexported fields
}
func (*Contact) Address ¶ added in v0.28.0
Return the RFC 5322 address as implemented by the net/mail package.
func (*Contact) Counterparty ¶ added in v0.28.0
func (c *Contact) Counterparty() (*Counterparty, error)
Returns the associated counterparty if it is cached on the model, otherwise returns an ErrMissingAssociation error.
func (*Contact) Params ¶ added in v0.28.0
Get complete named params of the counterparty from the model.
func (*Contact) SetCounterparty ¶ added in v0.28.0
func (c *Contact) SetCounterparty(counterparty *Counterparty)
type ContactsPage ¶ added in v0.28.0
type Counterparty ¶
type Counterparty struct {
Model
Source enum.Source // either directory or locally created
DirectoryID sql.NullString // the directory ID associated with the counterparty (directory only)
RegisteredDirectory sql.NullString // the registered directory of the counterparty (directory only)
Protocol enum.Protocol // the protocol to use to send travel rule information (TRISA, TRP, Sunrise, etc.)
CommonName string // common name - a unique name to identify the endpoint
Endpoint string // the full endpoint to connect to the counterparty on
Name string // the counterparty's legal entity name
Website sql.NullString // website with more information about the counterparty
Country sql.NullString // country the counterparty is associated with
BusinessCategory sql.NullString // the business category of the counterparty
VASPCategories VASPCategories // the categories of how the VASP handles crypto assets
VerifiedOn sql.NullTime // the datetime the VASP was verified in the directory (directory only)
IVMSRecord *ivms101.LegalPerson // IVMS101 record for the counterparty
LEI sql.NullString // Legal Entity Identifier for the counterparty (generally for TRP)
// contains filtered or unexported fields
}
TODO: how to incorporate the TRIXO form into this model?
func (*Counterparty) Contacts ¶ added in v0.28.0
func (c *Counterparty) Contacts() ([]*Contact, error)
Returns the associated contacts if they are cached on the counterparty, otherwise returns an ErrMissingAssociation error if not.
func (*Counterparty) HasContact ¶ added in v0.28.0
func (c *Counterparty) HasContact(email string) (bool, error)
Lookup an email address in the counterparty contacts to see if it exists.
func (*Counterparty) NormalizedWebsite ¶ added in v1.1.0
func (c *Counterparty) NormalizedWebsite() (out string, err error)
Returns the Website as a string after it has been parsed with `url.Parse`, attempting to detect missing schemas and other parsing errors. This function will return an error if Website.String cannot be parsed by url.Parse or if Website.Valid is false.
func (*Counterparty) Params ¶
func (c *Counterparty) Params() []any
Get complete named params of the counterparty from the model.
func (*Counterparty) Scan ¶
func (c *Counterparty) Scan(scanner Scanner) error
Scan a complete SELECT into the counterparty model
func (*Counterparty) ScanSummary ¶
func (c *Counterparty) ScanSummary(scanner Scanner) error
Scan a partial SELECT into the counterparty model
func (*Counterparty) SetContacts ¶ added in v0.28.0
func (c *Counterparty) SetContacts(contacts []*Contact)
Used by store implementation to cache associated contacts on the counterparty.
type CounterpartyPage ¶
type CounterpartyPage struct {
Counterparties []*Counterparty `json:"counterparties"`
Page *CounterpartyPageInfo `json:"page"`
}
type CounterpartyPageInfo ¶ added in v1.0.0
type CounterpartySourceInfo ¶
type CounterpartySourceInfo struct {
ID ulid.ULID
Source string // either directory or locally created
DirectoryID sql.NullString // the directory ID associated with the counterparty (directory only)
RegisteredDirectory sql.NullString // the registered directory of the counterparty (directory only)
Protocol string // the protocol to use to send travel rule information (TRISA, TRP, Sunrise, etc.)
}
func (*CounterpartySourceInfo) Scan ¶
func (c *CounterpartySourceInfo) Scan(scanner Scanner) error
type CryptoAddress ¶
type CryptoAddress struct {
Model
AccountID ulid.ULID // Reference to account the crypto address belongs to
CryptoAddress string // The actual crypto address of the wallet
Network string // The network associated with the crypto address in SIP0044 encoding
AssetType sql.NullString // The asset type with the crypto address (optional)
Tag sql.NullString // The memo or destination tag associated with the address (optional)
TravelAddress sql.NullString // Generated TravelAddress for this wallet address
// contains filtered or unexported fields
}
func (*CryptoAddress) Account ¶
func (a *CryptoAddress) Account() (*Account, error)
Returns associated account if it is cached on the crypto address model, returns an ErrMissingAssociation error if they are not cached.
func (*CryptoAddress) Params ¶
func (a *CryptoAddress) Params() []any
Get the complete named params of the crypto address from the model.
func (*CryptoAddress) Scan ¶
func (a *CryptoAddress) Scan(scanner Scanner) error
Scans a complete SELECT into the CryptoAddress model
func (*CryptoAddress) SetAccount ¶
func (a *CryptoAddress) SetAccount(account *Account)
Used by store implementations to cache associated account on the crypto address.
type CryptoAddressPage ¶
type CryptoAddressPage struct {
CryptoAddresses []*CryptoAddress `json:"crypto_addresses"`
Page *PageInfo `json:"page"`
}
type EnvelopeStorage ¶ added in v0.14.0
type EnvelopeStorage interface {
AddEnvelope(*SecureEnvelope) error
}
EnvelopeStorage is a subset of the PreparedTransaction interface that focuses on the database interactions with SecureEnvelopes. This sub-interface makes it easier to write tests, though in practice the PreparedTransaction is passed in for this.
type Model ¶
type Model struct {
ID ulid.ULID `json:"id"`
Created time.Time `json:"created"`
Modified time.Time `json:"modified"`
}
Model is the base model for all models stored in the database.
type PageInfo ¶
type PageInfo struct {
PageSize uint32 `json:"page_size"`
NextPageID ulid.ULID `json:"next_page_id"`
PrevPageID ulid.ULID `json:"prev_page_id"`
}
func PageInfoFrom ¶
type Permission ¶
type Permission struct {
ID int64
Title string
Description string
Created time.Time
Modified time.Time
}
func (*Permission) Params ¶
func (p *Permission) Params() []any
func (*Permission) Scan ¶
func (p *Permission) Scan(scanner Scanner) error
type PreparedTransaction ¶
type PreparedTransaction interface {
Created() bool // Returns true if the transaction was newly created, false if it already existed
Fetch() (*Transaction, error) // Fetches the current transaction record from the database
Update(*Transaction, *ComplianceAuditLog) error // Update the transaction with new information; e.g. data from decryption
AddCounterparty(*Counterparty, *ComplianceAuditLog) error // Add counterparty by database ULID, counterparty name, or registered directory ID; if the counterparty doesn't exist, it is created
UpdateCounterparty(*Counterparty, *ComplianceAuditLog) error // Update the counterparty with new information
LookupCounterparty(field, value string) (*Counterparty, error) // Lookup a counterparty by field and value
AddEnvelope(*SecureEnvelope, *ComplianceAuditLog) error // Associate a secure envelope with the prepared transaction
CreateSunrise(*Sunrise, *ComplianceAuditLog) error // Create a sunrise message sent to the counterparty for the transaction
UpdateSunrise(*Sunrise, *ComplianceAuditLog) error // Update the sunrise message
UpdateSunriseStatus(uuid.UUID, enum.Status, *ComplianceAuditLog) error // Update the status of all sunrise messages
Rollback() error // Rollback the prepared transaction and conclude it
Commit() error // Commit the prepared transaction and conclude it
}
PreparedTransaction allows you to manage the creation/modification of a transaction w.r.t a secure envelope. It is unified in a single interface to allow backend stores that have database transactions to perform all operations in a single transaction without concurrency issues.
type ResetPasswordLink ¶ added in v1.0.0
type ResetPasswordLink struct {
Model
UserID ulid.ULID // A foreign key reference to the user's account
Email string // Email address of recipient the token was sent to
Expiration time.Time // The timestamp that the sunrise verification token is no longer valid
Signature *vero.SignedToken // The signed token produced by the sunrise package for verification purposes
SentOn sql.NullTime // The timestamp that the email message was sent
}
func (*ResetPasswordLink) IsExpired ¶ added in v1.0.0
func (s *ResetPasswordLink) IsExpired() bool
IsExpired returns true if the current time is after the link expiration or the token has already been verified and used to change a password.
func (*ResetPasswordLink) Params ¶ added in v1.0.0
func (s *ResetPasswordLink) Params() []any
Get the complete named params of the ResetPasswordLink from the model.
func (*ResetPasswordLink) Scan ¶ added in v1.0.0
func (s *ResetPasswordLink) Scan(scanner Scanner) error
Scans a complete SELECT into the ResetPasswordLink model
func (*ResetPasswordLink) UpdateParams ¶ added in v1.0.0
func (s *ResetPasswordLink) UpdateParams() []any
Get the named params of the ResetPasswordLink from the model that are required for an update operation.
type ResetPasswordLinkPage ¶ added in v1.0.0
type ResetPasswordLinkPage struct {
Links []*ResetPasswordLink `json:"links"`
Page *PageInfo `json:"page"`
}
type Role ¶
type Role struct {
ID int64
Title string
Description string
IsDefault bool
Created time.Time
Modified time.Time
// contains filtered or unexported fields
}
func (Role) Permissions ¶
func (r Role) Permissions() ([]*Permission, error)
func (*Role) SetPermissions ¶
func (r *Role) SetPermissions(permissions []*Permission)
type Scanner ¶
Scanner is an interface for *sql.Rows and *sql.Row so that models can implement how they scan fields into their struct without having to specify every field every time.
type SearchQuery ¶ added in v0.23.0
type SecureEnvelope ¶
type SecureEnvelope struct {
Model
EnvelopeID uuid.UUID // Also a foreign key reference to the Transaction
Direction enum.Direction // Either "out" outgoing or "in" incoming
Remote sql.NullString // The common name of the remote peer this message was going to or coming from
ReplyTo ulid.NullULID // If this envelope is a response, a reference to the original request envelope
IsError bool // If the envelope contains an error/rejection rather than a payload
EncryptionKey []byte // The encryption key, encrypted with the public key of the local node. Note this may differ from the value in the envelope for outgoing messages
HMACSecret []byte // The hmac secret, encrypted with the public key of the local node. Note that this may differ from the value in the envelope for outgoing messages
ValidHMAC sql.NullBool // If the hmac has been validated against the payload and non-repudiation properties are satisfied
Timestamp time.Time // The timestamp of the envelope as defined by the envelope
PublicKey sql.NullString // The signature of the public key that sealed the encryption key and hmac secret, may differ from the value in the envelope for ougoing envelopes.
TransferState int32 // The transfer state of the secure envelope
Envelope *api.SecureEnvelope // The secure envelope protocol buffer stored as a BLOB
// contains filtered or unexported fields
}
func FromEnvelope ¶
func FromEnvelope(env *envelope.Envelope) *SecureEnvelope
FromEnvelope creates a SecureEnvelope model from a trisa wrapped secure envelope protocol buffer; this is primarily used for testing and should not be relied on for production work without testing and verification that the complete model is present.
func (*SecureEnvelope) Params ¶
func (e *SecureEnvelope) Params() []any
func (*SecureEnvelope) Scan ¶
func (e *SecureEnvelope) Scan(scanner Scanner) error
func (*SecureEnvelope) SetTransaction ¶
func (e *SecureEnvelope) SetTransaction(tx *Transaction)
func (*SecureEnvelope) Transaction ¶
func (e *SecureEnvelope) Transaction() (*Transaction, error)
type SecureEnvelopePage ¶
type SecureEnvelopePage struct {
Envelopes []*SecureEnvelope `json:"envelopes"`
Page *PageInfo `json:"page"`
}
type Sunrise ¶ added in v0.28.0
type Sunrise struct {
Model
EnvelopeID uuid.UUID // A foreign key reference to the Transaction
Email string // Email address of recipients the token is sent to (might be a comma separated list)
Expiration time.Time // The timestamp that the sunrise verification token is no longer valid
Signature *vero.SignedToken // The signed token produced by the sunrise package for verification purposes
Status enum.Status // The status of the sunrise message (should be similar to the status of the transaction)
SentOn sql.NullTime // The timestamp that the email message was sent
VerifiedOn sql.NullTime // The last timestamp that the user verified the token
}
func (*Sunrise) IsExpired ¶ added in v0.28.0
Check if the token is expired (does not check the validity of the token).
func (*Sunrise) Params ¶ added in v0.28.0
Get the complete named params of the sunrise message from the model.
func (*Sunrise) ScanSummary ¶ added in v0.28.0
Scans a partial SELECT into the Sunrise model for listing the sunrise model
type SunrisePage ¶ added in v0.28.0
type Transaction ¶
type Transaction struct {
ID uuid.UUID // Transaction IDs are UUIDs not ULIDs per the TRISA spec, this is also used for the envelope ID
Source enum.Source // Either "local" meaning the transaction was created by the user, or "remote" meaning it is an incoming message
Status enum.Status // Can be "unspecified", "started", "pending", "review", "repair", "accepted", "completed", or "rejected"
Counterparty string // The name of the counterparty in the transaction
CounterpartyID ulid.NullULID // A reference to the counterparty in the database, if any
Originator sql.NullString // Full name of the originator natural person or account
OriginatorAddress sql.NullString // The crypto address of the originator
Beneficiary sql.NullString // Full name of the beneficiary natural person or account
BeneficiaryAddress sql.NullString // The crypto address of the beneficiary
VirtualAsset string // A representation of the network/asset type
Amount float64 // The amount of the transaction
Archived bool // If the transaction is archived or not
ArchivedOn sql.NullTime // The timestamp the transaction was archived
LastUpdate sql.NullTime // The last time a TRISA RPC occurred for this transaction
Created time.Time // Timestamp the transaction was created
Modified time.Time // Timestamp the transaction was last modified, including when a new secure envelope was received
// contains filtered or unexported fields
}
func (*Transaction) NumEnvelopes ¶
func (t *Transaction) NumEnvelopes() int64
func (*Transaction) Params ¶
func (t *Transaction) Params() []any
func (*Transaction) Scan ¶
func (t *Transaction) Scan(scanner Scanner) error
func (*Transaction) ScanWithCount ¶
func (t *Transaction) ScanWithCount(scanner Scanner) error
func (*Transaction) SecureEnvelopes ¶
func (t *Transaction) SecureEnvelopes() ([]*SecureEnvelope, error)
func (*Transaction) SetNumEnvelopes ¶
func (t *Transaction) SetNumEnvelopes(count int64)
func (*Transaction) SetSecureEnvelopes ¶
func (t *Transaction) SetSecureEnvelopes(envelopes []*SecureEnvelope)
func (*Transaction) Update ¶
func (t *Transaction) Update(other *Transaction)
Update the transaction t with values from other if the field in other is non-zero; e.g. if a nullable field is valid or an empty string is empty. This method skips the ID and Modified fields.
type TransactionCounts ¶ added in v1.0.0
type TransactionCounts struct {
Active map[string]int // Active transaction counts by status
Archived map[string]int // Archived transaction counts by status
}
func (*TransactionCounts) Total ¶ added in v1.0.0
func (c *TransactionCounts) Total() int
func (*TransactionCounts) TotalActive ¶ added in v1.0.0
func (c *TransactionCounts) TotalActive() int
func (*TransactionCounts) TotalArchived ¶ added in v1.0.0
func (c *TransactionCounts) TotalArchived() int
type TransactionPage ¶
type TransactionPage struct {
Transactions []*Transaction `json:"transactions"`
Page *TransactionPageInfo `json:"page"`
}
type TransactionPageInfo ¶ added in v1.0.0
type TravelAddressFactory ¶
Factory function that can create travel addresses from models or IDs. This function should be able to handle any model defined in this package or a ULID or UUID.
func NewTravelAddressFactory ¶
func NewTravelAddressFactory(endpoint, protocol string) (TravelAddressFactory, error)
Create a travel address factory with the endpoint and protocol.
type User ¶
type User struct {
Model
Name sql.NullString
Email string
Password string
RoleID int64
LastLogin sql.NullTime
// contains filtered or unexported fields
}
func (User) Permissions ¶
func (*User) ScanSummary ¶
func (*User) SetPermissions ¶
type UserPage ¶
type UserPage struct {
Users []*User `json:"users"`
Page *UserPageInfo `json:"page"`
}
type UserPageInfo ¶ added in v1.0.0
type VASPCategories ¶
type VASPCategories []string
VASPCategories allows the string list to be stored in the database as a JSON array.
func (*VASPCategories) Scan ¶
func (c *VASPCategories) Scan(src interface{}) error