feat(creatives): Canva Agua Miia post / story / LinkedIn

Mapea EAHYK-l1SFM, EAHYK9p_MlY y EAHYK_ylNJo por formato y plataforma en RRSS.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
4Ventures
2026-10-16 14:00:34 +02:00
parent 5de5e3c5e0
commit f127b0a4c4
4 changed files with 139 additions and 44 deletions

View File

@@ -14,11 +14,18 @@ export type RrssPlacement = {
};
/** Placements per RRSS format (not the Ads triple 4:5+9:16+1.91:1). */
export function rrssBriefAspectFields(format: RrssPipelineFormat): {
export function rrssBriefAspectFields(
format: RrssPipelineFormat,
platform?: string | null
): {
aspect_ratio: string;
aspect_ratios: string[];
required_placements: RrssPlacement[];
} {
const isLinkedIn = String(platform || '')
.toLowerCase()
.includes('linkedin');
if (format === 'story') {
const p: RrssPlacement = {
aspect_ratio: '9:16',
@@ -39,13 +46,23 @@ export function rrssBriefAspectFields(format: RrssPipelineFormat): {
};
return { aspect_ratio: '9:16', aspect_ratios: ['9:16'], required_placements: [p] };
}
if (isLinkedIn) {
const p: RrssPlacement = {
aspect_ratio: '1:1',
role: 'linkedin',
size: '1080x1080',
meta_key: 'asset_url',
canva_template_key: 'linkedin',
};
return { aspect_ratio: '1:1', aspect_ratios: ['1:1'], required_placements: [p] };
}
if (format === 'carrusel') {
const p: RrssPlacement = {
aspect_ratio: '4:5',
role: 'carousel_slide',
size: '1080x1350',
meta_key: 'asset_url',
canva_template_key: 'foto-con-franja',
canva_template_key: 'post',
};
return {
aspect_ratio: '4:5',
@@ -53,13 +70,13 @@ export function rrssBriefAspectFields(format: RrssPipelineFormat): {
required_placements: [p],
};
}
// post feed
// post feed (IG/FB)
const p: RrssPlacement = {
aspect_ratio: '4:5',
role: 'feed',
size: '1080x1350',
meta_key: 'asset_url',
canva_template_key: 'foto-con-franja',
canva_template_key: 'post',
};
return { aspect_ratio: '4:5', aspect_ratios: ['4:5'], required_placements: [p] };
}
@@ -99,6 +116,7 @@ export type RrssGenerationBriefInput = {
pillar?: string | null;
month?: string | null;
scheduledAt?: string | null;
platform?: string | null;
calendarPiece?: RrssCalendarPieceBrief | null;
/** Recent pipeline captions/titles for style continuity */
recentPipeline?: Array<{ title: string; format: string; caption?: string | null }>;
@@ -113,8 +131,12 @@ export type RrssGenerationBriefInput = {
};
export function buildRrssGenerationBrief(input: RrssGenerationBriefInput) {
const aspects = rrssBriefAspectFields(input.format);
const cal = input.calendarPiece || {};
const platform =
input.platform ||
(typeof cal.platform === 'string' ? cal.platform : null) ||
null;
const aspects = rrssBriefAspectFields(input.format, platform);
return {
channel: 'rrss' as const,
tenant_id: input.tenantId,
@@ -127,6 +149,7 @@ export function buildRrssGenerationBrief(input: RrssGenerationBriefInput) {
source_pipeline_id: input.pipelineId,
calendar_piece_id: input.calendarPieceId || cal.id || null,
format: input.format,
platform,
skill_format: mapRrssFormatToSkillFormat(input.format),
...aspects,
variants_requested: Number(input.variantsRequested || 2),