|
1 | 1 | /** |
2 | 2 | * 노션 이미지 URL을 깔끔한 형태로 변환하는 함수 |
3 | | - * |
| 3 | + * |
4 | 4 | * S3 URL 형식의 노션 이미지 URL을 notion.so/image/ 형식으로 변환합니다. |
5 | | - * |
| 5 | + * AWS 인증 토큰 등의 복잡한 파라미터를 제거하고 기본 이미지 URL만 사용합니다. |
| 6 | + * |
6 | 7 | * @param url - 변환할 S3 이미지 URL |
7 | 8 | * @param blockId - 블록 ID (선택적) |
8 | 9 | * @param userId - 사용자 ID (선택적) |
9 | 10 | * @returns 변환된 노션 스타일 이미지 URL |
10 | | - * |
| 11 | + * |
11 | 12 | * @example |
12 | 13 | * const formattedUrl = formatNotionImageUrl('https://prod-files-secure.s3.us-west-2.amazonaws.com/...'); |
13 | 14 | * // 결과: https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F... |
14 | 15 | */ |
15 | 16 | export const formatNotionImageUrl = ( |
16 | | - url: string, |
| 17 | + url: string | undefined, |
17 | 18 | blockId?: string, |
18 | | - userId?: string |
| 19 | + userId?: string | undefined |
19 | 20 | ): string => { |
20 | | - // URL이 없거나 유효하지 않은 경우 원래 URL 반환 |
21 | | - if (!url || !url.startsWith('https://')) { |
22 | | - return url; |
| 21 | + // URL이 없거나 유효하지 않은 경우 빈 문자열 또는 원래 URL 반환 |
| 22 | + if (!url || typeof url !== 'string' || !url.startsWith('https://')) { |
| 23 | + return url ?? ''; |
23 | 24 | } |
24 | 25 |
|
25 | 26 | try { |
26 | 27 | // 이미 notion.so 형식인 경우 그대로 반환 |
27 | 28 | if (url.includes('notion.so/image/')) { |
28 | | - return url; |
| 29 | + return url; // 이미 노션 이미지 URL 형식인 경우 그대로 반환 |
29 | 30 | } |
30 | 31 |
|
31 | | - // URL 인코딩 |
32 | | - const encodedUrl = encodeURIComponent(url); |
33 | | - |
| 32 | + // S3 URL에서 AWS 인증 파라미터 제거 (? 이후 부분 제거) |
| 33 | + // 안전하게 URL 처리 - 항상 문자열 반환 보장 |
| 34 | + // 이 시점에서 url은 string 타입이 보장됨 |
| 35 | + const baseUrl = url.includes('?') ? url.split('?')[0] : url; |
| 36 | + |
| 37 | + // URL 인코딩 (문자열만 인코딩 가능) |
| 38 | + // 타입 단언을 사용하여 TypeScript에게 baseUrl이 문자열임을 알림 |
| 39 | + const encodedUrl = encodeURIComponent(baseUrl as string); |
| 40 | + |
34 | 41 | // 기본 노션 이미지 URL 형식 |
35 | 42 | let formattedUrl = `https://www.notion.so/image/${encodedUrl}`; |
36 | | - |
| 43 | + |
37 | 44 | // 추가 파라미터 설정 |
38 | 45 | const params: string[] = []; |
39 | | - |
| 46 | + |
40 | 47 | // 블록 ID가 있는 경우 추가 |
41 | 48 | if (blockId) { |
42 | 49 | params.push(`table=block&id=${blockId}`); |
43 | 50 | } |
44 | | - |
45 | | - // 사용자 ID가 있는 경우 추가 |
46 | | - if (userId) { |
47 | | - params.push(`userId=${userId}`); |
48 | | - } |
49 | | - |
| 51 | + |
50 | 52 | // 추가 파라미터가 있는 경우 URL에 추가 |
51 | 53 | if (params.length > 0) { |
52 | 54 | formattedUrl += `?${params.join('&')}`; |
53 | 55 | } |
54 | | - |
| 56 | + |
55 | 57 | // 캐시 버스팅 파라미터 추가 |
56 | 58 | formattedUrl += formattedUrl.includes('?') ? '&' : '?'; |
57 | 59 | formattedUrl += 'cache=v2'; |
58 | | - |
| 60 | + |
59 | 61 | return formattedUrl; |
60 | 62 | } catch (error) { |
61 | 63 | console.error('이미지 URL 변환 중 오류 발생:', error); |
62 | | - return url; // 오류 발생 시 원래 URL 반환 |
| 64 | + return url ?? ''; // 오류 발생 시 원래 URL 반환 |
63 | 65 | } |
64 | 66 | }; |
65 | 67 |
|
66 | 68 | /** |
67 | 69 | * 노션 블록에서 이미지 URL을 추출하고 포맷팅하는 함수 |
68 | | - * |
| 70 | + * |
69 | 71 | * @param block - 노션 블록 객체 |
70 | 72 | * @returns 포맷팅된 이미지 URL 또는 null |
71 | 73 | */ |
72 | 74 | export const getFormattedImageUrlFromBlock = (block: any): string | null => { |
73 | 75 | if (!block) return null; |
74 | | - |
| 76 | + |
75 | 77 | try { |
76 | 78 | // 이미지 블록인 경우 |
77 | 79 | if (block.type === 'image') { |
78 | 80 | const imageData = block.image; |
79 | | - const url = imageData.file?.url || imageData.external?.url; |
80 | | - |
| 81 | + const url = imageData?.file?.url || imageData?.external?.url; |
| 82 | + |
| 83 | + // URL이 존재하는 경우 처리 |
81 | 84 | if (url) { |
82 | | - return formatNotionImageUrl(url, block.id, block.last_edited_by?.id); |
| 85 | + // expiry_time 필드가 있는 경우에도 무시하고 URL만 사용 |
| 86 | + // URL에서 기본 이미지 경로만 추출하여 사용 |
| 87 | + const blockId = block.id; |
| 88 | + const userId = block.last_edited_by?.id; |
| 89 | + return formatNotionImageUrl(url, blockId, userId); |
83 | 90 | } |
84 | 91 | } |
85 | | - |
| 92 | + |
86 | 93 | return null; |
87 | 94 | } catch (error) { |
88 | 95 | console.error('블록에서 이미지 URL 추출 중 오류 발생:', error); |
|
0 commit comments