From e34d2bf8f15900d9c6356ae22f2a56f4d9354884 Mon Sep 17 00:00:00 2001 From: Nik Afiq Date: Thu, 11 Dec 2025 21:53:09 +0900 Subject: [PATCH] feat(repo): refactor MoveToArchive to use structured data for improved readability and maintainability --- backend/internal/repo/episode_repo.go | 58 +++++++++++++++------------ 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/backend/internal/repo/episode_repo.go b/backend/internal/repo/episode_repo.go index b1e2db3..291fda9 100644 --- a/backend/internal/repo/episode_repo.go +++ b/backend/internal/repo/episode_repo.go @@ -172,22 +172,33 @@ func (r *pgxEpisodeRepo) MoveToArchive(ctx context.Context, ids []int64) (episod } defer rows.Close() + type rowData struct { + id int64 + epNum int + epTitle string + seasonName string + startTime string + playback string + currentEp bool + dateCreated time.Time + } + var items []rowData for rows.Next() { - var ( - id int64 - epNum int - epTitle string - seasonName string - startTime string - playback string - currentEp bool - dateCreated time.Time - archivedID int64 - inserted bool - ) - if err := rows.Scan(&id, &epNum, &epTitle, &seasonName, &startTime, &playback, ¤tEp, &dateCreated); err != nil { + var item rowData + if err := rows.Scan(&item.id, &item.epNum, &item.epTitle, &item.seasonName, &item.startTime, &item.playback, &item.currentEp, &item.dateCreated); err != nil { return res, err } + items = append(items, item) + } + if err := rows.Err(); err != nil { + return res, err + } + + for _, item := range items { + var ( + archivedID int64 + inserted bool + ) // First try to insert with the same id; on conflict, insert with a new id. err = tx.QueryRow(ctx, ` @@ -197,9 +208,9 @@ func (r *pgxEpisodeRepo) MoveToArchive(ctx context.Context, ids []int64) (episod VALUES ($1, $2, $3, $4, $5, $6, $7, $8) ON CONFLICT (id) DO NOTHING RETURNING id - `, id, epNum, epTitle, seasonName, startTime, playback, currentEp, dateCreated).Scan(&archivedID) + `, item.id, item.epNum, item.epTitle, item.seasonName, item.startTime, item.playback, item.currentEp, item.dateCreated).Scan(&archivedID) if err != nil && !errors.Is(err, pgx.ErrNoRows) { - log.Printf("archive insert failed for id=%d: %v", id, err) + log.Printf("archive insert failed for id=%d: %v", item.id, err) return res, err } if err == nil { @@ -213,24 +224,21 @@ func (r *pgxEpisodeRepo) MoveToArchive(ctx context.Context, ids []int64) (episod ) VALUES (nextval(pg_get_serial_sequence('current','id')), $1, $2, $3, $4, $5, $6, $7) RETURNING id - `, epNum, epTitle, seasonName, startTime, playback, currentEp, dateCreated).Scan(&archivedID); err != nil { - log.Printf("archive fallback insert failed for original id=%d: %v", id, err) + `, item.epNum, item.epTitle, item.seasonName, item.startTime, item.playback, item.currentEp, item.dateCreated).Scan(&archivedID); err != nil { + log.Printf("archive fallback insert failed for original id=%d: %v", item.id, err) return res, err } } // Delete from current using the original id. - if _, err := tx.Exec(ctx, `DELETE FROM current WHERE id = $1`, id); err != nil { - log.Printf("archive delete failed for id=%d: %v", id, err) + if _, err := tx.Exec(ctx, `DELETE FROM current WHERE id = $1`, item.id); err != nil { + log.Printf("archive delete failed for id=%d: %v", item.id, err) return res, err } - res.MovedIDs = append(res.MovedIDs, id) - res.DeletedIDs = append(res.DeletedIDs, id) - delete(requested, id) - } - if err := rows.Err(); err != nil { - return res, err + res.MovedIDs = append(res.MovedIDs, item.id) + res.DeletedIDs = append(res.DeletedIDs, item.id) + delete(requested, item.id) } // Any ids not found are treated as skipped.