mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-07-17 01:47:22 +00:00
135 lines
4.3 KiB
TypeScript
135 lines
4.3 KiB
TypeScript
import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult';
|
|
import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema';
|
|
import {
|
|
SendCreateBeerPostRequest,
|
|
SendDeleteBeerPostRequest,
|
|
SendEditBeerPostRequest,
|
|
} from './types';
|
|
|
|
/**
|
|
* Sends a POST request to create a new beer post.
|
|
*
|
|
* @example
|
|
* const beerPost = await sendCreateBeerPostRequest({
|
|
* body: {
|
|
* abv: 5.5,
|
|
* description: 'A golden delight with a touch of citrus.',
|
|
* ibu: 30,
|
|
* name: 'Yerb Sunshine Ale',
|
|
* },
|
|
* styleId: 'clqmteqxc000008jphoy31wqw',
|
|
* breweryId: 'clqmtexfb000108jp3nsg26c6',
|
|
* });
|
|
*
|
|
* @param data - The data to send in the request.
|
|
* @param data.body - The body of the request.
|
|
* @param data.body.abv - The ABV of the beer.
|
|
* @param data.body.description - The description of the beer.
|
|
* @param data.body.ibu - The IBU of the beer.
|
|
* @param data.body.name - The name of the beer.
|
|
* @param data.styleId - The ID of the style of the beer.
|
|
* @param data.breweryId - The ID of the brewery of the beer.
|
|
* @returns The created beer post.
|
|
* @throws An error if the request fails or the response is invalid.
|
|
*/
|
|
export const sendCreateBeerPostRequest: SendCreateBeerPostRequest = async ({
|
|
body: { abv, description, ibu, name },
|
|
styleId,
|
|
breweryId,
|
|
}) => {
|
|
const response = await fetch('/api/beers/create', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ abv, description, ibu, name, styleId, breweryId }),
|
|
});
|
|
if (!response.ok) {
|
|
throw new Error(response.statusText);
|
|
}
|
|
const json = await response.json();
|
|
const parsed = APIResponseValidationSchema.safeParse(json);
|
|
if (!parsed.success) {
|
|
throw new Error('Invalid API response');
|
|
}
|
|
const { payload, success, message } = parsed.data;
|
|
if (!success) {
|
|
throw new Error(message);
|
|
}
|
|
const parsedPayload = BeerPostQueryResult.safeParse(payload);
|
|
if (!parsedPayload.success) {
|
|
throw new Error('Invalid API response payload');
|
|
}
|
|
return parsedPayload.data;
|
|
};
|
|
|
|
/**
|
|
* Sends a DELETE request to delete a beer post.
|
|
*
|
|
* @example
|
|
* const response = await sendDeleteBeerPostRequest({
|
|
* beerPostId: 'clqmtexfb000108jp3nsg26c6',
|
|
* });
|
|
*
|
|
* @param args - The arguments to send in the request.
|
|
* @param args.beerPostId - The ID of the beer post to delete.
|
|
* @returns The response from the server.
|
|
* @throws An error if the request fails or the response is invalid.
|
|
*/
|
|
export const sendDeleteBeerPostRequest: SendDeleteBeerPostRequest = async ({
|
|
beerPostId,
|
|
}) => {
|
|
const response = await fetch(`/api/beers/${beerPostId}`, { method: 'DELETE' });
|
|
if (!response.ok) {
|
|
throw new Error(response.statusText);
|
|
}
|
|
const json = await response.json();
|
|
const parsed = APIResponseValidationSchema.safeParse(json);
|
|
if (!parsed.success) {
|
|
throw new Error('Could not successfully parse the response.');
|
|
}
|
|
return parsed.data;
|
|
};
|
|
|
|
/**
|
|
* Sends a PUT request to edit a beer post.
|
|
*
|
|
* @example
|
|
* const response = await sendEditBeerPostRequest({
|
|
* beerPostId: 'clqmtexfb000108jp3nsg26c6',
|
|
* body: {
|
|
* abv: 5.5,
|
|
* description: 'A golden delight with a touch of citrus.',
|
|
* ibu: 30,
|
|
* name: 'Yerb Sunshine Ale',
|
|
* },
|
|
* });
|
|
*
|
|
* @param args - The arguments to send in the request.
|
|
* @param args.beerPostId - The ID of the beer post to edit.
|
|
* @param args.body - The body of the request.
|
|
* @param args.body.abv - The ABV of the beer.
|
|
* @param args.body.description - The description of the beer.
|
|
* @param args.body.ibu - The IBU of the beer.
|
|
* @param args.body.name - The name of the beer.
|
|
* @returns The response from the server.
|
|
* @throws An error if the request fails or the response is invalid.
|
|
*/
|
|
export const sendEditBeerPostRequest: SendEditBeerPostRequest = async ({
|
|
beerPostId,
|
|
body: { abv, description, ibu, name },
|
|
}) => {
|
|
const response = await fetch(`/api/beers/${beerPostId}`, {
|
|
method: 'PUT',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ abv, description, ibu, name }),
|
|
});
|
|
if (!response.ok) {
|
|
throw new Error(response.statusText);
|
|
}
|
|
const json = await response.json();
|
|
const parsed = APIResponseValidationSchema.safeParse(json);
|
|
if (!parsed.success) {
|
|
throw new Error('Invalid API response');
|
|
}
|
|
return parsed.data;
|
|
};
|