Use userId in player, other fixes (#3182)

* [bugfix] player: use userId, other fixes

This PR primarily resolves #1928 by switching the foreign key of `player` from `user.user_name` to `user.id`.
There are also a few other fixes/changes:

- For some bizarre reason, `ip_address` is never returned from `read`/`get`. Change the field to `ip`, which works. Somehow
- Update `players_test.go` mock to also check for user agent, replicating the actual code
- Update `player_repository.go` `isPermitted` to check user id. I don't know how this worked before...
- tests!
- a few places referred to `typ`, when it is really `userAgent`. Change the field names

* baseRequest -> selectPlayer

* remove comment

* update migration, make all of persistence foreign key enabled

* maybe don't forget to save the file first
This commit is contained in:
Kendall Garner
2024-08-03 17:37:21 +00:00
committed by GitHub
parent 5360283bb0
commit fa85e2a781
9 changed files with 373 additions and 32 deletions
+17 -10
View File
@@ -31,18 +31,25 @@ func (r *playerRepository) Put(p *model.Player) error {
return err
}
func (r *playerRepository) selectPlayer(options ...model.QueryOptions) SelectBuilder {
return r.newSelect(options...).
Columns("player.*").
Join("user ON player.user_id = user.id").
Columns("user.user_name username")
}
func (r *playerRepository) Get(id string) (*model.Player, error) {
sel := r.newSelect().Columns("*").Where(Eq{"id": id})
sel := r.selectPlayer().Where(Eq{"player.id": id})
var res model.Player
err := r.queryOne(sel, &res)
return &res, err
}
func (r *playerRepository) FindMatch(userName, client, userAgent string) (*model.Player, error) {
sel := r.newSelect().Columns("*").Where(And{
func (r *playerRepository) FindMatch(userId, client, userAgent string) (*model.Player, error) {
sel := r.selectPlayer().Where(And{
Eq{"client": client},
Eq{"user_agent": userAgent},
Eq{"user_name": userName},
Eq{"user_id": userId},
})
var res model.Player
err := r.queryOne(sel, &res)
@@ -50,7 +57,7 @@ func (r *playerRepository) FindMatch(userName, client, userAgent string) (*model
}
func (r *playerRepository) newRestSelect(options ...model.QueryOptions) SelectBuilder {
s := r.newSelect(options...)
s := r.selectPlayer(options...)
return s.Where(r.addRestriction())
}
@@ -63,7 +70,7 @@ func (r *playerRepository) addRestriction(sql ...Sqlizer) Sqlizer {
if u.IsAdmin {
return s
}
return append(s, Eq{"user_name": u.UserName})
return append(s, Eq{"user_id": u.ID})
}
func (r *playerRepository) Count(options ...rest.QueryOptions) (int64, error) {
@@ -71,14 +78,14 @@ func (r *playerRepository) Count(options ...rest.QueryOptions) (int64, error) {
}
func (r *playerRepository) Read(id string) (interface{}, error) {
sel := r.newRestSelect().Columns("*").Where(Eq{"id": id})
sel := r.newRestSelect().Where(Eq{"player.id": id})
var res model.Player
err := r.queryOne(sel, &res)
return &res, err
}
func (r *playerRepository) ReadAll(options ...rest.QueryOptions) (interface{}, error) {
sel := r.newRestSelect(r.parseRestOptions(options...)).Columns("*")
sel := r.newRestSelect(r.parseRestOptions(options...))
res := model.Players{}
err := r.queryAll(sel, &res)
return res, err
@@ -94,7 +101,7 @@ func (r *playerRepository) NewInstance() interface{} {
func (r *playerRepository) isPermitted(p *model.Player) bool {
u := loggedUser(r.ctx)
return u.IsAdmin || p.UserName == u.UserName
return u.IsAdmin || p.UserId == u.ID
}
func (r *playerRepository) Save(entity interface{}) (string, error) {
@@ -123,7 +130,7 @@ func (r *playerRepository) Update(id string, entity interface{}, cols ...string)
}
func (r *playerRepository) Delete(id string) error {
filter := r.addRestriction(And{Eq{"id": id}})
filter := r.addRestriction(And{Eq{"player.id": id}})
err := r.delete(filter)
if errors.Is(err, model.ErrNotFound) {
return rest.ErrNotFound