92 lines
2.5 KiB
TypeScript
92 lines
2.5 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 `/playlists/:playlistId`, 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;
|
|
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, as for a new playlist or a membership.
|
|
*/
|
|
dumpCount?: number;
|
|
/** It is undefined where `dumpCount` is. */
|
|
ownerUsername?: string;
|
|
}
|
|
|
|
/**
|
|
* Returned by `GET /api/playlists/:playlistId` to `PlaylistDetail`, with the
|
|
* dumps the caller may see, in the playlist's order.
|
|
*/
|
|
export interface PlaylistWithDumps extends Playlist {
|
|
dumps: Dump[];
|
|
}
|
|
|
|
/**
|
|
* Returned by `GET /api/playlists/by-dump/:dumpId/memberships`, 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;
|
|
/** `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[];
|
|
}
|