Skip to content

Commit c11fe9f

Browse files
Initial edit idea. Performance is better.
1 parent 5964413 commit c11fe9f

File tree

6 files changed

+155
-12
lines changed

6 files changed

+155
-12
lines changed

internal/admin/handlers.go

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -238,15 +238,9 @@ func (h *Handler) AlbumListHandler(c echo.Context) error {
238238
if err != nil {
239239
return c.HTML(500, "Failed to load albums")
240240
}
241-
var sb strings.Builder
242-
sb.WriteString(`<ul class="list-disc pl-6">`)
243-
for _, album := range albums {
244-
sb.WriteString("<li>")
245-
sb.WriteString(template.HTMLEscapeString(album.ArtistName + " - " + album.AlbumName))
246-
sb.WriteString("</li>")
247-
}
248-
sb.WriteString("</ul>")
249-
return c.HTML(200, sb.String())
241+
return h.templates.Render(c.Response().Writer, "admin/components/album-list", map[string]interface{}{
242+
"Albums": albums,
243+
}, c)
250244
}
251245

252246
func (h *Handler) ImportStartHandler(c echo.Context) error {
@@ -368,6 +362,20 @@ func (h *Handler) ImportProcessHandler(c echo.Context) error {
368362
return c.HTML(200, row+progressBar+triggerNext)
369363
}
370364

365+
func (h *Handler) AlbumEditFormHandler(c echo.Context) error {
366+
if err := validateAuth(c); err != nil {
367+
return err
368+
}
369+
albumID := c.Param("id")
370+
album, err := loader.GetAlbumByID(albumID)
371+
if err != nil {
372+
return c.HTML(404, "Album not found")
373+
}
374+
return h.templates.Render(c.Response().Writer, "admin/components/album-edit-form", map[string]interface{}{
375+
"Album": album,
376+
}, c)
377+
}
378+
371379
func validateAuth(c echo.Context) error {
372380
cookie, err := c.Cookie("session")
373381
if err != nil {

internal/admin/routes.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ func SetupRoutes(e *echo.Echo, h *Handler) {
1616
admin.POST("/validate/metal-archives-url", h.ValidateMetalArchivesUrlHandler)
1717
admin.GET("/logout", h.LogoutHandler)
1818
admin.GET("/content/albums", h.AlbumListHandler)
19+
admin.GET("/content/album-edit/:id", h.AlbumEditFormHandler)
1920
}

loaders/sqlite/loader.go

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,50 @@ func GetAlbumBySlug(slug string) (models.BandcampAlbumData, error) {
241241
return album, nil
242242
}
243243

244+
func GetAlbumByID(id string) (models.BandcampAlbumData, error) {
245+
db, err := sql.Open("sqlite", dbPath)
246+
if err != nil {
247+
return models.BandcampAlbumData{}, fmt.Errorf("error opening database: %w", err)
248+
}
249+
defer db.Close()
250+
251+
var album models.BandcampAlbumData
252+
var ampwallURL, metalArchivesURL sql.NullString
253+
254+
err = db.QueryRow(`
255+
SELECT id, slug, artist_name, album_name, image_url, image_data,
256+
album_color_average, bandcamp_url, ampwall_url, metal_archives_url,
257+
total_length, formatted_length, date_added
258+
FROM albums WHERE id = ?`, id).Scan(
259+
&album.ID,
260+
&album.Slug,
261+
&album.ArtistName,
262+
&album.AlbumName,
263+
&album.ImageUrl,
264+
&album.ImageData,
265+
&album.AlbumColorAverage,
266+
&album.BandcampUrl,
267+
&ampwallURL,
268+
&metalArchivesURL,
269+
&album.TotalLength,
270+
&album.FormattedLength,
271+
&album.DateAdded)
272+
if err != nil {
273+
return models.BandcampAlbumData{}, fmt.Errorf("error fetching album: %w", err)
274+
}
275+
276+
album.AmpwallUrl = ampwallURL.String
277+
album.MetalArchivesURL = metalArchivesURL.String
278+
album.ImageDataBase64 = base64.StdEncoding.EncodeToString(album.ImageData)
279+
280+
if err := fetchTracks(db, &album); err != nil {
281+
return models.BandcampAlbumData{}, fmt.Errorf("error fetching tracks: %w", err)
282+
}
283+
284+
calculateAlbumMetrics(&album)
285+
return album, nil
286+
}
287+
244288
func AlbumUrlExists(url string) (bool, error) {
245289
db, err := sql.Open("sqlite", dbPath)
246290
if err != nil {
@@ -306,7 +350,7 @@ func FetchAlbumNamesOnly() ([]models.BandcampAlbumData, error) {
306350
}
307351
defer db.Close()
308352

309-
query := `SELECT artist_name, album_name FROM albums ORDER BY date_added DESC`
353+
query := `SELECT id, artist_name, album_name FROM albums ORDER BY date_added DESC`
310354
rows, err := db.Query(query)
311355
if err != nil {
312356
return nil, fmt.Errorf("error querying albums: %w", err)
@@ -316,7 +360,7 @@ func FetchAlbumNamesOnly() ([]models.BandcampAlbumData, error) {
316360
var albums []models.BandcampAlbumData
317361
for rows.Next() {
318362
var album models.BandcampAlbumData
319-
if err := rows.Scan(&album.ArtistName, &album.AlbumName); err != nil {
363+
if err := rows.Scan(&album.ID, &album.ArtistName, &album.AlbumName); err != nil {
320364
return nil, fmt.Errorf("error scanning album row: %w", err)
321365
}
322366
albums = append(albums, album)

loaders/supabase/loader.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,34 @@ func GetAlbumBySlug(slug string) (models.BandcampAlbumData, error) {
188188
return album, nil
189189
}
190190

191+
func GetAlbumByID(id string) (models.BandcampAlbumData, error) {
192+
data, _, err := publicClient.From("albums").
193+
Select("*", "exact", false).
194+
Eq("id", id).
195+
Single().
196+
Execute()
197+
if err != nil {
198+
return models.BandcampAlbumData{}, fmt.Errorf("error fetching album: %w", err)
199+
}
200+
201+
var album models.BandcampAlbumData
202+
if err := json.Unmarshal(data, &album); err != nil {
203+
return models.BandcampAlbumData{}, fmt.Errorf("error scanning album data: %w", err)
204+
}
205+
206+
if album.ImageStoragePath != "" {
207+
publicURL := adminClient.Storage.GetPublicUrl("album-covers", album.ImageStoragePath)
208+
album.ImageUrl = publicURL.SignedURL
209+
}
210+
211+
if err := fetchTracks(&album); err != nil {
212+
return models.BandcampAlbumData{}, fmt.Errorf("error fetching tracks: %w", err)
213+
}
214+
215+
calculateAlbumMetrics(&album)
216+
return album, nil
217+
}
218+
191219
func AlbumUrlExists(url string) (bool, error) {
192220
data, _, err := publicClient.From("albums").
193221
Select("id", "exact", false).
@@ -439,7 +467,7 @@ func UpdateAlbum(req models.UpdateAlbumRequest) error {
439467

440468
func FetchAlbumNamesOnly() ([]models.BandcampAlbumData, error) {
441469
query := publicClient.From("albums").
442-
Select("artist_name, album_name", "exact", false).
470+
Select("id, artist_name, album_name", "exact", false).
443471
Order("date_added", &postgrest.OrderOpts{
444472
Ascending: false,
445473
NullsFirst: false,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{{ define "admin/components/album-edit-form" }}
2+
<form
3+
hx-post="/admin/content/album-edit/{{ .Album.ID }}"
4+
hx-target="#album-edit-modal-content"
5+
hx-swap="innerHTML"
6+
class="space-y-4">
7+
<div>
8+
<label class="block text-sm font-medium mb-1">Artist Name</label>
9+
<input type="text" name="artist_name" value="{{ .Album.ArtistName }}" class="w-full p-2 rounded bg-gray-800 text-gray-200 border border-gray-600 focus:border-blue-500" required />
10+
</div>
11+
<div>
12+
<label class="block text-sm font-medium mb-1">Album Name</label>
13+
<input type="text" name="album_name" value="{{ .Album.AlbumName }}" class="w-full p-2 rounded bg-gray-800 text-gray-200 border border-gray-600 focus:border-blue-500" required />
14+
</div>
15+
<!-- Add more fields as needed -->
16+
<div class="flex justify-end gap-2">
17+
<button type="button" class="px-4 py-2 bg-gray-700 text-gray-300 rounded hover:bg-gray-600" onclick="document.getElementById('album-edit-modal').classList.add('hidden')">Cancel</button>
18+
<button type="submit" class="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700">Save</button>
19+
</div>
20+
</form>
21+
{{ end }}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{{ define "admin/components/album-list" }}
2+
<div>
3+
<table class="min-w-full bg-gray-800 rounded-lg overflow-hidden">
4+
<thead>
5+
<tr class="bg-gray-700 text-gray-300">
6+
<th class="px-4 py-2 text-left">Artist</th>
7+
<th class="px-4 py-2 text-left">Album</th>
8+
<th class="px-4 py-2"></th>
9+
</tr>
10+
</thead>
11+
<tbody>
12+
{{ range .Albums }}
13+
<tr class="border-b border-gray-700 hover:bg-gray-700">
14+
<td class="px-4 py-2">{{ .ArtistName }}</td>
15+
<td class="px-4 py-2">{{ .AlbumName }}</td>
16+
<td class="px-4 py-2 text-right">
17+
<button
18+
class="px-3 py-1 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors"
19+
hx-get="/admin/content/album-edit/{{ .ID }}"
20+
hx-target="#album-edit-modal-content"
21+
hx-trigger="click"
22+
hx-swap="innerHTML"
23+
_="on htmx:afterSwap add .block to #album-edit-modal remove .hidden from #album-edit-modal"
24+
>Edit</button>
25+
</td>
26+
</tr>
27+
{{ end }}
28+
</tbody>
29+
</table>
30+
</div>
31+
32+
<!-- Modal for editing -->
33+
<div id="album-edit-modal" class="fixed inset-0 bg-black bg-opacity-60 flex items-center justify-center z-50 hidden">
34+
<div class="bg-gray-900 rounded-lg shadow-lg p-6 w-full max-w-lg relative">
35+
<button class="absolute top-2 right-2 text-gray-400 hover:text-white" onclick="document.getElementById('album-edit-modal').classList.add('hidden')">&times;</button>
36+
<div id="album-edit-modal-content">
37+
<!-- Edit form will be loaded here via HTMX -->
38+
</div>
39+
</div>
40+
</div>
41+
{{ end }}

0 commit comments

Comments
 (0)