order: check client & master active before create

This commit is contained in:
vchikalkin 2025-06-27 12:35:04 +03:00
parent b357571fea
commit c26ad36781

View File

@ -1,21 +1,23 @@
const ERR_INVALID_TIME = 'Некорректное время'; const ERR_INVALID_TIME = 'Некорректное время';
const ERR_OVERLAPPING_TIME = 'Время пересекается с другими заказами'; const ERR_OVERLAPPING_TIME = 'Время пересекается с другими заказами';
const ERR_INACTIVE_CLIENT = 'Клиент не активен';
const ERR_INACTIVE_MASTER = 'Мастер не активен';
function timeToDate(time: string) { function timeToDate(time: string) {
return new Date(`1970-01-01T${time}Z`); return new Date(`1970-01-01T${time}Z`);
} }
function extractSlotId(slotField: any): number | null { function extractId(input: any): number | null {
if (typeof slotField === 'number') { if (typeof input === 'number') {
return slotField; return input;
} }
if (slotField?.id) { if (input?.id) {
return slotField.id; return input.id;
} }
if (slotField?.set?.[0]?.id) { if (input?.set?.[0]?.id) {
return slotField.set[0].id; return input.set[0].id;
} }
return null; return null;
@ -24,9 +26,10 @@ function extractSlotId(slotField: any): number | null {
export default { export default {
async beforeCreate(event) { async beforeCreate(event) {
const { data } = event.params; const { data } = event.params;
const { time_start, time_end } = data; const { time_start, time_end, client } = data;
const clientId = extractId(client);
const slotId = extractSlotId(data.slot); const slotId = extractId(data.slot);
if (!time_start || !time_end) { if (!time_start || !time_end) {
throw new Error(ERR_INVALID_TIME); throw new Error(ERR_INVALID_TIME);
@ -36,6 +39,34 @@ export default {
throw new Error(ERR_INVALID_TIME); throw new Error(ERR_INVALID_TIME);
} }
const isClientActive = await strapi.db
.query('api::customer.customer')
.findOne({
where: {
id: clientId,
active: true,
},
});
if (!isClientActive) {
throw new Error(ERR_INACTIVE_CLIENT);
}
const slot = await strapi.db.query('api::slot.slot').findOne({
where: {
id: slotId,
},
populate: ['master'],
});
const master = slot.master;
const isMasterActive = master.active && master.role === 'master';
if (!isMasterActive) {
throw new Error(ERR_INACTIVE_MASTER);
}
const overlappingEntities = await strapi.db const overlappingEntities = await strapi.db
.query('api::order.order') .query('api::order.order')
.findMany({ .findMany({
@ -46,6 +77,9 @@ export default {
slot: { slot: {
id: { $ne: slotId }, id: { $ne: slotId },
}, },
state: {
$notIn: ['cancelled', 'completed'],
},
}, },
populate: ['slot'], populate: ['slot'],
}); });