|
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