Gisle Aune
4 years ago
7 changed files with 278 additions and 2 deletions
-
246cmd/rpdata-dump/main.go
-
6database/mongodb/db.go
-
7database/mongodb/posts.go
-
11database/mongodb/users.go
-
3go.mod
-
6go.sum
-
1repositories/user.go
@ -0,0 +1,246 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"archive/zip" |
|||
"context" |
|||
"encoding/json" |
|||
"flag" |
|||
"fmt" |
|||
"git.aiterp.net/rpdata/api/database" |
|||
"git.aiterp.net/rpdata/api/database/mongodb" |
|||
"git.aiterp.net/rpdata/api/internal/config" |
|||
"git.aiterp.net/rpdata/api/models" |
|||
"log" |
|||
"os" |
|||
"time" |
|||
) |
|||
|
|||
var flagDriver = flag.String("driver", "mongodb", "The database driver to use.") |
|||
var flagHost = flag.String("host", "127.0.0.1", "The host to connect to.") |
|||
var flagPort = flag.Int("port", 27017, "The port to connect on.") |
|||
var flagDb = flag.String("db", "rpdata", "The database name") |
|||
var flagUsername = flag.String("username", "", "") |
|||
var flagPassword = flag.String("password", "", "") |
|||
var flagMechanism = flag.String("mechanism", "", "") |
|||
var flagOutputFile = flag.String("outfile", "dump.zip", "The file to write to.") |
|||
var flagIncludeKeys = flag.Bool("include-keys", false, "Whether to include the keys.") |
|||
|
|||
func main() { |
|||
flag.Parse() |
|||
|
|||
trueValue := true |
|||
truePtr := &trueValue |
|||
|
|||
cfg := config.Database{ |
|||
Driver: *flagDriver, |
|||
Host: *flagHost, |
|||
Port: *flagPort, |
|||
Db: *flagDb, |
|||
Username: *flagUsername, |
|||
Password: *flagPassword, |
|||
Mechanism: *flagMechanism, |
|||
} |
|||
|
|||
mongodb.DisableFixes = true |
|||
|
|||
db, err := database.Init(cfg) |
|||
if err != nil { |
|||
log.Fatalln("Failed to open database:", err) |
|||
} |
|||
|
|||
file, err := os.OpenFile(*flagOutputFile, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600) |
|||
if err != nil { |
|||
log.Fatalln("Failed to open output file:", err) |
|||
} |
|||
|
|||
zipWriter := zip.NewWriter(file) |
|||
defer func() { |
|||
err = zipWriter.Close() |
|||
if err != nil { |
|||
log.Fatalln("Failed to close output file:", err) |
|||
} |
|||
}() |
|||
|
|||
ctx, cancel := context.WithTimeout(context.Background(), time.Minute*30) |
|||
defer cancel() |
|||
|
|||
log.Println("Dumping characters...") |
|||
characters, err := db.Characters().List(ctx, models.CharacterFilter{}) |
|||
if err != nil { |
|||
log.Println("Failed to get characters:", err) |
|||
} |
|||
if len(characters) == 0 { |
|||
log.Println("No characters to dump.") |
|||
} |
|||
for i, character := range characters { |
|||
err := writeJsonFile(zipWriter, "character", i, character.ID, time.Now(), character) |
|||
if err != nil { |
|||
log.Println("Failed to write character", character.ID, ":", err) |
|||
continue |
|||
} |
|||
} |
|||
|
|||
log.Println("Dumping channels...") |
|||
channels, err := db.Channels().List(ctx, models.ChannelFilter{}) |
|||
if err != nil { |
|||
log.Println("Failed to get channels:", err) |
|||
} |
|||
if len(channels) == 0 { |
|||
log.Println("No channels to dump.") |
|||
} |
|||
for i, channel := range channels { |
|||
err := writeJsonFile(zipWriter, "channel", i, channel.Name, time.Now(), channel) |
|||
if err != nil { |
|||
log.Println("Failed to write channel", channel.Name, ":", err) |
|||
continue |
|||
} |
|||
} |
|||
|
|||
log.Println("Dumping changes...") |
|||
changes, err := db.Changes().List(ctx, models.ChangeFilter{}) |
|||
if err != nil { |
|||
log.Println("Failed to get changes:", err) |
|||
} |
|||
if len(changes) == 0 { |
|||
log.Println("No changes to dump.") |
|||
} |
|||
for i, change := range changes { |
|||
err := writeJsonFile(zipWriter, "change", i, change.ID, change.Date, change) |
|||
if err != nil { |
|||
log.Println("Failed to write change", change.ID, ":", err) |
|||
continue |
|||
} |
|||
} |
|||
|
|||
log.Println("Dumping stories...") |
|||
stories, err := db.Stories().List(ctx, models.StoryFilter{}) |
|||
if err != nil { |
|||
log.Println("Failed to get stories:", err) |
|||
} |
|||
unlistedStories, err := db.Stories().List(ctx, models.StoryFilter{Unlisted: truePtr}) |
|||
if err != nil { |
|||
log.Println("Failed to get unlisted stories:", err) |
|||
} else { |
|||
stories = append(stories, unlistedStories...) |
|||
} |
|||
if len(stories) == 0 { |
|||
log.Println("No stories to dump.") |
|||
} |
|||
for i, story := range stories { |
|||
err := writeJsonFile(zipWriter, "story", i, story.ID, story.CreatedDate, story) |
|||
if err != nil { |
|||
log.Println("Failed to write story", story.ID, ":", err) |
|||
continue |
|||
} |
|||
} |
|||
|
|||
log.Println("Dumping chapters...") |
|||
chapters, err := db.Chapters().List(ctx, models.ChapterFilter{}) |
|||
if err != nil { |
|||
log.Println("Failed to get chapters:", err) |
|||
} |
|||
if len(chapters) == 0 { |
|||
log.Println("No chapters to dump.") |
|||
} |
|||
for i, chapter := range chapters { |
|||
err := writeJsonFile(zipWriter, "chapter", i, chapter.ID, chapter.CreatedDate, chapter) |
|||
if err != nil { |
|||
log.Println("Failed to write chapter", chapter.ID, ":", err) |
|||
continue |
|||
} |
|||
} |
|||
|
|||
log.Println("Dumping comments...") |
|||
comments, err := db.Comments().List(ctx, models.CommentFilter{}) |
|||
if err != nil { |
|||
log.Println("Failed to get comments:", err) |
|||
} |
|||
if len(comments) == 0 { |
|||
log.Println("No comments to dump.") |
|||
} |
|||
for i, comment := range comments { |
|||
err := writeJsonFile(zipWriter, "comment", i, comment.ID, comment.CreatedDate, comment) |
|||
if err != nil { |
|||
log.Println("Failed to write comment", comment.ID, ":", err) |
|||
continue |
|||
} |
|||
} |
|||
|
|||
log.Println("Dumping posts...") |
|||
posts, err := db.Posts().List(ctx, models.PostFilter{}) |
|||
if err != nil { |
|||
log.Println("Failed to get posts:", err) |
|||
} |
|||
if len(posts) == 0 { |
|||
log.Println("No posts to dump.") |
|||
} |
|||
for i, post := range posts { |
|||
err := writeJsonFile(zipWriter, "post", i, post.ID, post.Time, post) |
|||
if err != nil { |
|||
log.Println("Failed to write post", post.ID, ":", err) |
|||
continue |
|||
} |
|||
} |
|||
|
|||
log.Println("Dumping logs...") |
|||
logs, err := db.Logs().List(ctx, models.LogFilter{}) |
|||
if err != nil { |
|||
log.Println("Failed to get logs:", err) |
|||
} |
|||
if len(logs) == 0 { |
|||
log.Println("No logs to dump.") |
|||
} |
|||
for i, logEntry := range logs { |
|||
err := writeJsonFile(zipWriter, "post", i, logEntry.ID, logEntry.Date, logEntry) |
|||
if err != nil { |
|||
log.Println("Failed to write post", logEntry.ID, ":", err) |
|||
continue |
|||
} |
|||
} |
|||
|
|||
log.Println("Dumping users...") |
|||
users, err := db.Users().List(ctx) |
|||
if err != nil { |
|||
log.Println("Failed to get users:", err) |
|||
} |
|||
if len(users) == 0 { |
|||
log.Println("No users to dump.") |
|||
} |
|||
for i, userEntry := range users { |
|||
err := writeJsonFile(zipWriter, "user", i, userEntry.ID, time.Now(), userEntry) |
|||
if err != nil { |
|||
log.Println("Failed to write user", userEntry.ID, ":", err) |
|||
continue |
|||
} |
|||
} |
|||
|
|||
if *flagIncludeKeys { |
|||
log.Println("Dumping keys...") |
|||
keys, err := db.Keys().List(ctx, models.KeyFilter{}) |
|||
if err != nil { |
|||
log.Println("Failed to get users:", err) |
|||
} |
|||
if len(keys) == 0 { |
|||
log.Println("No users to dump.") |
|||
} |
|||
for i, keyEntry := range keys { |
|||
err := writeJsonFile(zipWriter, "key", i, keyEntry.ID, time.Now(), keyEntry) |
|||
if err != nil { |
|||
log.Println("Failed to write key", keyEntry.ID, ":", err) |
|||
continue |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
func writeJsonFile(zw *zip.Writer, model string, idx int, id string, t time.Time, data interface{}) error { |
|||
w, err := zw.CreateHeader(&zip.FileHeader{ |
|||
Name: fmt.Sprintf("rpdata_dump_v1/%s/%06d_%s.json", model, idx, id), |
|||
Modified: t, |
|||
}) |
|||
if err != nil { |
|||
return err |
|||
} |
|||
|
|||
return json.NewEncoder(w).Encode(data) |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue