Skip to content

Commit 5964413

Browse files
Cache stuff.
1 parent 692ed5b commit 5964413

File tree

4 files changed

+139
-20
lines changed

4 files changed

+139
-20
lines changed

internal/admin/handlers.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ func (h *Handler) AdminHandler(c echo.Context) error {
4545
}, c)
4646
}
4747

48-
allAlbums, err := loader.LoadAllAlbumsData()
48+
// Only fetch artist and album names for all albums (fast)
49+
allAlbums, err := loader.FetchAlbumNamesOnly()
4950
if err != nil {
5051
log.Printf("Error loading albums: %v", err)
5152
return err
@@ -232,7 +233,8 @@ func (h *Handler) AlbumListHandler(c echo.Context) error {
232233
if err := validateAuth(c); err != nil {
233234
return err
234235
}
235-
albums, err := loader.LoadAllAlbumsData()
236+
// Only fetch artist and album names for all albums
237+
albums, err := loader.FetchAlbumNamesOnly()
236238
if err != nil {
237239
return c.HTML(500, "Failed to load albums")
238240
}

loaders/sqlite/loader.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,3 +298,29 @@ func SaveAlbum(album models.BandcampAlbumData) error {
298298

299299
return tx.Commit()
300300
}
301+
302+
func FetchAlbumNamesOnly() ([]models.BandcampAlbumData, error) {
303+
db, err := sql.Open("sqlite", dbPath)
304+
if err != nil {
305+
return nil, fmt.Errorf("error opening database at %s: %w", dbPath, err)
306+
}
307+
defer db.Close()
308+
309+
query := `SELECT artist_name, album_name FROM albums ORDER BY date_added DESC`
310+
rows, err := db.Query(query)
311+
if err != nil {
312+
return nil, fmt.Errorf("error querying albums: %w", err)
313+
}
314+
defer rows.Close()
315+
316+
var albums []models.BandcampAlbumData
317+
for rows.Next() {
318+
var album models.BandcampAlbumData
319+
if err := rows.Scan(&album.ArtistName, &album.AlbumName); err != nil {
320+
return nil, fmt.Errorf("error scanning album row: %w", err)
321+
}
322+
albums = append(albums, album)
323+
}
324+
325+
return albums, nil
326+
}

loaders/supabase/loader.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,3 +436,24 @@ func UpdateAlbum(req models.UpdateAlbumRequest) error {
436436
log.Printf("Verified updated album values: %+v", album)
437437
return nil
438438
}
439+
440+
func FetchAlbumNamesOnly() ([]models.BandcampAlbumData, error) {
441+
query := publicClient.From("albums").
442+
Select("artist_name, album_name", "exact", false).
443+
Order("date_added", &postgrest.OrderOpts{
444+
Ascending: false,
445+
NullsFirst: false,
446+
})
447+
448+
data, _, err := query.Execute()
449+
if err != nil {
450+
return nil, fmt.Errorf("error querying albums: %w", err)
451+
}
452+
453+
var albums []models.BandcampAlbumData
454+
if err := json.Unmarshal(data, &albums); err != nil {
455+
return nil, fmt.Errorf("error scanning album rows: %w", err)
456+
}
457+
458+
return albums, nil
459+
}

main.go

Lines changed: 88 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,27 @@ const (
3232

3333
var (
3434
albums []models.BandcampAlbumData
35+
// Add a cache for home page stats
36+
homePageCache struct {
37+
Albums []models.BandcampAlbumData
38+
TotalAlbums int
39+
TotalSongs int
40+
TotalWords int
41+
TotalChars int
42+
TotalCharsNoSpaces int
43+
TotalVowels int
44+
TotalConsonants int
45+
TotalLines int
46+
TotalDuration int
47+
AvgWordsPerAlbum int
48+
AvgCharsPerAlbum int
49+
AvgWordLength float64
50+
AvgSongsPerAlbum float64
51+
WPM int
52+
ProjectedAlbums float64
53+
FuckCount int
54+
DisplayAlbums []models.BandcampAlbumData
55+
}
3556
)
3657

3758
type TemplateRenderer struct {
@@ -57,6 +78,9 @@ func main() {
5778
if err := loadAlbums(); err != nil {
5879
e.Logger.Fatal(err)
5980
}
81+
if err := refreshHomePageCache(); err != nil {
82+
e.Logger.Fatal(err)
83+
}
6084

6185
setupRoutes(e)
6286
setupAdminRoutes(e, renderer)
@@ -158,7 +182,7 @@ func countWordOccurrences(albums []models.BandcampAlbumData, word string) int {
158182
return count
159183
}
160184

161-
func indexHandler(c echo.Context) error {
185+
func refreshHomePageCache() error {
162186
allAlbums, err := loader.LoadAlbumsData()
163187
if err != nil {
164188
return err
@@ -215,24 +239,67 @@ func indexHandler(c echo.Context) error {
215239

216240
fuckCount := countWordOccurrences(allAlbums, "fuck")
217241

242+
homePageCache = struct {
243+
Albums []models.BandcampAlbumData
244+
TotalAlbums int
245+
TotalSongs int
246+
TotalWords int
247+
TotalChars int
248+
TotalCharsNoSpaces int
249+
TotalVowels int
250+
TotalConsonants int
251+
TotalLines int
252+
TotalDuration int
253+
AvgWordsPerAlbum int
254+
AvgCharsPerAlbum int
255+
AvgWordLength float64
256+
AvgSongsPerAlbum float64
257+
WPM int
258+
ProjectedAlbums float64
259+
FuckCount int
260+
DisplayAlbums []models.BandcampAlbumData
261+
}{
262+
Albums: allAlbums,
263+
TotalAlbums: albumCount,
264+
TotalSongs: totalSongs,
265+
TotalWords: totalWords,
266+
TotalChars: totalChars,
267+
TotalCharsNoSpaces: totalCharsNoSpaces,
268+
TotalVowels: totalVowels,
269+
TotalConsonants: totalConsonants,
270+
TotalLines: totalLines,
271+
TotalDuration: totalDuration / 60,
272+
AvgWordsPerAlbum: avgWordsPerAlbum,
273+
AvgCharsPerAlbum: totalChars / max(albumCount, 1),
274+
AvgWordLength: avgWordLength,
275+
AvgSongsPerAlbum: avgSongsPerAlbum,
276+
WPM: wpm,
277+
ProjectedAlbums: projectedAlbums,
278+
FuckCount: fuckCount,
279+
DisplayAlbums: displayAlbums,
280+
}
281+
return nil
282+
}
283+
284+
func indexHandler(c echo.Context) error {
218285
return renderTemplate(c, "index.html", map[string]interface{}{
219-
"albums": displayAlbums,
220-
"TotalAlbums": albumCount,
221-
"TotalSongs": totalSongs,
222-
"TotalWords": totalWords,
223-
"TotalChars": totalChars,
224-
"TotalCharsNoSpaces": totalCharsNoSpaces,
225-
"TotalVowels": totalVowels,
226-
"TotalConsonants": totalConsonants,
227-
"TotalLines": totalLines,
228-
"TotalDuration": totalDuration / 60,
229-
"AvgWordsPerAlbum": avgWordsPerAlbum,
230-
"AvgCharsPerAlbum": totalChars / max(albumCount, 1),
231-
"AvgWordLength": avgWordLength,
232-
"AvgSongsPerAlbum": avgSongsPerAlbum,
233-
"WPM": wpm,
234-
"ProjectedAlbums": projectedAlbums,
235-
"FuckCount": fuckCount,
286+
"albums": homePageCache.DisplayAlbums,
287+
"TotalAlbums": homePageCache.TotalAlbums,
288+
"TotalSongs": homePageCache.TotalSongs,
289+
"TotalWords": homePageCache.TotalWords,
290+
"TotalChars": homePageCache.TotalChars,
291+
"TotalCharsNoSpaces": homePageCache.TotalCharsNoSpaces,
292+
"TotalVowels": homePageCache.TotalVowels,
293+
"TotalConsonants": homePageCache.TotalConsonants,
294+
"TotalLines": homePageCache.TotalLines,
295+
"TotalDuration": homePageCache.TotalDuration,
296+
"AvgWordsPerAlbum": homePageCache.AvgWordsPerAlbum,
297+
"AvgCharsPerAlbum": homePageCache.AvgCharsPerAlbum,
298+
"AvgWordLength": homePageCache.AvgWordLength,
299+
"AvgSongsPerAlbum": homePageCache.AvgSongsPerAlbum,
300+
"WPM": homePageCache.WPM,
301+
"ProjectedAlbums": homePageCache.ProjectedAlbums,
302+
"FuckCount": homePageCache.FuckCount,
236303
})
237304
}
238305

@@ -541,6 +608,9 @@ func importAlbumHandler(c echo.Context) error {
541608
if err := loadAlbums(); err != nil {
542609
log.Printf("Error reloading albums after import: %v", err)
543610
}
611+
if err := refreshHomePageCache(); err != nil {
612+
log.Printf("Error refreshing home page cache after import: %v", err)
613+
}
544614

545615
log.Printf("Import complete")
546616
return c.HTML(http.StatusOK, strings.Join(results, "\n"))

0 commit comments

Comments
 (0)