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.
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.
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.
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.
A kind of item that has a slug under its owner.
Where each SlugKind's slugs live.
Usage
import * as mod from "api/lib/slugify.ts";