fix(slots): update error messages for missing datetime fields and improve validation logic in slot updates

This commit is contained in:
vchikalkin 2025-08-04 22:05:08 +03:00
parent 6d86c0d2db
commit 3941377e78
2 changed files with 11 additions and 85 deletions

View File

@ -247,7 +247,7 @@ describe('SlotsService', () => {
const result = slotsService.updateSlot(variablesWithMissingStart);
await expect(result).rejects.toThrow(ERRORS.INVALID_TIME);
await expect(result).rejects.toThrow(ERRORS.MISSING_DATETIME_START);
});
it('should throw error when datetime_end is missing', async () => {
@ -284,7 +284,7 @@ describe('SlotsService', () => {
const result = slotsService.updateSlot(variablesWithMissingEnd);
await expect(result).rejects.toThrow(ERRORS.INVALID_TIME);
await expect(result).rejects.toThrow(ERRORS.MISSING_DATETIME_END);
});
it('should throw error when datetime_end is before datetime_start', async () => {
@ -606,76 +606,6 @@ describe('SlotsService', () => {
await expect(result).resolves.toBe(mockMutationResult.data);
});
it('should use existing slot times when only datetime_start is provided', async () => {
const variablesWithOnlyStart = {
data: {
datetime_start: '2024-01-01T09:00:00Z',
},
documentId: 'slot-123',
};
const mockMutate = vi.fn().mockResolvedValue(mockMutationResult);
const mockQuery = vi.fn().mockImplementation(({ query }) => {
if (query === GQL.GetCustomerDocument) {
return Promise.resolve(mockGetCustomerResult);
}
if (query === GQL.GetSlotDocument) {
return Promise.resolve(mockGetSlotResult);
}
if (query === GQL.GetSlotsDocument) {
return Promise.resolve({ data: { slots: [] } });
}
return Promise.resolve({ data: {} });
});
mockGetClientWithToken.mockResolvedValue({
mutate: mockMutate,
query: mockQuery,
});
const result = slotsService.updateSlot(variablesWithOnlyStart);
await expect(result).resolves.toBe(mockMutationResult.data);
});
it('should use existing slot times when only datetime_end is provided', async () => {
const variablesWithOnlyEnd = {
data: {
datetime_end: '2024-01-01T12:00:00Z',
},
documentId: 'slot-123',
};
const mockMutate = vi.fn().mockResolvedValue(mockMutationResult);
const mockQuery = vi.fn().mockImplementation(({ query }) => {
if (query === GQL.GetCustomerDocument) {
return Promise.resolve(mockGetCustomerResult);
}
if (query === GQL.GetSlotDocument) {
return Promise.resolve(mockGetSlotResult);
}
if (query === GQL.GetSlotsDocument) {
return Promise.resolve({ data: { slots: [] } });
}
return Promise.resolve({ data: {} });
});
mockGetClientWithToken.mockResolvedValue({
mutate: mockMutate,
query: mockQuery,
});
const result = slotsService.updateSlot(variablesWithOnlyEnd);
await expect(result).resolves.toBe(mockMutationResult.data);
});
});
describe('deleteSlot', () => {

View File

@ -11,7 +11,8 @@ import dayjs from 'dayjs';
export const ERRORS = {
HAS_ORDERS: 'Слот имеет активные заказы',
INVALID_TIME: 'Некорректное время',
MISSING_DATE: 'Не указана дата',
MISSING_DATETIME_END: 'Не указана дата окончания',
MISSING_DATETIME_START: 'Не указана дата начала',
MISSING_SERVICE_ID: 'Не указана услуга',
NO_PERMISSION: 'Нет доступа',
OVERLAPPING_TIME: 'Время пересекается с другими слотами',
@ -75,7 +76,7 @@ export class SlotsService extends BaseService {
variables: VariablesOf<typeof GQL.GetSlotsDocument>,
context: { service: GQL.ServiceFiltersInput },
) {
if (!variables.filters?.datetime_start) throw new Error(ERRORS.MISSING_DATE);
if (!variables.filters?.datetime_start) throw new Error(ERRORS.MISSING_DATETIME_START);
if (!context?.service?.documentId?.eq) throw new Error(ERRORS.MISSING_SERVICE_ID);
const { query } = await getClientWithToken();
@ -181,20 +182,15 @@ export class SlotsService extends BaseService {
if (!slot) throw new Error(ERRORS.SLOT_NOT_FOUND);
const isTimeChanging = variables?.data?.datetime_start || variables?.data?.datetime_end;
const datetime_start = variables.data.datetime_start;
const datetime_end = variables.data.datetime_end;
const isTimeChanging = datetime_start || datetime_end;
if (!isTimeChanging) return;
let datetime_start = variables.data.datetime_start;
let datetime_end = variables.data.datetime_end;
if (!datetime_start) datetime_start = slot?.datetime_start;
if (!datetime_end) datetime_end = slot?.datetime_end;
// Проверка: оба времени должны быть определены
if (!datetime_start || !datetime_end) {
throw new Error(ERRORS.INVALID_TIME);
}
if (!datetime_start) throw new Error(ERRORS.MISSING_DATETIME_START);
if (!datetime_end) throw new Error(ERRORS.MISSING_DATETIME_END);
// Проверка валидности времени
if (new Date(datetime_end) <= new Date(datetime_start)) {