mirror of
https://github.com/Floriansylvain/RenewCMS.git
synced 2026-08-19 19:53:21 +02:00
Refactor all API related functions
This commit is contained in:
@@ -24,35 +24,39 @@ export interface GetArticle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getArticles(id: string): Promise<GetArticle> {
|
export function fetchArticle(id: string): Promise<GetArticle> {
|
||||||
return await fetch(`${baseApiUrl}/articles/${id}`, {
|
return new Promise((resolve, reject) => {
|
||||||
|
fetch(`${baseApiUrl}/articles/${id}`, {
|
||||||
credentials: 'include',
|
credentials: 'include',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
})
|
})
|
||||||
.then(result => result.json())
|
.then(response => response.json())
|
||||||
|
.then(article => resolve(article))
|
||||||
|
.catch(error => reject(error))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function deleteArticle(id: string) {
|
export function deleteArticle(id: string): Promise<any> {
|
||||||
return await fetch(`${baseApiUrl}/articles/${id}`, {
|
return new Promise((resolve, reject) => {
|
||||||
|
fetch(`${baseApiUrl}/articles/${id}`, {
|
||||||
credentials: 'include',
|
credentials: 'include',
|
||||||
method: 'DELETE',
|
method: 'DELETE'
|
||||||
})
|
})
|
||||||
.then(result => result.json())
|
.then(result => result.json())
|
||||||
|
.then(article => resolve(article))
|
||||||
|
.catch(error => reject(error))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async function sendArticle(article: Article, method: 'POST' | 'PUT'): Promise<object> {
|
export function sendArticleWithMethod(article: Article, method: 'POST' | 'PUT'): Promise<any> {
|
||||||
return await fetch(`${baseApiUrl}/articles/${article.titleID}`, {
|
return new Promise((resolve, reject) => {
|
||||||
|
fetch(`${baseApiUrl}/articles/${article.titleID}`, {
|
||||||
credentials: 'include',
|
credentials: 'include',
|
||||||
method,
|
method,
|
||||||
body: JSON.stringify(article)
|
body: JSON.stringify(article)
|
||||||
})
|
})
|
||||||
.then(result => result.json())
|
.then(result => result.json())
|
||||||
}
|
.then(article => resolve(article))
|
||||||
|
.catch(error => reject(error))
|
||||||
export async function postArticle(article: Article): Promise<object> {
|
})
|
||||||
return await sendArticle(article, 'POST')
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function editArticle(article: Article): Promise<object> {
|
|
||||||
return await sendArticle(article, 'PUT')
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import Modal from '@/components/ModalSuccessError.vue';
|
import Modal from '@/components/ModalSuccessError.vue';
|
||||||
import { editArticle, getArticles, type Article } from '@/utils/database';
|
import { fetchArticle, sendArticleWithMethod, type Article, type GetArticle } from '@/utils/database';
|
||||||
import Editor from '@tinymce/tinymce-vue';
|
import Editor from '@tinymce/tinymce-vue';
|
||||||
import { onMounted, ref, type Ref } from 'vue';
|
import { onMounted, ref, type Ref } from 'vue';
|
||||||
import { useRoute, useRouter } from 'vue-router';
|
import { useRoute, useRouter } from 'vue-router';
|
||||||
@@ -8,41 +8,43 @@ import { useRoute, useRouter } from 'vue-router';
|
|||||||
const article: Ref<Article | void> = ref()
|
const article: Ref<Article | void> = ref()
|
||||||
const editorData: Ref<string> = ref('')
|
const editorData: Ref<string> = ref('')
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
const successModalShow = ref(false)
|
const successModalShow = ref(false)
|
||||||
const errorModalShow = ref(false)
|
const errorModalShow = ref(false)
|
||||||
const errorModalDescription: Ref<string> = ref("Quelque chose s'est mal passé...")
|
const errorModalDescription: Ref<string> = ref("Quelque chose s'est mal passé...")
|
||||||
|
|
||||||
onMounted(async () => {
|
function displayErrorMessage(message: string): void {
|
||||||
await getArticles(useRoute().params.articleID as string)
|
errorModalDescription.value = message
|
||||||
.then(articleFetch => {
|
|
||||||
article.value = articleFetch.content[0]
|
|
||||||
editorData.value = article.value.content.html
|
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
errorModalDescription.value = "Impossible de récupérer l'article. Vérifiez l'URL. Tentez-vous d'accéder au mode édition directement depuis un lien ?"
|
|
||||||
errorModalShow.value = true
|
errorModalShow.value = true
|
||||||
console.error(error)
|
}
|
||||||
})
|
|
||||||
|
async function getArticle(): Promise<GetArticle | undefined> {
|
||||||
|
try {
|
||||||
|
return await fetchArticle(route.params.articleID as string)
|
||||||
|
} catch {
|
||||||
|
displayErrorMessage("Impossible de récupérer l'article. Vérifiez l'URL. Tentez-vous d'accéder au mode édition directement depuis un lien ?")
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
article.value = (await getArticle())?.content[0]
|
||||||
|
editorData.value = article.value?.content.html ?? ""
|
||||||
})
|
})
|
||||||
|
|
||||||
function abort() {
|
function abort() {
|
||||||
router.push('/articles')
|
router.push('/articles')
|
||||||
}
|
}
|
||||||
|
|
||||||
async function saveContent() {
|
function saveContent() {
|
||||||
if (article.value == undefined) return;
|
if (article.value == undefined) return;
|
||||||
article.value.content.html = editorData.value
|
|
||||||
await editArticle(article.value)
|
|
||||||
.then(() => {
|
|
||||||
successModalShow.value = true
|
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
errorModalDescription.value = `Impossible de sauvegarder l'article. (${error.toString()})`
|
|
||||||
errorModalShow.value = true
|
|
||||||
console.error(error)
|
|
||||||
})
|
|
||||||
|
|
||||||
|
article.value.content.html = editorData.value
|
||||||
|
|
||||||
|
sendArticleWithMethod(article.value, 'PUT')
|
||||||
|
.then(() => successModalShow.value = true)
|
||||||
|
.catch(error => displayErrorMessage(`Impossible de sauvegarder l'article. (${error.toString()})`))
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { postArticle, type Article } from '@/utils/database';
|
import { sendArticleWithMethod, type Article } from '@/utils/database';
|
||||||
import { ref, type Ref } from 'vue';
|
import { ref, type Ref } from 'vue';
|
||||||
import { RouterLink, useRouter } from 'vue-router'
|
import { RouterLink, useRouter } from 'vue-router';
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ function isFormEmpty(): boolean {
|
|||||||
return title.value === '' || rawTags.value === ''
|
return title.value === '' || rawTags.value === ''
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createArticle() {
|
async function createArticle(): Promise<Article> {
|
||||||
const article: Article = {
|
const article: Article = {
|
||||||
titleID: generateTitleID(title.value),
|
titleID: generateTitleID(title.value),
|
||||||
title: title.value,
|
title: title.value,
|
||||||
@@ -40,7 +40,12 @@ async function createArticle() {
|
|||||||
online: false,
|
online: false,
|
||||||
tags: tags.value
|
tags: tags.value
|
||||||
}
|
}
|
||||||
await postArticle(article)
|
await sendArticleWithMethod(article, 'POST')
|
||||||
|
return article
|
||||||
|
}
|
||||||
|
|
||||||
|
async function formSubmitHandler(): Promise<void> {
|
||||||
|
const article = await createArticle()
|
||||||
router.push(`/articles/edit/${article.titleID}`)
|
router.push(`/articles/edit/${article.titleID}`)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -48,7 +53,7 @@ async function createArticle() {
|
|||||||
<template>
|
<template>
|
||||||
<main>
|
<main>
|
||||||
<h2>Créer un nouvel article</h2>
|
<h2>Créer un nouvel article</h2>
|
||||||
<form @submit.prevent="createArticle()">
|
<form @submit.prevent="formSubmitHandler()">
|
||||||
<div class="inputs-group">
|
<div class="inputs-group">
|
||||||
<div class="label-input">
|
<div class="label-input">
|
||||||
<label for="title">Titre de l'article</label>
|
<label for="title">Titre de l'article</label>
|
||||||
|
|||||||
Reference in New Issue
Block a user