11import { Task_Priority , Task_Status , Organization } from '@prisma/client' ;
2- import { isAdmin , isUnderWordCount , notGuest , Task , TaskCardPreview , WbsNumber , wbsPipe , User } from 'shared' ;
2+ import {
3+ CalendarTask ,
4+ FilterTaskArgs ,
5+ isAdmin ,
6+ isUnderWordCount ,
7+ notGuest ,
8+ Task ,
9+ TaskCardPreview ,
10+ WbsNumber ,
11+ wbsPipe ,
12+ User
13+ } from 'shared' ;
314import prisma from '../prisma/prisma.js' ;
4- import taskTransformer , { taskCardPreviewTransformer } from '../transformers/tasks.transformer.js' ;
15+ import taskTransformer , { calendarTaskTransformer , taskCardPreviewTransformer } from '../transformers/tasks.transformer.js' ;
516import {
617 NotFoundException ,
718 AccessDeniedException ,
@@ -13,7 +24,11 @@ import { sendSlackTaskAssignedNotificationToUsers } from '../utils/tasks.utils.j
1324import { getUsers , userHasPermission } from '../utils/users.utils.js' ;
1425import { wbsNumOf } from '../utils/utils.js' ;
1526import { getTeamQueryArgs } from '../prisma-query-args/teams.query-args.js' ;
16- import { getTaskPreviewQueryArgs , getTaskQueryArgs } from '../prisma-query-args/tasks.query-args.js' ;
27+ import {
28+ getCalendarTaskQueryArgs ,
29+ getTaskPreviewQueryArgs ,
30+ getTaskQueryArgs
31+ } from '../prisma-query-args/tasks.query-args.js' ;
1732import { getProjectQueryArgs } from '../prisma-query-args/projects.query-args.js' ;
1833
1934export default class TasksService {
@@ -281,6 +296,66 @@ export default class TasksService {
281296 return deletedTask . taskId ;
282297 }
283298
299+ static async getFilteredTasks ( filters : FilterTaskArgs , organization : Organization ) : Promise < CalendarTask [ ] > {
300+ const { memberIds, teamIds, startPeriod, endPeriod } = filters ;
301+
302+ // Validate memberIds if provided
303+ if ( memberIds && memberIds . length > 0 ) {
304+ const users = await prisma . user . findMany ( {
305+ where : { userId : { in : memberIds } , organizations : { some : { organizationId : organization . organizationId } } }
306+ } ) ;
307+ if ( users . length !== memberIds . length ) {
308+ throw new NotFoundException ( 'User' , 'one or more member IDs' ) ;
309+ }
310+ }
311+
312+ // Validate teamIds if provided
313+ if ( teamIds && teamIds . length > 0 ) {
314+ const teams = await prisma . team . findMany ( {
315+ where : {
316+ teamId : { in : teamIds } ,
317+ organizationId : organization . organizationId
318+ }
319+ } ) ;
320+ if ( teams . length !== teamIds . length ) {
321+ throw new NotFoundException ( 'Team' , 'one or more team IDs' ) ;
322+ }
323+ }
324+
325+ const orFilters : any [ ] = [ ] ;
326+ if ( memberIds && memberIds . length > 0 ) {
327+ orFilters . push ( { assignees : { some : { userId : { in : memberIds } } } } ) ;
328+ orFilters . push ( { createdByUserId : { in : memberIds } } ) ;
329+ }
330+ if ( teamIds && teamIds . length > 0 ) {
331+ orFilters . push ( {
332+ wbsElement : {
333+ project : {
334+ teams : { some : { teamId : { in : teamIds } } }
335+ }
336+ }
337+ } ) ;
338+ }
339+
340+ const tasks = await prisma . task . findMany ( {
341+ where : {
342+ dateDeleted : null ,
343+ deadline : {
344+ gte : startPeriod ,
345+ lte : endPeriod
346+ } ,
347+ wbsElement : {
348+ organizationId : organization . organizationId ,
349+ dateDeleted : null
350+ } ,
351+ ...( orFilters . length > 0 ? { OR : orFilters } : { } )
352+ } ,
353+ ...getCalendarTaskQueryArgs ( organization . organizationId )
354+ } ) ;
355+
356+ return tasks . map ( calendarTaskTransformer ) ;
357+ }
358+
284359 static async getOverdueTasksByTeamLeadership ( userId : string , organization : Organization ) : Promise < TaskCardPreview [ ] > {
285360 const teams = await prisma . team . findMany ( {
286361 where : {
0 commit comments