diff --git a/apps/web/actions/api/customers.ts b/apps/web/actions/api/customers.ts index 5f2cf8d..f39b0e1 100644 --- a/apps/web/actions/api/customers.ts +++ b/apps/web/actions/api/customers.ts @@ -1,36 +1,8 @@ -'use server'; +import * as customers from './server/customers'; +import { wrapClientAction } from '@/utils/actions'; -import { useService } from './lib/service'; -import { CustomersService } from '@repo/graphql/api/customers'; - -const getService = useService(CustomersService); - -export async function addMasters(...variables: Parameters) { - const service = await getService(); - - return service.addMasters(...variables); -} - -export async function getClients(...variables: Parameters) { - const service = await getService(); - - return service.getClients(...variables); -} - -export async function getCustomer(...variables: Parameters) { - const service = await getService(); - - return service.getCustomer(...variables); -} - -export async function getMasters(...variables: Parameters) { - const service = await getService(); - - return service.getMasters(...variables); -} - -export async function updateCustomer(...variables: Parameters) { - const service = await getService(); - - return service.updateCustomer(...variables); -} +export const addMasters = wrapClientAction(customers.addMasters); +export const getClients = wrapClientAction(customers.getClients); +export const getCustomer = wrapClientAction(customers.getCustomer); +export const getMasters = wrapClientAction(customers.getMasters); +export const updateCustomer = wrapClientAction(customers.updateCustomer); diff --git a/apps/web/actions/api/orders.ts b/apps/web/actions/api/orders.ts index 5a4b4da..8d7fc31 100644 --- a/apps/web/actions/api/orders.ts +++ b/apps/web/actions/api/orders.ts @@ -1,30 +1,7 @@ -'use server'; +import * as orders from './server/orders'; +import { wrapClientAction } from '@/utils/actions'; -import { useService } from './lib/service'; -import { OrdersService } from '@repo/graphql/api/orders'; - -const getServicesService = useService(OrdersService); - -export async function createOrder(...variables: Parameters) { - const service = await getServicesService(); - - return service.createOrder(...variables); -} - -export async function getOrder(...variables: Parameters) { - const service = await getServicesService(); - - return service.getOrder(...variables); -} - -export async function getOrders(...variables: Parameters) { - const service = await getServicesService(); - - return service.getOrders(...variables); -} - -export async function updateOrder(...variables: Parameters) { - const service = await getServicesService(); - - return service.updateOrder(...variables); -} +export const createOrder = wrapClientAction(orders.createOrder); +export const getOrder = wrapClientAction(orders.getOrder); +export const getOrders = wrapClientAction(orders.getOrders); +export const updateOrder = wrapClientAction(orders.updateOrder); diff --git a/apps/web/actions/api/server/customers.ts b/apps/web/actions/api/server/customers.ts new file mode 100644 index 0000000..6739e23 --- /dev/null +++ b/apps/web/actions/api/server/customers.ts @@ -0,0 +1,37 @@ +'use server'; + +import { useService } from '../lib/service'; +import { wrapServerAction } from '@/utils/actions'; +import { CustomersService } from '@repo/graphql/api/customers'; + +const getService = useService(CustomersService); + +export async function addMasters(...variables: Parameters) { + const service = await getService(); + + return wrapServerAction(() => service.addMasters(...variables)); +} + +export async function getClients(...variables: Parameters) { + const service = await getService(); + + return wrapServerAction(() => service.getClients(...variables)); +} + +export async function getCustomer(...variables: Parameters) { + const service = await getService(); + + return wrapServerAction(() => service.getCustomer(...variables)); +} + +export async function getMasters(...variables: Parameters) { + const service = await getService(); + + return wrapServerAction(() => service.getMasters(...variables)); +} + +export async function updateCustomer(...variables: Parameters) { + const service = await getService(); + + return wrapServerAction(() => service.updateCustomer(...variables)); +} diff --git a/apps/web/actions/api/server/orders.ts b/apps/web/actions/api/server/orders.ts new file mode 100644 index 0000000..3fb8d21 --- /dev/null +++ b/apps/web/actions/api/server/orders.ts @@ -0,0 +1,31 @@ +'use server'; + +import { useService } from '../lib/service'; +import { wrapServerAction } from '@/utils/actions'; +import { OrdersService } from '@repo/graphql/api/orders'; + +const getServicesService = useService(OrdersService); + +export async function createOrder(...variables: Parameters) { + const service = await getServicesService(); + + return wrapServerAction(() => service.createOrder(...variables)); +} + +export async function getOrder(...variables: Parameters) { + const service = await getServicesService(); + + return wrapServerAction(() => service.getOrder(...variables)); +} + +export async function getOrders(...variables: Parameters) { + const service = await getServicesService(); + + return wrapServerAction(() => service.getOrders(...variables)); +} + +export async function updateOrder(...variables: Parameters) { + const service = await getServicesService(); + + return wrapServerAction(() => service.updateOrder(...variables)); +} diff --git a/apps/web/actions/api/server/services.ts b/apps/web/actions/api/server/services.ts new file mode 100644 index 0000000..0bbef3b --- /dev/null +++ b/apps/web/actions/api/server/services.ts @@ -0,0 +1,19 @@ +'use server'; + +import { useService } from '../lib/service'; +import { wrapServerAction } from '@/utils/actions'; +import { ServicesService } from '@repo/graphql/api/services'; + +const getServicesService = useService(ServicesService); + +export async function getService(...variables: Parameters) { + const service = await getServicesService(); + + return wrapServerAction(() => service.getService(...variables)); +} + +export async function getServices(...variables: Parameters) { + const service = await getServicesService(); + + return wrapServerAction(() => service.getServices(...variables)); +} diff --git a/apps/web/actions/api/server/slots.ts b/apps/web/actions/api/server/slots.ts new file mode 100644 index 0000000..5407c88 --- /dev/null +++ b/apps/web/actions/api/server/slots.ts @@ -0,0 +1,45 @@ +'use server'; + +import { useService } from '../lib/service'; +import { wrapServerAction } from '@/utils/actions'; +import { SlotsService } from '@repo/graphql/api/slots'; + +const getService = useService(SlotsService); + +export async function createSlot(...variables: Parameters) { + const service = await getService(); + + return wrapServerAction(() => service.createSlot(...variables)); +} + +export async function deleteSlot(...variables: Parameters) { + const service = await getService(); + + return wrapServerAction(() => service.deleteSlot(...variables)); +} + +export async function getAvailableTimeSlots( + ...variables: Parameters +) { + const service = await getService(); + + return wrapServerAction(() => service.getAvailableTimeSlots(...variables)); +} + +export async function getSlot(...variables: Parameters) { + const service = await getService(); + + return wrapServerAction(() => service.getSlot(...variables)); +} + +export async function getSlots(...variables: Parameters) { + const service = await getService(); + + return wrapServerAction(() => service.getSlots(...variables)); +} + +export async function updateSlot(...variables: Parameters) { + const service = await getService(); + + return wrapServerAction(() => service.updateSlot(...variables)); +} diff --git a/apps/web/actions/api/services.ts b/apps/web/actions/api/services.ts index 577a04d..b208bce 100644 --- a/apps/web/actions/api/services.ts +++ b/apps/web/actions/api/services.ts @@ -1,18 +1,5 @@ -'use server'; +import * as services from './server/services'; +import { wrapClientAction } from '@/utils/actions'; -import { useService } from './lib/service'; -import { ServicesService } from '@repo/graphql/api/services'; - -const getServicesService = useService(ServicesService); - -export async function getService(...variables: Parameters) { - const service = await getServicesService(); - - return service.getService(...variables); -} - -export async function getServices(...variables: Parameters) { - const service = await getServicesService(); - - return service.getServices(...variables); -} +export const getServices = wrapClientAction(services.getServices); +export const getService = wrapClientAction(services.getService); diff --git a/apps/web/actions/api/slots.ts b/apps/web/actions/api/slots.ts index d469909..7a0d6c9 100644 --- a/apps/web/actions/api/slots.ts +++ b/apps/web/actions/api/slots.ts @@ -1,44 +1,9 @@ -'use server'; +import * as slots from './server/slots'; +import { wrapClientAction } from '@/utils/actions'; -import { useService } from './lib/service'; -import { SlotsService } from '@repo/graphql/api/slots'; - -const getService = useService(SlotsService); - -export async function createSlot(...variables: Parameters) { - const service = await getService(); - - return service.createSlot(...variables); -} - -export async function deleteSlot(...variables: Parameters) { - const service = await getService(); - - return service.deleteSlot(...variables); -} - -export async function getAvailableTimeSlots( - ...variables: Parameters -) { - const service = await getService(); - - return service.getAvailableTimeSlots(...variables); -} - -export async function getSlot(...variables: Parameters) { - const service = await getService(); - - return service.getSlot(...variables); -} - -export async function getSlots(...variables: Parameters) { - const service = await getService(); - - return service.getSlots(...variables); -} - -export async function updateSlot(...variables: Parameters) { - const service = await getService(); - - return service.updateSlot(...variables); -} +export const getSlot = wrapClientAction(slots.getSlot); +export const getSlots = wrapClientAction(slots.getSlots); +export const createSlot = wrapClientAction(slots.createSlot); +export const updateSlot = wrapClientAction(slots.updateSlot); +export const deleteSlot = wrapClientAction(slots.deleteSlot); +export const getAvailableTimeSlots = wrapClientAction(slots.getAvailableTimeSlots); diff --git a/apps/web/utils/actions.ts b/apps/web/utils/actions.ts new file mode 100644 index 0000000..f02a35e --- /dev/null +++ b/apps/web/utils/actions.ts @@ -0,0 +1,23 @@ +/* eslint-disable unicorn/prevent-abbreviations */ + +export function wrapClientAction( + fn: (...args: Args) => Promise<{ data?: Return; error?: string; ok: boolean }>, +): (...args: Args) => Promise { + return async (...args: Args): Promise => { + const res = await fn(...args); + if (!res.ok) throw new Error(res.error ?? 'Неизвестная ошибка'); + return res.data as Return; + }; +} + +export async function wrapServerAction( + action: () => Promise, +): Promise<{ data: T; ok: true } | { error: string; ok: false }> { + try { + const data = await action(); + return { data, ok: true }; + } catch (error) { + const message = error instanceof Error ? error.message : 'Неизвестная ошибка сервера'; + return { error: message, ok: false }; + } +}