68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
/**
|
|
* Turns the rows the playlist and follow services read from `playlists` into
|
|
* the {@link Playlist} the API sends.
|
|
*
|
|
* @module
|
|
*/
|
|
|
|
import type { SQLOutputValue } from "node:sqlite";
|
|
import type { Playlist } from "../../shared/playlist.ts";
|
|
|
|
/**
|
|
* Returned by the playlist and follow services' `SELECT`s on `playlists`,
|
|
* which join the owner's name as `owner_username`. A query may add a
|
|
* `dump_count` column, which {@link playlistRowToApi} carries over when
|
|
* present.
|
|
*/
|
|
export interface PlaylistRow {
|
|
id: string;
|
|
user_id: string;
|
|
title: string;
|
|
/** Unique among its owner's playlists, and set on every row since 0021. */
|
|
slug: string;
|
|
owner_username: string;
|
|
description: string | null;
|
|
is_public: number;
|
|
created_at: string;
|
|
updated_at: string | null;
|
|
image_mime: string | null;
|
|
[key: string]: SQLOutputValue;
|
|
}
|
|
|
|
/** Checks whether a row `node:sqlite` returned is a {@link PlaylistRow}. */
|
|
export function isPlaylistRow(
|
|
obj: unknown,
|
|
): obj is PlaylistRow {
|
|
return !!obj && typeof obj === "object" &&
|
|
"id" in obj && typeof obj.id === "string" &&
|
|
"user_id" in obj && typeof obj.user_id === "string" &&
|
|
"title" in obj && typeof obj.title === "string" &&
|
|
"slug" in obj && typeof obj.slug === "string" &&
|
|
"owner_username" in obj && typeof obj.owner_username === "string" &&
|
|
"description" in obj &&
|
|
(typeof obj.description === "string" || obj.description === null) &&
|
|
"is_public" in obj && typeof obj.is_public === "number" &&
|
|
"created_at" in obj && typeof obj.created_at === "string" &&
|
|
"updated_at" in obj &&
|
|
(typeof obj.updated_at === "string" || obj.updated_at === null) &&
|
|
"image_mime" in obj &&
|
|
(typeof obj.image_mime === "string" || obj.image_mime === null);
|
|
}
|
|
|
|
/** Converts `row` to the {@link Playlist} the playlist routes send. */
|
|
export function playlistRowToApi(row: PlaylistRow): Playlist {
|
|
return {
|
|
id: row.id,
|
|
userId: row.user_id,
|
|
title: row.title,
|
|
slug: row.slug,
|
|
description: row.description ?? undefined,
|
|
isPublic: Boolean(row.is_public),
|
|
createdAt: new Date(row.created_at),
|
|
updatedAt: row.updated_at ? new Date(row.updated_at) : undefined,
|
|
imageMime: row.image_mime ?? undefined,
|
|
dumpCount: typeof row.dump_count === "number" ? row.dump_count : undefined,
|
|
ownerUsername: row.owner_username,
|
|
};
|
|
}
|