CatPtain commited on
Commit
d5c2fad
·
verified ·
1 Parent(s): a174e32

Upload public.js

Browse files
Files changed (1) hide show
  1. backend/src/routes/public.js +62 -33
backend/src/routes/public.js CHANGED
@@ -778,94 +778,123 @@ router.post('/generate-share-link', async (req, res, next) => {
778
  // 截图功能 - 返回JPEG图片
779
  router.get('/screenshot/:userId/:pptId/:slideIndex?', async (req, res, next) => {
780
  try {
781
- console.log('Screenshot request received:', req.params);
782
 
783
  const { userId, pptId, slideIndex = 0 } = req.params;
784
  const slideIdx = parseInt(slideIndex);
785
  const fileName = `${pptId}.json`;
786
  const storageService = getStorageService();
787
 
788
- console.log(`Generating screenshot for: ${userId}/${pptId}/${slideIdx}`);
789
 
790
  let pptData = null;
791
 
792
  // 获取PPT数据(复用现有逻辑)
793
  if (storageService === githubService && storageService.repositories) {
794
- console.log('Checking GitHub repositories...');
795
  for (let i = 0; i < storageService.repositories.length; i++) {
796
  try {
797
  const result = await storageService.getFile(userId, fileName, i);
798
  if (result) {
799
  pptData = result.content;
800
- console.log(`PPT data found in repository ${i}`);
801
  break;
802
  }
803
  } catch (error) {
 
804
  continue;
805
  }
806
  }
807
  } else {
808
- console.log('Checking memory storage...');
809
- const result = await storageService.getFile(userId, fileName);
810
- if (result) {
811
- pptData = result.content;
812
- console.log('PPT data found in memory storage');
 
 
 
 
813
  }
814
  }
815
 
816
  // 如果GitHub失败,尝试内存存储fallback
817
  if (!pptData && storageService === githubService) {
818
- console.log('Trying memory storage fallback...');
819
  try {
820
  const memoryResult = await memoryStorageService.getFile(userId, fileName);
821
  if (memoryResult) {
822
  pptData = memoryResult.content;
823
- console.log('PPT data found in memory storage fallback');
824
  }
825
  } catch (memoryError) {
826
- console.log('Memory storage fallback failed:', memoryError.message);
827
  }
828
  }
829
 
830
  if (!pptData) {
831
- console.log('PPT not found');
832
- return res.status(404).json({ error: 'PPT not found' });
 
 
 
 
 
833
  }
834
 
835
  if (slideIdx >= pptData.slides.length || slideIdx < 0) {
836
- console.log('Slide index out of bounds');
837
- return res.status(404).json({ error: 'Slide not found' });
 
 
 
 
 
838
  }
839
 
840
- console.log('Generating HTML content...');
841
  // 生成HTML内容(复用现有函数)
842
  const htmlContent = generateSlideHTML(pptData, slideIdx, pptData.title);
843
 
844
- console.log('Calling screenshot service...');
845
  // 生成截图
846
- const screenshot = await screenshotService.generateScreenshot(htmlContent);
 
 
 
 
 
847
 
848
- console.log('Screenshot generated, sending response...');
 
 
 
 
 
 
 
 
 
 
 
 
 
849
 
850
- // 返回图片
851
- res.setHeader('Content-Type', 'image/jpeg');
852
- res.setHeader('Cache-Control', 'public, max-age=60'); // 1分钟缓存,减少服务器压力
853
- res.setHeader('Content-Disposition', `inline; filename="${pptData.title}-${slideIdx + 1}.jpg"`);
854
  res.send(screenshot);
 
855
  } catch (error) {
856
- console.error('Screenshot route error:', error);
857
  console.error('Stack trace:', error.stack);
858
 
859
- // 返回一个简单的错误响应而不是抛出异常
860
  try {
861
- res.status(500).setHeader('Content-Type', 'application/json');
862
- res.json({
863
- error: 'Screenshot generation failed',
864
- message: error.message,
865
- details: process.env.NODE_ENV === 'development' ? error.stack : undefined
866
- });
867
  } catch (responseError) {
868
- console.error('Error sending error response:', responseError);
869
  // 如果连错误响应都发送失败,调用next
870
  next(error);
871
  }
 
778
  // 截图功能 - 返回JPEG图片
779
  router.get('/screenshot/:userId/:pptId/:slideIndex?', async (req, res, next) => {
780
  try {
781
+ console.log('📸 Screenshot request received:', req.params);
782
 
783
  const { userId, pptId, slideIndex = 0 } = req.params;
784
  const slideIdx = parseInt(slideIndex);
785
  const fileName = `${pptId}.json`;
786
  const storageService = getStorageService();
787
 
788
+ console.log(`🎯 Generating screenshot for: ${userId}/${pptId}/${slideIdx}`);
789
 
790
  let pptData = null;
791
 
792
  // 获取PPT数据(复用现有逻辑)
793
  if (storageService === githubService && storageService.repositories) {
794
+ console.log('📂 Checking GitHub repositories...');
795
  for (let i = 0; i < storageService.repositories.length; i++) {
796
  try {
797
  const result = await storageService.getFile(userId, fileName, i);
798
  if (result) {
799
  pptData = result.content;
800
+ console.log(`✅ PPT data found in repository ${i}`);
801
  break;
802
  }
803
  } catch (error) {
804
+ console.log(`❌ Repository ${i} check failed:`, error.message);
805
  continue;
806
  }
807
  }
808
  } else {
809
+ console.log('📂 Checking memory storage...');
810
+ try {
811
+ const result = await storageService.getFile(userId, fileName);
812
+ if (result) {
813
+ pptData = result.content;
814
+ console.log('✅ PPT data found in memory storage');
815
+ }
816
+ } catch (error) {
817
+ console.log('❌ Memory storage check failed:', error.message);
818
  }
819
  }
820
 
821
  // 如果GitHub失败,尝试内存存储fallback
822
  if (!pptData && storageService === githubService) {
823
+ console.log('🔄 Trying memory storage fallback...');
824
  try {
825
  const memoryResult = await memoryStorageService.getFile(userId, fileName);
826
  if (memoryResult) {
827
  pptData = memoryResult.content;
828
+ console.log('PPT data found in memory storage fallback');
829
  }
830
  } catch (memoryError) {
831
+ console.log('Memory storage fallback failed:', memoryError.message);
832
  }
833
  }
834
 
835
  if (!pptData) {
836
+ console.log('PPT not found anywhere');
837
+
838
+ // 生成"PPT未找到"的错误图片
839
+ const errorImage = screenshotService.generateFallbackImage(960, 720, 'PPT未找到');
840
+ res.setHeader('Content-Type', 'image/svg+xml');
841
+ res.setHeader('Cache-Control', 'no-cache');
842
+ return res.send(errorImage);
843
  }
844
 
845
  if (slideIdx >= pptData.slides.length || slideIdx < 0) {
846
+ console.log(`❌ Slide index out of bounds: ${slideIdx}/${pptData.slides.length}`);
847
+
848
+ // 生成"幻灯片不存在"的错误图片
849
+ const errorImage = screenshotService.generateFallbackImage(960, 720, '幻灯片不存在');
850
+ res.setHeader('Content-Type', 'image/svg+xml');
851
+ res.setHeader('Cache-Control', 'no-cache');
852
+ return res.send(errorImage);
853
  }
854
 
855
+ console.log('📝 Generating HTML content...');
856
  // 生成HTML内容(复用现有函数)
857
  const htmlContent = generateSlideHTML(pptData, slideIdx, pptData.title);
858
 
859
+ console.log('🎯 Calling screenshot service...');
860
  // 生成截图
861
+ const screenshot = await screenshotService.generateScreenshot(htmlContent, {
862
+ format: 'jpeg',
863
+ quality: 90
864
+ });
865
+
866
+ console.log(`✅ Screenshot generated successfully, size: ${screenshot.length} bytes`);
867
 
868
+ // 检查是否是SVG fallback(通过内容检测)
869
+ const isSvgFallback = screenshot.toString().includes('<svg');
870
+
871
+ if (isSvgFallback) {
872
+ console.log('📋 Returning SVG fallback image');
873
+ res.setHeader('Content-Type', 'image/svg+xml');
874
+ res.setHeader('Cache-Control', 'no-cache');
875
+ res.setHeader('Content-Disposition', `inline; filename="${pptData.title}-${slideIdx + 1}-fallback.svg"`);
876
+ } else {
877
+ console.log('📸 Returning JPEG screenshot');
878
+ res.setHeader('Content-Type', 'image/jpeg');
879
+ res.setHeader('Cache-Control', 'public, max-age=300'); // 5分钟缓存
880
+ res.setHeader('Content-Disposition', `inline; filename="${pptData.title}-${slideIdx + 1}.jpg"`);
881
+ }
882
 
 
 
 
 
883
  res.send(screenshot);
884
+
885
  } catch (error) {
886
+ console.error('Screenshot route error:', error);
887
  console.error('Stack trace:', error.stack);
888
 
 
889
  try {
890
+ // 生成错误截图
891
+ const errorImage = screenshotService.generateFallbackImage(960, 720, '截图生成失败');
892
+ res.setHeader('Content-Type', 'image/svg+xml');
893
+ res.setHeader('Cache-Control', 'no-cache');
894
+ res.setHeader('Content-Disposition', 'inline; filename="error.svg"');
895
+ res.send(errorImage);
896
  } catch (responseError) {
897
+ console.error('Error sending error response:', responseError);
898
  // 如果连错误响应都发送失败,调用next
899
  next(error);
900
  }