1
1
import { PrismaClient , prisma } from "~/db.server" ;
2
+ import { TestSearchParams } from "~/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.test/route" ;
3
+ import { sortEnvironments } from "~/services/environmentSort.server" ;
4
+ import { createSearchParams } from "~/utils/searchParams" ;
2
5
import { getUsername } from "~/utils/username" ;
3
6
4
7
type TaskListOptions = {
5
8
userId : string ;
6
9
projectSlug : string ;
10
+ url : string ;
7
11
} ;
8
12
9
13
export type TaskList = Awaited < ReturnType < TestPresenter [ "call" ] > > ;
10
- export type TaskListItem = TaskList [ "tasks" ] [ 0 ] ;
14
+ export type TaskListItem = NonNullable < TaskList [ "tasks" ] > [ 0 ] ;
15
+ export type SelectedEnvironment = NonNullable < TaskList [ "selectedEnvironment" ] > ;
11
16
12
17
export class TestPresenter {
13
18
#prismaClient: PrismaClient ;
@@ -16,7 +21,7 @@ export class TestPresenter {
16
21
this . #prismaClient = prismaClient ;
17
22
}
18
23
19
- public async call ( { userId, projectSlug } : TaskListOptions ) {
24
+ public async call ( { userId, projectSlug, url } : TaskListOptions ) {
20
25
// Find the project scoped to the organization
21
26
const project = await this . #prismaClient. project . findFirstOrThrow ( {
22
27
select : {
@@ -26,17 +31,18 @@ export class TestPresenter {
26
31
id : true ,
27
32
type : true ,
28
33
slug : true ,
29
- orgMember : {
30
- select : {
31
- user : {
32
- select : {
33
- id : true ,
34
- name : true ,
35
- displayName : true ,
36
- } ,
34
+ } ,
35
+ where : {
36
+ OR : [
37
+ {
38
+ orgMember : null ,
39
+ } ,
40
+ {
41
+ orgMember : {
42
+ userId,
37
43
} ,
38
44
} ,
39
- } ,
45
+ ] ,
40
46
} ,
41
47
} ,
42
48
} ,
@@ -45,55 +51,72 @@ export class TestPresenter {
45
51
} ,
46
52
} ) ;
47
53
54
+ const environments = sortEnvironments (
55
+ project . environments . map ( ( environment ) => ( {
56
+ id : environment . id ,
57
+ type : environment . type ,
58
+ slug : environment . slug ,
59
+ } ) )
60
+ ) ;
61
+
62
+ const searchParams = createSearchParams ( url , TestSearchParams ) ;
63
+
64
+ //no environmentId
65
+ if ( ! searchParams . success || ! searchParams . params . get ( "environment" ) ) {
66
+ return {
67
+ hasSelectedEnvironment : false as const ,
68
+ environments,
69
+ } ;
70
+ }
71
+
72
+ //is the environmentId valid?
73
+ const matchingEnvironment = project . environments . find (
74
+ ( env ) => env . slug === searchParams . params . get ( "environment" )
75
+ ) ;
76
+ if ( ! matchingEnvironment ) {
77
+ return {
78
+ hasSelectedEnvironment : false as const ,
79
+ environments,
80
+ } ;
81
+ }
82
+
48
83
//get all possible tasks
49
84
const tasks = await this . #prismaClient. $queryRaw <
50
85
{
51
86
id : string ;
52
87
version : string ;
53
- runtimeEnvironmentId : string ;
54
88
taskIdentifier : string ;
55
89
filePath : string ;
56
90
exportName : string ;
57
91
friendlyId : string ;
58
92
} [ ]
59
- > `
60
- WITH workers AS (
93
+ > `WITH workers AS (
61
94
SELECT
62
95
bw.*,
63
- ROW_NUMBER() OVER(PARTITION BY bw."runtimeEnvironmentId" ORDER BY string_to_array(bw.version, '.')::int[] DESC) AS rn
96
+ ROW_NUMBER() OVER(ORDER BY string_to_array(bw.version, '.')::int[] DESC) AS rn
64
97
FROM
65
98
"BackgroundWorker" bw
66
- WHERE "projectId " = ${ project . id }
99
+ WHERE "runtimeEnvironmentId " = ${ matchingEnvironment . id }
67
100
),
68
101
latest_workers AS (SELECT * FROM workers WHERE rn = 1)
69
- SELECT "BackgroundWorkerTask".id, version, "BackgroundWorkerTask"."runtimeEnvironmentId", slug as "taskIdentifier", "filePath", "exportName", "BackgroundWorkerTask"."friendlyId"
102
+ SELECT "BackgroundWorkerTask".id, version, slug as "taskIdentifier", "filePath", "exportName", "BackgroundWorkerTask"."friendlyId"
70
103
FROM latest_workers
71
- JOIN "BackgroundWorkerTask" ON "BackgroundWorkerTask"."workerId" = latest_workers.id;;
104
+ JOIN "BackgroundWorkerTask" ON "BackgroundWorkerTask"."workerId" = latest_workers.id
105
+ ORDER BY "BackgroundWorkerTask"."exportName" ASC;
72
106
` ;
73
107
74
108
return {
109
+ hasSelectedEnvironment : true as const ,
110
+ environments,
111
+ selectedEnvironment : matchingEnvironment ,
75
112
tasks : tasks . map ( ( task ) => {
76
- const environment = project . environments . find (
77
- ( env ) => env . id === task . runtimeEnvironmentId
78
- ) ;
79
-
80
- if ( ! environment ) {
81
- throw new Error ( `Environment not found for Task ${ task . id } ` ) ;
82
- }
83
-
84
113
return {
85
114
id : task . id ,
86
115
version : task . version ,
87
116
taskIdentifier : task . taskIdentifier ,
88
117
filePath : task . filePath ,
89
118
exportName : task . exportName ,
90
119
friendlyId : task . friendlyId ,
91
- environment : {
92
- type : environment . type ,
93
- slug : environment . slug ,
94
- userId : environment . orgMember ?. user . id ,
95
- userName : getUsername ( environment . orgMember ?. user ) ,
96
- } ,
97
120
} ;
98
121
} ) ,
99
122
} ;
0 commit comments