diff --git a/cmd/cs_sdk/functions/sync.go b/cmd/cs_sdk/functions/sync.go index 8dfe7a8..afac84d 100644 --- a/cmd/cs_sdk/functions/sync.go +++ b/cmd/cs_sdk/functions/sync.go @@ -10,6 +10,7 @@ import ( "github.com/Dobefu/csb/cmd/cs_sdk" "github.com/Dobefu/csb/cmd/cs_sdk/structs" "github.com/Dobefu/csb/cmd/cs_sdk/utils" + "github.com/Dobefu/csb/cmd/database/assets" "github.com/Dobefu/csb/cmd/database/query" db_routes "github.com/Dobefu/csb/cmd/database/routes" "github.com/Dobefu/csb/cmd/database/state" @@ -51,6 +52,12 @@ func Sync(reset bool) error { return err } + err = addAllAssets(data) + + if err != nil { + return err + } + var hasPaginationToken bool paginationToken, hasPaginationToken = data["pagination_token"].(string) @@ -86,6 +93,60 @@ func getNewSyncToken(data map[string]interface{}) (string, error) { return newSyncToken, nil } +func addAllAssets(data map[string]interface{}) error { + items, hasItems := data["items"].([]interface{}) + + if !hasItems { + return errors.New("sync data has no items") + } + + itemCount := len(items) + + for idx, item := range items { + logger.Info("Fetching item data (%d/%d)", (idx + 1), itemCount) + + item := item.(map[string]interface{}) + + if item["content_type_uid"].(string) != "sys_assets" { + continue + } + + fmt.Println(item) + assetData := item["data"].(map[string]interface{}) + + publishDetails, hasPublishDetails := assetData["publish_details"].(map[string]interface{}) + + if !hasPublishDetails { + publishDetails = map[string]interface{}{ + "locale": "", + } + } + + parentUid, hasParentUid := assetData["parent_uid"].(string) + + if !hasParentUid { + parentUid = "" + } + fmt.Println(assetData) + err := assets.SetAsset(structs.Route{ + Uid: assetData["uid"].(string), + Title: assetData["title"].(string), + ContentType: assetData["content_type"].(string), + Locale: publishDetails["locale"].(string), + Url: assetData["url"].(string), + Parent: parentUid, + UpdatedAt: getUpdatedAt(assetData), + Published: item["type"].(string) == "asset_published", + }) + + if err != nil { + return err + } + } + + return nil +} + func addAllRoutes(data map[string]interface{}, routes *map[string]structs.Route) error { err := addSyncRoutes(data, routes) @@ -124,7 +185,7 @@ func getSyncData(paginationToken string, reset bool, syncToken string) (map[stri data, err = cs_sdk.Request(path, "GET", nil, false) } else if err != nil || reset { logger.Info("Initialising a fresh sync") - path := "stacks/sync?init=true&type=entry_published,entry_unpublished,entry_deleted" + path := "stacks/sync?init=true&type=entry_published,entry_unpublished,entry_deleted,asset_published,asset_unpublished,asset_deleted" data, err = cs_sdk.Request(path, "GET", nil, false) } else { logger.Info("Syncing data using an existing sync token") @@ -152,6 +213,11 @@ func addSyncRoutes(data map[string]interface{}, routes *map[string]structs.Route logger.Info("Fetching item data (%d/%d)", (idx + 1), itemCount) item := item.(map[string]interface{}) + + if item["content_type_uid"].(string) == "sys_assets" { + continue + } + data := item["data"].(map[string]interface{}) publishDetails, hasPublishDetails := data["publish_details"].(map[string]interface{}) diff --git a/cmd/database/assets/set-asset.go b/cmd/database/assets/set-asset.go new file mode 100644 index 0000000..6090fce --- /dev/null +++ b/cmd/database/assets/set-asset.go @@ -0,0 +1,65 @@ +package assets + +import ( + "github.com/Dobefu/csb/cmd/cs_sdk/structs" + "github.com/Dobefu/csb/cmd/cs_sdk/utils" + "github.com/Dobefu/csb/cmd/database/query" + db_structs "github.com/Dobefu/csb/cmd/database/structs" +) + +func SetAsset( + route structs.Route, +) error { + err := query.Upsert("assets", getAssetValues(route)) + + if err != nil { + return err + } + + return nil +} + +func getAssetValues(route structs.Route) []db_structs.QueryValue { + return []db_structs.QueryValue{ + { + Name: "id", + Value: utils.GenerateId(route), + }, + { + Name: "uid", + Value: route.Uid, + }, + { + Name: "title", + Value: route.Title, + }, + { + Name: "content_type", + Value: route.ContentType, + }, + { + Name: "locale", + Value: route.Locale, + }, + { + Name: "slug", + Value: route.Slug, + }, + { + Name: "url", + Value: route.Url, + }, + { + Name: "parent", + Value: route.Parent, + }, + { + Name: "updated_at", + Value: route.UpdatedAt, + }, + { + Name: "published", + Value: route.Published, + }, + } +} diff --git a/cmd/migrate_db/migrations/000004_create_assets_table.down.sql b/cmd/migrate_db/migrations/000004_create_assets_table.down.sql new file mode 100644 index 0000000..2d59c03 --- /dev/null +++ b/cmd/migrate_db/migrations/000004_create_assets_table.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS assets; diff --git a/cmd/migrate_db/migrations/000004_create_assets_table.up.sql b/cmd/migrate_db/migrations/000004_create_assets_table.up.sql new file mode 100644 index 0000000..177d2e3 --- /dev/null +++ b/cmd/migrate_db/migrations/000004_create_assets_table.up.sql @@ -0,0 +1,12 @@ +CREATE TABLE IF NOT EXISTS assets( + id varchar(48) NOT NULL PRIMARY KEY UNIQUE, + uid varchar(32) NOT NULL, + title varchar(255) NOT NULL, + content_type varchar(255) NOT NULL, + locale varchar(16) NOT NULL, + slug varchar(255) NOT NULL, + url varchar(255) NOT NULL, + parent varchar(64), + updated_at timestamp NOT NULL, + published boolean NOT NULL DEFAULT false +);