Skip to content

Commit 391e185

Browse files
committed
whattheduck: Reduce amount of calls to retrieve coa counts
1 parent ea8c098 commit 391e185

File tree

6 files changed

+102
-112
lines changed

6 files changed

+102
-112
lines changed

apps/web/src/pages/stats/possessions.vue

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ let chartData = $ref<ChartData<"bar", number[]> | null>(null),
4646
unitTypeCurrent = $ref<string>("number"),
4747
options = $ref<ChartOptions<"bar">>({});
4848
49-
const { loadCollection, fetchIssueCountsByPublicationcode } = collection();
49+
const { loadCollection } = collection();
5050
const {
5151
totalPerPublicationUniqueIssuecodesSorted,
5252
coaIssueCountsByPublicationcode,
@@ -107,7 +107,6 @@ watch(
107107
await fetchPublicationNames(
108108
newValue.map(([publicationcode]) => publicationcode),
109109
);
110-
await fetchIssueCountsByPublicationcode();
111110
hasCoaData = true;
112111
},
113112
{ immediate: true },

apps/web/src/stores/collection.ts

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ export const collection = defineStore("collection", () => {
4747

4848
const { bookcaseWithPopularities } = storeToRefs(bookcase());
4949

50-
const issues = shallowRef<EventReturnType<
51-
CollectionServices["getIssues"]
52-
> | null>(null);
50+
const issues = shallowRef<
51+
EventReturnType<CollectionServices["getIssues"]>["issues"] | null
52+
>(null);
5353

5454
const collectionUtils = useCollection(
5555
issues as ShallowRef<(issue & { issuecode: string })[]>,
@@ -75,12 +75,16 @@ export const collection = defineStore("collection", () => {
7575
isLoadingPurchases = ref(false),
7676
isLoadingSuggestions = ref(false),
7777
isLoadingSubscriptions = ref(false),
78-
coaIssueCountsPerCountrycode = shallowRef<EventReturnType<
79-
CollectionServices["getCoaCountByCountrycode"]
80-
> | null>(null),
81-
coaIssueCountsByPublicationcode = shallowRef<EventReturnType<
82-
CollectionServices["getCoaCountByPublicationcode"]
83-
> | null>(null),
78+
coaIssueCountsPerCountrycode = shallowRef<
79+
| EventReturnType<CollectionServices["getIssues"]>["countByCountrycode"]
80+
| null
81+
>(null),
82+
coaIssueCountsByPublicationcode = shallowRef<
83+
| EventReturnType<
84+
CollectionServices["getIssues"]
85+
>["countByPublicationcode"]
86+
| null
87+
>(null),
8488
user = shallowRef<
8589
EventReturnType<CollectionServices["getUser"]> | undefined | null
8690
>(undefined),
@@ -162,16 +166,6 @@ export const collection = defineStore("collection", () => {
162166
await collectionServices.deletePurchase(id);
163167
await loadPurchases(true);
164168
},
165-
fetchIssueCountsByCountrycode = async (force = false) => {
166-
if (!coaIssueCountsByPublicationcode.value || force)
167-
coaIssueCountsPerCountrycode.value =
168-
await collectionServices.getCoaCountByCountrycode();
169-
},
170-
fetchIssueCountsByPublicationcode = async (force = false) => {
171-
if (!coaIssueCountsByPublicationcode.value || force)
172-
coaIssueCountsByPublicationcode.value =
173-
await collectionServices.getCoaCountByPublicationcode();
174-
},
175169
fetchPublicationNames = () => collectionServices.getPublicationTitles(),
176170
loadPreviousVisit = async () => {
177171
const result = await collectionServices.getLastVisit();
@@ -184,7 +178,11 @@ export const collection = defineStore("collection", () => {
184178
loadCollection = async (afterUpdate = false) => {
185179
if (afterUpdate || (!isLoadingCollection.value && !issues.value)) {
186180
isLoadingCollection.value = true;
187-
issues.value = await collectionServices.getIssues();
181+
({
182+
issues: issues.value,
183+
countByCountrycode: coaIssueCountsPerCountrycode.value,
184+
countByPublicationcode: coaIssueCountsByPublicationcode.value,
185+
} = await collectionServices.getIssues());
188186
Object.assign(
189187
coa().issuecodeDetails,
190188
issues.value.map(({ issuecode, publicationcode, issuenumber }) => ({
@@ -376,8 +374,6 @@ export const collection = defineStore("collection", () => {
376374
publicationUrlRoot,
377375
createPurchase,
378376
deletePurchase,
379-
fetchIssueCountsByCountrycode,
380-
fetchIssueCountsByPublicationcode,
381377
fetchPublicationNames,
382378
hasRole,
383379
hasSuggestions,

apps/whattheduck/src/stores/wtdcollection.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ export const wtdcollection = defineStore('wtdcollection', () => {
1616
const {
1717
createPurchase,
1818
findInCollection,
19-
fetchIssueCountsByCountrycode,
20-
fetchIssueCountsByPublicationcode,
2119
fetchPublicationNames,
2220
isLoadingSuggestions,
2321
loadCollection,
@@ -71,9 +69,6 @@ export const wtdcollection = defineStore('wtdcollection', () => {
7169
await usersStore.fetchStats([webCollectionStore.user?.id || 0], force);
7270
// TODO retrieve user notification countries
7371

74-
await fetchIssueCountsByCountrycode(force);
75-
await fetchIssueCountsByPublicationcode(force);
76-
7772
(async () => {
7873
await loadSuggestions({ countryCode: 'ALL', sinceLastVisit: false });
7974
await statsStore.loadRatings();
@@ -96,7 +91,6 @@ export const wtdcollection = defineStore('wtdcollection', () => {
9691
coaIssueCountsPerCountrycode,
9792
createPurchase,
9893
fetchCollection,
99-
fetchIssueCountsByPublicationcode,
10094
findInCollection,
10195
getCollectionIssues,
10296
highestQuotedIssue,

apps/whattheduck/src/views/CoverSearchResults.vue

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@
3434
numberOfUsers: issuePopularities[cover.issuecode]!.popularity,
3535
})
3636
}}</ion-col></ion-row
37-
><ion-row style="font-size: 0.8rem; width: 100%" v-if="getEstimationWithAverage(cover.issuecode)"
37+
><ion-row style="font-size: 0.8rem; width: 100%" v-if="issueQuotations[cover.issuecode]"
3838
><ion-col size="2"><ion-icon :ios="pricetagOutline" :md="pricetagSharp"></ion-icon></ion-col
3939
><ion-col class="ion-text-left"
40-
><IssueQuotation :issue="getEstimationWithAverage(cover.issuecode)" /></ion-col></ion-row
40+
><IssueQuotation :issue="{ ...cover, ...issueQuotations[cover.issuecode] }" /></ion-col></ion-row
4141
></ion-row>
4242
</div>
4343
<ion-note>
@@ -77,14 +77,8 @@ import type CoverIdServices from '~dm-services/cover-id/types';
7777
7878
const { t } = useI18n();
7979
const hasCoaData = ref(false);
80-
const { issuecodeDetails, publicationNames, issuePopularities } = storeToRefs(webStores.coa());
81-
const {
82-
fetchPublicationNames,
83-
fetchIssuecodeDetails,
84-
fetchIssuePopularities,
85-
fetchIssueQuotations,
86-
getEstimationWithAverage,
87-
} = webStores.coa();
80+
const { issuecodeDetails, publicationNames, issuePopularities, issueQuotations } = storeToRefs(webStores.coa());
81+
const { fetchPublicationNames, fetchIssuecodeDetails, fetchIssuePopularities, fetchIssueQuotations } = webStores.coa();
8882
const { currentNavigationItem } = storeToRefs(app());
8983
9084
const { IssueQuotation } = webComponents;

packages/api/services/collection/issues/index.ts

Lines changed: 78 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import { augmentIssueArrayWithInducksData } from "~/services/coa";
77
import { getPublicationTitles } from "~/services/coa/publications";
88
import type { InducksIssueQuotationSimple } from "~dm-types/InducksIssueQuotationSimple";
99
import type { TransactionResults } from "~dm-types/TransactionResults";
10-
import { prismaClient as prismaCoa } from "~prisma-schemas/schemas/coa/client";
1110
import type { issue, user } from "~prisma-schemas/schemas/dm";
1211
import { issue_condition } from "~prisma-schemas/schemas/dm";
1312
import { prismaClient as prismaDm } from "~prisma-schemas/schemas/dm/client";
13+
import { prismaClient as prismaCoa } from "~prisma-schemas/schemas/coa/client";
1414

1515
import type Events from "../types";
1616
import {
@@ -19,23 +19,65 @@ import {
1919
handleIsOnSale,
2020
} from "./util";
2121

22-
export const getCollectionCountrycodes = (userId: number) =>
23-
getCollectionPublicationcodes(userId).then((data) => [
24-
...new Set(data.map((publicationcode) => publicationcode.split("/")[0])),
25-
]);
26-
27-
export const getCollectionPublicationcodes = (userId: number) =>
28-
prismaDm.issue
29-
.findMany({
30-
distinct: ["publicationcode"],
31-
select: {
32-
publicationcode: true,
22+
const getCoaCountByPublicationcode = (collectionPublicationcodes: string[]) =>
23+
prismaCoa.inducks_issue
24+
.groupBy({
25+
_count: {
26+
issuenumber: true,
3327
},
3428
where: {
35-
userId,
29+
publicationcode: {
30+
in: collectionPublicationcodes,
31+
},
32+
},
33+
by: ["publicationcode"],
34+
})
35+
.then((data) =>
36+
Object.fromEntries(
37+
data.map(({ publicationcode, _count }) => [
38+
publicationcode!,
39+
_count.issuenumber,
40+
]),
41+
),
42+
);
43+
44+
const getCoaCountByCountrycode = (collectionCountrycodes: string[]) =>
45+
prismaCoa.inducks_issue
46+
.groupBy({
47+
_count: {
48+
issuenumber: true,
49+
},
50+
where: {
51+
OR: collectionCountrycodes.map((countrycode) => ({
52+
publicationcode: {
53+
startsWith: `${countrycode}/`,
54+
},
55+
})),
3656
},
57+
by: ["publicationcode"],
3758
})
38-
.then((data) => [...data.map(({ publicationcode }) => publicationcode!)]);
59+
.then((data) =>
60+
data.reduce<Record<string, number>>(
61+
(acc, { publicationcode, _count }) => {
62+
const countrycode = publicationcode!.split("/")[0];
63+
acc[countrycode] = _count.issuenumber + (acc[countrycode] || 0);
64+
return acc;
65+
},
66+
{},
67+
),
68+
);
69+
70+
export const getCollectionCountrycodes = (issues: issue[]) => [
71+
...new Set(
72+
getCollectionPublicationcodes(issues).map(
73+
(publicationcode) => publicationcode.split("/")[0],
74+
),
75+
),
76+
];
77+
78+
export const getCollectionPublicationcodes = (issues: issue[]) => [
79+
...new Set(issues.map(({ publicationcode }) => publicationcode!)),
80+
];
3981

4082
export default (socket: Socket<Events>) => {
4183
socket.on("getPublicationTitles", async (callback) =>
@@ -65,6 +107,28 @@ export default (socket: Socket<Events>) => {
65107
issues as (issue & { issuecode: string })[],
66108
),
67109
)
110+
.then(async (issues) => {
111+
const collectionPublicationcodes = [
112+
...new Set(issues.map(({ publicationcode }) => publicationcode!)),
113+
];
114+
const collectionCountrycodes = [
115+
...new Set(
116+
collectionPublicationcodes.map(
117+
(publicationcode) => publicationcode.split("/")[0],
118+
),
119+
),
120+
];
121+
122+
return {
123+
issues,
124+
countByCountrycode: await getCoaCountByCountrycode(
125+
collectionCountrycodes,
126+
),
127+
countByPublicationcode: await getCoaCountByPublicationcode(
128+
collectionPublicationcodes,
129+
),
130+
};
131+
})
68132
.then(callback);
69133
});
70134

@@ -161,55 +225,6 @@ export default (socket: Socket<Events>) => {
161225
callback(output);
162226
});
163227

164-
socket.on("getCoaCountByCountrycode", async (callback) =>
165-
prismaCoa.inducks_issue
166-
.groupBy({
167-
_count: {
168-
issuenumber: true,
169-
},
170-
where: {
171-
OR: (await getCollectionCountrycodes(socket.data.user!.id)).map(
172-
(countrycode) => ({
173-
publicationcode: {
174-
startsWith: `${countrycode}/`,
175-
},
176-
}),
177-
),
178-
},
179-
by: ["publicationcode"],
180-
})
181-
.then((data) =>
182-
data.reduce<Record<string, number>>((acc, { publicationcode, _count }) => {
183-
const countrycode = publicationcode!.split("/")[0];
184-
acc[countrycode] = (_count.issuenumber + (acc[countrycode] || 0));
185-
return acc
186-
}, {})
187-
)
188-
.then(callback),
189-
);
190-
191-
socket.on("getCoaCountByPublicationcode", async (callback) =>
192-
prismaCoa.inducks_issue
193-
.groupBy({
194-
_count: {
195-
issuenumber: true,
196-
},
197-
where: {
198-
publicationcode: {
199-
in: await getCollectionPublicationcodes(socket.data.user!.id),
200-
},
201-
},
202-
by: ["publicationcode"],
203-
})
204-
.then((data) => {
205-
callback(
206-
Object.fromEntries(
207-
data.map(({ publicationcode, _count }) => [publicationcode!, _count.issuenumber])
208-
)
209-
);
210-
}),
211-
);
212-
213228
socket.on("getCollectionQuotations", async (callback) => {
214229
callback({
215230
quotations: (

packages/api/services/collection/types.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export default abstract class {
4646
) => void;
4747

4848
abstract getIssues: (
49-
callback: (data: AugmentedIssue<issue & { issuecode: string }>[]) => void,
49+
callback: (data: {countByCountrycode: Record<string, number>, countByPublicationcode: Record<string, number>, issues: AugmentedIssue<issue & { issuecode: string }>[]}) => void,
5050
) => void;
5151
abstract addOrChangeIssues: (
5252
data: CollectionUpdateMultipleIssues,
@@ -61,14 +61,6 @@ export default abstract class {
6161
callback: (value: Record<string, string>) => void,
6262
) => void;
6363

64-
abstract getCoaCountByPublicationcode: (
65-
callback: (value: Record<string, number>) => void,
66-
) => void;
67-
68-
abstract getCoaCountByCountrycode: (
69-
callback: (value: Record<string, number>) => void,
70-
) => void;
71-
7264
abstract createRequests: (
7365
issueIds: number[],
7466
callback: (

0 commit comments

Comments
 (0)