Refactor to vertical slice
This commit is contained in:
31
apps/backend/src/lib/slug.ts
Normal file
31
apps/backend/src/lib/slug.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import { v7 as uuidv7 } from 'uuid';
|
||||
|
||||
export function slugify(value: string): string {
|
||||
return value
|
||||
.normalize('NFD')
|
||||
.replace(/[\u0300-\u036f]/g, '')
|
||||
.toLowerCase()
|
||||
.trim()
|
||||
.replace(/[^a-z0-9\s-]/g, '')
|
||||
.replace(/\s+/g, '-')
|
||||
.replace(/-+/g, '-');
|
||||
}
|
||||
|
||||
export async function buildUniqueSlug(
|
||||
source: string,
|
||||
findExisting: (slug: string) => Promise<{ id: string } | null>
|
||||
): Promise<string> {
|
||||
const base = slugify(source);
|
||||
const fallback = base.length > 0 ? base : `resource-${uuidv7().slice(0, 8)}`;
|
||||
|
||||
let candidate = fallback;
|
||||
let index = 1;
|
||||
|
||||
while (true) {
|
||||
const existing = await findExisting(candidate);
|
||||
if (!existing) return candidate;
|
||||
|
||||
index += 1;
|
||||
candidate = `${fallback}-${index}`;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user