// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.

package dbgen

import (
	"context"
	"strings"

	"git.mstar.dev/mstar/linstrom/storage-new/models"
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
	"gorm.io/gorm/schema"

	"gorm.io/gen"
	"gorm.io/gen/field"

	"gorm.io/plugin/dbresolver"
)

func newUser(db *gorm.DB, opts ...gen.DOOption) user {
	_user := user{}

	_user.userDo.UseDB(db, opts...)
	_user.userDo.UseModel(&models.User{})

	tableName := _user.userDo.TableName()
	_user.ALL = field.NewAsterisk(tableName)
	_user.ID = field.NewString(tableName, "id")
	_user.Username = field.NewString(tableName, "username")
	_user.CreatedAt = field.NewTime(tableName, "created_at")
	_user.UpdatedAt = field.NewTime(tableName, "updated_at")
	_user.DeletedAt = field.NewField(tableName, "deleted_at")
	_user.ServerId = field.NewUint(tableName, "server_id")
	_user.DisplayName = field.NewString(tableName, "display_name")
	_user.Description = field.NewString(tableName, "description")
	_user.IsBot = field.NewBool(tableName, "is_bot")
	_user.IconId = field.NewField(tableName, "icon_id")
	_user.BackgroundId = field.NewField(tableName, "background_id")
	_user.BannerId = field.NewField(tableName, "banner_id")
	_user.Indexable = field.NewBool(tableName, "indexable")
	_user.PublicKey = field.NewBytes(tableName, "public_key")
	_user.RestrictedFollow = field.NewBool(tableName, "restricted_follow")
	_user.Location = field.NewField(tableName, "location")
	_user.Birthday = field.NewField(tableName, "birthday")
	_user.Verified = field.NewBool(tableName, "verified")
	_user.PasskeyId = field.NewBytes(tableName, "passkey_id")
	_user.FinishedRegistration = field.NewBool(tableName, "finished_registration")
	_user.PrivateKey = field.NewBytes(tableName, "private_key")
	_user.RemoteInfo = userHasOneRemoteInfo{
		db: db.Session(&gorm.Session{}),

		RelationField: field.NewRelation("RemoteInfo", "models.UserRemoteLinks"),
		User: struct {
			field.RelationField
			Server struct {
				field.RelationField
				Icon struct {
					field.RelationField
				}
			}
			Icon struct {
				field.RelationField
			}
			Background struct {
				field.RelationField
			}
			Banner struct {
				field.RelationField
			}
			RemoteInfo struct {
				field.RelationField
			}
			InfoFields struct {
				field.RelationField
				User struct {
					field.RelationField
				}
			}
			BeingTypes struct {
				field.RelationField
				User struct {
					field.RelationField
				}
			}
			Tags struct {
				field.RelationField
				User struct {
					field.RelationField
				}
			}
			Relations struct {
				field.RelationField
				User struct {
					field.RelationField
				}
				TargetUser struct {
					field.RelationField
				}
			}
			Pronouns struct {
				field.RelationField
				User struct {
					field.RelationField
				}
			}
			Roles struct {
				field.RelationField
				User struct {
					field.RelationField
				}
				Role struct {
					field.RelationField
				}
			}
			AuthMethods struct {
				field.RelationField
				User struct {
					field.RelationField
				}
			}
		}{
			RelationField: field.NewRelation("RemoteInfo.User", "models.User"),
			Server: struct {
				field.RelationField
				Icon struct {
					field.RelationField
				}
			}{
				RelationField: field.NewRelation("RemoteInfo.User.Server", "models.RemoteServer"),
				Icon: struct {
					field.RelationField
				}{
					RelationField: field.NewRelation("RemoteInfo.User.Server.Icon", "models.MediaMetadata"),
				},
			},
			Icon: struct {
				field.RelationField
			}{
				RelationField: field.NewRelation("RemoteInfo.User.Icon", "models.MediaMetadata"),
			},
			Background: struct {
				field.RelationField
			}{
				RelationField: field.NewRelation("RemoteInfo.User.Background", "models.MediaMetadata"),
			},
			Banner: struct {
				field.RelationField
			}{
				RelationField: field.NewRelation("RemoteInfo.User.Banner", "models.MediaMetadata"),
			},
			RemoteInfo: struct {
				field.RelationField
			}{
				RelationField: field.NewRelation("RemoteInfo.User.RemoteInfo", "models.UserRemoteLinks"),
			},
			InfoFields: struct {
				field.RelationField
				User struct {
					field.RelationField
				}
			}{
				RelationField: field.NewRelation("RemoteInfo.User.InfoFields", "models.UserInfoField"),
				User: struct {
					field.RelationField
				}{
					RelationField: field.NewRelation("RemoteInfo.User.InfoFields.User", "models.User"),
				},
			},
			BeingTypes: struct {
				field.RelationField
				User struct {
					field.RelationField
				}
			}{
				RelationField: field.NewRelation("RemoteInfo.User.BeingTypes", "models.UserToBeing"),
				User: struct {
					field.RelationField
				}{
					RelationField: field.NewRelation("RemoteInfo.User.BeingTypes.User", "models.User"),
				},
			},
			Tags: struct {
				field.RelationField
				User struct {
					field.RelationField
				}
			}{
				RelationField: field.NewRelation("RemoteInfo.User.Tags", "models.UserToTag"),
				User: struct {
					field.RelationField
				}{
					RelationField: field.NewRelation("RemoteInfo.User.Tags.User", "models.User"),
				},
			},
			Relations: struct {
				field.RelationField
				User struct {
					field.RelationField
				}
				TargetUser struct {
					field.RelationField
				}
			}{
				RelationField: field.NewRelation("RemoteInfo.User.Relations", "models.UserToUserRelation"),
				User: struct {
					field.RelationField
				}{
					RelationField: field.NewRelation("RemoteInfo.User.Relations.User", "models.User"),
				},
				TargetUser: struct {
					field.RelationField
				}{
					RelationField: field.NewRelation("RemoteInfo.User.Relations.TargetUser", "models.User"),
				},
			},
			Pronouns: struct {
				field.RelationField
				User struct {
					field.RelationField
				}
			}{
				RelationField: field.NewRelation("RemoteInfo.User.Pronouns", "models.UserToPronoun"),
				User: struct {
					field.RelationField
				}{
					RelationField: field.NewRelation("RemoteInfo.User.Pronouns.User", "models.User"),
				},
			},
			Roles: struct {
				field.RelationField
				User struct {
					field.RelationField
				}
				Role struct {
					field.RelationField
				}
			}{
				RelationField: field.NewRelation("RemoteInfo.User.Roles", "models.UserToRole"),
				User: struct {
					field.RelationField
				}{
					RelationField: field.NewRelation("RemoteInfo.User.Roles.User", "models.User"),
				},
				Role: struct {
					field.RelationField
				}{
					RelationField: field.NewRelation("RemoteInfo.User.Roles.Role", "models.Role"),
				},
			},
			AuthMethods: struct {
				field.RelationField
				User struct {
					field.RelationField
				}
			}{
				RelationField: field.NewRelation("RemoteInfo.User.AuthMethods", "models.UserAuthMethod"),
				User: struct {
					field.RelationField
				}{
					RelationField: field.NewRelation("RemoteInfo.User.AuthMethods.User", "models.User"),
				},
			},
		},
	}

	_user.InfoFields = userHasManyInfoFields{
		db: db.Session(&gorm.Session{}),

		RelationField: field.NewRelation("InfoFields", "models.UserInfoField"),
	}

	_user.BeingTypes = userHasManyBeingTypes{
		db: db.Session(&gorm.Session{}),

		RelationField: field.NewRelation("BeingTypes", "models.UserToBeing"),
	}

	_user.Tags = userHasManyTags{
		db: db.Session(&gorm.Session{}),

		RelationField: field.NewRelation("Tags", "models.UserToTag"),
	}

	_user.Relations = userHasManyRelations{
		db: db.Session(&gorm.Session{}),

		RelationField: field.NewRelation("Relations", "models.UserToUserRelation"),
	}

	_user.Pronouns = userHasManyPronouns{
		db: db.Session(&gorm.Session{}),

		RelationField: field.NewRelation("Pronouns", "models.UserToPronoun"),
	}

	_user.Roles = userHasManyRoles{
		db: db.Session(&gorm.Session{}),

		RelationField: field.NewRelation("Roles", "models.UserToRole"),
	}

	_user.AuthMethods = userHasManyAuthMethods{
		db: db.Session(&gorm.Session{}),

		RelationField: field.NewRelation("AuthMethods", "models.UserAuthMethod"),
	}

	_user.Server = userBelongsToServer{
		db: db.Session(&gorm.Session{}),

		RelationField: field.NewRelation("Server", "models.RemoteServer"),
	}

	_user.Icon = userBelongsToIcon{
		db: db.Session(&gorm.Session{}),

		RelationField: field.NewRelation("Icon", "models.MediaMetadata"),
	}

	_user.Background = userBelongsToBackground{
		db: db.Session(&gorm.Session{}),

		RelationField: field.NewRelation("Background", "models.MediaMetadata"),
	}

	_user.Banner = userBelongsToBanner{
		db: db.Session(&gorm.Session{}),

		RelationField: field.NewRelation("Banner", "models.MediaMetadata"),
	}

	_user.fillFieldMap()

	return _user
}

type user struct {
	userDo

	ALL                  field.Asterisk
	ID                   field.String
	Username             field.String
	CreatedAt            field.Time
	UpdatedAt            field.Time
	DeletedAt            field.Field
	ServerId             field.Uint
	DisplayName          field.String
	Description          field.String
	IsBot                field.Bool
	IconId               field.Field
	BackgroundId         field.Field
	BannerId             field.Field
	Indexable            field.Bool
	PublicKey            field.Bytes
	RestrictedFollow     field.Bool
	Location             field.Field
	Birthday             field.Field
	Verified             field.Bool
	PasskeyId            field.Bytes
	FinishedRegistration field.Bool
	PrivateKey           field.Bytes
	RemoteInfo           userHasOneRemoteInfo

	InfoFields userHasManyInfoFields

	BeingTypes userHasManyBeingTypes

	Tags userHasManyTags

	Relations userHasManyRelations

	Pronouns userHasManyPronouns

	Roles userHasManyRoles

	AuthMethods userHasManyAuthMethods

	Server userBelongsToServer

	Icon userBelongsToIcon

	Background userBelongsToBackground

	Banner userBelongsToBanner

	fieldMap map[string]field.Expr
}

func (u user) Table(newTableName string) *user {
	u.userDo.UseTable(newTableName)
	return u.updateTableName(newTableName)
}

func (u user) As(alias string) *user {
	u.userDo.DO = *(u.userDo.As(alias).(*gen.DO))
	return u.updateTableName(alias)
}

func (u *user) updateTableName(table string) *user {
	u.ALL = field.NewAsterisk(table)
	u.ID = field.NewString(table, "id")
	u.Username = field.NewString(table, "username")
	u.CreatedAt = field.NewTime(table, "created_at")
	u.UpdatedAt = field.NewTime(table, "updated_at")
	u.DeletedAt = field.NewField(table, "deleted_at")
	u.ServerId = field.NewUint(table, "server_id")
	u.DisplayName = field.NewString(table, "display_name")
	u.Description = field.NewString(table, "description")
	u.IsBot = field.NewBool(table, "is_bot")
	u.IconId = field.NewField(table, "icon_id")
	u.BackgroundId = field.NewField(table, "background_id")
	u.BannerId = field.NewField(table, "banner_id")
	u.Indexable = field.NewBool(table, "indexable")
	u.PublicKey = field.NewBytes(table, "public_key")
	u.RestrictedFollow = field.NewBool(table, "restricted_follow")
	u.Location = field.NewField(table, "location")
	u.Birthday = field.NewField(table, "birthday")
	u.Verified = field.NewBool(table, "verified")
	u.PasskeyId = field.NewBytes(table, "passkey_id")
	u.FinishedRegistration = field.NewBool(table, "finished_registration")
	u.PrivateKey = field.NewBytes(table, "private_key")

	u.fillFieldMap()

	return u
}

func (u *user) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
	_f, ok := u.fieldMap[fieldName]
	if !ok || _f == nil {
		return nil, false
	}
	_oe, ok := _f.(field.OrderExpr)
	return _oe, ok
}

func (u *user) fillFieldMap() {
	u.fieldMap = make(map[string]field.Expr, 33)
	u.fieldMap["id"] = u.ID
	u.fieldMap["username"] = u.Username
	u.fieldMap["created_at"] = u.CreatedAt
	u.fieldMap["updated_at"] = u.UpdatedAt
	u.fieldMap["deleted_at"] = u.DeletedAt
	u.fieldMap["server_id"] = u.ServerId
	u.fieldMap["display_name"] = u.DisplayName
	u.fieldMap["description"] = u.Description
	u.fieldMap["is_bot"] = u.IsBot
	u.fieldMap["icon_id"] = u.IconId
	u.fieldMap["background_id"] = u.BackgroundId
	u.fieldMap["banner_id"] = u.BannerId
	u.fieldMap["indexable"] = u.Indexable
	u.fieldMap["public_key"] = u.PublicKey
	u.fieldMap["restricted_follow"] = u.RestrictedFollow
	u.fieldMap["location"] = u.Location
	u.fieldMap["birthday"] = u.Birthday
	u.fieldMap["verified"] = u.Verified
	u.fieldMap["passkey_id"] = u.PasskeyId
	u.fieldMap["finished_registration"] = u.FinishedRegistration
	u.fieldMap["private_key"] = u.PrivateKey

}

func (u user) clone(db *gorm.DB) user {
	u.userDo.ReplaceConnPool(db.Statement.ConnPool)
	return u
}

func (u user) replaceDB(db *gorm.DB) user {
	u.userDo.ReplaceDB(db)
	return u
}

type userHasOneRemoteInfo struct {
	db *gorm.DB

	field.RelationField

	User struct {
		field.RelationField
		Server struct {
			field.RelationField
			Icon struct {
				field.RelationField
			}
		}
		Icon struct {
			field.RelationField
		}
		Background struct {
			field.RelationField
		}
		Banner struct {
			field.RelationField
		}
		RemoteInfo struct {
			field.RelationField
		}
		InfoFields struct {
			field.RelationField
			User struct {
				field.RelationField
			}
		}
		BeingTypes struct {
			field.RelationField
			User struct {
				field.RelationField
			}
		}
		Tags struct {
			field.RelationField
			User struct {
				field.RelationField
			}
		}
		Relations struct {
			field.RelationField
			User struct {
				field.RelationField
			}
			TargetUser struct {
				field.RelationField
			}
		}
		Pronouns struct {
			field.RelationField
			User struct {
				field.RelationField
			}
		}
		Roles struct {
			field.RelationField
			User struct {
				field.RelationField
			}
			Role struct {
				field.RelationField
			}
		}
		AuthMethods struct {
			field.RelationField
			User struct {
				field.RelationField
			}
		}
	}
}

func (a userHasOneRemoteInfo) Where(conds ...field.Expr) *userHasOneRemoteInfo {
	if len(conds) == 0 {
		return &a
	}

	exprs := make([]clause.Expression, 0, len(conds))
	for _, cond := range conds {
		exprs = append(exprs, cond.BeCond().(clause.Expression))
	}
	a.db = a.db.Clauses(clause.Where{Exprs: exprs})
	return &a
}

func (a userHasOneRemoteInfo) WithContext(ctx context.Context) *userHasOneRemoteInfo {
	a.db = a.db.WithContext(ctx)
	return &a
}

func (a userHasOneRemoteInfo) Session(session *gorm.Session) *userHasOneRemoteInfo {
	a.db = a.db.Session(session)
	return &a
}

func (a userHasOneRemoteInfo) Model(m *models.User) *userHasOneRemoteInfoTx {
	return &userHasOneRemoteInfoTx{a.db.Model(m).Association(a.Name())}
}

type userHasOneRemoteInfoTx struct{ tx *gorm.Association }

func (a userHasOneRemoteInfoTx) Find() (result *models.UserRemoteLinks, err error) {
	return result, a.tx.Find(&result)
}

func (a userHasOneRemoteInfoTx) Append(values ...*models.UserRemoteLinks) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Append(targetValues...)
}

func (a userHasOneRemoteInfoTx) Replace(values ...*models.UserRemoteLinks) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Replace(targetValues...)
}

func (a userHasOneRemoteInfoTx) Delete(values ...*models.UserRemoteLinks) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Delete(targetValues...)
}

func (a userHasOneRemoteInfoTx) Clear() error {
	return a.tx.Clear()
}

func (a userHasOneRemoteInfoTx) Count() int64 {
	return a.tx.Count()
}

type userHasManyInfoFields struct {
	db *gorm.DB

	field.RelationField
}

func (a userHasManyInfoFields) Where(conds ...field.Expr) *userHasManyInfoFields {
	if len(conds) == 0 {
		return &a
	}

	exprs := make([]clause.Expression, 0, len(conds))
	for _, cond := range conds {
		exprs = append(exprs, cond.BeCond().(clause.Expression))
	}
	a.db = a.db.Clauses(clause.Where{Exprs: exprs})
	return &a
}

func (a userHasManyInfoFields) WithContext(ctx context.Context) *userHasManyInfoFields {
	a.db = a.db.WithContext(ctx)
	return &a
}

func (a userHasManyInfoFields) Session(session *gorm.Session) *userHasManyInfoFields {
	a.db = a.db.Session(session)
	return &a
}

func (a userHasManyInfoFields) Model(m *models.User) *userHasManyInfoFieldsTx {
	return &userHasManyInfoFieldsTx{a.db.Model(m).Association(a.Name())}
}

type userHasManyInfoFieldsTx struct{ tx *gorm.Association }

func (a userHasManyInfoFieldsTx) Find() (result []*models.UserInfoField, err error) {
	return result, a.tx.Find(&result)
}

func (a userHasManyInfoFieldsTx) Append(values ...*models.UserInfoField) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Append(targetValues...)
}

func (a userHasManyInfoFieldsTx) Replace(values ...*models.UserInfoField) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Replace(targetValues...)
}

func (a userHasManyInfoFieldsTx) Delete(values ...*models.UserInfoField) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Delete(targetValues...)
}

func (a userHasManyInfoFieldsTx) Clear() error {
	return a.tx.Clear()
}

func (a userHasManyInfoFieldsTx) Count() int64 {
	return a.tx.Count()
}

type userHasManyBeingTypes struct {
	db *gorm.DB

	field.RelationField
}

func (a userHasManyBeingTypes) Where(conds ...field.Expr) *userHasManyBeingTypes {
	if len(conds) == 0 {
		return &a
	}

	exprs := make([]clause.Expression, 0, len(conds))
	for _, cond := range conds {
		exprs = append(exprs, cond.BeCond().(clause.Expression))
	}
	a.db = a.db.Clauses(clause.Where{Exprs: exprs})
	return &a
}

func (a userHasManyBeingTypes) WithContext(ctx context.Context) *userHasManyBeingTypes {
	a.db = a.db.WithContext(ctx)
	return &a
}

func (a userHasManyBeingTypes) Session(session *gorm.Session) *userHasManyBeingTypes {
	a.db = a.db.Session(session)
	return &a
}

func (a userHasManyBeingTypes) Model(m *models.User) *userHasManyBeingTypesTx {
	return &userHasManyBeingTypesTx{a.db.Model(m).Association(a.Name())}
}

type userHasManyBeingTypesTx struct{ tx *gorm.Association }

func (a userHasManyBeingTypesTx) Find() (result []*models.UserToBeing, err error) {
	return result, a.tx.Find(&result)
}

func (a userHasManyBeingTypesTx) Append(values ...*models.UserToBeing) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Append(targetValues...)
}

func (a userHasManyBeingTypesTx) Replace(values ...*models.UserToBeing) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Replace(targetValues...)
}

func (a userHasManyBeingTypesTx) Delete(values ...*models.UserToBeing) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Delete(targetValues...)
}

func (a userHasManyBeingTypesTx) Clear() error {
	return a.tx.Clear()
}

func (a userHasManyBeingTypesTx) Count() int64 {
	return a.tx.Count()
}

type userHasManyTags struct {
	db *gorm.DB

	field.RelationField
}

func (a userHasManyTags) Where(conds ...field.Expr) *userHasManyTags {
	if len(conds) == 0 {
		return &a
	}

	exprs := make([]clause.Expression, 0, len(conds))
	for _, cond := range conds {
		exprs = append(exprs, cond.BeCond().(clause.Expression))
	}
	a.db = a.db.Clauses(clause.Where{Exprs: exprs})
	return &a
}

func (a userHasManyTags) WithContext(ctx context.Context) *userHasManyTags {
	a.db = a.db.WithContext(ctx)
	return &a
}

func (a userHasManyTags) Session(session *gorm.Session) *userHasManyTags {
	a.db = a.db.Session(session)
	return &a
}

func (a userHasManyTags) Model(m *models.User) *userHasManyTagsTx {
	return &userHasManyTagsTx{a.db.Model(m).Association(a.Name())}
}

type userHasManyTagsTx struct{ tx *gorm.Association }

func (a userHasManyTagsTx) Find() (result []*models.UserToTag, err error) {
	return result, a.tx.Find(&result)
}

func (a userHasManyTagsTx) Append(values ...*models.UserToTag) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Append(targetValues...)
}

func (a userHasManyTagsTx) Replace(values ...*models.UserToTag) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Replace(targetValues...)
}

func (a userHasManyTagsTx) Delete(values ...*models.UserToTag) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Delete(targetValues...)
}

func (a userHasManyTagsTx) Clear() error {
	return a.tx.Clear()
}

func (a userHasManyTagsTx) Count() int64 {
	return a.tx.Count()
}

type userHasManyRelations struct {
	db *gorm.DB

	field.RelationField
}

func (a userHasManyRelations) Where(conds ...field.Expr) *userHasManyRelations {
	if len(conds) == 0 {
		return &a
	}

	exprs := make([]clause.Expression, 0, len(conds))
	for _, cond := range conds {
		exprs = append(exprs, cond.BeCond().(clause.Expression))
	}
	a.db = a.db.Clauses(clause.Where{Exprs: exprs})
	return &a
}

func (a userHasManyRelations) WithContext(ctx context.Context) *userHasManyRelations {
	a.db = a.db.WithContext(ctx)
	return &a
}

func (a userHasManyRelations) Session(session *gorm.Session) *userHasManyRelations {
	a.db = a.db.Session(session)
	return &a
}

func (a userHasManyRelations) Model(m *models.User) *userHasManyRelationsTx {
	return &userHasManyRelationsTx{a.db.Model(m).Association(a.Name())}
}

type userHasManyRelationsTx struct{ tx *gorm.Association }

func (a userHasManyRelationsTx) Find() (result []*models.UserToUserRelation, err error) {
	return result, a.tx.Find(&result)
}

func (a userHasManyRelationsTx) Append(values ...*models.UserToUserRelation) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Append(targetValues...)
}

func (a userHasManyRelationsTx) Replace(values ...*models.UserToUserRelation) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Replace(targetValues...)
}

func (a userHasManyRelationsTx) Delete(values ...*models.UserToUserRelation) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Delete(targetValues...)
}

func (a userHasManyRelationsTx) Clear() error {
	return a.tx.Clear()
}

func (a userHasManyRelationsTx) Count() int64 {
	return a.tx.Count()
}

type userHasManyPronouns struct {
	db *gorm.DB

	field.RelationField
}

func (a userHasManyPronouns) Where(conds ...field.Expr) *userHasManyPronouns {
	if len(conds) == 0 {
		return &a
	}

	exprs := make([]clause.Expression, 0, len(conds))
	for _, cond := range conds {
		exprs = append(exprs, cond.BeCond().(clause.Expression))
	}
	a.db = a.db.Clauses(clause.Where{Exprs: exprs})
	return &a
}

func (a userHasManyPronouns) WithContext(ctx context.Context) *userHasManyPronouns {
	a.db = a.db.WithContext(ctx)
	return &a
}

func (a userHasManyPronouns) Session(session *gorm.Session) *userHasManyPronouns {
	a.db = a.db.Session(session)
	return &a
}

func (a userHasManyPronouns) Model(m *models.User) *userHasManyPronounsTx {
	return &userHasManyPronounsTx{a.db.Model(m).Association(a.Name())}
}

type userHasManyPronounsTx struct{ tx *gorm.Association }

func (a userHasManyPronounsTx) Find() (result []*models.UserToPronoun, err error) {
	return result, a.tx.Find(&result)
}

func (a userHasManyPronounsTx) Append(values ...*models.UserToPronoun) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Append(targetValues...)
}

func (a userHasManyPronounsTx) Replace(values ...*models.UserToPronoun) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Replace(targetValues...)
}

func (a userHasManyPronounsTx) Delete(values ...*models.UserToPronoun) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Delete(targetValues...)
}

func (a userHasManyPronounsTx) Clear() error {
	return a.tx.Clear()
}

func (a userHasManyPronounsTx) Count() int64 {
	return a.tx.Count()
}

type userHasManyRoles struct {
	db *gorm.DB

	field.RelationField
}

func (a userHasManyRoles) Where(conds ...field.Expr) *userHasManyRoles {
	if len(conds) == 0 {
		return &a
	}

	exprs := make([]clause.Expression, 0, len(conds))
	for _, cond := range conds {
		exprs = append(exprs, cond.BeCond().(clause.Expression))
	}
	a.db = a.db.Clauses(clause.Where{Exprs: exprs})
	return &a
}

func (a userHasManyRoles) WithContext(ctx context.Context) *userHasManyRoles {
	a.db = a.db.WithContext(ctx)
	return &a
}

func (a userHasManyRoles) Session(session *gorm.Session) *userHasManyRoles {
	a.db = a.db.Session(session)
	return &a
}

func (a userHasManyRoles) Model(m *models.User) *userHasManyRolesTx {
	return &userHasManyRolesTx{a.db.Model(m).Association(a.Name())}
}

type userHasManyRolesTx struct{ tx *gorm.Association }

func (a userHasManyRolesTx) Find() (result []*models.UserToRole, err error) {
	return result, a.tx.Find(&result)
}

func (a userHasManyRolesTx) Append(values ...*models.UserToRole) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Append(targetValues...)
}

func (a userHasManyRolesTx) Replace(values ...*models.UserToRole) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Replace(targetValues...)
}

func (a userHasManyRolesTx) Delete(values ...*models.UserToRole) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Delete(targetValues...)
}

func (a userHasManyRolesTx) Clear() error {
	return a.tx.Clear()
}

func (a userHasManyRolesTx) Count() int64 {
	return a.tx.Count()
}

type userHasManyAuthMethods struct {
	db *gorm.DB

	field.RelationField
}

func (a userHasManyAuthMethods) Where(conds ...field.Expr) *userHasManyAuthMethods {
	if len(conds) == 0 {
		return &a
	}

	exprs := make([]clause.Expression, 0, len(conds))
	for _, cond := range conds {
		exprs = append(exprs, cond.BeCond().(clause.Expression))
	}
	a.db = a.db.Clauses(clause.Where{Exprs: exprs})
	return &a
}

func (a userHasManyAuthMethods) WithContext(ctx context.Context) *userHasManyAuthMethods {
	a.db = a.db.WithContext(ctx)
	return &a
}

func (a userHasManyAuthMethods) Session(session *gorm.Session) *userHasManyAuthMethods {
	a.db = a.db.Session(session)
	return &a
}

func (a userHasManyAuthMethods) Model(m *models.User) *userHasManyAuthMethodsTx {
	return &userHasManyAuthMethodsTx{a.db.Model(m).Association(a.Name())}
}

type userHasManyAuthMethodsTx struct{ tx *gorm.Association }

func (a userHasManyAuthMethodsTx) Find() (result []*models.UserAuthMethod, err error) {
	return result, a.tx.Find(&result)
}

func (a userHasManyAuthMethodsTx) Append(values ...*models.UserAuthMethod) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Append(targetValues...)
}

func (a userHasManyAuthMethodsTx) Replace(values ...*models.UserAuthMethod) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Replace(targetValues...)
}

func (a userHasManyAuthMethodsTx) Delete(values ...*models.UserAuthMethod) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Delete(targetValues...)
}

func (a userHasManyAuthMethodsTx) Clear() error {
	return a.tx.Clear()
}

func (a userHasManyAuthMethodsTx) Count() int64 {
	return a.tx.Count()
}

type userBelongsToServer struct {
	db *gorm.DB

	field.RelationField
}

func (a userBelongsToServer) Where(conds ...field.Expr) *userBelongsToServer {
	if len(conds) == 0 {
		return &a
	}

	exprs := make([]clause.Expression, 0, len(conds))
	for _, cond := range conds {
		exprs = append(exprs, cond.BeCond().(clause.Expression))
	}
	a.db = a.db.Clauses(clause.Where{Exprs: exprs})
	return &a
}

func (a userBelongsToServer) WithContext(ctx context.Context) *userBelongsToServer {
	a.db = a.db.WithContext(ctx)
	return &a
}

func (a userBelongsToServer) Session(session *gorm.Session) *userBelongsToServer {
	a.db = a.db.Session(session)
	return &a
}

func (a userBelongsToServer) Model(m *models.User) *userBelongsToServerTx {
	return &userBelongsToServerTx{a.db.Model(m).Association(a.Name())}
}

type userBelongsToServerTx struct{ tx *gorm.Association }

func (a userBelongsToServerTx) Find() (result *models.RemoteServer, err error) {
	return result, a.tx.Find(&result)
}

func (a userBelongsToServerTx) Append(values ...*models.RemoteServer) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Append(targetValues...)
}

func (a userBelongsToServerTx) Replace(values ...*models.RemoteServer) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Replace(targetValues...)
}

func (a userBelongsToServerTx) Delete(values ...*models.RemoteServer) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Delete(targetValues...)
}

func (a userBelongsToServerTx) Clear() error {
	return a.tx.Clear()
}

func (a userBelongsToServerTx) Count() int64 {
	return a.tx.Count()
}

type userBelongsToIcon struct {
	db *gorm.DB

	field.RelationField
}

func (a userBelongsToIcon) Where(conds ...field.Expr) *userBelongsToIcon {
	if len(conds) == 0 {
		return &a
	}

	exprs := make([]clause.Expression, 0, len(conds))
	for _, cond := range conds {
		exprs = append(exprs, cond.BeCond().(clause.Expression))
	}
	a.db = a.db.Clauses(clause.Where{Exprs: exprs})
	return &a
}

func (a userBelongsToIcon) WithContext(ctx context.Context) *userBelongsToIcon {
	a.db = a.db.WithContext(ctx)
	return &a
}

func (a userBelongsToIcon) Session(session *gorm.Session) *userBelongsToIcon {
	a.db = a.db.Session(session)
	return &a
}

func (a userBelongsToIcon) Model(m *models.User) *userBelongsToIconTx {
	return &userBelongsToIconTx{a.db.Model(m).Association(a.Name())}
}

type userBelongsToIconTx struct{ tx *gorm.Association }

func (a userBelongsToIconTx) Find() (result *models.MediaMetadata, err error) {
	return result, a.tx.Find(&result)
}

func (a userBelongsToIconTx) Append(values ...*models.MediaMetadata) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Append(targetValues...)
}

func (a userBelongsToIconTx) Replace(values ...*models.MediaMetadata) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Replace(targetValues...)
}

func (a userBelongsToIconTx) Delete(values ...*models.MediaMetadata) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Delete(targetValues...)
}

func (a userBelongsToIconTx) Clear() error {
	return a.tx.Clear()
}

func (a userBelongsToIconTx) Count() int64 {
	return a.tx.Count()
}

type userBelongsToBackground struct {
	db *gorm.DB

	field.RelationField
}

func (a userBelongsToBackground) Where(conds ...field.Expr) *userBelongsToBackground {
	if len(conds) == 0 {
		return &a
	}

	exprs := make([]clause.Expression, 0, len(conds))
	for _, cond := range conds {
		exprs = append(exprs, cond.BeCond().(clause.Expression))
	}
	a.db = a.db.Clauses(clause.Where{Exprs: exprs})
	return &a
}

func (a userBelongsToBackground) WithContext(ctx context.Context) *userBelongsToBackground {
	a.db = a.db.WithContext(ctx)
	return &a
}

func (a userBelongsToBackground) Session(session *gorm.Session) *userBelongsToBackground {
	a.db = a.db.Session(session)
	return &a
}

func (a userBelongsToBackground) Model(m *models.User) *userBelongsToBackgroundTx {
	return &userBelongsToBackgroundTx{a.db.Model(m).Association(a.Name())}
}

type userBelongsToBackgroundTx struct{ tx *gorm.Association }

func (a userBelongsToBackgroundTx) Find() (result *models.MediaMetadata, err error) {
	return result, a.tx.Find(&result)
}

func (a userBelongsToBackgroundTx) Append(values ...*models.MediaMetadata) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Append(targetValues...)
}

func (a userBelongsToBackgroundTx) Replace(values ...*models.MediaMetadata) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Replace(targetValues...)
}

func (a userBelongsToBackgroundTx) Delete(values ...*models.MediaMetadata) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Delete(targetValues...)
}

func (a userBelongsToBackgroundTx) Clear() error {
	return a.tx.Clear()
}

func (a userBelongsToBackgroundTx) Count() int64 {
	return a.tx.Count()
}

type userBelongsToBanner struct {
	db *gorm.DB

	field.RelationField
}

func (a userBelongsToBanner) Where(conds ...field.Expr) *userBelongsToBanner {
	if len(conds) == 0 {
		return &a
	}

	exprs := make([]clause.Expression, 0, len(conds))
	for _, cond := range conds {
		exprs = append(exprs, cond.BeCond().(clause.Expression))
	}
	a.db = a.db.Clauses(clause.Where{Exprs: exprs})
	return &a
}

func (a userBelongsToBanner) WithContext(ctx context.Context) *userBelongsToBanner {
	a.db = a.db.WithContext(ctx)
	return &a
}

func (a userBelongsToBanner) Session(session *gorm.Session) *userBelongsToBanner {
	a.db = a.db.Session(session)
	return &a
}

func (a userBelongsToBanner) Model(m *models.User) *userBelongsToBannerTx {
	return &userBelongsToBannerTx{a.db.Model(m).Association(a.Name())}
}

type userBelongsToBannerTx struct{ tx *gorm.Association }

func (a userBelongsToBannerTx) Find() (result *models.MediaMetadata, err error) {
	return result, a.tx.Find(&result)
}

func (a userBelongsToBannerTx) Append(values ...*models.MediaMetadata) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Append(targetValues...)
}

func (a userBelongsToBannerTx) Replace(values ...*models.MediaMetadata) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Replace(targetValues...)
}

func (a userBelongsToBannerTx) Delete(values ...*models.MediaMetadata) (err error) {
	targetValues := make([]interface{}, len(values))
	for i, v := range values {
		targetValues[i] = v
	}
	return a.tx.Delete(targetValues...)
}

func (a userBelongsToBannerTx) Clear() error {
	return a.tx.Clear()
}

func (a userBelongsToBannerTx) Count() int64 {
	return a.tx.Count()
}

type userDo struct{ gen.DO }

type IUserDo interface {
	gen.SubQuery
	Debug() IUserDo
	WithContext(ctx context.Context) IUserDo
	WithResult(fc func(tx gen.Dao)) gen.ResultInfo
	ReplaceDB(db *gorm.DB)
	ReadDB() IUserDo
	WriteDB() IUserDo
	As(alias string) gen.Dao
	Session(config *gorm.Session) IUserDo
	Columns(cols ...field.Expr) gen.Columns
	Clauses(conds ...clause.Expression) IUserDo
	Not(conds ...gen.Condition) IUserDo
	Or(conds ...gen.Condition) IUserDo
	Select(conds ...field.Expr) IUserDo
	Where(conds ...gen.Condition) IUserDo
	Order(conds ...field.Expr) IUserDo
	Distinct(cols ...field.Expr) IUserDo
	Omit(cols ...field.Expr) IUserDo
	Join(table schema.Tabler, on ...field.Expr) IUserDo
	LeftJoin(table schema.Tabler, on ...field.Expr) IUserDo
	RightJoin(table schema.Tabler, on ...field.Expr) IUserDo
	Group(cols ...field.Expr) IUserDo
	Having(conds ...gen.Condition) IUserDo
	Limit(limit int) IUserDo
	Offset(offset int) IUserDo
	Count() (count int64, err error)
	Scopes(funcs ...func(gen.Dao) gen.Dao) IUserDo
	Unscoped() IUserDo
	Create(values ...*models.User) error
	CreateInBatches(values []*models.User, batchSize int) error
	Save(values ...*models.User) error
	First() (*models.User, error)
	Take() (*models.User, error)
	Last() (*models.User, error)
	Find() ([]*models.User, error)
	FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.User, err error)
	FindInBatches(result *[]*models.User, batchSize int, fc func(tx gen.Dao, batch int) error) error
	Pluck(column field.Expr, dest interface{}) error
	Delete(...*models.User) (info gen.ResultInfo, err error)
	Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
	UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
	Updates(value interface{}) (info gen.ResultInfo, err error)
	UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
	UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
	UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
	UpdateFrom(q gen.SubQuery) gen.Dao
	Attrs(attrs ...field.AssignExpr) IUserDo
	Assign(attrs ...field.AssignExpr) IUserDo
	Joins(fields ...field.RelationField) IUserDo
	Preload(fields ...field.RelationField) IUserDo
	FirstOrInit() (*models.User, error)
	FirstOrCreate() (*models.User, error)
	FindByPage(offset int, limit int) (result []*models.User, count int64, err error)
	ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
	Scan(result interface{}) (err error)
	Returning(value interface{}, columns ...string) IUserDo
	UnderlyingDB() *gorm.DB
	schema.Tabler

	GetByUsername(username string) (result *models.User, err error)
	GetPagedTruePublic(pageNr uint) (result []models.User, err error)
	GetPagedAllDeleted(pageNr uint) (result []models.User, err error)
	GetPagedAllNonDeleted(pageNr uint) (result []models.User, err error)
	GdprUsers() (err error)
}

// Get a user by a username
//
// SELECT * FROM @@table WHERE username = @username AND deleted_at IS NULL LIMIT 1
func (u userDo) GetByUsername(username string) (result *models.User, err error) {
	var params []interface{}

	var generateSQL strings.Builder
	params = append(params, username)
	generateSQL.WriteString("SELECT * FROM users WHERE username = ? AND deleted_at IS NULL LIMIT 1 ")

	var executeSQL *gorm.DB
	executeSQL = u.UnderlyingDB().Raw(generateSQL.String(), params...).Take(&result) // ignore_security_alert
	err = executeSQL.Error

	return
}

// Get all true public accounts (verified & no restricted follow & indexable)
// in a paged manner, sorted by date saved
//
// SELECT * FROM @@table WHERE
//
//	deleted_at IS NULL AND
//	verified = true AND
//	restricted_follow = false AND
//	indexable = true
//
// ORDER BY created_at ASC
// LIMIT 50
// OFFSET @pageNr * 50
func (u userDo) GetPagedTruePublic(pageNr uint) (result []models.User, err error) {
	var params []interface{}

	var generateSQL strings.Builder
	params = append(params, pageNr)
	generateSQL.WriteString("SELECT * FROM users WHERE deleted_at IS NULL AND verified = true AND restricted_follow = false AND indexable = true ORDER BY created_at ASC LIMIT 50 OFFSET ? * 50 ")

	var executeSQL *gorm.DB
	executeSQL = u.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
	err = executeSQL.Error

	return
}

// Get all deleted accounts in a paged manner, sorted by date saved
//
// SELECT * FROM @@table WHERE
//
//	deleted_at IS NOT NULL AND
//
// ORDER BY created_at ASC
// LIMIT 50
// OFFSET @pageNr * 50
func (u userDo) GetPagedAllDeleted(pageNr uint) (result []models.User, err error) {
	var params []interface{}

	var generateSQL strings.Builder
	params = append(params, pageNr)
	generateSQL.WriteString("SELECT * FROM users WHERE deleted_at IS NOT NULL AND ORDER BY created_at ASC LIMIT 50 OFFSET ? * 50 ")

	var executeSQL *gorm.DB
	executeSQL = u.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
	err = executeSQL.Error

	return
}

// Get all accounts that aren't deleted in a paged manner, sorted by date saved
//
// SELECT * FROM @@table WHERE
//
//	deleted_at IS NULL
//
// ORDER BY created_at ASC
// LIMIT 50
// OFFSET @pageNr * 50
func (u userDo) GetPagedAllNonDeleted(pageNr uint) (result []models.User, err error) {
	var params []interface{}

	var generateSQL strings.Builder
	params = append(params, pageNr)
	generateSQL.WriteString("SELECT * FROM users WHERE deleted_at IS NULL ORDER BY created_at ASC LIMIT 50 OFFSET ? * 50 ")

	var executeSQL *gorm.DB
	executeSQL = u.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
	err = executeSQL.Error

	return
}

// Gdpr deleted users
//
// DELETE FROM @@table WHERE deleted_at IS NOT NULL AND deleted_at + interval '30 days' < NOW()
func (u userDo) GdprUsers() (err error) {
	var generateSQL strings.Builder
	generateSQL.WriteString("DELETE FROM users WHERE deleted_at IS NOT NULL AND deleted_at + interval '30 days' < NOW() ")

	var executeSQL *gorm.DB
	executeSQL = u.UnderlyingDB().Exec(generateSQL.String()) // ignore_security_alert
	err = executeSQL.Error

	return
}

func (u userDo) Debug() IUserDo {
	return u.withDO(u.DO.Debug())
}

func (u userDo) WithContext(ctx context.Context) IUserDo {
	return u.withDO(u.DO.WithContext(ctx))
}

func (u userDo) ReadDB() IUserDo {
	return u.Clauses(dbresolver.Read)
}

func (u userDo) WriteDB() IUserDo {
	return u.Clauses(dbresolver.Write)
}

func (u userDo) Session(config *gorm.Session) IUserDo {
	return u.withDO(u.DO.Session(config))
}

func (u userDo) Clauses(conds ...clause.Expression) IUserDo {
	return u.withDO(u.DO.Clauses(conds...))
}

func (u userDo) Returning(value interface{}, columns ...string) IUserDo {
	return u.withDO(u.DO.Returning(value, columns...))
}

func (u userDo) Not(conds ...gen.Condition) IUserDo {
	return u.withDO(u.DO.Not(conds...))
}

func (u userDo) Or(conds ...gen.Condition) IUserDo {
	return u.withDO(u.DO.Or(conds...))
}

func (u userDo) Select(conds ...field.Expr) IUserDo {
	return u.withDO(u.DO.Select(conds...))
}

func (u userDo) Where(conds ...gen.Condition) IUserDo {
	return u.withDO(u.DO.Where(conds...))
}

func (u userDo) Order(conds ...field.Expr) IUserDo {
	return u.withDO(u.DO.Order(conds...))
}

func (u userDo) Distinct(cols ...field.Expr) IUserDo {
	return u.withDO(u.DO.Distinct(cols...))
}

func (u userDo) Omit(cols ...field.Expr) IUserDo {
	return u.withDO(u.DO.Omit(cols...))
}

func (u userDo) Join(table schema.Tabler, on ...field.Expr) IUserDo {
	return u.withDO(u.DO.Join(table, on...))
}

func (u userDo) LeftJoin(table schema.Tabler, on ...field.Expr) IUserDo {
	return u.withDO(u.DO.LeftJoin(table, on...))
}

func (u userDo) RightJoin(table schema.Tabler, on ...field.Expr) IUserDo {
	return u.withDO(u.DO.RightJoin(table, on...))
}

func (u userDo) Group(cols ...field.Expr) IUserDo {
	return u.withDO(u.DO.Group(cols...))
}

func (u userDo) Having(conds ...gen.Condition) IUserDo {
	return u.withDO(u.DO.Having(conds...))
}

func (u userDo) Limit(limit int) IUserDo {
	return u.withDO(u.DO.Limit(limit))
}

func (u userDo) Offset(offset int) IUserDo {
	return u.withDO(u.DO.Offset(offset))
}

func (u userDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IUserDo {
	return u.withDO(u.DO.Scopes(funcs...))
}

func (u userDo) Unscoped() IUserDo {
	return u.withDO(u.DO.Unscoped())
}

func (u userDo) Create(values ...*models.User) error {
	if len(values) == 0 {
		return nil
	}
	return u.DO.Create(values)
}

func (u userDo) CreateInBatches(values []*models.User, batchSize int) error {
	return u.DO.CreateInBatches(values, batchSize)
}

// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (u userDo) Save(values ...*models.User) error {
	if len(values) == 0 {
		return nil
	}
	return u.DO.Save(values)
}

func (u userDo) First() (*models.User, error) {
	if result, err := u.DO.First(); err != nil {
		return nil, err
	} else {
		return result.(*models.User), nil
	}
}

func (u userDo) Take() (*models.User, error) {
	if result, err := u.DO.Take(); err != nil {
		return nil, err
	} else {
		return result.(*models.User), nil
	}
}

func (u userDo) Last() (*models.User, error) {
	if result, err := u.DO.Last(); err != nil {
		return nil, err
	} else {
		return result.(*models.User), nil
	}
}

func (u userDo) Find() ([]*models.User, error) {
	result, err := u.DO.Find()
	return result.([]*models.User), err
}

func (u userDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.User, err error) {
	buf := make([]*models.User, 0, batchSize)
	err = u.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
		defer func() { results = append(results, buf...) }()
		return fc(tx, batch)
	})
	return results, err
}

func (u userDo) FindInBatches(result *[]*models.User, batchSize int, fc func(tx gen.Dao, batch int) error) error {
	return u.DO.FindInBatches(result, batchSize, fc)
}

func (u userDo) Attrs(attrs ...field.AssignExpr) IUserDo {
	return u.withDO(u.DO.Attrs(attrs...))
}

func (u userDo) Assign(attrs ...field.AssignExpr) IUserDo {
	return u.withDO(u.DO.Assign(attrs...))
}

func (u userDo) Joins(fields ...field.RelationField) IUserDo {
	for _, _f := range fields {
		u = *u.withDO(u.DO.Joins(_f))
	}
	return &u
}

func (u userDo) Preload(fields ...field.RelationField) IUserDo {
	for _, _f := range fields {
		u = *u.withDO(u.DO.Preload(_f))
	}
	return &u
}

func (u userDo) FirstOrInit() (*models.User, error) {
	if result, err := u.DO.FirstOrInit(); err != nil {
		return nil, err
	} else {
		return result.(*models.User), nil
	}
}

func (u userDo) FirstOrCreate() (*models.User, error) {
	if result, err := u.DO.FirstOrCreate(); err != nil {
		return nil, err
	} else {
		return result.(*models.User), nil
	}
}

func (u userDo) FindByPage(offset int, limit int) (result []*models.User, count int64, err error) {
	result, err = u.Offset(offset).Limit(limit).Find()
	if err != nil {
		return
	}

	if size := len(result); 0 < limit && 0 < size && size < limit {
		count = int64(size + offset)
		return
	}

	count, err = u.Offset(-1).Limit(-1).Count()
	return
}

func (u userDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
	count, err = u.Count()
	if err != nil {
		return
	}

	err = u.Offset(offset).Limit(limit).Scan(result)
	return
}

func (u userDo) Scan(result interface{}) (err error) {
	return u.DO.Scan(result)
}

func (u userDo) Delete(models ...*models.User) (result gen.ResultInfo, err error) {
	return u.DO.Delete(models)
}

func (u *userDo) withDO(do gen.Dao) *userDo {
	u.DO = *do.(*gen.DO)
	return u
}
