refactor brewery post requests

This commit is contained in:
Aaron William Po
2024-02-16 01:56:44 -05:00
parent 7c4a4bde80
commit 9f1d09a61d
8 changed files with 577 additions and 150 deletions

View File

@@ -0,0 +1,105 @@
import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema';
import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult';
import {
SendEditBreweryPostRequest,
SendDeleteBreweryPostRequest,
SendCreateBreweryPostRequest,
} from './types';
/**
* Sends an api request to edit a brewery post.
*
* @param args - The arguments for the request.
* @param args.body - The body of the request.
* @param args.body.name - The name of the brewery.
* @param args.body.description - The description of the brewery.
* @param args.body.dateEstablished - The date the brewery was established.
* @param args.breweryPostId - The id of the brewery post to edit.
*/
export const sendEditBreweryPostRequest: SendEditBreweryPostRequest = async ({
body,
breweryPostId,
}) => {
const response = await fetch(`/api/breweries/${breweryPostId}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
if (!response.ok) {
throw new Error('Something went wrong');
}
const json = await response.json();
const parsed = APIResponseValidationSchema.safeParse(json);
if (!parsed.success) {
throw new Error('Something went wrong');
}
return parsed.data;
};
/**
* Sends an api request to delete a brewery post.
*
* @param args - The arguments for the request.
* @param args.breweryPostId - The id of the brewery post to delete.
*/
export const sendDeleteBreweryPostRequest: SendDeleteBreweryPostRequest = async ({
breweryPostId,
}) => {
const response = await fetch(`/api/breweries/${breweryPostId}`, {
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(parsed.error.message);
}
return parsed.data;
};
/**
* Sends an api request to create a brewery post.
*
* @param args - The arguments for the request.
* @param args.body - The body of the request.
* @param args.body.name - The name of the brewery.
* @param args.body.description - The description of the brewery.
* @param args.body.dateEstablished - The date the brewery was established.
*/
export const sendCreateBreweryPostRequest: SendCreateBreweryPostRequest = async ({
body,
}) => {
const response = await fetch('/api/breweries/create', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
if (!response.ok) {
throw new Error(response.statusText);
}
const json = await response.json();
const parsed = APIResponseValidationSchema.safeParse(json);
if (!parsed.success) {
throw new Error('API response parsing failed');
}
const parsedPayload = BreweryPostQueryResult.safeParse(parsed.data.payload);
if (!parsedPayload.success) {
throw new Error('API response payload parsing failed');
}
return parsedPayload.data;
};