package psql import ( "database/sql" "ymgb/database" "github.com/shopspring/decimal" "github.com/vinovest/sqlx" ) type Waifu struct { ID int OwnerID sql.NullInt64 `db:"owner_id"` Name string Rarity int ExpBonus decimal.Decimal `db:"exp_bonus"` MoneyBonus decimal.Decimal `db:"money_bonus"` MarketPrice decimal.Decimal `db:"market_price"` Fandom string Image string RpPrompt string `db:"rp_prompt"` Owner *User } type WaifuRepository struct { db *sqlx.DB } func newWaifuRepository(db *sqlx.DB) *WaifuRepository { return &WaifuRepository{db} } func NewWaifuRepository(db *database.Context) *WaifuRepository { return newWaifuRepository(db.Postgres) } func (rep *WaifuRepository) GetAll() ([]*Waifu, error) { waifus := make([]*Waifu, 0) err := rep.db.Select(&waifus, "SELECT * FROM waifus;") if err != nil { return nil, err } for _, waifu := range waifus { if !waifu.OwnerID.Valid { continue } waifu.Owner = new(User) err = rep.db.Get(waifu.Owner, "SELECT * FROM users WHERE id=$1;", waifu.OwnerID.Int64) if err != nil { return nil, err } } return waifus, err } func (rep *WaifuRepository) GetByUserId(userId int) ([]*Waifu, error) { waifus, err := sqlx.List[*Waifu](rep.db, "SELECT waifus.* FROM waifus WHERE owner_id=$1;", userId) if err != nil { return nil, err } userRep := newUserRepository(rep.db) user, err := userRep.GetById(userId) if err != nil { return nil, err } for _, waifu := range waifus { waifu.Owner = user } return waifus, nil } func (rep *WaifuRepository) GetCountByUserId(userId int) (int64, error) { var count int64 = 0 err := rep.db.QueryRow("SELECT COUNT(*) FROM waifus WHERE owner_id=$1;", userId).Scan(&count) return count, err } func (rep *WaifuRepository) GetFree() ([]Waifu, error) { waifus, err := sqlx.List[Waifu](rep.db, "SELECT * FROM waifus WHERE owner_id IS NULL;") return waifus, err } func (rep *WaifuRepository) GetFreeCount() (int64, error) { var count int64 = 0 err := rep.db.QueryRow("SELECT COUNT(*) FROM waifus WHERE owner_id IS NULL;").Scan(&count) return count, err } func (rep *WaifuRepository) GetFreeByRarity(rarity int) ([]Waifu, error) { waifus, err := sqlx.List[Waifu](rep.db, "SELECT * FROM waifus WHERE owner_id IS NULL AND rarity=$1;", rarity) return waifus, err } func (rep *WaifuRepository) GetById(id int) (*Waifu, error) { waifu := new(Waifu) err := rep.db.Get(waifu, "SELECT * FROM waifus WHERE id=$1;", id) if err != nil { return waifu, err } if !waifu.OwnerID.Valid { return waifu, err } waifu.Owner = new(User) err = rep.db.Get(waifu.Owner, "SELECT * FROM users WHERE id=$1;", int(waifu.OwnerID.Int64)) return waifu, err }