basic url check api

This commit is contained in:
2023-08-27 21:14:28 +02:00
parent 33c381be18
commit 9900c44195
3 changed files with 107 additions and 1 deletions

1
.gitignore vendored
View File

@@ -18,6 +18,7 @@
# misc # misc
.DS_Store .DS_Store
*.pem *.pem
blueprint
# debug # debug
npm-debug.log* npm-debug.log*

View File

@@ -11,7 +11,8 @@
"dependencies": { "dependencies": {
"next": "13.2.4", "next": "13.2.4",
"react": "17.0.2", "react": "17.0.2",
"react-dom": "17.0.2" "react-dom": "17.0.2",
"sqlite3": "^5.1.4"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "18.15.5", "@types/node": "18.15.5",

104
pages/api/sources/check.ts Normal file
View File

@@ -0,0 +1,104 @@
import type { NextApiRequest, NextApiResponse } from 'next'
import sqlite3 from 'sqlite3'
import path from 'path'
type CheckResponse = {
is_problematic: boolean
risk_level: number
categories: string[]
message: string
source_count: number
}
function extractDomain(url: string): string {
try {
const urlObj = new URL(url)
return urlObj.hostname.replace('www.', '')
} catch {
return ''
}
}
export default async function handler(
req: NextApiRequest,
res: NextApiResponse<CheckResponse | { error: string }>
) {
if (req.method !== 'GET') {
return res.status(405).json({ error: 'Method not allowed' })
}
const { url } = req.query
if (!url || typeof url !== 'string') {
return res.status(400).json({ error: 'URL parameter is required' })
}
const domain = extractDomain(url)
if (!domain) {
return res.status(400).json({ error: 'Invalid URL format' })
}
const dbPath = path.join(process.cwd(), 'database', 'antihoax.db')
const db = new sqlite3.Database(dbPath)
try {
const sources = await new Promise<any[]>((resolve, reject) => {
db.all(
`SELECT s.*, GROUP_CONCAT(c.name) as categories
FROM sources s
LEFT JOIN source_categories sc ON s.id = sc.source_id
LEFT JOIN categories c ON sc.category_id = c.id
WHERE s.domain = ? AND s.status = 'verified'
GROUP BY s.id`,
[domain],
(err, rows) => {
if (err) reject(err)
else resolve(rows)
}
)
})
if (sources.length === 0) {
return res.status(200).json({
is_problematic: false,
risk_level: 0,
categories: [],
message: 'Stránka nie je v našej databáze problematických zdrojov',
source_count: 0
})
}
const maxRiskLevel = Math.max(...sources.map(s => s.risk_level))
const allCategories = sources
.map(s => s.categories)
.filter(Boolean)
.join(',')
.split(',')
.filter(Boolean)
const uniqueCategories = [...new Set(allCategories)]
let message = ''
if (maxRiskLevel >= 4) {
message = 'VYSOKÉ RIZIKO: Táto stránka šíri nebezpečné obsahy'
} else if (maxRiskLevel >= 3) {
message = 'STREDNÉ RIZIKO: Táto stránka môže obsahovať problematické informácie'
} else {
message = 'NÍZKE RIZIKO: Táto stránka je označená ako problematická'
}
return res.status(200).json({
is_problematic: true,
risk_level: maxRiskLevel,
categories: uniqueCategories,
message,
source_count: sources.length
})
} catch (error) {
console.error('Database error:', error)
return res.status(500).json({ error: 'Internal server error' })
} finally {
db.close()
}
}