Skip to content

Commit d18157c

Browse files
committed
refactor: Removed pagination, added gamename, changed to order by project name instead of latest update and download count.
1 parent 1647a1e commit d18157c

File tree

3 files changed

+50
-87
lines changed

3 files changed

+50
-87
lines changed

CFLookup/Models/ProjectSearchModels.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,6 @@ public class ProjectSearchCriteria
77
public string? Query { get; set; }
88

99
public List<ProjectSearchFilter> Filters { get; set; } = new();
10-
11-
public int Page { get; set; } = 1;
12-
13-
public int PageSize { get; set; } = 50;
1410
}
1511

1612
public class ProjectSearchFilter
@@ -59,17 +55,14 @@ public class ProjectSearchResult
5955
public DateTimeOffset DateReleased { get; set; }
6056

6157
public DateTimeOffset LatestUpdate { get; set; }
58+
public string GameName { get; set; }
6259
}
6360

6461
public class ProjectSearchPageViewModel
6562
{
6663
public ProjectSearchCriteria Criteria { get; set; } = new();
6764

6865
public List<ProjectSearchResult> Results { get; set; } = new();
69-
70-
public bool HasNextPage { get; set; }
71-
72-
public bool HasPreviousPage => Criteria.Page > 1;
7366
}
7467
}
7568

CFLookup/Pages/ProjectSearch.cshtml

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@
4141
<div class="col-md-4">
4242
<select class="form-select" asp-for="Criteria.Filters[@i].Field">
4343
<option value="">-- Field --</option>
44+
<option value="Name">Name</option>
45+
<option value="Slug">Slug</option>
46+
<option value="Summary">Summary</option>
4447
<option value="GameId">Game id</option>
48+
<option value="GameName">Game name</option>
4549
<option value="Status">Status (enum value)</option>
4650
<option value="DownloadCount">Download count</option>
4751
<option value="ThumbsUpCount">Thumbs up</option>
@@ -56,8 +60,6 @@
5660
<option value="DateModified">Date modified</option>
5761
<option value="DateReleased">Date released</option>
5862
<option value="LatestUpdate">Latest update</option>
59-
<option value="Name">Name</option>
60-
<option value="Slug">Slug</option>
6163
</select>
6264
</div>
6365
<div class="col-md-3">
@@ -94,27 +96,6 @@
9496
<button type="submit" class="btn btn-primary">
9597
Search
9698
</button>
97-
98-
<div>
99-
@if (Model.ViewModel.HasPreviousPage)
100-
{
101-
<button type="submit"
102-
name="Criteria.Page"
103-
value="@(Model.Criteria.Page - 1)"
104-
class="btn btn-outline-light me-2">
105-
&laquo; Previous
106-
</button>
107-
}
108-
@if (Model.ViewModel.HasNextPage)
109-
{
110-
<button type="submit"
111-
name="Criteria.Page"
112-
value="@(Model.Criteria.Page + 1)"
113-
class="btn btn-outline-light">
114-
Next &raquo;
115-
</button>
116-
}
117-
</div>
11899
</div>
119100
</form>
120101

@@ -123,7 +104,7 @@
123104
<h2 class="h5 mt-4">
124105
Results
125106
<span class="text-muted">
126-
(@Model.ViewModel.Results.Count@(Model.ViewModel.HasNextPage ? "+" : ""))
107+
(@Model.ViewModel.Results.Count)
127108
</span>
128109
</h2>
129110

@@ -134,9 +115,9 @@
134115
<th scope="col">Project ID</th>
135116
<th scope="col">Name</th>
136117
<th scope="col">Slug</th>
137-
<th scope="col">Game ID</th>
118+
<th scope="col">Game</th>
138119
<th scope="col">Status</th>
139-
<th scope="col">Downloads</th>
120+
<th scope="col" class="text-end">Downloads</th>
140121
<th scope="col">Featured</th>
141122
<th scope="col">Available</th>
142123
</tr>
@@ -154,9 +135,9 @@
154135
</td>
155136
<td>@row.Name</td>
156137
<td>@row.Slug</td>
157-
<td>@row.GameId</td>
138+
<td>@(!string.IsNullOrWhiteSpace(row.GameName) ? row.GameName : "Unknown game") (@row.GameId)</td>
158139
<td>@row.Status</td>
159-
<td>@row.DownloadCount</td>
140+
<td class="text-end">@row.DownloadCount.ToString("n0")</td>
160141
<td>@(row.IsFeatured ? "Yes" : "No")</td>
161142
<td>@(row.IsAvailable ? "Yes" : "No")</td>
162143
</tr>

CFLookup/Pages/ProjectSearch.cshtml.cs

Lines changed: 40 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -34,41 +34,36 @@ public async Task<IActionResult> OnGetAsync()
3434

3535
public async Task<IActionResult> OnPostAsync()
3636
{
37-
if (Criteria.Page <= 0)
38-
{
39-
Criteria.Page = 1;
40-
}
41-
4237
await ExecuteSearchAsync();
4338
return Page();
4439
}
4540

4641
private async Task ExecuteSearchAsync()
4742
{
48-
var pageSize = Criteria.PageSize <= 0 ? 50 : Math.Min(Criteria.PageSize, 200);
49-
var page = Criteria.Page <= 0 ? 1 : Criteria.Page;
50-
51-
var offset = (page - 1) * pageSize;
52-
var limit = pageSize + 1;
53-
5443
var sqlBuilder = new StringBuilder();
55-
sqlBuilder.Append("SELECT projectid, gameid, name, slug, summary, status, downloadcount, isfeatured, primarycategoryid, classid, allowmoddistribution, gamepopularityrank, isavailable, thumbsupcount, rating, datecreated, datemodified, datereleased, latestupdate FROM project_data");
56-
57-
var conditions = new List<string>
58-
{
59-
};
44+
sqlBuilder.Append(
45+
"""
46+
SELECT pd.projectid, pd.gameid, pd.name, pd.slug, pd.summary, pd.status, pd.downloadcount, pd.isfeatured,
47+
pd.primarycategoryid, pd.classid, pd.allowmoddistribution, pd.gamepopularityrank,
48+
pd.isavailable, pd.thumbsupcount, pd.datecreated, pd.datemodified, pd.datereleased, pd.latestupdate,
49+
gd.name as gamename
50+
FROM project_data pd
51+
LEFT JOIN game_data gd ON pd.gameid = gd.gameid
52+
""");
53+
54+
var conditions = new List<string>();
6055

6156
await using var cmd = _conn.CreateCommand();
6257
cmd.CommandType = CommandType.Text;
6358

6459
if (!string.IsNullOrWhiteSpace(Criteria.Query))
6560
{
6661
var paramName = "q";
67-
conditions.Add("(name ILIKE @" + paramName + " OR slug ILIKE @" + paramName + " OR summary ILIKE @" + paramName + ")");
62+
conditions.Add("(pd.name ILIKE @" + paramName + " OR pd.slug ILIKE @" + paramName + " OR pd.summary ILIKE @" + paramName + ")");
6863
cmd.Parameters.AddWithValue(paramName, $"%{Criteria.Query.Trim()}%");
6964
}
7065

71-
if (Criteria.Filters != null && Criteria.Filters.Count > 0)
66+
if (Criteria.Filters is { Count: > 0 })
7267
{
7368
var paramIndex = 0;
7469
foreach (var filter in Criteria.Filters)
@@ -101,12 +96,9 @@ private async Task ExecuteSearchAsync()
10196
sqlBuilder.Append(string.Join(" AND ", conditions));
10297
}
10398

104-
sqlBuilder.Append(" ORDER BY latestupdate DESC, downloadcount DESC");
105-
sqlBuilder.Append(" LIMIT @limit OFFSET @offset");
99+
sqlBuilder.Append(" ORDER BY pd.name DESC");
106100

107101
cmd.CommandText = sqlBuilder.ToString();
108-
cmd.Parameters.AddWithValue("limit", limit);
109-
cmd.Parameters.AddWithValue("offset", offset);
110102

111103
if (_conn.State != ConnectionState.Open)
112104
{
@@ -123,20 +115,14 @@ private async Task ExecuteSearchAsync()
123115
try
124116
{
125117
await using var reader = await cmd.ExecuteReaderAsync();
126-
var rowCount = 0;
127118

128119
while (await reader.ReadAsync())
129120
{
130-
if (rowCount >= pageSize)
131-
{
132-
ViewModel.HasNextPage = true;
133-
break;
134-
}
135-
136121
var result = new ProjectSearchResult
137122
{
138123
ProjectId = reader.GetInt64(reader.GetOrdinal("projectid")),
139124
GameId = reader.GetInt32(reader.GetOrdinal("gameid")),
125+
GameName = reader.GetString(reader.GetOrdinal("gamename")),
140126
Name = reader.GetString(reader.GetOrdinal("name")),
141127
Slug = reader.GetString(reader.GetOrdinal("slug")),
142128
Summary = reader.GetString(reader.GetOrdinal("summary")),
@@ -156,7 +142,6 @@ private async Task ExecuteSearchAsync()
156142
};
157143

158144
results.Add(result);
159-
rowCount++;
160145
}
161146
}
162147
catch (Exception ex)
@@ -175,71 +160,75 @@ private static bool TryGetColumnInfo(string field, out string columnName, out Fi
175160
switch (field)
176161
{
177162
case "GameId":
178-
columnName = "gameid";
163+
columnName = "pd.gameid";
179164
valueType = FilterValueType.Numeric;
180165
return true;
181166
case "Status":
182-
columnName = "status";
167+
columnName = "pd.status";
183168
valueType = FilterValueType.Numeric;
184169
return true;
185170
case "DownloadCount":
186-
columnName = "downloadcount";
171+
columnName = "pd.downloadcount";
187172
valueType = FilterValueType.Numeric;
188173
return true;
189174
case "IsFeatured":
190-
columnName = "isfeatured";
175+
columnName = "pd.isfeatured";
191176
valueType = FilterValueType.Boolean;
192177
return true;
193178
case "PrimaryCategoryId":
194-
columnName = "primarycategoryid";
179+
columnName = "pd.primarycategoryid";
195180
valueType = FilterValueType.Numeric;
196181
return true;
197182
case "ClassId":
198-
columnName = "classid";
183+
columnName = "pd.classid";
199184
valueType = FilterValueType.Numeric;
200185
return true;
201186
case "AllowModDistribution":
202-
columnName = "allowmoddistribution";
187+
columnName = "pd.allowmoddistribution";
203188
valueType = FilterValueType.Boolean;
204189
return true;
205190
case "GamePopularityRank":
206-
columnName = "gamepopularityrank";
191+
columnName = "pd.gamepopularityrank";
207192
valueType = FilterValueType.Numeric;
208193
return true;
209194
case "IsAvailable":
210-
columnName = "isavailable";
195+
columnName = "pd.isavailable";
211196
valueType = FilterValueType.Boolean;
212197
return true;
213198
case "ThumbsUpCount":
214-
columnName = "thumbsupcount";
215-
valueType = FilterValueType.Numeric;
216-
return true;
217-
case "Rating":
218-
columnName = "rating";
199+
columnName = "pd.thumbsupcount";
219200
valueType = FilterValueType.Numeric;
220201
return true;
221202
case "DateCreated":
222-
columnName = "datecreated";
203+
columnName = "pd.datecreated";
223204
valueType = FilterValueType.DateTime;
224205
return true;
225206
case "DateModified":
226-
columnName = "datemodified";
207+
columnName = "pd.datemodified";
227208
valueType = FilterValueType.DateTime;
228209
return true;
229210
case "DateReleased":
230-
columnName = "datereleased";
211+
columnName = "pd.datereleased";
231212
valueType = FilterValueType.DateTime;
232213
return true;
233214
case "LatestUpdate":
234-
columnName = "latestupdate";
215+
columnName = "pd.latestupdate";
235216
valueType = FilterValueType.DateTime;
236217
return true;
237218
case "Name":
238-
columnName = "name";
219+
columnName = "pd.name";
239220
valueType = FilterValueType.String;
240221
return true;
241222
case "Slug":
242-
columnName = "slug";
223+
columnName = "pd.slug";
224+
valueType = FilterValueType.String;
225+
return true;
226+
case "Summary":
227+
columnName = "pd.summary";
228+
valueType = FilterValueType.String;
229+
return true;
230+
case "GameName":
231+
columnName = "gd.name";
243232
valueType = FilterValueType.String;
244233
return true;
245234
default:
@@ -318,7 +307,7 @@ private static bool TryBuildFilterCondition(
318307

319308
private static object ParseNumeric(string value, string columnName)
320309
{
321-
if (columnName is "status" or "primarycategoryid" or "classid")
310+
if (columnName is "pd.status" or "pd.primarycategoryid" or "pd.classid")
322311
{
323312
return int.Parse(value, CultureInfo.InvariantCulture);
324313
}

0 commit comments

Comments
 (0)