Skip to content

Commit eb881c4

Browse files
committed
fix: scoped the response for list and search permits
- Updated types for list and search permits to include activity and activityContact Signed-off-by: Sanjay Babu <sanjaytkbabu@gmail.com>
1 parent a3745be commit eb881c4

8 files changed

Lines changed: 58 additions & 8 deletions

File tree

app/src/routes/v1/permit.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
import { hasAccess, hasAuthorization } from '../../middleware/authorization.ts';
1111
import { requireSomeAuth } from '../../middleware/requireSomeAuth.ts';
1212
import { requireSomeGroup } from '../../middleware/requireSomeGroup.ts';
13+
import { filterActivityResponseByScope } from '../../middleware/responseFiltering.ts';
1314
import { Action, Resource } from '../../utils/enums/application.ts';
1415
import { permitValidator } from '../../validators/index.ts';
1516

@@ -18,7 +19,13 @@ router.use(requireSomeAuth);
1819
router.use(requireSomeGroup);
1920

2021
/** Get a list of permits */
21-
router.get('/', hasAuthorization(Resource.PERMIT, Action.READ), permitValidator.listPermits, listPermitsController);
22+
router.get(
23+
'/',
24+
hasAuthorization(Resource.PERMIT, Action.READ),
25+
permitValidator.listPermits,
26+
filterActivityResponseByScope,
27+
listPermitsController
28+
);
2229

2330
/** Create or update a permit */
2431
router.put('/', hasAuthorization(Resource.PERMIT, Action.CREATE), permitValidator.upsertPermit, upsertPermitController);
@@ -37,6 +44,7 @@ router.get(
3744
'/search',
3845
hasAuthorization(Resource.PERMIT, Action.READ),
3946
permitValidator.searchPermits,
47+
filterActivityResponseByScope,
4048
searchPermitsController
4149
);
4250

app/src/services/permit.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66
Permit,
77
PermitBase,
88
PermitSearchParams,
9+
PermitWithActivityProject,
910
SearchPermitsOptions
1011
} from '../types/index.ts';
1112

@@ -65,6 +66,11 @@ export const listPermits = async (tx: PrismaTransactionClient, options?: ListPer
6566
}
6667
},
6768
include: {
69+
activity: {
70+
include: {
71+
activityContact: true
72+
}
73+
},
6874
permitType: true,
6975
permitNote: options?.includeNotes ? { orderBy: { createdAt: 'desc' } } : false,
7076
permitTracking: {
@@ -148,7 +154,7 @@ export const searchPermitsPaginated = async (
148154
tx: PrismaTransactionClient,
149155
initiative: Exclude<Initiative, Initiative.PCNS>,
150156
options: SearchPermitsOptions
151-
): Promise<{ permits: Permit[]; totalRecords: number }> => {
157+
): Promise<{ permits: PermitWithActivityProject[]; totalRecords: number }> => {
152158
// Determine project table based on initiative, exclude PCNS
153159
const projectTableMap: Record<Exclude<Initiative, Initiative.PCNS>, string> = {
154160
[Initiative.ELECTRIFICATION]: 'electrificationProject',
@@ -252,6 +258,7 @@ export const searchPermitsPaginated = async (
252258
},
253259
activity: {
254260
include: {
261+
activityContact: true,
255262
[projectTable]: true
256263
}
257264
}
@@ -268,7 +275,7 @@ export const searchPermitsPaginated = async (
268275
...activityData,
269276
project: projectData
270277
}
271-
};
278+
} as unknown as PermitWithActivityProject;
272279
});
273280

274281
return { permits: permitsWithProjectAlias, totalRecords };

app/src/types/models.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ export type AccessRequestPatch = Omit<Prisma.access_requestUpdateInput, 'accessR
88

99
const activityBase = Prisma.validator<Prisma.activityDefaultArgs>()({});
1010
export type ActivityBase = Prisma.activityGetPayload<typeof activityBase>;
11-
export type Activity = ActivityBase & { activityContact?: ActivityContact[]; initiative?: Initiative };
11+
export type Activity = ActivityBase & {
12+
activityContact?: ActivityContact[];
13+
initiative?: Initiative;
14+
project?: ElectrificationProject | GeneralProject | HousingProject | null;
15+
};
1216

1317
const activityContactBase = Prisma.validator<Prisma.activity_contactDefaultArgs>()({});
1418
export type ActivityContactBase = Prisma.activity_contactGetPayload<typeof activityContactBase>;
@@ -107,6 +111,7 @@ const permitBase = Prisma.validator<Prisma.permitDefaultArgs>()({});
107111
type PermitBasePrisma = Prisma.permitGetPayload<typeof permitBase>;
108112
export type PermitBase = Omit<PermitBasePrisma, PermitDateTimeKeys> & Record<PermitDateTimeKeys, string | null>;
109113
export type Permit = PermitBase & {
114+
activity?: Activity;
110115
permitNote?: PermitNote[];
111116
permitTracking?: PermitTracking[];
112117
permitType?: PermitType;

app/src/types/stuff.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { ApplicationStatus, SubmissionType } from '../utils/enums/projectCommon.
88

99
import type {
1010
AccessRequest,
11+
Activity,
1112
Contact,
1213
ElectrificationProject,
1314
GeneralProject,
@@ -393,6 +394,12 @@ export interface PermitUpdateEmailParams {
393394
emailTemplate: EmailTemplate;
394395
}
395396

397+
export interface PermitWithActivityProject extends Permit {
398+
activity: Activity & {
399+
project: ElectrificationProject | GeneralProject | HousingProject | null;
400+
};
401+
}
402+
396403
export interface UpdatedPermitWithNote {
397404
permit: Permit;
398405
note: string | undefined;

app/tests/unit/controllers/permit.spec.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import type {
4646
ListPermitsOptions,
4747
Permit,
4848
PermitUpdateEmailParams,
49+
PermitWithActivityProject,
4950
SearchPermitsOptions
5051
} from '../../../src/types/index.ts';
5152

@@ -183,6 +184,14 @@ describe('listPermitsController', () => {
183184
describe('searchPermitsController', () => {
184185
const searchSpy = vi.spyOn(permitService, 'searchPermitsPaginated');
185186

187+
const TEST_PERMIT_WITH_HOUSING_PROJECT: PermitWithActivityProject = {
188+
...TEST_PERMIT_1,
189+
activity: {
190+
...TEST_ACTIVITY_HOUSING,
191+
project: TEST_HOUSING_PROJECT_1
192+
}
193+
};
194+
186195
it('should call services and respond with 200 and paginated results', async () => {
187196
const req = {
188197
query: {
@@ -201,7 +210,7 @@ describe('searchPermitsController', () => {
201210
};
202211

203212
const mockResponse = {
204-
permits: TEST_PERMIT_LIST,
213+
permits: [TEST_PERMIT_WITH_HOUSING_PROJECT],
205214
totalRecords: 25
206215
};
207216

@@ -259,7 +268,7 @@ describe('searchPermitsController', () => {
259268
};
260269

261270
const mockResponse = {
262-
permits: [TEST_PERMIT_1],
271+
permits: [TEST_PERMIT_WITH_HOUSING_PROJECT],
263272
totalRecords: 1
264273
};
265274

app/tests/unit/services/permit.spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ describe('listPermits', () => {
5959
}
6060
},
6161
include: {
62+
activity: {
63+
include: {
64+
activityContact: true
65+
}
66+
},
6267
permitType: true,
6368
permitNote: false,
6469
permitTracking: {
@@ -245,6 +250,7 @@ describe('searchPermitsPaginated', () => {
245250
},
246251
activity: {
247252
include: {
253+
activityContact: true,
248254
housingProject: true
249255
}
250256
}
@@ -293,6 +299,7 @@ describe('searchPermitsPaginated', () => {
293299
},
294300
activity: {
295301
include: {
302+
activityContact: true,
296303
electrificationProject: true
297304
}
298305
}

frontend/src/types/api/resources.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,13 +373,20 @@ interface PermitBase extends AuditFields {
373373
}
374374

375375
interface PermitRelations {
376+
activity: Activity;
376377
permitNote: PermitNote[];
377378
permitTracking: PermitTracking[];
378379
permitType: PermitType;
379380
}
380381

381382
export type Permit = PermitBase & Partial<PermitRelations>;
382383

384+
export interface PermitWithActivityProject extends Permit {
385+
activity: Activity & {
386+
project: ElectrificationProject | GeneralProject | HousingProject | null;
387+
};
388+
}
389+
383390
/**
384391
* Permit Note
385392
*/

frontend/src/types/api/responses.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { BasicResponse } from '@/utils/enums/application';
2-
import type { ActivityContact, Group, Permit } from './resources';
2+
import type { ActivityContact, Group, PermitWithActivityProject } from './resources';
33
import type { SsoIdirUserAttributes } from '../oidc';
44
import type { ContactPreference, ProjectRelationship } from '@/utils/enums/projectCommon';
55
import type { CodeTableName } from '../common';
@@ -76,7 +76,7 @@ export interface ListIdirUsersResponse {
7676
}
7777

7878
export interface SearchPermitsResponse {
79-
permits: Permit[];
79+
permits: PermitWithActivityProject[];
8080
totalRecords: number;
8181
}
8282

0 commit comments

Comments
 (0)