|
1 |
| -// import puppeteerNormal from 'puppeteer'; |
2 |
| -// import puppeteer from 'puppeteer-extra'; |
3 |
| -// import RecaptchaPlugin from 'puppeteer-extra-plugin-recaptcha'; |
4 |
| -// import fs from 'fs'; |
5 |
| -// import path from 'path'; |
6 |
| -// import pdf from 'pdf-parse'; |
7 |
| -import axios from 'axios'; |
8 |
| -// import { getExecutablePath } from 'puppeteerNormal'; |
9 |
| - |
| 1 | +import fs from 'fs'; |
| 2 | +import path from 'path'; |
| 3 | +import pdf from 'pdf-parse'; |
10 | 4 | import { prisma } from "../../../prisma/client";
|
11 | 5 | import { SendNotasDTO } from "../../interfaces/alunoDTOs";
|
12 | 6 | import { AppError } from "../../../errors/error";
|
13 | 7 | import { clearUploads } from '../shared/helpers/helpers';
|
14 |
| - |
15 |
| -// Configure o plugin Recaptcha |
16 |
| -// puppeteer.use( |
17 |
| -// RecaptchaPlugin({ |
18 |
| -// provider: { |
19 |
| -// id: '2captcha', |
20 |
| -// token: process.env.CAPTCHA2_ID || '', // Certifique-se de que o token está definido |
21 |
| -// }, |
22 |
| -// }) |
23 |
| -// ); |
| 8 | +import { uploadToMinio } from "../../../minioService"; |
24 | 9 |
|
25 | 10 | export class SendBoletimUseCase {
|
26 |
| - async execute({ alunoId, boletim }: SendNotasDTO) { |
27 |
| - if (!alunoId) { |
28 |
| - throw new AppError('ID do aluno não fornecido.'); |
| 11 | + async execute({ alunoId, boletim }: SendNotasDTO) { |
| 12 | + if (!alunoId) { |
| 13 | + throw new AppError('ID do aluno não fornecido.'); |
| 14 | + } |
| 15 | + |
| 16 | + if (!boletim || !boletim.path) { |
| 17 | + throw new AppError('Arquivo do boletim não fornecido.'); |
| 18 | + } |
| 19 | + |
| 20 | + const aluno = await prisma.aluno.findUnique({ |
| 21 | + where: { |
| 22 | + id: alunoId, |
| 23 | + }, |
| 24 | + }); |
| 25 | + |
| 26 | + if (!aluno) { |
| 27 | + throw new AppError('Aluno não encontrado.'); |
| 28 | + } |
| 29 | + |
| 30 | + const boletimPath = path.resolve(boletim.path); |
| 31 | + const boletimBuffer = fs.readFileSync(boletimPath); |
| 32 | + |
| 33 | + const link = await this.extractAuthUrlFromPdf(boletimBuffer); |
| 34 | + |
| 35 | + const bucketName = 'boot'; |
| 36 | + const objectName = `aluno/${aluno.rm}/boletins/${path.basename(boletim.path)}`; |
| 37 | + |
| 38 | + try { |
| 39 | + await uploadToMinio(bucketName, objectName, boletimPath); |
| 40 | + |
| 41 | + await prisma.boletim.create({ |
| 42 | + data: { |
| 43 | + alunoId: aluno.id, |
| 44 | + link: link, |
| 45 | + caminho: objectName, |
| 46 | + } |
| 47 | + }); |
| 48 | + |
| 49 | + await clearUploads(); |
| 50 | + |
| 51 | + return { message: 'Boletim enviado e salvo com sucesso!' }; |
| 52 | + } catch (error) { |
| 53 | + throw new AppError(`Erro ao salvar o boletim: ${error}`); |
| 54 | + } |
29 | 55 | }
|
30 | 56 |
|
31 |
| - if (!boletim || !boletim.path) { |
32 |
| - throw new AppError('Arquivo do boletim não fornecido.'); |
33 |
| - } |
| 57 | + async extractAuthUrlFromPdf(buffer: Buffer): Promise<string> { |
| 58 | + const data = await pdf(buffer); |
| 59 | + const text = data.text; |
34 | 60 |
|
35 |
| - const aluno = await prisma.aluno.findUnique({ |
36 |
| - where: { |
37 |
| - id: alunoId, |
38 |
| - }, |
39 |
| - }); |
| 61 | + const urlMatch = text.match(/https:\/\/nsa\.cps\.sp\.gov\.br\?a=[a-z0-9-]+/i); |
| 62 | + if (!urlMatch) { |
| 63 | + throw new AppError('URL de autenticação não encontrado no boletim.'); |
| 64 | + } |
40 | 65 |
|
41 |
| - if (!aluno) { |
42 |
| - throw new AppError('Aluno não encontrado.'); |
| 66 | + return urlMatch[0]; |
43 | 67 | }
|
44 |
| - |
45 |
| - // const boletimPath = path.resolve(boletim.path); |
46 |
| - |
47 |
| - // const boletimBuffer = fs.readFileSync(boletimPath); |
48 |
| - |
49 |
| - // const authUrl = await this.extractAuthUrlFromPdf(boletimBuffer); |
50 |
| - |
51 |
| - // const browser = await puppeteer.launch({ |
52 |
| - // headless: false, |
53 |
| - // }); |
54 |
| - |
55 |
| - |
56 |
| - // const page = await browser.newPage(); |
57 |
| - |
58 |
| - // await page.goto(authUrl); |
59 |
| - |
60 |
| - // setTimeout(async () => { |
61 |
| - // const { solved, error } = await page.solveRecaptchas(); |
62 |
| - // console.log("Here2"); |
63 |
| - |
64 |
| - // if (!solved) { |
65 |
| - // throw new AppError('Falha ao resolver CAPTCHA: ' + error); |
66 |
| - // } else { |
67 |
| - // console.log('Captcha resolvido com sucesso, url: ' + authUrl); |
68 |
| - // } |
69 |
| - |
70 |
| - // await page.waitForSelector('#btnValidar'); |
71 |
| - // await page.click('#btnValidar'); |
72 |
| - // }, 10000); |
73 |
| - |
74 |
| - // const downloadUrl = await page.evaluate(() => { |
75 |
| - // const linkElement = document.querySelector('a#downloadLink') as HTMLAnchorElement | null; |
76 |
| - // return linkElement ? linkElement.href : ''; |
77 |
| - // }); |
78 |
| - |
79 |
| - |
80 |
| - // const response = await axios.get(downloadUrl, { responseType: 'arraybuffer' }); |
81 |
| - // const downloadedFilePath = path.join(__dirname, 'downloads', 'downloaded_boletim.pdf'); |
82 |
| - // fs.writeFileSync(downloadedFilePath, response.data); |
83 |
| - |
84 |
| - // // Comparar os dois arquivos PDF |
85 |
| - // const downloadedBoletimBuffer = fs.readFileSync(downloadedFilePath); |
86 |
| - |
87 |
| - // if (!boletimBuffer.equals(downloadedBoletimBuffer)) { |
88 |
| - // throw new AppError("Os arquivos enviados não coincidem."); |
89 |
| - // } |
90 |
| - |
91 |
| - // Extrair notas do boletim |
92 |
| - // const notas = this.extractNotasFromBoletim(boletimBuffer); |
93 |
| - |
94 |
| - // Fechar o navegador |
95 |
| - // await browser.close(); |
96 |
| - |
97 |
| - await clearUploads(); |
98 |
| - |
99 |
| - } |
100 |
| - |
101 |
| -// async extractAuthUrlFromPdf(buffer: Buffer): Promise<string> { |
102 |
| -// const data = await pdf(buffer); |
103 |
| -// const text = data.text; |
104 |
| - |
105 |
| -// const urlMatch = text.match(/https:\/\/nsa\.cps\.sp\.gov\.br\?a=[a-z0-9-]+/i); |
106 |
| -// if (!urlMatch) { |
107 |
| -// throw new AppError('URL de autenticação não encontrado no boletim.'); |
108 |
| -// } |
109 |
| - |
110 |
| -// return urlMatch[0]; |
111 |
| -// } |
112 |
| - |
113 |
| - extractNotasFromBoletim(buffer: Buffer) { |
114 |
| - return [ |
115 |
| - // { materia: 'Matemática', nota: 'MB' }, |
116 |
| - // { materia: 'Português', nota: 'MB' }, |
117 |
| - ]; |
118 |
| - } |
119 | 68 | }
|
0 commit comments