package cmd import ( "encoding/json" "fmt" "kontor-api-gin/internal/models" "log/slog" "os" "github.com/spf13/cobra" "github.com/spf13/viper" "resty.dev/v3" ) var ( server string filename string apiVersion string ) var exportCmd = &cobra.Command{ Use: "export", Short: "Export Kontor Database", Long: "Export Kontor Database to given file", // Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { slog.Info("export kontor") slog.Info("Verbosity level", "level", verbose) slog.Info(fmt.Sprintf("Using server: %s", server)) var login LoginResponse client := resty.New() PostJSON(client, fmt.Sprintf("%s/%s/%s", server, "api", "login"), &login) type ExportData struct { Sport []models.SportDTO `json:"sport"` Player []models.PlayerDTO `json:"player"` Team []models.TeamDTO `json:"team"` Position []models.PositionDTO `json:"field_position"` Rooster []models.RoosterDTO `json:"rooster"` Vendor []models.VendorDTO `json:"vendor"` CardSet []models.CardSetDTO `json:"card_set"` Card []models.CardDTO `json:"card"` Artist []models.ArtistDTO `json:"artist"` Publisher []models.PublisherDTO `json:"publisher"` Worktype []models.WorkTypeDTO `json:"worktype"` Comic []models.ComicDTO `json:"comic"` Volume []models.VolumeDTO `json:"volume"` StoryArc []models.StoryArcDTO `json:"story_arc"` Issue []models.IssueDTO `json:"issue"` TradePaperback []models.TradePaperbackDTO `json:"trade_paperback"` ComicWork []models.ComicworkDTO `json:"comic_work"` IssueWork []models.IssueworkDTO `json:"issue_work"` Article []models.ArticleDTO `json:"article"` BookshelfPublisher []models.BookshelfPublisherDTO `json:"bookshelf_publisher"` Book []models.BookDTO `json:"book"` Author []models.AuthorDTO `json:"author"` ArticleAuthor []models.ArticleAuthorDTO `json:"article_author"` BookAuthor []models.BookAuthorDTO `json:"book_author"` MediaArticle []models.MediaArticleDTO `json:"media_article"` MediaVideo []models.MediaVideoDTO `json:"media_video"` MediaLoFi []models.MediaLoFiDTO `json:"media_lofi"` MediaFile []models.MediaFileDTO `json:"media_file"` MediaActor []models.MediaActorDTO `json:"media_actor"` MediaActorFile []models.MediaActorFileDTO `json:"media_actor_file"` Profile []models.ProfileDTO `json:"profile"` Permission []models.PermissionDTO `json:"permission"` Assignment []models.AssignmentDTO `json:"assignment"` Token []models.TokenDTO `json:"token"` MailAccount []map[string]interface{} `json:"mail_account"` Mail []map[string]interface{} `json:"mail"` } var ( sports []models.SportDTO players []models.PlayerDTO teams []models.TeamDTO positions []models.PositionDTO roosters []models.RoosterDTO vendors []models.VendorDTO cardsets []models.CardSetDTO cards []models.CardDTO artists []models.ArtistDTO publishers []models.PublisherDTO worktypes []models.WorkTypeDTO comics []models.ComicDTO volumes []models.VolumeDTO storyarcs []models.StoryArcDTO issues []models.IssueDTO tradepaperbacks []models.TradePaperbackDTO comicworks []models.ComicworkDTO issueworks []models.IssueworkDTO articles []models.ArticleDTO bookshelf_publishers []models.BookshelfPublisherDTO books []models.BookDTO autors []models.AuthorDTO article_authors []models.ArticleAuthorDTO book_authors []models.BookAuthorDTO mediaarticles []models.MediaArticleDTO mediavideos []models.MediaVideoDTO mediaactors []models.MediaActorDTO mediaactorfiles []models.MediaActorFileDTO mediafiles []models.MediaFileDTO medialofis []models.MediaLoFiDTO profiles []models.ProfileDTO permissions []models.PermissionDTO assignments []models.AssignmentDTO tokens []models.TokenDTO mailaccounts []map[string]interface{} mail []map[string]interface{} ) registry := map[string]any{ "tysc/sports": &sports, "tysc/players": &players, "tysc/teams": &teams, "tysc/positions": &positions, "tysc/roosters": &roosters, "tysc/vendors": &vendors, "tysc/cardsets": &cardsets, "tysc/cards": &cards, "comics/artists": &artists, "comics/publishers": &publishers, "comics/worktypes": &worktypes, "comics/comics": &comics, "comics/volumes": &volumes, "comics/storyarcs": &storyarcs, "comics/issues": &issues, "comics/tradepaperbacks": &tradepaperbacks, "comics/comicworks": &comicworks, "comics/issueworks": &issueworks, "bookshelf/articles": &articles, "bookshelf/publishers": &bookshelf_publishers, "bookshelf/books": &books, "bookshelf/authors": &autors, "bookshelf/articleauthors": &article_authors, "bookshelf/bookauthors": &book_authors, "media/articles": &mediaarticles, "media/videos": &mediavideos, "media/actors": &mediaactors, "media/files": &mediafiles, "media/actorfiles": &mediaactorfiles, "media/lofis": &medialofis, "user/profiles": &profiles, "user/permissions": &permissions, "user/assignments": &assignments, "user/tokens": &tokens, "admin/mailaccounts": &mailaccounts, "user/mail": &mail, } for path, value := range registry { GetJSON(client, login.Token, fmt.Sprintf("%s/%s/%s", server, "api/v1", path), value) } export := ExportData{ Sport: sports, Player: players, Team: teams, Position: positions, Rooster: roosters, Vendor: vendors, CardSet: cardsets, Card: cards, Artist: artists, Publisher: publishers, Worktype: worktypes, Comic: comics, Volume: volumes, StoryArc: storyarcs, Issue: issues, TradePaperback: tradepaperbacks, ComicWork: comicworks, IssueWork: issueworks, Article: articles, BookshelfPublisher: bookshelf_publishers, Book: books, Author: autors, ArticleAuthor: article_authors, BookAuthor: book_authors, MediaArticle: mediaarticles, MediaVideo: mediavideos, MediaActor: mediaactors, MediaFile: mediafiles, MediaLoFi: medialofis, Profile: profiles, Permission: permissions, Assignment: assignments, Token: tokens, MailAccount: mailaccounts, Mail: mail, } defer client.Close() jsonData, err := json.MarshalIndent(export, "", " ") if err != nil { slog.Info("JSON MarshalIndent failed", "Error:", err) } // Write bytes to file err = os.WriteFile(filename, jsonData, 0644) if err != nil { slog.Info("Error writing file:", "Error", err) } slog.Info("export kontor finished") }, } func GetJSON(client *resty.Client, token string, url string, v any) { _, err := client.R(). SetAuthToken(token). SetHeader("Accept", "application/json"). SetResult(v). Get(url) if err != nil { slog.Info(url, "error", err.Error()) } } func PostJSON(client *resty.Client, url string, v any) { _, err := client.R(). SetBody(Login{ Email: "thomas.peetz@thpeetz.de", Password: "admin", }). SetHeader("Accept", "application/json"). SetResult(v). Post(url) if err != nil { slog.Info("Health", "error", err.Error()) } slog.Info(url, "token", v) } func init() { rootCmd.AddCommand(exportCmd) exportCmd.PersistentFlags().StringVarP(&server, "server", "s", "http://127.0.0.1:8550", "Define server to get Kontor items") viper.BindPFlag("server", exportCmd.PersistentFlags().Lookup("server")) exportCmd.PersistentFlags().StringVarP(&filename, "file", "f", "/home/tpeetz/.sync/media/data-gin.json", "Filename to store data") viper.BindPFlag("file", exportCmd.PersistentFlags().Lookup("file")) exportCmd.PersistentFlags().StringVarP(&apiVersion, "api", "a", "api/v1", "API Version") viper.BindPFlag("api", exportCmd.PersistentFlags().Lookup("api")) }