-
+ {#if browser}
+
+ {:else}
+
+ {/if}
{session.clientName}
diff --git a/src/routes/console/project-[project]/auth/user-[user]/targets/+page.svelte b/src/routes/console/project-[project]/auth/user-[user]/targets/+page.svelte
index 316f0def94..d30e178c0b 100644
--- a/src/routes/console/project-[project]/auth/user-[user]/targets/+page.svelte
+++ b/src/routes/console/project-[project]/auth/user-[user]/targets/+page.svelte
@@ -1,9 +1,7 @@
@@ -10,7 +11,7 @@
Domains
diff --git a/src/routes/console/project-[project]/functions/function-[function]/domains/+page.ts b/src/routes/console/project-[project]/functions/function-[function]/domains/+page.ts
index 1f48d6d0da..e5f407297d 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/domains/+page.ts
+++ b/src/routes/console/project-[project]/functions/function-[function]/domains/+page.ts
@@ -1,15 +1,14 @@
import { Dependencies } from '$lib/constants';
import { sdk } from '$lib/stores/sdk';
-import { Query } from '@appwrite.io/console';
+import { Query, ResourceType } from '@appwrite.io/console';
import type { PageLoad } from './$types';
-import { ProxyTypes } from '$lib/pages/domains/index.svelte';
export const load: PageLoad = async ({ depends, params }) => {
depends(Dependencies.FUNCTION_DOMAINS);
return {
rules: await sdk.forProject.proxy.listRules([
- Query.equal('resourceType', ProxyTypes.FUNCTION),
+ Query.equal('resourceType', ResourceType.Function),
Query.equal('resourceId', params.function)
])
};
diff --git a/src/routes/console/project-[project]/functions/function-[function]/execute.svelte b/src/routes/console/project-[project]/functions/function-[function]/execute.svelte
index 278a3ceabd..a8460d6db6 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/execute.svelte
+++ b/src/routes/console/project-[project]/functions/function-[function]/execute.svelte
@@ -15,23 +15,23 @@
import Label from '$lib/elements/forms/label.svelte';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
- import type { Models } from '@appwrite.io/console';
+ import { ExecutionMethod, type Models } from '@appwrite.io/console';
export let selectedFunction: Models.Function = null;
let path = '/';
- let method = 'GET';
+ let method = ExecutionMethod.GET;
let body = '';
let headers: [string, string][] = [['', '']];
let error: string = null;
const methodOptions = [
- { label: 'GET', value: 'GET' },
- { label: 'POST', value: 'POST' },
- { label: 'PUT', value: 'PUT' },
- { label: 'PATCH', value: 'PATCH' },
- { label: 'DELETE', value: 'DELETE' },
- { label: 'OPTIONS', value: 'OPTIONS' }
+ { label: 'GET', value: ExecutionMethod.GET },
+ { label: 'POST', value: ExecutionMethod.POST },
+ { label: 'PUT', value: ExecutionMethod.PUT },
+ { label: 'PATCH', value: ExecutionMethod.PATCH },
+ { label: 'DELETE', value: ExecutionMethod.DELETE },
+ { label: 'OPTIONS', value: ExecutionMethod.OPTIONS }
];
let show = false;
diff --git a/src/routes/console/project-[project]/functions/function-[function]/settings/disconnectRepo.svelte b/src/routes/console/project-[project]/functions/function-[function]/settings/disconnectRepo.svelte
index 353d2276bb..c8769402cb 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/settings/disconnectRepo.svelte
+++ b/src/routes/console/project-[project]/functions/function-[function]/settings/disconnectRepo.svelte
@@ -9,6 +9,8 @@
import { sdk } from '$lib/stores/sdk';
import { createEventDispatcher } from 'svelte';
import { func } from '../store';
+ import { isValueOfStringEnum } from '$lib/helpers/types';
+ import { Runtime } from '@appwrite.io/console';
export let show = false;
const functionId = $page.params.function;
@@ -18,6 +20,9 @@
const handleSubmit = async () => {
try {
+ if (!isValueOfStringEnum(Runtime, $func.runtime)) {
+ throw new Error(`Invalid runtime: ${$func.runtime}`);
+ }
await sdk.forProject.functions.update(
functionId,
$func.name,
diff --git a/src/routes/console/project-[project]/functions/function-[function]/settings/gitConfigurationModal.svelte b/src/routes/console/project-[project]/functions/function-[function]/settings/gitConfigurationModal.svelte
index 5e47e5619c..6a8dc10d45 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/settings/gitConfigurationModal.svelte
+++ b/src/routes/console/project-[project]/functions/function-[function]/settings/gitConfigurationModal.svelte
@@ -8,12 +8,13 @@
import { timeFromNow, toLocaleDateTime } from '$lib/helpers/date';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
- import type { Models } from '@appwrite.io/console';
+ import { Runtime, type Models } from '@appwrite.io/console';
import { func, repositories } from '../store';
import { invalidate } from '$app/navigation';
import InputSelectSearch from '$lib/elements/forms/inputSelectSearch.svelte';
import { sortBranches } from './updateConfiguration.svelte';
import { installations } from '$lib/wizards/functions/store';
+ import { isValueOfStringEnum } from '$lib/helpers/types';
export let show: boolean;
@@ -48,6 +49,9 @@
async function handleSubmit() {
try {
+ if (!isValueOfStringEnum(Runtime, $func.runtime)) {
+ throw new Error(`Invalid runtime: ${$func.runtime}`);
+ }
await sdk.forProject.functions.update(
functionId,
$func.name,
diff --git a/src/routes/console/project-[project]/functions/function-[function]/settings/updateConfiguration.svelte b/src/routes/console/project-[project]/functions/function-[function]/settings/updateConfiguration.svelte
index c609d0493a..df247fcc8a 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/settings/updateConfiguration.svelte
+++ b/src/routes/console/project-[project]/functions/function-[function]/settings/updateConfiguration.svelte
@@ -36,7 +36,7 @@
} from '$lib/elements/forms';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
- import type { Models } from '@appwrite.io/console';
+ import { Runtime, type Models } from '@appwrite.io/console';
import { func } from '../store';
import GitInstallationModal from '$routes/console/project-[project]/settings/GitInstallationModal.svelte';
import GitConfigurationModal from './gitConfigurationModal.svelte';
@@ -50,6 +50,7 @@
import { installations } from '$lib/wizards/functions/store';
import { isSelfHosted } from '$lib/system';
import { consoleVariables } from '$routes/console/store';
+ import { isValueOfStringEnum } from '$lib/helpers/types';
const functionId = $page.params.function;
const isVcsEnabled = $consoleVariables?._APP_VCS_ENABLED === true;
@@ -114,6 +115,9 @@
async function updateConfiguration() {
try {
+ if (!isValueOfStringEnum(Runtime, $func.runtime)) {
+ throw new Error(`Invalid runtime: ${$func.runtime}`);
+ }
await sdk.forProject.functions.update(
functionId,
$func.name,
diff --git a/src/routes/console/project-[project]/functions/function-[function]/settings/updateEvents.svelte b/src/routes/console/project-[project]/functions/function-[function]/settings/updateEvents.svelte
index 6de2d80489..853aa61725 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/settings/updateEvents.svelte
+++ b/src/routes/console/project-[project]/functions/function-[function]/settings/updateEvents.svelte
@@ -19,6 +19,8 @@
import { Button } from '$lib/elements/forms';
import DropList from '$lib/components/dropList.svelte';
import DropListItem from '$lib/components/dropListItem.svelte';
+ import { isValueOfStringEnum } from '$lib/helpers/types';
+ import { Runtime } from '@appwrite.io/console';
const functionId = $page.params.function;
const eventSet: Writable> = writable(new Set($func.events));
@@ -29,6 +31,9 @@
async function updateEvents() {
try {
+ if (!isValueOfStringEnum(Runtime, $func.runtime)) {
+ throw new Error(`Invalid runtime: ${$func.runtime}`);
+ }
await sdk.forProject.functions.update(
functionId,
$func.name,
diff --git a/src/routes/console/project-[project]/functions/function-[function]/settings/updateLogging.svelte b/src/routes/console/project-[project]/functions/function-[function]/settings/updateLogging.svelte
index 7adfd6a5f8..2f6e4afb87 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/settings/updateLogging.svelte
+++ b/src/routes/console/project-[project]/functions/function-[function]/settings/updateLogging.svelte
@@ -11,6 +11,8 @@
import { project } from '$routes/console/project-[project]/store';
import { onMount } from 'svelte';
import { func } from '../store';
+ import { isValueOfStringEnum } from '$lib/helpers/types';
+ import { Runtime } from '@appwrite.io/console';
const functionId = $page.params.function;
let functionLogging: boolean = null;
@@ -21,6 +23,9 @@
async function updateLogging() {
try {
+ if (!isValueOfStringEnum(Runtime, $func.runtime)) {
+ throw new Error(`Invalid runtime: ${$func.runtime}`);
+ }
await sdk.forProject.functions.update(
functionId,
$func.name,
diff --git a/src/routes/console/project-[project]/functions/function-[function]/settings/updateName.svelte b/src/routes/console/project-[project]/functions/function-[function]/settings/updateName.svelte
index 690c762600..8f44fd549e 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/settings/updateName.svelte
+++ b/src/routes/console/project-[project]/functions/function-[function]/settings/updateName.svelte
@@ -9,6 +9,8 @@
import { sdk } from '$lib/stores/sdk';
import { onMount } from 'svelte';
import { func } from '../store';
+ import { isValueOfStringEnum } from '$lib/helpers/types';
+ import { Runtime } from '@appwrite.io/console';
const functionId = $page.params.function;
let functionName: string = null;
@@ -19,6 +21,9 @@
async function updateName() {
try {
+ if (!isValueOfStringEnum(Runtime, $func.runtime)) {
+ throw new Error(`Invalid runtime: ${$func.runtime}`);
+ }
await sdk.forProject.functions.update(
functionId,
functionName,
diff --git a/src/routes/console/project-[project]/functions/function-[function]/settings/updatePermissions.svelte b/src/routes/console/project-[project]/functions/function-[function]/settings/updatePermissions.svelte
index 949a5f9d54..8af6ef6e3c 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/settings/updatePermissions.svelte
+++ b/src/routes/console/project-[project]/functions/function-[function]/settings/updatePermissions.svelte
@@ -11,6 +11,8 @@
import { func } from '../store';
import { Roles } from '$lib/components/permissions';
import { symmetricDifference } from '$lib/helpers/array';
+ import { isValueOfStringEnum } from '$lib/helpers/types';
+ import { Runtime } from '@appwrite.io/console';
const functionId = $page.params.function;
@@ -23,6 +25,9 @@
async function updatePermissions() {
try {
+ if (!isValueOfStringEnum(Runtime, $func.runtime)) {
+ throw new Error(`Invalid runtime: ${$func.runtime}`);
+ }
await sdk.forProject.functions.update(
functionId,
$func.name,
diff --git a/src/routes/console/project-[project]/functions/function-[function]/settings/updateRuntime.svelte b/src/routes/console/project-[project]/functions/function-[function]/settings/updateRuntime.svelte
index fc871f2832..a4a2f806c6 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/settings/updateRuntime.svelte
+++ b/src/routes/console/project-[project]/functions/function-[function]/settings/updateRuntime.svelte
@@ -11,6 +11,8 @@
import { func } from '../store';
import InputSelect from '$lib/elements/forms/inputSelect.svelte';
import { runtimesList } from '../../store';
+ import { isValueOfStringEnum } from '$lib/helpers/types';
+ import { Runtime } from '@appwrite.io/console';
const functionId = $page.params.function;
let runtime: string = null;
@@ -29,6 +31,9 @@
async function updateRuntime() {
try {
+ if (!isValueOfStringEnum(Runtime, runtime)) {
+ throw new Error(`Invalid runtime: ${runtime}`);
+ }
await sdk.forProject.functions.update(
functionId,
$func.name,
diff --git a/src/routes/console/project-[project]/functions/function-[function]/settings/updateSchedule.svelte b/src/routes/console/project-[project]/functions/function-[function]/settings/updateSchedule.svelte
index 514a76722d..ecd707039b 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/settings/updateSchedule.svelte
+++ b/src/routes/console/project-[project]/functions/function-[function]/settings/updateSchedule.svelte
@@ -9,6 +9,8 @@
import { sdk } from '$lib/stores/sdk';
import { onMount } from 'svelte';
import { func } from '../store';
+ import { isValueOfStringEnum } from '$lib/helpers/types';
+ import { Runtime } from '@appwrite.io/console';
const functionId = $page.params.function;
let functionSchedule: string = null;
@@ -19,6 +21,9 @@
async function updateSchedule() {
try {
+ if (!isValueOfStringEnum(Runtime, $func.runtime)) {
+ throw new Error(`Invalid runtime: ${$func.runtime}`);
+ }
await sdk.forProject.functions.update(
functionId,
$func.name,
diff --git a/src/routes/console/project-[project]/functions/function-[function]/settings/updateTimeout.svelte b/src/routes/console/project-[project]/functions/function-[function]/settings/updateTimeout.svelte
index 797c32030c..c363032791 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/settings/updateTimeout.svelte
+++ b/src/routes/console/project-[project]/functions/function-[function]/settings/updateTimeout.svelte
@@ -9,6 +9,8 @@
import { sdk } from '$lib/stores/sdk';
import { onMount } from 'svelte';
import { func } from '../store';
+ import { isValueOfStringEnum } from '$lib/helpers/types';
+ import { Runtime } from '@appwrite.io/console';
const functionId = $page.params.function;
let timeout: number = null;
@@ -19,6 +21,9 @@
async function updateTimeout() {
try {
+ if (!isValueOfStringEnum(Runtime, $func.runtime)) {
+ throw new Error(`Invalid runtime: ${$func.runtime}`);
+ }
await sdk.forProject.functions.update(
functionId,
$func.name,
diff --git a/src/routes/console/project-[project]/functions/function-[function]/usage/[[period]]/+page.ts b/src/routes/console/project-[project]/functions/function-[function]/usage/[[period]]/+page.ts
index dfeafeb47e..70c314f49b 100644
--- a/src/routes/console/project-[project]/functions/function-[function]/usage/[[period]]/+page.ts
+++ b/src/routes/console/project-[project]/functions/function-[function]/usage/[[period]]/+page.ts
@@ -1,19 +1,15 @@
-import type { Metric, UsageFunctions } from '$lib/sdk/usage';
import { sdk } from '$lib/stores/sdk';
+import { FunctionUsageRange } from '@appwrite.io/console';
import type { PageLoad } from './$types';
import { error } from '@sveltejs/kit';
+import { isValueOfStringEnum } from '$lib/helpers/types';
export const load: PageLoad = async ({ params }) => {
try {
- const response = (await sdk.forProject.functions.getFunctionUsage(
- params.function,
- params.period ?? '30d'
- )) as unknown as UsageFunctions;
-
- return {
- executionsTotal: response.executionsTotal,
- executions: response.executions as Metric[]
- };
+ const period = isValueOfStringEnum(FunctionUsageRange, params.period)
+ ? params.period
+ : FunctionUsageRange.ThirtyDays;
+ return sdk.forProject.functions.getFunctionUsage(params.function, period);
} catch (e) {
throw error(e.code, e.message);
}
diff --git a/src/routes/console/project-[project]/messaging/+page.svelte b/src/routes/console/project-[project]/messaging/+page.svelte
index 3290984a14..54802667eb 100644
--- a/src/routes/console/project-[project]/messaging/+page.svelte
+++ b/src/routes/console/project-[project]/messaging/+page.svelte
@@ -8,6 +8,7 @@
FloatingActionBar,
Heading,
Id,
+ Modal,
PaginationWithLimit,
SearchQuery,
ViewSelector
@@ -27,16 +28,23 @@
} from '$lib/elements/table';
import { toLocaleDateTime } from '$lib/helpers/date';
import { Container } from '$lib/layout';
+ import { MessageType, MessagingProviderType } from '@appwrite.io/console';
import type { PageData } from './$types';
import CreateMessageDropdown from './createMessageDropdown.svelte';
import FailedModal from './failedModal.svelte';
import MessageStatusPill from './messageStatusPill.svelte';
- import ProviderType, { ProviderTypes } from './providerType.svelte';
+ import ProviderType from './providerType.svelte';
import { columns, showCreate } from './store';
+ import { sdk } from '$lib/stores/sdk';
+ import { invalidate } from '$app/navigation';
+ import { trackEvent, Submit, trackError } from '$lib/actions/analytics';
+ import { Dependencies } from '$lib/constants';
+ import { addNotification } from '$lib/stores/notifications';
export let data: PageData;
let selected: string[] = [];
let showDelete = false;
+ let deleting = false;
let showFailed = false;
let errors: string[] = [];
let showCreateDropdownMobile = false;
@@ -45,7 +53,32 @@
const project = $page.params.project;
- $: console.log(showDelete);
+ async function handleDelete() {
+ showDelete = false;
+
+ const promises = selected.map((id) => sdk.forProject.messaging.delete(id));
+
+ try {
+ await Promise.all(promises);
+ trackEvent(Submit.MessagingMessageDelete, {
+ total: selected.length
+ });
+ addNotification({
+ type: 'success',
+ message: `${selected.length} message${selected.length > 1 ? 's' : ''} deleted`
+ });
+ } catch (error) {
+ addNotification({
+ type: 'error',
+ message: error.message
+ });
+ trackError(error, Submit.MessagingMessageDelete);
+ } finally {
+ invalidate(Dependencies.MESSAGING_MESSAGES);
+ selected = [];
+ showDelete = false;
+ }
+ }
@@ -105,7 +138,10 @@
{#each data.messages.messages as message (message.$id)}
-
+
{#each $columns as column (column.id)}
{#if column.show}
@@ -117,11 +153,11 @@
{/key}
{:else if column.id === 'message'}
- {#if message.providerType === ProviderTypes.Push}
+ {#if message.providerType === MessagingProviderType.Push}
{message.data.title}
- {:else if message.providerType === ProviderTypes.Sms}
+ {:else if message.providerType === MessagingProviderType.Sms}
{message.data.content}
- {:else if message.providerType === ProviderTypes.Email}
+ {:else if message.providerType === MessagingProviderType.Email}
{message.data.subject}
{:else}
Invalid provider
@@ -175,7 +211,6 @@
(selected = [])}>Cancel
-
(showDelete = true)}>
Delete
@@ -248,3 +283,21 @@
+
+
+
+ Are you sure you want to delete {selected.length}
+ {selected.length > 1 ? 'messages' : 'message'}?
+
+
+ (showDelete = false)} disabled={deleting}>Cancel
+ Delete
+
+
diff --git a/src/routes/console/project-[project]/messaging/+page.ts b/src/routes/console/project-[project]/messaging/+page.ts
index acf2ff7258..39c1151bf6 100644
--- a/src/routes/console/project-[project]/messaging/+page.ts
+++ b/src/routes/console/project-[project]/messaging/+page.ts
@@ -1,5 +1,5 @@
import { queries, queryParamToMap } from '$lib/components/filters';
-import { CARD_LIMIT } from '$lib/constants';
+import { CARD_LIMIT, Dependencies } from '$lib/constants';
import {
View,
getLimit,
@@ -13,7 +13,9 @@ import { sdk } from '$lib/stores/sdk';
import { Query, type Models } from '@appwrite.io/console';
import type { PageLoad } from './$types';
-export const load: PageLoad = async ({ url, route }) => {
+export const load: PageLoad = async ({ depends, url, route }) => {
+ depends(Dependencies.MESSAGING_MESSAGES);
+
const page = getPage(url);
const search = getSearch(url);
const view = getView(url, route, View.Grid);
@@ -24,38 +26,6 @@ export const load: PageLoad = async ({ url, route }) => {
const parsedQueries = queryParamToMap(query || '[]');
queries.set(parsedQueries);
- // TODO: remove when the API is ready with data
- // This allows us to mock w/ data and when search returns 0 results
- let messages: {
- messages: ({ data: Record
} & Models.Message)[];
- total: number;
- } = { messages: [], total: 0 };
- const params = {
- queries: [
- Query.limit(limit),
- Query.offset(offset),
- Query.orderDesc(''),
- ...parsedQueries.values()
- ]
- };
-
- if (search) {
- params['search'] = search;
- }
-
- const response = await sdk.forProject.client.call(
- 'GET',
- new URL(sdk.forProject.client.config.endpoint + '/messaging/messages'),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- params
- );
-
- messages = response;
-
return {
offset,
limit,
@@ -63,6 +33,17 @@ export const load: PageLoad = async ({ url, route }) => {
query,
page,
view,
- messages
+ messages: sdk.forProject.messaging.listMessages(
+ [
+ Query.limit(limit),
+ Query.offset(offset),
+ Query.orderDesc(''),
+ ...parsedQueries.values()
+ ],
+ search || undefined
+ ) as Promise<{
+ total: number;
+ messages: (Models.Message & { data: Record })[]; // Add typing for message.data
+ }>
};
};
diff --git a/src/routes/console/project-[project]/messaging/actions.svelte b/src/routes/console/project-[project]/messaging/actions.svelte
index bf2bb5b7bf..9a6542d20b 100644
--- a/src/routes/console/project-[project]/messaging/actions.svelte
+++ b/src/routes/console/project-[project]/messaging/actions.svelte
@@ -3,14 +3,14 @@
import { createEventDispatcher } from 'svelte';
import { targetsById } from './wizard/store';
import UserTargetsModal from './userTargetsModal.svelte';
- import type { ProviderTypes } from './providerType.svelte';
import TopicsModal from './topicsModal.svelte';
import { topicsById } from './store';
+ import type { MessagingProviderType } from '@appwrite.io/console';
export let showDropdown: boolean;
export let showUserTargets: boolean;
export let showTopics: boolean;
- export let providerType: ProviderTypes = null;
+ export let providerType: MessagingProviderType = null;
const dispatch = createEventDispatcher();
diff --git a/src/routes/console/project-[project]/messaging/createMessageDropdown.svelte b/src/routes/console/project-[project]/messaging/createMessageDropdown.svelte
index 7cd6d5814c..db2850cca7 100644
--- a/src/routes/console/project-[project]/messaging/createMessageDropdown.svelte
+++ b/src/routes/console/project-[project]/messaging/createMessageDropdown.svelte
@@ -5,8 +5,8 @@
import { providers } from './providers/store';
import Wizard from './wizard.svelte';
import { messageParams, operation, providerType, targetsById } from './wizard/store';
- import { ProviderTypes } from './providerType.svelte';
import { topicsById } from './store';
+ import { MessagingProviderType } from '@appwrite.io/console';
export let showCreateDropdown = false;
@@ -24,9 +24,9 @@
icon={option.icon}
on:click={() => {
if (
- type !== ProviderTypes.Email &&
- type !== ProviderTypes.Sms &&
- type !== ProviderTypes.Push
+ type !== MessagingProviderType.Email &&
+ type !== MessagingProviderType.Sms &&
+ type !== MessagingProviderType.Push
)
return;
$providerType = type;
@@ -39,20 +39,20 @@
targets: []
};
switch (type) {
- case ProviderTypes.Email:
+ case MessagingProviderType.Email:
$messageParams[$providerType] = {
...common,
subject: '',
content: ''
};
break;
- case ProviderTypes.Sms:
+ case MessagingProviderType.Sms:
$messageParams[$providerType] = {
...common,
content: ''
};
break;
- case ProviderTypes.Push:
+ case MessagingProviderType.Push:
$messageParams[$providerType] = {
...common,
title: '',
diff --git a/src/routes/console/project-[project]/messaging/message-[message]/+layout.ts b/src/routes/console/project-[project]/messaging/message-[message]/+layout.ts
index 8f57dfb923..7e3985ea37 100644
--- a/src/routes/console/project-[project]/messaging/message-[message]/+layout.ts
+++ b/src/routes/console/project-[project]/messaging/message-[message]/+layout.ts
@@ -10,31 +10,11 @@ export const load: LayoutLoad = async ({ params, depends }) => {
depends(Dependencies.MESSAGING_MESSAGE);
try {
- const response: Models.Message = await sdk.forProject.client.call(
- 'GET',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/messages/${params.message}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- }
- );
+ const message = await sdk.forProject.messaging.getMessage(params.message);
- const topicsById = {};
+ const topicsById: Record = {};
const topicsPromise = Promise.allSettled(
- response.topics.map((topicId) => {
- return sdk.forProject.client.call(
- 'GET',
- new URL(`${sdk.forProject.client.config.endpoint}/messaging/topics/${topicId}`),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- }
- );
- })
+ message.topics.map((topicId) => sdk.forProject.messaging.getTopic(topicId))
).then((results) => {
results.forEach((result) => {
if (result.status === 'fulfilled') {
@@ -43,19 +23,9 @@ export const load: LayoutLoad = async ({ params, depends }) => {
});
});
- const targetsById = {};
- const targetsPromise = sdk.forProject.client
- .call(
- 'GET',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/messages/${params.message}/targets`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- }
- )
+ const targetsById: Record = {};
+ const targetsPromise = sdk.forProject.messaging
+ .listTargets(params.message)
.then((response) => {
response.targets.forEach((target) => {
targetsById[target.$id] = target;
@@ -64,12 +34,22 @@ export const load: LayoutLoad = async ({ params, depends }) => {
await Promise.allSettled([topicsPromise, targetsPromise]);
+ const usersById: Record> = {};
+ const usersPromise = Object.values(targetsById).map((target) =>
+ sdk.forProject.users.get(target.userId).then((user) => {
+ usersById[user.$id] = user;
+ })
+ );
+
+ await Promise.allSettled(usersPromise);
+
return {
+ message,
topicsById,
targetsById,
+ usersById,
header: Header,
- breadcrumbs: Breadcrumbs,
- message: response
+ breadcrumbs: Breadcrumbs
};
} catch (e) {
throw error(e.code, e.message);
diff --git a/src/routes/console/project-[project]/messaging/message-[message]/+page.svelte b/src/routes/console/project-[project]/messaging/message-[message]/+page.svelte
index 20dfb2905b..9a094f8c0c 100644
--- a/src/routes/console/project-[project]/messaging/message-[message]/+page.svelte
+++ b/src/routes/console/project-[project]/messaging/message-[message]/+page.svelte
@@ -4,26 +4,22 @@
import EmailPreview from './emailPreview.svelte';
import Overview from './overview.svelte';
import { message } from './store';
- import { ProviderTypes } from '../providerType.svelte';
import SMSPreview from './smsPreview.svelte';
import PushPreview from './pushPreview.svelte';
- import {
- MessageStatuses,
- messageParams,
- operation,
- providerType,
- targetsById
- } from '../wizard/store';
+ import { messageParams, operation, providerType, targetsById } from '../wizard/store';
import { topicsById } from '../store';
import { wizard } from '$lib/stores/wizard';
import Wizard from '../wizard.svelte';
import type { PageData } from './$types';
import { isValueOfStringEnum } from '$lib/helpers/types';
+ import { MessageType, MessagingProviderType } from '@appwrite.io/console';
+ import Topics from './topics.svelte';
+ import Targets from './targets.svelte';
export let data: PageData;
async function onEdit() {
- if (!isValueOfStringEnum(ProviderTypes, $message.providerType)) {
+ if (!isValueOfStringEnum(MessagingProviderType, $message.providerType)) {
throw new Error(`Invalid provider type: ${$message.providerType}`);
}
$operation = 'update';
@@ -39,12 +35,12 @@
topics: $message.topics,
users: $message.users,
targets: $message.targets,
- status: MessageStatuses.DRAFT,
+ status: MessageType.Draft,
scheduledAt: $message.scheduledAt
};
switch ($providerType) {
- case ProviderTypes.Email:
+ case MessagingProviderType.Email:
{
const { data } = $message;
const params = ['subject', 'content', 'html'];
@@ -55,7 +51,7 @@
});
}
break;
- case ProviderTypes.Sms:
+ case MessagingProviderType.Sms:
{
const { data } = $message;
const params = ['content'];
@@ -66,7 +62,7 @@
});
}
break;
- case ProviderTypes.Push:
+ case MessagingProviderType.Push:
{
const { data } = $message;
const params = [
@@ -99,18 +95,20 @@
- {#if $message.providerType === ProviderTypes.Email}
+ {#if $message.providerType === MessagingProviderType.Email}
- {:else if $message.providerType === ProviderTypes.Sms}
+ onEdit={$message.status === MessageType.Draft ? onEdit : null} />
+ {:else if $message.providerType === MessagingProviderType.Sms}
- {:else if $message.providerType === ProviderTypes.Push}
+ onEdit={$message.status === MessageType.Draft ? onEdit : null} />
+ {:else if $message.providerType === MessagingProviderType.Push}
+ onEdit={$message.status === MessageType.Draft ? onEdit : null} />
{/if}
+
+
diff --git a/src/routes/console/project-[project]/messaging/message-[message]/delete.svelte b/src/routes/console/project-[project]/messaging/message-[message]/delete.svelte
index 7d7a2fb777..707b16c72b 100644
--- a/src/routes/console/project-[project]/messaging/message-[message]/delete.svelte
+++ b/src/routes/console/project-[project]/messaging/message-[message]/delete.svelte
@@ -2,6 +2,7 @@
import { BoxAvatar, CardGrid, Heading } from '$lib/components';
import { Button } from '$lib/elements/forms';
import { toLocaleDateTime } from '$lib/helpers/date';
+ import { MessageType } from '@appwrite.io/console';
import DeleteModal from './deleteModal.svelte';
import { message } from './store';
@@ -31,7 +32,11 @@
- (showDelete = true)} event="delete_file">Delete
+ (showDelete = true)}
+ event="delete_file">Delete
diff --git a/src/routes/console/project-[project]/messaging/message-[message]/deleteModal.svelte b/src/routes/console/project-[project]/messaging/message-[message]/deleteModal.svelte
index 41988ae730..247b8d3ab5 100644
--- a/src/routes/console/project-[project]/messaging/message-[message]/deleteModal.svelte
+++ b/src/routes/console/project-[project]/messaging/message-[message]/deleteModal.svelte
@@ -13,17 +13,7 @@
const deleteMessage = async () => {
try {
- await sdk.forProject.client.call(
- 'DELETE',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/messages/${$message.$id}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- }
- );
+ await sdk.forProject.messaging.delete($message.$id);
show = false;
addNotification({
type: 'success',
diff --git a/src/routes/console/project-[project]/messaging/message-[message]/overview.svelte b/src/routes/console/project-[project]/messaging/message-[message]/overview.svelte
index 9dfb7add38..7413cfd794 100644
--- a/src/routes/console/project-[project]/messaging/message-[message]/overview.svelte
+++ b/src/routes/console/project-[project]/messaging/message-[message]/overview.svelte
@@ -2,8 +2,9 @@
import { CardGrid, Heading } from '$lib/components';
import { toLocaleDateTime } from '$lib/helpers/date';
import { message } from './store';
- import ProviderType, { ProviderTypes } from '../providerType.svelte';
+ import ProviderType from '../providerType.svelte';
import MessageStatusPill from '../messageStatusPill.svelte';
+ import { MessagingProviderType } from '@appwrite.io/console';
let scheduledAt: string = '';
if ($message.status === 'sent') {
@@ -14,13 +15,13 @@
let providerType = 'Invalid provider type';
switch ($message.providerType) {
- case ProviderTypes.Email:
+ case MessagingProviderType.Email:
providerType = 'Email';
break;
- case ProviderTypes.Sms:
+ case MessagingProviderType.Sms:
providerType = 'SMS';
break;
- case ProviderTypes.Push:
+ case MessagingProviderType.Push:
providerType = 'Push';
break;
}
diff --git a/src/routes/console/project-[project]/messaging/message-[message]/targets.svelte b/src/routes/console/project-[project]/messaging/message-[message]/targets.svelte
new file mode 100644
index 0000000000..ca3e6ae031
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/message-[message]/targets.svelte
@@ -0,0 +1,62 @@
+
+
+
+ Targets
+
+ {@const sum = targets.length}
+ {#if sum}
+
+
+
+ ID
+ Name
+ Identifier
+
+
+ {#each targets.slice(offset, offset + limit) as target (target.$id)}
+
+
+ {target.$id}
+
+
+
+ {usersById[target.userId]?.name || 'Unknown'}
+
+
+
+ {target.providerType === MessagingProviderType.Push
+ ? target.name
+ : target.identifier}
+
+
+ {/each}
+
+
+
+
Total targets: {sum}
+
+
+
+ {:else}
+ Edit the message to add a Target
+ {/if}
+
+
diff --git a/src/routes/console/project-[project]/messaging/message-[message]/topics.svelte b/src/routes/console/project-[project]/messaging/message-[message]/topics.svelte
new file mode 100644
index 0000000000..75589a7e9d
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/message-[message]/topics.svelte
@@ -0,0 +1,59 @@
+
+
+
+ Topics
+
+ {@const sum = topics.length}
+ {#if sum}
+
+
+
+ ID
+ Name
+ Subscribers
+
+
+ {#each topics.slice(offset, offset + limit) as topic (topic.$id)}
+
+
+ {topic.$id}
+
+
+
+ {topic.name}
+
+
+
+ {topic.total}
+
+
+ {/each}
+
+
+
+
Total topics: {sum}
+
+
+
+ {:else}
+ Edit the message to add a Topic
+ {/if}
+
+
diff --git a/src/routes/console/project-[project]/messaging/provider.svelte b/src/routes/console/project-[project]/messaging/provider.svelte
index 861060c7cd..e130ea23ff 100644
--- a/src/routes/console/project-[project]/messaging/provider.svelte
+++ b/src/routes/console/project-[project]/messaging/provider.svelte
@@ -7,6 +7,7 @@
Vonage = 'vonage',
Mailgun = 'mailgun',
Sendgrid = 'sendgrid',
+ SMTP = 'smtp',
FCM = 'fcm',
APNS = 'apns'
}
@@ -49,6 +50,10 @@
case Providers.Mailgun:
icon = 'mailgun';
break;
+ case Providers.SMTP:
+ icon = 'smtp';
+ displayName = name || 'SMTP';
+ break;
case Providers.Twilio:
icon = 'twilio';
break;
@@ -78,10 +83,14 @@
class="avatar"
class:is-size-large={size === 'l'}
class:is-size-small={size === 's'}>
-
+ {#if provider === Providers.SMTP}
+
+ {:else}
+
+ {/if}
{/if}
diff --git a/src/routes/console/project-[project]/messaging/providerType.svelte b/src/routes/console/project-[project]/messaging/providerType.svelte
index 6d5ed9ebc6..91f16310e6 100644
--- a/src/routes/console/project-[project]/messaging/providerType.svelte
+++ b/src/routes/console/project-[project]/messaging/providerType.svelte
@@ -1,15 +1,8 @@
-
-
@@ -25,9 +25,9 @@
icon={option.icon}
on:click={() => {
if (
- type !== ProviderTypes.Email &&
- type !== ProviderTypes.Sms &&
- type !== ProviderTypes.Push
+ type !== MessagingProviderType.Email &&
+ type !== MessagingProviderType.Sms &&
+ type !== MessagingProviderType.Push
)
return;
$providerType = type;
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+layout.ts b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+layout.ts
index 3527cd7373..e4b50bd01e 100644
--- a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+layout.ts
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+layout.ts
@@ -3,28 +3,13 @@ import Breadcrumbs from './breadcrumbs.svelte';
import Header from './header.svelte';
import { sdk } from '$lib/stores/sdk';
import { Dependencies } from '$lib/constants';
-import { error } from '@sveltejs/kit';
export const load: LayoutLoad = async ({ params, depends }) => {
depends(Dependencies.MESSAGING_PROVIDER);
- const response = await sdk.forProject.client.call(
- 'GET',
- new URL(sdk.forProject.client.config.endpoint + '/messaging/providers/' + params.provider),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- }
- );
-
- try {
- return {
- header: Header,
- breadcrumbs: Breadcrumbs,
- provider: response
- };
- } catch (e) {
- throw error(e.code, e.message);
- }
+ return {
+ header: Header,
+ breadcrumbs: Breadcrumbs,
+ provider: sdk.forProject.messaging.getProvider(params.provider)
+ };
};
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/deleteProvider.svelte b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/deleteProvider.svelte
index e32cbf6aae..485f84adff 100644
--- a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/deleteProvider.svelte
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/deleteProvider.svelte
@@ -14,17 +14,7 @@
const deleteProvider = async () => {
try {
- await sdk.forProject.client.call(
- 'DELETE',
- new URL(
- sdk.forProject.client.config.endpoint + '/messaging/providers/' + $provider.$id
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- }
- );
+ await sdk.forProject.messaging.deleteProvider($provider.$id);
showDelete = false;
addNotification({
type: 'success',
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateStatus.svelte b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateStatus.svelte
index d4134dc73b..c17d744609 100644
--- a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateStatus.svelte
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateStatus.svelte
@@ -10,8 +10,9 @@
import { sdk } from '$lib/stores/sdk';
import { wizard } from '$lib/stores/wizard';
import { onMount } from 'svelte';
+ import { MessagingProviderType } from '@appwrite.io/console';
import Provider, { Providers } from '../../provider.svelte';
- import ProviderType, { ProviderTypes } from '../../providerType.svelte';
+ import ProviderType from '../../providerType.svelte';
import Update from '../update.svelte';
import { providerParams, providerType, provider as wizardProvider } from '../wizard/store';
import { provider } from './store';
@@ -23,7 +24,7 @@
});
function configure() {
- if (!isValueOfStringEnum(ProviderTypes, $provider.type)) {
+ if (!isValueOfStringEnum(MessagingProviderType, $provider.type)) {
throw new Error(`Invalid provider type: ${$provider.type}`);
}
@@ -104,6 +105,24 @@
fromEmail: $provider.options['from']
};
break;
+ case Providers.SMTP:
+ $providerParams[$wizardProvider] = {
+ providerId: $provider.$id,
+ name: $provider.name,
+ enabled: $provider.enabled,
+ host: $provider.credentials['host'],
+ port: $provider.credentials['port'],
+ username: $provider.credentials['username'],
+ password: $provider.credentials['password'],
+ fromName: $provider.options['fromName'],
+ fromEmail: $provider.options['fromEmail'],
+ replyToName: $provider.options['replyToName'],
+ replyToEmail: $provider.options['replyToEmail'],
+ encryption: $provider.options['encryption'],
+ autoTLS: $provider.options['autoTLS'],
+ mailer: $provider.options['mailer']
+ };
+ break;
case Providers.FCM:
$providerParams[$wizardProvider] = {
providerId: $provider.$id,
@@ -134,165 +153,86 @@
const providerId = $provider.$id;
switch ($provider.provider) {
case Providers.Twilio:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- sdk.forProject.client.config.endpoint +
- '/messaging/providers/twilio/' +
- providerId
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- enabled: enabled
- }
+ response = await sdk.forProject.messaging.updateTwilioProvider(
+ providerId,
+ undefined,
+ enabled
);
break;
case Providers.Msg91:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- sdk.forProject.client.config.endpoint +
- '/messaging/providers/msg91/' +
- providerId
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- enabled: enabled
- }
+ response = await sdk.forProject.messaging.updateMsg91Provider(
+ providerId,
+ undefined,
+ enabled
);
break;
case Providers.Telesign:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- sdk.forProject.client.config.endpoint +
- '/messaging/providers/telesign/' +
- providerId
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- enabled: enabled
- }
+ response = await sdk.forProject.messaging.updateTelesignProvider(
+ providerId,
+ undefined,
+ enabled
);
break;
case Providers.Textmagic:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- sdk.forProject.client.config.endpoint +
- '/messaging/providers/textmagic/' +
- providerId
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- enabled: enabled
- }
+ response = await sdk.forProject.messaging.updateTextmagicProvider(
+ providerId,
+ undefined,
+ enabled
);
break;
case Providers.Vonage:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- sdk.forProject.client.config.endpoint +
- '/messaging/providers/vonage/' +
- providerId
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- enabled: enabled
- }
+ response = await sdk.forProject.messaging.updateVonageProvider(
+ providerId,
+ undefined,
+ enabled
);
break;
case Providers.Mailgun:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- sdk.forProject.client.config.endpoint +
- '/messaging/providers/mailgun/' +
- providerId
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- enabled: enabled
- }
+ response = await sdk.forProject.messaging.updateMailgunProvider(
+ providerId,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ enabled
);
break;
case Providers.Sendgrid:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- sdk.forProject.client.config.endpoint +
- '/messaging/providers/sendgrid/' +
- providerId
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- enabled: enabled
- }
+ response = await sdk.forProject.messaging.updateSendgridProvider(
+ providerId,
+ undefined,
+ enabled
+ );
+ break;
+ case Providers.SMTP:
+ response = await sdk.forProject.messaging.updateSMTPProvider(
+ providerId,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ enabled
);
break;
case Providers.FCM:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- sdk.forProject.client.config.endpoint +
- '/messaging/providers/fcm/' +
- providerId
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- enabled: enabled
- }
+ response = await sdk.forProject.messaging.updateFCMProvider(
+ providerId,
+ undefined,
+ enabled
);
break;
case Providers.APNS:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- sdk.forProject.client.config.endpoint +
- '/messaging/providers/apns/' +
- providerId
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- enabled: enabled
- }
+ response = await sdk.forProject.messaging.updateAPNSProvider(
+ providerId,
+ undefined,
+ enabled
);
break;
}
diff --git a/src/routes/console/project-[project]/messaging/providers/store.ts b/src/routes/console/project-[project]/messaging/providers/store.ts
index 5addf11758..dc39148491 100644
--- a/src/routes/console/project-[project]/messaging/providers/store.ts
+++ b/src/routes/console/project-[project]/messaging/providers/store.ts
@@ -1,7 +1,7 @@
import type { Column } from '$lib/helpers/types';
import { writable } from 'svelte/store';
import { Providers } from '../provider.svelte';
-import { ProviderTypes } from '../providerType.svelte';
+import { MessagingProviderType, SMTPEncryption } from '@appwrite.io/console';
export const columns = writable([
{ id: '$id', title: 'Provider ID', type: 'string', show: true },
@@ -12,24 +12,27 @@ export const columns = writable([
]);
type ProvidersMap = {
- [key in ProviderTypes]: {
+ [key in MessagingProviderType]: {
name: string;
text: string;
icon: string;
providers: {
[key in Providers]?: {
- imageIcon: string;
+ imageIcon?: string;
+ classIcon?: string;
title: string;
link: string;
description: string;
configure: {
label: string;
name: string;
- type: 'text' | 'password' | 'phone' | 'email' | 'domain' | 'file' | 'switch';
+ type: 'text' | 'password' | 'phone' | 'email' | 'domain' | 'file' | 'switch' | 'select';
placeholder?: string;
description?: string;
popover?: string[];
allowedFileExtensions?: string[];
+ optional?: boolean;
+ options?: { label: string; value: string | number | boolean }[];
}[];
};
};
@@ -37,7 +40,7 @@ type ProvidersMap = {
};
export const providers: ProvidersMap = {
- [ProviderTypes.Push]: {
+ [MessagingProviderType.Push]: {
name: 'Push notification',
text: 'notifications',
icon: 'device-mobile',
@@ -138,7 +141,7 @@ export const providers: ProvidersMap = {
// }
}
},
- [ProviderTypes.Email]: {
+ [MessagingProviderType.Email]: {
name: 'Email',
text: 'emails',
icon: 'mail',
@@ -188,18 +191,21 @@ export const providers: ProvidersMap = {
label: 'Sender name',
name: 'fromName',
type: 'text',
+ optional: true,
placeholder: 'Enter name'
},
{
label: 'Reply-to email',
name: 'replyToEmail',
type: 'email',
+ optional: true,
placeholder: 'Enter email'
},
{
label: 'Reply-to name',
name: 'replyToName',
type: 'text',
+ optional: true,
placeholder: 'Enter name'
}
]
@@ -231,18 +237,107 @@ export const providers: ProvidersMap = {
label: 'Sender name',
name: 'fromName',
type: 'text',
+ optional: true,
placeholder: 'Enter name'
},
{
label: 'Reply-to email',
name: 'replyToEmail',
type: 'email',
+ optional: true,
placeholder: 'Enter email'
},
{
label: 'Reply-to name',
name: 'replyToName',
type: 'text',
+ optional: true,
+ placeholder: 'Enter name'
+ }
+ ]
+ },
+ [Providers.SMTP]: {
+ classIcon: 'mail',
+ title: 'SMTP',
+ link: '',
+ description: '',
+ configure: [
+ {
+ label: 'Host',
+ name: 'host',
+ type: 'text',
+ placeholder: 'Enter host'
+ },
+ {
+ label: 'Port',
+ name: 'port',
+ type: 'text',
+ optional: true,
+ placeholder: 'Enter port'
+ },
+ {
+ label: 'Username',
+ name: 'username',
+ type: 'text',
+ optional: true,
+ placeholder: 'Enter username'
+ },
+ {
+ label: 'Password',
+ name: 'password',
+ type: 'text',
+ optional: true,
+ placeholder: 'Enter password'
+ },
+ {
+ label: 'Encryption',
+ name: 'encryption',
+ type: 'select',
+ options: [
+ { label: 'None', value: SMTPEncryption.None },
+ { label: 'SSL', value: SMTPEncryption.Ssl },
+ { label: 'TLS', value: SMTPEncryption.Tls }
+ ]
+ },
+ {
+ label: 'Auto TLS',
+ name: 'autoTLS',
+ description: 'Automatically uses TLS encryption',
+ type: 'switch',
+ optional: true
+ },
+ {
+ label: 'Mailer',
+ name: 'mailer',
+ type: 'text',
+ optional: true,
+ placeholder: 'Enter mailer'
+ },
+ {
+ label: 'Sender email',
+ name: 'fromEmail',
+ type: 'email',
+ placeholder: 'Enter email'
+ },
+ {
+ label: 'Sender name',
+ name: 'fromName',
+ type: 'text',
+ optional: true,
+ placeholder: 'Enter name'
+ },
+ {
+ label: 'Reply-to email',
+ name: 'replyToEmail',
+ type: 'email',
+ optional: true,
+ placeholder: 'Enter email'
+ },
+ {
+ label: 'Reply-to name',
+ name: 'replyToName',
+ type: 'text',
+ optional: true,
placeholder: 'Enter name'
}
]
@@ -250,7 +345,7 @@ export const providers: ProvidersMap = {
}
},
- [ProviderTypes.Sms]: {
+ [MessagingProviderType.Sms]: {
name: 'SMS',
text: 'SMS',
icon: 'annotation',
@@ -357,7 +452,7 @@ export const providers: ProvidersMap = {
},
[Providers.Textmagic]: {
imageIcon: 'textmagic',
- title: 'TextMagic',
+ title: 'TextMagic',
link: 'https://app.textmagic.com/login',
description: '',
configure: [
diff --git a/src/routes/console/project-[project]/messaging/providers/table.svelte b/src/routes/console/project-[project]/messaging/providers/table.svelte
index 2921c40ecf..541308dab2 100644
--- a/src/routes/console/project-[project]/messaging/providers/table.svelte
+++ b/src/routes/console/project-[project]/messaging/providers/table.svelte
@@ -34,21 +34,7 @@
async function handleDelete() {
showDelete = false;
- function deleteProvider(providerId: string) {
- return sdk.forProject.client.call(
- 'DELETE',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/providers/${providerId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- }
- );
- }
-
- const promises = selectedIds.map((id) => deleteProvider(id));
+ const promises = selectedIds.map((id) => sdk.forProject.messaging.deleteProvider(id));
try {
await Promise.all(promises);
diff --git a/src/routes/console/project-[project]/messaging/providers/update.svelte b/src/routes/console/project-[project]/messaging/providers/update.svelte
index 9b9dfd1bc5..9533156294 100644
--- a/src/routes/console/project-[project]/messaging/providers/update.svelte
+++ b/src/routes/console/project-[project]/messaging/providers/update.svelte
@@ -12,204 +12,123 @@
import { provider, providerParams } from './wizard/store';
import { Providers } from '../provider.svelte';
import { Dependencies } from '$lib/constants';
+ import type { Models } from '@appwrite.io/console';
async function update() {
try {
- let response = { $id: '', name: '' };
+ let response: Models.Provider;
const providerId = $providerParams[$provider].providerId;
switch ($provider) {
case Providers.Twilio:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/providers/twilio/${providerId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- providerId: providerId,
- name: $providerParams[$provider].name,
- enabled: $providerParams[$provider].enabled,
- accountSid: $providerParams[$provider].accountSid,
- authToken: $providerParams[$provider].authToken,
- from: $providerParams[$provider].from
- }
+ response = await sdk.forProject.messaging.updateTwilioProvider(
+ providerId,
+ $providerParams[$provider].name,
+ $providerParams[$provider].enabled,
+ $providerParams[$provider].accountSid,
+ $providerParams[$provider].authToken,
+ $providerParams[$provider].from
);
break;
case Providers.Msg91:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/providers/msg91/${providerId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- providerId: providerId,
- name: $providerParams[$provider].name,
- enabled: $providerParams[$provider].enabled,
- from: $providerParams[$provider].from,
- senderId: $providerParams[$provider].senderId,
- authKey: $providerParams[$provider].authKey
- }
+ response = await sdk.forProject.messaging.updateMsg91Provider(
+ providerId,
+ $providerParams[$provider].name,
+ $providerParams[$provider].enabled,
+ $providerParams[$provider].senderId,
+ $providerParams[$provider].authKey,
+ $providerParams[$provider].from
);
break;
case Providers.Telesign:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/providers/telesign/${providerId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- providerId: providerId,
- name: $providerParams[$provider].name,
- enabled: $providerParams[$provider].enabled,
- from: $providerParams[$provider].from,
- username: $providerParams[$provider].username,
- password: $providerParams[$provider].password
- }
+ response = await sdk.forProject.messaging.updateTelesignProvider(
+ providerId,
+ $providerParams[$provider].name,
+ $providerParams[$provider].enabled,
+ $providerParams[$provider].username,
+ $providerParams[$provider].password,
+ $providerParams[$provider].from
);
break;
case Providers.Textmagic:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/providers/textmagic/${providerId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- providerId: providerId,
- name: $providerParams[$provider].name,
- enabled: $providerParams[$provider].enabled,
- from: $providerParams[$provider].from,
- username: $providerParams[$provider].username,
- apiKey: $providerParams[$provider].apiKey
- }
+ response = await sdk.forProject.messaging.updateTextmagicProvider(
+ providerId,
+ $providerParams[$provider].name,
+ $providerParams[$provider].enabled,
+ $providerParams[$provider].username,
+ $providerParams[$provider].apiKey,
+ $providerParams[$provider].from
);
break;
case Providers.Vonage:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/providers/vonage/${providerId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- providerId: providerId,
- name: $providerParams[$provider].name,
- enabled: $providerParams[$provider].enabled,
- from: $providerParams[$provider].from,
- apiKey: $providerParams[$provider].apiKey,
- apiSecret: $providerParams[$provider].apiSecret
- }
+ response = await sdk.forProject.messaging.updateVonageProvider(
+ providerId,
+ $providerParams[$provider].name,
+ $providerParams[$provider].enabled,
+ $providerParams[$provider].apiKey,
+ $providerParams[$provider].apiSecret,
+ $providerParams[$provider].from
);
break;
case Providers.Mailgun:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/providers/mailgun/${providerId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- providerId: providerId,
- name: $providerParams[$provider].name,
- enabled: $providerParams[$provider].enabled,
- isEuRegion: $providerParams[$provider].isEuRegion,
- fromEmail: $providerParams[$provider].fromEmail,
- fromName: $providerParams[$provider].fromName,
- replyToEmail: $providerParams[$provider].replyToEmail,
- replyToName: $providerParams[$provider].replyToName,
- apiKey: $providerParams[$provider].apiKey,
- domain: $providerParams[$provider].domain
- }
+ response = await sdk.forProject.messaging.updateMailgunProvider(
+ providerId,
+ $providerParams[$provider].name,
+ $providerParams[$provider].apiKey,
+ $providerParams[$provider].domain,
+ $providerParams[$provider].isEuRegion,
+ $providerParams[$provider].enabled,
+ $providerParams[$provider].fromName,
+ $providerParams[$provider].fromEmail,
+ $providerParams[$provider].replyToName,
+ $providerParams[$provider].replyToEmail
);
break;
case Providers.Sendgrid:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/providers/sendgrid/${providerId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- providerId: providerId,
- name: $providerParams[$provider].name,
- enabled: $providerParams[$provider].enabled,
- fromEmail: $providerParams[$provider].fromEmail,
- fromName: $providerParams[$provider].fromName,
- replyToEmail: $providerParams[$provider].replyToEmail,
- replyToName: $providerParams[$provider].replyToName,
- apiKey: $providerParams[$provider].apiKey
- }
+ response = await sdk.forProject.messaging.updateSendgridProvider(
+ providerId,
+ $providerParams[$provider].name,
+ $providerParams[$provider].enabled,
+ $providerParams[$provider].apiKey,
+ $providerParams[$provider].fromName,
+ $providerParams[$provider].fromEmail,
+ $providerParams[$provider].replyToName,
+ $providerParams[$provider].replyToEmail
+ );
+ break;
+ case Providers.SMTP:
+ response = await sdk.forProject.messaging.updateSMTPProvider(
+ providerId,
+ $providerParams[$provider].name,
+ $providerParams[$provider].host,
+ $providerParams[$provider].port || undefined,
+ $providerParams[$provider].username || undefined,
+ $providerParams[$provider].password || undefined,
+ $providerParams[$provider].encryption,
+ $providerParams[$provider].autoTLS,
+ $providerParams[$provider].fromName || undefined,
+ $providerParams[$provider].fromEmail,
+ $providerParams[$provider].replyToName || undefined,
+ $providerParams[$provider].replyToEmail || undefined,
+ $providerParams[$provider].enabled
);
break;
case Providers.FCM:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/providers/fcm')/${providerId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- providerId: providerId,
- name: $providerParams[$provider].name,
- enabled: $providerParams[$provider].enabled,
- serviceAccountJSON: $providerParams[$provider].serviceAccountJSON
- }
+ response = await sdk.forProject.messaging.updateFCMProvider(
+ providerId,
+ $providerParams[$provider].name,
+ $providerParams[$provider].enabled,
+ JSON.parse($providerParams[$provider].serviceAccountJSON)
);
break;
case Providers.APNS:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/providers/apns/${providerId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- providerId: providerId,
- name: $providerParams[$provider].name,
- enabled: $providerParams[$provider].enabled,
- authKey: $providerParams[$provider].authKey,
- authKeyId: $providerParams[$provider].authKeyId,
- teamId: $providerParams[$provider].teamId,
- bundleId: $providerParams[$provider].bundleId
- }
+ response = await sdk.forProject.messaging.updateAPNSProvider(
+ providerId,
+ $providerParams[$provider].name,
+ $providerParams[$provider].enabled,
+ $providerParams[$provider].authKey,
+ $providerParams[$provider].authKeyId,
+ $providerParams[$provider].teamId,
+ $providerParams[$provider].bundleId
);
break;
}
diff --git a/src/routes/console/project-[project]/messaging/providers/wizard/configure.svelte b/src/routes/console/project-[project]/messaging/providers/wizard/configure.svelte
index b15aef2aad..a15c52d4e0 100644
--- a/src/routes/console/project-[project]/messaging/providers/wizard/configure.svelte
+++ b/src/routes/console/project-[project]/messaging/providers/wizard/configure.svelte
@@ -4,6 +4,7 @@
InputDomain,
InputEmail,
InputFile,
+ InputSelect,
InputSwitch,
InputText,
InputPassword
@@ -58,6 +59,7 @@
id={input.name}
label={input.label}
placeholder={input.placeholder}
+ required={!input.optional}
isPopoverDefined={input.popover !== undefined}
bind:value={$providerParams[$provider][input.name]}>
@@ -79,6 +81,7 @@
id={input.name}
label={input.label}
placeholder={input.placeholder}
+ required={!input.optional}
bind:value={$providerParams[$provider][input.name]}>
@@ -91,6 +94,7 @@
id={input.name}
label={input.label}
placeholder={input.placeholder}
+ required={!input.optional}
bind:value={$providerParams[$provider][input.name]}>
@@ -103,6 +107,7 @@
id={input.name}
label={input.label}
placeholder={input.placeholder}
+ required={!input.optional}
bind:value={$providerParams[$provider][input.name]}>
@@ -114,6 +119,7 @@
@@ -125,11 +131,19 @@
{input.description}
+ {:else if input.type === 'select'}
+
{/if}
{/each}
diff --git a/src/routes/console/project-[project]/messaging/providers/wizard/provider.svelte b/src/routes/console/project-[project]/messaging/providers/wizard/provider.svelte
index 22682db74e..cb243b4362 100644
--- a/src/routes/console/project-[project]/messaging/providers/wizard/provider.svelte
+++ b/src/routes/console/project-[project]/messaging/providers/wizard/provider.svelte
@@ -6,6 +6,7 @@
import { FormList, InputText } from '$lib/elements/forms';
import { Pill } from '$lib/elements';
import { Providers } from '../../provider.svelte';
+ import { SMTPEncryption } from '@appwrite.io/console';
let name = '';
let showCustomId = false;
@@ -91,6 +92,24 @@
replyToName: ''
};
break;
+ case Providers.SMTP:
+ $providerParams[$provider] = {
+ providerId: id,
+ name: name,
+ enabled: true,
+ host: '',
+ port: 587,
+ username: '',
+ password: '',
+ autoTLS: true,
+ encryption: SMTPEncryption.Tls,
+ mailer: '',
+ fromEmail: '',
+ fromName: '',
+ replyToEmail: '',
+ replyToName: ''
+ };
+ break;
case Providers.FCM:
$providerParams[$provider] = {
providerId: id,
@@ -116,7 +135,7 @@
Provider
-
+
+ imageIcon={option.imageIcon}
+ icon={option.classIcon}>
{option.title}
{#if option.description}
{option.description}
diff --git a/src/routes/console/project-[project]/messaging/providers/wizard/store.ts b/src/routes/console/project-[project]/messaging/providers/wizard/store.ts
index 50665d03bb..f6894ad47e 100644
--- a/src/routes/console/project-[project]/messaging/providers/wizard/store.ts
+++ b/src/routes/console/project-[project]/messaging/providers/wizard/store.ts
@@ -1,6 +1,6 @@
import { writable } from 'svelte/store';
import type { Providers } from '../../provider.svelte';
-import type { ProviderTypes } from '../../providerType.svelte';
+import type { MessagingProviderType, SMTPEncryption } from '@appwrite.io/console';
type ProviderParams = {
providerId: string;
@@ -64,6 +64,20 @@ export type SendgridProviderParams = ProviderParams & {
apiKey: string;
};
+export type SMTPProviderParams = ProviderParams & {
+ fromEmail: string;
+ fromName: string;
+ replyToEmail: string;
+ replyToName: string;
+ host: string;
+ port: number;
+ username: string;
+ password: string;
+ encryption: SMTPEncryption;
+ autoTLS: boolean;
+ mailer: string;
+};
+
/**
* Push providers
*/
@@ -83,7 +97,7 @@ export type MQTTProviderParams = ProviderParams & {
serverKey: string;
};
-export const providerType = writable(null);
+export const providerType = writable(null);
export const provider = writable(null);
export const providerParams = writable<{
twilio: Partial;
@@ -93,6 +107,7 @@ export const providerParams = writable<{
vonage: Partial;
mailgun: Partial;
sendgrid: Partial;
+ smtp: Partial;
fcm: Partial;
apns: Partial;
}>({
@@ -103,6 +118,7 @@ export const providerParams = writable<{
vonage: null,
mailgun: null,
sendgrid: null,
+ smtp: null,
fcm: null,
apns: null
});
diff --git a/src/routes/console/project-[project]/messaging/providers/wizard/store.ts.bak b/src/routes/console/project-[project]/messaging/providers/wizard/store.ts.bak
deleted file mode 100644
index 0ee3ba46ca..0000000000
--- a/src/routes/console/project-[project]/messaging/providers/wizard/store.ts.bak
+++ /dev/null
@@ -1,161 +0,0 @@
-import { writable } from 'svelte/store';
-import type { Column } from '$lib/components/viewSelector.svelte';
-
-export let showCreate = writable(false);
-
-export const columns = writable([
- { id: '$id', title: 'Provider ID', show: true },
- { id: 'name', title: 'Name', show: true },
- { id: 'provider', title: 'Provider', show: true },
- { id: 'channel', title: 'Channel', show: true },
- { id: 'status', title: 'Status', show: true }
-]);
-
-export type Instruction = {
- text: string;
- input: {
- label: string;
- name: string;
- type: 'text' | 'domain' | 'email';
- placeholder: string;
- };
-};
-
-export const providers = {
- sms: {
- name: 'SMS',
- text: 'SMS',
- icon: 'annotation',
- providers: {
- twilio: {
- imageIcon: 'twilio',
- title: 'Twilio',
- description: ''
- },
- msg91: {
- imageIcon: 'msg91',
- title: 'MSG91',
- description: ''
- },
- telesign: {
- imageIcon: 'telesign',
- title: 'Telesign',
- description: ''
- },
- textmagic: {
- imageIcon: 'textmagic',
- title: 'Textmagic',
- description: ''
- },
- vonage: {
- imageIcon: 'vonage',
- title: 'Vonage',
- description: ''
- }
- }
- },
- email: {
- name: 'Email',
- text: 'emails',
- icon: 'mail',
- providers: {
- mailgun: {
- imageIcon: 'mailgun',
- title: 'Mailgun',
- description: '',
- initialize: [
- {
- text: 'Before you can create a Mailgun provider, you need to first create a Mailgun account.'
- },
- {
- text: 'Head to your Profile > API Security .'
- },
- {
- text: 'Generate a key and give it a name. Copy and paste it in the field below.',
- input: {
- label: 'API key',
- name: 'apiKey',
- type: 'text',
- placeholder: 'Enter API key'
- }
- },
- {
- // TODO: Update link to domain verification
- text: 'Head to Sending > Domains and click on \'Add New Domain\'. Verify your domain by following the instructions .',
- input: {
- label: 'Base URL',
- name: 'baseUrl',
- type: 'text',
- placeholder: 'Enter base URL'
- }
- }
- ],
- configure: [
- {
- text: 'Provide a display name your recipient will see when they receive your emails.',
- input: {
- label: 'From',
- name: 'from',
- type: 'text',
- placeholder: 'Enter name'
- }
- },
- {
- text: 'Provide an email address that will be visible to the recipient as the senders email address for this message.',
- input: {
- label: 'From email address',
- name: 'email',
- type: 'email',
- placeholder: 'Enter email'
- }
- },
- {
- text: 'Provide an email address for users to use when replying to your emails.',
- input: {
- label: 'Reply to',
- name: 'replyTo',
- type: 'email',
- placeholder: 'Enter email'
- }
- },
- {
- text: 'Provide the domain as it is registered on Mailgun.',
- input: {
- label: 'Domain',
- name: 'domain',
- type: 'domain',
- placeholder: 'Enter domain'
- }
- }
- ]
- },
- sendgrid: {
- imageIcon: 'sendgrid',
- title: 'Sendgrid',
- description: ''
- }
- }
- },
- push: {
- name: 'Push notification',
- text: 'notifications',
- icon: 'device-mobile',
- providers: {
- fcm: {
- imageIcon: 'firebase',
- title: 'FCM',
- description: 'Firebase Cloud Messaging'
- },
- apns: {
- imageIcon: 'apple',
- title: 'APNS',
- description: 'Apple Push Notification Service'
- },
- mqtt: {
- imageIcon: 'mqtt',
- title: 'MQTT',
- description: 'Message Queuing Telemtry Transport'
- }
- }
- }
-};
diff --git a/src/routes/console/project-[project]/messaging/topics/+page.ts b/src/routes/console/project-[project]/messaging/topics/+page.ts
index 62b54ab3f7..5a5186371e 100644
--- a/src/routes/console/project-[project]/messaging/topics/+page.ts
+++ b/src/routes/console/project-[project]/messaging/topics/+page.ts
@@ -1,4 +1,4 @@
-import { Query, type Models } from '@appwrite.io/console';
+import { Query } from '@appwrite.io/console';
import { sdk } from '$lib/stores/sdk';
import { getLimit, getPage, getQuery, getSearch, pageToOffset } from '$lib/helpers/load';
import { Dependencies, PAGE_LIMIT } from '$lib/constants';
@@ -15,38 +15,20 @@ export const load = async ({ depends, url, route }) => {
const parsedQueries = queryParamToMap(query || '[]');
queries.set(parsedQueries);
- const payload = {
- queries: [
- Query.limit(limit),
- Query.offset(offset),
- Query.orderDesc(''),
- ...parsedQueries.values()
- ]
- };
-
- if (search) {
- payload['search'] = search;
- }
-
- // TODO: remove when the API is ready with data
- // This allows us to mock w/ data and when search returns 0 results
- const topics: { topics: Models.Topic[]; total: number } = await sdk.forProject.client.call(
- 'GET',
- new URL(sdk.forProject.client.config.endpoint + '/messaging/topics'),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- payload
- );
-
return {
offset,
limit,
search,
query,
page,
- topics
+ topics: sdk.forProject.messaging.listTopics(
+ [
+ Query.limit(limit),
+ Query.offset(offset),
+ Query.orderDesc(''),
+ ...parsedQueries.values()
+ ],
+ search || undefined
+ )
};
};
diff --git a/src/routes/console/project-[project]/messaging/topics/create.svelte b/src/routes/console/project-[project]/messaging/topics/create.svelte
index 28093d7d2f..6ec708a0b1 100644
--- a/src/routes/console/project-[project]/messaging/topics/create.svelte
+++ b/src/routes/console/project-[project]/messaging/topics/create.svelte
@@ -17,19 +17,7 @@
const create = async () => {
try {
- const topic = await sdk.forProject.client.call(
- 'POST',
- new URL(sdk.forProject.client.config.endpoint + '/messaging/topics'),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- name,
- topicId: id ?? ID.unique()
- }
- );
+ const topic = await sdk.forProject.messaging.createTopic(id ?? ID.unique(), name);
name = '';
showCreate = false;
showCustomId = false;
diff --git a/src/routes/console/project-[project]/messaging/topics/table.svelte b/src/routes/console/project-[project]/messaging/topics/table.svelte
index c72533d667..8118edbf15 100644
--- a/src/routes/console/project-[project]/messaging/topics/table.svelte
+++ b/src/routes/console/project-[project]/messaging/topics/table.svelte
@@ -32,19 +32,7 @@
async function handleDelete() {
showDelete = false;
- function deleteTopic(topicId: string) {
- return sdk.forProject.client.call(
- 'DELETE',
- new URL(`${sdk.forProject.client.config.endpoint}/messaging/topics/${topicId}`),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- }
- );
- }
-
- const promises = selectedIds.map((id) => deleteTopic(id));
+ const promises = selectedIds.map((id) => sdk.forProject.messaging.deleteTopic(id));
try {
await Promise.all(promises);
diff --git a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/+layout.ts b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/+layout.ts
index 594acc96ba..234f55abfd 100644
--- a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/+layout.ts
+++ b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/+layout.ts
@@ -3,28 +3,13 @@ import Breadcrumbs from './breadcrumbs.svelte';
import Header from './header.svelte';
import { sdk } from '$lib/stores/sdk';
import { Dependencies } from '$lib/constants';
-import { error } from '@sveltejs/kit';
export const load: LayoutLoad = async ({ params, depends }) => {
depends(Dependencies.MESSAGING_TOPIC);
- const response = await sdk.forProject.client.call(
- 'GET',
- new URL(sdk.forProject.client.config.endpoint + '/messaging/topics/' + params.topic),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- }
- );
-
- try {
- return {
- header: Header,
- breadcrumbs: Breadcrumbs,
- topic: response
- };
- } catch (e) {
- throw error(e.code, e.message);
- }
+ return {
+ header: Header,
+ breadcrumbs: Breadcrumbs,
+ topic: sdk.forProject.messaging.getTopic(params.topic)
+ };
};
diff --git a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/activity/+page.ts b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/activity/+page.ts
index 97f3d29aeb..ac7c27bac3 100644
--- a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/activity/+page.ts
+++ b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/activity/+page.ts
@@ -1,4 +1,4 @@
-import { Query, type Models } from '@appwrite.io/console';
+import { Query } from '@appwrite.io/console';
import { sdk } from '$lib/stores/sdk';
import { getLimit, getPage, pageToOffset } from '$lib/helpers/load';
import { PAGE_LIMIT } from '$lib/constants';
@@ -9,26 +9,12 @@ export const load: PageLoad = async ({ params, url, route }) => {
const limit = getLimit(url, route, PAGE_LIMIT);
const offset = pageToOffset(page, limit);
- const payload = {
- queries: [Query.limit(limit), Query.offset(offset)]
- };
-
- // TODO: remove when the API is ready with data
- // This allows us to mock w/ data and when search returns 0 results
- const logs: Models.LogList = await sdk.forProject.client.call(
- 'GET',
- new URL(`${sdk.forProject.client.config.endpoint}/messaging/topics/${params.topic}/logs`),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- payload
- );
-
return {
offset,
limit,
- logs
+ logs: sdk.forProject.messaging.listTopicLogs(params.topic, [
+ Query.limit(limit),
+ Query.offset(offset)
+ ])
};
};
diff --git a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/deleteTopic.svelte b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/deleteTopic.svelte
index a3e4226e33..e0eb3a5ffc 100644
--- a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/deleteTopic.svelte
+++ b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/deleteTopic.svelte
@@ -13,15 +13,8 @@
export let showDelete = false;
const deleteTopic = async () => {
try {
- await sdk.forProject.client.call(
- 'DELETE',
- new URL(sdk.forProject.client.config.endpoint + '/messaging/topics/' + $topic.$id),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- }
- );
+ await sdk.forProject.messaging.deleteTopic($topic.$id);
+
showDelete = false;
addNotification({
type: 'success',
diff --git a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/+page.svelte b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/+page.svelte
index 80ff4bd13e..e5725ecc09 100644
--- a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/+page.svelte
+++ b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/+page.svelte
@@ -22,14 +22,13 @@
import { targetsById } from '../../../store';
import UserTargetsModal from '../../../userTargetsModal.svelte';
import { onMount } from 'svelte';
- import type { Subscriber } from './+page';
import { Filters, hasPageQueries } from '$lib/components/filters';
import { columns } from './store';
import { View } from '$lib/helpers/load';
export let data: PageData;
let showAdd = false;
- let subscribersByTargetId: Record = {};
+ let subscribersByTargetId: Record = {};
onMount(() => {
$targetsById = {};
@@ -43,29 +42,13 @@
async function addTargets(event: CustomEvent>) {
showAdd = false;
$targetsById = event.detail;
- async function addSubscriber(targetId: string) {
- await sdk.forProject.client.call(
- 'POST',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/topics/${$page.params.topic}/subscribers`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- subscriberId: ID.unique(),
- topicId: $page.params.topic,
- targetId: targetId
- }
- );
- }
const targetIds = Object.keys($targetsById).filter(
(targetId) => !(targetId in subscribersByTargetId)
);
- const promises = targetIds.map(addSubscriber);
+ const promises = targetIds.map((targetId) =>
+ sdk.forProject.messaging.createSubscriber($page.params.topic, ID.unique(), targetId)
+ );
try {
await Promise.all(promises);
diff --git a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/+page.ts b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/+page.ts
index eb7e8bb99a..a5bc68a9bc 100644
--- a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/+page.ts
+++ b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/+page.ts
@@ -1,22 +1,13 @@
-import { Query, type Models } from '@appwrite.io/console';
+import { Query } from '@appwrite.io/console';
import { sdk } from '$lib/stores/sdk';
import { getLimit, getPage, getQuery, getSearch, pageToOffset } from '$lib/helpers/load';
import { Dependencies, PAGE_LIMIT } from '$lib/constants';
import type { PageLoad } from './$types';
import { queryParamToMap, queries } from '$lib/components/filters';
-export type Subscriber = {
- $id: string;
- $createdAt: string;
- $updatedAt: string;
- targetId: string;
- target: Models.Target;
- userName: string;
- topicId: string;
-};
-
-export const load: PageLoad = async ({ params, url, route, depends, parent }) => {
+export const load: PageLoad = async ({ params, url, route, depends }) => {
depends(Dependencies.MESSAGING_TOPIC_SUBSCRIBERS);
+
const page = getPage(url);
const limit = getLimit(url, route, PAGE_LIMIT);
const offset = pageToOffset(page, limit);
@@ -26,43 +17,20 @@ export const load: PageLoad = async ({ params, url, route, depends, parent }) =>
const parsedQueries = queryParamToMap(query || '[]');
queries.set(parsedQueries);
- const payload = {
- queries: [
- Query.limit(limit),
- Query.offset(offset),
- Query.orderDesc(''),
- ...parsedQueries.values()
- ]
- };
-
- if (search) {
- payload['search'] = search;
- }
-
- const { topic } = await parent();
-
- // TODO: remove when the API is ready with data
- // This allows us to mock w/ data and when search returns 0 results
- const subscribers: { subscribers: Subscriber[]; total: number } =
- await sdk.forProject.client.call(
- 'GET',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/topics/${params.topic}/subscribers`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- payload
- );
-
return {
offset,
limit,
search,
query,
- topic,
- subscribers
+ subscribers: sdk.forProject.messaging.listSubscribers(
+ params.topic,
+ [
+ Query.limit(limit),
+ Query.offset(offset),
+ Query.orderDesc(''),
+ ...parsedQueries.values()
+ ],
+ search || undefined
+ )
};
};
diff --git a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/table.svelte b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/table.svelte
index 13fbbf7f0a..8fce7c8c38 100644
--- a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/table.svelte
+++ b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/table.svelte
@@ -19,19 +19,19 @@
import { addNotification } from '$lib/stores/notifications';
import type { PageData } from './$types';
import { columns } from './store';
- import ProviderType, { ProviderTypes } from '../../../providerType.svelte';
+ import ProviderType from '../../../providerType.svelte';
import { toLocaleDateTime } from '$lib/helpers/date';
import { project } from '$routes/console/project-[project]/store';
import { sdk } from '$lib/stores/sdk';
import { page } from '$app/stores';
import { targetsById } from '../../../store';
- import type { Subscriber } from './+page';
+ import { MessagingProviderType, type Models } from '@appwrite.io/console';
export let data: PageData;
- let subscribers: Record = {};
+ let subscribers: Record = {};
let selectedIds: string[] = [];
- let selected: Record = {};
+ let selected: Record = {};
let showDelete = false;
let deleting = false;
@@ -39,17 +39,7 @@
showDelete = false;
async function deleteSubscriber(subscriberId: string) {
- await sdk.forProject.client.call(
- 'DELETE',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/topics/${$page.params.topic}/subscribers/${subscriberId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- }
- );
+ await sdk.forProject.messaging.deleteSubscriber($page.params.topic, subscriberId);
const { target } = subscribers[subscriberId];
const { [target.$id]: _, ...rest } = $targetsById;
$targetsById = rest;
@@ -125,7 +115,7 @@
{:else if column.id === 'target'}
- {#if target.providerType === ProviderTypes.Push}
+ {#if target.providerType === MessagingProviderType.Push}
{target.name}
{:else}
{target.identifier}
diff --git a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/updateName.svelte b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/updateName.svelte
index dfc6dd1af4..4b9305911f 100644
--- a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/updateName.svelte
+++ b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/updateName.svelte
@@ -15,19 +15,7 @@
});
async function updateName() {
try {
- // await sdk.forProject.users.updateName($provider.$id, providerName);
- await sdk.forProject.client.call(
- 'PATCH',
- new URL(`${sdk.forProject.client.config.endpoint}/messaging/topics/${$topic.$id}`),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- name: name
- }
- );
+ await sdk.forProject.messaging.updateTopic($topic.$id, name);
await invalidate(Dependencies.MESSAGING_TOPIC);
addNotification({
message: 'Name has been updated',
diff --git a/src/routes/console/project-[project]/messaging/topicsModal.svelte b/src/routes/console/project-[project]/messaging/topicsModal.svelte
index 771513a7b1..fb716fb17a 100644
--- a/src/routes/console/project-[project]/messaging/topicsModal.svelte
+++ b/src/routes/console/project-[project]/messaging/topicsModal.svelte
@@ -4,6 +4,7 @@
import { sdk } from '$lib/stores/sdk';
import { Query, type Models } from '@appwrite.io/console';
import { createEventDispatcher } from 'svelte';
+ import { providerType } from './wizard/store';
export let show: boolean;
export let topicsById: Record;
@@ -32,25 +33,7 @@
if (!show) return;
const queries = [Query.limit(5), Query.offset(offset)];
- const params = {
- queries
- };
-
- if (search) {
- params['search'] = search;
- }
-
- // TODO: replace with sdk.forProject.users.list once User type has targets
- const response = await sdk.forProject.client.call(
- 'GET',
- new URL(sdk.forProject.client.config.endpoint + '/messaging/topics'),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- params
- );
+ const response = await sdk.forProject.messaging.listTopics(queries, search || undefined);
totalResults = response.total;
topicResultsById = {};
@@ -97,7 +80,10 @@
- Select existing topics you want to send this message to its recipients.
+
+ Select existing topics you want to send this message to its subscribers. The message will be
+ sent only to {$providerType} targets.
+
;
- export let providerType: ProviderTypes = null;
- export let title = 'Select users';
+ export let providerType: MessagingProviderType = null;
+ export let title = 'Select subscribers';
const dispatch = createEventDispatcher();
@@ -40,31 +40,13 @@
if (!show) return;
const queries = [Query.limit(5), Query.offset(offset)];
- if (providerType === ProviderTypes.Email) {
+ if (providerType === MessagingProviderType.Email) {
queries.push(Query.notEqual('email', ''));
- } else if (providerType === ProviderTypes.Sms) {
+ } else if (providerType === MessagingProviderType.Sms) {
queries.push(Query.notEqual('phone', ''));
}
- const params = {
- queries
- };
-
- if (search) {
- params['search'] = search;
- }
-
- // TODO: replace with sdk.forProject.users.list once User type has targets
- const response = await sdk.forProject.client.call(
- 'GET',
- new URL(sdk.forProject.client.config.endpoint + '/users'),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- params
- );
+ const response = await sdk.forProject.users.list(queries, search || undefined);
totalResults = response.total;
userResultsById = {};
@@ -135,8 +117,15 @@
}
-
- Select recipients for this message from your users.
+
+
+
+ Add subscribers to this topic by selecting the targets for directing messages. Learn more about subscribers.
+
- {#if target.providerType !== ProviderTypes.Push}
+ {#if target.providerType !== MessagingProviderType.Push}
{target.identifier}
{:else}
diff --git a/src/routes/console/project-[project]/messaging/wizard.svelte b/src/routes/console/project-[project]/messaging/wizard.svelte
index 51dda10650..af3e989684 100644
--- a/src/routes/console/project-[project]/messaging/wizard.svelte
+++ b/src/routes/console/project-[project]/messaging/wizard.svelte
@@ -11,79 +11,46 @@
import { base } from '$app/paths';
import { project } from '../store';
import { wizard } from '$lib/stores/wizard';
- import {
- providerType,
- messageParams,
- MessageStatuses,
- type PushMessageParams,
- type SMSMessageParams,
- type EmailMessageParams,
- operation
- } from './wizard/store';
- import { ProviderTypes } from './providerType.svelte';
- import { ID } from '@appwrite.io/console';
+ import { providerType, messageParams, operation } from './wizard/store';
+ import { ID, MessageType, MessagingProviderType, type Models } from '@appwrite.io/console';
import { Dependencies } from '$lib/constants';
async function create() {
try {
- let response = { $id: '' };
+ let response: Models.Message;
const messageId = $messageParams[$providerType].messageId || ID.unique();
- const params = $messageParams[$providerType];
-
- console.log(params);
-
- const payload:
- | Partial
- | Partial
- | Partial = {
- topics: params.topics || [],
- users: params.users || [],
- targets: params.targets || []
- };
- Object.keys(params).forEach((key) => {
- if (['messageId', 'topics', 'users', 'targets'].includes(key)) return;
- if (typeof params[key] === 'undefined') return;
- payload[key] = params[key];
- });
-
switch ($providerType) {
- case ProviderTypes.Email:
- response = await sdk.forProject.client.call(
- 'POST',
- new URL(
- sdk.forProject.client.config.endpoint + '/messaging/messages/email'
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- ...payload,
- messageId
- }
+ case MessagingProviderType.Email:
+ response = await sdk.forProject.messaging.createEmail(
+ messageId,
+ $messageParams[$providerType].subject,
+ $messageParams[$providerType].content,
+ $messageParams[$providerType].topics,
+ $messageParams[$providerType].users,
+ $messageParams[$providerType].targets,
+ undefined,
+ undefined,
+ $messageParams[$providerType].status,
+ $messageParams[$providerType].html,
+ $messageParams[$providerType].scheduledAt
);
break;
- case ProviderTypes.Sms:
- response = await sdk.forProject.client.call(
- 'POST',
- new URL(sdk.forProject.client.config.endpoint + '/messaging/messages/sms'),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- ...payload,
- messageId
- }
+ case MessagingProviderType.Sms:
+ response = await sdk.forProject.messaging.createSMS(
+ messageId,
+ $messageParams[$providerType].content,
+ $messageParams[$providerType].topics,
+ $messageParams[$providerType].users,
+ $messageParams[$providerType].targets,
+ $messageParams[$providerType].status,
+ $messageParams[$providerType].scheduledAt
);
break;
- case ProviderTypes.Push:
+ case MessagingProviderType.Push:
{
const customData: Record = {};
- const { data } = $messageParams[ProviderTypes.Push];
+ const { data } = $messageParams[MessagingProviderType.Push];
if (data && data.length > 0) {
data.forEach((item) => {
if (item[0] === '') return;
@@ -91,35 +58,37 @@
});
}
- response = await sdk.forProject.client.call(
- 'POST',
- new URL(
- sdk.forProject.client.config.endpoint + '/messaging/messages/push'
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- ...payload,
- data: customData,
- messageId
- }
+ response = await sdk.forProject.messaging.createPush(
+ messageId,
+ $messageParams[$providerType].title,
+ $messageParams[$providerType].body,
+ $messageParams[$providerType].topics,
+ $messageParams[$providerType].users,
+ $messageParams[$providerType].targets,
+ customData,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ $messageParams[$providerType].status,
+ $messageParams[$providerType].scheduledAt
);
}
break;
}
wizard.hide();
let message = '';
- switch (params.status) {
- case MessageStatuses.DRAFT:
+ switch (response.status) {
+ case MessageType.Draft:
message = 'The message has been saved as draft.';
break;
- case MessageStatuses.PROCESSING:
+ case MessageType.Processing:
message = 'The message is queued for processing.';
break;
- case MessageStatuses.SCHEDULED:
+ case 'scheduled':
+ // TODO: fix message status
message = 'The message has been scheduled.';
break;
}
@@ -129,7 +98,7 @@
});
trackEvent(Submit.MessagingMessageCreate, {
providerType: $providerType,
- status: params.status
+ status: response.status
});
await goto(`${base}/console/project-${$project.$id}/messaging/message-${response.$id}`);
} catch (error) {
@@ -143,68 +112,45 @@
async function update() {
try {
- let response = { $id: '' };
+ let response: Models.Message;
+
const messageId = $messageParams[$providerType].messageId;
const params = $messageParams[$providerType];
console.log(params);
- const payload:
- | Partial
- | Partial
- | Partial = {
- topics: params.topics || [],
- users: params.users || [],
- targets: params.targets || []
- };
- Object.keys(params).forEach((key) => {
- if (['messageId', 'topics', 'users', 'targets'].includes(key)) return;
- if (typeof params[key] === 'undefined') return;
- payload[key] = params[key];
- });
-
- console.log(payload);
-
switch ($providerType) {
- case ProviderTypes.Email:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/messages/email/${messageId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- ...payload,
- messageId
- }
+ case MessagingProviderType.Email:
+ response = await sdk.forProject.messaging.updateEmail(
+ messageId,
+ $messageParams[$providerType].topics,
+ $messageParams[$providerType].users,
+ $messageParams[$providerType].targets,
+ $messageParams[$providerType].subject,
+ $messageParams[$providerType].content,
+ $messageParams[$providerType].status,
+ $messageParams[$providerType].html,
+ undefined,
+ undefined,
+ $messageParams[$providerType].scheduledAt
);
break;
- case ProviderTypes.Sms:
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/messages/sms/${messageId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- ...payload,
- messageId
- }
+ case MessagingProviderType.Sms:
+ response = await sdk.forProject.messaging.updateSMS(
+ messageId,
+ $messageParams[$providerType].topics,
+ $messageParams[$providerType].users,
+ $messageParams[$providerType].targets,
+ $messageParams[$providerType].content,
+ $messageParams[$providerType].status,
+ $messageParams[$providerType].scheduledAt
);
break;
- case ProviderTypes.Push:
+ case MessagingProviderType.Push:
{
const customData: Record = {};
- const { data } = $messageParams[ProviderTypes.Push];
+ const { data } = $messageParams[MessagingProviderType.Push];
if (data && data.length > 0) {
data.forEach((item) => {
if (item[0] === '') return;
@@ -212,35 +158,37 @@
});
}
- response = await sdk.forProject.client.call(
- 'PATCH',
- new URL(
- `${sdk.forProject.client.config.endpoint}/messaging/messages/push/${messageId}`
- ),
- {
- 'X-Appwrite-Project': sdk.forProject.client.config.project,
- 'content-type': 'application/json',
- 'X-Appwrite-Mode': 'admin'
- },
- {
- ...payload,
- data: customData,
- messageId
- }
+ response = await sdk.forProject.messaging.updatePush(
+ messageId,
+ $messageParams[$providerType].topics,
+ $messageParams[$providerType].users,
+ $messageParams[$providerType].targets,
+ $messageParams[$providerType].title,
+ $messageParams[$providerType].body,
+ customData,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ $messageParams[$providerType].status,
+ $messageParams[$providerType].scheduledAt
);
}
break;
}
wizard.hide();
let message = '';
- switch (params.status) {
- case MessageStatuses.DRAFT:
+ switch (response.status) {
+ case MessageType.Draft:
message = 'The message has been saved as draft.';
break;
- case MessageStatuses.PROCESSING:
+ case MessageType.Processing:
message = 'The message is queued for processing.';
break;
- case MessageStatuses.SCHEDULED:
+ case 'scheduled':
+ // TODO: fix message status
message = 'The message has been scheduled.';
break;
}
@@ -264,7 +212,7 @@
}
async function saveDraft() {
- $messageParams[$providerType].status = MessageStatuses.DRAFT;
+ $messageParams[$providerType].status = MessageType.Draft;
if ($operation === 'create') {
create();
} else {
diff --git a/src/routes/console/project-[project]/messaging/wizard/emailFormList.svelte b/src/routes/console/project-[project]/messaging/wizard/emailFormList.svelte
index 4b17e43e19..220cb5ea34 100644
--- a/src/routes/console/project-[project]/messaging/wizard/emailFormList.svelte
+++ b/src/routes/console/project-[project]/messaging/wizard/emailFormList.svelte
@@ -1,28 +1,5 @@
-
-
@@ -107,14 +92,14 @@
id="title"
label="Title"
placeholder="Enter title"
- bind:value={$messageParams[ProviderTypes.Push]['title']}>
+ bind:value={$messageParams[MessagingProviderType.Push]['title']}>
+ bind:value={$messageParams[MessagingProviderType.Push]['body']}>
{createMessage(providers[$providerType].text)}
- {#if $providerType === ProviderTypes.Email}
+ {#if $providerType === MessagingProviderType.Email}
- {:else if $providerType === ProviderTypes.Sms}
+ {:else if $providerType === MessagingProviderType.Sms}
- {:else if $providerType === ProviderTypes.Push}
+ {:else if $providerType === MessagingProviderType.Push}
{/if}
diff --git a/src/routes/console/project-[project]/messaging/wizard/step2.svelte b/src/routes/console/project-[project]/messaging/wizard/step2.svelte
index 6311d7560e..684eb031cc 100644
--- a/src/routes/console/project-[project]/messaging/wizard/step2.svelte
+++ b/src/routes/console/project-[project]/messaging/wizard/step2.svelte
@@ -51,7 +51,7 @@
Targets
Select users to whom this message should be directed.
+ >Select targets to whom this message should be directed.
{#if targetIdsLength === 0 && topicIdsLength === 0}
@@ -67,7 +67,7 @@
- Select recipients to get started
+ Select targets to get started
diff --git a/src/routes/console/project-[project]/messaging/wizard/step3.svelte b/src/routes/console/project-[project]/messaging/wizard/step3.svelte
index d7499bff31..fce6731eeb 100644
--- a/src/routes/console/project-[project]/messaging/wizard/step3.svelte
+++ b/src/routes/console/project-[project]/messaging/wizard/step3.svelte
@@ -2,7 +2,8 @@
import { FormList, InputDate, InputSelect, InputTime } from '$lib/elements/forms';
import Helper from '$lib/elements/forms/helper.svelte';
import { WizardStep } from '$lib/layout';
- import { MessageStatuses, messageParams, providerType } from './store';
+ import { MessageType } from '@appwrite.io/console';
+ import { messageParams, providerType } from './store';
let when: 'now' | 'later' = 'now';
let now = new Date();
@@ -27,9 +28,9 @@
};
async function beforeSubmit() {
- $messageParams[$providerType].status = MessageStatuses.PROCESSING;
+ $messageParams[$providerType].status = MessageType.Processing;
if (when === 'later') {
- $messageParams[$providerType].status = MessageStatuses.SCHEDULED;
+ $messageParams[$providerType].status = 'scheduled' as MessageType;
$messageParams[$providerType].scheduledAt = dateTime.toISOString();
}
}
@@ -53,8 +54,7 @@
Schedule
Schedule the time you want your users to receive this message. Learn more in our
- documentation.
+ >Schedule the time you want to deliver this message. Learn more in our documentation.
('create');
-export const providerType = writable
(null);
+export const providerType = writable(null);
export const targetsById = writable>({});
export const messageParams = writable<{
- [ProviderTypes.Email]: Partial;
- [ProviderTypes.Sms]: Partial;
- [ProviderTypes.Push]: Partial;
+ [MessagingProviderType.Email]: Partial;
+ [MessagingProviderType.Sms]: Partial;
+ [MessagingProviderType.Push]: Partial;
}>({
- [ProviderTypes.Email]: null,
- [ProviderTypes.Sms]: null,
- [ProviderTypes.Push]: null
+ [MessagingProviderType.Email]: null,
+ [MessagingProviderType.Sms]: null,
+ [MessagingProviderType.Push]: null
});
diff --git a/src/routes/console/project-[project]/overview/platforms/wizard/android/step1.svelte b/src/routes/console/project-[project]/overview/platforms/wizard/android/step1.svelte
index c355c08690..d756e05b97 100644
--- a/src/routes/console/project-[project]/overview/platforms/wizard/android/step1.svelte
+++ b/src/routes/console/project-[project]/overview/platforms/wizard/android/step1.svelte
@@ -5,6 +5,7 @@
import { sdk } from '$lib/stores/sdk';
import { createPlatform } from '../store';
import { Submit, trackEvent } from '$lib/actions/analytics';
+ import { PlatformType } from '@appwrite.io/console';
const projectId = $page.params.project;
@@ -24,7 +25,7 @@
const platform = await sdk.forConsole.projects.createPlatform(
projectId,
- 'android',
+ PlatformType.Android,
$createPlatform.name,
$createPlatform.key || undefined,
undefined,
diff --git a/src/routes/console/project-[project]/overview/platforms/wizard/apple/step1.svelte b/src/routes/console/project-[project]/overview/platforms/wizard/apple/step1.svelte
index 7b690ad1b1..46adf251d3 100644
--- a/src/routes/console/project-[project]/overview/platforms/wizard/apple/step1.svelte
+++ b/src/routes/console/project-[project]/overview/platforms/wizard/apple/step1.svelte
@@ -6,15 +6,9 @@
import { sdk } from '$lib/stores/sdk';
import { createPlatform } from '../store';
import { Submit, trackEvent } from '$lib/actions/analytics';
+ import { PlatformType } from '@appwrite.io/console';
- enum Platform {
- iOS = 'apple-ios',
- macOS = 'apple-macos',
- watchOS = 'apple-watchos',
- tvOS = 'apple-tvos'
- }
-
- let platform: Platform = Platform.iOS;
+ let platform: PlatformType = PlatformType.Appleios;
const projectId = $page.params.project;
@@ -50,26 +44,26 @@
(platform = Platform.iOS)}
- selected={platform === Platform.iOS}>
+ on:click={() => (platform = PlatformType.Appleios)}
+ selected={platform === PlatformType.Appleios}>
iOS
(platform = Platform.macOS)}
- selected={platform === Platform.macOS}>
+ on:click={() => (platform = PlatformType.Applemacos)}
+ selected={platform === PlatformType.Applemacos}>
macOS
(platform = Platform.watchOS)}
- selected={platform === Platform.watchOS}>
+ on:click={() => (platform = PlatformType.Applewatchos)}
+ selected={platform === PlatformType.Applewatchos}>
watchOS
(platform = Platform.tvOS)}
- selected={platform === Platform.tvOS}>
+ on:click={() => (platform = PlatformType.Appletvos)}
+ selected={platform === PlatformType.Appletvos}>
tvOS
diff --git a/src/routes/console/project-[project]/overview/platforms/wizard/flutter/step1.svelte b/src/routes/console/project-[project]/overview/platforms/wizard/flutter/step1.svelte
index 3aeb1ea3cb..3aa0a579ba 100644
--- a/src/routes/console/project-[project]/overview/platforms/wizard/flutter/step1.svelte
+++ b/src/routes/console/project-[project]/overview/platforms/wizard/flutter/step1.svelte
@@ -6,77 +6,123 @@
import { sdk } from '$lib/stores/sdk';
import { createPlatform } from '../store';
import { Submit, trackEvent } from '$lib/actions/analytics';
+ import { PlatformType } from '@appwrite.io/console';
+ import { isValueOfStringEnum } from '$lib/helpers/types';
- enum Platform {
- Android = 'flutter-android',
- Ios = 'flutter-ios',
- Linux = 'flutter-linux',
- Macos = 'flutter-macos',
- Windows = 'flutter-windows',
- Web = 'flutter-web'
- }
+ // enum Platform {
+ // Android = 'flutter-android',
+ // Ios = 'flutter-ios',
+ // Linux = 'flutter-linux',
+ // Macos = 'flutter-macos',
+ // Windows = 'flutter-windows',
+ // Web = 'flutter-web'
+ // }
- function isPlatform(value: string): value is Platform {
- return Object.values(Platform).includes(value as Platform);
- }
+ // function isPlatform(value: string): value is Platform {
+ // return Object.values(Platform).includes(value as Platform);
+ // }
- let platform: Platform = isPlatform($createPlatform.type)
+ let platform: PlatformType = isValueOfStringEnum(PlatformType, $createPlatform.type)
? $createPlatform.type
- : Platform.Android;
+ : PlatformType.Flutterandroid;
const projectId = $page.params.project;
const suggestions = ['*.vercel.app', '*.netlify.app', '*.gitpod.io'];
const placeholder: Record<
- Platform,
+ PlatformType,
{
name: string;
hostname: string;
tooltip: string;
}
> = {
- [Platform.Android]: {
+ [PlatformType.Flutterandroid]: {
name: 'My Android App',
hostname: 'com.company.appname',
tooltip:
'Your package name is generally the applicationId in your app-level build.gradle file.'
},
- [Platform.Ios]: {
+ [PlatformType.Flutterios]: {
name: 'My iOS App',
hostname: 'com.company.appname',
tooltip:
"You can find your Bundle Identifier in the General tab for your app's primary target in Xcode."
},
- [Platform.Linux]: {
+ [PlatformType.Flutterlinux]: {
name: 'My Linux App',
hostname: 'appname',
tooltip: 'Your application name'
},
- [Platform.Macos]: {
+ [PlatformType.Fluttermacos]: {
name: 'My mac OS App',
hostname: 'com.company.appname',
tooltip:
"You can find your Bundle Identifier in the General tab for your app's primary target in Xcode."
},
- [Platform.Web]: {
+ [PlatformType.Flutterweb]: {
name: 'My Web App',
hostname: 'localhost',
tooltip:
'The hostname that your website will use to interact with the Appwrite APIs in production or development environments. No protocol or port number required.'
},
- [Platform.Windows]: {
+ [PlatformType.Flutterwindows]: {
name: 'My Windows App',
hostname: 'appname',
tooltip: 'Your application name'
+ },
+ // The following are not used, but added to avoid TS errors
+ [PlatformType.Web]: {
+ name: '',
+ hostname: '',
+ tooltip: ''
+ },
+ [PlatformType.Appleios]: {
+ name: '',
+ hostname: '',
+ tooltip: ''
+ },
+ [PlatformType.Applemacos]: {
+ name: '',
+ hostname: '',
+ tooltip: ''
+ },
+ [PlatformType.Applewatchos]: {
+ name: '',
+ hostname: '',
+ tooltip: ''
+ },
+ [PlatformType.Appletvos]: {
+ name: '',
+ hostname: '',
+ tooltip: ''
+ },
+ [PlatformType.Android]: {
+ name: '',
+ hostname: '',
+ tooltip: ''
+ },
+ [PlatformType.Unity]: {
+ name: '',
+ hostname: '',
+ tooltip: ''
}
};
- const hostname: Record = {
- [Platform.Android]: 'Package Name',
- [Platform.Ios]: 'Bundle ID',
- [Platform.Linux]: 'Package Name',
- [Platform.Macos]: 'Bundle ID',
- [Platform.Web]: 'Hostname',
- [Platform.Windows]: 'Package Name'
+ const hostname: Record = {
+ [PlatformType.Flutterandroid]: 'Package Name',
+ [PlatformType.Flutterios]: 'Bundle ID',
+ [PlatformType.Flutterlinux]: 'Package Name',
+ [PlatformType.Fluttermacos]: 'Bundle ID',
+ [PlatformType.Flutterweb]: 'Hostname',
+ [PlatformType.Flutterwindows]: 'Package Name',
+ // The following are not used, but added to avoid TS errors
+ [PlatformType.Web]: '',
+ [PlatformType.Appleios]: '',
+ [PlatformType.Applemacos]: '',
+ [PlatformType.Applewatchos]: '',
+ [PlatformType.Appletvos]: '',
+ [PlatformType.Android]: '',
+ [PlatformType.Unity]: ''
};
async function beforeSubmit() {
@@ -88,9 +134,9 @@
projectId,
platform,
$createPlatform.name,
- platform !== Platform.Web ? $createPlatform.key : undefined,
+ platform !== PlatformType.Flutterweb ? $createPlatform.key : undefined,
undefined,
- platform === Platform.Web ? $createPlatform.hostname : undefined
+ platform === PlatformType.Flutterweb ? $createPlatform.hostname : undefined
);
trackEvent(Submit.PlatformCreate, {
@@ -102,12 +148,12 @@
}
$: registee = {
- [Platform.Android]: 'package name',
- [Platform.Ios]: 'bundle ID',
- [Platform.Linux]: 'package name',
- [Platform.Macos]: 'bundle ID',
- [Platform.Windows]: 'package name',
- [Platform.Web]: 'hostname'
+ [PlatformType.Flutterandroid]: 'package name',
+ [PlatformType.Flutterios]: 'bundle ID',
+ [PlatformType.Flutterlinux]: 'package name',
+ [PlatformType.Fluttermacos]: 'bundle ID',
+ [PlatformType.Flutterwindows]: 'package name',
+ [PlatformType.Flutterweb]: 'hostname'
}[platform];
@@ -117,38 +163,38 @@
(platform = Platform.Android)}
- selected={platform === Platform.Android}>
+ on:click={() => (platform = PlatformType.Flutterandroid)}
+ selected={platform === PlatformType.Flutterandroid}>
Android
(platform = Platform.Ios)}
- selected={platform === Platform.Ios}>
+ on:click={() => (platform = PlatformType.Flutterios)}
+ selected={platform === PlatformType.Flutterios}>
iOS
(platform = Platform.Linux)}
- selected={platform === Platform.Linux}>
+ on:click={() => (platform = PlatformType.Flutterlinux)}
+ selected={platform === PlatformType.Flutterlinux}>
Linux
(platform = Platform.Macos)}
- selected={platform === Platform.Macos}>
+ on:click={() => (platform = PlatformType.Fluttermacos)}
+ selected={platform === PlatformType.Fluttermacos}>
macOS
(platform = Platform.Windows)}
- selected={platform === Platform.Windows}>
+ on:click={() => (platform = PlatformType.Flutterwindows)}
+ selected={platform === PlatformType.Flutterwindows}>
Windows
(platform = Platform.Web)}
- selected={platform === Platform.Web}>
+ on:click={() => (platform = PlatformType.Flutterweb)}
+ selected={platform === PlatformType.Flutterweb}>
Web
@@ -161,7 +207,7 @@
placeholder={placeholder[platform].name}
required
bind:value={$createPlatform.name} />
- {#if platform === Platform.Web}
+ {#if platform === PlatformType.Flutterweb}
Promise;
+ load: (start: string, end: string, period: ProjectUsageRange) => Promise;
}
>('projectUsage', function ({ set }) {
return {
diff --git a/src/routes/console/project-[project]/settings/domains/+page.svelte b/src/routes/console/project-[project]/settings/domains/+page.svelte
index 6ad7b183b6..f281c55b54 100644
--- a/src/routes/console/project-[project]/settings/domains/+page.svelte
+++ b/src/routes/console/project-[project]/settings/domains/+page.svelte
@@ -1,14 +1,15 @@
-
+
Custom Domains
diff --git a/src/routes/console/project-[project]/settings/domains/+page.ts b/src/routes/console/project-[project]/settings/domains/+page.ts
index 556cd66c26..16a598b515 100644
--- a/src/routes/console/project-[project]/settings/domains/+page.ts
+++ b/src/routes/console/project-[project]/settings/domains/+page.ts
@@ -1,14 +1,15 @@
import { Dependencies } from '$lib/constants';
import { sdk } from '$lib/stores/sdk';
-import { Query } from '@appwrite.io/console';
+import { Query, ResourceType } from '@appwrite.io/console';
import type { PageLoad } from './$types';
-import { ProxyTypes } from '$lib/pages/domains/index.svelte';
export const load: PageLoad = async ({ depends, url }) => {
depends(Dependencies.DOMAINS);
return {
- rules: await sdk.forProject.proxy.listRules([Query.equal('resourceType', ProxyTypes.API)]),
+ rules: await sdk.forProject.proxy.listRules([
+ Query.equal('resourceType', ResourceType.Api)
+ ]),
create: url.searchParams.get('create') !== null
};
};
diff --git a/src/routes/console/project-[project]/settings/smtp/+page.svelte b/src/routes/console/project-[project]/settings/smtp/+page.svelte
index a35ad9ea7b..c5477d6217 100644
--- a/src/routes/console/project-[project]/settings/smtp/+page.svelte
+++ b/src/routes/console/project-[project]/settings/smtp/+page.svelte
@@ -23,6 +23,7 @@
import { organization } from '$lib/stores/organization';
import { wizard } from '$lib/stores/wizard';
import ChangeOrganizationTierCloud from '$routes/console/changeOrganizationTierCloud.svelte';
+ import { SMTPSecure } from '@appwrite.io/console';
let enabled = false;
let senderName: string;
@@ -68,7 +69,7 @@
port ? port : undefined,
username ? username : undefined,
password ? password : undefined,
- secure ? 'tls' : undefined
+ secure ? SMTPSecure.Tls : undefined
);
invalidate(Dependencies.PROJECT);
diff --git a/src/routes/console/project-[project]/settings/transferProject.svelte b/src/routes/console/project-[project]/settings/transferProject.svelte
index 735f3e75d5..9f73063b61 100644
--- a/src/routes/console/project-[project]/settings/transferProject.svelte
+++ b/src/routes/console/project-[project]/settings/transferProject.svelte
@@ -14,20 +14,7 @@
const handleTransfer = async () => {
try {
- await sdk.forConsole.client.call(
- 'PATCH',
- new URL(
- sdk.forConsole.client.config.endpoint + '/projects/' + $project.$id + '/team'
- ),
- {
- 'X-Appwrite-Project': sdk.forConsole.client.config.project,
- 'content-type': 'application/json'
- },
- {
- teamId: teamId
- }
- );
- // await sdk.forConsole.projects.update($project.$id, password);
+ await sdk.forConsole.projects.updateTeam($project.$id, teamId);
show = false;
addNotification({
type: 'success',
diff --git a/src/routes/console/project-[project]/settings/updateServices.svelte b/src/routes/console/project-[project]/settings/updateServices.svelte
index f063c6f9f6..0318f88665 100644
--- a/src/routes/console/project-[project]/settings/updateServices.svelte
+++ b/src/routes/console/project-[project]/settings/updateServices.svelte
@@ -53,18 +53,7 @@
}
try {
- const path = '/projects/' + $project.$id + '/service/all';
- await sdk.forConsole.client.call(
- 'PATCH',
- new URL(sdk.forConsole.client.config.endpoint + path),
- {
- 'X-Appwrite-Project': sdk.forConsole.client.config.project,
- 'content-type': 'application/json'
- },
- {
- status: status
- }
- );
+ await sdk.forConsole.projects.updateServiceStatusAll($project.$id, status);
invalidate(Dependencies.PROJECT);
addNotification({
type: 'success',
diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/settings/+page.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/settings/+page.svelte
index e229e256c3..d153a39e49 100644
--- a/src/routes/console/project-[project]/storage/bucket-[bucket]/settings/+page.svelte
+++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/settings/+page.svelte
@@ -14,6 +14,10 @@
const bucketData = get(bucket);
const values = { ...bucketData, ...updates };
+ if (!isValueOfStringEnum(Compression, values.compression)) {
+ throw new Error(`Invalid compression: ${values.compression}`);
+ }
+
try {
await sdk.forProject.storage.updateBucket(
values.$id,
@@ -74,7 +78,7 @@
import { Container } from '$lib/layout';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
- import type { Models } from '@appwrite.io/console';
+ import { Compression, type Models } from '@appwrite.io/console';
import { onMount } from 'svelte';
import { get, writable } from 'svelte/store';
import Delete from '../deleteBucket.svelte';
@@ -82,6 +86,7 @@
import UpdateMaxFileSize from './updateMaxFileSize.svelte';
import { readOnly } from '$lib/stores/billing';
import { GRACE_PERIOD_OVERRIDE } from '$lib/system';
+ import { isValueOfStringEnum } from '$lib/helpers/types';
let showDelete = false;
diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.ts b/src/routes/console/project-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.ts
index f011980604..de6a068c65 100644
--- a/src/routes/console/project-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.ts
+++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.ts
@@ -1,11 +1,16 @@
import { sdk } from '$lib/stores/sdk';
import type { Metric, UsageBuckets } from '$lib/sdk/usage';
import type { PageLoad } from './$types';
+import { StorageUsageRange } from '@appwrite.io/console';
+import { isValueOfStringEnum } from '$lib/helpers/types';
export const load: PageLoad = async ({ params }) => {
+ const period = isValueOfStringEnum(StorageUsageRange, params.period)
+ ? params.period
+ : StorageUsageRange.ThirtyDays;
const response = (await sdk.forProject.storage.getBucketUsage(
params.bucket,
- params.period ?? '30d'
+ period
)) as unknown as UsageBuckets;
return {
diff --git a/src/routes/console/project-[project]/storage/usage/[[period]]/+page.ts b/src/routes/console/project-[project]/storage/usage/[[period]]/+page.ts
index 9c4f23b735..b16adae7a2 100644
--- a/src/routes/console/project-[project]/storage/usage/[[period]]/+page.ts
+++ b/src/routes/console/project-[project]/storage/usage/[[period]]/+page.ts
@@ -1,18 +1,15 @@
-import type { Metric, UsageStorage } from '$lib/sdk/usage';
+import { isValueOfStringEnum } from '$lib/helpers/types';
import { sdk } from '$lib/stores/sdk';
+import { StorageUsageRange } from '@appwrite.io/console';
import type { PageLoad } from './$types';
import { error } from '@sveltejs/kit';
export const load: PageLoad = async ({ params }) => {
try {
- const response = (await sdk.forProject.storage.getUsage(
- params.period ?? '30d'
- )) as unknown as UsageStorage;
-
- return {
- bucketsTotal: response.bucketsTotal,
- buckets: response.buckets as Metric[]
- };
+ const period = isValueOfStringEnum(StorageUsageRange, params.period)
+ ? params.period
+ : StorageUsageRange.ThirtyDays;
+ return sdk.forProject.storage.getUsage(period);
} catch (e) {
throw error(e.code, e.message);
}
diff --git a/src/routes/login/+page.svelte b/src/routes/login/+page.svelte
index 88df7861e9..43fde46a61 100644
--- a/src/routes/login/+page.svelte
+++ b/src/routes/login/+page.svelte
@@ -16,6 +16,7 @@
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
import { isCloud } from '$lib/system';
import { page } from '$app/stores';
+ import { OAuthProvider } from '@appwrite.io/console';
let mail: string, pass: string, disabled: boolean;
@@ -62,7 +63,7 @@
}
}
sdk.forConsole.account.createOAuth2Session(
- 'github',
+ OAuthProvider.Github,
window.location.origin + url,
window.location.origin,
undefined,
diff --git a/src/routes/register/+page.svelte b/src/routes/register/+page.svelte
index cd50e51c07..7d8525bbe3 100644
--- a/src/routes/register/+page.svelte
+++ b/src/routes/register/+page.svelte
@@ -16,7 +16,7 @@
import FormList from '$lib/elements/forms/formList.svelte';
import { Dependencies } from '$lib/constants';
import { Submit, trackError, trackEvent } from '$lib/actions/analytics';
- import { ID } from '@appwrite.io/console';
+ import { ID, OAuthProvider } from '@appwrite.io/console';
import { isCloud } from '$lib/system';
import { page } from '$app/stores';
@@ -53,7 +53,7 @@
function onGithubLogin() {
sdk.forConsole.account.createOAuth2Session(
- 'github',
+ OAuthProvider.Github,
window.location.origin,
window.location.origin,
undefined,