Skip to content

Commit bc17cff

Browse files
committed
Merge branch 'main' into feat-project-labels
2 parents 81ec4eb + 5939091 commit bc17cff

8 files changed

Lines changed: 193 additions & 84 deletions

File tree

src/lib/stores/oauth-providers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export const oAuthProviders: Record<string, Provider> = {
2727
apple: {
2828
name: 'Apple',
2929
icon: 'apple',
30-
docs: 'https://developer.apple.com/',
30+
docs: 'https://developer.apple.com/sign-in-with-apple/',
3131
component: Apple
3232
},
3333
auth0: {

src/lib/stores/uploader.ts

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Client, ID, type Models, Sites, Storage } from '@appwrite.io/console';
1+
import { Client, Functions, ID, type Models, Sites, Storage } from '@appwrite.io/console';
22
import { writable } from 'svelte/store';
33
import { getApiEndpoint } from '$lib/stores/sdk';
44
import { page } from '$app/state';
@@ -32,6 +32,13 @@ const temporarySites = (region: string, projectId: string) => {
3232
return new Sites(clientProject);
3333
};
3434

35+
const temporaryFunctions = (region: string, projectId: string) => {
36+
const clientProject = new Client().setMode('admin');
37+
const endpoint = getApiEndpoint(region);
38+
clientProject.setEndpoint(endpoint).setProject(projectId);
39+
return new Functions(clientProject);
40+
};
41+
3542
const createUploader = () => {
3643
const { subscribe, set, update } = writable<Uploader>({
3744
isOpen: false,
@@ -110,7 +117,19 @@ const createUploader = () => {
110117
newFile.status = 'success';
111118
updateFile(newFile.$id, newFile);
112119
},
113-
uploadSiteDeployment: async (siteId: string, code: File) => {
120+
uploadSiteDeployment: async ({
121+
siteId,
122+
code,
123+
buildCommand,
124+
installCommand,
125+
outputDirectory
126+
}: {
127+
siteId: string;
128+
code: File;
129+
buildCommand?: string;
130+
installCommand?: string;
131+
outputDirectory?: string;
132+
}) => {
114133
const newDeployment: UploaderFile = {
115134
$id: '',
116135
resourceId: siteId,
@@ -132,6 +151,49 @@ const createUploader = () => {
132151
siteId,
133152
code,
134153
activate: true,
154+
buildCommand,
155+
installCommand,
156+
outputDirectory,
157+
onProgress: (progress) => {
158+
newDeployment.$id = progress.$id;
159+
newDeployment.progress = progress.progress;
160+
newDeployment.status = progress.progress === 100 ? 'success' : 'pending';
161+
updateFile(progress.$id, newDeployment);
162+
}
163+
});
164+
newDeployment.$id = uploadedFile.$id;
165+
newDeployment.progress = 100;
166+
newDeployment.status = 'success';
167+
updateFile(newDeployment.$id, newDeployment);
168+
},
169+
uploadFunctionDeployment: async ({
170+
functionId,
171+
code
172+
}: {
173+
functionId: string;
174+
code: File;
175+
}) => {
176+
const newDeployment: UploaderFile = {
177+
$id: '',
178+
resourceId: functionId,
179+
name: code.name,
180+
size: code.size,
181+
progress: 0,
182+
status: 'pending'
183+
};
184+
update((n) => {
185+
n.isOpen = true;
186+
n.isCollapsed = false;
187+
n.files.unshift(newDeployment);
188+
return n;
189+
});
190+
const uploadedFile = await temporaryFunctions(
191+
page.params.region,
192+
page.params.project
193+
).createDeployment({
194+
functionId,
195+
code,
196+
activate: true,
135197
onProgress: (progress) => {
136198
newDeployment.$id = progress.$id;
137199
newDeployment.progress = progress.progress;

src/routes/(console)/organization-[organization]/+page.ts

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Query } from '@appwrite.io/console';
2+
import { isCloud } from '$lib/system';
23
import { sdk } from '$lib/stores/sdk';
34
import { getLimit, getPage, getSearch, pageToOffset } from '$lib/helpers/load';
45
import { CARD_LIMIT, Dependencies } from '$lib/constants';
@@ -23,54 +24,56 @@ export const load: PageLoad = async ({ params, url, route, depends, parent }) =>
2324
const archivedPage =
2425
Number.isFinite(archivedPageRaw) && archivedPageRaw > 0 ? archivedPageRaw : 1;
2526
const archivedOffset = pageToOffset(archivedPage, limit);
26-
27+
2728
const searchQueries = search
28-
? [Query.or([Query.search('search', search), Query.contains('labels', search)])]
29+
? [Query.or([Query.search('search', search), Query.contains('labels', search)])];
30+
const commonQueries = [Query.equal('teamId', params.organization)];
31+
const activeQueries = isCloud
32+
? [Query.or([Query.equal('status', 'active'), Query.isNull('status')])]
2933
: [];
3034

3135
const [activeProjects, archivedProjects, activeTotal, archivedTotal] = await Promise.all([
3236
sdk.forConsole.projects.list({
3337
queries: [
3438
Query.offset(offset),
35-
Query.equal('teamId', params.organization),
36-
Query.or([Query.equal('status', 'active'), Query.isNull('status')]),
3739
Query.limit(limit),
3840
Query.orderDesc(''),
39-
...searchQueries
41+
...commonQueries,
42+
...searchQueries,
43+
...activeQueries
4044
]
4145
}),
46+
isCloud
47+
? sdk.forConsole.projects.list({
48+
queries: [
49+
Query.offset(archivedOffset),
50+
Query.limit(limit),
51+
Query.orderDesc(''),
52+
...commonQueries,
53+
...searchQueries,
54+
Query.equal('status', 'archived')
55+
]
56+
})
57+
: Promise.resolve({ projects: [], total: 0 }),
4258
sdk.forConsole.projects.list({
43-
queries: [
44-
Query.offset(archivedOffset),
45-
Query.equal('teamId', params.organization),
46-
Query.equal('status', 'archived'),
47-
Query.limit(limit),
48-
Query.orderDesc(''),
49-
...searchQueries
50-
]
59+
queries: [...commonQueries, ...activeQueries, ...searchQueries]
5160
}),
52-
sdk.forConsole.projects.list({
53-
queries: [
54-
Query.equal('teamId', params.organization),
55-
Query.or([Query.equal('status', 'active'), Query.isNull('status')]),
56-
...searchQueries
57-
]
58-
}),
59-
sdk.forConsole.projects.list({
60-
queries: [
61-
Query.equal('teamId', params.organization),
62-
Query.equal('status', 'archived'),
63-
...searchQueries
64-
]
65-
})
61+
isCloud
62+
? sdk.forConsole.projects.list({
63+
queries: [...commonQueries, ...searchQueries, Query.equal('status', 'archived')],
64+
search: search || undefined
65+
})
66+
: Promise.resolve({ projects: [], total: 0 })
6667
]);
6768

6869
// set `default` if no region!
6970
for (const project of activeProjects.projects) {
7071
project.region ??= 'default';
7172
}
72-
for (const project of archivedProjects.projects) {
73-
project.region ??= 'default';
73+
if (isCloud) {
74+
for (const project of archivedProjects.projects) {
75+
project.region ??= 'default';
76+
}
7477
}
7578

7679
return {

src/routes/(console)/project-[region]-[project]/+layout.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
<style>
125125
.layout-level-progress-bars {
126126
gap: 1rem;
127-
z-index: 2;
127+
z-index: 100;
128128
display: flex;
129129
flex-direction: column;
130130

src/routes/(console)/project-[region]-[project]/functions/create-function/manual/+page.svelte

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts">
22
import { goto, invalidate } from '$app/navigation';
3-
import { base } from '$app/paths';
3+
import { base, resolve } from '$app/paths';
44
import { page } from '$app/state';
55
import { Submit, trackError, trackEvent } from '$lib/actions/analytics';
66
import { Button, Form } from '$lib/elements/forms';
@@ -23,6 +23,7 @@
2323
import { isCloud } from '$lib/system';
2424
import { humanFileSize } from '$lib/helpers/sizeConvertion';
2525
import { currentPlan } from '$lib/stores/organization';
26+
import { uploader } from '$lib/stores/uploader';
2627
2728
export let data;
2829
@@ -61,19 +62,19 @@
6162
let specification = specificationOptions[0]?.value || '';
6263
6364
async function create() {
65+
let func: Models.Function | null = null;
66+
6467
try {
65-
const func = await sdk
66-
.forProject(page.params.region, page.params.project)
67-
.functions.create({
68-
functionId: id || ID.unique(),
69-
name,
70-
runtime,
71-
execute: roles?.length ? roles : undefined,
72-
enabled: true,
73-
entrypoint,
74-
commands: buildCommand,
75-
specification: specification || undefined
76-
});
68+
func = await sdk.forProject(page.params.region, page.params.project).functions.create({
69+
functionId: id || ID.unique(),
70+
name,
71+
runtime,
72+
execute: roles?.length ? roles : undefined,
73+
enabled: true,
74+
entrypoint,
75+
commands: buildCommand,
76+
specification: specification || undefined
77+
});
7778
7879
// Add domain
7980
await sdk.forProject(page.params.region, page.params.project).proxy.createFunctionRule({
@@ -92,25 +93,43 @@
9293
);
9394
await Promise.all(promises);
9495
95-
await sdk
96-
.forProject(page.params.region, page.params.project)
97-
.functions.createDeployment({
98-
functionId: func.$id,
99-
code: files[0],
100-
activate: true
101-
});
96+
const promise = uploader.uploadFunctionDeployment({
97+
functionId: func.$id,
98+
code: files[0]
99+
});
102100
101+
addNotification({
102+
message: 'Deployment upload started',
103+
type: 'success'
104+
});
103105
trackEvent(Submit.FunctionCreate, {
104106
source: 'repository',
105107
runtime: runtime
106108
});
107109
108-
await goto(
109-
`${base}/project-${page.params.region}-${page.params.project}/functions/function-${func.$id}`
110-
);
110+
await promise;
111+
const upload = $uploader.files.find((f) => f.resourceId === func.$id);
112+
113+
if (upload?.status === 'success') {
114+
const deploymentId = upload.$id;
115+
const resolvedPath = resolve(
116+
`/(console)/project-[region]-[project]/functions/function-[function]/deployment-[deployment]`,
117+
{
118+
region: page.params.region,
119+
project: page.params.project,
120+
function: func.$id,
121+
deployment: deploymentId
122+
}
123+
);
124+
await goto(resolvedPath);
125+
}
111126
112127
invalidate(Dependencies.FUNCTION);
113128
} catch (e) {
129+
const upload = $uploader.files.find((f) => f.resourceId === func?.$id);
130+
if (upload) {
131+
uploader.removeFromQueue(upload.$id);
132+
}
114133
addNotification({
115134
type: 'error',
116135
message: e.message

src/routes/(console)/project-[region]-[project]/functions/function-[function]/(modals)/createManual.svelte

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@
66
import { Button } from '$lib/elements/forms';
77
import { InvalidFileType, removeFile } from '$lib/helpers/files';
88
import { addNotification } from '$lib/stores/notifications';
9-
import { sdk } from '$lib/stores/sdk';
109
import { IconInfo } from '@appwrite.io/pink-icons-svelte';
1110
import { Icon, Layout, Tooltip, Typography, Upload } from '@appwrite.io/pink-svelte';
1211
import { func } from '../store';
13-
import { page } from '$app/state';
1412
import { consoleVariables } from '$routes/(console)/store';
1513
import { currentPlan } from '$lib/stores/organization';
1614
import { isCloud } from '$lib/system';
1715
import { humanFileSize } from '$lib/helpers/sizeConvertion';
16+
import { uploader } from '$lib/stores/uploader';
1817
1918
export let show = false;
2019
@@ -30,17 +29,16 @@
3029
3130
async function create() {
3231
try {
33-
await sdk
34-
.forProject(page.params.region, page.params.project)
35-
.functions.createDeployment({
36-
functionId: $func.$id,
37-
code: files[0],
38-
activate: true
39-
});
40-
await invalidate(Dependencies.DEPLOYMENTS);
41-
files = undefined;
32+
uploader.uploadFunctionDeployment({
33+
functionId: $func.$id,
34+
code: files[0]
35+
});
4236
show = false;
43-
trackEvent(Submit.DeploymentCreate);
37+
files = undefined;
38+
await invalidate(Dependencies.DEPLOYMENTS);
39+
trackEvent(Submit.DeploymentCreate, {
40+
type: 'function'
41+
});
4442
addNotification({
4543
type: 'success',
4644
message: 'Deployment created successfully'

0 commit comments

Comments
 (0)