diff --git a/services/migration/migrate-posts.go b/services/migration/migrate-posts.go index bbf43d2..cb49976 100644 --- a/services/migration/migrate-posts.go +++ b/services/migration/migrate-posts.go @@ -37,6 +37,7 @@ func (migration MigratePosts) Execute() []PostResult { panic("Could not migrate posts due to tags not found:" + wpTagErr.Error()) } + //TODO Re-thread using a work input channel, work output channel, and waitgroup var postResults []PostResult batchSize := 5 var postBatch []int @@ -285,6 +286,213 @@ func (migration MigratePosts) Execute() []PostResult { return postResults } +func createPost(postId int, migration MigratePosts, wpTagData []wordpress.TagData) PostResult { + errorMessage := "" + //migrate + postBase, postBaseErr := slowtwitch.GetPostBase(postId, migration.SlowtwitchDatabase) + + if postBaseErr != nil { + errorMessage = errorMessage + postBaseErr.Error() + failedPostResult := createPostFailureResult(postId, errorMessage, migration.ResultsDatabase) + return failedPostResult + } + + createWordpressPost := wordpress.CreatePost{ + Title: postBase.Title, + Excerpt: postBase.Description, + Status: "publish", + } + + if postBase.DatePublished.Valid { + t := postBase.DatePublished.Time + timeString := fmt.Sprintf("%d-%02d-%02dT%02d:%02d:%02d", + t.Year(), t.Month(), t.Day(), + t.Hour(), t.Minute(), t.Second()) + createWordpressPost.Date = timeString + } else { + errorMessage = errorMessage + "Invalid Date Published" + failedPostResult := createPostFailureResult(postId, errorMessage, migration.ResultsDatabase) + return failedPostResult + } + + for _, tag := range wpTagData { + if postBase.Bike == true && tag.Name == "bike" { + createWordpressPost.Tags = append(createWordpressPost.Tags, tag.Id) + } + if postBase.Swim == true && tag.Name == "swim" { + createWordpressPost.Tags = append(createWordpressPost.Tags, tag.Id) + } + if postBase.Run == true && tag.Name == "run" { + createWordpressPost.Tags = append(createWordpressPost.Tags, tag.Id) + } + } + + var wordPressCategoryIds []int + var firstCategoryResult CategoryResult + for _, slowtwitchCategoryId := range postBase.CategoryIds { + categoryResult, err := GetSlowtwitchCategoryResult(slowtwitchCategoryId, migration.ResultsDatabase) + if err != nil { + errorMessage = errorMessage + err.Error() + failedPostResult := createPostFailureResult(postId, errorMessage, migration.ResultsDatabase) + return failedPostResult + } + wordPressCategoryIds = append(wordPressCategoryIds, categoryResult.WordpressId) + firstCategoryResult = categoryResult + } + + if len(wordPressCategoryIds) == 0 { + errorMessage = "This post has no categories and is broken on the production site." + failedPostResult := createPostFailureResult(postId, errorMessage, migration.ResultsDatabase) + return failedPostResult + } + + createWordpressPost.Categories = wordPressCategoryIds + //Get Author ID + editor, findEditorErr := GetEditor(postBase.Author, postBase.AuthorEmail, migration.ResultsDatabase) + + if findEditorErr != nil { + editor, catchAllEditorErr := GetEditor("admin", "slowman2@slowtwitch.com", migration.ResultsDatabase) + + if catchAllEditorErr != nil { + errorMessage = errorMessage + findEditorErr.Error() + failedPostResult := createPostFailureResult(postId, errorMessage, migration.ResultsDatabase) + return failedPostResult + } + createWordpressPost.Author = editor.WordpressId + } + createWordpressPost.Author = editor.WordpressId + //Get old link + oldLink := strings.ReplaceAll(firstCategoryResult.OldUrl, "index.html", "") + slowtwitch.ConvertPostTitleToPath(postBase.Title, postBase.Id) + linkStatus := slowtwitch.GetPageStatus(oldLink) + + if linkStatus == 404 { + errorMessage = errorMessage + "Page not found on Slowtwitch" + failedPostResult := createPostFailureResult(postId, errorMessage, migration.ResultsDatabase) + return failedPostResult + } + + //Get page, parse out post data and images + //Upload images to wordpress, swap out with new image urls + //Submit + imagePaths, html, retreiveHtmlErr := slowtwitch.GetImagesAndPostHtml(oldLink) + if retreiveHtmlErr != nil { + errorMessage = errorMessage + retreiveHtmlErr.Error() + failedPostResult := createPostFailureResult(postId, errorMessage, migration.ResultsDatabase) + return failedPostResult + } + //Create images from the image paths + var imageResults []ImageResult + + for i, imagePath := range imagePaths { + //construct URL + imageUrl := "https://www.slowtwitch.com" + imagePath + createWordpressImage := wordpress.CreateImage{ + Url: imageUrl, + } + //submit image + wordpressImage, wordpressImageErr := createWordpressImage.Execute(migration.WordpressBaseUrl, migration.WordpressUser, migration.WordpressPassword) + + if wordpressImageErr != nil { + errorMessage = errorMessage + wordpressImageErr.Error() + imageFailureResult := ImageResult{ + OldUrl: imageUrl, + NewUrl: "", + WordpressId: 0, + IsSuccess: false, + } + imageResults = append(imageResults, imageFailureResult) + continue + } + //first photo is the featured photo + if i == 0 { + createWordpressPost.FeaturedMedia = wordpressImage.Id + } + //begin process of recording result + imageResult := ImageResult{ + OldUrl: imageUrl, + NewUrl: wordpressImage.Link, + WordpressId: wordpressImage.Id, + IsSuccess: true, + } + imageResults = append(imageResults, imageResult) + //replace old links with new in post html + newImagePath := "/wp-content/uploads/" + wordpressImage.MediaDetails.File + html = strings.ReplaceAll(html, imagePath, newImagePath) + //create redirect + imageRedirect := wordpress.CreateRedirect{ + Title: postBase.Title + "image-" + string((i + 1)), + Url: imagePath, + MatchType: "page", + ActionType: "url", + ActionCode: 301, + GroupId: 1, + ActionData: wordpress.ActionData{ + Url: "/" + wordpressImage.Slug, + }, + } + + _, imageRedirectErr := imageRedirect.Execute(migration.WordpressBaseUrl, migration.WordpressUser, migration.WordpressPassword) + + if imageRedirectErr != nil { + fmt.Println("Failed to create image redirect:", imageUrl, ":", imageRedirectErr.Error()) + } + } + + createWordpressPost.Content = html + post, createWordpressPostErr := createWordpressPost.Execute(migration.WordpressBaseUrl, migration.WordpressUser, migration.WordpressPassword) + if createWordpressPostErr != nil { + errorMessage = errorMessage + createWordpressPostErr.Error() + postFailureResult := createPostFailureResult(postId, errorMessage, migration.ResultsDatabase) + return postFailureResult + } + //set up post result here to create + //truncate error message for db + if len(errorMessage) > 1450 { + errorMessage = errorMessage[:1450] + } + + postResult := PostResult{ + SlowtwitchId: postId, + WordpressId: post.Id, + OldUrl: oldLink, + OldUrlStatus: linkStatus, + NewUrl: post.Link, + IsSuccess: true, + ErrorMessage: errorMessage, + } + + postResultId, createPostResultErr := CreatePostResult(postResult, migration.ResultsDatabase) + if createPostResultErr != nil { + fmt.Println("Could not record post result for Slowtwitch post:" + strconv.Itoa(postId) + createPostResultErr.Error()) + } + for _, imageResult := range imageResults { + imageResult.PostId = postResultId + createImageResultErr := CreateImageResult(imageResult, migration.ResultsDatabase) + if createImageResultErr != nil { + fmt.Println("Error recording image result") + } + } + oldPath := strings.ReplaceAll(oldLink, "https://www.slowtwitch.com", "") + postRedirect := wordpress.CreateRedirect{ + Title: "Article Redirect" + postBase.Title, + Url: oldPath, + MatchType: "page", + ActionType: "url", + ActionCode: 301, + GroupId: 1, + ActionData: wordpress.ActionData{ + Url: "/" + strings.ReplaceAll(postResult.NewUrl, migration.WordpressBaseUrl, ""), + }, + } + _, postRedirectErr := postRedirect.Execute(migration.WordpressBaseUrl, migration.WordpressUser, migration.WordpressPassword) + if postRedirectErr != nil { + fmt.Println("Error creating redirect for", postId, ":"+postRedirectErr.Error()) + } + fmt.Println("Successfully created post and result for", postId) + updateAcfImages(imageResults, post.Id, migration.WordpressBaseUrl, migration.WordpressUser, migration.WordpressPassword) + return postResult +} + func updatePostRelationships(postResults []PostResult, migration MigratePosts) { fmt.Println("Updating post relationships") batchSize := 5