teqo/src/utilities/actionPlanPageData.ts

108 lines
2.8 KiB
TypeScript

import type { Payload } from 'payload'
import type { ActionPlan, CampaignUser } from '@/payload-types'
import type { ActionPlanDetailTab } from '@/utilities/actionPlanDetailTabUi'
import {
actionPlanFormSelect,
actionPlanListSelect,
getActionPlanDetailSelect,
toActionPlanFormViewModel,
} from '@/utilities/actionPlanViewModels'
import {
actionPlanPageSize,
buildActionPlanListWhere,
parseActionPlanListParams,
} from '@/utilities/actionPlanUi'
type ActionPlanListSearchParams = Record<string, string | string[] | undefined>
export class ActionPlanNotFoundError extends Error {
override name = 'ActionPlanNotFoundError'
constructor() {
super('Plano de ação não encontrado.')
}
}
export type AccessibleActionPlanContext = {
id: number
slug: string
document: ActionPlan
}
export const loadActionPlanListPageData = async (
payload: Pick<Payload, 'find'>,
user: CampaignUser,
searchParams: Promise<ActionPlanListSearchParams> | ActionPlanListSearchParams,
now = new Date(),
) => {
const state = parseActionPlanListParams(await searchParams)
const result = await payload.find({
collection: 'actionPlan',
depth: 1,
limit: actionPlanPageSize,
page: state.page,
sort: 'startAt',
where: buildActionPlanListWhere(state, now),
select: actionPlanListSelect,
user,
overrideAccess: false,
})
return { result, state }
}
const getActionPlanDetailQueryDepth = (activeTab: ActionPlanDetailTab): number =>
activeTab === 'updates' ? 0 : 1
const loadAccessibleActionPlanBySlug = async (
payload: Pick<Payload, 'find'>,
user: CampaignUser,
planSlug: string,
select: ReturnType<typeof getActionPlanDetailSelect> | typeof actionPlanFormSelect,
depth: number,
): Promise<ActionPlan> => {
const result = await payload.find({
collection: 'actionPlan',
where: { slug: { equals: planSlug } },
depth,
limit: 1,
pagination: false,
select,
user,
overrideAccess: false,
})
const plan = result.docs[0]
if (!plan) throw new ActionPlanNotFoundError()
return plan as ActionPlan
}
export const resolveAccessibleActionPlanContext = async (
payload: Pick<Payload, 'find'>,
user: CampaignUser,
planSlug: string,
activeTab: ActionPlanDetailTab = 'overview',
): Promise<AccessibleActionPlanContext> => {
const document = await loadAccessibleActionPlanBySlug(
payload,
user,
planSlug,
getActionPlanDetailSelect(activeTab),
getActionPlanDetailQueryDepth(activeTab),
)
return {
id: document.id,
slug: document.slug,
document,
}
}
export const getActionPlanEditPageData = async (
payload: Payload,
user: CampaignUser,
planSlug: string,
) =>
toActionPlanFormViewModel(
await loadAccessibleActionPlanBySlug(payload, user, planSlug, actionPlanFormSelect, 1),
)