Add inserter for self stuff
This commit is contained in:
parent
427675f38e
commit
f453983f80
1 changed files with 154 additions and 0 deletions
154
storage-new/self.go
Normal file
154
storage-new/self.go
Normal file
|
@ -0,0 +1,154 @@
|
|||
package storage
|
||||
|
||||
import (
|
||||
"crypto/ed25519"
|
||||
"crypto/rand"
|
||||
"database/sql"
|
||||
|
||||
"git.mstar.dev/mstar/goutils/other"
|
||||
"github.com/google/uuid"
|
||||
"github.com/rs/zerolog/log"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"git.mstar.dev/mstar/linstrom/config"
|
||||
"git.mstar.dev/mstar/linstrom/storage-new/dbgen"
|
||||
"git.mstar.dev/mstar/linstrom/storage-new/models"
|
||||
)
|
||||
|
||||
func InsertSelf() error {
|
||||
if err := insertRoles(); err != nil {
|
||||
return other.Error("storage", "failed to save/update default roles", err)
|
||||
}
|
||||
duck, err := insertDefaultDuck()
|
||||
if err != nil {
|
||||
return other.Error("storage", "failed to save/update default duck", err)
|
||||
}
|
||||
server, err := insertServer(duck)
|
||||
if err != nil {
|
||||
return other.Error("storage", "failed to save/update self server", err)
|
||||
}
|
||||
log.Debug().Any("server", server).Send()
|
||||
user, err := insertUser(server)
|
||||
if err != nil {
|
||||
return other.Error("storage", "failed to save/update self user", err)
|
||||
}
|
||||
if err = insertUserPronoun(user); err != nil {
|
||||
return other.Error("storage", "failed to save/update self user pronoun", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func insertRoles() error {
|
||||
return dbgen.Role.Save(models.AllDefaultRoles...)
|
||||
}
|
||||
|
||||
func insertDefaultDuck() (*models.MediaMetadata, error) {
|
||||
dbDuck, err := dbgen.MediaMetadata.Where(dbgen.MediaMetadata.Location.Eq(models.DefaultDuckLocationName)).
|
||||
First()
|
||||
if err == nil {
|
||||
return dbDuck, nil
|
||||
} else if err != gorm.ErrRecordNotFound {
|
||||
return nil, err
|
||||
}
|
||||
duck := models.MediaMetadata{
|
||||
ID: uuid.NewString(),
|
||||
// NOTE: Default duck technically belongs to the server
|
||||
// but to avoid cyclic dependency, declare it as unowned
|
||||
OwnedById: sql.NullString{Valid: false},
|
||||
Remote: false,
|
||||
Location: models.DefaultDuckLocationName,
|
||||
Type: "image/webp",
|
||||
Name: "default-duck.webp",
|
||||
AltText: "a greyscale image of a pidgeon on some smooth surface, likely a liquid. It is captioned with the text \"Duck\"",
|
||||
Blurred: false,
|
||||
}
|
||||
if err := dbgen.MediaMetadata.Create(&duck); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &duck, nil
|
||||
}
|
||||
|
||||
func insertServer(duck *models.MediaMetadata) (*models.RemoteServer, error) {
|
||||
dbServer, err := dbgen.RemoteServer.Where(dbgen.RemoteServer.ID.Eq(1)).First()
|
||||
if err == nil {
|
||||
return dbServer, nil
|
||||
} else if err != gorm.ErrRecordNotFound {
|
||||
return nil, err
|
||||
}
|
||||
server := models.RemoteServer{
|
||||
Model: gorm.Model{
|
||||
ID: 1,
|
||||
},
|
||||
ServerType: models.ServerSoftwareLinstrom,
|
||||
Domain: config.GlobalConfig.General.GetFullDomain(),
|
||||
Name: config.GlobalConfig.Self.ServerDisplayName,
|
||||
Icon: duck,
|
||||
IconId: sql.NullString{String: duck.ID, Valid: true},
|
||||
IsSelf: true,
|
||||
}
|
||||
err = dbgen.RemoteServer.Save(&server)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &server, nil
|
||||
}
|
||||
|
||||
func insertUser(server *models.RemoteServer) (*models.User, error) {
|
||||
dbUser, err := dbgen.User.GetByUsername("linstrom")
|
||||
if err == nil {
|
||||
return dbUser, nil
|
||||
}
|
||||
if err != gorm.ErrRecordNotFound {
|
||||
return nil, err
|
||||
}
|
||||
publicKey, privateKey, err := ed25519.GenerateKey(nil)
|
||||
pkeyId := make([]byte, 64)
|
||||
_, err = rand.Read(pkeyId)
|
||||
if err != nil {
|
||||
return nil, other.Error(
|
||||
"storage",
|
||||
"failed to generate passkey ID for linstrom account",
|
||||
err,
|
||||
)
|
||||
}
|
||||
user := models.User{
|
||||
Username: "linstrom",
|
||||
Server: *server,
|
||||
ServerId: server.ID,
|
||||
DisplayName: config.GlobalConfig.Self.ServerActorDisplayName,
|
||||
Description: "The default linstrom server user",
|
||||
IsBot: true,
|
||||
Icon: nil,
|
||||
IconId: sql.NullString{Valid: false},
|
||||
Background: nil,
|
||||
BackgroundId: sql.NullString{Valid: false},
|
||||
Banner: nil,
|
||||
BannerId: sql.NullString{Valid: false},
|
||||
Indexable: false,
|
||||
PublicKey: publicKey,
|
||||
PrivateKey: privateKey,
|
||||
Verified: true,
|
||||
FinishedRegistration: true,
|
||||
PasskeyId: pkeyId,
|
||||
}
|
||||
err = dbgen.User.Save(&user)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &user, err
|
||||
}
|
||||
|
||||
func insertUserPronoun(user *models.User) error {
|
||||
_, err := dbgen.UserToPronoun.Where(dbgen.UserToPronoun.UserId.Eq(user.ID)).
|
||||
Where(dbgen.UserToPronoun.Pronoun.Eq("Yes")).First()
|
||||
switch err {
|
||||
case nil:
|
||||
return nil
|
||||
case gorm.ErrRecordNotFound:
|
||||
return dbgen.UserToPronoun.Create(
|
||||
&models.UserToPronoun{UserId: user.ID, User: *user, Pronoun: "Yes"},
|
||||
)
|
||||
default:
|
||||
return err
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue