Skip to content

Commit 991aac8

Browse files
committed
Append fields to where in v4 publish
1 parent fd1b315 commit 991aac8

File tree

4 files changed

+39
-31
lines changed

4 files changed

+39
-31
lines changed

src/published-data/interfaces/published-data.interface.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
22
import { FilterQuery } from "mongoose";
33
import { PublishedDataDocument } from "../schemas/published-data.schema";
4+
import { ILimitsFilter } from "src/common/interfaces/common.interface";
45

56
export interface IPublishedDataFilters {
67
where?: FilterQuery<PublishedDataDocument>;
78
include?: { relation: string }[];
89
fields?: {
910
status: string;
1011
};
11-
limits?: {
12-
skip: number;
13-
limit: number;
14-
order: string;
15-
};
12+
limits?: ILimitsFilter;
1613
}
1714

1815
export class ICount {
Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,32 @@
11
import { FilterPipe } from "src/common/pipes/filter.pipe";
2-
import { PublishedData } from "../schemas/published-data.schema";
2+
import {
3+
PublishedData,
4+
PublishedDataDocument,
5+
} from "../schemas/published-data.schema";
36
import { publishedDataV3toV4FieldMap } from "../dto/published-data.obsolete.dto";
4-
import { JsonToStringPipe } from "src/common/pipes/json-to-string.pipe";
7+
import { PipeTransform } from "@nestjs/common";
8+
import { isEmpty } from "lodash";
9+
import { IPublishedDataFilters } from "../interfaces/published-data.interface";
10+
import { FilterQuery } from "mongoose";
11+
12+
class AppendFieldsToFilterPipe implements PipeTransform {
13+
transform(value: {
14+
filter: IPublishedDataFilters;
15+
fields: FilterQuery<PublishedDataDocument>;
16+
}) {
17+
if (isEmpty(value.fields)) return value;
18+
const filter = value.filter ?? {};
19+
if (isEmpty(filter.where)) filter.where = value.fields;
20+
else filter.where = { $and: [value.fields, filter.where] };
21+
return { ...value, filter };
22+
}
23+
}
524

625
export const V3_FILTER_PIPE = [
726
new FilterPipe<PublishedData>({ apiToDBMap: publishedDataV3toV4FieldMap }),
827
];
928

1029
export const V4_FILTER_PIPE = [
1130
new FilterPipe<PublishedData>({ allowObjectFields: false }),
12-
new JsonToStringPipe("fields"),
13-
new JsonToStringPipe("limits"),
31+
new AppendFieldsToFilterPipe(),
1432
];

src/published-data/published-data.v4.controller.ts

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import {
5757
PublishedDataDocument,
5858
} from "./schemas/published-data.schema";
5959
import { V4_FILTER_PIPE } from "./pipes/filter.pipe";
60+
import { ILimitsFilter } from "src/common/interfaces/common.interface";
6061

6162
@ApiBearerAuth()
6263
@ApiTags("published data v4")
@@ -120,24 +121,20 @@ export class PublishedDataV4Controller {
120121
@Query(...V4_FILTER_PIPE, RegisteredFilterPipe)
121122
filter?: {
122123
filter: IPublishedDataFilters;
123-
fields: string;
124-
limits: string;
124+
fields: FilterQuery<PublishedDataDocument>;
125+
limits: ILimitsFilter;
125126
},
126127
) {
127128
const publishedDataFilters: IPublishedDataFilters = filter?.filter ?? {};
128129
const publishedDataLimits: {
129-
skip: number;
130-
limit: number;
131-
order: string;
132-
} = JSON.parse(filter?.limits ?? "{}");
133-
const publishedDataFields = JSON.parse(filter?.fields ?? "{}");
130+
skip?: number;
131+
limit?: number;
132+
order?: string;
133+
} = filter?.limits ?? {};
134134

135135
if (!publishedDataFilters.limits) {
136136
publishedDataFilters.limits = publishedDataLimits;
137137
}
138-
if (!publishedDataFilters.fields) {
139-
publishedDataFilters.fields = publishedDataFields;
140-
}
141138

142139
const ability = this.caslAbilityFactory.publishedDataInstanceAccess(
143140
request.user as JWTUser,
@@ -180,13 +177,10 @@ export class PublishedDataV4Controller {
180177
@Query(...V4_FILTER_PIPE, RegisteredFilterPipe)
181178
filter?: {
182179
filter: IPublishedDataFilters;
183-
fields: string;
180+
fields: FilterQuery<PublishedDataDocument>;
184181
},
185182
) {
186183
const jsonFilters: IPublishedDataFilters = filter?.filter ?? {};
187-
const jsonFields: FilterQuery<PublishedDataDocument> = filter?.fields
188-
? JSON.parse(filter.fields)
189-
: {};
190184

191185
const ability = this.caslAbilityFactory.datasetInstanceAccess(
192186
request.user as JWTUser,
@@ -207,17 +201,15 @@ export class PublishedDataV4Controller {
207201
};
208202
}
209203

210-
const filters: FilterQuery<PublishedDataDocument> = {
211-
where: jsonFilters.where,
212-
fields: jsonFields,
213-
};
214-
215204
const options: QueryOptions = {
216205
limit: jsonFilters?.limits?.limit,
217206
skip: jsonFilters?.limits?.skip,
218207
};
219208

220-
return this.publishedDataService.countDocuments(filters, options);
209+
return this.publishedDataService.countDocuments(
210+
{ where: jsonFilters.where },
211+
options,
212+
);
221213
}
222214

223215
// GET /publisheddata/formpopulate

test/PublishedDataV4.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,9 @@ describe("1600: PublishedDataV4: Test of access to published data v4 endpoints",
103103

104104
it("0023: should fetch all published data as admin ingestor with fields", async () => {
105105
const limits = { skip: 0 };
106+
const fields = {createdBy: {$regex: "admin", $options: "i"}}
106107
return request(appUrl)
107-
.get(`/api/v4/PublishedData?fields=${encodeURIComponent(JSON.stringify({}))}&limits=${encodeURIComponent(JSON.stringify(limits))}`)
108+
.get(`/api/v4/PublishedData?fields=${encodeURIComponent(JSON.stringify(fields))}&limits=${encodeURIComponent(JSON.stringify(limits))}`)
108109
.set("Accept", "application/json")
109110
.set({ Authorization: `Bearer ${accessTokenAdminIngestor}` })
110111
.expect(TestData.SuccessfulGetStatusCode)
@@ -114,7 +115,7 @@ describe("1600: PublishedDataV4: Test of access to published data v4 endpoints",
114115
});
115116
});
116117

117-
it("0026: should fetch all published data as unatuh", async () => {
118+
it("0026: should fetch all published data as unatuh", async () => {
118119
return request(appUrl)
119120
.get("/api/v4/PublishedData")
120121
.set("Accept", "application/json")

0 commit comments

Comments
 (0)