Refactor all API related functions

This commit is contained in:
Florian Sylvain
2023-02-07 20:39:36 +01:00
parent ef8f106688
commit e0c366632c
3 changed files with 63 additions and 52 deletions
+20 -16
View File
@@ -24,35 +24,39 @@ export interface GetArticle {
}
}
export async function getArticles(id: string): Promise<GetArticle> {
return await fetch(`${baseApiUrl}/articles/${id}`, {
export function fetchArticle(id: string): Promise<GetArticle> {
return new Promise((resolve, reject) => {
fetch(`${baseApiUrl}/articles/${id}`, {
credentials: 'include',
method: 'GET',
})
.then(result => result.json())
.then(response => response.json())
.then(article => resolve(article))
.catch(error => reject(error))
})
}
export async function deleteArticle(id: string) {
return await fetch(`${baseApiUrl}/articles/${id}`, {
export function deleteArticle(id: string): Promise<any> {
return new Promise((resolve, reject) => {
fetch(`${baseApiUrl}/articles/${id}`, {
credentials: 'include',
method: 'DELETE',
method: 'DELETE'
})
.then(result => result.json())
.then(article => resolve(article))
.catch(error => reject(error))
})
}
async function sendArticle(article: Article, method: 'POST' | 'PUT'): Promise<object> {
return await fetch(`${baseApiUrl}/articles/${article.titleID}`, {
export function sendArticleWithMethod(article: Article, method: 'POST' | 'PUT'): Promise<any> {
return new Promise((resolve, reject) => {
fetch(`${baseApiUrl}/articles/${article.titleID}`, {
credentials: 'include',
method,
body: JSON.stringify(article)
})
.then(result => result.json())
}
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')
.then(article => resolve(article))
.catch(error => reject(error))
})
}
+24 -22
View File
@@ -1,6 +1,6 @@
<script setup lang="ts">
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 { onMounted, ref, type Ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
@@ -8,41 +8,43 @@ import { useRoute, useRouter } from 'vue-router';
const article: Ref<Article | void> = ref()
const editorData: Ref<string> = ref('')
const router = useRouter()
const route = useRoute()
const successModalShow = ref(false)
const errorModalShow = ref(false)
const errorModalDescription: Ref<string> = ref("Quelque chose s'est mal passé...")
onMounted(async () => {
await getArticles(useRoute().params.articleID as string)
.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 ?"
function displayErrorMessage(message: string): void {
errorModalDescription.value = message
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() {
router.push('/articles')
}
async function saveContent() {
function saveContent() {
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>
+10 -5
View File
@@ -1,7 +1,7 @@
<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 { RouterLink, useRouter } from 'vue-router'
import { RouterLink, useRouter } from 'vue-router';
const router = useRouter()
@@ -29,7 +29,7 @@ function isFormEmpty(): boolean {
return title.value === '' || rawTags.value === ''
}
async function createArticle() {
async function createArticle(): Promise<Article> {
const article: Article = {
titleID: generateTitleID(title.value),
title: title.value,
@@ -40,7 +40,12 @@ async function createArticle() {
online: false,
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}`)
}
</script>
@@ -48,7 +53,7 @@ async function createArticle() {
<template>
<main>
<h2>Créer un nouvel article</h2>
<form @submit.prevent="createArticle()">
<form @submit.prevent="formSubmitHandler()">
<div class="inputs-group">
<div class="label-input">
<label for="title">Titre de l'article</label>