/
route.ts
147 lines (124 loc) · 3.02 KB
/
route.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import { NextRequest, NextResponse } from 'next/server';
import { z } from 'zod';
import {
deleteAnimalById,
getAnimalById,
updateAnimalById,
} from '../../../../database/animals';
import { Animal } from '../../../../migrations/1675675178-createTableAnimals';
const animalSchema = z.object({
firstName: z.string(),
type: z.string(),
accessory: z.string(),
});
export type AnimalResponseBodyGet =
| {
error: string;
}
| {
animal: Animal;
};
export type AnimalResponseBodyPut =
| {
error: string;
}
| {
animal: Animal;
};
export type AnimalResponseBodyDelete =
| {
error: string;
}
| {
animal: Animal;
};
export async function GET(
request: NextRequest,
{ params }: { params: Record<string, string | string[]> },
): Promise<NextResponse<AnimalResponseBodyGet>> {
const animalId = Number(params.animalId);
if (!animalId) {
return NextResponse.json(
{
error: 'Animal id is not valid',
},
{ status: 400 },
);
}
const singleAnimal = await getAnimalById(animalId);
if (!singleAnimal) {
return NextResponse.json(
{
error: 'Animal not found',
},
{ status: 404 },
);
}
return NextResponse.json({ animal: singleAnimal });
}
export async function PUT(
request: NextRequest,
{ params }: { params: Record<string, string | string[]> },
): Promise<NextResponse<AnimalResponseBodyPut>> {
const animalId = Number(params.animalId);
if (!animalId) {
return NextResponse.json(
{
error: 'Animal id is not valid',
},
{ status: 400 },
);
}
const body = await request.json();
const result = animalSchema.safeParse(body);
if (!result.success) {
// Inside of result.error.issues you are going to have more granular information about what is failing allowing you to create more specific error massages
// console.log(result.error.issues);
return NextResponse.json(
{
error:
'Request body is missing one of the needed properties firstName, type and accessory ',
},
{ status: 400 },
);
}
const newAnimal = await updateAnimalById(
animalId,
result.data.firstName,
result.data.type,
result.data.accessory,
);
if (!newAnimal) {
return NextResponse.json(
{
error: 'Animal not found',
},
{ status: 404 },
);
}
return NextResponse.json({ animal: newAnimal });
}
export async function DELETE(
request: NextRequest,
{ params }: { params: Record<string, string | string[]> },
): Promise<NextResponse<AnimalResponseBodyDelete>> {
const animalId = Number(params.animalId);
if (!animalId) {
return NextResponse.json(
{
error: 'Animal id is not valid',
},
{ status: 400 },
);
}
const singleAnimal = await deleteAnimalById(animalId);
if (!singleAnimal) {
return NextResponse.json(
{
error: 'Animal not found',
},
{ status: 404 },
);
}
return NextResponse.json({ animal: singleAnimal });
}