diff --git a/src/pages/AddAlbumPage.tsx b/src/pages/AddAlbumPage.tsx index a44c8c0cfab8dc0014652cc7f31180aaa5780047..2fa1d3caa7f6c79aa9471648a1d621e15d3e66c2 100644 --- a/src/pages/AddAlbumPage.tsx +++ b/src/pages/AddAlbumPage.tsx @@ -1,5 +1,13 @@ import {useState} from "react"; import axios from "axios"; +import { date, object, string, z } from "zod"; + +const albumSchema = object({ + albumName: string().min(1, "Album Name cannot be empty"), + releaseDate: date(), + genre: string().min(1, "Genre cannot be empty"), + artist: string().min(1, "Artist cannot be empty"), +}); export default function AddAlbum() { const [albumName, setAlbumName] = useState(""); @@ -21,6 +29,9 @@ export default function AddAlbum() { formData.append("coverFile", coverFile); } + // Validate + albumSchema.parse({ albumName, releaseDate, genre, artist }); + await axios.post("http://localhost:3000/api/premium-album", formData, { headers: { "Content-Type": "multipart/form-data", diff --git a/src/pages/AddSongPage.tsx b/src/pages/AddSongPage.tsx index 3c5d202ffd04caf11396beda2681df7982c43ecc..bb3f976bb8b54e4857bc50cdd4a168e293147a88 100644 --- a/src/pages/AddSongPage.tsx +++ b/src/pages/AddSongPage.tsx @@ -1,6 +1,15 @@ import axios from "axios"; import { useState } from "react"; import { useParams } from "react-router"; +import { number, object, string, z } from "zod"; + +const songSchema = object({ + title: string().min(1, "Title cannot be empty"), + artist: string().min(1, "Artist cannot be empty"), + songNumber: number().int("Song Number must be an integer").min(1, "Song Number must be greater than or equal to 1"), + discNumber: number().int("Disc Number must be an integer").min(1, "Disc Number must be greater than or equal to 1"), + duration: number().int("Duration must be an integer").min(1, "Duration must be greater than or equal to 1"), +}); const AddSong = () => { const { albumId }= useParams(); @@ -25,6 +34,8 @@ const AddSong = () => { formData.append("audioFile", audioFile); } + songSchema.parse({ title, artist, songNumber, discNumber, duration }); + await axios.post(`http://localhost:3000/api/premium-album/${albumId}`, formData, { headers: { "Content-Type": "multipart/form-data", diff --git a/src/pages/EditAlbumPage.tsx b/src/pages/EditAlbumPage.tsx index 58b587124d715b4b4613f6309da12ddf6141ec4b..76b8f6d26da66fb5230c98234ab06ca631487e1d 100644 --- a/src/pages/EditAlbumPage.tsx +++ b/src/pages/EditAlbumPage.tsx @@ -1,6 +1,15 @@ import axios from 'axios'; import { useEffect, useState } from 'react'; import { useParams } from 'react-router-dom'; +import { date, object, string, z } from 'zod'; + +const albumSchema = object({ + albumName: string().min(1, "Album Name cannot be empty"), + releaseDate: date(), + genre: string().min(1, "Genre cannot be empty"), + artist: string().min(1, "Artist cannot be empty"), + coverFile: string().nullable(), +}); export default function EditAlbum() { const { albumId } = useParams(); @@ -29,6 +38,7 @@ export default function EditAlbum() { const handleEditAlbum = async () => { try { + albumSchema.parse(albumData); await axios.patch( `http://localhost:3000/api/premium-album/${albumId}`, albumData diff --git a/src/pages/EditSongPage.tsx b/src/pages/EditSongPage.tsx index 0eb0172856585a30802c7c91162382c61b33c122..80d5f9965e753ce393ed3eb4afc8922cf42d735f 100644 --- a/src/pages/EditSongPage.tsx +++ b/src/pages/EditSongPage.tsx @@ -1,6 +1,16 @@ import axios from "axios"; import { useState } from "react"; import { useParams } from "react-router-dom"; +import { number, object, string, z } from "zod"; + +const songSchema = object({ + title: string().min(1, "Title cannot be empty"), + artist: string().min(1, "Artist cannot be empty"), + songNumber: number().int("Song Number must be an integer").min(1, "Song Number must be greater than or equal to 1"), + discNumber: number().int("Disc Number must be an integer").min(1, "Disc Number must be greater than or equal to 1"), + duration: number().int("Duration must be an integer").min(1, "Duration must be greater than or equal to 1"), + audioFile: string().nullable(), +}); const EditSong = () => { const { albumId, songId } = useParams(); @@ -15,6 +25,7 @@ const EditSong = () => { const handleEditSong = async () => { try { + songSchema.parse(songsData); await axios.patch( `/api/premium-album/${albumId}/${songId}`, songsData