War ein Film einmal als gesehen markiert, gab es keinen Weg zurueck: im
Zustand "gesehen" stand statt eines Knopfes ein <p> — ein Etikett ohne
Klickziel. Der Statuswechsel konnte das nicht heilen, weil "gesehen" aus den
Sichtungen abgeleitet wird und setStatus() die absichtlich nicht anfasst.
Und eine Gegenfunktion fuer Filme gab es nicht: unmarkEpisodes() und
unmarkSeason() waren da, ein unmarkMovie() nie geschrieben.
unmarkMovie() ist auf run: entry.currentRun und episodeId: null eingegrenzt.
Wer einen Film dreimal gesehen hat, hat drei Sichtungen — ohne die
Eingrenzung loeschte das Zuruecknehmen alle drei und verfaelschte
rueckwirkend die Statistik.
Die gruene Plakette bleibt stehen, ist jetzt aber klickbar, so wie sich
Episodenhaekchen auch abwaehlen lassen. Ueber die Schnittstelle geht es mit
DELETE {"action":"movie"} als Gegenstueck zum gleichnamigen POST, ohne dass
man die watchIds kennen muss.
Drei Tests: Zuruecknehmen samt erneutem Abhaken, die Eingrenzung auf den
laufenden Durchlauf, und dass Serien abgewiesen werden. Klickweg und
Endpunkt gegen einen Produktionsbau geprueft.
Der im Issue vermutete Nebenpunkt trifft nicht zu: report() blendet das
Zuruecknehmen nur bei ids.length > 0 ein, ein wirkungsloses Angebot gab es
also nie.
Refs #5
This commit is contained in:
@@ -338,6 +338,27 @@ export async function markMovieWatched(
|
||||
return { watchIds: [watch.id], status, label: "Film als gesehen markiert" };
|
||||
}
|
||||
|
||||
/**
|
||||
* Nimmt die Sichtung eines Films im aktuellen Durchlauf zurück.
|
||||
*
|
||||
* Das Gegenstück zu `markMovieWatched()` — und das Pendant zu
|
||||
* `unmarkEpisodes()` bei Serien.
|
||||
*
|
||||
* Die Eingrenzung auf `run` ist wesentlich: wer einen Film dreimal gesehen
|
||||
* hat, hat drei Sichtungen. Ohne `run` löschte das Zurücknehmen alle drei und
|
||||
* verfälschte rückwirkend die Statistik. Zurückgenommen wird nur, was im
|
||||
* laufenden Durchlauf abgehakt wurde.
|
||||
*/
|
||||
export async function unmarkMovie(userId: string, entryId: string) {
|
||||
const entry = await requireEntry(userId, entryId);
|
||||
if (entry.title.type !== "MOVIE") throw new LibraryError("Das ist keine Filmsichtung.");
|
||||
|
||||
await prisma.watch.deleteMany({
|
||||
where: { userId, entryId, episodeId: null, run: entry.currentRun },
|
||||
});
|
||||
return reconcileStatus(userId, entryId);
|
||||
}
|
||||
|
||||
/** Macht eine Sichtungsaktion rückgängig. */
|
||||
export async function undoWatches(userId: string, entryId: string, watchIds: string[]) {
|
||||
await requireEntry(userId, entryId);
|
||||
|
||||
Reference in New Issue
Block a user