動画を確認画面つきで複数削除できるようにする(ステップ13)
This commit is contained in:
@@ -161,3 +161,45 @@ func TestDeleteSucceededJobKeepsKnownEpisodeAndAllowsManualRequeue(t *testing.T)
|
||||
t.Fatalf("削除後の手動再投入: %+v %t %v", requeued, created, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestListSucceededJobsByIDsAndSeriesIDs(t *testing.T) {
|
||||
s := New(testPool(t, true))
|
||||
ctx := context.Background()
|
||||
first := completeTestJob(t, s, "bulk-list-1")
|
||||
|
||||
ep := seriesEpisode("bulk-list-2", "series-2")
|
||||
second, _, err := s.Enqueue(ctx, ep, "manual")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
claimed, err := s.ClaimNext(ctx)
|
||||
if err != nil || claimed.ID != second.ID {
|
||||
t.Fatalf("claim: %+v %v", claimed, err)
|
||||
}
|
||||
if err := s.Complete(ctx, second.ID, "別番組/video.mp4", 5678); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
second, err = s.GetSucceededJob(ctx, second.ID)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
queued, _, err := s.Enqueue(ctx, seriesEpisode("bulk-list-queued", "series-2"), "manual")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
byIDs, err := s.ListSucceededJobsByIDs(ctx, []int64{second.ID, queued.ID, first.ID})
|
||||
if err != nil || len(byIDs) != 2 || byIDs[0].ID != first.ID || byIDs[1].ID != second.ID {
|
||||
t.Fatalf("ID指定の完了済み取得: %+v %v", byIDs, err)
|
||||
}
|
||||
bySeries, err := s.ListSucceededJobsBySeriesIDs(ctx, []string{"series-2", "series-1"})
|
||||
if err != nil || len(bySeries) != 2 || bySeries[0].ID != first.ID || bySeries[1].ID != second.ID {
|
||||
t.Fatalf("番組指定の完了済み取得: %+v %v", bySeries, err)
|
||||
}
|
||||
if empty, err := s.ListSucceededJobsByIDs(ctx, nil); err != nil || len(empty) != 0 {
|
||||
t.Fatalf("空のID指定: %+v %v", empty, err)
|
||||
}
|
||||
if empty, err := s.ListSucceededJobsBySeriesIDs(ctx, []string{}); err != nil || len(empty) != 0 {
|
||||
t.Fatalf("空の番組指定: %+v %v", empty, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,6 +201,39 @@ func (s *Store) ListSucceededJobsBySeries(ctx context.Context, seriesID string)
|
||||
return jobs, rows.Err()
|
||||
}
|
||||
|
||||
func (s *Store) ListSucceededJobsByIDs(ctx context.Context, ids []int64) ([]Job, error) {
|
||||
if len(ids) == 0 {
|
||||
return []Job{}, nil
|
||||
}
|
||||
return s.listSucceededJobs(ctx, `id = ANY($1)`, ids)
|
||||
}
|
||||
|
||||
func (s *Store) ListSucceededJobsBySeriesIDs(ctx context.Context, seriesIDs []string) ([]Job, error) {
|
||||
if len(seriesIDs) == 0 {
|
||||
return []Job{}, nil
|
||||
}
|
||||
return s.listSucceededJobs(ctx, `series_id = ANY($1)`, seriesIDs)
|
||||
}
|
||||
|
||||
func (s *Store) listSucceededJobs(ctx context.Context, condition string, value any) ([]Job, error) {
|
||||
rows, err := s.pool.Query(ctx, `SELECT `+jobColumns+` FROM download_jobs
|
||||
WHERE status='succeeded' AND `+condition+`
|
||||
ORDER BY id`, value)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
var jobs []Job
|
||||
for rows.Next() {
|
||||
job, err := scanJob(rows)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
jobs = append(jobs, job)
|
||||
}
|
||||
return jobs, rows.Err()
|
||||
}
|
||||
|
||||
func (s *Store) DeleteSucceededJob(ctx context.Context, id int64) error {
|
||||
tag, err := s.pool.Exec(ctx, `DELETE FROM download_jobs WHERE id=$1 AND status='succeeded'`, id)
|
||||
return transitionResult(tag.RowsAffected(), err)
|
||||
|
||||
Reference in New Issue
Block a user