Removed old user avatar url field from the db
This commit is contained in:
parent
6445567840
commit
d32cd0a849
|
@ -495,109 +495,5 @@ func init() {
|
||||||
}
|
}
|
||||||
adminCommand.AddCommand(uploadProjectLogos)
|
adminCommand.AddCommand(uploadProjectLogos)
|
||||||
|
|
||||||
uploadUserAvatars := &cobra.Command{
|
|
||||||
Use: "uploaduseravatars",
|
|
||||||
Short: "Uploads avatar imagefiles to S3 and replaces them with assets",
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
ctx := context.Background()
|
|
||||||
conn := db.NewConnPool(1, 1)
|
|
||||||
defer conn.Close()
|
|
||||||
|
|
||||||
type userQuery struct {
|
|
||||||
User models.User `db:"auth_user"`
|
|
||||||
}
|
|
||||||
allUsers, err := db.Query(ctx, conn, userQuery{}, `SELECT $columns FROM auth_user LEFT JOIN handmade_asset AS auth_user_avatar ON auth_user_avatar.id = auth_user.avatar_asset_id`)
|
|
||||||
if err != nil {
|
|
||||||
panic(oops.New(err, "Failed to fetch projects from db"))
|
|
||||||
}
|
|
||||||
|
|
||||||
var fixupUsers []*models.User
|
|
||||||
numImages := 0
|
|
||||||
for _, user := range allUsers {
|
|
||||||
u := &user.(*userQuery).User
|
|
||||||
if u.Avatar != nil && *u.Avatar != "" {
|
|
||||||
fixupUsers = append(fixupUsers, u)
|
|
||||||
numImages += 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("%d images to upload\n", numImages)
|
|
||||||
|
|
||||||
uploadImage := func(ctx context.Context, conn db.ConnOrTx, filepath string, owner *models.User) *models.Asset {
|
|
||||||
filepath = "./public/media/" + filepath
|
|
||||||
contents, err := os.ReadFile(filepath)
|
|
||||||
if err != nil {
|
|
||||||
panic(oops.New(err, fmt.Sprintf("Failed to read file: %s", filepath)))
|
|
||||||
}
|
|
||||||
width := 0
|
|
||||||
height := 0
|
|
||||||
mime := ""
|
|
||||||
fileExtensionOverrides := []string{".svg"}
|
|
||||||
fileExt := strings.ToLower(path.Ext(filepath))
|
|
||||||
tryDecode := true
|
|
||||||
for _, ext := range fileExtensionOverrides {
|
|
||||||
if fileExt == ext {
|
|
||||||
tryDecode = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if tryDecode {
|
|
||||||
config, _, err := image.DecodeConfig(bytes.NewReader(contents))
|
|
||||||
if err != nil {
|
|
||||||
panic(oops.New(err, fmt.Sprintf("Failed to decode file: %s", filepath)))
|
|
||||||
}
|
|
||||||
width = config.Width
|
|
||||||
height = config.Height
|
|
||||||
mime = http.DetectContentType(contents)
|
|
||||||
} else {
|
|
||||||
if fileExt == ".svg" {
|
|
||||||
mime = "image/svg+xml"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
filename := path.Base(filepath)
|
|
||||||
|
|
||||||
asset, err := assets.Create(ctx, conn, assets.CreateInput{
|
|
||||||
Content: contents,
|
|
||||||
Filename: filename,
|
|
||||||
ContentType: mime,
|
|
||||||
UploaderID: &owner.ID,
|
|
||||||
Width: width,
|
|
||||||
Height: height,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
panic(oops.New(err, "Failed to create asset"))
|
|
||||||
}
|
|
||||||
|
|
||||||
return asset
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, u := range fixupUsers {
|
|
||||||
if u.Avatar != nil && *u.Avatar != "" {
|
|
||||||
avatarAsset := uploadImage(ctx, conn, *u.Avatar, u)
|
|
||||||
_, err := conn.Exec(ctx,
|
|
||||||
`
|
|
||||||
UPDATE auth_user
|
|
||||||
SET
|
|
||||||
avatar_asset_id = $2,
|
|
||||||
avatar = NULL
|
|
||||||
WHERE
|
|
||||||
id = $1
|
|
||||||
`,
|
|
||||||
u.ID,
|
|
||||||
avatarAsset.ID,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
panic(oops.New(err, "Failed to update user"))
|
|
||||||
}
|
|
||||||
numImages -= 1
|
|
||||||
fmt.Printf(".")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("\nDone! %d images not patched for some reason.\n\n", numImages)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
adminCommand.AddCommand(uploadUserAvatars)
|
|
||||||
|
|
||||||
addProjectCommands(adminCommand)
|
addProjectCommands(adminCommand)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
package migrations
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.handmade.network/hmn/hmn/src/migration/types"
|
||||||
|
"github.com/jackc/pgx/v4"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registerMigration(RemoveUserAvatarUrl{})
|
||||||
|
}
|
||||||
|
|
||||||
|
type RemoveUserAvatarUrl struct{}
|
||||||
|
|
||||||
|
func (m RemoveUserAvatarUrl) Version() types.MigrationVersion {
|
||||||
|
return types.MigrationVersion(time.Date(2022, 2, 13, 13, 26, 53, 0, time.UTC))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m RemoveUserAvatarUrl) Name() string {
|
||||||
|
return "RemoveUserAvatarUrl"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m RemoveUserAvatarUrl) Description() string {
|
||||||
|
return "Remove avatar url field from users as we're using assets now"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m RemoveUserAvatarUrl) Up(ctx context.Context, tx pgx.Tx) error {
|
||||||
|
_, err := tx.Exec(ctx,
|
||||||
|
`
|
||||||
|
ALTER TABLE auth_user
|
||||||
|
DROP COLUMN avatar;
|
||||||
|
`,
|
||||||
|
)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m RemoveUserAvatarUrl) Down(ctx context.Context, tx pgx.Tx) error {
|
||||||
|
_, err := tx.Exec(ctx,
|
||||||
|
`
|
||||||
|
ALTER TABLE auth_user
|
||||||
|
ADD COLUMN avatar character varying(100);
|
||||||
|
`,
|
||||||
|
)
|
||||||
|
return err
|
||||||
|
}
|
|
@ -35,7 +35,6 @@ type User struct {
|
||||||
Bio string `db:"bio"`
|
Bio string `db:"bio"`
|
||||||
Blurb string `db:"blurb"`
|
Blurb string `db:"blurb"`
|
||||||
Signature string `db:"signature"`
|
Signature string `db:"signature"`
|
||||||
Avatar *string `db:"avatar"`
|
|
||||||
AvatarAssetID *uuid.UUID `db:"avatar_asset_id"`
|
AvatarAssetID *uuid.UUID `db:"avatar_asset_id"`
|
||||||
AvatarAsset *Asset `db:"avatar"`
|
AvatarAsset *Asset `db:"avatar"`
|
||||||
|
|
||||||
|
|
|
@ -173,12 +173,8 @@ func UserAvatarUrl(u *models.User, currentTheme string) string {
|
||||||
currentTheme = "light"
|
currentTheme = "light"
|
||||||
}
|
}
|
||||||
avatar := ""
|
avatar := ""
|
||||||
if u != nil && (u.AvatarAsset != nil || (u.Avatar != nil && len(*u.Avatar) > 0)) {
|
if u != nil && u.AvatarAsset != nil {
|
||||||
if u.AvatarAsset != nil {
|
avatar = hmnurl.BuildS3Asset(u.AvatarAsset.S3Key)
|
||||||
avatar = hmnurl.BuildS3Asset(u.AvatarAsset.S3Key)
|
|
||||||
} else {
|
|
||||||
avatar = hmnurl.BuildUserFile(*u.Avatar)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
avatar = UserAvatarDefaultUrl(currentTheme)
|
avatar = UserAvatarDefaultUrl(currentTheme)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue