diff --git a/README.md b/README.md index 5e8f715..032b522 100644 --- a/README.md +++ b/README.md @@ -27,10 +27,10 @@ Included: ```svelte @@ -40,19 +40,32 @@ Included: ``` +### Realtime todo app using CollectionSubscriber + ```svelte - + const subscriber = new CollectionSubscriber('[database-id]', '[collection-id]') + let value = '' + - - {$subscriber?.name ?? ''} - + +
+ + +
+ +
+ {#each $subscriber as collectionDocument} +
+

{collectionDocument.name}

+ +
+ {/each} +
+
``` ## Routing diff --git a/src/lib/database.ts b/src/lib/database.ts index 35c05c4..e6ec5f1 100644 --- a/src/lib/database.ts +++ b/src/lib/database.ts @@ -1,57 +1,61 @@ import { writable } from 'svelte/store' import { client, databases } from './stores/appwrite' import type { Models, RealtimeResponseEvent } from 'appwrite' +import { ID } from 'appwrite' -export const createCollectionSubscriber = (databaseId: string, collectionId: string) => { - const store = writable([]) +class CollectionSubscriber { + protected store = writable([]) + public subscribe = this.store.subscribe - databases.listDocuments(databaseId, collectionId).then(data => store.set(data.documents)) + constructor(protected databaseId: string, protected collectionId: string) { + databases.listDocuments(databaseId, collectionId).then(data => this.store.set(data.documents)) - client.subscribe(`databases.${databaseId}.collections.${collectionId}.documents`, (response: RealtimeResponseEvent) => { + client.subscribe(`databases.${databaseId}.collections.${collectionId}.documents`, (response: RealtimeResponseEvent) => { - if (response.events.includes(`databases.${databaseId}.collections.${collectionId}.documents.*.delete`)) { - store.update(current => { - const index = current.findIndex(item => item.$id === response.payload.$id) - if (index === -1) return current + if (response.events.includes(`databases.${databaseId}.collections.${collectionId}.documents.*.delete`)) { + this.store.update(current => { + const index = current.findIndex(item => item.$id === response.payload.$id) + if (index === -1) return current - current.splice(index, 1) - return current - }) - return - } + current.splice(index, 1) + return current + }) + return + } - if (response.events.includes(`databases.${databaseId}.collections.${collectionId}.documents.*.update`)) { - store.update(current => { - const index = current.findIndex(item => item.$id === response.payload.$id) - if (index === -1) return current + if (response.events.includes(`databases.${databaseId}.collections.${collectionId}.documents.*.update`)) { + this.store.update(current => { + const index = current.findIndex(item => item.$id === response.payload.$id) + if (index === -1) return current - current[index] = response.payload - return current - }) - return - } + current[index] = response.payload + return current + }) + return + } - if (response.events.includes(`databases.${databaseId}.collections.${collectionId}.documents.*.create`)) { - store.update(current => { - current.push(response.payload) - return current - }) - return - } + if (response.events.includes(`databases.${databaseId}.collections.${collectionId}.documents.*.create`)) { + this.store.update(current => { + current.push(response.payload) + return current + }) + return + } - }) + }) + } - return store + add(data: { [key: string]: any } = {}, permissions: string[] = null) { + return databases.createDocument(this.databaseId, this.collectionId, ID.unique(), data, permissions) + } + + set(documentId: string, data: { [key: string]: any } = {}, permissions: string[] = null) { + return databases.updateDocument(this.databaseId, this.collectionId, documentId, data, permissions) + } + + delete(documentId: string) { + return databases.deleteDocument(this.databaseId, this.collectionId, documentId) + } } -export const createDocumentSubscriber = (databaseId: string, collectionId: string, documentId: string) => { - const store = writable(null) - - databases.getDocument(databaseId, collectionId, documentId).then(data => store.set(data.documents)) - - client.subscribe(`databases.${databaseId}.collections.${collectionId}.documents.${documentId}`, (response) => { - store.set(response.payload as Models.Document) - }) - - return store -} +export default CollectionSubscriber