Files
konstitisyon.nu/lib/directus.js
T

373 lines
8.0 KiB
JavaScript
Raw Normal View History

2024-07-28 17:35:44 +02:00
/* eslint-disable camelcase */
2024-06-21 12:39:37 +04:00
import {
2024-07-02 15:00:02 +02:00
createDirectus, rest, authentication, withToken, createItem,
readUser, createContentVersion, readContentVersions, saveToContentVersion,
readContentVersion, readItems, updateItem, deleteItem,
compareContentVersion
2024-06-21 12:39:37 +04:00
} from '@directus/sdk'
2024-07-02 15:00:02 +02:00
import {signOut} from 'next-auth/react'
2024-06-21 12:39:37 +04:00
import {hasRestrictedChar} from './format.js'
2024-05-20 04:09:40 +04:00
const apiUrl = process.env.DIRECTUS_API_URL || process.env.NEXT_PUBLIC_DIRECTUS_API_URL
export const directusClient = createDirectus(apiUrl)
.with(authentication('cookie', {credentials: 'include', autoRefresh: true}))
.with(rest())
2024-07-02 15:00:02 +02:00
export async function handleUserStatus(accessToken, userId) {
const {status} = await directusClient.request(
withToken(
accessToken,
readUser(userId, {
fields: 'status'
})
)
)
if (status !== 'active') {
signOut()
throw new Error('Déconnexion')
}
}
2024-06-21 12:39:37 +04:00
export async function handleSubmit({
2024-07-02 15:00:02 +02:00
userId,
2024-06-21 12:39:37 +04:00
accessToken,
content,
collection,
requestObject,
setError,
setSuccess,
setIsErrorAlertOpen,
setIsSuccessAlertOpen,
countdownRef,
}) {
try {
if (hasRestrictedChar(content)) {
setError('Le texte ne doit pas contenir certains caractères spéciaux : <, >, ", .')
setIsErrorAlertOpen(true)
return
}
2024-07-02 15:00:02 +02:00
await handleUserStatus(accessToken, userId)
2024-06-21 12:39:37 +04:00
await directusClient.request(
withToken(
accessToken,
createItem(collection, requestObject)
)
)
setSuccess('Envoyé avec succès. En attente de validation.')
setIsSuccessAlertOpen(true)
} catch (error) {
if (error?.errors[0]?.message === 'Token expired.') {
countdownRef.current.startCountdown()
2024-09-15 18:01:38 +04:00
} else {
console.log(error?.errors[0]?.message)
setError(error?.errors[0]?.message)
setIsErrorAlertOpen(true)
}
}
}
export async function getVersion({
accessToken,
userId,
versionId
}) {
await handleUserStatus(accessToken, userId)
const version = await directusClient.request(
withToken(
accessToken,
readContentVersion(versionId)
)
)
return version
}
export async function compareVersion({
accessToken,
userId,
versionId,
countdownRef,
setError,
setIsErrorAlertOpen
}) {
try {
await handleUserStatus(accessToken, userId)
const result = await directusClient.request(
withToken(
accessToken,
compareContentVersion(versionId)
)
)
return result
} catch (error) {
console.log('error', error)
if (error?.errors[0]?.message === 'Token expired.') {
countdownRef.current.startCountdown()
} else {
console.log(error?.errors[0]?.message)
setError(error?.errors[0]?.message)
setIsErrorAlertOpen(true)
}
}
}
2024-09-15 18:01:38 +04:00
export async function listVersions({
accessToken,
userId,
countdownRef,
setError,
setIsErrorAlertOpen
}) {
try {
await handleUserStatus(accessToken, userId)
const versions = await directusClient.request(
withToken(
accessToken,
readContentVersions({
sort: '-date_created'
})
)
)
return versions
} catch (error) {
console.log('error', error)
if (error?.errors[0]?.message === 'Token expired.') {
countdownRef.current.startCountdown()
2024-06-21 12:39:37 +04:00
} else {
console.log(error?.errors[0]?.message)
setError(error?.errors[0]?.message)
setIsErrorAlertOpen(true)
}
}
}
2024-07-28 17:35:44 +02:00
export async function createVersion({
accessToken,
userId,
collection,
id,
content,
countdownRef,
setSuccess,
setError,
setIsErrorAlertOpen,
setIsSuccessAlertOpen
}) {
try {
if (hasRestrictedChar(content)) {
throw new Error('Le texte ne doit pas contenir certains caractères spéciaux : <, >, ", .')
}
await handleUserStatus(accessToken, userId)
const versions = await directusClient.request(
withToken(
accessToken,
2024-09-01 14:43:19 +04:00
readContentVersions({
filter: {
collection: {
2024-09-01 18:25:21 +04:00
_eq: collection
2024-09-01 14:43:19 +04:00
}
}
})
2024-07-28 17:35:44 +02:00
)
)
const versionsCount = versions.length + 1
const date = Date.now()
const name = `v${versionsCount}-${date}`
const key = `${id}-${date}`
await directusClient.request(
withToken(
accessToken,
createContentVersion({
key,
name,
item: id,
collection,
})
)
)
2024-09-01 14:43:19 +04:00
const contentVersion = await directusClient.request(
withToken(
accessToken,
readContentVersions({
filter: {
user_created: {
2024-09-01 18:25:21 +04:00
_eq: userId
2024-09-01 14:43:19 +04:00
},
key: {
2024-09-01 18:25:21 +04:00
_eq: key
2024-09-01 14:43:19 +04:00
}
}
})
)
)
await directusClient.request(
withToken(
accessToken,
saveToContentVersion(
contentVersion[0].id,
{contenu: content}
)
)
)
2024-07-28 17:35:44 +02:00
setSuccess(`Version créée avec succès : ${name}`)
setIsSuccessAlertOpen(true)
} catch (error) {
if (error?.errors[0]?.message === 'Token expired.') {
countdownRef.current.startCountdown()
} else {
console.log(error?.errors[0]?.message)
setError(error?.errors[0]?.message)
setIsErrorAlertOpen(true)
}
}
}
export async function handleVote({
accessToken,
userId,
versionId,
voteValue
}) {
try {
await handleUserStatus(accessToken, userId)
const version = await directusClient.request(
withToken(
accessToken,
readContentVersion(versionId)
)
)
if (!version) {
throw new Error('Version non trouvée')
}
const versionDate = new Date(version.date_created)
const currentDate = new Date()
const diffTime = currentDate - versionDate
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24))
if (diffDays > 3) {
throw new Error('Le vote nest plus possible après 3 jours de la création de la version')
}
const existingVotes = await directusClient.request(
withToken(
accessToken,
readItems('votes', {
filter: {
_and: [
{content_version_id: {_eq: versionId}},
{user_created: {_eq: userId}}
]
}
})
)
)
if (existingVotes && existingVotes.length > 0) {
const existingVote = existingVotes[0]
if (existingVote.vote === voteValue) {
await directusClient.request(
withToken(
accessToken,
deleteItem('votes', existingVote.id)
)
)
return null
}
const vote = {
content_version_id: versionId,
vote: voteValue
}
await directusClient.request(
withToken(
accessToken,
updateItem('votes', existingVote.id, vote)
)
)
return voteValue
}
const vote = {
content_version_id: versionId,
vote: voteValue
}
await directusClient.request(
withToken(
accessToken,
createItem('votes', vote)
)
)
return voteValue
} catch (error) {
console.error('Error voting:', error)
// Extract error message from Directus error object
let errorMessage = 'Une erreur est survenue lors du vote'
if (error?.errors?.[0]?.message) {
errorMessage = error.errors[0].message
} else if (error?.message) {
errorMessage = error.message
} else if (typeof error === 'string') {
errorMessage = error
}
throw new Error(errorMessage)
}
}
export async function getUserVote({
accessToken,
userId,
versionId
}) {
try {
await handleUserStatus(accessToken, userId)
const existingVotes = await directusClient.request(
withToken(
accessToken,
readItems('votes', {
filter: {
_and: [
{content_version_id: {_eq: versionId}},
{user_created: {_eq: userId}}
]
}
})
)
)
return existingVotes && existingVotes.length > 0 ? existingVotes[0].vote : null
} catch (error) {
console.error('Error fetching vote:', error)
throw error
}
}