79 lines
1.8 KiB
Go
79 lines
1.8 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/go-pg/pg/v10"
|
|
"github.com/pkg/errors"
|
|
"github.com/tribalwarshelp/api/village"
|
|
"github.com/tribalwarshelp/shared/models"
|
|
)
|
|
|
|
type pgRepository struct {
|
|
*pg.DB
|
|
}
|
|
|
|
func NewPGRepository(db *pg.DB) village.Repository {
|
|
return &pgRepository{db}
|
|
}
|
|
|
|
func (repo *pgRepository) Fetch(ctx context.Context, server string, f *models.VillageFilter) ([]*models.Village, int, error) {
|
|
var err error
|
|
data := []*models.Village{}
|
|
query := repo.WithParam("SERVER", pg.Safe(server)).Model(&data).Context(ctx)
|
|
|
|
if f != nil {
|
|
query = query.
|
|
WhereStruct(f).
|
|
Limit(f.Limit).
|
|
Offset(f.Offset)
|
|
|
|
if f.XGTE != 0 {
|
|
query = query.Where("x >= ?", f.XGTE)
|
|
} else if f.XGT != 0 {
|
|
query = query.Where("x > ?", f.XGT)
|
|
}
|
|
if f.XLTE != 0 {
|
|
query = query.Where("x <= ?", f.XLTE)
|
|
} else if f.XLT != 0 {
|
|
query = query.Where("x < ?", f.XLT)
|
|
}
|
|
|
|
if f.YGTE != 0 {
|
|
query = query.Where("y >= ?", f.YGTE)
|
|
} else if f.YGT != 0 {
|
|
query = query.Where("y > ?", f.YGT)
|
|
}
|
|
if f.YLTE != 0 {
|
|
query = query.Where("y <= ?", f.YLTE)
|
|
} else if f.YLT != 0 {
|
|
query = query.Where("y < ?", f.YLT)
|
|
}
|
|
|
|
if f.Sort != "" {
|
|
query = query.Order(f.Sort)
|
|
}
|
|
|
|
if f.PlayerFilter != nil {
|
|
query = query.Relation("Player._").WhereStruct(f.PlayerFilter)
|
|
if f.PlayerFilter.TribeFilter != nil {
|
|
query = query.
|
|
Join("LEFT JOIN ?SERVER.tribes AS tribe ON tribe.id = player.tribe_id", server).
|
|
WhereStruct(f.PlayerFilter.TribeFilter)
|
|
}
|
|
}
|
|
}
|
|
|
|
total, err := query.SelectAndCount()
|
|
if err != nil && err != pg.ErrNoRows {
|
|
if strings.Contains(err.Error(), `relation "`+server) {
|
|
return nil, 0, fmt.Errorf("Server not found")
|
|
}
|
|
return nil, 0, errors.Wrap(err, "Internal server error")
|
|
}
|
|
|
|
return data, total, nil
|
|
}
|