Picks and checks the slugs of dumps and playlists, which name them in their page URLs under their owner: /@bob/dumps/<slug>, /@bob/playlists/<slug>. Each kind has its own slug space per owner, shared by the items' current slugs and their aliases (the slugs they had before). services/slug-service.ts changes and resolves slugs with these, and migration 0021 gave every item one; both pass the database, since this module doesn't open it.

Functions

f
slugHolder(
db: DatabaseSync,
kind: SlugKind,
userId: string,
slug: string
): string | undefined

Returns the id of the item whose current slug or alias is slug in userId's space for kind, or undefined when it is free.

f
uniqueSlug(
db: DatabaseSync,
kind: SlugKind,
userId: string,
base: string
): string

Returns base, or base-2, base-3… cut to fit, whichever is free in userId's space for kind. base must be a valid slug, as slugify makes. The services take it on creating an item, the migration on re-slugging one, inside the transaction that writes it.

f
validateSlug(
slug: string,
max?: number
): void

Throws a 400 unless slug is a valid slug, lowercase words of letters and digits joined by hyphens, at most max long. slug-service checks a dump's or a playlist's with it, and category-service a category's, with that kind's own limit.

Type Aliases

T
SlugKind = "dump" | "playlist"

A kind of item that has a slug under its owner.

Variables