Files
gerbeur/shared/playlist.ts

113 lines
3.3 KiB
TypeScript

/**
* Playlists are ordered collections of dumps their owners curate. This module
* types them, with the bodies that create, edit and reorder them. The client
* shows them on `/@owner/playlists/:slug`, on profiles and in search results.
*
* @module
*/
import type { Dump } from "./dump.ts";
/**
* Returned by the playlist routes, and by the search, users and dumps routes
* that list playlists. The `playlist_created` and `playlist_updated` WebSocket
* messages carry it too.
*/
export interface Playlist {
id: string;
userId: string;
title: string;
/**
* Names the playlist in its page's path, `playlistPath`
* (`shared/paths.ts`) building it with {@link ownerUsername}. Made from the
* title on creation, it changes only when edited, and is unique among its
* owner's playlists.
*/
slug: string;
/** It is written in Markdown. */
description?: string;
/**
* Only its owner sees a private playlist. Moderators don't, though they may
* still edit or delete it.
*/
isPublic: boolean;
createdAt: Date;
/**
* `playlistImageUrl` puts it on the cover's URL, so a new cover isn't hidden
* by the cached old one.
*/
updatedAt?: Date;
/** It is undefined when the playlist has no cover. */
imageMime?: string;
/**
* It counts the dumps the viewer may see in it, as its page lists them. It
* is undefined when the query didn't count them.
*/
dumpCount?: number;
/** The owner's current name, which the playlist's path starts with. */
ownerUsername: string;
/**
* The ids of the playlist categories it is filed under. The services fill
* them in on every playlist they return.
*/
categoryIds?: string[];
}
/**
* Returned by `GET /api/users/:key/playlists/:slug` to `PlaylistDetail`, and
* by `GET /api/playlists/:playlistId`, with the dumps the caller may see, in
* the playlist's order.
*/
export interface PlaylistWithDumps extends Playlist {
dumps: Dump[];
}
/**
* Returned by `GET /api/me/playlists?contains=:dumpId`, one per playlist of
* the caller's. `PlaylistMembershipPanel` ticks the playlists
* with `hasDump`, in the add-to-playlist modal and the dump form.
*/
export interface PlaylistMembership {
playlist: Playlist;
hasDump: boolean;
}
/** Passed to `POST /api/playlists` by `PlaylistCreateForm`. */
export interface CreatePlaylistRequest {
title: string;
description?: string;
isPublic: boolean;
/** The playlist categories to file it under, none when left out. */
categoryIds?: string[];
}
/**
* Passed to `PUT /api/playlists/:playlistId` by `PlaylistDetail`. A field left
* out keeps its value.
*/
export interface UpdatePlaylistRequest {
title?: string;
/**
* A new slug, which the edit form's slug field sends. A title change never
* changes the slug by itself.
*/
slug?: string;
/** `null` removes the description. */
description?: string | null;
isPublic?: boolean;
/** Replaces its playlist categories; `[]` takes it out of every one. */
categoryIds?: string[];
}
/**
* Passed to `PUT /api/playlists/:playlistId/order` by `PlaylistDetail`, after
* a drag or to put back a dump whose removal was undone.
*/
export interface ReorderPlaylistRequest {
/**
* Every dump of the playlist the caller can see, in the new order. The dumps
* hidden from them keep their slots.
*/
dumpIds: string[];
}