Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migration for updating dapps and tokens #321

Merged
merged 2 commits into from
Oct 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 44 additions & 30 deletions internal/database/dapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,45 +8,45 @@ import (

// DApp model
type DApp struct {
ID uint `gorm:"primary_key" json:"-"`
CreatedAt time.Time `json:"-"`
UpdatedAt time.Time `json:"-"`
DeletedAt *time.Time `json:"-"`
Name string `json:"name"`
ShortDescription string `json:"short_description"`
FullDescription string `json:"full_description"`
Version string `json:"version"`
License string `json:"license"`
WebSite string `json:"website"`
Slug string `json:"slug,omitempty"`
AgoraReviewPostID uint `json:"agora_review_post_id,omitempty"`
AgoraQAPostID uint `json:"agora_qa_post_id,omitempty"`
Authors pq.StringArray `gorm:"type:varchar(128)[]" json:"authors"`
SocialLinks pq.StringArray `gorm:"type:varchar(1024)[]" json:"social_links"`
Interfaces pq.StringArray `gorm:"type:varchar(64)[]" json:"interfaces"`
Categories pq.StringArray `gorm:"type:varchar(32)[]" json:"categories"`
Contracts pq.StringArray `gorm:"type:varchar(36)[]" json:"contracts"`
Order uint `json:"-"`
Soon bool `gorm:"default:false" json:"soon"`
ID uint `gorm:"primary_key" json:"-" yaml:"id"`
CreatedAt time.Time `json:"-" yaml:"-"`
UpdatedAt time.Time `json:"-" yaml:"-"`
DeletedAt *time.Time `json:"-" yaml:"-"`
Name string `json:"name" yaml:"name"`
ShortDescription string `json:"short_description" yaml:"short_description"`
FullDescription string `json:"full_description" yaml:"full_description"`
Version string `json:"version" yaml:"version"`
License string `json:"license" yaml:"license"`
WebSite string `json:"website" yaml:"web_site"`
Slug string `json:"slug,omitempty" yaml:"slug"`
AgoraReviewPostID uint `json:"agora_review_post_id,omitempty" yaml:"agora_review_post_id"`
AgoraQAPostID uint `json:"agora_qa_post_id,omitempty" yaml:"agora_qa_post_id"`
Authors pq.StringArray `gorm:"type:varchar(128)[]" json:"authors" yaml:"authors"`
SocialLinks pq.StringArray `gorm:"type:varchar(1024)[]" json:"social_links" yaml:"social_links"`
Interfaces pq.StringArray `gorm:"type:varchar(64)[]" json:"interfaces" yaml:"interfaces"`
Categories pq.StringArray `gorm:"type:varchar(32)[]" json:"categories" yaml:"categories"`
Contracts pq.StringArray `gorm:"type:varchar(36)[]" json:"contracts" yaml:"contracts"`
Order uint `json:"-" yaml:"order"`
Soon bool `gorm:"default:false" json:"soon" yaml:"soon"`

Pictures []Picture `json:"pictures,omitempty"`
DexTokens []DexToken `json:"dex_tokens,omitempty"`
Pictures []Picture `json:"pictures,omitempty" yaml:"pictures"`
DexTokens []DexToken `json:"dex_tokens,omitempty" yaml:"dex_tokens"`
}

// Picture model
type Picture struct {
ID uint `gorm:"primary_key,AUTO_INCREMENT" json:"-"`
Link string `json:"link"`
Type string `json:"type"`
DAppID uint `json:"-"`
ID uint `gorm:"primary_key,AUTO_INCREMENT" json:"-" yaml:"id"`
Link string `json:"link" yaml:"link"`
Type string `json:"type" yaml:"type"`
DAppID uint `json:"-" yaml:"dapp_id"`
}

// DexToken -
type DexToken struct {
ID uint `gorm:"primary_key,AUTO_INCREMENT" json:"-"`
DAppID uint
Contract string
TokenID uint
ID uint `gorm:"primary_key,AUTO_INCREMENT" json:"-" yaml:"id"`
DAppID uint `yaml:"dapp_id"`
Contract string `yaml:"contract"`
TokenID uint `yaml:"token_id"`
}

// GetDApps -
Expand All @@ -66,3 +66,17 @@ func (d *db) GetDAppBySlug(slug string) (dapp DApp, err error) {
err = d.Preload("Pictures").Preload("DexTokens").Where("slug = ?", slug).First(&dapp).Error
return
}

// CreateDapp -
func (d *db) CreateDapp(dapp *DApp) error {
return d.Create(dapp).Error
}

// DeleteDapps -
func (d *db) DeleteDapps() error {
if err := d.DropTableIfExists(&DexToken{}, &Picture{}, &DApp{}).Error; err != nil {
return err
}

return d.CreateTable(&DexToken{}, &Picture{}, &DApp{}).Error
}
4 changes: 4 additions & 0 deletions internal/database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ type IDApp interface {
GetDApps() ([]DApp, error)
GetDApp(id uint) (DApp, error)
GetDAppBySlug(slug string) (dapp DApp, err error)
CreateDapp(dapp *DApp) error
DeleteDapps() error
}

// IDeployment -
Expand All @@ -86,6 +88,8 @@ type ISubscription interface {
// IToken -
type IToken interface {
GetTokens() ([]Token, error)
CreateToken(token *Token) error
DeleteTokens() error
}

// IUser -
Expand Down
42 changes: 30 additions & 12 deletions internal/database/token.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ import (
// Token -
type Token struct {
ID uint `gorm:"primary_key" json:"-"`
Name string `json:"name"`
Symbol string `json:"symbol"`
Decimals uint `json:"decimals"`
Contract string `json:"contract"`
Network string `json:"network"`
TokenID uint `json:"token_id"`
Name string `json:"name" yaml:"name"`
Symbol string `json:"symbol" yaml:"symbol"`
Decimals uint `json:"decimals" yaml:"decimals"`
Contract string `json:"contract" yaml:"contract"`
Network string `json:"network" yaml:"network"`
TokenID uint `json:"token_id" yaml:"token_id"`
DAppID uint `json:"-"`

MetadataJSON postgres.Jsonb `json:"-"`
Expand All @@ -27,7 +27,11 @@ type Token struct {

// BeforeSave -
func (token *Token) BeforeSave(tx *gorm.DB) error {
return token.MetadataJSON.Scan(token.Metadata)
data, err := json.Marshal(token.Metadata)
if err != nil {
return err
}
return token.MetadataJSON.Scan(data)
}

// AfterFind -
Expand All @@ -44,11 +48,11 @@ func (token *Token) AfterFind(tx *gorm.DB) error {

// TokenMetadata -
type TokenMetadata struct {
Version string `json:"version"`
License string `json:"license"`
Authors []string `json:"authors"`
Interfaces []string `json:"interfaces"`
Views []TokenView `json:"views"`
Version string `json:"version,omitempty"`
License string `json:"license,omitempty"`
Authors []string `json:"authors,omitempty"`
Interfaces []string `json:"interfaces,omitempty"`
Views []TokenView `json:"views,omitempty"`
}

// TokenView -
Expand Down Expand Up @@ -208,3 +212,17 @@ func (p withTokenIDBalanceParser) Parse(response gjson.Result) []TokenBalance {
}
return balances
}

// CreateToken -
func (d *db) CreateToken(token *Token) error {
return d.Create(token).Error
}

// DeleteTokens -
func (d *db) DeleteTokens() error {
if err := d.DropTableIfExists(&Token{}).Error; err != nil {
return err
}

return d.CreateTable(&Token{}).Error
}
1 change: 1 addition & 0 deletions scripts/migration/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ var migrationsList = []migrations.Migration{
&migrations.SetOperationAllocatedBurned{},
&migrations.CreateTokenMetadata{},
&migrations.SetOperationInitiator{},
&migrations.UpdateDapps{},
&migrations.CreateTZIP{},
}

Expand Down
100 changes: 100 additions & 0 deletions scripts/migration/migrations/update_dapps.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package migrations

import (
"fmt"
"io/ioutil"

"github.com/baking-bad/bcdhub/internal/config"
"github.com/baking-bad/bcdhub/internal/database"
"github.com/baking-bad/bcdhub/internal/logger"
"github.com/jinzhu/gorm"
"gopkg.in/yaml.v2"
)

// UpdateDapps - migration that updates dapps and tokens from d_apps.yml and tokens.yml files
type UpdateDapps struct{}

// Key -
func (m *UpdateDapps) Key() string {
return "update_dapps"
}

// Description -
func (m *UpdateDapps) Description() string {
return "update dapps and tokens from d_apps.yml and tokens.yml files. store them in scripts/migration/data folder."
}

// DappsData -
type DappsData struct {
Dapps []database.DApp `yaml:"dapps"`
}

// TokensData -
type TokensData struct {
Tokens []struct {
DappSlug string `yaml:"dapp_slug"`
Token database.Token `yaml:"token"`
} `yaml:"tokens"`
}

// Do - migrate function
func (m *UpdateDapps) Do(ctx *config.Context) error {
src, err := ioutil.ReadFile("data/d_apps.yml")
if err != nil {
return err
}

var data DappsData
if err := yaml.Unmarshal(src, &data); err != nil {
return err
}

tokensSrc, err := ioutil.ReadFile("data/tokens.yml")
if err != nil {
return err
}

var tokenData TokensData
if err := yaml.Unmarshal(tokensSrc, &tokenData); err != nil {
return err
}

tokens := make(map[string]database.Token)
for _, token := range tokenData.Tokens {
tokens[token.DappSlug] = token.Token
}

if err := ctx.DB.DeleteDapps(); err != nil {
return err
}

if err := ctx.DB.DeleteTokens(); err != nil {
return err
}

for i := range data.Dapps {
if err := ctx.DB.CreateDapp(&(data.Dapps[i])); err != nil {
return err
}
}

for slug, token := range tokens {
dapp, err := ctx.DB.GetDAppBySlug(slug)
if err != nil {
if gorm.IsRecordNotFoundError(err) {
logger.Info("no dapp with slug %s", slug)
continue
}
return err
}

token.DAppID = dapp.ID

if err := ctx.DB.CreateToken(&token); err != nil {
fmt.Println("CreateToken err", err)
return err
}
}

return nil
}