create redirects, redirect url converter, results db

This commit is contained in:
Ross Trottier 2024-05-15 17:37:42 -06:00
parent 00ba765dc8
commit 5737ce23d1
17 changed files with 196 additions and 25 deletions

37
main.go
View File

@ -1,33 +1,44 @@
package main package main
import ( import (
"federated.computer/wp-sync-slowtwitch/services/slowtwitch" "federated.computer/wp-sync-slowtwitch/services/wordpress"
"fmt" "fmt"
) )
const baseUrl = "https://go-api-playground.local/wp-json/wp/v2/" const baseUrl = "https://go-api-playground.local/wp-json/"
const wordpressKey = "admin" const wordpressKey = "admin"
const wordpressSecret = "S34E keY1 A1uX 6ncs Rx4T f21W" const wordpressSecret = "S34E keY1 A1uX 6ncs Rx4T f21W"
const slowtwitchAdminUser = "admin" const slowtwitchAdminUser = "admin"
const slowtwitchAdminPass = "yxnh93Ybbz2Nm8#mp28zCVv" const slowtwitchAdminPass = "yxnh93Ybbz2Nm8#mp28zCVv"
const slowtwitchDbUrl = "slowtwitch.northend.network"
const slowtwitchDbPort = "3306"
const slowtwitchDbName = "slowtwitch" const slowtwitchDbName = "slowtwitch"
const migrationDbName = "slowtwitch_transfer"
const federatedDbUrl = "slowtwitch.northend.network"
const federatedDbPort = "3306"
var appCache AppCache var appCache AppCache
func main() { func main() {
// TODO Use cached data to correctly build post form submissions // TODO Category migration
slowtwitchDB, err := slowtwitch.Connect(slowtwitchAdminUser, slowtwitchAdminPass, slowtwitchDbUrl, slowtwitchDbPort, slowtwitchDbName) // TODO User migration
// TODO Article migration
//slowtwitchDB, err := migration.Connect(slowtwitchAdminUser, slowtwitchAdminPass, federatedDbUrl, federatedDbPort, slowtwitchDbName)
createRedirect := wordpress.CreateRedirect{
Url: "/gotest",
Title: "Test From Go",
MatchType: "page",
ActionType: "url",
ActionCode: 301,
GroupId: 1,
ActionData: wordpress.ActionData{
Url: "/GoTestResult",
},
}
result, err := createRedirect.Execute(baseUrl, wordpressKey, wordpressSecret)
if err != nil { if err != nil {
fmt.Println(err) panic(err)
}
categories := slowtwitch.GetCategories(slowtwitchDB)
for _, category := range categories {
fmt.Println(category.FullName)
} }
fmt.Println(result)
} }

View File

@ -0,0 +1,45 @@
package migration
import (
"database/sql"
"errors"
"fmt"
)
type CategoryResult struct {
WordpressId int
SlowtwitchId int
OldUrl string
OldUrlStatus int
NewUrl string
IsSuccess bool
ErrorMessage string
}
func CreateCategoryResult(result CategoryResult, db *sql.DB) error {
_, err := db.Exec("insert into CategoryResults (SlowtwitchId, WordpressId, OldUrl, NewUrl, IsSuccess, ErrorMessage, OldUrlStatus) values (?, ?, ?, ?, ?, ?, ?);", result.SlowtwitchId, result.WordpressId, result.OldUrl, result.NewUrl, result.IsSuccess, result.ErrorMessage)
return err
}
func GetSlowtwitchCategoryResult(slowtwitchId int, db *sql.DB) (CategoryResult, error) {
rows, err := db.Query("select WordpressId, SlowtwitchId, OldUrl, NewUrl, (IsSuccess = b'1'), ErrorMessage, OldUrlStatus from CategoryResults where SlowtwitchId = ?", slowtwitchId)
if err != nil {
fmt.Println(err)
}
defer rows.Close()
for rows.Next() {
var slowtwitchCategoryResult CategoryResult
err = rows.Scan(&slowtwitchCategoryResult.WordpressId, &slowtwitchCategoryResult.SlowtwitchId, &slowtwitchCategoryResult.OldUrl, &slowtwitchCategoryResult.NewUrl, &slowtwitchCategoryResult.IsSuccess, &slowtwitchCategoryResult.ErrorMessage, &slowtwitchCategoryResult.OldUrlStatus)
if err != nil {
fmt.Println(err)
}
if slowtwitchCategoryResult.SlowtwitchId == slowtwitchId {
return slowtwitchCategoryResult, nil
}
}
return CategoryResult{}, errors.New("Category Not Found")
}

View File

@ -1,4 +1,4 @@
package slowtwitch package migration
import ( import (
"database/sql" "database/sql"

View File

@ -0,0 +1,18 @@
package migration
//THIS SHOULD BE A STRUCT WITH AN EXECUTE
/*import (
"database/sql"
"federated.computer/wp-sync-slowtwitch/services/slowtwitch"
)
func MigrateCategories(slowtwitchDB *sql.DB, resultsDB *sql.DB, baseUrl, user, pass string) ([]CategoryResult, error) {
slowtwitchCategories := slowtwitch.GetCategories(slowtwitchDB)
for _, category := range slowtwitchCategories {
}
var results []CategoryResult
}*/

View File

@ -3,6 +3,7 @@ package slowtwitch
import ( import (
"database/sql" "database/sql"
"fmt" "fmt"
"sort"
) )
type SlowtwitchCategory struct { type SlowtwitchCategory struct {
@ -15,7 +16,7 @@ type SlowtwitchCategory struct {
} }
func GetCategories(db *sql.DB) []SlowtwitchCategory { func GetCategories(db *sql.DB) []SlowtwitchCategory {
rows, err := db.Query("select ID, Name, Full_Name, FatherID, CatDepth, Number_of_Links from glinks_Category;") rows, err := db.Query("select ID, Name, Full_Name, FatherID, CatDepth, Number_of_Links from glinks_Category where Number_of_Links > 0;")
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
@ -36,5 +37,9 @@ func GetCategories(db *sql.DB) []SlowtwitchCategory {
categories = append(categories, category) categories = append(categories, category)
} }
sort.Slice(categories, func(i, j int) bool {
return categories[i].CatDepth < categories[j].CatDepth
})
return categories return categories
} }

View File

@ -0,0 +1,27 @@
package slowtwitch
import (
"fmt"
"io"
"net/http"
"strings"
)
func GetPageStatus(url string) int {
response, err := http.Get(url)
if err != nil {
fmt.Println(err)
}
defer response.Body.Close()
bytes, _ := io.ReadAll(response.Body)
html := string(bytes)
if strings.Contains(html, "<h2>Error</h2>") {
return 404
} else {
return 200
}
}

View File

@ -0,0 +1,16 @@
package slowtwitch
import "strings"
func ConvertUrlToCategoryFormat(oldUrl string) string {
output := strings.ReplaceAll(oldUrl, " ", "_")
output = strings.ReplaceAll(output, "$", "_")
output = strings.ReplaceAll(output, "(", "_")
output = strings.ReplaceAll(output, ")", "_")
return output + "/index.html"
}
func GetURL(path string) string {
return "https://www.slowtwitch.com/" + path
}

View File

@ -9,11 +9,10 @@ type CreateCategory struct {
Name string `json:"name"` Name string `json:"name"`
Description string `json:"description"` Description string `json:"description"`
ParentId int `json:"parent"` ParentId int `json:"parent"`
Slug string `json:"slug"`
} }
func (parameters *CreateCategory) Execute(baseUrl, user, pass string) CategoryData { func (parameters *CreateCategory) Execute(baseUrl, user, pass string) CategoryData {
endpoint := baseUrl + "categories" endpoint := baseUrl + "wp/v2/categories"
body := utilities.PostHttpRequestToWordpress(endpoint, user, pass, parameters) body := utilities.PostHttpRequestToWordpress(endpoint, user, pass, parameters)
var category CategoryData var category CategoryData
err := json.Unmarshal(body, &category) err := json.Unmarshal(body, &category)

View File

@ -24,7 +24,7 @@ func (parameters *CreateImage) Execute(baseUrl, user, pass string) CreateImageRe
defer utilities.CloseBodyAndCheckError(resp.Body) defer utilities.CloseBodyAndCheckError(resp.Body)
body, err := io.ReadAll(resp.Body) body, err := io.ReadAll(resp.Body)
utilities.CheckError(err) utilities.CheckError(err)
request, err := http.NewRequest("POST", baseUrl+"media", bytes.NewReader(body)) request, err := http.NewRequest("POST", baseUrl+"wp/v2/media", bytes.NewReader(body))
utilities.CheckError(err) utilities.CheckError(err)
filename := GetFileName(parameters.Url) filename := GetFileName(parameters.Url)
request.Header.Set("Content-Disposition", `attachment;filename="`+filename+`"`) request.Header.Set("Content-Disposition", `attachment;filename="`+filename+`"`)

View File

@ -24,7 +24,7 @@ type CreatePostResponse struct {
} }
func (parameters *CreatePost) Execute(baseUrl, user, pass string) CreatePostResponse { func (parameters *CreatePost) Execute(baseUrl, user, pass string) CreatePostResponse {
endpoint := baseUrl + "posts" endpoint := baseUrl + "wp/v2/posts"
body := utilities.PostHttpRequestToWordpress(endpoint, user, pass, parameters) body := utilities.PostHttpRequestToWordpress(endpoint, user, pass, parameters)
var post CreatePostResponse var post CreatePostResponse
err := json.Unmarshal(body, &post) err := json.Unmarshal(body, &post)

View File

@ -0,0 +1,50 @@
package wordpress
import (
"encoding/json"
"errors"
"federated.computer/wp-sync-slowtwitch/utilities"
)
type CreateRedirect struct {
Title string `json:"title"`
Url string `json:"url"`
MatchType string `json:"match_type"`
ActionType string `json:"action_type"`
ActionCode int `json:"action_code"`
GroupId int `json:"group_id"`
ActionData ActionData `json:"action_data"`
}
type ActionData struct {
Url string `json:"url"`
}
type CreateRedirectResponse struct {
Items []CreatedRedirect `json:"items"`
}
type CreatedRedirect struct {
Id int `json:"id"`
Url string `json:"url"`
MatchUrl string `json:"match_url"`
ActionData struct {
Url string `json:"url"`
} `json:"action_data"`
}
func (parameters *CreateRedirect) Execute(baseUrl, user, pass string) (CreatedRedirect, error) {
url := baseUrl + "redirection/v1/redirect"
response := utilities.PostHttpRequestToWordpress(url, user, pass, parameters)
var results CreateRedirectResponse
err := json.Unmarshal(response, &results)
if err != nil {
return CreatedRedirect{}, err
}
for _, result := range results.Items {
if result.Url == parameters.Url {
return result, nil
}
}
return CreatedRedirect{}, errors.New("Redirect Not Found")
}

View File

@ -18,7 +18,7 @@ type CreateTagResponse struct {
} }
func (parameters *CreateTag) Execute(baseUrl, user, pass string) CreateTagResponse { func (parameters *CreateTag) Execute(baseUrl, user, pass string) CreateTagResponse {
endpoint := baseUrl + "tags" endpoint := baseUrl + "wp/v2/tags"
body := utilities.PostHttpRequestToWordpress(endpoint, user, pass, parameters) body := utilities.PostHttpRequestToWordpress(endpoint, user, pass, parameters)
var tagResponse CreateTagResponse var tagResponse CreateTagResponse
err := json.Unmarshal(body, &tagResponse) err := json.Unmarshal(body, &tagResponse)

View File

@ -24,7 +24,7 @@ type CreateUserResponse struct {
} }
func (parameters *CreateUser) Execute(baseUrl, user, pass string) CreateUserResponse { func (parameters *CreateUser) Execute(baseUrl, user, pass string) CreateUserResponse {
endpoint := baseUrl + "users" endpoint := baseUrl + "wp/v2/users"
body := utilities.PostHttpRequestToWordpress(endpoint, user, pass, parameters) body := utilities.PostHttpRequestToWordpress(endpoint, user, pass, parameters)
var userData CreateUserResponse var userData CreateUserResponse
err := json.Unmarshal(body, &userData) err := json.Unmarshal(body, &userData)

View File

@ -14,7 +14,7 @@ type CategoryData struct {
} }
func GetCategory(name, baseUrl, user, pass string) (CategoryData, bool) { func GetCategory(name, baseUrl, user, pass string) (CategoryData, bool) {
endpoint := baseUrl + "categories?search=" + url.QueryEscape(name) endpoint := baseUrl + "wp/v2/categories?search=" + url.QueryEscape(name)
response := utilities.GetHttpRequestToWordpress(endpoint, user, pass) response := utilities.GetHttpRequestToWordpress(endpoint, user, pass)
var categoryData []CategoryData var categoryData []CategoryData
err := json.Unmarshal(response, &categoryData) err := json.Unmarshal(response, &categoryData)

View File

@ -22,7 +22,7 @@ type PostData struct {
} }
func GetPosts(baseUrl, user, pass string) []PostData { func GetPosts(baseUrl, user, pass string) []PostData {
url := baseUrl + "posts?per_page=99" url := baseUrl + "wp/v2/posts?per_page=99"
body := utilities.GetHttpRequestToWordpress(url, user, pass) body := utilities.GetHttpRequestToWordpress(url, user, pass)
var posts []PostData var posts []PostData
err := json.Unmarshal(body, &posts) err := json.Unmarshal(body, &posts)

View File

@ -13,7 +13,7 @@ type TagData struct {
} }
func GetTag(tagName, baseUrl, user, pass string) (TagData, bool) { func GetTag(tagName, baseUrl, user, pass string) (TagData, bool) {
endpoint := baseUrl + "tags?search=" + url.QueryEscape(tagName) endpoint := baseUrl + "wp/v2/tags?search=" + url.QueryEscape(tagName)
body := utilities.GetHttpRequestToWordpress(endpoint, user, pass) body := utilities.GetHttpRequestToWordpress(endpoint, user, pass)
var tagData []TagData var tagData []TagData
err := json.Unmarshal(body, &tagData) err := json.Unmarshal(body, &tagData)

View File

@ -12,7 +12,7 @@ type UserData struct {
} }
func GetUser(baseUrl, name, user, pass string) (UserData, bool) { func GetUser(baseUrl, name, user, pass string) (UserData, bool) {
endpoint := baseUrl + "users?search=" + url.QueryEscape(name) endpoint := baseUrl + "wp/v2/users?search=" + url.QueryEscape(name)
body := utilities.GetHttpRequestToWordpress(endpoint, user, pass) body := utilities.GetHttpRequestToWordpress(endpoint, user, pass)
var userData []UserData var userData []UserData
err := json.Unmarshal(body, &userData) err := json.Unmarshal(body, &userData)