feat(08-03): FavoriteLink schema + FavoritesModule (CRUD + SSRF icon discovery)
- Add FavoriteLink Prisma model (userId/tenantId/widgetId scope, iconUrl nullable, position) - IconDiscoveryService: port SSRF-protected icon discovery with redirect: 'manual', private IP / blocked-hostname checks, 4000ms timeout, 200k HTML cap (T-08-05) - FavoritesService: list/create/update/remove all scoped by userId (T-08-06 / Pitfall 3) - FavoritesController: GET /favorites?widgetId, POST, PATCH :id, DELETE :id - FavoritesModule registered in AppModule - tsc --noEmit passes for @tessera/api
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
import {
|
||||
IsInt,
|
||||
IsNotEmpty,
|
||||
IsOptional,
|
||||
IsString,
|
||||
IsUrl,
|
||||
IsUUID,
|
||||
} from 'class-validator';
|
||||
|
||||
/**
|
||||
* DTO for creating a new FavoriteLink.
|
||||
* widgetId scopes the link to a specific widget instance (T-08-06 / Pitfall 3).
|
||||
*/
|
||||
export class CreateFavoriteDto {
|
||||
@IsUUID()
|
||||
widgetId!: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
title!: string;
|
||||
|
||||
@IsUrl()
|
||||
url!: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
iconUrl?: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsInt()
|
||||
position?: number;
|
||||
}
|
||||
Reference in New Issue
Block a user