1 | type Asana = { |
2 | token: string; |
3 | }; |
4 |
|
5 | * Search tasks in a workspace |
6 | * To mirror the functionality of the Asana web app's advanced search feature, the Asana API has a task search endpoint that allows you to build complex filters to find and retrieve the exact data you need. |
7 | */ |
8 | export async function main( |
9 | auth: Asana, |
10 | workspace_gid: string, |
11 | opt_pretty: string | undefined, |
12 | opt_fields: string | undefined, |
13 | text: string | undefined, |
14 | resource_subtype: "default_task" | "milestone" | undefined, |
15 | assignee_any: string | undefined, |
16 | assignee_not: string | undefined, |
17 | portfolios_any: string | undefined, |
18 | projects_any: string | undefined, |
19 | projects_not: string | undefined, |
20 | projects_all: string | undefined, |
21 | sections_any: string | undefined, |
22 | sections_not: string | undefined, |
23 | sections_all: string | undefined, |
24 | tags_any: string | undefined, |
25 | tags_not: string | undefined, |
26 | tags_all: string | undefined, |
27 | teams_any: string | undefined, |
28 | followers_not: string | undefined, |
29 | created_by_any: string | undefined, |
30 | created_by_not: string | undefined, |
31 | assigned_by_any: string | undefined, |
32 | assigned_by_not: string | undefined, |
33 | liked_by_not: string | undefined, |
34 | commented_on_by_not: string | undefined, |
35 | due_on_before: string | undefined, |
36 | due_on_after: string | undefined, |
37 | due_on: string | undefined, |
38 | due_at_before: string | undefined, |
39 | due_at_after: string | undefined, |
40 | start_on_before: string | undefined, |
41 | start_on_after: string | undefined, |
42 | start_on: string | undefined, |
43 | created_on_before: string | undefined, |
44 | created_on_after: string | undefined, |
45 | created_on: string | undefined, |
46 | created_at_before: string | undefined, |
47 | created_at_after: string | undefined, |
48 | completed_on_before: string | undefined, |
49 | completed_on_after: string | undefined, |
50 | completed_on: string | undefined, |
51 | completed_at_before: string | undefined, |
52 | completed_at_after: string | undefined, |
53 | modified_on_before: string | undefined, |
54 | modified_on_after: string | undefined, |
55 | modified_on: string | undefined, |
56 | modified_at_before: string | undefined, |
57 | modified_at_after: string | undefined, |
58 | is_blocking: string | undefined, |
59 | is_blocked: string | undefined, |
60 | has_attachment: string | undefined, |
61 | completed: string | undefined, |
62 | is_subtask: string | undefined, |
63 | sort_by: |
64 | | "due_date" |
65 | | "created_at" |
66 | | "completed_at" |
67 | | "likes" |
68 | | "modified_at" |
69 | | undefined, |
70 | sort_ascending: string | undefined |
71 | ) { |
72 | const url = new URL( |
73 | `https://app.asana.com/api/1.0/workspaces/${workspace_gid}/tasks/search` |
74 | ); |
75 | for (const [k, v] of [ |
76 | ["opt_pretty", opt_pretty], |
77 | ["opt_fields", opt_fields], |
78 | ["text", text], |
79 | ["resource_subtype", resource_subtype], |
80 | ["assignee.any", assignee_any], |
81 | ["assignee.not", assignee_not], |
82 | ["portfolios.any", portfolios_any], |
83 | ["projects.any", projects_any], |
84 | ["projects.not", projects_not], |
85 | ["projects.all", projects_all], |
86 | ["sections.any", sections_any], |
87 | ["sections.not", sections_not], |
88 | ["sections.all", sections_all], |
89 | ["tags.any", tags_any], |
90 | ["tags.not", tags_not], |
91 | ["tags.all", tags_all], |
92 | ["teams.any", teams_any], |
93 | ["followers.not", followers_not], |
94 | ["created_by.any", created_by_any], |
95 | ["created_by.not", created_by_not], |
96 | ["assigned_by.any", assigned_by_any], |
97 | ["assigned_by.not", assigned_by_not], |
98 | ["liked_by.not", liked_by_not], |
99 | ["commented_on_by.not", commented_on_by_not], |
100 | ["due_on.before", due_on_before], |
101 | ["due_on.after", due_on_after], |
102 | ["due_on", due_on], |
103 | ["due_at.before", due_at_before], |
104 | ["due_at.after", due_at_after], |
105 | ["start_on.before", start_on_before], |
106 | ["start_on.after", start_on_after], |
107 | ["start_on", start_on], |
108 | ["created_on.before", created_on_before], |
109 | ["created_on.after", created_on_after], |
110 | ["created_on", created_on], |
111 | ["created_at.before", created_at_before], |
112 | ["created_at.after", created_at_after], |
113 | ["completed_on.before", completed_on_before], |
114 | ["completed_on.after", completed_on_after], |
115 | ["completed_on", completed_on], |
116 | ["completed_at.before", completed_at_before], |
117 | ["completed_at.after", completed_at_after], |
118 | ["modified_on.before", modified_on_before], |
119 | ["modified_on.after", modified_on_after], |
120 | ["modified_on", modified_on], |
121 | ["modified_at.before", modified_at_before], |
122 | ["modified_at.after", modified_at_after], |
123 | ["is_blocking", is_blocking], |
124 | ["is_blocked", is_blocked], |
125 | ["has_attachment", has_attachment], |
126 | ["completed", completed], |
127 | ["is_subtask", is_subtask], |
128 | ["sort_by", sort_by], |
129 | ["sort_ascending", sort_ascending], |
130 | ]) { |
131 | if (v !== undefined && v !== "") { |
132 | url.searchParams.append(k, v); |
133 | } |
134 | } |
135 | const response = await fetch(url, { |
136 | method: "GET", |
137 | headers: { |
138 | Authorization: "Bearer " + auth.token, |
139 | }, |
140 | body: undefined, |
141 | }); |
142 | if (!response.ok) { |
143 | const text = await response.text(); |
144 | throw new Error(`${response.status} ${text}`); |
145 | } |
146 | return await response.json(); |
147 | } |
148 |
|