status-im/status-go

View on GitHub
services/communitytokens/communitytokensdatabase/database.go

Summary

Maintainability
A
0 mins
Test Coverage
D
64%
package communitytokensdatabase

import (
    "database/sql"
    "fmt"

    "github.com/status-im/status-go/protocol/communities/token"
    "github.com/status-im/status-go/protocol/protobuf"
)

type Database struct {
    db *sql.DB
}

func NewCommunityTokensDatabase(db *sql.DB) *Database {
    return &Database{db: db}
}

func (db *Database) GetTokenType(chainID uint64, contractAddress string) (protobuf.CommunityTokenType, error) {
    var result = protobuf.CommunityTokenType_UNKNOWN_TOKEN_TYPE
    rows, err := db.db.Query(`SELECT type FROM community_tokens WHERE chain_id=? AND address=? LIMIT 1`, chainID, contractAddress)
    if err != nil {
        return result, err
    }
    defer rows.Close()

    if rows.Next() {
        err := rows.Scan(&result)
        return result, err
    }
    return result, fmt.Errorf("can't find token: chainId %v, contractAddress %v", chainID, contractAddress)
}

func (db *Database) GetTokenPrivilegesLevel(chainID uint64, contractAddress string) (token.PrivilegesLevel, error) {
    var result = token.CommunityLevel
    rows, err := db.db.Query(`SELECT privileges_level FROM community_tokens WHERE chain_id=? AND address=? LIMIT 1`, chainID, contractAddress)
    if err != nil {
        return result, err
    }
    defer rows.Close()

    if rows.Next() {
        err := rows.Scan(&result)
        return result, err
    }
    return result, fmt.Errorf("can't find privileges level: chainId %v, contractAddress %v", chainID, contractAddress)
}

func (db *Database) GetCommunityERC20Metadata() ([]*token.CommunityToken, error) {
    rows, err := db.db.Query(`SELECT community_id, address, name, symbol, chain_id FROM community_tokens WHERE type = ?`, protobuf.CommunityTokenType_ERC20)
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    var result []*token.CommunityToken
    for rows.Next() {
        token := token.CommunityToken{}
        err := rows.Scan(&token.CommunityID, &token.Address, &token.Name, &token.Symbol, &token.ChainID)
        if err != nil {
            return nil, err
        }
        result = append(result, &token)
    }
    return result, rows.Err()
}