Skip to content

Commit d342e64

Browse files
Merge pull request #15 from CropWatchDevelopment/develop
adding the ability to search, and filter values
2 parents 61f91de + 75101ad commit d342e64

2 files changed

Lines changed: 30 additions & 6 deletions

File tree

src/v1/devices/devices.controller.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,20 @@ export class DevicesController {
6565
description: `
6666
Returns all devices for the authenticated user.`,
6767
})
68+
@ApiQuery({ name: 'skip', description: 'Number of records to skip for pagination', required: false })
69+
@ApiQuery({ name: 'take', description: 'Number of records to take for pagination', required: false })
70+
@ApiQuery({ name: 'group', description: 'Filter by device group', required: false })
71+
@ApiQuery({ name: 'name', description: 'Filter by device name', required: false })
72+
@ApiQuery({ name: 'location', description: 'Filter by device location', required: false })
6873
findAll(@Req() req) {
6974
const parsedSkip = parseInt(req.query.skip, 10);
7075
const parsedTake = parseInt(req.query.take, 10);
7176
const skip = Number.isNaN(parsedSkip) ? 0 : parsedSkip;
7277
const take = Math.min(Number.isNaN(parsedTake) ? 100 : parsedTake, 1000);
73-
return this.devicesService.findAll(req.user, req.headers.authorization, skip, take);
78+
const searchGroup = req.query.group ? String(req.query.group) : undefined;
79+
const searchName = req.query.name ? String(req.query.name) : undefined;
80+
const searchLocation = req.query.location ? String(req.query.location) : undefined;
81+
return this.devicesService.findAll(req.user, req.headers.authorization, skip, take, searchGroup, searchName, searchLocation);
7482
}
7583

7684
@Get('status')
@@ -101,8 +109,8 @@ export class DevicesController {
101109

102110
@Get('latest-primary-data')
103111
@UseGuards(JwtAuthGuard)
104-
@ApiParam({ name: 'skip (0)', description: 'Number of records to skip for pagination', required: false })
105-
@ApiParam({ name: 'take (10)', description: 'Number of records to take for pagination', required: false })
112+
@ApiQuery({ name: 'skip', description: 'Number of records to skip for pagination', required: false })
113+
@ApiQuery({ name: 'take', description: 'Number of records to take for pagination', required: false })
106114
@ApiOperation({
107115
summary: 'Get the latest primary data for all devices (paginated)',
108116
description: `

src/v1/devices/devices.service.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ export class DevicesService {
2626
authHeader: string,
2727
skip: number = 0,
2828
take?: number,
29+
searchGroup?: string,
30+
searchName?: string,
31+
searchLocation?: string,
2932
): Promise<PagedDevicesResponse<TableRow<'cw_devices'>>> {
3033
const accessToken = getAccessToken(authHeader);
3134
const client = this.supabaseService.getClient(accessToken);
@@ -51,8 +54,19 @@ export class DevicesService {
5154
`)
5255
.eq('owner_match.user_id', userId)
5356
.gt('owner_match.permission_level', 4)
54-
.or(`user_id.eq.${userId},owner_match.not.is.null`)
55-
.order('name', { ascending: true });
57+
.or(`user_id.eq.${userId},owner_match.not.is.null`);
58+
59+
if (searchGroup) {
60+
devicesQuery = devicesQuery.ilike('group', `%${searchGroup}%`);
61+
}
62+
if (searchName) {
63+
devicesQuery = devicesQuery.ilike('name', `%${searchName}%`);
64+
}
65+
if (searchLocation) {
66+
devicesQuery = devicesQuery.ilike('location', `%${searchLocation}%`);
67+
}
68+
69+
devicesQuery = devicesQuery.order('name', { ascending: true });
5670

5771
if (resolvedTake > 0) {
5872
devicesQuery = devicesQuery
@@ -94,7 +108,9 @@ export class DevicesService {
94108
.select(`
95109
*,
96110
owner_match:cw_device_owners(),
97-
cw_device_owners(*)
111+
cw_device_owners(*),
112+
cw_locations(name, location_id),
113+
cw_device_type(*)
98114
`)
99115
.eq('dev_eui', normalizedDevEui)
100116
.eq('owner_match.user_id', userId)

0 commit comments

Comments
 (0)