50 lines
1.3 KiB
JavaScript
50 lines
1.3 KiB
JavaScript
import { directus } from './directus.js'
|
|
|
|
const CODE_VALIDITY_MS = 10 * 60 * 1000
|
|
|
|
class VerificationService {
|
|
|
|
generateCode() {
|
|
const array = new Uint32Array(1)
|
|
crypto.getRandomValues(array)
|
|
const code = String(array[0] % 1000000).padStart(6, '0')
|
|
const generatedAt = new Date()
|
|
const expiresAt = new Date(generatedAt.getTime() + CODE_VALIDITY_MS)
|
|
return { code, generatedAt, expiresAt }
|
|
}
|
|
|
|
isCodeValid(generatedAt) {
|
|
return Date.now() - new Date(generatedAt).getTime() < CODE_VALIDITY_MS
|
|
}
|
|
|
|
getRemainingTime(generatedAt) {
|
|
const elapsed = Date.now() - new Date(generatedAt).getTime()
|
|
const remaining = Math.max(0, CODE_VALIDITY_MS - elapsed)
|
|
return Math.ceil(remaining / 1000)
|
|
}
|
|
|
|
async verify(listingId, code, imageFile) {
|
|
try {
|
|
const uploaded = await directus.uploadFile(imageFile)
|
|
|
|
await directus.patch('/items/listings/' + listingId, {
|
|
verification_code: code,
|
|
verification_image: uploaded.id,
|
|
verification_date: new Date().toISOString(),
|
|
verified: true
|
|
})
|
|
|
|
return true
|
|
} catch (e) {
|
|
console.error('Verification failed:', e)
|
|
return false
|
|
}
|
|
}
|
|
|
|
isVerified(listing) {
|
|
return listing.verified === true
|
|
}
|
|
}
|
|
|
|
export const verificationService = new VerificationService()
|