KO
베타 번역

@core / kit-blog

1.0.1 ▾
인증됨MIT
GitHub

Next.js 블로그 키트: 작성자·카테고리·태그·시리즈 글, 피드, 검토 댓글, 뉴스레터

코드파일 32개컨텍스트약 883토큰검사 통과

.genpmignore 적용 후 주입될 정확한 트리입니다. 고정 대상:

src/app/(blog)/_lib/campaign.ts읽기 전용 · fa952a4
// "Enviar este post como campaña": crea un borrador de campaña de @core/newsletter con el contenido publicado del post.
import type { AdminResource } from '@/lib/contracts';
import { type ContentAdminRow, getEntry } from '@/lib/content';
import { createCampaign } from '@/lib/newsletter';
import type { Doc } from '@/lib/rich-text';

export function withSendAsCampaign(posts: AdminResource<ContentAdminRow>): AdminResource<ContentAdminRow> {
  return {
    ...posts,
    actions: [
      ...(posts.actions ?? []),
      {
        name: 'send-as-campaign',
        label: 'Create newsletter campaign',
        permission: 'campaigns:create',
        confirm: true,
        available: (r) => r.status === 'published',
        async run(id, _input, ctx) {
          if (!(await ctx.can('campaigns:create'))) throw Object.assign(new Error('forbidden'), { code: 'forbidden' });
          const row = await posts.get(id, ctx);
          if (!row) throw Object.assign(new Error('not found'), { code: 'not_found' });
          // Siempre la versión publicada: los cambios sin publicar (borrador) no se envían a los suscriptores.
          const published = await getEntry<{ title: string; excerpt?: string; body: Doc }>('posts', row.slug, { locale: row.locale });
          if (!published || published.id !== row.id) throw Object.assign(new Error('not published'), { code: 'invalid_state' });
          const d = published.data;
          await createCampaign({ subject: d.title.slice(0, 200), ...(d.excerpt && { preheader: d.excerpt.slice(0, 200) }), body: d.body });
          return row;
        },
      },
    ],
  };
}

@core/kit-blog 신고

패키지를 신고하려면 GitHub로 로그인하세요.