Skip to content

Commit

Permalink
Hide sub levels from people who didn't publish them (#430)
Browse files Browse the repository at this point in the history
Fixes #332, #347

This required a minor category refactor due to how they previously used
the accessor and content user interchangeably


![image](https://github.com/LittleBigRefresh/Refresh/assets/51852312/479c6101-0363-4d66-bb66-33538aa773aa)

![image](https://github.com/LittleBigRefresh/Refresh/assets/51852312/e03499cc-821a-42de-b48f-20b16d0a5064)
  • Loading branch information
jvyden authored Apr 27, 2024
2 parents 8382f80 + eae9bf1 commit 36b5b7c
Show file tree
Hide file tree
Showing 24 changed files with 65 additions and 59 deletions.
8 changes: 4 additions & 4 deletions Refresh.GameServer/Database/GameDatabaseContext.Levels.cs
Original file line number Diff line number Diff line change
Expand Up @@ -171,11 +171,11 @@ private IQueryable<GameLevel> GetLevelsByGameVersion(TokenGame gameVersion)
=> this._realm.All<GameLevel>().Where(l => l._Source == (int)GameLevelSource.User).FilterByGameVersion(gameVersion);

[Pure]
public DatabaseList<GameLevel> GetLevelsByUser(GameUser user, int count, int skip, LevelFilterSettings levelFilterSettings)
public DatabaseList<GameLevel> GetLevelsByUser(GameUser user, int count, int skip, LevelFilterSettings levelFilterSettings, GameUser? accessor)
{
if (user.Username == DeletedUser.Username)
{
return new DatabaseList<GameLevel>(this.GetLevelsByGameVersion(levelFilterSettings.GameVersion).FilterByLevelFilterSettings(null, levelFilterSettings).Where(l => l.Publisher == null), skip, count);
return new DatabaseList<GameLevel>(this.GetLevelsByGameVersion(levelFilterSettings.GameVersion).FilterByLevelFilterSettings(accessor, levelFilterSettings).Where(l => l.Publisher == null), skip, count);
}

if (user.Username == "!Unknown")
Expand All @@ -186,10 +186,10 @@ public DatabaseList<GameLevel> GetLevelsByUser(GameUser user, int count, int ski
if (user.Username.StartsWith("!"))
{
string withoutPrefix = user.Username[1..];
return new DatabaseList<GameLevel>(this.GetLevelsByGameVersion(levelFilterSettings.GameVersion).FilterByLevelFilterSettings(null, levelFilterSettings).Where(l => l.OriginalPublisher == withoutPrefix), skip, count);
return new DatabaseList<GameLevel>(this.GetLevelsByGameVersion(levelFilterSettings.GameVersion).FilterByLevelFilterSettings(accessor, levelFilterSettings).Where(l => l.OriginalPublisher == withoutPrefix), skip, count);
}

return new DatabaseList<GameLevel>(this.GetLevelsByGameVersion(levelFilterSettings.GameVersion).FilterByLevelFilterSettings(null, levelFilterSettings).Where(l => l.Publisher == user), skip, count);
return new DatabaseList<GameLevel>(this.GetLevelsByGameVersion(levelFilterSettings.GameVersion).FilterByLevelFilterSettings(accessor, levelFilterSettings).Where(l => l.Publisher == user), skip, count);
}

[Pure]
Expand Down
8 changes: 4 additions & 4 deletions Refresh.GameServer/Database/GameDatabaseContext.Relations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ private bool IsLevelFavouritedByUser(GameLevel level, GameUser user) => this._re
.FirstOrDefault(r => r.Level == level && r.User == user) != null;

[Pure]
public DatabaseList<GameLevel> GetLevelsFavouritedByUser(GameUser user, int count, int skip, LevelFilterSettings levelFilterSettings)
public DatabaseList<GameLevel> GetLevelsFavouritedByUser(GameUser user, int count, int skip, LevelFilterSettings levelFilterSettings, GameUser? accessor)
=> new(this._realm.All<FavouriteLevelRelation>()
.Where(r => r.User == user)
.AsEnumerable()
.Select(r => r.Level)
.FilterByLevelFilterSettings(null, levelFilterSettings)
.FilterByLevelFilterSettings(accessor, levelFilterSettings)
.FilterByGameVersion(levelFilterSettings.GameVersion), skip, count);

public bool FavouriteLevel(GameLevel level, GameUser user)
Expand Down Expand Up @@ -132,12 +132,12 @@ private bool IsLevelQueuedByUser(GameLevel level, GameUser user) => this._realm.
.FirstOrDefault(r => r.Level == level && r.User == user) != null;

[Pure]
public DatabaseList<GameLevel> GetLevelsQueuedByUser(GameUser user, int count, int skip, LevelFilterSettings levelFilterSettings)
public DatabaseList<GameLevel> GetLevelsQueuedByUser(GameUser user, int count, int skip, LevelFilterSettings levelFilterSettings, GameUser? accessor)
=> new(this._realm.All<QueueLevelRelation>()
.Where(r => r.User == user)
.AsEnumerable()
.Select(r => r.Level)
.FilterByLevelFilterSettings(null, levelFilterSettings)
.FilterByLevelFilterSettings(accessor, levelFilterSettings)
.FilterByGameVersion(levelFilterSettings.GameVersion), skip, count);

public bool QueueLevel(GameLevel level, GameUser user)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public static IEnumerable<ApiLevelCategoryResponse> FromOldList(IEnumerable<Leve
{
return oldList.Select(category =>
{
DatabaseList<GameLevel>? list = category.Fetch(context, 0, 1, matchService, database, user, new LevelFilterSettings(context, TokenGame.Website));
DatabaseList<GameLevel>? list = category.Fetch(context, 0, 1, matchService, database, user, new LevelFilterSettings(context, TokenGame.Website), user);
GameLevel? level = list?.Items.FirstOrDefault();

return FromOld(category, level);
Expand Down
2 changes: 1 addition & 1 deletion Refresh.GameServer/Endpoints/ApiV3/LevelApiEndpoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public ApiListResponse<ApiGameLevelResponse> GetLevels(RequestContext context, G

DatabaseList<GameLevel>? list = categories.Categories
.FirstOrDefault(c => c.ApiRoute.StartsWith(route))?
.Fetch(context, skip, count, matchService, database, user, new LevelFilterSettings(context, TokenGame.Website));
.Fetch(context, skip, count, matchService, database, user, new LevelFilterSettings(context, TokenGame.Website), user);

if (list == null) return ApiNotFoundError.Instance;

Expand Down
4 changes: 2 additions & 2 deletions Refresh.GameServer/Endpoints/Game/Levels/LevelEndpoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public class LevelEndpoints : EndpointGroup

DatabaseList<GameLevel>? levels = categoryService.Categories
.FirstOrDefault(c => c.GameRoutes.Any(r => r.StartsWith(route)))?
.Fetch(context, skip, count, matchService, database, user, new LevelFilterSettings(context, token.TokenGame));
.Fetch(context, skip, count, matchService, database, user, new LevelFilterSettings(context, token.TokenGame), user);

if (levels == null) return null;

Expand Down Expand Up @@ -137,7 +137,7 @@ public SerializedMinimalLevelResultsList GetLevelsFromCategory(RequestContext co

DatabaseList<GameLevel>? levels = categories.Categories
.FirstOrDefault(c => c.ApiRoute.StartsWith(apiRoute))?
.Fetch(context, skip, count, matchService, database, user, new LevelFilterSettings(context, token.TokenGame));
.Fetch(context, skip, count, matchService, database, user, new LevelFilterSettings(context, token.TokenGame), user);

return new SerializedMinimalLevelResultsList(levels?.Items
.Select(l => GameMinimalLevelResponse.FromOldWithExtraData(l, matchService, database, dataStore, token.TokenGame))!, levels?.TotalItems ?? 0, skip + count);
Expand Down
6 changes: 6 additions & 0 deletions Refresh.GameServer/Extensions/LevelEnumerableExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ public static IQueryable<GameLevel> FilterByLevelFilterSettings(this IQueryable<
// MoveFilterType.False => levels.Where(l => !l.MoveCompatible),
// _ => throw new ArgumentOutOfRangeException()
// };

// Filter out sub levels that weren't published by self
levels = levels.Where(l => !l.IsSubLevel || l.Publisher == user);

return levels;
}
Expand Down Expand Up @@ -103,6 +106,9 @@ public static IEnumerable<GameLevel> FilterByLevelFilterSettings(this IEnumerabl
// MoveFilterType.False => levels.Where(l => !l.MoveCompatible),
// _ => throw new ArgumentOutOfRangeException()
// };

// Filter out sub levels that weren't published by self
levels = levels.Where(l => !l.IsSubLevel || l.Publisher?.UserId == user?.UserId);

return levels;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ internal ByUserLevelCategory() : base("byUser", "by", true)
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? user)
{
// Prefer username from query, but fallback to user passed into this category if it's missing
string? username = context.QueryString["u"];
if (username != null) user = database.GetUserByUsername(username);

if (user == null) return null;

return database.GetLevelsByUser(user, count, skip, levelFilterSettings);
return database.GetLevelsByUser(user, count, skip, levelFilterSettings, accessor);
}
}
4 changes: 2 additions & 2 deletions Refresh.GameServer/Types/Levels/Categories/ContestCategory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public ContestCategory() : base("contest", Array.Empty<string>(), false)
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, MatchService matchService,
GameDatabaseContext database, GameUser? user, LevelFilterSettings levelFilterSettings)
GameDatabaseContext database, GameUser? accessor, LevelFilterSettings levelFilterSettings, GameUser? _)
{
// try to find a contest by the query parameter
string? contestId = context.QueryString["contest"];
Expand All @@ -31,6 +31,6 @@ public ContestCategory() : base("contest", Array.Empty<string>(), false)
if (contest == null)
return null;

return database.GetLevelsFromContest(contest, count, skip, user, levelFilterSettings);
return database.GetLevelsFromContest(contest, count, skip, accessor, levelFilterSettings);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ public class CoolLevelsCategory : LevelCategory
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, MatchService matchService,
GameDatabaseContext database, GameUser? user, LevelFilterSettings levelFilterSettings)
GameDatabaseContext database, GameUser? accessor, LevelFilterSettings levelFilterSettings, GameUser? _)
{
return database.GetCoolLevels(count, skip, user, levelFilterSettings);
return database.GetCoolLevels(count, skip, accessor, levelFilterSettings);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ internal CurrentlyPlayingCategory() : base("currentlyPlaying", "busiest", false)
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
=> database.GetBusiestLevels(count, skip, matchService, user, levelFilterSettings);
MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? _)
=> database.GetBusiestLevels(count, skip, matchService, accessor, levelFilterSettings);
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ internal DeveloperLevelsCategory() : base("developer", Array.Empty<string>(), fa
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? _)
=> database.GetDeveloperLevels(count, skip, levelFilterSettings);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ internal FavouriteSlotsByUserCategory() : base("hearted", "favouriteSlots", true
this.IconHash = "g820611";
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? user)
{
if (user == null) return null;

return database.GetLevelsFavouritedByUser(user, count, skip, levelFilterSettings);
return database.GetLevelsFavouritedByUser(user, count, skip, levelFilterSettings, accessor);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ internal HighestRatedLevelsCategory() : base("mostLiked", new[] { "thumbs", "hig
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
=> database.GetHighestRatedLevels(count, skip, user, levelFilterSettings);
MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? _)
=> database.GetHighestRatedLevels(count, skip, accessor, levelFilterSettings);
}
4 changes: 2 additions & 2 deletions Refresh.GameServer/Types/Levels/Categories/LevelCategory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,6 @@ internal LevelCategory(string apiRoute, string[] gameRoutes, bool requiresUser)
[JsonProperty] public readonly bool RequiresUser;

[Pure]
public abstract DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings);
public abstract DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? user);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ internal MostHeartedLevelsCategory() : base("mostHearted", "mostHearted", false)
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
=> database.GetMostHeartedLevels(count, skip, user, levelFilterSettings);
MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? _)
=> database.GetMostHeartedLevels(count, skip, accessor, levelFilterSettings);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ internal MostReplayedLevelsCategory() : base("mostReplayed", "mostPlays", false)
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
=> database.GetMostReplayedLevels(count, skip, user, levelFilterSettings);
MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? _)
=> database.GetMostReplayedLevels(count, skip, accessor, levelFilterSettings);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ internal MostUniquelyPlayedLevelsCategory() : base("mostPlayed", "mostUniquePlay
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
=> database.GetMostUniquelyPlayedLevels(count, skip, user, levelFilterSettings);
MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? _)
=> database.GetMostUniquelyPlayedLevels(count, skip, accessor, levelFilterSettings);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ internal NewestLevelsCategory() : base("newest", "newest", false)
this.FontAwesomeIcon = "calendar";
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
=> database.GetNewestLevels(count, skip, user, levelFilterSettings);
public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? _)
=> database.GetNewestLevels(count, skip, accessor, levelFilterSettings);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ internal QueuedLevelsByUserCategory() : base("queued", "lolcatftw", true)
this.IconHash = "g820614";
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? user)
{
if (user == null) return null;

return database.GetLevelsQueuedByUser(user, count, skip, levelFilterSettings);
return database.GetLevelsQueuedByUser(user, count, skip, levelFilterSettings, accessor);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ internal RandomLevelsCategory() : base("random", "lbp2luckydip", false)
this.IconHash = "g820605";
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
=> database.GetRandomLevels(count, skip, user, levelFilterSettings);
public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? _)
=> database.GetRandomLevels(count, skip, accessor, levelFilterSettings);
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ internal SearchLevelCategory() : base(SearchRoute, "search", false)
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? _)
{
string? query = context.QueryString["query"]
?? context.QueryString["textFilter"]; // LBP3 sends this instead of query
if (query == null) return null;

return database.SearchForLevels(count, skip, user, levelFilterSettings, query);
return database.SearchForLevels(count, skip, accessor, levelFilterSettings, query);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public static SerializedCategory FromLevelCategory(LevelCategory levelCategory,
{
SerializedCategory category = FromLevelCategory(levelCategory);

DatabaseList<GameLevel> categoryLevels = levelCategory.Fetch(context, skip, count, matchService, database, user, new LevelFilterSettings(context, token.TokenGame));
DatabaseList<GameLevel> categoryLevels = levelCategory.Fetch(context, skip, count, matchService, database, user, new LevelFilterSettings(context, token.TokenGame), user);

IEnumerable<GameMinimalLevelResponse> levels = categoryLevels?.Items
.Select(l => GameMinimalLevelResponse.FromOldWithExtraData(l, matchService, database, dataStore, token.TokenGame)) ?? Array.Empty<GameMinimalLevelResponse>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ internal TeamPickedLevelsCategory() : base("teamPicks", "mmpicks", false)
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
MatchService matchService, GameDatabaseContext database, GameUser? user,
LevelFilterSettings levelFilterSettings)
=> database.GetTeamPickedLevels(count, skip, user, levelFilterSettings);
MatchService matchService, GameDatabaseContext database, GameUser? accessor,
LevelFilterSettings levelFilterSettings, GameUser? _)
=> database.GetTeamPickedLevels(count, skip, accessor, levelFilterSettings);
}
Loading

0 comments on commit 36b5b7c

Please sign in to comment.