104 lines
2.9 KiB
TypeScript
104 lines
2.9 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 can't see too. 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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[];
|
|
}
|