peter
e74986cc9a
fix(playlists): a racing move is not a 500; ownership through owned_or_404 everywhere
...
move_item checked "already in the target?" and then re-parented without a
lock, so a second tab's add or the scheduler's YouTube merge committing the
same video in between hit uq_playlist_video and answered a raw 500. The
re-parent now runs in a savepoint and a conflict falls back to the
already-present outcome. The target is touched only when the row landed in
it (an untouched list was promoted in the rail's "recently changed" sort),
and _touch stamps the database clock like the mixin's own onupdate.
The canonical-patterns table names owned_or_404 against ad-hoc ownership
helpers; six were left (_own_playlist, _own_playlist_or_404, _own_view,
_own_tag, notifications._owned, downloads._own_job), two of them
hand-rolled with a bare English 404. All call sites now use owned_or_404,
and the download/link/notification 404s are structured like the rest. The
contract test reads every "what is gone" the routes name, and the YouTube
refusal reasons, and requires both languages to name each.
2026-09-19 07:01:18 +02:00
..
2026-09-17 01:44:29 +02:00
2026-09-18 01:20:42 +02:00
2026-09-05 04:02:57 +02:00
2026-09-16 04:29:13 +02:00
2026-09-02 00:15:21 +02:00
2026-09-19 03:42:26 +02:00
2026-09-04 22:42:15 +02:00
2026-09-15 02:53:22 +02:00
2026-08-27 04:02:25 +02:00
2026-09-18 03:16:15 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-09-17 02:42:12 +02:00
2026-09-17 23:45:16 +02:00
2026-09-09 00:12:53 +02:00
2026-09-16 04:29:13 +02:00
2026-08-28 02:37:56 +02:00
2026-09-16 03:43:29 +02:00
2026-09-18 23:44:42 +02:00
2026-09-14 01:42:57 +02:00
2026-09-05 04:18:33 +02:00
2026-08-30 03:32:14 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-09-04 20:29:33 +02:00
2026-09-05 01:35:09 +02:00
2026-09-04 20:29:33 +02:00
2026-09-14 00:50:05 +02:00
2026-09-18 23:44:42 +02:00
2026-08-23 07:43:06 +02:00
2026-09-19 05:54:19 +02:00
2026-08-23 07:43:06 +02:00
2026-08-26 05:25:47 +02:00
2026-08-23 07:43:06 +02:00
2026-09-19 04:51:31 +02:00
2026-09-15 00:53:15 +02:00
2026-08-28 02:37:56 +02:00
2026-09-12 03:57:52 +02:00
2026-09-19 04:51:43 +02:00
2026-09-19 01:33:32 +02:00
2026-08-29 08:02:11 +02:00
2026-09-19 06:55:40 +02:00
2026-09-18 03:16:15 +02:00
2026-09-04 01:56:55 +02:00
2026-09-19 05:03:31 +02:00
2026-09-18 22:50:37 +02:00
2026-09-04 22:42:15 +02:00
2026-09-01 23:31:49 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-09-12 05:50:31 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-29 03:52:13 +02:00
2026-09-19 07:01:18 +02:00
2026-08-20 08:50:47 +02:00
2026-09-09 23:55:51 +02:00
2026-09-10 22:05:39 +02:00
2026-09-11 23:27:48 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-09-19 06:57:20 +02:00
2026-09-12 16:21:37 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-27 02:50:41 +02:00
2026-09-06 03:31:02 +02:00
2026-08-23 07:43:06 +02:00
2026-09-06 03:31:02 +02:00
2026-08-30 17:58:38 +02:00
2026-09-12 03:57:52 +02:00
2026-08-23 07:43:06 +02:00
2026-09-10 20:02:06 +02:00
2026-09-11 18:04:30 +02:00
2026-09-12 04:18:35 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-28 01:34:02 +02:00
2026-09-11 18:05:30 +02:00
2026-09-15 02:53:22 +02:00
2026-08-23 07:43:06 +02:00
2026-09-15 02:25:00 +02:00
2026-08-23 07:43:06 +02:00
2026-09-04 02:38:01 +02:00
2026-09-04 23:04:09 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-09-05 01:46:58 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-09-18 01:20:42 +02:00
2026-09-19 05:05:13 +02:00
2026-09-17 00:03:56 +02:00
2026-08-26 05:25:47 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-09-13 23:12:16 +02:00
2026-09-05 04:02:57 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-09-04 20:29:33 +02:00
2026-09-18 22:50:37 +02:00
2026-09-19 04:51:31 +02:00
2026-09-19 06:55:40 +02:00
2026-09-18 23:44:42 +02:00