-
Notifications
You must be signed in to change notification settings - Fork 10
/
tasting.ts
109 lines (100 loc) · 2.98 KB
/
tasting.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
import { and, eq, inArray } from "drizzle-orm";
import { Serializer, serialize } from ".";
import config from "../../config";
import { db } from "../../db";
import {
Tasting,
User,
bottles,
editions,
tastings,
toasts,
users,
} from "../../db/schema";
import { notEmpty } from "../filter";
import { BottleSerializer } from "./bottle";
import { EditionSerializer } from "./edition";
import { UserSerializer } from "./user";
export const TastingSerializer: Serializer<Tasting> = {
attrs: async (itemList: Tasting[], currentUser?: User) => {
const itemIds = itemList.map((t) => t.id);
const results = await db
.select({
id: tastings.id,
bottle: bottles,
createdBy: users,
edition: editions,
})
.from(tastings)
.innerJoin(users, eq(tastings.createdById, users.id))
.innerJoin(bottles, eq(tastings.bottleId, bottles.id))
.leftJoin(editions, eq(tastings.editionId, editions.id))
.where(inArray(tastings.id, itemIds));
const userToastsList: number[] = currentUser
? (
await db
.select({ tastingId: toasts.tastingId })
.from(toasts)
.where(
and(
inArray(toasts.tastingId, itemIds),
eq(toasts.createdById, currentUser.id),
),
)
).map((t) => t.tastingId)
: [];
const bottlesByRef = Object.fromEntries(
(
await serialize(
BottleSerializer,
results.map((r) => r.bottle),
currentUser,
)
).map((data, index) => [results[index].id, data]),
);
const usersByRef = Object.fromEntries(
(
await serialize(
UserSerializer,
results.map((r) => r.createdBy),
currentUser,
)
).map((data, index) => [results[index].id, data]),
);
const editionList = results.map((r) => r.edition).filter(notEmpty);
const editionsById = Object.fromEntries(
(await serialize(EditionSerializer, editionList, currentUser)).map(
(data, index) => [editionList[index].id, data],
),
);
return Object.fromEntries(
itemList.map((item) => {
return [
item.id,
{
hasToasted: userToastsList.indexOf(item.id) !== -1,
edition: item.editionId ? editionsById[item.editionId] : null,
createdBy: usersByRef[item.id] || null,
bottle: bottlesByRef[item.id] || null,
},
];
}),
);
},
item: (item: Tasting, attrs: Record<string, any>, currentUser?: User) => {
return {
id: item.id,
imageUrl: item.imageUrl ? `${config.URL_PREFIX}${item.imageUrl}` : null,
notes: item.notes,
tags: item.tags || [],
rating: item.rating,
createdAt: item.createdAt,
comments: item.comments,
toasts: item.toasts,
bottle: attrs.bottle,
createdBy: attrs.createdBy,
edition: attrs.edition,
hasToasted: attrs.hasToasted,
};
},
};