Files
v3-api/src/business-hours/business-hours.controller.ts

157 lines
4.8 KiB
TypeScript

import {
Controller,
Get,
Post,
Put,
Patch,
Body,
Param,
UseGuards,
HttpStatus,
HttpException,
} from '@nestjs/common';
import {
ApiBearerAuth,
ApiOperation,
ApiTags,
ApiParam,
ApiResponse,
ApiBody,
} from '@nestjs/swagger';
import { AdminGuard } from 'src/auth/guards/admin.guard';
import { AdminIdentity } from 'src/common/decorators/Identity.decorator';
import { Permissions } from 'src/common/decorators/permission.decorator';
import { Permission } from 'src/common/types/permissions.catalog';
import { AdminModel } from 'src/database/model/admin.model';
import { BusinessHoursService } from './business-hours.service';
import { CreateBusinessHoursDto } from './dto/create-business-hours.dto';
import { BaseResponseDTO } from 'src/common/dto/base-response.dto';
import { Public } from 'src/auth/auth.decorator';
@ApiBearerAuth()
@UseGuards(AdminGuard)
@Permissions(Permission.BusinessHoursManage)
@ApiTags('business-hours')
@Controller('admin/business-hours')
export class BusinessHoursController {
constructor(private readonly businessHoursService: BusinessHoursService) {}
@Get()
@ApiOperation({ summary: 'Get all business hours configurations' })
@ApiResponse({ status: 200, description: 'List of all configurations' })
async getAllConfigs(@AdminIdentity() admin: AdminModel) {
try {
const configs = await this.businessHoursService.getAllConfigs();
return new BaseResponseDTO(
HttpStatus.OK,
'Business hours configurations retrieved successfully',
configs,
);
} catch (error) {
throw new HttpException(
error.message || 'Failed to retrieve configurations',
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
@Get('status')
@Public()
@ApiOperation({ summary: 'Get current business hours status (public)' })
@ApiResponse({ status: 200, description: 'Current status' })
async getStatus() {
try {
const status = await this.businessHoursService.isOpen();
const nextOpen = await this.businessHoursService.getNextOpen();
const config = await this.businessHoursService.getActiveConfig();
return new BaseResponseDTO(HttpStatus.OK, 'Status retrieved successfully', {
open: status.open,
nextOpen: nextOpen?.toISOString() || null,
timezone: config?.timezone || null,
currentWindow: status.currentWindow || null,
});
} catch (error) {
throw new HttpException(
error.message || 'Failed to get status',
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
@Post()
@ApiOperation({ summary: 'Create a new business hours configuration' })
@ApiBody({ type: CreateBusinessHoursDto })
@ApiResponse({ status: 201, description: 'Configuration created' })
async createConfig(
@Body() createDto: CreateBusinessHoursDto,
@AdminIdentity() admin: AdminModel,
) {
try {
const config = await this.businessHoursService.createConfig(
createDto as any,
admin.username,
);
return new BaseResponseDTO(
HttpStatus.CREATED,
'Business hours configuration created successfully',
config,
);
} catch (error) {
throw new HttpException(
error.message || 'Failed to create configuration',
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
@Put(':id')
@ApiOperation({ summary: 'Update an existing business hours configuration' })
@ApiParam({ name: 'id', description: 'Configuration ID' })
@ApiBody({ type: CreateBusinessHoursDto })
@ApiResponse({ status: 200, description: 'Configuration updated' })
async updateConfig(
@Param('id') id: string,
@Body() updateDto: CreateBusinessHoursDto,
@AdminIdentity() admin: AdminModel,
) {
try {
const config = await this.businessHoursService.updateConfig(
id,
updateDto as any,
admin.username,
);
return new BaseResponseDTO(
HttpStatus.OK,
'Business hours configuration updated successfully',
config,
);
} catch (error) {
throw new HttpException(
error.message || 'Failed to update configuration',
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
@Patch(':id/deactivate')
@ApiOperation({ summary: 'Deactivate a business hours configuration' })
@ApiParam({ name: 'id', description: 'Configuration ID' })
@ApiResponse({ status: 200, description: 'Configuration deactivated' })
async deactivateConfig(@Param('id') id: string) {
try {
await this.businessHoursService.deactivateConfig(id);
return new BaseResponseDTO(
HttpStatus.OK,
'Business hours configuration deactivated successfully',
null,
);
} catch (error) {
throw new HttpException(
error.message || 'Failed to deactivate configuration',
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
}