diff options
author | 2021-09-09 16:15:25 +0200 | |
---|---|---|
committer | 2021-09-09 16:15:25 +0200 | |
commit | 555ea8edfb2c30d149b3ca6cb0fbe53f2798c7bc (patch) | |
tree | 24567c4c365a007fcd2d6603e696b363129abb77 /internal/trans/import.go | |
parent | Merge pull request #198 from NyaaaWhatsUpDoc/update/sqlite-library (diff) | |
download | gotosocial-555ea8edfb2c30d149b3ca6cb0fbe53f2798c7bc.tar.xz |
Import export (#194)
* start with export/import code
* messing about with decoding/encoding
* some more fiddling
* stuff is WORKING
* working pretty alright!
* go fmt
* fix up tests, add docs
* start backup/restore doc
* tweaks
* credits
* update advancedVisibility settings
* update bun library -> v1.0.4
Signed-off-by: kim (grufwub) <grufwub@gmail.com>
* update oauth library -> v4.3.1-SSB
Signed-off-by: kim (grufwub) <grufwub@gmail.com>
* handle oauth token scope, fix user.SigninCount + token.UserID
Signed-off-by: kim (grufwub) <grufwub@gmail.com>
* update oauth library --> v4.3.2-SSB
Signed-off-by: kim (grufwub) <grufwub@gmail.com>
* update sqlite library -> v1.13.0
Signed-off-by: kim (grufwub) <grufwub@gmail.com>
* review changes
* start with export/import code
* messing about with decoding/encoding
* some more fiddling
* stuff is WORKING
* working pretty alright!
* go fmt
* fix up tests, add docs
* start backup/restore doc
* tweaks
* credits
* update advancedVisibility settings
* review changes
Co-authored-by: kim (grufwub) <grufwub@gmail.com>
Co-authored-by: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>
Diffstat (limited to 'internal/trans/import.go')
-rw-r--r-- | internal/trans/import.go | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/internal/trans/import.go b/internal/trans/import.go new file mode 100644 index 000000000..74624e540 --- /dev/null +++ b/internal/trans/import.go @@ -0,0 +1,146 @@ +/* + GoToSocial + Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +package trans + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "os" + + transmodel "github.com/superseriousbusiness/gotosocial/internal/trans/model" +) + +func (i *importer) Import(ctx context.Context, path string) error { + if path == "" { + return errors.New("Export: path empty") + } + + file, err := os.Open(path) + if err != nil { + return fmt.Errorf("Import: couldn't export to %s: %s", path, err) + } + + decoder := json.NewDecoder(file) + decoder.UseNumber() + + for { + entry := transmodel.Entry{} + err := decoder.Decode(&entry) + if err != nil { + if err == io.EOF { + i.log.Infof("Import: reached end of file") + return neatClose(file) + } + return fmt.Errorf("Import: error decoding in readLoop: %s", err) + } + if err := i.inputEntry(ctx, entry); err != nil { + return fmt.Errorf("Import: error inputting entry: %s", err) + } + } +} + +func (i *importer) inputEntry(ctx context.Context, entry transmodel.Entry) error { + t, ok := entry[transmodel.TypeKey].(string) + if !ok { + return errors.New("inputEntry: could not derive entry type: missing or malformed 'type' key in json") + } + + switch transmodel.Type(t) { + case transmodel.TransAccount: + account, err := i.accountDecode(entry) + if err != nil { + return fmt.Errorf("inputEntry: error decoding entry into account: %s", err) + } + if err := i.putInDB(ctx, account); err != nil { + return fmt.Errorf("inputEntry: error adding account to database: %s", err) + } + i.log.Infof("inputEntry: added account with id %s", account.ID) + return nil + case transmodel.TransBlock: + block, err := i.blockDecode(entry) + if err != nil { + return fmt.Errorf("inputEntry: error decoding entry into block: %s", err) + } + if err := i.putInDB(ctx, block); err != nil { + return fmt.Errorf("inputEntry: error adding block to database: %s", err) + } + i.log.Infof("inputEntry: added block with id %s", block.ID) + return nil + case transmodel.TransDomainBlock: + block, err := i.domainBlockDecode(entry) + if err != nil { + return fmt.Errorf("inputEntry: error decoding entry into domain block: %s", err) + } + if err := i.putInDB(ctx, block); err != nil { + return fmt.Errorf("inputEntry: error adding domain block to database: %s", err) + } + i.log.Infof("inputEntry: added domain block with id %s", block.ID) + return nil + case transmodel.TransFollow: + follow, err := i.followDecode(entry) + if err != nil { + return fmt.Errorf("inputEntry: error decoding entry into follow: %s", err) + } + if err := i.putInDB(ctx, follow); err != nil { + return fmt.Errorf("inputEntry: error adding follow to database: %s", err) + } + i.log.Infof("inputEntry: added follow with id %s", follow.ID) + return nil + case transmodel.TransFollowRequest: + fr, err := i.followRequestDecode(entry) + if err != nil { + return fmt.Errorf("inputEntry: error decoding entry into follow request: %s", err) + } + if err := i.putInDB(ctx, fr); err != nil { + return fmt.Errorf("inputEntry: error adding follow request to database: %s", err) + } + i.log.Infof("inputEntry: added follow request with id %s", fr.ID) + return nil + case transmodel.TransInstance: + inst, err := i.instanceDecode(entry) + if err != nil { + return fmt.Errorf("inputEntry: error decoding entry into instance: %s", err) + } + if err := i.putInDB(ctx, inst); err != nil { + return fmt.Errorf("inputEntry: error adding instance to database: %s", err) + } + i.log.Infof("inputEntry: added instance with id %s", inst.ID) + return nil + case transmodel.TransUser: + user, err := i.userDecode(entry) + if err != nil { + return fmt.Errorf("inputEntry: error decoding entry into user: %s", err) + } + if err := i.putInDB(ctx, user); err != nil { + return fmt.Errorf("inputEntry: error adding user to database: %s", err) + } + i.log.Infof("inputEntry: added user with id %s", user.ID) + return nil + } + + i.log.Errorf("inputEntry: didn't recognize transtype '%s', skipping it", t) + return nil +} + +func (i *importer) putInDB(ctx context.Context, entry interface{}) error { + return i.db.Put(ctx, entry) +} |