chore: orval 재생성 + report 정합 + /test fixture 정리

- orval: youtube/instagram/facebook 의 split 타입을 inline 으로 복귀, facebookPageEngagement·postFrequency 추가
- report: mainCTA → mainCta 로 백엔드 명세 정합 (transformer 가 항상 빈 문자열로 떨어지던 버그)
- report: additionalDomains 의 purpose 비면 ' — ' 표시 안 함
- /test fixture 에서 나나성형외과 제거 (10 → 9)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
main
Mina Choi 2026-06-04 22:51:44 +09:00
parent ea7b21dee3
commit 5839001e82
50 changed files with 56 additions and 457 deletions

View File

@ -81,18 +81,6 @@ export const CLINICS: ClinicFixture[] = [
gangnamUnni: 'https://www.gangnamunni.com/hospitals/2500',
},
},
{
label: '나나성형외과',
urls: {
homepage: 'https://www.nanaprs.com',
youtube: 'https://www.youtube.com/@Nanaprstv',
instagram: 'https://www.instagram.com/nanaprs/',
facebook: 'https://www.facebook.com/nanaprs2',
naverPlace: 'https://m.place.naver.com/hospital/1518147116',
naverBlog: 'https://blog.naver.com/nanaprs1',
gangnamUnni: 'https://www.gangnamunni.com/hospitals/938',
},
},
{
label: '디에이성형외과',
urls: {

View File

@ -86,13 +86,14 @@ export default function OtherChannels({ channels, website }: OtherChannelsProps)
<div className="mt-2 space-y-1">
{website.additionalDomains.map((d) => (
<p key={d.domain} className="text-sm text-slate-600">
{d.domain} <span className="text-slate-400">{d.purpose}</span>
{d.domain}
{d.purpose && <> <span className="text-slate-400">{d.purpose}</span></>}
</p>
))}
</div>
)}
<p className="text-sm text-slate-500 mt-2">
CTA: <span className="font-medium text-[#0A1128]">{website.mainCTA}</span>
CTA: <span className="font-medium text-[#0A1128]">{website.mainCta}</span>
</p>
</div>

View File

@ -206,7 +206,7 @@ function buildReportCsv(report: MarketingReport): string {
title: 'Website Audit',
rows: [
['Primary Domain', 'Main CTA', 'SNS Links On Site'],
[w.primaryDomain, w.mainCTA, w.snsLinksOnSite ? 'Y' : 'N'],
[w.primaryDomain, w.mainCta, w.snsLinksOnSite ? 'Y' : 'N'],
],
});
if (w.trackingPixels?.length) {

View File

@ -33,7 +33,7 @@ interface ApiReport {
trackingPixels?: { name: string; installed: boolean }[];
snsLinksOnSite?: boolean;
additionalDomains?: { domain: string; purpose: string }[];
mainCTA?: string;
mainCta?: string;
}>;
competitors?: {
name: string;
@ -663,7 +663,7 @@ export function transformApiReport(
name: (p as { name?: string }).name || '',
installed: (p as { installed?: boolean }).installed ?? false,
})),
mainCTA: r.channelAnalysis?.website?.mainCTA || '',
mainCta: r.channelAnalysis?.website?.mainCta || '',
},
problemDiagnosis: buildDiagnosis(r),

View File

@ -174,7 +174,7 @@ export interface WebsiteAudit {
snsLinksOnSite: boolean;
snsLinksDetail?: { platform: string; url: string; location: string }[];
trackingPixels: TrackingPixel[];
mainCTA: string;
mainCta: string;
}
export interface AsIsToBeItem {

View File

@ -10,7 +10,7 @@ export interface ChannelScore {
channel: string;
icon: string;
score: number;
maxScore: number;
maxScore?: number;
status: Severity;
headline: string;
}

View File

@ -4,42 +4,27 @@
* FastAPI
* OpenAPI spec version: 0.1.0
*/
import type { FacebookPageUrl } from './facebookPageUrl';
import type { FacebookPagePageName } from './facebookPagePageName';
import type { FacebookPageLanguage } from './facebookPageLanguage';
import type { FacebookPageLabel } from './facebookPageLabel';
import type { FacebookPageFollowers } from './facebookPageFollowers';
import type { FacebookPageFollowing } from './facebookPageFollowing';
import type { FacebookPageCategory } from './facebookPageCategory';
import type { FacebookPageBio } from './facebookPageBio';
import type { FacebookPageLogo } from './facebookPageLogo';
import type { FacebookPageLogoDescription } from './facebookPageLogoDescription';
import type { FacebookPageLink } from './facebookPageLink';
import type { FacebookPageLinkedDomain } from './facebookPageLinkedDomain';
import type { FacebookPageReviews } from './facebookPageReviews';
import type { FacebookPageRecentPostAge } from './facebookPageRecentPostAge';
import type { Language } from './language';
import type { FacebookPageHasWhatsapp } from './facebookPageHasWhatsapp';
import type { FacebookPagePostFrequency } from './facebookPagePostFrequency';
import type { FacebookPageTopContentType } from './facebookPageTopContentType';
import type { FacebookPageEngagement } from './facebookPageEngagement';
export interface FacebookPage {
url?: FacebookPageUrl;
pageName?: FacebookPagePageName;
language?: FacebookPageLanguage;
label?: FacebookPageLabel;
followers?: FacebookPageFollowers;
following?: FacebookPageFollowing;
category?: FacebookPageCategory;
bio?: FacebookPageBio;
logo?: FacebookPageLogo;
logoDescription?: FacebookPageLogoDescription;
link?: FacebookPageLink;
linkedDomain?: FacebookPageLinkedDomain;
reviews?: FacebookPageReviews;
recentPostAge?: FacebookPageRecentPostAge;
url: string;
pageName: string;
language: Language;
label: string;
followers: number;
following: number;
category: string;
bio: string;
logo: string;
logoDescription: string;
link: string;
linkedDomain: string;
reviews: number;
recentPostAge: string;
hasWhatsapp?: FacebookPageHasWhatsapp;
postFrequency?: FacebookPagePostFrequency;
postFrequency: string;
topContentType?: FacebookPageTopContentType;
engagement?: FacebookPageEngagement;
engagement: string;
}

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageBio = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageCategory = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageEngagement = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageFollowers = number | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageFollowing = number | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageLabel = string | null;

View File

@ -1,9 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
import type { Language } from './language';
export type FacebookPageLanguage = Language | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageLink = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageLinkedDomain = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageLogo = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageLogoDescription = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPagePageName = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPagePostFrequency = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageRecentPostAge = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageReviews = number | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type FacebookPageUrl = string | null;

View File

@ -89,24 +89,8 @@ export * from './estimatedRevenue';
export * from './facebookAudit';
export * from './facebookAuditConsolidationRecommendation';
export * from './facebookPage';
export * from './facebookPageBio';
export * from './facebookPageCategory';
export * from './facebookPageEngagement';
export * from './facebookPageFollowers';
export * from './facebookPageFollowing';
export * from './facebookPageHasWhatsapp';
export * from './facebookPageLabel';
export * from './facebookPageLanguage';
export * from './facebookPageLink';
export * from './facebookPageLinkedDomain';
export * from './facebookPageLogo';
export * from './facebookPageLogoDescription';
export * from './facebookPagePageName';
export * from './facebookPagePostFrequency';
export * from './facebookPageRecentPostAge';
export * from './facebookPageReviews';
export * from './facebookPageTopContentType';
export * from './facebookPageUrl';
export * from './fileListItem';
export * from './fileListItemSizeBytes';
export * from './fileType';
@ -115,18 +99,6 @@ export * from './fileUploadResponseSizeBytes';
export * from './fontSpec';
export * from './hTTPValidationError';
export * from './instagramAccount';
export * from './instagramAccountBio';
export * from './instagramAccountCategory';
export * from './instagramAccountContentFormat';
export * from './instagramAccountFollowers';
export * from './instagramAccountFollowing';
export * from './instagramAccountHandle';
export * from './instagramAccountLabel';
export * from './instagramAccountLanguage';
export * from './instagramAccountPosts';
export * from './instagramAccountProfileLink';
export * from './instagramAccountProfilePhoto';
export * from './instagramAccountReelsCount';
export * from './instagramAudit';
export * from './kPIMetric';
export * from './language';
@ -192,16 +164,5 @@ export * from './websiteAuditSnsLinksDetail';
export * from './weeklyViewGrowth';
export * from './workflowStep';
export * from './youTubeAudit';
export * from './youTubeAuditAvgVideoLength';
export * from './youTubeAuditChannelCreatedDate';
export * from './youTubeAuditChannelDescription';
export * from './youTubeAuditChannelName';
export * from './youTubeAuditEstimatedMonthlyRevenue';
export * from './youTubeAuditHandle';
export * from './youTubeAuditSubscribers';
export * from './youTubeAuditTotalVideos';
export * from './youTubeAuditTotalViews';
export * from './youTubeAuditUploadFrequency';
export * from './youTubeAuditWeeklyViewGrowth';
export * from './youTubeRepurposeItem';
export * from './youTubeRepurposeItemType';

View File

@ -4,31 +4,20 @@
* FastAPI
* OpenAPI spec version: 0.1.0
*/
import type { InstagramAccountHandle } from './instagramAccountHandle';
import type { InstagramAccountLanguage } from './instagramAccountLanguage';
import type { InstagramAccountLabel } from './instagramAccountLabel';
import type { InstagramAccountPosts } from './instagramAccountPosts';
import type { InstagramAccountFollowers } from './instagramAccountFollowers';
import type { InstagramAccountFollowing } from './instagramAccountFollowing';
import type { InstagramAccountCategory } from './instagramAccountCategory';
import type { InstagramAccountProfileLink } from './instagramAccountProfileLink';
import type { InstagramAccountReelsCount } from './instagramAccountReelsCount';
import type { InstagramAccountContentFormat } from './instagramAccountContentFormat';
import type { InstagramAccountProfilePhoto } from './instagramAccountProfilePhoto';
import type { InstagramAccountBio } from './instagramAccountBio';
import type { Language } from './language';
export interface InstagramAccount {
handle?: InstagramAccountHandle;
language?: InstagramAccountLanguage;
label?: InstagramAccountLabel;
posts?: InstagramAccountPosts;
followers?: InstagramAccountFollowers;
following?: InstagramAccountFollowing;
category?: InstagramAccountCategory;
profileLink?: InstagramAccountProfileLink;
highlights?: string[];
reelsCount?: InstagramAccountReelsCount;
contentFormat?: InstagramAccountContentFormat;
profilePhoto?: InstagramAccountProfilePhoto;
bio?: InstagramAccountBio;
handle: string;
language: Language;
label: string;
posts: number;
followers: number;
following: number;
category: string;
profileLink: string;
highlights: string[];
reelsCount: number;
contentFormat: string;
profilePhoto: string;
bio: string;
}

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type InstagramAccountBio = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type InstagramAccountCategory = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type InstagramAccountContentFormat = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type InstagramAccountFollowers = number | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type InstagramAccountFollowing = number | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type InstagramAccountHandle = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type InstagramAccountLabel = string | null;

View File

@ -1,9 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
import type { Language } from './language';
export type InstagramAccountLanguage = Language | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type InstagramAccountPosts = number | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type InstagramAccountProfileLink = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type InstagramAccountProfilePhoto = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type InstagramAccountReelsCount = number | null;

View File

@ -10,7 +10,7 @@ import type { TrackingPixel } from './trackingPixel';
export interface WebsiteAudit {
primaryDomain: string;
additionalDomains: AdditionalDomain[];
additionalDomains?: AdditionalDomain[];
snsLinksOnSite: boolean;
snsLinksDetail?: WebsiteAuditSnsLinksDetail;
trackingPixels: TrackingPixel[];

View File

@ -4,35 +4,26 @@
* FastAPI
* OpenAPI spec version: 0.1.0
*/
import type { YouTubeAuditChannelName } from './youTubeAuditChannelName';
import type { YouTubeAuditHandle } from './youTubeAuditHandle';
import type { YouTubeAuditSubscribers } from './youTubeAuditSubscribers';
import type { YouTubeAuditTotalVideos } from './youTubeAuditTotalVideos';
import type { YouTubeAuditTotalViews } from './youTubeAuditTotalViews';
import type { YouTubeAuditWeeklyViewGrowth } from './youTubeAuditWeeklyViewGrowth';
import type { YouTubeAuditEstimatedMonthlyRevenue } from './youTubeAuditEstimatedMonthlyRevenue';
import type { YouTubeAuditAvgVideoLength } from './youTubeAuditAvgVideoLength';
import type { YouTubeAuditUploadFrequency } from './youTubeAuditUploadFrequency';
import type { YouTubeAuditChannelCreatedDate } from './youTubeAuditChannelCreatedDate';
import type { YouTubeAuditChannelDescription } from './youTubeAuditChannelDescription';
import type { WeeklyViewGrowth } from './weeklyViewGrowth';
import type { EstimatedRevenue } from './estimatedRevenue';
import type { LinkedUrl } from './linkedUrl';
import type { TopVideo } from './topVideo';
import type { DiagnosisItem } from './diagnosisItem';
export interface YouTubeAudit {
channelName?: YouTubeAuditChannelName;
handle?: YouTubeAuditHandle;
subscribers?: YouTubeAuditSubscribers;
totalVideos?: YouTubeAuditTotalVideos;
totalViews?: YouTubeAuditTotalViews;
weeklyViewGrowth?: YouTubeAuditWeeklyViewGrowth;
estimatedMonthlyRevenue?: YouTubeAuditEstimatedMonthlyRevenue;
avgVideoLength?: YouTubeAuditAvgVideoLength;
uploadFrequency?: YouTubeAuditUploadFrequency;
channelCreatedDate?: YouTubeAuditChannelCreatedDate;
channelDescription?: YouTubeAuditChannelDescription;
linkedUrls?: LinkedUrl[];
playlists?: string[];
channelName: string;
handle: string;
subscribers: number;
totalVideos: number;
totalViews: number;
weeklyViewGrowth: WeeklyViewGrowth;
estimatedMonthlyRevenue: EstimatedRevenue;
avgVideoLength: string;
uploadFrequency: string;
channelCreatedDate: string;
channelDescription: string;
linkedUrls: LinkedUrl[];
playlists: string[];
topVideos?: TopVideo[];
diagnosis?: DiagnosisItem[];
diagnosis: DiagnosisItem[];
}

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type YouTubeAuditAvgVideoLength = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type YouTubeAuditChannelCreatedDate = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type YouTubeAuditChannelDescription = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type YouTubeAuditChannelName = string | null;

View File

@ -1,9 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
import type { EstimatedRevenue } from './estimatedRevenue';
export type YouTubeAuditEstimatedMonthlyRevenue = EstimatedRevenue | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type YouTubeAuditHandle = string | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type YouTubeAuditSubscribers = number | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type YouTubeAuditTotalVideos = number | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type YouTubeAuditTotalViews = number | null;

View File

@ -1,8 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
export type YouTubeAuditUploadFrequency = string | null;

View File

@ -1,9 +0,0 @@
/**
* Generated by orval v7.21.0 🍺
* Do not edit manually.
* FastAPI
* OpenAPI spec version: 0.1.0
*/
import type { WeeklyViewGrowth } from './weeklyViewGrowth';
export type YouTubeAuditWeeklyViewGrowth = WeeklyViewGrowth | null;