package migration import ( "database/sql" "federated.computer/wp-sync-slowtwitch/services/slowtwitch" "federated.computer/wp-sync-slowtwitch/services/wordpress" "fmt" "strings" ) type MigrateCategories struct { SlowtwitchDatabase *sql.DB ResultsDatabase *sql.DB WordpressBaseUrl string WordpressUser string WordpressPassword string } func (migration *MigrateCategories) Execute() []CategoryResult { categories := slowtwitch.GetCategories(migration.SlowtwitchDatabase) var output []CategoryResult for _, category := range categories { hasBeenMigrated := HasBeenMigrated(category.Id, migration.ResultsDatabase) if hasBeenMigrated { continue } errorMessage := "" wordpressParentId, err := getWordpressParentCategoryId(category, migration, errorMessage) if err != nil { errorMessage = errorMessage + err.Error() err = nil } slowtwitchPath, slowtwitchUrl, httpStatus := getSlowtwitchUrlsAndVerify(category) wordpressCategory, err := createInWordpress(category, wordpressParentId, migration) if err != nil { errorMessage = errorMessage + err.Error() } else { err, errorMessage = createRedirect(wordpressCategory, migration, slowtwitchPath, err, errorMessage) } overallResult := submitResults(wordpressCategory, category, slowtwitchUrl, httpStatus, errorMessage, migration) fmt.Println("Successfully Created Category:", wordpressCategory.Name) output = append(output, overallResult) } return output } func submitResults(wordpressCategory wordpress.CategoryData, category slowtwitch.SlowtwitchCategory, slowtwitchUrl string, httpStatus int, errorMessage string, migration *MigrateCategories) CategoryResult { overallResult := CategoryResult{ WordpressId: wordpressCategory.Id, SlowtwitchId: category.Id, OldUrl: slowtwitchUrl, OldUrlStatus: httpStatus, NewUrl: wordpressCategory.Link, IsSuccess: len(errorMessage) == 0, ErrorMessage: errorMessage, } err := CreateCategoryResult(overallResult, migration.ResultsDatabase) if err != nil { fmt.Println(err) err = nil } return overallResult } func createRedirect(wordpressCategory wordpress.CategoryData, migration *MigrateCategories, slowtwitchPath string, err error, errorMessage string) (error, string) { redirectUrl := "/" + strings.ReplaceAll(wordpressCategory.Link, migration.WordpressBaseUrl, "") createRedirect := wordpress.CreateRedirect{ Url: slowtwitchPath, Title: "Category: " + wordpressCategory.Name, MatchType: "page", ActionType: "url", ActionCode: 301, GroupId: 1, ActionData: wordpress.ActionData{ Url: redirectUrl, }, } _, err = createRedirect.Execute(migration.WordpressBaseUrl, migration.WordpressUser, migration.WordpressPassword) if err != nil { errorMessage = errorMessage + err.Error() err = nil } return err, errorMessage } func createInWordpress(category slowtwitch.SlowtwitchCategory, wordpressParentId int, migration *MigrateCategories) (wordpress.CategoryData, error) { createWordpressCategory := wordpress.CreateCategory{ Name: strings.Trim(category.Name, " "), Description: "", ParentId: wordpressParentId, } wordpressCategory, err := createWordpressCategory.Execute(migration.WordpressBaseUrl, migration.WordpressUser, migration.WordpressPassword) if err != nil { return wordpress.CategoryData{}, err } else { return wordpressCategory, nil } } func getSlowtwitchUrlsAndVerify(category slowtwitch.SlowtwitchCategory) (string, string, int) { slowtwitchPath := slowtwitch.ConvertUrlToCategoryFormat(category.FullName) slowtwitchUrl := slowtwitch.GetURL(slowtwitchPath) httpStatus := slowtwitch.GetPageStatus(slowtwitchUrl) return slowtwitchPath, slowtwitchUrl, httpStatus } func getWordpressParentCategoryId(category slowtwitch.SlowtwitchCategory, migration *MigrateCategories, errorMessage string) (int, error) { if category.FatherId != 0 { parentCategory, err := GetSlowtwitchCategoryResult(category.FatherId, migration.ResultsDatabase) if err != nil { return 0, err } else { return parentCategory.WordpressId, nil } } return 0, nil }