-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfarmer.repository.ts
117 lines (100 loc) · 2.15 KB
/
farmer.repository.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
import {
type CropModel,
type FarmerModel,
prisma,
} from "../../../shared/database/prisma-client";
import type { StrictOmit } from "@/shared/helpers/types/strict-omit";
/*
The FarmerModel serves as the contract (source of truth), so we avoid creating redundant types manually, which is also less error-prone.
Instead, we leverage the existing types derived from the model to ensure consistency and reduce duplication.
*/
export const farmersRepository = () => {
const repository = prisma.farmer;
const getById = (id: FarmerModel["id"]) => {
const farmerFound = repository.findUnique({
where: { id },
include: {
crops: true,
},
});
return farmerFound;
};
const getByDocument = (document: FarmerModel["document"]) => {
const farmerFound = repository.findUnique({ where: { document } });
return farmerFound;
};
const getAll = () => {
const farmers = repository.findMany({
include: {
crops: true,
},
});
return farmers;
};
const create = async (
data: StrictOmit<FarmerModel, "id" | "createdAt" | "updatedAt"> & {
crops: Array<Pick<CropModel, "name">>;
},
) => {
const createdFarmer = await repository.create({
data: {
...data,
crops: {
create: data.crops.map((crop) => ({
name: crop.name,
})),
},
},
include: {
crops: true,
},
});
return createdFarmer;
};
const updateById = async (
id: FarmerModel["id"],
data: Partial<
StrictOmit<FarmerModel, "id" | "createdAt" | "updatedAt"> & {
crops: Array<Pick<CropModel, "name">>;
}
>,
) => {
const { crops, ...farmerData } = data;
const cropsUpdate = crops
? {
crops: {
deleteMany: {},
create: crops.map((crop) => ({
name: crop.name,
})),
},
}
: undefined;
const updatedFarmer = await repository.update({
where: { id },
data: {
...farmerData,
...cropsUpdate,
},
include: {
crops: true,
},
});
return updatedFarmer;
};
const removeById = async (id: FarmerModel["id"]) => {
await repository.delete({
where: {
id,
},
});
};
return {
getById,
getByDocument,
getAll,
create,
updateById,
removeById,
};
};