Refactor Article GET routes

This commit is contained in:
Florian Sylvain
2023-02-07 21:35:09 +01:00
parent 8940dc9bf6
commit 11df35953a
4 changed files with 33 additions and 15 deletions
+1 -1
View File
@@ -64,7 +64,7 @@ func initArticlesRoutes(r *gin.RouterGroup) {
articlesRouter.Use(corsMiddleware, api.AuthMiddleware.MiddlewareFunc()) articlesRouter.Use(corsMiddleware, api.AuthMiddleware.MiddlewareFunc())
articlesRouter.GET("/", articles.Get) articlesRouter.GET("/", articles.Get)
articlesRouter.GET("/:id", articles.Get) articlesRouter.GET("/:id", articles.GetUnique)
articlesRouter.POST("/:id", articles.Add) articlesRouter.POST("/:id", articles.Add)
articlesRouter.PUT("/:id", articles.Edit) articlesRouter.PUT("/:id", articles.Edit)
articlesRouter.DELETE("/:id", articles.Delete) articlesRouter.DELETE("/:id", articles.Delete)
+18 -9
View File
@@ -10,6 +10,7 @@ import (
"github.com/Floriansylvain/GohCMS/internal/api" "github.com/Floriansylvain/GohCMS/internal/api"
"github.com/Floriansylvain/GohCMS/internal/database" "github.com/Floriansylvain/GohCMS/internal/database"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
) )
func getApiFullUrl() string { func getApiFullUrl() string {
@@ -64,8 +65,6 @@ func getArticleIdFilter(titleID string) map[string]any {
} }
func Get(c *gin.Context) { func Get(c *gin.Context) {
titleID := c.Params.ByName("id")
skip, skipErr := parseUintQueryParam(c, "skip", 0) skip, skipErr := parseUintQueryParam(c, "skip", 0)
take, takeErr := parseUintQueryParam(c, "take", 10) take, takeErr := parseUintQueryParam(c, "take", 10)
if skipErr != nil || takeErr != nil { if skipErr != nil || takeErr != nil {
@@ -73,13 +72,8 @@ func Get(c *gin.Context) {
return return
} }
articles, err := database.GetDocuments(articlesLocation, getArticleIdFilter(titleID)) documents, _ := database.GetDocuments(articlesLocation, map[string]any{})
if err != nil { articlesArray := ParseArticlesFromBytesToArray(documents)
api.SendBadRequest(c, fmt.Sprintf("The ID '%v' doesn't match any article.", titleID))
return
}
articlesArray := ParseArticlesFromBytesToArray(articles)
articlesArrayLength := uint64(len(articlesArray)) articlesArrayLength := uint64(len(articlesArray))
if skip >= articlesArrayLength || take == 0 { if skip >= articlesArrayLength || take == 0 {
c.JSON(http.StatusOK, map[string]any{ c.JSON(http.StatusOK, map[string]any{
@@ -91,3 +85,18 @@ func Get(c *gin.Context) {
c.JSON(http.StatusOK, getBuiltGetResponse(articlesArray, skip, take)) c.JSON(http.StatusOK, getBuiltGetResponse(articlesArray, skip, take))
} }
func GetUnique(c *gin.Context) {
titleID := c.Params.ByName("id")
article, err := database.GetUniqueDocument(articlesLocation, getArticleIdFilter(titleID))
if err != nil {
api.SendBadRequest(c, fmt.Sprintf("The ID '%v' doesn't match any article.", titleID))
return
}
var parsedArticle Article
bson.Unmarshal(article, &parsedArticle)
c.JSON(http.StatusOK, parsedArticle)
}
+10 -1
View File
@@ -24,7 +24,7 @@ export interface GetArticle {
} }
} }
export function fetchArticle(id: string): Promise<GetArticle> { function fetchArticle(id: string): Promise<Article | GetArticle> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
fetch(`${baseApiUrl}/articles/${id}`, { fetch(`${baseApiUrl}/articles/${id}`, {
credentials: 'include', credentials: 'include',
@@ -36,6 +36,15 @@ export function fetchArticle(id: string): Promise<GetArticle> {
}) })
} }
export function fetchUniqueArticle(id: string): Promise<Article> {
return fetchArticle(id) as Promise<Article>
}
export function fetchAllArticle(): Promise<GetArticle> {
return fetchArticle("") as Promise<GetArticle>
}
export function deleteArticle(id: string): Promise<any> { export function deleteArticle(id: string): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
fetch(`${baseApiUrl}/articles/${id}`, { fetch(`${baseApiUrl}/articles/${id}`, {
+4 -4
View File
@@ -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 { fetchArticle, sendArticleWithMethod, type Article, type GetArticle } from '@/utils/database'; import { fetchUniqueArticle, sendArticleWithMethod, type Article } 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';
@@ -19,9 +19,9 @@ function displayErrorMessage(message: string): void {
errorModalShow.value = true errorModalShow.value = true
} }
async function getArticle(): Promise<GetArticle | undefined> { async function getArticle(): Promise<Article | undefined> {
try { try {
return await fetchArticle(route.params.articleID as string) return await fetchUniqueArticle(route.params.articleID as string)
} catch { } 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 ?") 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 return undefined
@@ -29,7 +29,7 @@ async function getArticle(): Promise<GetArticle | undefined> {
} }
onMounted(async () => { onMounted(async () => {
article.value = (await getArticle())?.content[0] article.value = await getArticle()
editorData.value = article.value?.content.html ?? "" editorData.value = article.value?.content.html ?? ""
}) })