Files
trackgo-be/src/modules/field/visits/visits-read.controller.ts
T
shancheas 365a37b8d2 Add attendance and visit management features with database schema updates
- Introduced new `attendances` and `visits` tables to manage employee attendance and customer visits, including relevant fields for check-in and check-out details.
- Updated `company_settings` to include a `check_in_radius_meters` column for attendance validation.
- Implemented foreign key constraints to ensure data integrity between `attendances`, `visits`, `employees`, `branches`, and other related entities.
- Created new services and controllers for handling attendance and visit operations, including check-in, check-out, and bulk actions.
- Enhanced DTOs for attendance and visit data transfer, including validation for input data.
- Added unit and integration tests to validate the new functionalities and ensure proper handling of attendance and visit records.
- Created migration scripts to apply the necessary database schema changes for the new features.
2026-09-01 12:27:51 +07:00

75 lines
2.2 KiB
TypeScript

import { Controller, Get, Param, ParseUUIDPipe, Query } from '@nestjs/common';
import {
ApiBearerAuth,
ApiForbiddenResponse,
ApiNotFoundResponse,
ApiOkResponse,
ApiOperation,
ApiTags,
ApiUnauthorizedResponse,
} from '@nestjs/swagger';
import { CurrentUser } from '../../../common/decorators/current-user.decorator';
import { RequirePrivilege } from '../../../common/decorators/require-privilege.decorator';
import {
Pagination,
type PaginationResponse,
PaginationMetaDto,
} from '../../../common/http/response';
import { BEARER_AUTH_NAME } from '../../../common/swagger/setup-swagger';
import { FIELD_VISIT_PRIVILEGE_KEY } from '../shared/field-purpose';
import { ListVisitsQueryDto, VisitDto } from './dto/visit.dto';
import { VisitsService } from './visits.service';
@ApiTags('visits')
@ApiBearerAuth(BEARER_AUTH_NAME)
@Controller('visits')
export class VisitsReadController {
constructor(private readonly visitsService: VisitsService) {}
@Get('current')
@RequirePrivilege(FIELD_VISIT_PRIVILEGE_KEY, 'view')
@ApiOperation({ summary: 'Get the open visit for the current user' })
@ApiOkResponse({ type: VisitDto })
@ApiUnauthorizedResponse()
@ApiForbiddenResponse()
current(@CurrentUser('id') userId: string): Promise<VisitDto | null> {
return this.visitsService.findCurrent(userId);
}
@Get()
@Pagination()
@RequirePrivilege(FIELD_VISIT_PRIVILEGE_KEY, 'view')
@ApiOperation({ summary: 'List visits' })
@ApiOkResponse({
schema: {
properties: {
data: {
type: 'array',
items: { $ref: '#/components/schemas/VisitDto' },
},
meta: { $ref: '#/components/schemas/PaginationMetaDto' },
},
},
})
@ApiUnauthorizedResponse()
@ApiForbiddenResponse()
list(
@Query() query: ListVisitsQueryDto,
): Promise<PaginationResponse<VisitDto>> {
return this.visitsService.list(query);
}
@Get(':id')
@RequirePrivilege(FIELD_VISIT_PRIVILEGE_KEY, 'view')
@ApiOperation({ summary: 'Get visit detail' })
@ApiOkResponse({ type: VisitDto })
@ApiNotFoundResponse()
@ApiUnauthorizedResponse()
@ApiForbiddenResponse()
findOne(@Param('id', ParseUUIDPipe) id: string): Promise<VisitDto> {
return this.visitsService.findById(id);
}
}
void PaginationMetaDto;