wip: initial stab trpc pagination

This commit is contained in:
Arvid Norlin
2024-08-16 13:27:52 +02:00
parent 6c15f1ae3a
commit 8c75b9bcd7
15 changed files with 243 additions and 138 deletions

View File

@@ -29,3 +29,9 @@ export const saveCardInput = z.object({
transactionId: z.string(),
merchantId: z.string().optional(),
})
export const friendTransactionsInput = z
.object({
limit: z.number().int().positive(),
page: z.number().int().positive(),
})
.default({ limit: 5, page: 1 })

View File

@@ -19,6 +19,7 @@ import { getMembership, getMembershipCards } from "@/utils/user"
import encryptValue from "../utils/encryptValue"
import {
friendTransactionsInput,
getUserInputSchema,
initiateSaveCardInput,
saveCardInput,
@@ -453,54 +454,69 @@ export const userQueryRouter = router({
}),
}),
transaction: router({
friendTransactions: protectedProcedure.query(async (opts) => {
const apiResponse = await api.get(api.endpoints.v1.friendTransactions, {
cache: "no-store",
headers: {
Authorization: `Bearer ${opts.ctx.session.token.access_token}`,
},
})
friendTransactions: protectedProcedure
.input(friendTransactionsInput)
.query(async ({ ctx, input }) => {
const { limit, page } = input
const apiResponse = await api.get(api.endpoints.v1.friendTransactions, {
headers: {
Authorization: `Bearer ${ctx.session.token.access_token}`,
},
next: { revalidate: 30 * 60 * 1000 },
})
if (!apiResponse.ok) {
// switch (apiResponse.status) {
// case 400:
// throw badRequestError()
// case 401:
// throw unauthorizedError()
// case 403:
// throw forbiddenError()
// default:
// throw internalServerError()
// }
console.error(`API Response Failed - Getting Friend Transactions`)
console.error(`User: (${JSON.stringify(opts.ctx.session.user)})`)
console.error(apiResponse)
return null
}
if (!apiResponse.ok) {
// switch (apiResponse.status) {
// case 400:
// throw badRequestError()
// case 401:
// throw unauthorizedError()
// case 403:
// throw forbiddenError()
// default:
// throw internalServerError()
// }
console.error(`API Response Failed - Getting Friend Transactions`)
console.error(`User: (${JSON.stringify(ctx.session.user)})`)
console.error(apiResponse)
return null
}
const apiJson = await apiResponse.json()
const verifiedData = getFriendTransactionsSchema.safeParse(apiJson)
if (!verifiedData.success) {
console.error(`Failed to validate Friend Transactions Data`)
console.error(`User: (${JSON.stringify(opts.ctx.session.user)})`)
console.error(verifiedData.error)
return null
}
const apiJson = await apiResponse.json()
const verifiedData = getFriendTransactionsSchema.safeParse(apiJson)
if (!verifiedData.success) {
console.error(`Failed to validate Friend Transactions Data`)
console.error(`User: (${JSON.stringify(ctx.session.user)})`)
console.error(verifiedData.error)
return null
}
return {
data: verifiedData.data.data.map(({ attributes }) => {
return {
awardPoints: attributes.awardPoints,
checkinDate: attributes.checkinDate,
checkoutDate: attributes.checkoutDate,
city: attributes.hotelInformation?.city,
confirmationNumber: attributes.confirmationNumber,
hotelName: attributes.hotelInformation?.name,
nights: attributes.nights,
}
}),
}
}),
const pageData = verifiedData.data.data.slice(
limit * (page - 1),
limit * page
)
return {
data: {
transactions: pageData.map(({ attributes }) => {
return {
awardPoints: attributes.awardPoints,
checkinDate: attributes.checkinDate,
checkoutDate: attributes.checkoutDate,
city: attributes.hotelInformation?.city,
confirmationNumber: attributes.confirmationNumber,
hotelName: attributes.hotelInformation?.name,
nights: attributes.nights,
}
}),
pages: Math.ceil(verifiedData.data.data.length / limit),
},
meta: {
totalPages: Math.ceil(verifiedData.data.data.length / limit),
},
}
}),
}),
creditCards: protectedProcedure.query(async function ({ ctx }) {