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,
|
2024-11-28 07:53:12 +04:00
|
|
|
|
readUser, createContentVersion, readContentVersions, saveToContentVersion,
|
2024-12-16 09:14:02 +04:00
|
|
|
|
readContentVersion, readItems, updateItem, deleteItem,
|
2024-11-28 07:53:12 +04:00
|
|
|
|
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)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-28 07:53:12 +04:00
|
|
|
|
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)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-12-16 09:14:02 +04:00
|
|
|
|
|
|
|
|
|
|
export async function handleVote({
|
|
|
|
|
|
accessToken,
|
|
|
|
|
|
userId,
|
|
|
|
|
|
versionId,
|
|
|
|
|
|
voteValue
|
|
|
|
|
|
}) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
await handleUserStatus(accessToken, userId)
|
|
|
|
|
|
|
2024-12-17 12:37:50 +04:00
|
|
|
|
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 n’est plus possible après 3 jours de la création de la version')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-16 09:14:02 +04:00
|
|
|
|
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)
|
2025-07-24 07:51:05 +04:00
|
|
|
|
|
|
|
|
|
|
// 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)
|
2024-12-16 09:14:02 +04:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|