diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index 04f8c822c7..1c5f36ace3 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -13,4 +13,9 @@ jobs: - name: Run CodeQL run: | docker run --rm -v $PWD:/app composer:2.6 sh -c \ - "composer install --profile --ignore-platform-reqs && composer check" \ No newline at end of file + "composer install --profile --ignore-platform-reqs && composer check" + + - name: Run Locale check + run: | + docker run --rm -v $PWD:/app node:24-alpine sh -c \ + "cd /app/.github/workflows/static-analysis/locale && node index.js" diff --git a/.github/workflows/static-analysis/locale/index.js b/.github/workflows/static-analysis/locale/index.js new file mode 100644 index 0000000000..dd4594fc4d --- /dev/null +++ b/.github/workflows/static-analysis/locale/index.js @@ -0,0 +1,115 @@ +/* + * Look into all local files, and collect unique keys. + * Ensure fallback locale (English) has translation for all keys. + * If configured as `const strict = true`, all locales will be checked to include all keys. + */ + +import { readdir, readFile } from "fs/promises"; +import { join, dirname } from "path"; +import { fileURLToPath } from "url"; + +const config = { + strict: false, + fallbackLocale: "en.json", +}; + +(async () => { + try { + // Prepare current directory equivalent in ES modules + const __filename = fileURLToPath(import.meta.url); + const __dirname = dirname(__filename); + + const translationsPath = join( + __dirname, + "../../../../app/config/locale/translations", + ); + + const files = (await readdir(translationsPath)).filter((file) => + file.endsWith(".json"), + ); + + if (files.length === 0) { + console.error("No translation files found in ", translationsPath); + process.exit(1); + } + + // Check if fallback locale exists + if (!files.includes(config.fallbackLocale)) { + console.error(`Fallback locale file ${config.fallbackLocale} not found`); + process.exit(1); + } + + console.log( + `Found ${files.length} translation files in ${translationsPath}`, + ); + + // Collect all unique keys from all translation files + const allKeys = new Set(); + + for (const file of files) { + const filePath = join(translationsPath, file); + const content = await readFile(filePath, "utf8"); + const translations = JSON.parse(content); + + // Add all keys from this file + Object.keys(translations).forEach((key) => allKeys.add(key)); + } + + console.log(`Total unique keys found across all locales: ${allKeys.size}`); + + const localesToCheck = []; + if (config.strict) { + localesToCheck.push(...files); + } else { + localesToCheck.push(config.fallbackLocale); + } + + let errorsCount = 0; + let missingLocaleCount = 0; + + for (const localeToCheck of localesToCheck) { + // Read locale + const path = join(translationsPath, localeToCheck); + const content = await readFile(path, "utf8"); + const translations = JSON.parse(content); + + // Check for missing keys in the locale + const keys = new Set(Object.keys(translations)); + console.log(`Keys in locale (${localeToCheck}): ${keys.size}`); + + const missingKeys = []; + for (const key of allKeys) { + if (!keys.has(key)) { + missingKeys.push(key); + } + } + + if (missingKeys.length > 0) { + console.error( + `\nERROR: Fallback locale (${localeToCheck}) is missing ${missingKeys.length} key(s):`, + ); + missingKeys.sort().forEach((key) => { + console.error(` - ${key}`); + }); + console.error( + `\nTo fix this issue, add the missing keys to ${translationsPath}/${localeToCheck}`, + ); + errorsCount++; + missingLocaleCount += missingKeys.length; + } else { + console.log( + `\nSUCCESS: Fallback locale (${localeToCheck}) contains all ${allKeys.size} keys.`, + ); + } + } + + if (errorsCount > 0) { + console.log(`\n${missingLocaleCount} locales missing found across ${errorsCount} locales.`); + process.exit(1); + } + } catch (error) { + console.error("Unexpected error."); + console.error(error); + process.exit(1); + } +})(); diff --git a/.github/workflows/static-analysis/locale/package.json b/.github/workflows/static-analysis/locale/package.json new file mode 100644 index 0000000000..748a3e6d2a --- /dev/null +++ b/.github/workflows/static-analysis/locale/package.json @@ -0,0 +1,13 @@ +{ + "name": "static-analysis-locale", + "version": "1.0.0", + "type": "module", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "" +} diff --git a/app/config/collections/platform.php b/app/config/collections/platform.php index 60f181df66..b839e51622 100644 --- a/app/config/collections/platform.php +++ b/app/config/collections/platform.php @@ -407,7 +407,7 @@ return [ 'format' => '', 'size' => Database::LENGTH_KEY, 'signed' => true, - 'required' => true, + 'required' => false, 'default' => null, 'array' => false, 'filters' => [], diff --git a/app/config/collections/projects.php b/app/config/collections/projects.php index 2504961f75..c380a856d0 100644 --- a/app/config/collections/projects.php +++ b/app/config/collections/projects.php @@ -55,7 +55,8 @@ return [ '$id' => ID::custom('type'), 'type' => Database::VAR_STRING, 'size' => 128, - 'required' => true, + 'required' => false, + 'default' => 'grids', 'signed' => true, 'array' => false, 'filters' => [], diff --git a/app/config/locale/translations/af.json b/app/config/locale/translations/af.json index 9b313ac92a..86da260a90 100644 --- a/app/config/locale/translations/af.json +++ b/app/config/locale/translations/af.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Die {{project}} span", "emails.magicSession.subject": "Teken aan", "emails.magicSession.hello": "Goeie dag,", - "emails.magicSession.body": "Volg hierdie skakel om in te teken.", - "emails.magicSession.footer": "Ignoreer gerus hierdie boodskap as u nie die versoek gestuur het om met die' adres in te teken nie.", "emails.magicSession.thanks": "Baie dankie,", "emails.magicSession.signature": "Die {{project}} span", "emails.recovery.subject": "Herstel Wagwoord", diff --git a/app/config/locale/translations/ar-ma.json b/app/config/locale/translations/ar-ma.json index e4b5b1f558..31b656da60 100644 --- a/app/config/locale/translations/ar-ma.json +++ b/app/config/locale/translations/ar-ma.json @@ -12,8 +12,6 @@ "emails.verification.signature": "فرقة {{project}}", "emails.magicSession.subject": "تكونيكطا", "emails.magicSession.hello": "السلام،", - "emails.magicSession.body": "تبّع هاد الوصلة باش تتكونيكطا.", - "emails.magicSession.footer": "إلا ماشي نتا اللي طلبتي تتكونيكطا بهاد ليميل، ممكن تنخّل هاد البرية.", "emails.magicSession.thanks": "شكرا،", "emails.magicSession.signature": "فرقة {{project}}", "emails.recovery.subject": "تبدال كلمة السر", diff --git a/app/config/locale/translations/ar.json b/app/config/locale/translations/ar.json index eda0652fbe..d005009275 100644 --- a/app/config/locale/translations/ar.json +++ b/app/config/locale/translations/ar.json @@ -12,8 +12,6 @@ "emails.verification.signature": "فريق {{project}}", "emails.magicSession.subject": "تسجيل الدخول", "emails.magicSession.hello": "أهلا،", - "emails.magicSession.body": "اتبع هذا الرابط لتسجيل الدخول", - "emails.magicSession.footer": "لو لم تطلب تسجيل الدخول بهذا البريد الاكتروني ، يمكنك تجاهل هذه الرسالة", "emails.magicSession.thanks": "شكرا،", "emails.magicSession.signature": "فريق {{project}}", "emails.recovery.subject": "تغيير كلمة السر", diff --git a/app/config/locale/translations/as.json b/app/config/locale/translations/as.json index 60e385a8ac..0cad3e1000 100644 --- a/app/config/locale/translations/as.json +++ b/app/config/locale/translations/as.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} দল", "emails.magicSession.subject": "লগইন", "emails.magicSession.hello": "নমস্কাৰ,", - "emails.magicSession.body": "লগইন কৰিবলৈ এই লিংকটো অনুসৰণ কৰক।", - "emails.magicSession.footer": "যদি আপুনি এই ইমেইল ব্যৱহাৰ কৰি লগইন কৰিবলৈ কোৱা নাছিল, আপুনি এই বাৰ্তাটো উপেক্ষা কৰিব পাৰে।", "emails.magicSession.thanks": "ধন্যবাদ,", "emails.magicSession.signature": "{{project}} দল", "emails.recovery.subject": "পাছৱাৰ্ড ৰিছেট", diff --git a/app/config/locale/translations/az.json b/app/config/locale/translations/az.json index 63e442f7c5..7e0d206ff1 100644 --- a/app/config/locale/translations/az.json +++ b/app/config/locale/translations/az.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} komandası", "emails.magicSession.subject": "Daxil Olmaq", "emails.magicSession.hello": "Salam,", - "emails.magicSession.body": "Daxil olmaq üçün bu linki izləyin.", - "emails.magicSession.footer": "Bu e-poçtdan istifadə edərək giriş istəməmisinizsə, bu mesajı görməməzlikdən gələ bilərsiniz.", "emails.magicSession.thanks": "Təşəkkürlər,", "emails.magicSession.signature": "{{project}} komandası", "emails.recovery.subject": "Şifrə Sıfırlanması", diff --git a/app/config/locale/translations/be.json b/app/config/locale/translations/be.json index b4ae0827c3..b64ed20bc6 100644 --- a/app/config/locale/translations/be.json +++ b/app/config/locale/translations/be.json @@ -12,8 +12,6 @@ "emails.verification.signature": "каманда {{project}}", "emails.magicSession.subject": "Лагін", "emails.magicSession.hello": "Прывітанне,", - "emails.magicSession.body": "Перайдзіце па спасылцы, каб увайсці.", - "emails.magicSession.footer": "Калі вы не прасілі ўвайсці, выкарыстоўваючы гэты адрас электроннай пошты, праігнаруйце гэтае паведамленне.", "emails.magicSession.thanks": "Дзякуем,", "emails.magicSession.signature": "каманда {{project}}", "emails.recovery.subject": "Скід пароля", diff --git a/app/config/locale/translations/bg.json b/app/config/locale/translations/bg.json index 086c6b283e..f3ed2e7642 100644 --- a/app/config/locale/translations/bg.json +++ b/app/config/locale/translations/bg.json @@ -11,8 +11,6 @@ "emails.verification.signature": "", "emails.magicSession.subject": "", "emails.magicSession.hello": ",", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", "emails.magicSession.thanks": ",", "emails.magicSession.signature": "", "emails.recovery.subject": "", diff --git a/app/config/locale/translations/bh.json b/app/config/locale/translations/bh.json index 7d2b469ed5..04ef824f2b 100644 --- a/app/config/locale/translations/bh.json +++ b/app/config/locale/translations/bh.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} टीम", "emails.magicSession.subject": "लॉग इन करीं|", "emails.magicSession.hello": "प्रणाम,", - "emails.magicSession.body": "लॉग इन करें लेल दिहल गइल लिंक फॉलो करें|", - "emails.magicSession.footer": "अगर लॉग इन करे के लिए ना कहाले, तो आप ई संदेश क अनदेखा कर सकत अछि।", "emails.magicSession.thanks": "धन्यवाद,", "emails.magicSession.signature": "{{project}} टीम", "emails.recovery.subject": "पासवर्ड बदल क लेल|", diff --git a/app/config/locale/translations/bn.json b/app/config/locale/translations/bn.json index 1157d5cc0f..617d5815a0 100644 --- a/app/config/locale/translations/bn.json +++ b/app/config/locale/translations/bn.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} টীম", "emails.magicSession.subject": "লগ ইন", "emails.magicSession.hello": "নমস্কার,", - "emails.magicSession.body": "এই লিঙ্কের মাধ্যমে লগ ইন করুন।", - "emails.magicSession.footer": "আপনি যদি এই ইমেলটি ব্যবহার করে লগইন করতে না বলেন, তাহলে আপনি এই বার্তাটি উপেক্ষা করতে পারেন।", "emails.magicSession.thanks": "ধন্যবাদ,", "emails.magicSession.signature": "{{project}} টীম", "emails.recovery.subject": "পাসওয়ার্ড রিসেট", diff --git a/app/config/locale/translations/bs.json b/app/config/locale/translations/bs.json index 1c69619c01..29c081c069 100644 --- a/app/config/locale/translations/bs.json +++ b/app/config/locale/translations/bs.json @@ -11,8 +11,6 @@ "emails.verification.signature": "", "emails.magicSession.subject": "", "emails.magicSession.hello": ",", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", "emails.magicSession.thanks": ",", "emails.magicSession.signature": "", "emails.recovery.subject": "", diff --git a/app/config/locale/translations/ca.json b/app/config/locale/translations/ca.json index ec5112f075..38519f10c9 100644 --- a/app/config/locale/translations/ca.json +++ b/app/config/locale/translations/ca.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Equip {{project}}", "emails.magicSession.subject": "Entrar", "emails.magicSession.hello": "Hola,", - "emails.magicSession.body": "Accedeix a aquest enllaç per a entrar.", - "emails.magicSession.footer": "Si no has sol·licitat entrar amb aquesta adreça electrònica, pots ignorar aquest missatge.", "emails.magicSession.thanks": "Gràcies,", "emails.magicSession.signature": "Equip {{project}}", "emails.recovery.subject": "Reinicialitzar contrasenya", diff --git a/app/config/locale/translations/cs.json b/app/config/locale/translations/cs.json index c67e9299da..f043a6a5c7 100644 --- a/app/config/locale/translations/cs.json +++ b/app/config/locale/translations/cs.json @@ -11,8 +11,6 @@ "emails.verification.signature": "", "emails.magicSession.subject": "", "emails.magicSession.hello": ",", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", "emails.magicSession.thanks": ",", "emails.magicSession.signature": "", "emails.recovery.subject": "", diff --git a/app/config/locale/translations/da.json b/app/config/locale/translations/da.json index ae93b3c3b5..4b4af3446d 100644 --- a/app/config/locale/translations/da.json +++ b/app/config/locale/translations/da.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} team", "emails.magicSession.subject": "Login", "emails.magicSession.hello": "Hej,", - "emails.magicSession.body": "Følg dette link for at logge ind.", - "emails.magicSession.footer": "Hvis du ikke har bedt om at logge ind med denne email, ignorer venligst denne besked.", "emails.magicSession.thanks": "Tak,", "emails.magicSession.signature": "{{project}} team", "emails.recovery.subject": "Nulstil Password", diff --git a/app/config/locale/translations/de.json b/app/config/locale/translations/de.json index a5a2f0ba43..8f17faf136 100644 --- a/app/config/locale/translations/de.json +++ b/app/config/locale/translations/de.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}}-Team", "emails.magicSession.subject": "Login", "emails.magicSession.hello": "Hey,", - "emails.magicSession.body": "Folge diesem Link, um dich einzuloggen.", - "emails.magicSession.footer": "Solltest du keinen Login für diese E-Mail-Adresse angefordert haben, kannst du diese Nachricht ignorieren.", "emails.magicSession.thanks": "Danke,", "emails.magicSession.signature": "{{project}}-Team", "emails.recovery.subject": "Kennwort zurücksetzen", @@ -247,5 +245,6 @@ "emails.otpSession.clientInfo": "Diese Anmeldung wurde über {{agentClient}} auf {{agentDevice}} {{agentOs}} angefordert. Wenn Sie die Anmeldung nicht angefordert haben, können Sie diese E-Mail getrost ignorieren.", "emails.otpSession.securityPhrase": "Die Sicherheitsphrase für diese E-Mail lautet {{phrase}}. Sie können dieser E-Mail vertrauen, wenn diese Phrase mit der Phrase übereinstimmt, die beim Anmelden angezeigt wird.", "emails.otpSession.thanks": "Danke,", - "emails.otpSession.signature": "{{project}} Team" + "emails.otpSession.signature": "{{project}} Team", + "mock": "Eine Beispielübersetzung für Testzwecke." } diff --git a/app/config/locale/translations/el.json b/app/config/locale/translations/el.json index 3576ffb865..ec3b02c691 100644 --- a/app/config/locale/translations/el.json +++ b/app/config/locale/translations/el.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Η ομάδα του {{project}}", "emails.magicSession.subject": "Είσοδος", "emails.magicSession.hello": "Γεια σου,", - "emails.magicSession.body": "Ακολουθήστε αυτό το link για να συνδεθείτε", - "emails.magicSession.footer": "Εάν δεν ζητήσατε να συνδεθείτε χρησιμοποιώντας αυτό το email, μπορείτε να αγνοήσετε αυτό το μήνυμα.", "emails.magicSession.thanks": "Ευχαριστούμε,", "emails.magicSession.signature": "Η ομάδα του {{project}}", "emails.recovery.subject": "Αλλαγή κωδικού πρόσβασης", diff --git a/app/config/locale/translations/en.json b/app/config/locale/translations/en.json index 072a7f7552..a3284440f4 100644 --- a/app/config/locale/translations/en.json +++ b/app/config/locale/translations/en.json @@ -57,7 +57,7 @@ "emails.invitation.subject": "Invitation to %s Team at %s", "emails.invitation.preview": "{{owner}} invited you to join {{team}} at {{project}}", "emails.invitation.hello": "Hello {{user}},", - "emails.invitation.body": "This mail was sent to you because {{b}}{{owner}}{{/b}} wanted to invite you to become a member of the {{b}}{{team}}{{/b}} team at {{b}}{{project}}{{/b}}.", + "emails.invitation.body": "This mail was sent to you because {{b}}{{owner}}{{/b}} invited you to become a member of the {{b}}{{team}}{{/b}} team at {{b}}{{project}}{{/b}}.", "emails.invitation.footer": "If you are not interested, you can ignore this message.", "emails.invitation.thanks": "Thanks,", "emails.invitation.buttonText": "Accept invite to {{team}}", @@ -274,5 +274,6 @@ "continents.eu": "Europe", "continents.na": "North America", "continents.oc": "Oceania", - "continents.sa": "South America" + "continents.sa": "South America", + "mock": "A mock translation for testing purposes." } diff --git a/app/config/locale/translations/eo.json b/app/config/locale/translations/eo.json index 8aba49098b..82d7eb53f0 100644 --- a/app/config/locale/translations/eo.json +++ b/app/config/locale/translations/eo.json @@ -11,8 +11,6 @@ "emails.verification.signature": "Teamo {{project}}", "emails.magicSession.subject": "Login", "emails.magicSession.hello": "Saluton,", - "emails.magicSession.body": "Alklaku ĉi tiun ligon por eniri.", - "emails.magicSession.footer": "Se vi ne petis ĉi tiun konfirmon de ĉi tiu retpoŝto, vi povas ignori ĉi tiun mesaĝon.", "emails.magicSession.thanks": "Dankegon,", "emails.magicSession.signature": "Teamo {{project}}", "emails.recovery.subject": "Parsvorta Restarigo", diff --git a/app/config/locale/translations/es.json b/app/config/locale/translations/es.json index e986b15f3c..27955eae30 100644 --- a/app/config/locale/translations/es.json +++ b/app/config/locale/translations/es.json @@ -12,8 +12,6 @@ "emails.verification.signature": "El equipo de {{project}}.", "emails.magicSession.subject": "Inicio de sesión", "emails.magicSession.hello": "Hola,", - "emails.magicSession.body": "Haz clic en este enlace para iniciar sesión:", - "emails.magicSession.footer": "Si no has solicitado iniciar sesión usando este correo, puedes ignorar este mensaje.", "emails.magicSession.thanks": "Gracias.,", "emails.magicSession.signature": "El equipo de {{project}}", "emails.recovery.subject": "Restablecer contraseña", diff --git a/app/config/locale/translations/fa.json b/app/config/locale/translations/fa.json index 9434b9ff03..f8420288df 100644 --- a/app/config/locale/translations/fa.json +++ b/app/config/locale/translations/fa.json @@ -12,8 +12,6 @@ "emails.verification.signature": "تیم {{user}}", "emails.magicSession.subject": "ورود به حساب کاربری", "emails.magicSession.hello": "سلام،", - "emails.magicSession.body": "برای ورود به حساب‌تان پیوند زیر را دنبال کنید.", - "emails.magicSession.footer": "اگر شما درخواست ورود به حساب کاربری با استفاده از این ایمیل را نداد‌ه‌اید، می‌توانید این پیام را نادیده بگیرید.", "emails.magicSession.thanks": "سپاس فراوان،", "emails.magicSession.signature": "تیم {{user}}", "emails.recovery.subject": "بازیابی گذرواژه", diff --git a/app/config/locale/translations/fi.json b/app/config/locale/translations/fi.json index ca61a95653..da4599bb58 100644 --- a/app/config/locale/translations/fi.json +++ b/app/config/locale/translations/fi.json @@ -11,8 +11,6 @@ "emails.verification.signature": "", "emails.magicSession.subject": "", "emails.magicSession.hello": ",", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", "emails.magicSession.thanks": ",", "emails.magicSession.signature": "", "emails.recovery.subject": "", diff --git a/app/config/locale/translations/fo.json b/app/config/locale/translations/fo.json index a982fd0590..cfe63322b4 100644 --- a/app/config/locale/translations/fo.json +++ b/app/config/locale/translations/fo.json @@ -11,8 +11,6 @@ "emails.verification.signature": "", "emails.magicSession.subject": "", "emails.magicSession.hello": ",", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", "emails.magicSession.thanks": ",", "emails.magicSession.signature": "", "emails.recovery.subject": "", diff --git a/app/config/locale/translations/fr.json b/app/config/locale/translations/fr.json index 3af7193764..7f3fca739d 100644 --- a/app/config/locale/translations/fr.json +++ b/app/config/locale/translations/fr.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Équipe {{project}}", "emails.magicSession.subject": "Connexion", "emails.magicSession.hello": "Bonjour,", - "emails.magicSession.body": "Suivez ce lien pour vous connecter.", - "emails.magicSession.footer": "Si vous n'avez pas demandé à vous connecter en utilisant cet e-mail, vous pouvez ignorer ce message.", "emails.magicSession.thanks": "Merci,", "emails.magicSession.signature": "L'équipe {{project}}", "emails.recovery.subject": "Réinitialisation du mot de passe", diff --git a/app/config/locale/translations/ga.json b/app/config/locale/translations/ga.json index c486e77126..f9611e07b5 100644 --- a/app/config/locale/translations/ga.json +++ b/app/config/locale/translations/ga.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} foireann", "emails.magicSession.subject": "Logáil isteach", "emails.magicSession.hello": "Haigh,", - "emails.magicSession.body": "Lean an nasc seo chun logáil isteach.", - "emails.magicSession.footer": "Mura ndearna tú iarratas logáil isteach leis an ríomhphost seo, déan neamhaird den teachtaireacht seo.", "emails.magicSession.thanks": "Go raibh maith agat,", "emails.magicSession.signature": "{{project}} foireann", "emails.recovery.subject": "Athshocrú pasfhocail", diff --git a/app/config/locale/translations/gu.json b/app/config/locale/translations/gu.json index 8d5d2fb8d6..8b9b41c0c9 100644 --- a/app/config/locale/translations/gu.json +++ b/app/config/locale/translations/gu.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} ટીમ", "emails.magicSession.subject": "પ્રવેશ કરો", "emails.magicSession.hello": "નમસ્કાર,", - "emails.magicSession.body": "પ્રવેશ કરવા માટે આ લિંકને અનુસરો.", - "emails.magicSession.footer": "જો તમે આ ઇમેઇલનો ઉપયોગ કરીને પ્રવેશ કરવાનું ન કહ્યું હોય, તો તમે આ સંદેશને અવગણી શકો છો.", "emails.magicSession.thanks": "આભાર,", "emails.magicSession.signature": "{{project}} ટીમ", "emails.recovery.subject": "પાસવર્ડ ફરીથી સેટ કરો", diff --git a/app/config/locale/translations/he.json b/app/config/locale/translations/he.json index 8e5279e5e4..ab61085fa1 100644 --- a/app/config/locale/translations/he.json +++ b/app/config/locale/translations/he.json @@ -12,8 +12,6 @@ "emails.verification.signature": "צוות {{project}}", "emails.magicSession.subject": "כניסה למערכת", "emails.magicSession.hello": "שלום,", - "emails.magicSession.body": "לחץ על קישור זה כדי להיכנס.", - "emails.magicSession.footer": "אם לא ביקשת להיכנס באמצעות דוא\"ל זה, תוכל להתעלם מהודעה זו.", "emails.magicSession.thanks": "תודה,", "emails.magicSession.signature": "צוות {{project}}", "emails.recovery.subject": "איפוס סיסמא", diff --git a/app/config/locale/translations/hi.json b/app/config/locale/translations/hi.json index ef71e287cd..fe2aa9b5d2 100644 --- a/app/config/locale/translations/hi.json +++ b/app/config/locale/translations/hi.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} टीम", "emails.magicSession.subject": "लॉग इन", "emails.magicSession.hello": "नमस्ते,", - "emails.magicSession.body": "इस लिंक के माध्यम से लॉग-इन करें।", - "emails.magicSession.footer": "यदि आप इस ईमेल द्वारा लॉगिन नहीं करना चाहते हैं, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", "emails.magicSession.thanks": "धन्यवाद,", "emails.magicSession.signature": "{{project}} टीम", "emails.recovery.subject": "पासवर्ड रीसेट", diff --git a/app/config/locale/translations/hr.json b/app/config/locale/translations/hr.json index 8331d67422..7ffe10668b 100644 --- a/app/config/locale/translations/hr.json +++ b/app/config/locale/translations/hr.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} tim", "emails.magicSession.subject": "Prijavite se", "emails.magicSession.hello": "Pozdrav,", - "emails.magicSession.body": "Slijedite ovu poveznicu za prijavu.", - "emails.magicSession.footer": "Ako niste zatražili prijavu putem ove e-pošte, možete zanemariti ovu poruku.", "emails.magicSession.thanks": "Hvala,", "emails.magicSession.signature": "{{project}} tim", "emails.recovery.subject": "Ponovno postavljanje lozinke", diff --git a/app/config/locale/translations/hu.json b/app/config/locale/translations/hu.json index c21701a509..54e204e798 100644 --- a/app/config/locale/translations/hu.json +++ b/app/config/locale/translations/hu.json @@ -12,8 +12,6 @@ "emails.verification.signature": "a {{project}} csapat", "emails.magicSession.subject": "Bejelentkezés", "emails.magicSession.hello": "Szia,", - "emails.magicSession.body": "Kattints a linkre a bejelentkezéshez.", - "emails.magicSession.footer": "Ha nem te szerettél volna bejelentkezni ezzel az email címmel, akkor nyugodtan hagyd figyelmen kívül ezt az üzenetet.", "emails.magicSession.thanks": "Köszönettel,", "emails.magicSession.signature": "a {{project}} csapat", "emails.recovery.subject": "Jelszó Visszaállítása", diff --git a/app/config/locale/translations/hy.json b/app/config/locale/translations/hy.json index c845526607..08dcbb59eb 100644 --- a/app/config/locale/translations/hy.json +++ b/app/config/locale/translations/hy.json @@ -11,8 +11,6 @@ "emails.verification.signature": "", "emails.magicSession.subject": "", "emails.magicSession.hello": ",", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", "emails.magicSession.thanks": ",", "emails.magicSession.signature": "", "emails.recovery.subject": "", diff --git a/app/config/locale/translations/id.json b/app/config/locale/translations/id.json index 836941f79a..cd9cadc4b1 100644 --- a/app/config/locale/translations/id.json +++ b/app/config/locale/translations/id.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Tim {{project}}", "emails.magicSession.subject": "Masuk", "emails.magicSession.hello": "Hai,", - "emails.magicSession.body": "Ikuti tautan ini untuk masuk.", - "emails.magicSession.footer": "Jika Anda tidak meminta untuk masuk menggunakan email ini, Anda dapat mengabaikan pesan ini.", "emails.magicSession.thanks": "Terima kasih,", "emails.magicSession.signature": "Tim {{project}}", "emails.recovery.subject": "Atur Ulang Kata Sandi", diff --git a/app/config/locale/translations/is.json b/app/config/locale/translations/is.json index 5fede4dda0..4b21e9939b 100644 --- a/app/config/locale/translations/is.json +++ b/app/config/locale/translations/is.json @@ -11,8 +11,6 @@ "emails.verification.signature": "", "emails.magicSession.subject": "", "emails.magicSession.hello": ",", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", "emails.magicSession.thanks": ",", "emails.magicSession.signature": "", "emails.recovery.subject": "", diff --git a/app/config/locale/translations/it.json b/app/config/locale/translations/it.json index f0e290b481..7b419858a3 100644 --- a/app/config/locale/translations/it.json +++ b/app/config/locale/translations/it.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Il team {{project}}", "emails.magicSession.subject": "Login", "emails.magicSession.hello": "Ciao,", - "emails.magicSession.body": "Clicca questo link per accedere.", - "emails.magicSession.footer": "Se non hai richiesto di effettuare l’accesso, puoi ignorare questo messaggio.", "emails.magicSession.thanks": "Grazie,", "emails.magicSession.signature": "Il team {{project}}", "emails.recovery.subject": "Reimpostazione password", diff --git a/app/config/locale/translations/ja.json b/app/config/locale/translations/ja.json index f3ad8fe1ed..6ecfed55a2 100644 --- a/app/config/locale/translations/ja.json +++ b/app/config/locale/translations/ja.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}}チーム", "emails.magicSession.subject": "ログイン", "emails.magicSession.hello": "こんにちは、", - "emails.magicSession.body": "ログインするためには下記リンクをクリックしてください。", - "emails.magicSession.footer": "このメールに心当たりが無い場合は破棄をお願いいたします。", "emails.magicSession.thanks": "ご利用いただきありがとうございます。、", "emails.magicSession.signature": "{{project}}チーム", "emails.recovery.subject": "パスワードリセット", diff --git a/app/config/locale/translations/jv.json b/app/config/locale/translations/jv.json index 71d4f4b24a..3f6b6b9fe2 100644 --- a/app/config/locale/translations/jv.json +++ b/app/config/locale/translations/jv.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Tim {{project}}", "emails.magicSession.subject": "Masuk", "emails.magicSession.hello": "Hai,", - "emails.magicSession.body": "Klik link iki kanggo masuk.", - "emails.magicSession.footer": "Yen sampeyan ora njaluk masuk nggunakake alamat email iki, sampeyan iso nglirwakake pesen iki.", "emails.magicSession.thanks": "Matur nuwun,", "emails.magicSession.signature": "Tim {{project}}", "emails.recovery.subject": "Setel ulang sandi", diff --git a/app/config/locale/translations/km.json b/app/config/locale/translations/km.json index 12ac05e8da..9e93162a6a 100644 --- a/app/config/locale/translations/km.json +++ b/app/config/locale/translations/km.json @@ -11,8 +11,6 @@ "emails.verification.signature": "", "emails.magicSession.subject": "", "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", "emails.magicSession.thanks": "", "emails.magicSession.signature": "", "emails.recovery.subject": "", diff --git a/app/config/locale/translations/kn.json b/app/config/locale/translations/kn.json index ed35a7947f..40b51c0944 100644 --- a/app/config/locale/translations/kn.json +++ b/app/config/locale/translations/kn.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} ತಂಡ", "emails.magicSession.subject": "ಲಾಗಿನ್", "emails.magicSession.hello": "ನಮಸ್ಕಾರ,", - "emails.magicSession.body": "ಲಾಗಿನ್ ಮಾಡಲಿಕ್ಕೆ ಈ ಲಿಂಕನ್ನು ಅನುಸರಿಸಿ", - "emails.magicSession.footer": "ನೀವು ಈ ಇಮೇಲನಿಂದ ಲಾಗಿನ್ ಮಾಡಲು ಕೇಳದಿದ್ದರೆ, ಈ ಸಂದೇಶವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ", "emails.magicSession.thanks": "ಧನ್ಯವಾದಗಳು,", "emails.magicSession.signature": "{{project}} ತಂಡ", "emails.recovery.subject": "ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಿ", diff --git a/app/config/locale/translations/ko.json b/app/config/locale/translations/ko.json index 0bc425aeae..3bae815d75 100644 --- a/app/config/locale/translations/ko.json +++ b/app/config/locale/translations/ko.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} 팀", "emails.magicSession.subject": "로그인", "emails.magicSession.hello": "안녕하세요、", - "emails.magicSession.body": "로그인 하시려면 링크를 클릭하여주세요.", - "emails.magicSession.footer": "이 이메일 계정으로 로그인 신청을 하지 않으셨다면 이 메세지를 무시하여주세요.", "emails.magicSession.thanks": "감사합니다、", "emails.magicSession.signature": "{{project}} 팀", "emails.recovery.subject": "비밀번호 재설정", diff --git a/app/config/locale/translations/la.json b/app/config/locale/translations/la.json index fe3e7930e2..bf58232b9a 100644 --- a/app/config/locale/translations/la.json +++ b/app/config/locale/translations/la.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} Team", "emails.magicSession.subject": "Log in", "emails.magicSession.hello": "Salve ibi,", - "emails.magicSession.body": "Hanc nexum cum login", - "emails.magicSession.footer": "Si verificationem huius inscriptionis non postulasti, nuntium hunc ignorare potes.", "emails.magicSession.thanks": "Gratias,", "emails.magicSession.signature": "{{project}} team", "emails.recovery.subject": "Recuperet password", diff --git a/app/config/locale/translations/lb.json b/app/config/locale/translations/lb.json index 8fe4b346e7..77245036ac 100644 --- a/app/config/locale/translations/lb.json +++ b/app/config/locale/translations/lb.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} équipe", "emails.magicSession.subject": "Login", "emails.magicSession.hello": "Hey,", - "emails.magicSession.body": "Follegt dëse Link fir umellen.", - "emails.magicSession.footer": "Wann Dir net gefrot hutt Iech mat dëser E -Mail anzemelden, kënnt Dir dëse Message ignoréieren.", "emails.magicSession.thanks": "Merci,", "emails.magicSession.signature": "{{project}} équipe", "emails.recovery.subject": "Password Reset", diff --git a/app/config/locale/translations/lt.json b/app/config/locale/translations/lt.json index 2439428b02..e0a3a84340 100644 --- a/app/config/locale/translations/lt.json +++ b/app/config/locale/translations/lt.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} komanda", "emails.magicSession.subject": "Prisijungti", "emails.magicSession.hello": "Labas,", - "emails.magicSession.body": "Spauskite šią nuorodą, kad prisijungtumėte.", - "emails.magicSession.footer": "Jei neprašėte prisijungti naudojantis šiuo el. paštu, galite ignoruoti šį pranešimą.", "emails.magicSession.thanks": "Ačiū,", "emails.magicSession.signature": "{{project}} komanda", "emails.recovery.subject": "Slaptažodžio Atkūrimas", diff --git a/app/config/locale/translations/lv.json b/app/config/locale/translations/lv.json index 59edfce7a6..d91977ebad 100644 --- a/app/config/locale/translations/lv.json +++ b/app/config/locale/translations/lv.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} komanda", "emails.magicSession.subject": "Ieiet", "emails.magicSession.hello": "Sveicināti,", - "emails.magicSession.body": "Sekojiet saitei, lai ieietu.", - "emails.magicSession.footer": "Ja Jūs nepieprasījāt ieiet ar šo e-pasta adresi, lūdzu, ignorējiet šo ziņu.", "emails.magicSession.thanks": "Paldies,", "emails.magicSession.signature": "{{project}} komanda", "emails.recovery.subject": "Paroles atjaunināšana", diff --git a/app/config/locale/translations/ml.json b/app/config/locale/translations/ml.json index bd13f92fa8..ffc9f12a7e 100644 --- a/app/config/locale/translations/ml.json +++ b/app/config/locale/translations/ml.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} ടീം", "emails.magicSession.subject": "ലോഗിൻ", "emails.magicSession.hello": "നമസ്കാരം,", - "emails.magicSession.body": "ലോഗിൻ ചെയ്യുന്നതിനായി ഈ ലിങ്ക് പിന്തുടരുക.", - "emails.magicSession.footer": "ഈ ഇമെയിൽ ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യാൻ നിങ്ങൾ ആവശ്യപ്പെട്ടില്ലെങ്കിൽ, ഈ സന്ദേശം അവഗണിക്കാവുന്നതാണ്.", "emails.magicSession.thanks": "നന്ദി,", "emails.magicSession.signature": "{{project}} ടീം", "emails.recovery.subject": "രഹസ്യവാക്ക് പുനക്രമീകരണം", diff --git a/app/config/locale/translations/mr.json b/app/config/locale/translations/mr.json index 881afdfe71..d417ac305f 100644 --- a/app/config/locale/translations/mr.json +++ b/app/config/locale/translations/mr.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} संघ", "emails.magicSession.subject": "लॉगिन करा", "emails.magicSession.hello": "नमस्कार ,", - "emails.magicSession.body": "लॉगिन करण्यासाठी या लिंकचे अनुसरण करा.", - "emails.magicSession.footer": "आपण या ईमेलचा वापर करून लॉगिन करण्यास सांगितले नसल्यास, आपण या संदेशाकडे दुर्लक्ष करू शकता.", "emails.magicSession.thanks": "धन्यवाद,", "emails.magicSession.signature": "{{project}} संघ", "emails.recovery.subject": "पासवर्ड रीसेट", diff --git a/app/config/locale/translations/ms.json b/app/config/locale/translations/ms.json index 448307550e..99d086cd81 100644 --- a/app/config/locale/translations/ms.json +++ b/app/config/locale/translations/ms.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} team", "emails.magicSession.subject": "Log masuk", "emails.magicSession.hello": "Hey,", - "emails.magicSession.body": "Tekan pautan ini untuk log masuk.", - "emails.magicSession.footer": "Sekiranya anda tidak membuat permintaan untuk log masuk menggunakan email ini, sila abaikan mesej ini.", "emails.magicSession.thanks": "Terima kasih,", "emails.magicSession.signature": "{{project}} team", "emails.recovery.subject": "Menetap semula Kata Laluan", diff --git a/app/config/locale/translations/nb.json b/app/config/locale/translations/nb.json index cc95bacf9e..36e28072d4 100644 --- a/app/config/locale/translations/nb.json +++ b/app/config/locale/translations/nb.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} team", "emails.magicSession.subject": "Pålogging", "emails.magicSession.hello": "Hei,", - "emails.magicSession.body": "Følg denne lenken for å logge på.", - "emails.magicSession.footer": "Dersom du ikke ba om å logge på med denne e-postadressen, kan du se bort fra denne meldingen.", "emails.magicSession.thanks": "Takk,", "emails.magicSession.signature": "{{project}} team", "emails.recovery.subject": "Nullstille passord", diff --git a/app/config/locale/translations/ne.json b/app/config/locale/translations/ne.json index f1ba841fed..545810d871 100644 --- a/app/config/locale/translations/ne.json +++ b/app/config/locale/translations/ne.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} समूह", "emails.magicSession.subject": "लगइन", "emails.magicSession.hello": "नमस्ते,", - "emails.magicSession.body": "लगइन गर्नको लागी यो लिंकमा जानुहोस।", - "emails.magicSession.footer": "यदि तपाइँले यो इमेल प्रयोग गरेर लगइन गर्न सोध्नु भएको छैन भने तपाइँले यो सन्देश लाई बेवास्ता गर्न सक्नुहुन्छ।", "emails.magicSession.thanks": "धन्यवाद,", "emails.magicSession.signature": "{{project}} समूह", "emails.recovery.subject": "पासवर्ड रिसेट", diff --git a/app/config/locale/translations/nl.json b/app/config/locale/translations/nl.json index 4f71f67199..9949a2b4b8 100644 --- a/app/config/locale/translations/nl.json +++ b/app/config/locale/translations/nl.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} team", "emails.magicSession.subject": "Login", "emails.magicSession.hello": "Hoi,", - "emails.magicSession.body": "Volg deze link om in te loggen", - "emails.magicSession.footer": "Als u geen aanvraag heeft gemaakt om met deze mail in te loggen, kan u deze mail negeren", "emails.magicSession.thanks": "Bedankt,", "emails.magicSession.signature": "{{project}} team", "emails.recovery.subject": "Wachtwoord Herinstellen", diff --git a/app/config/locale/translations/nn.json b/app/config/locale/translations/nn.json index 646a57904c..cb5084011e 100644 --- a/app/config/locale/translations/nn.json +++ b/app/config/locale/translations/nn.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} team", "emails.magicSession.subject": "Pålogging", "emails.magicSession.hello": "Hei,", - "emails.magicSession.body": "Følg denne lenkja for å logge på.", - "emails.magicSession.footer": "Om du ikkje ba om å logge på med denne e-postadressa, kan du ignorera denne meldinga.", "emails.magicSession.thanks": "Takk,", "emails.magicSession.signature": "{{project}} team", "emails.recovery.subject": "Nullstilla passord", diff --git a/app/config/locale/translations/or.json b/app/config/locale/translations/or.json index a8e08b8043..6393067089 100644 --- a/app/config/locale/translations/or.json +++ b/app/config/locale/translations/or.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} ଦଳ", "emails.magicSession.subject": "ଲଗଇନ୍ କରନ୍ତୁ", "emails.magicSession.hello": "ନମସ୍କାର,", - "emails.magicSession.body": "ଲଗଇନ୍ କରିବାକୁ ଏହି ଲିଙ୍କ୍ ଅନୁସରଣ କରନ୍ତୁ |", - "emails.magicSession.footer": "ଯଦି ଆପଣ ଏହି ଇମେଲ୍ ବ୍ୟବହାର କରି ଲଗଇନ୍ କରିବାକୁ କହି ନାହାଁନ୍ତି, ତେବେ ଆପଣ ଏହି ସନ୍ଦେଶକୁ ଉପେକ୍ଷା କରିପାରିବେ |", "emails.magicSession.thanks": "ଧନ୍ୟବାଦ,", "emails.magicSession.signature": "{{project}} ଦଳ", "emails.recovery.subject": "ପାସୱାର୍ଡ ପୁନଃ ସେଟ୍ କରନ୍ତୁ |", diff --git a/app/config/locale/translations/pa.json b/app/config/locale/translations/pa.json index de71be9f49..2c3d90604c 100644 --- a/app/config/locale/translations/pa.json +++ b/app/config/locale/translations/pa.json @@ -11,8 +11,6 @@ "emails.verification.signature": "", "emails.magicSession.subject": "", "emails.magicSession.hello": ",", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", "emails.magicSession.thanks": ",", "emails.magicSession.signature": "", "emails.recovery.subject": "", diff --git a/app/config/locale/translations/pl.json b/app/config/locale/translations/pl.json index 75bc3a24f9..e10e47f50d 100644 --- a/app/config/locale/translations/pl.json +++ b/app/config/locale/translations/pl.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Zespół {{project}}", "emails.magicSession.subject": "Logowanie", "emails.magicSession.hello": "Cześć,", - "emails.magicSession.body": "Kliknij w ten link, aby zalogować się.", - "emails.magicSession.footer": "Jeśli to nie Ty prosiłeś o logowanie przy użyciu tego adresu e-mail, zignoruj tę wiadomość.", "emails.magicSession.thanks": "Dziękujemy,", "emails.magicSession.signature": "Zespół {{project}}", "emails.recovery.subject": "Resetowanie hasła", diff --git a/app/config/locale/translations/pt-br.json b/app/config/locale/translations/pt-br.json index 7e3af1d3f1..75ad38f887 100644 --- a/app/config/locale/translations/pt-br.json +++ b/app/config/locale/translations/pt-br.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Time {{project}}", "emails.magicSession.subject": "Login", "emails.magicSession.hello": "Olá,", - "emails.magicSession.body": "Clique neste link para entrar.", - "emails.magicSession.footer": "Se você não solicitou conectar-se com este e-mail, ignore essa mensagem.", "emails.magicSession.thanks": "Muito obrigado,", "emails.magicSession.signature": "Time {{project}}", "emails.recovery.subject": "Redefinição de senha", diff --git a/app/config/locale/translations/pt-pt.json b/app/config/locale/translations/pt-pt.json index c13ce558bf..f0c84ab9e6 100644 --- a/app/config/locale/translations/pt-pt.json +++ b/app/config/locale/translations/pt-pt.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Equipa {{project}}", "emails.magicSession.subject": "Login", "emails.magicSession.hello": "Olá ,", - "emails.magicSession.body": "Siga esta ligação para iniciar sessão.", - "emails.magicSession.footer": "Se não pediu para entrar usando este e-mail, pode ignorar esta mensagem.", "emails.magicSession.thanks": "Obrigado,", "emails.magicSession.signature": "Equipa {{project}}", "emails.recovery.subject": "Redefinição de senha", diff --git a/app/config/locale/translations/ro.json b/app/config/locale/translations/ro.json index 88499ce3f6..5def77fa61 100644 --- a/app/config/locale/translations/ro.json +++ b/app/config/locale/translations/ro.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Echipa {{project}}", "emails.magicSession.subject": "Login", "emails.magicSession.hello": "Bună ziua,", - "emails.magicSession.body": "Urmează acest link pentru logare.", - "emails.magicSession.footer": "Dacă nu ai incercat să te loghezi folosing această adresa de email, poți ignora acest mesaj.", "emails.magicSession.thanks": "Mulțumim,", "emails.magicSession.signature": "Echipa {{project}}", "emails.recovery.subject": "Resetare parolă", diff --git a/app/config/locale/translations/ru.json b/app/config/locale/translations/ru.json index f61337de80..322404abd6 100644 --- a/app/config/locale/translations/ru.json +++ b/app/config/locale/translations/ru.json @@ -12,8 +12,6 @@ "emails.verification.signature": "команда {{project}}", "emails.magicSession.subject": "Логин", "emails.magicSession.hello": "Здравствуйте,", - "emails.magicSession.body": "Перейдите по ссылке, чтобы войти.", - "emails.magicSession.footer": "Если вы не просили войти, используя этот адрес электронной почты, проигнорируйте это сообщение.", "emails.magicSession.thanks": "Спасибо,", "emails.magicSession.signature": "команда {{project}}", "emails.recovery.subject": "Сброс пароля", diff --git a/app/config/locale/translations/sa.json b/app/config/locale/translations/sa.json index b3326110d1..36025af90c 100644 --- a/app/config/locale/translations/sa.json +++ b/app/config/locale/translations/sa.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} गणः", "emails.magicSession.subject": "संप्रवेशः", "emails.magicSession.hello": "अयि,", - "emails.magicSession.body": "संप्रवेशार्थमिदं संयोगसूत्रमनुसरतु।", - "emails.magicSession.footer": "अनेन ई-पत्रण यदि संप्रवेशो नेष्यते तर्हि वात्र्तामिमामुपेक्षताम्‌।", "emails.magicSession.thanks": "धन्यवादः,", "emails.magicSession.signature": "{{project}} गणः", "emails.recovery.subject": "कूटशब्दपुनयाेजनम्‌", diff --git a/app/config/locale/translations/sd.json b/app/config/locale/translations/sd.json index 26c89a1770..c3371903c4 100644 --- a/app/config/locale/translations/sd.json +++ b/app/config/locale/translations/sd.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} ٽيم", "emails.magicSession.subject": "لاگ ان", "emails.magicSession.hello": "هي ,", - "emails.magicSession.body": "لاگ ان ٿيڻ لاءِ ھن لنڪ تي عمل ڪريو.", - "emails.magicSession.footer": "جيڪڏھن توھان نه پ پيا ھي لاگ ان استعمال ڪندي اي ميل ، توھان نظر انداز ڪري سگھوٿا ھن پيغام کي.", "emails.magicSession.thanks": "مهرباني,", "emails.magicSession.signature": "{{project}} ٽيم", "emails.recovery.subject": "پاسورڊ ري سيٽ", diff --git a/app/config/locale/translations/si.json b/app/config/locale/translations/si.json index e2053407ea..03415c3c2d 100644 --- a/app/config/locale/translations/si.json +++ b/app/config/locale/translations/si.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} කණ්ඩායම", "emails.magicSession.subject": "ප්‍රවේශ වන්න", "emails.magicSession.hello": "හේයි,", - "emails.magicSession.body": "ප්‍රවේශ වීමට මෙම සම්බන්ධකය අනුගමනය කරන්න.", - "emails.magicSession.footer": "මෙම විද්‍යුත් තැපෑල භාවිතයෙන් ප්‍රවේශ වීමට ඔබ ඉල්ලුවේ නැත්නම්, ඔබට මෙම පණිවිඩය නොසලකා හැරිය හැක.", "emails.magicSession.thanks": "ස්තුතියි,", "emails.magicSession.signature": "{{project}} කණ්ඩායම", "emails.recovery.subject": "මුරපද යළි පිහිටුවීම", diff --git a/app/config/locale/translations/sk.json b/app/config/locale/translations/sk.json index 1b41d8031d..9fe7a39619 100644 --- a/app/config/locale/translations/sk.json +++ b/app/config/locale/translations/sk.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} tím", "emails.magicSession.subject": "Prihlásenie", "emails.magicSession.hello": "Ahoj,", - "emails.magicSession.body": "Použi tento link pre prihlásenie.", - "emails.magicSession.footer": "Ak si nepožiadal o prihlásenie cez email, túto správu môžeš ignorovať.", "emails.magicSession.thanks": "Ďakujeme,", "emails.magicSession.signature": "{{project}} tím", "emails.recovery.subject": "Obnovenie hesla", diff --git a/app/config/locale/translations/sl.json b/app/config/locale/translations/sl.json index f7c4f41255..23efd4c675 100644 --- a/app/config/locale/translations/sl.json +++ b/app/config/locale/translations/sl.json @@ -11,8 +11,6 @@ "emails.verification.signature": "", "emails.magicSession.subject": "", "emails.magicSession.hello": ",", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", "emails.magicSession.thanks": ",", "emails.magicSession.signature": "", "emails.recovery.subject": "", diff --git a/app/config/locale/translations/sn.json b/app/config/locale/translations/sn.json index 9fcadfaa82..29cb79142c 100644 --- a/app/config/locale/translations/sn.json +++ b/app/config/locale/translations/sn.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Chikwata che{{project}}", "emails.magicSession.subject": "Pinda", "emails.magicSession.hello": "Hesi,", - "emails.magicSession.body": "Baya chinongedzo ichi kuti upinde muakaundi yako.", - "emails.magicSession.footer": "Kana usina kukumbira kupinda muakaundi yako uchishandisa email iyi, unogona kufuratira meseji iyi.", "emails.magicSession.thanks": "Ndatenda,", "emails.magicSession.signature": "Chikwata che{{project}}", "emails.recovery.subject": "Kuchinja pasiwedhi", diff --git a/app/config/locale/translations/sq.json b/app/config/locale/translations/sq.json index 85aa6637f6..39e6aa0d7c 100644 --- a/app/config/locale/translations/sq.json +++ b/app/config/locale/translations/sq.json @@ -11,8 +11,6 @@ "emails.verification.signature": "", "emails.magicSession.subject": "", "emails.magicSession.hello": ",", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", "emails.magicSession.thanks": ",", "emails.magicSession.signature": "", "emails.recovery.subject": "", diff --git a/app/config/locale/translations/sv.json b/app/config/locale/translations/sv.json index 9bff513f0c..6c6ebf6d16 100644 --- a/app/config/locale/translations/sv.json +++ b/app/config/locale/translations/sv.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} teamet", "emails.magicSession.subject": "Logga in", "emails.magicSession.hello": "Hej,", - "emails.magicSession.body": "Klicka på denna länk för att logga in.", - "emails.magicSession.footer": "Om du inte bad om att logga in med denna e-postadress kan du ignorera detta mail.", "emails.magicSession.thanks": "Tack,", "emails.magicSession.signature": "{{project}} teamet", "emails.recovery.subject": "Återställ lösenord", diff --git a/app/config/locale/translations/ta.json b/app/config/locale/translations/ta.json index 4afcbe9b63..32e7a5d79d 100644 --- a/app/config/locale/translations/ta.json +++ b/app/config/locale/translations/ta.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} குழு ", "emails.magicSession.subject": "உள்நுழைய", "emails.magicSession.hello": "ஏய்,", - "emails.magicSession.body": "இந்த இணைப்பைப் பின்தொடரவும் உள்நுழைய", - "emails.magicSession.footer": "இந்த மின்னஞ்சலைப் பயன்படுத்தி உள்நுழையுமாறு உங்களிடம் கேட்கப்படாவிட்டால், இந்தச் செய்தியைப் புறக்கணிக்கலாம்.", "emails.magicSession.thanks": "நன்றி,", "emails.magicSession.signature": "{{project}} குழு", "emails.recovery.subject": "கடவுச்சொல் மீட்டமைப்பு", diff --git a/app/config/locale/translations/te.json b/app/config/locale/translations/te.json index 4073fc72d9..e9d7574675 100644 --- a/app/config/locale/translations/te.json +++ b/app/config/locale/translations/te.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} జట్", "emails.magicSession.subject": "లాగిన్", "emails.magicSession.hello": "నమస్కారము,", - "emails.magicSession.body": "లాగిన్ చేయడానికి ఈ లింక్ ని అనుసరించండి", - "emails.magicSession.footer": "మీరు ఈ ఇమెయిల్ ని ఉపయోగించి లాగిన్ చేయమని అడగకపోతే, మీరు ఈ సందేశాన్ని విస్మరించవచ్చు", "emails.magicSession.thanks": "ధన్యవాదాలు,", "emails.magicSession.signature": "{{project}} జట్", "emails.recovery.subject": "పాస్వర్డ్ రీసెట్", diff --git a/app/config/locale/translations/th.json b/app/config/locale/translations/th.json index 4003ece666..91e7dff7f6 100644 --- a/app/config/locale/translations/th.json +++ b/app/config/locale/translations/th.json @@ -12,8 +12,6 @@ "emails.verification.signature": "ทีม {{project}}", "emails.magicSession.subject": "เข้าสู่ระบบ", "emails.magicSession.hello": "เรียนผู้ใช้งาน", - "emails.magicSession.body": "กดเข้าไปที่ลิงก์นี้เพื่อเข้าสู่ระบบ", - "emails.magicSession.footer": "หากท่านไม่ได้ต้องการที่จะเข้าสู่ระบบด้วยอีเมลนี้ ท่านสามารถเพิกเฉยข้อความนี้ได้", "emails.magicSession.thanks": "ขอบคุณ", "emails.magicSession.signature": "ทีม {{project}}", "emails.recovery.subject": "รีเซ็ตรหัสผ่าน", diff --git a/app/config/locale/translations/tl.json b/app/config/locale/translations/tl.json index 27ea6c088f..af018bf567 100644 --- a/app/config/locale/translations/tl.json +++ b/app/config/locale/translations/tl.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Pangkat ng {{project}}", "emails.magicSession.subject": "Mag log in", "emails.magicSession.hello": "Kamusta ,", - "emails.magicSession.body": "Sundin ang link na ito upang mag-login.", - "emails.magicSession.footer": "Kung hindi mo hiningi na mag-login gamit ang email na ito, maaari mong balewalain ang mensahe na ito.", "emails.magicSession.thanks": "Salamat,", "emails.magicSession.signature": "Pangkat ng {{project}}", "emails.recovery.subject": "I-reset ang password", diff --git a/app/config/locale/translations/tr.json b/app/config/locale/translations/tr.json index a7183152b6..5fd2447d2b 100644 --- a/app/config/locale/translations/tr.json +++ b/app/config/locale/translations/tr.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} takımı", "emails.magicSession.subject": "Giriş", "emails.magicSession.hello": "Merhaba,", - "emails.magicSession.body": "Giriş yapmak için tıklayın.", - "emails.magicSession.footer": "Eğer bu eposta adresini kullanarak giriş yapmak istemediyseniz devam etmeyin.", "emails.magicSession.thanks": "Teşekkürler,", "emails.magicSession.signature": "{{project}} takımı", "emails.recovery.subject": "Şifremi Sıfırla", diff --git a/app/config/locale/translations/uk.json b/app/config/locale/translations/uk.json index daa003754d..b7b2c2905d 100644 --- a/app/config/locale/translations/uk.json +++ b/app/config/locale/translations/uk.json @@ -12,8 +12,6 @@ "emails.verification.signature": "команда {{project}}", "emails.magicSession.subject": "Логін", "emails.magicSession.hello": "Вітаємо,", - "emails.magicSession.body": "Перейдіть за цим посиланням, щоб увійти.", - "emails.magicSession.footer": "Якщо ви не просили увійти за допомогою цієї електронної пошти, ви можете ігнорувати це повідомлення.", "emails.magicSession.thanks": "Дякуємо,", "emails.magicSession.signature": "команда {{project}}", "emails.recovery.subject": "Скидання пароля", diff --git a/app/config/locale/translations/ur.json b/app/config/locale/translations/ur.json index 8823e0da2e..f8f0284bcf 100644 --- a/app/config/locale/translations/ur.json +++ b/app/config/locale/translations/ur.json @@ -12,8 +12,6 @@ "emails.verification.signature": "ٹیم۔ {{project}}", "emails.magicSession.subject": "اگ ان کریں", "emails.magicSession.hello": "خوش آمدید،", - "emails.magicSession.body": "لاگ ان کرنے کے لیے اس لنک پر عمل کریں۔", - "emails.magicSession.footer": "اگر آپ نے اس ای میل کا استعمال کرتے ہوئے لاگ ان کرنے کے لیے نہیں کہا تو آپ اس پیغام کو نظر انداز کر سکتے ہیں۔", "emails.magicSession.thanks": "شکریہ،", "emails.magicSession.signature": "ٹیم۔ {{project}}", "emails.recovery.subject": "پاس ورڈ ری سیٹ۔", diff --git a/app/config/locale/translations/vi.json b/app/config/locale/translations/vi.json index e9168d9ab8..5ed045ce19 100644 --- a/app/config/locale/translations/vi.json +++ b/app/config/locale/translations/vi.json @@ -12,8 +12,6 @@ "emails.verification.signature": "Nhóm {{project}}", "emails.magicSession.subject": "Đăng nhập", "emails.magicSession.hello": "Chào", - "emails.magicSession.body": "Nhấn vào đường dẫn sau để đăng nhập.", - "emails.magicSession.footer": "Nếu bạn không yêu cầu đăng nhập bằng email, bạn có thể bỏ qua email này.", "emails.magicSession.thanks": "Cảm ơn", "emails.magicSession.signature": "Nhóm {{project}}", "emails.recovery.subject": "Thiết lập lại mật khẩu", diff --git a/app/config/locale/translations/zh-cn.json b/app/config/locale/translations/zh-cn.json index 554b506e9e..b9319badfc 100644 --- a/app/config/locale/translations/zh-cn.json +++ b/app/config/locale/translations/zh-cn.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} 团队", "emails.magicSession.subject": "登录", "emails.magicSession.hello": "你好、", - "emails.magicSession.body": "点此链接登录。", - "emails.magicSession.footer": "如果您没有要求使用此电子邮件登录,则可忽略此消息。", "emails.magicSession.thanks": "谢谢、", "emails.magicSession.signature": "{{project}} 团队", "emails.recovery.subject": "重设密码", diff --git a/app/config/locale/translations/zh-tw.json b/app/config/locale/translations/zh-tw.json index bb9868d679..0c2ba309d9 100644 --- a/app/config/locale/translations/zh-tw.json +++ b/app/config/locale/translations/zh-tw.json @@ -12,8 +12,6 @@ "emails.verification.signature": "{{project}} 團隊", "emails.magicSession.subject": "登入", "emails.magicSession.hello": "嗨、", - "emails.magicSession.body": "點此連結登入。", - "emails.magicSession.footer": "如果您沒有要求使用此電子郵件登入,則可以忽略此消息。", "emails.magicSession.thanks": "謝謝、", "emails.magicSession.signature": "{{project}} 團隊", "emails.recovery.subject": "重設密碼", diff --git a/app/config/specs/open-api3-1.7.x-client.json b/app/config/specs/open-api3-1.7.x-client.json index dc16932fd4..0bf589cb5a 100644 --- a/app/config/specs/open-api3-1.7.x-client.json +++ b/app/config/specs/open-api3-1.7.x-client.json @@ -4466,6 +4466,7 @@ "methods": [ { "name": "createDocument", + "desc": "Create document", "auth": { "Project": [] }, @@ -4488,7 +4489,8 @@ "model": "#\/components\/schemas\/document" } ], - "description": "Create a new Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console." + "description": "Create a new Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", + "demo": "databases\/create-document.md" } ], "auth": { @@ -4665,7 +4667,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", + "description": "Create or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", "responses": { "200": { "description": "Document", @@ -5203,7 +5205,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 393, + "weight": 394, "cookies": false, "type": "", "deprecated": false, @@ -5278,7 +5280,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 391, + "weight": 392, "cookies": false, "type": "", "deprecated": false, @@ -5393,7 +5395,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 392, + "weight": 393, "cookies": false, "type": "", "deprecated": false, @@ -5467,7 +5469,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 307, + "weight": 308, "cookies": false, "type": "graphql", "deprecated": false, @@ -5519,7 +5521,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 306, + "weight": 307, "cookies": false, "type": "graphql", "deprecated": false, @@ -5987,7 +5989,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 353, + "weight": 354, "cookies": false, "type": "", "deprecated": false, @@ -6070,7 +6072,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 357, + "weight": 358, "cookies": false, "type": "", "deprecated": false, diff --git a/app/config/specs/open-api3-1.7.x-console.json b/app/config/specs/open-api3-1.7.x-console.json index 0063b8b557..5c6880a396 100644 --- a/app/config/specs/open-api3-1.7.x-console.json +++ b/app/config/specs/open-api3-1.7.x-console.json @@ -4359,7 +4359,7 @@ "x-appwrite": { "method": "chat", "group": "console", - "weight": 309, + "weight": 310, "cookies": false, "type": "", "deprecated": false, @@ -4419,7 +4419,7 @@ "x-appwrite": { "method": "getResource", "group": null, - "weight": 433, + "weight": 434, "cookies": false, "type": "", "deprecated": false, @@ -4494,7 +4494,7 @@ "x-appwrite": { "method": "variables", "group": "console", - "weight": 308, + "weight": 309, "cookies": false, "type": "", "deprecated": false, @@ -8025,6 +8025,7 @@ "methods": [ { "name": "createDocument", + "desc": "Create document", "auth": { "Project": [] }, @@ -8047,10 +8048,12 @@ "model": "#\/components\/schemas\/document" } ], - "description": "Create a new Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console." + "description": "Create a new Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", + "demo": "databases\/create-document.md" }, { "name": "createDocuments", + "desc": "Create documents", "auth": { "Project": [] }, @@ -8070,7 +8073,8 @@ "model": "#\/components\/schemas\/documentList" } ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate new Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console." + "description": "Create new Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", + "demo": "databases\/create-documents.md" } ], "auth": { @@ -8150,7 +8154,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate or update Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.\n", + "description": "Create or update Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.\n", "responses": { "200": { "description": "Documents List", @@ -8242,7 +8246,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nUpdate all documents that match your queries, if no queries are submitted then all documents are updated. You can pass only specific fields to be updated.", + "description": "Update all documents that match your queries, if no queries are submitted then all documents are updated. You can pass only specific fields to be updated.", "responses": { "200": { "description": "Documents List", @@ -8336,7 +8340,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nBulk delete documents using queries, if no queries are passed then all documents are deleted.", + "description": "Bulk delete documents using queries, if no queries are passed then all documents are deleted.", "responses": { "200": { "description": "Documents List", @@ -8522,7 +8526,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", + "description": "Create or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", "responses": { "200": { "description": "Document", @@ -9844,7 +9848,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 377, + "weight": 378, "cookies": false, "type": "", "deprecated": false, @@ -9917,7 +9921,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 374, + "weight": 375, "cookies": false, "type": "", "deprecated": false, @@ -10150,7 +10154,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 379, + "weight": 380, "cookies": false, "type": "", "deprecated": false, @@ -10199,7 +10203,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 380, + "weight": 381, "cookies": false, "type": "", "deprecated": false, @@ -10249,7 +10253,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 403, + "weight": 404, "cookies": false, "type": "", "deprecated": false, @@ -10349,7 +10353,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 402, + "weight": 403, "cookies": false, "type": "", "deprecated": false, @@ -10409,7 +10413,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 396, + "weight": 397, "cookies": false, "type": "", "deprecated": false, @@ -10481,7 +10485,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 375, + "weight": 376, "cookies": false, "type": "", "deprecated": false, @@ -10540,7 +10544,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 376, + "weight": 377, "cookies": false, "type": "", "deprecated": false, @@ -10770,7 +10774,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 378, + "weight": 379, "cookies": false, "type": "", "deprecated": false, @@ -10831,7 +10835,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 383, + "weight": 384, "cookies": false, "type": "", "deprecated": false, @@ -10911,7 +10915,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 384, + "weight": 385, "cookies": false, "type": "", "deprecated": false, @@ -10994,7 +10998,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 381, + "weight": 382, "cookies": false, "type": "upload", "deprecated": false, @@ -11090,7 +11094,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 389, + "weight": 390, "cookies": false, "type": "", "deprecated": false, @@ -11175,7 +11179,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 386, + "weight": 387, "cookies": false, "type": "", "deprecated": false, @@ -11278,7 +11282,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 387, + "weight": 388, "cookies": false, "type": "", "deprecated": false, @@ -11375,7 +11379,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 382, + "weight": 383, "cookies": false, "type": "", "deprecated": false, @@ -11437,7 +11441,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 385, + "weight": 386, "cookies": false, "type": "", "deprecated": false, @@ -11501,7 +11505,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 388, + "weight": 389, "cookies": false, "type": "location", "deprecated": false, @@ -11591,7 +11595,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 390, + "weight": 391, "cookies": false, "type": "", "deprecated": false, @@ -11662,7 +11666,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 393, + "weight": 394, "cookies": false, "type": "", "deprecated": false, @@ -11737,7 +11741,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 391, + "weight": 392, "cookies": false, "type": "", "deprecated": false, @@ -11852,7 +11856,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 392, + "weight": 393, "cookies": false, "type": "", "deprecated": false, @@ -11917,7 +11921,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 394, + "weight": 395, "cookies": false, "type": "", "deprecated": false, @@ -11988,7 +11992,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 395, + "weight": 396, "cookies": false, "type": "", "deprecated": false, @@ -12070,7 +12074,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 399, + "weight": 400, "cookies": false, "type": "", "deprecated": false, @@ -12129,7 +12133,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 397, + "weight": 398, "cookies": false, "type": "", "deprecated": false, @@ -12220,7 +12224,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 398, + "weight": 399, "cookies": false, "type": "", "deprecated": false, @@ -12289,7 +12293,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 400, + "weight": 401, "cookies": false, "type": "", "deprecated": false, @@ -12380,7 +12384,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 401, + "weight": 402, "cookies": false, "type": "", "deprecated": false, @@ -12451,7 +12455,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 307, + "weight": 308, "cookies": false, "type": "graphql", "deprecated": false, @@ -12503,7 +12507,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 306, + "weight": 307, "cookies": false, "type": "graphql", "deprecated": false, @@ -14266,7 +14270,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 361, + "weight": 362, "cookies": false, "type": "", "deprecated": false, @@ -14342,7 +14346,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 358, + "weight": 359, "cookies": false, "type": "", "deprecated": false, @@ -14486,7 +14490,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 365, + "weight": 366, "cookies": false, "type": "", "deprecated": false, @@ -14632,7 +14636,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 360, + "weight": 361, "cookies": false, "type": "", "deprecated": false, @@ -14806,7 +14810,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 367, + "weight": 368, "cookies": false, "type": "", "deprecated": false, @@ -14984,7 +14988,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 359, + "weight": 360, "cookies": false, "type": "", "deprecated": false, @@ -15093,7 +15097,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 366, + "weight": 367, "cookies": false, "type": "", "deprecated": false, @@ -15205,7 +15209,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 364, + "weight": 365, "cookies": false, "type": "", "deprecated": false, @@ -15258,7 +15262,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 368, + "weight": 369, "cookies": false, "type": "", "deprecated": false, @@ -15320,7 +15324,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 362, + "weight": 363, "cookies": false, "type": "", "deprecated": false, @@ -15395,7 +15399,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 363, + "weight": 364, "cookies": false, "type": "", "deprecated": false, @@ -15470,7 +15474,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 333, + "weight": 334, "cookies": false, "type": "", "deprecated": false, @@ -15546,7 +15550,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 332, + "weight": 333, "cookies": false, "type": "", "deprecated": false, @@ -15651,7 +15655,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 345, + "weight": 346, "cookies": false, "type": "", "deprecated": false, @@ -15759,7 +15763,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 331, + "weight": 332, "cookies": false, "type": "", "deprecated": false, @@ -15844,7 +15848,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 344, + "weight": 345, "cookies": false, "type": "", "deprecated": false, @@ -15932,7 +15936,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 323, + "weight": 324, "cookies": false, "type": "", "deprecated": false, @@ -16047,7 +16051,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 336, + "weight": 337, "cookies": false, "type": "", "deprecated": false, @@ -16165,7 +16169,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 326, + "weight": 327, "cookies": false, "type": "", "deprecated": false, @@ -16260,7 +16264,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 339, + "weight": 340, "cookies": false, "type": "", "deprecated": false, @@ -16358,7 +16362,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 324, + "weight": 325, "cookies": false, "type": "", "deprecated": false, @@ -16463,7 +16467,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 337, + "weight": 338, "cookies": false, "type": "", "deprecated": false, @@ -16571,7 +16575,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 325, + "weight": 326, "cookies": false, "type": "", "deprecated": false, @@ -16714,7 +16718,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 338, + "weight": 339, "cookies": false, "type": "", "deprecated": false, @@ -16859,7 +16863,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 327, + "weight": 328, "cookies": false, "type": "", "deprecated": false, @@ -16954,7 +16958,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 340, + "weight": 341, "cookies": false, "type": "", "deprecated": false, @@ -17052,7 +17056,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 328, + "weight": 329, "cookies": false, "type": "", "deprecated": false, @@ -17147,7 +17151,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 341, + "weight": 342, "cookies": false, "type": "", "deprecated": false, @@ -17245,7 +17249,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 329, + "weight": 330, "cookies": false, "type": "", "deprecated": false, @@ -17340,7 +17344,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 342, + "weight": 343, "cookies": false, "type": "", "deprecated": false, @@ -17438,7 +17442,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 330, + "weight": 331, "cookies": false, "type": "", "deprecated": false, @@ -17533,7 +17537,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 343, + "weight": 344, "cookies": false, "type": "", "deprecated": false, @@ -17631,7 +17635,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 335, + "weight": 336, "cookies": false, "type": "", "deprecated": false, @@ -17684,7 +17688,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 346, + "weight": 347, "cookies": false, "type": "", "deprecated": false, @@ -17746,7 +17750,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 334, + "weight": 335, "cookies": false, "type": "", "deprecated": false, @@ -17821,7 +17825,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 355, + "weight": 356, "cookies": false, "type": "", "deprecated": false, @@ -17896,7 +17900,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 348, + "weight": 349, "cookies": false, "type": "", "deprecated": false, @@ -17970,7 +17974,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 347, + "weight": 348, "cookies": false, "type": "", "deprecated": false, @@ -18053,7 +18057,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 350, + "weight": 351, "cookies": false, "type": "", "deprecated": false, @@ -18113,7 +18117,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 351, + "weight": 352, "cookies": false, "type": "", "deprecated": false, @@ -18190,7 +18194,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 352, + "weight": 353, "cookies": false, "type": "", "deprecated": false, @@ -18252,7 +18256,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 349, + "weight": 350, "cookies": false, "type": "", "deprecated": false, @@ -18327,7 +18331,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 354, + "weight": 355, "cookies": false, "type": "", "deprecated": false, @@ -18411,7 +18415,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 353, + "weight": 354, "cookies": false, "type": "", "deprecated": false, @@ -18501,7 +18505,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 356, + "weight": 357, "cookies": false, "type": "", "deprecated": false, @@ -18564,7 +18568,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 357, + "weight": 358, "cookies": false, "type": "", "deprecated": false, @@ -18639,7 +18643,7 @@ "x-appwrite": { "method": "list", "group": null, - "weight": 315, + "weight": 316, "cookies": false, "type": "", "deprecated": false, @@ -18713,7 +18717,7 @@ "x-appwrite": { "method": "createAppwriteMigration", "group": null, - "weight": 310, + "weight": 311, "cookies": false, "type": "", "deprecated": false, @@ -18801,7 +18805,7 @@ "x-appwrite": { "method": "getAppwriteReport", "group": null, - "weight": 317, + "weight": 318, "cookies": false, "type": "", "deprecated": false, @@ -18894,7 +18898,7 @@ "x-appwrite": { "method": "createCsvMigration", "group": null, - "weight": 314, + "weight": 315, "cookies": false, "type": "", "deprecated": false, @@ -18973,7 +18977,7 @@ "x-appwrite": { "method": "createFirebaseMigration", "group": null, - "weight": 311, + "weight": 312, "cookies": false, "type": "", "deprecated": false, @@ -19049,7 +19053,7 @@ "x-appwrite": { "method": "getFirebaseReport", "group": null, - "weight": 318, + "weight": 319, "cookies": false, "type": "", "deprecated": false, @@ -19121,7 +19125,7 @@ "x-appwrite": { "method": "createNHostMigration", "group": null, - "weight": 313, + "weight": 314, "cookies": false, "type": "", "deprecated": false, @@ -19232,7 +19236,7 @@ "x-appwrite": { "method": "getNHostReport", "group": null, - "weight": 320, + "weight": 321, "cookies": false, "type": "", "deprecated": false, @@ -19365,7 +19369,7 @@ "x-appwrite": { "method": "createSupabaseMigration", "group": null, - "weight": 312, + "weight": 313, "cookies": false, "type": "", "deprecated": false, @@ -19470,7 +19474,7 @@ "x-appwrite": { "method": "getSupabaseReport", "group": null, - "weight": 319, + "weight": 320, "cookies": false, "type": "", "deprecated": false, @@ -19594,7 +19598,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 316, + "weight": 317, "cookies": false, "type": "", "deprecated": false, @@ -19652,7 +19656,7 @@ "x-appwrite": { "method": "retry", "group": null, - "weight": 321, + "weight": 322, "cookies": false, "type": "", "deprecated": false, @@ -19703,7 +19707,7 @@ "x-appwrite": { "method": "delete", "group": null, - "weight": 322, + "weight": 323, "cookies": false, "type": "", "deprecated": false, @@ -21609,7 +21613,7 @@ "x-appwrite": { "method": "listDevKeys", "group": "devKeys", - "weight": 372, + "weight": 373, "cookies": false, "type": "", "deprecated": false, @@ -21677,7 +21681,7 @@ "x-appwrite": { "method": "createDevKey", "group": "devKeys", - "weight": 369, + "weight": 370, "cookies": false, "type": "", "deprecated": false, @@ -21762,7 +21766,7 @@ "x-appwrite": { "method": "getDevKey", "group": "devKeys", - "weight": 371, + "weight": 372, "cookies": false, "type": "", "deprecated": false, @@ -21830,7 +21834,7 @@ "x-appwrite": { "method": "updateDevKey", "group": "devKeys", - "weight": 370, + "weight": 371, "cookies": false, "type": "", "deprecated": false, @@ -21916,7 +21920,7 @@ "x-appwrite": { "method": "deleteDevKey", "group": "devKeys", - "weight": 373, + "weight": 374, "cookies": false, "type": "", "deprecated": false, @@ -25481,7 +25485,7 @@ "x-appwrite": { "method": "createAPIRule", "group": null, - "weight": 434, + "weight": 435, "cookies": false, "type": "", "deprecated": false, @@ -25548,7 +25552,7 @@ "x-appwrite": { "method": "createFunctionRule", "group": null, - "weight": 436, + "weight": 437, "cookies": false, "type": "", "deprecated": false, @@ -25626,7 +25630,7 @@ "x-appwrite": { "method": "createRedirectRule", "group": null, - "weight": 437, + "weight": 438, "cookies": false, "type": "", "deprecated": false, @@ -25739,7 +25743,7 @@ "x-appwrite": { "method": "createSiteRule", "group": null, - "weight": 435, + "weight": 436, "cookies": false, "type": "", "deprecated": false, @@ -25988,7 +25992,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 406, + "weight": 407, "cookies": false, "type": "", "deprecated": false, @@ -26058,7 +26062,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 404, + "weight": 405, "cookies": false, "type": "", "deprecated": false, @@ -26307,7 +26311,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 409, + "weight": 410, "cookies": false, "type": "", "deprecated": false, @@ -26356,7 +26360,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 432, + "weight": 433, "cookies": false, "type": "", "deprecated": false, @@ -26406,7 +26410,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 428, + "weight": 429, "cookies": false, "type": "", "deprecated": false, @@ -26506,7 +26510,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 429, + "weight": 430, "cookies": false, "type": "", "deprecated": false, @@ -26566,7 +26570,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 430, + "weight": 431, "cookies": false, "type": "", "deprecated": false, @@ -26638,7 +26642,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 405, + "weight": 406, "cookies": false, "type": "", "deprecated": false, @@ -26697,7 +26701,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 407, + "weight": 408, "cookies": false, "type": "", "deprecated": false, @@ -26942,7 +26946,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 408, + "weight": 409, "cookies": false, "type": "", "deprecated": false, @@ -27003,7 +27007,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 415, + "weight": 416, "cookies": false, "type": "", "deprecated": false, @@ -27083,7 +27087,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 414, + "weight": 415, "cookies": false, "type": "", "deprecated": false, @@ -27166,7 +27170,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 410, + "weight": 411, "cookies": false, "type": "upload", "deprecated": false, @@ -27267,7 +27271,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 418, + "weight": 419, "cookies": false, "type": "", "deprecated": false, @@ -27347,7 +27351,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 411, + "weight": 412, "cookies": false, "type": "", "deprecated": false, @@ -27450,7 +27454,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 412, + "weight": 413, "cookies": false, "type": "", "deprecated": false, @@ -27548,7 +27552,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 413, + "weight": 414, "cookies": false, "type": "", "deprecated": false, @@ -27610,7 +27614,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 416, + "weight": 417, "cookies": false, "type": "", "deprecated": false, @@ -27674,7 +27678,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 417, + "weight": 418, "cookies": false, "type": "location", "deprecated": false, @@ -27764,7 +27768,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 419, + "weight": 420, "cookies": false, "type": "", "deprecated": false, @@ -27835,7 +27839,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 421, + "weight": 422, "cookies": false, "type": "", "deprecated": false, @@ -27906,7 +27910,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 420, + "weight": 421, "cookies": false, "type": "", "deprecated": false, @@ -27968,7 +27972,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 422, + "weight": 423, "cookies": false, "type": "", "deprecated": false, @@ -28039,7 +28043,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 431, + "weight": 432, "cookies": false, "type": "", "deprecated": false, @@ -28121,7 +28125,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 425, + "weight": 426, "cookies": false, "type": "", "deprecated": false, @@ -28180,7 +28184,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 423, + "weight": 424, "cookies": false, "type": "", "deprecated": false, @@ -28271,7 +28275,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 424, + "weight": 425, "cookies": false, "type": "", "deprecated": false, @@ -28340,7 +28344,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 426, + "weight": 427, "cookies": false, "type": "", "deprecated": false, @@ -28431,7 +28435,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 427, + "weight": 428, "cookies": false, "type": "", "deprecated": false, @@ -31005,7 +31009,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 440, + "weight": 441, "cookies": false, "type": "", "deprecated": false, @@ -31085,7 +31089,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 438, + "weight": 439, "cookies": false, "type": "", "deprecated": false, @@ -31174,7 +31178,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 439, + "weight": 440, "cookies": false, "type": "", "deprecated": false, @@ -31234,7 +31238,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 441, + "weight": 442, "cookies": false, "type": "", "deprecated": false, @@ -31304,7 +31308,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 442, + "weight": 443, "cookies": false, "type": "", "deprecated": false, diff --git a/app/config/specs/open-api3-1.7.x-server.json b/app/config/specs/open-api3-1.7.x-server.json index b3917036f0..35e3f14595 100644 --- a/app/config/specs/open-api3-1.7.x-server.json +++ b/app/config/specs/open-api3-1.7.x-server.json @@ -7506,6 +7506,7 @@ "methods": [ { "name": "createDocument", + "desc": "Create document", "auth": { "Project": [], "Session": [] @@ -7529,10 +7530,12 @@ "model": "#\/components\/schemas\/document" } ], - "description": "Create a new Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console." + "description": "Create a new Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", + "demo": "databases\/create-document.md" }, { "name": "createDocuments", + "desc": "Create documents", "auth": { "Project": [], "Key": [] @@ -7553,7 +7556,8 @@ "model": "#\/components\/schemas\/documentList" } ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate new Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console." + "description": "Create new Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", + "demo": "databases\/create-documents.md" } ], "auth": { @@ -7635,7 +7639,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate or update Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.\n", + "description": "Create or update Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.\n", "responses": { "200": { "description": "Documents List", @@ -7728,7 +7732,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nUpdate all documents that match your queries, if no queries are submitted then all documents are updated. You can pass only specific fields to be updated.", + "description": "Update all documents that match your queries, if no queries are submitted then all documents are updated. You can pass only specific fields to be updated.", "responses": { "200": { "description": "Documents List", @@ -7823,7 +7827,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nBulk delete documents using queries, if no queries are passed then all documents are deleted.", + "description": "Bulk delete documents using queries, if no queries are passed then all documents are deleted.", "responses": { "200": { "description": "Documents List", @@ -8012,7 +8016,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", + "description": "Create or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", "responses": { "200": { "description": "Document", @@ -8925,7 +8929,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 377, + "weight": 378, "cookies": false, "type": "", "deprecated": false, @@ -8999,7 +9003,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 374, + "weight": 375, "cookies": false, "type": "", "deprecated": false, @@ -9233,7 +9237,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 379, + "weight": 380, "cookies": false, "type": "", "deprecated": false, @@ -9283,7 +9287,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 380, + "weight": 381, "cookies": false, "type": "", "deprecated": false, @@ -9334,7 +9338,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 375, + "weight": 376, "cookies": false, "type": "", "deprecated": false, @@ -9394,7 +9398,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 376, + "weight": 377, "cookies": false, "type": "", "deprecated": false, @@ -9625,7 +9629,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 378, + "weight": 379, "cookies": false, "type": "", "deprecated": false, @@ -9687,7 +9691,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 383, + "weight": 384, "cookies": false, "type": "", "deprecated": false, @@ -9768,7 +9772,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 384, + "weight": 385, "cookies": false, "type": "", "deprecated": false, @@ -9852,7 +9856,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 381, + "weight": 382, "cookies": false, "type": "upload", "deprecated": false, @@ -9949,7 +9953,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 389, + "weight": 390, "cookies": false, "type": "", "deprecated": false, @@ -10035,7 +10039,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 386, + "weight": 387, "cookies": false, "type": "", "deprecated": false, @@ -10139,7 +10143,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 387, + "weight": 388, "cookies": false, "type": "", "deprecated": false, @@ -10237,7 +10241,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 382, + "weight": 383, "cookies": false, "type": "", "deprecated": false, @@ -10300,7 +10304,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 385, + "weight": 386, "cookies": false, "type": "", "deprecated": false, @@ -10365,7 +10369,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 388, + "weight": 389, "cookies": false, "type": "location", "deprecated": false, @@ -10456,7 +10460,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 390, + "weight": 391, "cookies": false, "type": "", "deprecated": false, @@ -10528,7 +10532,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 393, + "weight": 394, "cookies": false, "type": "", "deprecated": false, @@ -10605,7 +10609,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 391, + "weight": 392, "cookies": false, "type": "", "deprecated": false, @@ -10722,7 +10726,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 392, + "weight": 393, "cookies": false, "type": "", "deprecated": false, @@ -10789,7 +10793,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 394, + "weight": 395, "cookies": false, "type": "", "deprecated": false, @@ -10861,7 +10865,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 399, + "weight": 400, "cookies": false, "type": "", "deprecated": false, @@ -10921,7 +10925,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 397, + "weight": 398, "cookies": false, "type": "", "deprecated": false, @@ -11013,7 +11017,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 398, + "weight": 399, "cookies": false, "type": "", "deprecated": false, @@ -11083,7 +11087,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 400, + "weight": 401, "cookies": false, "type": "", "deprecated": false, @@ -11175,7 +11179,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 401, + "weight": 402, "cookies": false, "type": "", "deprecated": false, @@ -11247,7 +11251,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 307, + "weight": 308, "cookies": false, "type": "graphql", "deprecated": false, @@ -11301,7 +11305,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 306, + "weight": 307, "cookies": false, "type": "graphql", "deprecated": false, @@ -13104,7 +13108,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 361, + "weight": 362, "cookies": false, "type": "", "deprecated": false, @@ -13181,7 +13185,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 358, + "weight": 359, "cookies": false, "type": "", "deprecated": false, @@ -13326,7 +13330,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 365, + "weight": 366, "cookies": false, "type": "", "deprecated": false, @@ -13473,7 +13477,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 360, + "weight": 361, "cookies": false, "type": "", "deprecated": false, @@ -13648,7 +13652,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 367, + "weight": 368, "cookies": false, "type": "", "deprecated": false, @@ -13827,7 +13831,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 359, + "weight": 360, "cookies": false, "type": "", "deprecated": false, @@ -13937,7 +13941,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 366, + "weight": 367, "cookies": false, "type": "", "deprecated": false, @@ -14050,7 +14054,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 364, + "weight": 365, "cookies": false, "type": "", "deprecated": false, @@ -14104,7 +14108,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 368, + "weight": 369, "cookies": false, "type": "", "deprecated": false, @@ -14167,7 +14171,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 362, + "weight": 363, "cookies": false, "type": "", "deprecated": false, @@ -14243,7 +14247,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 363, + "weight": 364, "cookies": false, "type": "", "deprecated": false, @@ -14319,7 +14323,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 333, + "weight": 334, "cookies": false, "type": "", "deprecated": false, @@ -14396,7 +14400,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 332, + "weight": 333, "cookies": false, "type": "", "deprecated": false, @@ -14502,7 +14506,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 345, + "weight": 346, "cookies": false, "type": "", "deprecated": false, @@ -14611,7 +14615,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 331, + "weight": 332, "cookies": false, "type": "", "deprecated": false, @@ -14697,7 +14701,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 344, + "weight": 345, "cookies": false, "type": "", "deprecated": false, @@ -14786,7 +14790,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 323, + "weight": 324, "cookies": false, "type": "", "deprecated": false, @@ -14902,7 +14906,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 336, + "weight": 337, "cookies": false, "type": "", "deprecated": false, @@ -15021,7 +15025,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 326, + "weight": 327, "cookies": false, "type": "", "deprecated": false, @@ -15117,7 +15121,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 339, + "weight": 340, "cookies": false, "type": "", "deprecated": false, @@ -15216,7 +15220,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 324, + "weight": 325, "cookies": false, "type": "", "deprecated": false, @@ -15322,7 +15326,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 337, + "weight": 338, "cookies": false, "type": "", "deprecated": false, @@ -15431,7 +15435,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 325, + "weight": 326, "cookies": false, "type": "", "deprecated": false, @@ -15575,7 +15579,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 338, + "weight": 339, "cookies": false, "type": "", "deprecated": false, @@ -15721,7 +15725,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 327, + "weight": 328, "cookies": false, "type": "", "deprecated": false, @@ -15817,7 +15821,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 340, + "weight": 341, "cookies": false, "type": "", "deprecated": false, @@ -15916,7 +15920,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 328, + "weight": 329, "cookies": false, "type": "", "deprecated": false, @@ -16012,7 +16016,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 341, + "weight": 342, "cookies": false, "type": "", "deprecated": false, @@ -16111,7 +16115,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 329, + "weight": 330, "cookies": false, "type": "", "deprecated": false, @@ -16207,7 +16211,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 342, + "weight": 343, "cookies": false, "type": "", "deprecated": false, @@ -16306,7 +16310,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 330, + "weight": 331, "cookies": false, "type": "", "deprecated": false, @@ -16402,7 +16406,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 343, + "weight": 344, "cookies": false, "type": "", "deprecated": false, @@ -16501,7 +16505,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 335, + "weight": 336, "cookies": false, "type": "", "deprecated": false, @@ -16555,7 +16559,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 346, + "weight": 347, "cookies": false, "type": "", "deprecated": false, @@ -16618,7 +16622,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 334, + "weight": 335, "cookies": false, "type": "", "deprecated": false, @@ -16694,7 +16698,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 355, + "weight": 356, "cookies": false, "type": "", "deprecated": false, @@ -16770,7 +16774,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 348, + "weight": 349, "cookies": false, "type": "", "deprecated": false, @@ -16845,7 +16849,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 347, + "weight": 348, "cookies": false, "type": "", "deprecated": false, @@ -16929,7 +16933,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 350, + "weight": 351, "cookies": false, "type": "", "deprecated": false, @@ -16990,7 +16994,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 351, + "weight": 352, "cookies": false, "type": "", "deprecated": false, @@ -17068,7 +17072,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 352, + "weight": 353, "cookies": false, "type": "", "deprecated": false, @@ -17131,7 +17135,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 349, + "weight": 350, "cookies": false, "type": "", "deprecated": false, @@ -17207,7 +17211,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 354, + "weight": 355, "cookies": false, "type": "", "deprecated": false, @@ -17292,7 +17296,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 353, + "weight": 354, "cookies": false, "type": "", "deprecated": false, @@ -17384,7 +17388,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 356, + "weight": 357, "cookies": false, "type": "", "deprecated": false, @@ -17448,7 +17452,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 357, + "weight": 358, "cookies": false, "type": "", "deprecated": false, @@ -17525,7 +17529,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 406, + "weight": 407, "cookies": false, "type": "", "deprecated": false, @@ -17596,7 +17600,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 404, + "weight": 405, "cookies": false, "type": "", "deprecated": false, @@ -17846,7 +17850,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 409, + "weight": 410, "cookies": false, "type": "", "deprecated": false, @@ -17896,7 +17900,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 432, + "weight": 433, "cookies": false, "type": "", "deprecated": false, @@ -17947,7 +17951,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 405, + "weight": 406, "cookies": false, "type": "", "deprecated": false, @@ -18007,7 +18011,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 407, + "weight": 408, "cookies": false, "type": "", "deprecated": false, @@ -18253,7 +18257,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 408, + "weight": 409, "cookies": false, "type": "", "deprecated": false, @@ -18315,7 +18319,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 415, + "weight": 416, "cookies": false, "type": "", "deprecated": false, @@ -18396,7 +18400,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 414, + "weight": 415, "cookies": false, "type": "", "deprecated": false, @@ -18480,7 +18484,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 410, + "weight": 411, "cookies": false, "type": "upload", "deprecated": false, @@ -18582,7 +18586,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 418, + "weight": 419, "cookies": false, "type": "", "deprecated": false, @@ -18663,7 +18667,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 411, + "weight": 412, "cookies": false, "type": "", "deprecated": false, @@ -18767,7 +18771,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 412, + "weight": 413, "cookies": false, "type": "", "deprecated": false, @@ -18866,7 +18870,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 413, + "weight": 414, "cookies": false, "type": "", "deprecated": false, @@ -18929,7 +18933,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 416, + "weight": 417, "cookies": false, "type": "", "deprecated": false, @@ -18994,7 +18998,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 417, + "weight": 418, "cookies": false, "type": "location", "deprecated": false, @@ -19085,7 +19089,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 419, + "weight": 420, "cookies": false, "type": "", "deprecated": false, @@ -19157,7 +19161,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 421, + "weight": 422, "cookies": false, "type": "", "deprecated": false, @@ -19229,7 +19233,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 420, + "weight": 421, "cookies": false, "type": "", "deprecated": false, @@ -19292,7 +19296,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 422, + "weight": 423, "cookies": false, "type": "", "deprecated": false, @@ -19364,7 +19368,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 425, + "weight": 426, "cookies": false, "type": "", "deprecated": false, @@ -19424,7 +19428,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 423, + "weight": 424, "cookies": false, "type": "", "deprecated": false, @@ -19516,7 +19520,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 424, + "weight": 425, "cookies": false, "type": "", "deprecated": false, @@ -19586,7 +19590,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 426, + "weight": 427, "cookies": false, "type": "", "deprecated": false, @@ -19678,7 +19682,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 427, + "weight": 428, "cookies": false, "type": "", "deprecated": false, @@ -22073,7 +22077,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 440, + "weight": 441, "cookies": false, "type": "", "deprecated": false, @@ -22154,7 +22158,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 438, + "weight": 439, "cookies": false, "type": "", "deprecated": false, @@ -22244,7 +22248,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 439, + "weight": 440, "cookies": false, "type": "", "deprecated": false, @@ -22305,7 +22309,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 441, + "weight": 442, "cookies": false, "type": "", "deprecated": false, @@ -22376,7 +22380,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 442, + "weight": 443, "cookies": false, "type": "", "deprecated": false, diff --git a/app/config/specs/swagger2-1.7.x-client.json b/app/config/specs/swagger2-1.7.x-client.json index 9941e3db2c..386e5875f2 100644 --- a/app/config/specs/swagger2-1.7.x-client.json +++ b/app/config/specs/swagger2-1.7.x-client.json @@ -4798,7 +4798,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", + "description": "Create or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", "responses": { "200": { "description": "Document", @@ -5303,7 +5303,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 393, + "weight": 394, "cookies": false, "type": "", "deprecated": false, @@ -5376,7 +5376,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 391, + "weight": 392, "cookies": false, "type": "", "deprecated": false, @@ -5492,7 +5492,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 392, + "weight": 393, "cookies": false, "type": "", "deprecated": false, @@ -5563,7 +5563,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 307, + "weight": 308, "cookies": false, "type": "graphql", "deprecated": false, @@ -5636,7 +5636,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 306, + "weight": 307, "cookies": false, "type": "graphql", "deprecated": false, @@ -6117,7 +6117,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 353, + "weight": 354, "cookies": false, "type": "", "deprecated": false, @@ -6201,7 +6201,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 357, + "weight": 358, "cookies": false, "type": "", "deprecated": false, diff --git a/app/config/specs/swagger2-1.7.x-console.json b/app/config/specs/swagger2-1.7.x-console.json index 4b458c3a95..44bd326a43 100644 --- a/app/config/specs/swagger2-1.7.x-console.json +++ b/app/config/specs/swagger2-1.7.x-console.json @@ -4520,7 +4520,7 @@ "x-appwrite": { "method": "chat", "group": "console", - "weight": 309, + "weight": 310, "cookies": false, "type": "", "deprecated": false, @@ -4583,7 +4583,7 @@ "x-appwrite": { "method": "getResource", "group": null, - "weight": 433, + "weight": 434, "cookies": false, "type": "", "deprecated": false, @@ -4654,7 +4654,7 @@ "x-appwrite": { "method": "variables", "group": "console", - "weight": 308, + "weight": 309, "cookies": false, "type": "", "deprecated": false, @@ -8190,7 +8190,7 @@ "model": "#\/definitions\/documentList" } ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate new Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console." + "description": "Create new Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console." } ], "auth": { @@ -8274,7 +8274,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate or update Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.\n", + "description": "Create or update Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.\n", "responses": { "200": { "description": "Documents List", @@ -8363,7 +8363,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nUpdate all documents that match your queries, if no queries are submitted then all documents are updated. You can pass only specific fields to be updated.", + "description": "Update all documents that match your queries, if no queries are submitted then all documents are updated. You can pass only specific fields to be updated.", "responses": { "200": { "description": "Documents List", @@ -8455,7 +8455,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nBulk delete documents using queries, if no queries are passed then all documents are deleted.", + "description": "Bulk delete documents using queries, if no queries are passed then all documents are deleted.", "responses": { "200": { "description": "Documents List", @@ -8630,7 +8630,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", + "description": "Create or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", "responses": { "200": { "description": "Document", @@ -9882,7 +9882,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 377, + "weight": 378, "cookies": false, "type": "", "deprecated": false, @@ -9954,7 +9954,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 374, + "weight": 375, "cookies": false, "type": "", "deprecated": false, @@ -10205,7 +10205,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 379, + "weight": 380, "cookies": false, "type": "", "deprecated": false, @@ -10254,7 +10254,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 380, + "weight": 381, "cookies": false, "type": "", "deprecated": false, @@ -10304,7 +10304,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 403, + "weight": 404, "cookies": false, "type": "", "deprecated": false, @@ -10398,7 +10398,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 402, + "weight": 403, "cookies": false, "type": "", "deprecated": false, @@ -10456,7 +10456,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 396, + "weight": 397, "cookies": false, "type": "", "deprecated": false, @@ -10526,7 +10526,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 375, + "weight": 376, "cookies": false, "type": "", "deprecated": false, @@ -10585,7 +10585,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 376, + "weight": 377, "cookies": false, "type": "", "deprecated": false, @@ -10832,7 +10832,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 378, + "weight": 379, "cookies": false, "type": "", "deprecated": false, @@ -10893,7 +10893,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 383, + "weight": 384, "cookies": false, "type": "", "deprecated": false, @@ -10970,7 +10970,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 384, + "weight": 385, "cookies": false, "type": "", "deprecated": false, @@ -11050,7 +11050,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 381, + "weight": 382, "cookies": false, "type": "upload", "deprecated": false, @@ -11142,7 +11142,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 389, + "weight": 390, "cookies": false, "type": "", "deprecated": false, @@ -11227,7 +11227,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 386, + "weight": 387, "cookies": false, "type": "", "deprecated": false, @@ -11333,7 +11333,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 387, + "weight": 388, "cookies": false, "type": "", "deprecated": false, @@ -11429,7 +11429,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 382, + "weight": 383, "cookies": false, "type": "", "deprecated": false, @@ -11491,7 +11491,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 385, + "weight": 386, "cookies": false, "type": "", "deprecated": false, @@ -11558,7 +11558,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 388, + "weight": 389, "cookies": false, "type": "location", "deprecated": false, @@ -11643,7 +11643,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 390, + "weight": 391, "cookies": false, "type": "", "deprecated": false, @@ -11710,7 +11710,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 393, + "weight": 394, "cookies": false, "type": "", "deprecated": false, @@ -11783,7 +11783,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 391, + "weight": 392, "cookies": false, "type": "", "deprecated": false, @@ -11899,7 +11899,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 392, + "weight": 393, "cookies": false, "type": "", "deprecated": false, @@ -11963,7 +11963,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 394, + "weight": 395, "cookies": false, "type": "", "deprecated": false, @@ -12030,7 +12030,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 395, + "weight": 396, "cookies": false, "type": "", "deprecated": false, @@ -12108,7 +12108,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 399, + "weight": 400, "cookies": false, "type": "", "deprecated": false, @@ -12167,7 +12167,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 397, + "weight": 398, "cookies": false, "type": "", "deprecated": false, @@ -12257,7 +12257,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 398, + "weight": 399, "cookies": false, "type": "", "deprecated": false, @@ -12324,7 +12324,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 400, + "weight": 401, "cookies": false, "type": "", "deprecated": false, @@ -12416,7 +12416,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 401, + "weight": 402, "cookies": false, "type": "", "deprecated": false, @@ -12485,7 +12485,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 307, + "weight": 308, "cookies": false, "type": "graphql", "deprecated": false, @@ -12558,7 +12558,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 306, + "weight": 307, "cookies": false, "type": "graphql", "deprecated": false, @@ -14300,7 +14300,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 361, + "weight": 362, "cookies": false, "type": "", "deprecated": false, @@ -14375,7 +14375,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 358, + "weight": 359, "cookies": false, "type": "", "deprecated": false, @@ -14533,7 +14533,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 365, + "weight": 366, "cookies": false, "type": "", "deprecated": false, @@ -14688,7 +14688,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 360, + "weight": 361, "cookies": false, "type": "", "deprecated": false, @@ -14883,7 +14883,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 367, + "weight": 368, "cookies": false, "type": "", "deprecated": false, @@ -15077,7 +15077,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 359, + "weight": 360, "cookies": false, "type": "", "deprecated": false, @@ -15195,7 +15195,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 366, + "weight": 367, "cookies": false, "type": "", "deprecated": false, @@ -15309,7 +15309,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 364, + "weight": 365, "cookies": false, "type": "", "deprecated": false, @@ -15364,7 +15364,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 368, + "weight": 369, "cookies": false, "type": "", "deprecated": false, @@ -15424,7 +15424,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 362, + "weight": 363, "cookies": false, "type": "", "deprecated": false, @@ -15496,7 +15496,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 363, + "weight": 364, "cookies": false, "type": "", "deprecated": false, @@ -15568,7 +15568,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 333, + "weight": 334, "cookies": false, "type": "", "deprecated": false, @@ -15643,7 +15643,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 332, + "weight": 333, "cookies": false, "type": "", "deprecated": false, @@ -15758,7 +15758,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 345, + "weight": 346, "cookies": false, "type": "", "deprecated": false, @@ -15871,7 +15871,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 331, + "weight": 332, "cookies": false, "type": "", "deprecated": false, @@ -15962,7 +15962,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 344, + "weight": 345, "cookies": false, "type": "", "deprecated": false, @@ -16051,7 +16051,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 323, + "weight": 324, "cookies": false, "type": "", "deprecated": false, @@ -16178,7 +16178,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 336, + "weight": 337, "cookies": false, "type": "", "deprecated": false, @@ -16303,7 +16303,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 326, + "weight": 327, "cookies": false, "type": "", "deprecated": false, @@ -16406,7 +16406,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 339, + "weight": 340, "cookies": false, "type": "", "deprecated": false, @@ -16507,7 +16507,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 324, + "weight": 325, "cookies": false, "type": "", "deprecated": false, @@ -16622,7 +16622,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 337, + "weight": 338, "cookies": false, "type": "", "deprecated": false, @@ -16735,7 +16735,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 325, + "weight": 326, "cookies": false, "type": "", "deprecated": false, @@ -16894,7 +16894,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 338, + "weight": 339, "cookies": false, "type": "", "deprecated": false, @@ -17050,7 +17050,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 327, + "weight": 328, "cookies": false, "type": "", "deprecated": false, @@ -17153,7 +17153,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 340, + "weight": 341, "cookies": false, "type": "", "deprecated": false, @@ -17254,7 +17254,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 328, + "weight": 329, "cookies": false, "type": "", "deprecated": false, @@ -17357,7 +17357,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 341, + "weight": 342, "cookies": false, "type": "", "deprecated": false, @@ -17458,7 +17458,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 329, + "weight": 330, "cookies": false, "type": "", "deprecated": false, @@ -17561,7 +17561,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 342, + "weight": 343, "cookies": false, "type": "", "deprecated": false, @@ -17662,7 +17662,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 330, + "weight": 331, "cookies": false, "type": "", "deprecated": false, @@ -17765,7 +17765,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 343, + "weight": 344, "cookies": false, "type": "", "deprecated": false, @@ -17864,7 +17864,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 335, + "weight": 336, "cookies": false, "type": "", "deprecated": false, @@ -17919,7 +17919,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 346, + "weight": 347, "cookies": false, "type": "", "deprecated": false, @@ -17979,7 +17979,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 334, + "weight": 335, "cookies": false, "type": "", "deprecated": false, @@ -18051,7 +18051,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 355, + "weight": 356, "cookies": false, "type": "", "deprecated": false, @@ -18123,7 +18123,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 348, + "weight": 349, "cookies": false, "type": "", "deprecated": false, @@ -18196,7 +18196,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 347, + "weight": 348, "cookies": false, "type": "", "deprecated": false, @@ -18284,7 +18284,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 350, + "weight": 351, "cookies": false, "type": "", "deprecated": false, @@ -18344,7 +18344,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 351, + "weight": 352, "cookies": false, "type": "", "deprecated": false, @@ -18423,7 +18423,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 352, + "weight": 353, "cookies": false, "type": "", "deprecated": false, @@ -18483,7 +18483,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 349, + "weight": 350, "cookies": false, "type": "", "deprecated": false, @@ -18555,7 +18555,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 354, + "weight": 355, "cookies": false, "type": "", "deprecated": false, @@ -18636,7 +18636,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 353, + "weight": 354, "cookies": false, "type": "", "deprecated": false, @@ -18723,7 +18723,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 356, + "weight": 357, "cookies": false, "type": "", "deprecated": false, @@ -18786,7 +18786,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 357, + "weight": 358, "cookies": false, "type": "", "deprecated": false, @@ -18856,7 +18856,7 @@ "x-appwrite": { "method": "list", "group": null, - "weight": 315, + "weight": 316, "cookies": false, "type": "", "deprecated": false, @@ -18929,7 +18929,7 @@ "x-appwrite": { "method": "createAppwriteMigration", "group": null, - "weight": 310, + "weight": 311, "cookies": false, "type": "", "deprecated": false, @@ -19021,7 +19021,7 @@ "x-appwrite": { "method": "getAppwriteReport", "group": null, - "weight": 317, + "weight": 318, "cookies": false, "type": "", "deprecated": false, @@ -19109,7 +19109,7 @@ "x-appwrite": { "method": "createCsvMigration", "group": null, - "weight": 314, + "weight": 315, "cookies": false, "type": "", "deprecated": false, @@ -19193,7 +19193,7 @@ "x-appwrite": { "method": "createFirebaseMigration", "group": null, - "weight": 311, + "weight": 312, "cookies": false, "type": "", "deprecated": false, @@ -19271,7 +19271,7 @@ "x-appwrite": { "method": "getFirebaseReport", "group": null, - "weight": 318, + "weight": 319, "cookies": false, "type": "", "deprecated": false, @@ -19342,7 +19342,7 @@ "x-appwrite": { "method": "createNHostMigration", "group": null, - "weight": 313, + "weight": 314, "cookies": false, "type": "", "deprecated": false, @@ -19461,7 +19461,7 @@ "x-appwrite": { "method": "getNHostReport", "group": null, - "weight": 320, + "weight": 321, "cookies": false, "type": "", "deprecated": false, @@ -19581,7 +19581,7 @@ "x-appwrite": { "method": "createSupabaseMigration", "group": null, - "weight": 312, + "weight": 313, "cookies": false, "type": "", "deprecated": false, @@ -19693,7 +19693,7 @@ "x-appwrite": { "method": "getSupabaseReport", "group": null, - "weight": 319, + "weight": 320, "cookies": false, "type": "", "deprecated": false, @@ -19804,7 +19804,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 316, + "weight": 317, "cookies": false, "type": "", "deprecated": false, @@ -19862,7 +19862,7 @@ "x-appwrite": { "method": "retry", "group": null, - "weight": 321, + "weight": 322, "cookies": false, "type": "", "deprecated": false, @@ -19915,7 +19915,7 @@ "x-appwrite": { "method": "delete", "group": null, - "weight": 322, + "weight": 323, "cookies": false, "type": "", "deprecated": false, @@ -21828,7 +21828,7 @@ "x-appwrite": { "method": "listDevKeys", "group": "devKeys", - "weight": 372, + "weight": 373, "cookies": false, "type": "", "deprecated": false, @@ -21898,7 +21898,7 @@ "x-appwrite": { "method": "createDevKey", "group": "devKeys", - "weight": 369, + "weight": 370, "cookies": false, "type": "", "deprecated": false, @@ -21981,7 +21981,7 @@ "x-appwrite": { "method": "getDevKey", "group": "devKeys", - "weight": 371, + "weight": 372, "cookies": false, "type": "", "deprecated": false, @@ -22047,7 +22047,7 @@ "x-appwrite": { "method": "updateDevKey", "group": "devKeys", - "weight": 370, + "weight": 371, "cookies": false, "type": "", "deprecated": false, @@ -22133,7 +22133,7 @@ "x-appwrite": { "method": "deleteDevKey", "group": "devKeys", - "weight": 373, + "weight": 374, "cookies": false, "type": "", "deprecated": false, @@ -25676,7 +25676,7 @@ "x-appwrite": { "method": "createAPIRule", "group": null, - "weight": 434, + "weight": 435, "cookies": false, "type": "", "deprecated": false, @@ -25746,7 +25746,7 @@ "x-appwrite": { "method": "createFunctionRule", "group": null, - "weight": 436, + "weight": 437, "cookies": false, "type": "", "deprecated": false, @@ -25829,7 +25829,7 @@ "x-appwrite": { "method": "createRedirectRule", "group": null, - "weight": 437, + "weight": 438, "cookies": false, "type": "", "deprecated": false, @@ -25949,7 +25949,7 @@ "x-appwrite": { "method": "createSiteRule", "group": null, - "weight": 435, + "weight": 436, "cookies": false, "type": "", "deprecated": false, @@ -26201,7 +26201,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 406, + "weight": 407, "cookies": false, "type": "", "deprecated": false, @@ -26273,7 +26273,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 404, + "weight": 405, "cookies": false, "type": "", "deprecated": false, @@ -26540,7 +26540,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 409, + "weight": 410, "cookies": false, "type": "", "deprecated": false, @@ -26589,7 +26589,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 432, + "weight": 433, "cookies": false, "type": "", "deprecated": false, @@ -26639,7 +26639,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 428, + "weight": 429, "cookies": false, "type": "", "deprecated": false, @@ -26733,7 +26733,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 429, + "weight": 430, "cookies": false, "type": "", "deprecated": false, @@ -26791,7 +26791,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 430, + "weight": 431, "cookies": false, "type": "", "deprecated": false, @@ -26861,7 +26861,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 405, + "weight": 406, "cookies": false, "type": "", "deprecated": false, @@ -26920,7 +26920,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 407, + "weight": 408, "cookies": false, "type": "", "deprecated": false, @@ -27182,7 +27182,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 408, + "weight": 409, "cookies": false, "type": "", "deprecated": false, @@ -27243,7 +27243,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 415, + "weight": 416, "cookies": false, "type": "", "deprecated": false, @@ -27320,7 +27320,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 414, + "weight": 415, "cookies": false, "type": "", "deprecated": false, @@ -27400,7 +27400,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 410, + "weight": 411, "cookies": false, "type": "upload", "deprecated": false, @@ -27500,7 +27500,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 418, + "weight": 419, "cookies": false, "type": "", "deprecated": false, @@ -27579,7 +27579,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 411, + "weight": 412, "cookies": false, "type": "", "deprecated": false, @@ -27685,7 +27685,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 412, + "weight": 413, "cookies": false, "type": "", "deprecated": false, @@ -27782,7 +27782,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 413, + "weight": 414, "cookies": false, "type": "", "deprecated": false, @@ -27844,7 +27844,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 416, + "weight": 417, "cookies": false, "type": "", "deprecated": false, @@ -27911,7 +27911,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 417, + "weight": 418, "cookies": false, "type": "location", "deprecated": false, @@ -27996,7 +27996,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 419, + "weight": 420, "cookies": false, "type": "", "deprecated": false, @@ -28063,7 +28063,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 421, + "weight": 422, "cookies": false, "type": "", "deprecated": false, @@ -28134,7 +28134,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 420, + "weight": 421, "cookies": false, "type": "", "deprecated": false, @@ -28198,7 +28198,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 422, + "weight": 423, "cookies": false, "type": "", "deprecated": false, @@ -28265,7 +28265,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 431, + "weight": 432, "cookies": false, "type": "", "deprecated": false, @@ -28343,7 +28343,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 425, + "weight": 426, "cookies": false, "type": "", "deprecated": false, @@ -28402,7 +28402,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 423, + "weight": 424, "cookies": false, "type": "", "deprecated": false, @@ -28492,7 +28492,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 424, + "weight": 425, "cookies": false, "type": "", "deprecated": false, @@ -28559,7 +28559,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 426, + "weight": 427, "cookies": false, "type": "", "deprecated": false, @@ -28651,7 +28651,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 427, + "weight": 428, "cookies": false, "type": "", "deprecated": false, @@ -31164,7 +31164,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 440, + "weight": 441, "cookies": false, "type": "", "deprecated": false, @@ -31244,7 +31244,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 438, + "weight": 439, "cookies": false, "type": "", "deprecated": false, @@ -31328,7 +31328,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 439, + "weight": 440, "cookies": false, "type": "", "deprecated": false, @@ -31388,7 +31388,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 441, + "weight": 442, "cookies": false, "type": "", "deprecated": false, @@ -31459,7 +31459,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 442, + "weight": 443, "cookies": false, "type": "", "deprecated": false, diff --git a/app/config/specs/swagger2-1.7.x-server.json b/app/config/specs/swagger2-1.7.x-server.json index 20cf716590..2a04908c06 100644 --- a/app/config/specs/swagger2-1.7.x-server.json +++ b/app/config/specs/swagger2-1.7.x-server.json @@ -7663,7 +7663,7 @@ "model": "#\/definitions\/documentList" } ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate new Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console." + "description": "Create new Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console." } ], "auth": { @@ -7749,7 +7749,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate or update Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.\n", + "description": "Create or update Documents. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.\n", "responses": { "200": { "description": "Documents List", @@ -7839,7 +7839,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nUpdate all documents that match your queries, if no queries are submitted then all documents are updated. You can pass only specific fields to be updated.", + "description": "Update all documents that match your queries, if no queries are submitted then all documents are updated. You can pass only specific fields to be updated.", "responses": { "200": { "description": "Documents List", @@ -7932,7 +7932,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nBulk delete documents using queries, if no queries are passed then all documents are deleted.", + "description": "Bulk delete documents using queries, if no queries are passed then all documents are deleted.", "responses": { "200": { "description": "Documents List", @@ -8110,7 +8110,7 @@ "tags": [ "databases" ], - "description": "**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions.\n\nCreate or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", + "description": "Create or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/databases#databasesCreateCollection) API or directly from your database console.", "responses": { "200": { "description": "Document", @@ -8978,7 +8978,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 377, + "weight": 378, "cookies": false, "type": "", "deprecated": false, @@ -9051,7 +9051,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 374, + "weight": 375, "cookies": false, "type": "", "deprecated": false, @@ -9303,7 +9303,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 379, + "weight": 380, "cookies": false, "type": "", "deprecated": false, @@ -9353,7 +9353,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 380, + "weight": 381, "cookies": false, "type": "", "deprecated": false, @@ -9404,7 +9404,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 375, + "weight": 376, "cookies": false, "type": "", "deprecated": false, @@ -9464,7 +9464,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 376, + "weight": 377, "cookies": false, "type": "", "deprecated": false, @@ -9712,7 +9712,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 378, + "weight": 379, "cookies": false, "type": "", "deprecated": false, @@ -9774,7 +9774,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 383, + "weight": 384, "cookies": false, "type": "", "deprecated": false, @@ -9852,7 +9852,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 384, + "weight": 385, "cookies": false, "type": "", "deprecated": false, @@ -9933,7 +9933,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 381, + "weight": 382, "cookies": false, "type": "upload", "deprecated": false, @@ -10026,7 +10026,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 389, + "weight": 390, "cookies": false, "type": "", "deprecated": false, @@ -10112,7 +10112,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 386, + "weight": 387, "cookies": false, "type": "", "deprecated": false, @@ -10219,7 +10219,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 387, + "weight": 388, "cookies": false, "type": "", "deprecated": false, @@ -10316,7 +10316,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 382, + "weight": 383, "cookies": false, "type": "", "deprecated": false, @@ -10379,7 +10379,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 385, + "weight": 386, "cookies": false, "type": "", "deprecated": false, @@ -10447,7 +10447,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 388, + "weight": 389, "cookies": false, "type": "location", "deprecated": false, @@ -10533,7 +10533,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 390, + "weight": 391, "cookies": false, "type": "", "deprecated": false, @@ -10601,7 +10601,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 393, + "weight": 394, "cookies": false, "type": "", "deprecated": false, @@ -10676,7 +10676,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 391, + "weight": 392, "cookies": false, "type": "", "deprecated": false, @@ -10794,7 +10794,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 392, + "weight": 393, "cookies": false, "type": "", "deprecated": false, @@ -10860,7 +10860,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 394, + "weight": 395, "cookies": false, "type": "", "deprecated": false, @@ -10928,7 +10928,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 399, + "weight": 400, "cookies": false, "type": "", "deprecated": false, @@ -10988,7 +10988,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 397, + "weight": 398, "cookies": false, "type": "", "deprecated": false, @@ -11079,7 +11079,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 398, + "weight": 399, "cookies": false, "type": "", "deprecated": false, @@ -11147,7 +11147,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 400, + "weight": 401, "cookies": false, "type": "", "deprecated": false, @@ -11240,7 +11240,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 401, + "weight": 402, "cookies": false, "type": "", "deprecated": false, @@ -11310,7 +11310,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 307, + "weight": 308, "cookies": false, "type": "graphql", "deprecated": false, @@ -11385,7 +11385,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 306, + "weight": 307, "cookies": false, "type": "graphql", "deprecated": false, @@ -13167,7 +13167,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 361, + "weight": 362, "cookies": false, "type": "", "deprecated": false, @@ -13243,7 +13243,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 358, + "weight": 359, "cookies": false, "type": "", "deprecated": false, @@ -13402,7 +13402,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 365, + "weight": 366, "cookies": false, "type": "", "deprecated": false, @@ -13558,7 +13558,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 360, + "weight": 361, "cookies": false, "type": "", "deprecated": false, @@ -13754,7 +13754,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 367, + "weight": 368, "cookies": false, "type": "", "deprecated": false, @@ -13949,7 +13949,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 359, + "weight": 360, "cookies": false, "type": "", "deprecated": false, @@ -14068,7 +14068,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 366, + "weight": 367, "cookies": false, "type": "", "deprecated": false, @@ -14183,7 +14183,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 364, + "weight": 365, "cookies": false, "type": "", "deprecated": false, @@ -14239,7 +14239,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 368, + "weight": 369, "cookies": false, "type": "", "deprecated": false, @@ -14300,7 +14300,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 362, + "weight": 363, "cookies": false, "type": "", "deprecated": false, @@ -14373,7 +14373,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 363, + "weight": 364, "cookies": false, "type": "", "deprecated": false, @@ -14446,7 +14446,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 333, + "weight": 334, "cookies": false, "type": "", "deprecated": false, @@ -14522,7 +14522,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 332, + "weight": 333, "cookies": false, "type": "", "deprecated": false, @@ -14638,7 +14638,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 345, + "weight": 346, "cookies": false, "type": "", "deprecated": false, @@ -14752,7 +14752,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 331, + "weight": 332, "cookies": false, "type": "", "deprecated": false, @@ -14844,7 +14844,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 344, + "weight": 345, "cookies": false, "type": "", "deprecated": false, @@ -14934,7 +14934,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 323, + "weight": 324, "cookies": false, "type": "", "deprecated": false, @@ -15062,7 +15062,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 336, + "weight": 337, "cookies": false, "type": "", "deprecated": false, @@ -15188,7 +15188,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 326, + "weight": 327, "cookies": false, "type": "", "deprecated": false, @@ -15292,7 +15292,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 339, + "weight": 340, "cookies": false, "type": "", "deprecated": false, @@ -15394,7 +15394,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 324, + "weight": 325, "cookies": false, "type": "", "deprecated": false, @@ -15510,7 +15510,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 337, + "weight": 338, "cookies": false, "type": "", "deprecated": false, @@ -15624,7 +15624,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 325, + "weight": 326, "cookies": false, "type": "", "deprecated": false, @@ -15784,7 +15784,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 338, + "weight": 339, "cookies": false, "type": "", "deprecated": false, @@ -15941,7 +15941,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 327, + "weight": 328, "cookies": false, "type": "", "deprecated": false, @@ -16045,7 +16045,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 340, + "weight": 341, "cookies": false, "type": "", "deprecated": false, @@ -16147,7 +16147,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 328, + "weight": 329, "cookies": false, "type": "", "deprecated": false, @@ -16251,7 +16251,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 341, + "weight": 342, "cookies": false, "type": "", "deprecated": false, @@ -16353,7 +16353,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 329, + "weight": 330, "cookies": false, "type": "", "deprecated": false, @@ -16457,7 +16457,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 342, + "weight": 343, "cookies": false, "type": "", "deprecated": false, @@ -16559,7 +16559,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 330, + "weight": 331, "cookies": false, "type": "", "deprecated": false, @@ -16663,7 +16663,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 343, + "weight": 344, "cookies": false, "type": "", "deprecated": false, @@ -16763,7 +16763,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 335, + "weight": 336, "cookies": false, "type": "", "deprecated": false, @@ -16819,7 +16819,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 346, + "weight": 347, "cookies": false, "type": "", "deprecated": false, @@ -16880,7 +16880,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 334, + "weight": 335, "cookies": false, "type": "", "deprecated": false, @@ -16953,7 +16953,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 355, + "weight": 356, "cookies": false, "type": "", "deprecated": false, @@ -17026,7 +17026,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 348, + "weight": 349, "cookies": false, "type": "", "deprecated": false, @@ -17100,7 +17100,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 347, + "weight": 348, "cookies": false, "type": "", "deprecated": false, @@ -17189,7 +17189,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 350, + "weight": 351, "cookies": false, "type": "", "deprecated": false, @@ -17250,7 +17250,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 351, + "weight": 352, "cookies": false, "type": "", "deprecated": false, @@ -17330,7 +17330,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 352, + "weight": 353, "cookies": false, "type": "", "deprecated": false, @@ -17391,7 +17391,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 349, + "weight": 350, "cookies": false, "type": "", "deprecated": false, @@ -17464,7 +17464,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 354, + "weight": 355, "cookies": false, "type": "", "deprecated": false, @@ -17546,7 +17546,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 353, + "weight": 354, "cookies": false, "type": "", "deprecated": false, @@ -17635,7 +17635,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 356, + "weight": 357, "cookies": false, "type": "", "deprecated": false, @@ -17699,7 +17699,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 357, + "weight": 358, "cookies": false, "type": "", "deprecated": false, @@ -17771,7 +17771,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 406, + "weight": 407, "cookies": false, "type": "", "deprecated": false, @@ -17844,7 +17844,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 404, + "weight": 405, "cookies": false, "type": "", "deprecated": false, @@ -18112,7 +18112,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 409, + "weight": 410, "cookies": false, "type": "", "deprecated": false, @@ -18162,7 +18162,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 432, + "weight": 433, "cookies": false, "type": "", "deprecated": false, @@ -18213,7 +18213,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 405, + "weight": 406, "cookies": false, "type": "", "deprecated": false, @@ -18273,7 +18273,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 407, + "weight": 408, "cookies": false, "type": "", "deprecated": false, @@ -18536,7 +18536,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 408, + "weight": 409, "cookies": false, "type": "", "deprecated": false, @@ -18598,7 +18598,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 415, + "weight": 416, "cookies": false, "type": "", "deprecated": false, @@ -18676,7 +18676,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 414, + "weight": 415, "cookies": false, "type": "", "deprecated": false, @@ -18757,7 +18757,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 410, + "weight": 411, "cookies": false, "type": "upload", "deprecated": false, @@ -18858,7 +18858,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 418, + "weight": 419, "cookies": false, "type": "", "deprecated": false, @@ -18938,7 +18938,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 411, + "weight": 412, "cookies": false, "type": "", "deprecated": false, @@ -19045,7 +19045,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 412, + "weight": 413, "cookies": false, "type": "", "deprecated": false, @@ -19143,7 +19143,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 413, + "weight": 414, "cookies": false, "type": "", "deprecated": false, @@ -19206,7 +19206,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 416, + "weight": 417, "cookies": false, "type": "", "deprecated": false, @@ -19274,7 +19274,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 417, + "weight": 418, "cookies": false, "type": "location", "deprecated": false, @@ -19360,7 +19360,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 419, + "weight": 420, "cookies": false, "type": "", "deprecated": false, @@ -19428,7 +19428,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 421, + "weight": 422, "cookies": false, "type": "", "deprecated": false, @@ -19500,7 +19500,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 420, + "weight": 421, "cookies": false, "type": "", "deprecated": false, @@ -19565,7 +19565,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 422, + "weight": 423, "cookies": false, "type": "", "deprecated": false, @@ -19633,7 +19633,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 425, + "weight": 426, "cookies": false, "type": "", "deprecated": false, @@ -19693,7 +19693,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 423, + "weight": 424, "cookies": false, "type": "", "deprecated": false, @@ -19784,7 +19784,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 424, + "weight": 425, "cookies": false, "type": "", "deprecated": false, @@ -19852,7 +19852,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 426, + "weight": 427, "cookies": false, "type": "", "deprecated": false, @@ -19945,7 +19945,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 427, + "weight": 428, "cookies": false, "type": "", "deprecated": false, @@ -22288,7 +22288,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 440, + "weight": 441, "cookies": false, "type": "", "deprecated": false, @@ -22369,7 +22369,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 438, + "weight": 439, "cookies": false, "type": "", "deprecated": false, @@ -22454,7 +22454,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 439, + "weight": 440, "cookies": false, "type": "", "deprecated": false, @@ -22515,7 +22515,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 441, + "weight": 442, "cookies": false, "type": "", "deprecated": false, @@ -22587,7 +22587,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 442, + "weight": 443, "cookies": false, "type": "", "deprecated": false, diff --git a/app/config/templates/site.php b/app/config/templates/site.php index 4ae6f61607..95a2161902 100644 --- a/app/config/templates/site.php +++ b/app/config/templates/site.php @@ -473,13 +473,13 @@ return [ 'frameworks' => [ getFramework('FLUTTER', [ 'providerRootDirectory' => './', - 'buildCommand' => 'bash build.sh', + 'buildCommand' => 'bash prepare-env.sh && flutter build web', ]), ], 'vcsProvider' => 'github', 'providerRepositoryId' => 'starter-for-flutter', 'providerOwner' => 'appwrite', - 'providerVersion' => '0.1.*', + 'providerVersion' => '0.2.*', 'variables' => [ [ 'name' => 'APPWRITE_PUBLIC_ENDPOINT', diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 27b7c28e82..f201929021 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -2268,6 +2268,8 @@ App::get('/v1/projects/:projectId/templates/email/:type/:locale') $template = $templates['email.' . $type . '-' . $locale] ?? null; $localeObj = new Locale($locale); + $localeObj->setFallback(System::getEnv('_APP_LOCALE', 'en')); + if (is_null($template)) { /** * different templates, different placeholders. diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 3376f4857c..993f8a03c9 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -643,15 +643,20 @@ App::get('/v1/users') $cursor->setValue($cursorDocument); } - $filterQueries = Query::groupByType($queries)['filters']; - try { - $users = $dbForProject->find('users', $queries); - $total = $dbForProject->count('users', $filterQueries, APP_LIMIT_COUNT); - } catch (OrderException $e) { - throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."); - } catch (QueryException $e) { - throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); - } + $users = []; + $total = 0; + + $dbForProject->skipFilters(function () use ($dbForProject, $queries, &$users, &$total) { + try { + $users = $dbForProject->find('users', $queries); + $total = $dbForProject->count('users', $queries, APP_LIMIT_COUNT); + } catch (OrderException $e) { + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."); + } catch (QueryException $e) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); + } + }, ['subQueryAuthenticators', 'subQuerySessions', 'subQueryTokens', 'subQueryChallenges', 'subQueryMemberships']); + $response->dynamic(new Document([ 'users' => $users, 'total' => $total, diff --git a/app/controllers/mock.php b/app/controllers/mock.php index 0684e5294a..40ddae8f30 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -13,6 +13,7 @@ use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\UID; +use Utopia\Locale\Locale; use Utopia\System\System; use Utopia\Validator\Host; use Utopia\Validator\Text; @@ -35,6 +36,25 @@ App::get('/v1/mock/tests/general/oauth2') $response->redirect($redirectURI . '?' . \http_build_query(['code' => 'abcdef', 'state' => $state])); }); +App::get('/v1/mock/tests/locale') + ->desc('Mock locale translation key') + ->groups(['mock']) + ->label('scope', 'public') + ->label('docs', false) + ->label('mock', true) + ->inject('locale') + ->inject('localeCodes') + ->inject('request') + ->inject('response') + ->action(function (Locale $locale, array $localeCodes, Request $request, Response $response) { + $localeParam = (string) $request->getParam('locale', $request->getHeader('x-appwrite-locale', '')); + if (\in_array($localeParam, $localeCodes)) { + $locale->setDefault($localeParam); + } + + $response->send($locale->getText('mock')); + }); + App::get('/v1/mock/tests/general/oauth2/token') ->desc('OAuth2 Token') ->groups(['mock']) diff --git a/app/init/database/filters.php b/app/init/database/filters.php index 98a37ec4ad..33f5d8077a 100644 --- a/app/init/database/filters.php +++ b/app/init/database/filters.php @@ -245,10 +245,16 @@ Database::addFilter( return; }, function (mixed $value, Document $document, Database $database) { + $resourceType = match ($document->getCollection()) { + 'functions' => ['function'], + 'sites' => ['site'], + default => ['function', 'site'] + }; + return $database ->find('variables', [ Query::equal('resourceInternalId', [$document->getSequence()]), - Query::equal('resourceType', ['function', 'site']), + Query::equal('resourceType', $resourceType), Query::limit(APP_LIMIT_SUBQUERY), ]); } diff --git a/app/init/resources.php b/app/init/resources.php index 4d1e0444c5..468ca4fbd8 100644 --- a/app/init/resources.php +++ b/app/init/resources.php @@ -70,7 +70,11 @@ App::setResource('hooks', function ($register) { }, ['register']); App::setResource('register', fn () => $register); -App::setResource('locale', fn () => new Locale(System::getEnv('_APP_LOCALE', 'en'))); +App::setResource('locale', function () { + $locale = new Locale(System::getEnv('_APP_LOCALE', 'en')); + $locale->setFallback(System::getEnv('_APP_LOCALE', 'en')); + return $locale; +}); App::setResource('localeCodes', function () { return array_map(fn ($locale) => $locale['code'], Config::getParam('locale-codes', [])); diff --git a/composer.json b/composer.json index 687ad1bfe5..c7b80f8621 100644 --- a/composer.json +++ b/composer.json @@ -46,13 +46,13 @@ "ext-sockets": "*", "appwrite/php-runtimes": "0.19.*", "appwrite/php-clamav": "2.0.*", - "utopia-php/abuse": "0.52.*", + "utopia-php/abuse": "1.*", "utopia-php/analytics": "0.10.*", - "utopia-php/audit": "0.55.*", + "utopia-php/audit": "1.*", "utopia-php/cache": "0.13.*", "utopia-php/cli": "0.15.*", "utopia-php/config": "0.2.*", - "utopia-php/database": "0.77.*", + "utopia-php/database": "1.*", "utopia-php/detector": "0.1.*", "utopia-php/domains": "0.8.*", "utopia-php/dns": "0.3.*", @@ -60,10 +60,10 @@ "utopia-php/framework": "0.33.*", "utopia-php/fetch": "0.4.*", "utopia-php/image": "0.8.*", - "utopia-php/locale": "0.4.*", + "utopia-php/locale": "0.8.*", "utopia-php/logger": "0.6.*", "utopia-php/messaging": "0.18.*", - "utopia-php/migration": "0.14.*", + "utopia-php/migration": "1.*", "utopia-php/orchestration": "0.9.*", "utopia-php/platform": "0.7.*", "utopia-php/pools": "0.8.*", @@ -84,7 +84,7 @@ "spomky-labs/otphp": "^10.0", "webonyx/graphql-php": "14.11.*", "league/csv": "9.14.*", - "enshrined/svg-sanitize": "0.21.*" + "enshrined/svg-sanitize": "0.22.*" }, "require-dev": { "ext-fileinfo": "*", diff --git a/composer.lock b/composer.lock index c2e2ba05be..b97dbb2e7f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "72786a5d87326f396250f18d725dea23", + "content-hash": "3456d5ee571287eb4ea90683279f209a", "packages": [ { "name": "adhocore/jwt", @@ -630,16 +630,16 @@ }, { "name": "enshrined/svg-sanitize", - "version": "0.21.0", + "version": "0.22.0", "source": { "type": "git", "url": "https://github.com/darylldoyle/svg-sanitizer.git", - "reference": "5e477468fac5c5ce933dce53af3e8e4e58dcccc9" + "reference": "0afa95ea74be155a7bcd6c6fb60c276c39984500" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/5e477468fac5c5ce933dce53af3e8e4e58dcccc9", - "reference": "5e477468fac5c5ce933dce53af3e8e4e58dcccc9", + "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/0afa95ea74be155a7bcd6c6fb60c276c39984500", + "reference": "0afa95ea74be155a7bcd6c6fb60c276c39984500", "shasum": "" }, "require": { @@ -669,9 +669,9 @@ "description": "An SVG sanitizer for PHP", "support": { "issues": "https://github.com/darylldoyle/svg-sanitizer/issues", - "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.21.0" + "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.22.0" }, - "time": "2025-01-13T09:32:25+00:00" + "time": "2025-08-12T10:13:48+00:00" }, { "name": "giggsey/libphonenumber-for-php-lite", @@ -3203,16 +3203,16 @@ }, { "name": "utopia-php/abuse", - "version": "0.52.0", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/utopia-php/abuse.git", - "reference": "a0d6421e7e5baa3ac02755496dca9fdeaa814b93" + "reference": "c5e2232033b507a07f72180dc56d37e1872ee7be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/abuse/zipball/a0d6421e7e5baa3ac02755496dca9fdeaa814b93", - "reference": "a0d6421e7e5baa3ac02755496dca9fdeaa814b93", + "url": "https://api.github.com/repos/utopia-php/abuse/zipball/c5e2232033b507a07f72180dc56d37e1872ee7be", + "reference": "c5e2232033b507a07f72180dc56d37e1872ee7be", "shasum": "" }, "require": { @@ -3220,7 +3220,7 @@ "ext-pdo": "*", "ext-redis": "*", "php": ">=8.0", - "utopia-php/database": "0.*.*" + "utopia-php/database": "1.*" }, "require-dev": { "laravel/pint": "1.*", @@ -3248,9 +3248,9 @@ ], "support": { "issues": "https://github.com/utopia-php/abuse/issues", - "source": "https://github.com/utopia-php/abuse/tree/0.52.0" + "source": "https://github.com/utopia-php/abuse/tree/1.0.0" }, - "time": "2025-03-06T03:48:29+00:00" + "time": "2025-08-13T09:12:54+00:00" }, { "name": "utopia-php/analytics", @@ -3300,21 +3300,21 @@ }, { "name": "utopia-php/audit", - "version": "0.55.0", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/utopia-php/audit.git", - "reference": "9f8cfe5fa5d5011b8dbf93b710236dfa91dc5518" + "reference": "c0ed75f4d068f1f6c2e7149a909490d4214e72bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/audit/zipball/9f8cfe5fa5d5011b8dbf93b710236dfa91dc5518", - "reference": "9f8cfe5fa5d5011b8dbf93b710236dfa91dc5518", + "url": "https://api.github.com/repos/utopia-php/audit/zipball/c0ed75f4d068f1f6c2e7149a909490d4214e72bb", + "reference": "c0ed75f4d068f1f6c2e7149a909490d4214e72bb", "shasum": "" }, "require": { "php": ">=8.0", - "utopia-php/database": "0.*.*" + "utopia-php/database": "1.*" }, "require-dev": { "laravel/pint": "1.*", @@ -3341,9 +3341,9 @@ ], "support": { "issues": "https://github.com/utopia-php/audit/issues", - "source": "https://github.com/utopia-php/audit/tree/0.55.0" + "source": "https://github.com/utopia-php/audit/tree/1.0.0" }, - "time": "2025-03-06T03:47:47+00:00" + "time": "2025-08-13T09:09:00+00:00" }, { "name": "utopia-php/cache", @@ -3545,16 +3545,16 @@ }, { "name": "utopia-php/database", - "version": "0.77.0", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "a8ab3a7b25a5a1edf7e7afc83eda9f7aec5ba57d" + "reference": "eaa4e275cefdeeb90bcece2f056e05b59f5b1473" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/a8ab3a7b25a5a1edf7e7afc83eda9f7aec5ba57d", - "reference": "a8ab3a7b25a5a1edf7e7afc83eda9f7aec5ba57d", + "url": "https://api.github.com/repos/utopia-php/database/zipball/eaa4e275cefdeeb90bcece2f056e05b59f5b1473", + "reference": "eaa4e275cefdeeb90bcece2f056e05b59f5b1473", "shasum": "" }, "require": { @@ -3595,9 +3595,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/0.77.0" + "source": "https://github.com/utopia-php/database/tree/1.0.0" }, - "time": "2025-08-07T09:30:32+00:00" + "time": "2025-08-11T13:56:31+00:00" }, { "name": "utopia-php/detector", @@ -3945,22 +3945,24 @@ }, { "name": "utopia-php/locale", - "version": "0.4.0", + "version": "0.8.0", "source": { "type": "git", "url": "https://github.com/utopia-php/locale.git", - "reference": "c2d9358d0fe2f6b6ed5448369f9d1e430c615447" + "reference": "10ffc869c904c45e32ab0c61f4b33ba774777eb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/locale/zipball/c2d9358d0fe2f6b6ed5448369f9d1e430c615447", - "reference": "c2d9358d0fe2f6b6ed5448369f9d1e430c615447", + "url": "https://api.github.com/repos/utopia-php/locale/zipball/10ffc869c904c45e32ab0c61f4b33ba774777eb6", + "reference": "10ffc869c904c45e32ab0c61f4b33ba774777eb6", "shasum": "" }, "require": { "php": ">=7.4" }, "require-dev": { + "laravel/pint": "1.2.*", + "phpstan/phpstan": "1.*", "phpunit/phpunit": "^9.3", "vimeo/psalm": "4.0.1" }, @@ -3974,12 +3976,6 @@ "license": [ "MIT" ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], "description": "A simple locale library to manage application translations", "keywords": [ "framework", @@ -3990,9 +3986,9 @@ ], "support": { "issues": "https://github.com/utopia-php/locale/issues", - "source": "https://github.com/utopia-php/locale/tree/0.4.0" + "source": "https://github.com/utopia-php/locale/tree/0.8.0" }, - "time": "2021-07-24T11:35:55+00:00" + "time": "2025-08-12T12:58:26+00:00" }, { "name": "utopia-php/logger", @@ -4101,16 +4097,16 @@ }, { "name": "utopia-php/migration", - "version": "0.14.3", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/utopia-php/migration.git", - "reference": "c47855518c95f80fde71fec5f6598623eb2fc884" + "reference": "0e4499d9dd2c90c2be188cc5fb7a32d9a892b569" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/migration/zipball/c47855518c95f80fde71fec5f6598623eb2fc884", - "reference": "c47855518c95f80fde71fec5f6598623eb2fc884", + "url": "https://api.github.com/repos/utopia-php/migration/zipball/0e4499d9dd2c90c2be188cc5fb7a32d9a892b569", + "reference": "0e4499d9dd2c90c2be188cc5fb7a32d9a892b569", "shasum": "" }, "require": { @@ -4118,7 +4114,7 @@ "ext-curl": "*", "ext-openssl": "*", "php": ">=8.1", - "utopia-php/database": "0.*.*", + "utopia-php/database": "1.*", "utopia-php/dsn": "0.2.*", "utopia-php/framework": "0.33.*", "utopia-php/storage": "0.18.*" @@ -4151,9 +4147,9 @@ ], "support": { "issues": "https://github.com/utopia-php/migration/issues", - "source": "https://github.com/utopia-php/migration/tree/0.14.3" + "source": "https://github.com/utopia-php/migration/tree/1.0.0" }, - "time": "2025-08-08T13:10:17+00:00" + "time": "2025-08-13T09:15:53+00:00" }, { "name": "utopia-php/orchestration", @@ -6147,16 +6143,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.23", + "version": "9.6.24", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95" + "reference": "ea49afa29aeea25ea7bf9de9fdd7cab163cc0701" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/43d2cb18d0675c38bd44982a5d1d88f6d53d8d95", - "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ea49afa29aeea25ea7bf9de9fdd7cab163cc0701", + "reference": "ea49afa29aeea25ea7bf9de9fdd7cab163cc0701", "shasum": "" }, "require": { @@ -6167,7 +6163,7 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.1", + "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=7.3", @@ -6178,11 +6174,11 @@ "phpunit/php-timer": "^5.0.3", "sebastian/cli-parser": "^1.0.2", "sebastian/code-unit": "^1.0.8", - "sebastian/comparator": "^4.0.8", + "sebastian/comparator": "^4.0.9", "sebastian/diff": "^4.0.6", "sebastian/environment": "^5.1.5", "sebastian/exporter": "^4.0.6", - "sebastian/global-state": "^5.0.7", + "sebastian/global-state": "^5.0.8", "sebastian/object-enumerator": "^4.0.4", "sebastian/resource-operations": "^3.0.4", "sebastian/type": "^3.2.1", @@ -6230,7 +6226,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.23" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.24" }, "funding": [ { @@ -6254,7 +6250,7 @@ "type": "tidelift" } ], - "time": "2025-05-02T06:40:34+00:00" + "time": "2025-08-10T08:32:42+00:00" }, { "name": "psr/cache", @@ -6474,16 +6470,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "4.0.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5", + "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5", "shasum": "" }, "require": { @@ -6536,15 +6532,27 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.9" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2025-08-10T06:51:50+00:00" }, { "name": "sebastian/complexity", @@ -6811,16 +6819,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.7", + "version": "5.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", "shasum": "" }, "require": { @@ -6863,15 +6871,27 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" } ], - "time": "2024-03-02T06:35:11+00:00" + "time": "2025-08-10T07:10:35+00:00" }, { "name": "sebastian/lines-of-code", @@ -7044,16 +7064,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0", + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0", "shasum": "" }, "require": { @@ -7095,15 +7115,27 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.6" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2023-02-03T06:07:39+00:00" + "time": "2025-08-10T06:57:39+00:00" }, { "name": "sebastian/resource-operations", diff --git a/docker-compose.yml b/docker-compose.yml index 331daea522..bdc8974a35 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -216,7 +216,7 @@ services: appwrite-console: <<: *x-logging container_name: appwrite-console - image: appwrite/console:6.2.0 + image: appwrite/console:7.0.0-qa.8 restart: unless-stopped networks: - appwrite @@ -963,7 +963,7 @@ services: hostname: exc1 <<: *x-logging stop_signal: SIGINT - image: openruntimes/executor:0.7.22 + image: openruntimes/executor:0.8.1 restart: unless-stopped networks: - appwrite diff --git a/docs/references/databases/create-documents.md b/docs/references/databases/create-documents.md index 7f60c138ea..a02d7c8bf1 100644 --- a/docs/references/databases/create-documents.md +++ b/docs/references/databases/create-documents.md @@ -1,3 +1 @@ -**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions. - Create new Documents. Before using this route, you should create a new collection resource using either a [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection) API or directly from your database console. \ No newline at end of file diff --git a/docs/references/databases/delete-documents.md b/docs/references/databases/delete-documents.md index b4e255c69f..a7b05503de 100644 --- a/docs/references/databases/delete-documents.md +++ b/docs/references/databases/delete-documents.md @@ -1,3 +1 @@ -**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions. - Bulk delete documents using queries, if no queries are passed then all documents are deleted. \ No newline at end of file diff --git a/docs/references/databases/update-documents.md b/docs/references/databases/update-documents.md index 9ab8373d36..5f560c6435 100644 --- a/docs/references/databases/update-documents.md +++ b/docs/references/databases/update-documents.md @@ -1,3 +1 @@ -**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions. - Update all documents that match your queries, if no queries are submitted then all documents are updated. You can pass only specific fields to be updated. \ No newline at end of file diff --git a/docs/references/databases/upsert-document.md b/docs/references/databases/upsert-document.md index 1980141d22..a67694cfa6 100644 --- a/docs/references/databases/upsert-document.md +++ b/docs/references/databases/upsert-document.md @@ -1,3 +1 @@ -**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions. - Create or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection) API or directly from your database console. \ No newline at end of file diff --git a/docs/references/databases/upsert-documents.md b/docs/references/databases/upsert-documents.md index 8d9a725eff..f46254bd7b 100644 --- a/docs/references/databases/upsert-documents.md +++ b/docs/references/databases/upsert-documents.md @@ -1,3 +1 @@ -**WARNING: Experimental Feature** - This endpoint is experimental and not yet officially supported. It may be subject to breaking changes or removal in future versions. - Create or update Documents. Before using this route, you should create a new collection resource using either a [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection) API or directly from your database console. diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Action.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Action.php index 7e9aafad75..002c777dec 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Action.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Action.php @@ -35,7 +35,7 @@ abstract class Action extends UtopiaAction * * Used for endpoints with multiple sdk methods. */ - final protected function getBulkActionName(string $name): string + protected function getBulkActionName(string $name): string { return "{$name}s"; } @@ -43,7 +43,7 @@ abstract class Action extends UtopiaAction /** * Get the current context. */ - final protected function getContext(): string + protected function getContext(): string { return $this->context; } @@ -51,7 +51,7 @@ abstract class Action extends UtopiaAction /** * Returns true if current context is Collections API. */ - final protected function isCollectionsAPI(): bool + protected function isCollectionsAPI(): bool { // rows in tables api context // documents in collections api context @@ -63,7 +63,7 @@ abstract class Action extends UtopiaAction * * Can be used for XList operations as well! */ - final protected function getSdkGroup(): string + protected function getSdkGroup(): string { return $this->isCollectionsAPI() ? 'documents' : 'rows'; } @@ -71,7 +71,7 @@ abstract class Action extends UtopiaAction /** * Get the SDK namespace for the current action. */ - final protected function getSdkNamespace(): string + protected function getSdkNamespace(): string { return $this->isCollectionsAPI() ? 'databases' : 'grids'; } @@ -79,7 +79,7 @@ abstract class Action extends UtopiaAction /** * Get the correct attribute/column structure context for errors. */ - final protected function getStructureContext(): string + protected function getStructureContext(): string { return $this->isCollectionsAPI() ? 'attributes' : 'columns'; } @@ -87,7 +87,7 @@ abstract class Action extends UtopiaAction /** * Get the appropriate parent level not found exception. */ - final protected function getParentNotFoundException(): string + protected function getParentNotFoundException(): string { return $this->isCollectionsAPI() ? Exception::COLLECTION_NOT_FOUND @@ -97,7 +97,7 @@ abstract class Action extends UtopiaAction /** * Get the appropriate attribute/column not found exception. */ - final protected function getStructureNotFoundException(): string + protected function getStructureNotFoundException(): string { return $this->isCollectionsAPI() ? Exception::ATTRIBUTE_NOT_FOUND @@ -107,7 +107,7 @@ abstract class Action extends UtopiaAction /** * Get the appropriate not found exception. */ - final protected function getNotFoundException(): string + protected function getNotFoundException(): string { return $this->isCollectionsAPI() ? Exception::DOCUMENT_NOT_FOUND @@ -117,7 +117,7 @@ abstract class Action extends UtopiaAction /** * Get the appropriate already exists exception. */ - final protected function getDuplicateException(): string + protected function getDuplicateException(): string { return $this->isCollectionsAPI() ? Exception::DOCUMENT_ALREADY_EXISTS @@ -127,7 +127,7 @@ abstract class Action extends UtopiaAction /** * Get the appropriate conflict exception. */ - final protected function getConflictException(): string + protected function getConflictException(): string { return $this->isCollectionsAPI() ? Exception::DOCUMENT_UPDATE_CONFLICT @@ -137,7 +137,7 @@ abstract class Action extends UtopiaAction /** * Get the appropriate delete restricted exception. */ - final protected function getRestrictedException(): string + protected function getRestrictedException(): string { return $this->isCollectionsAPI() ? Exception::DOCUMENT_DELETE_RESTRICTED @@ -147,7 +147,7 @@ abstract class Action extends UtopiaAction /** * Get the correct invalid structure message. */ - final protected function getInvalidStructureException(): string + protected function getInvalidStructureException(): string { return $this->isCollectionsAPI() ? Exception::DOCUMENT_INVALID_STRUCTURE @@ -157,7 +157,7 @@ abstract class Action extends UtopiaAction /** * Get the appropriate missing data exception. */ - final protected function getMissingDataException(): string + protected function getMissingDataException(): string { return $this->isCollectionsAPI() ? Exception::DOCUMENT_MISSING_DATA @@ -167,7 +167,7 @@ abstract class Action extends UtopiaAction /** * Get the exception to throw when the resource limit is exceeded. */ - final protected function getLimitException(): string + protected function getLimitException(): string { return $this->isCollectionsAPI() ? Exception::ATTRIBUTE_LIMIT_EXCEEDED @@ -177,7 +177,7 @@ abstract class Action extends UtopiaAction /** * Get the appropriate missing payload exception. */ - final protected function getMissingPayloadException(): string + protected function getMissingPayloadException(): string { return $this->isCollectionsAPI() ? Exception::DOCUMENT_MISSING_PAYLOAD @@ -187,7 +187,7 @@ abstract class Action extends UtopiaAction /** * Get the correct collections context for Events queue. */ - final protected function getCollectionsEventsContext(): string + protected function getCollectionsEventsContext(): string { return $this->isCollectionsAPI() ? 'collection' : 'table'; } @@ -195,7 +195,7 @@ abstract class Action extends UtopiaAction /** * Resolves relationships in a document and attaches metadata. */ - final protected function processDocument( + protected function processDocument( /* database */ Document $database, Document $collection, diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Delete.php index 0c27ea420a..da919a64bf 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Delete.php @@ -17,6 +17,7 @@ use Utopia\Database\Document; use Utopia\Database\Exception\Conflict as ConflictException; use Utopia\Database\Exception\Query as QueryException; use Utopia\Database\Exception\Restricted as RestrictedException; +use Utopia\Database\Helpers\ID; use Utopia\Database\Query; use Utopia\Database\Validator\UID; use Utopia\Swoole\Response as SwooleResponse; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Update.php index 8cca45661d..fdc8efdd83 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Update.php @@ -18,6 +18,7 @@ use Utopia\Database\Exception\Conflict as ConflictException; use Utopia\Database\Exception\Query as QueryException; use Utopia\Database\Exception\Relationship as RelationshipException; use Utopia\Database\Exception\Structure as StructureException; +use Utopia\Database\Helpers\ID; use Utopia\Database\Query; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; @@ -108,7 +109,7 @@ class Update extends Action $hasRelationships = \array_filter( $collection->getAttribute('attributes', []), - fn ($attribute) => $attribute->getAttribute('type') === Database::VAR_RELATIONSHIP + fn($attribute) => $attribute->getAttribute('type') === Database::VAR_RELATIONSHIP ); if ($hasRelationships) { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Upsert.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Upsert.php index 0868a2519b..e3cbe56752 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Upsert.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Upsert.php @@ -17,6 +17,7 @@ use Utopia\Database\Exception\Conflict as ConflictException; use Utopia\Database\Exception\Duplicate as DuplicateException; use Utopia\Database\Exception\Relationship as RelationshipException; use Utopia\Database\Exception\Structure as StructureException; +use Utopia\Database\Helpers\ID; use Utopia\Database\Validator\UID; use Utopia\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Create.php index fe8b688a54..0327677372 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Create.php @@ -66,6 +66,7 @@ class Create extends Action namespace: $this->getSdkNamespace(), group: $this->getSdkGroup(), name: self::getName(), + desc: 'Create document', description: '/docs/references/databases/create-document.md', auth: [AuthType::SESSION, AuthType::KEY, AuthType::JWT], responses: [ @@ -91,6 +92,7 @@ class Create extends Action namespace: $this->getSdkNamespace(), group: $this->getSdkGroup(), name: $this->getBulkActionName(self::getName()), + desc: 'Create documents', description: '/docs/references/databases/create-documents.md', auth: [AuthType::ADMIN, AuthType::KEY], responses: [ @@ -191,8 +193,11 @@ class Create extends Action // Handle transaction staging if ($transactionId !== null) { $transaction = $dbForProject->getDocument('transactions', $transactionId); - if ($transaction->isEmpty() || $transaction->getAttribute('status', '') !== 'pending') { - throw new Exception(Exception::GENERAL_BAD_REQUEST, 'Invalid or non‑pending transaction'); + if ($transaction->isEmpty()) { + throw new Exception(Exception::TRANSACTION_NOT_FOUND); + } + if ($transaction->getAttribute('status', '') !== 'pending') { + throw new Exception(Exception::TRANSACTION_NOT_READY); } // Enforce max operations per transaction @@ -472,8 +477,7 @@ class Create extends Action ->addMetric(str_replace('{databaseInternalId}', $database->getSequence(), METRIC_DATABASE_ID_OPERATIONS_WRITES), \max(1, $operations)); // per collection $response->setStatusCode(SwooleResponse::STATUS_CODE_CREATED); - - + if ($isBulk) { $response->dynamic(new Document([ 'total' => count($documents), diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Delete.php index b176d24ef5..d801704b53 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Delete.php @@ -13,8 +13,10 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; +use Utopia\Database\Document; use Utopia\Database\Exception\Conflict as ConflictException; use Utopia\Database\Exception\Restricted as RestrictedException; +use Utopia\Database\Helpers\ID; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; use Utopia\Swoole\Response as SwooleResponse; @@ -108,8 +110,11 @@ class Delete extends Action // Handle transaction staging if ($transactionId !== null) { $transaction = $dbForProject->getDocument('transactions', $transactionId); - if ($transaction->isEmpty() || $transaction->getAttribute('status', '') !== 'pending') { - throw new Exception(Exception::GENERAL_BAD_REQUEST, 'Invalid or non‑pending transaction'); + if ($transaction->isEmpty()) { + throw new Exception(Exception::TRANSACTION_NOT_FOUND); + } + if ($transaction->getAttribute('status', '') !== 'pending') { + throw new Exception(Exception::TRANSACTION_NOT_READY); } // Enforce max operations per transaction diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Update.php index 611652b48d..5ae817dbed 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Update.php @@ -121,6 +121,7 @@ class Update extends Action throw new Exception($this->getInvalidStructureException(), 'Attribute "$updatedAt" can not be modified. Please use a server SDK with an API key to modify server attributes.'); } } + // Read permission should not be required for update /** @var Document $document */ $document = Authorization::skip(fn () => $dbForProject->getDocument('database_' . $database->getSequence() . '_collection_' . $collection->getSequence(), $documentId)); @@ -132,8 +133,11 @@ class Update extends Action // Handle transaction staging if ($transactionId !== null) { $transaction = $dbForProject->getDocument('transactions', $transactionId); - if ($transaction->isEmpty() || $transaction->getAttribute('status', '') !== 'pending') { - throw new Exception(Exception::GENERAL_BAD_REQUEST, 'Invalid or non‑pending transaction'); + if ($transaction->isEmpty()) { + throw new Exception(Exception::TRANSACTION_NOT_FOUND); + } + if ($transaction->getAttribute('status', '') !== 'pending') { + throw new Exception(Exception::TRANSACTION_NOT_READY); } // Enforce max operations per transaction diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Upsert.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Upsert.php index fff6c53978..e1a4153518 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Upsert.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Upsert.php @@ -115,8 +115,11 @@ class Upsert extends Action // Handle transaction staging if ($transactionId !== null) { $transaction = $dbForProject->getDocument('transactions', $transactionId); - if ($transaction->isEmpty() || $transaction->getAttribute('status', '') !== 'pending') { - throw new Exception(Exception::GENERAL_BAD_REQUEST, 'Invalid or non‑pending transaction'); + if ($transaction->isEmpty()) { + throw new Exception(Exception::TRANSACTION_NOT_FOUND); + } + if ($transaction->getAttribute('status', '') !== 'pending') { + throw new Exception(Exception::TRANSACTION_NOT_READY); } // Enforce max operations per transaction diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Grids/Tables/Rows/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Grids/Tables/Rows/Create.php index dfbb9a61d2..db6029def9 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Grids/Tables/Rows/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Grids/Tables/Rows/Create.php @@ -53,6 +53,7 @@ class Create extends DocumentCreate namespace: $this->getSdkNamespace(), group: $this->getSdkGroup(), name: self::getName(), + desc: 'Create row', description: '/docs/references/grids/create-row.md', auth: [AuthType::SESSION, AuthType::KEY, AuthType::JWT], responses: [ @@ -74,6 +75,7 @@ class Create extends DocumentCreate namespace: $this->getSdkNamespace(), group: $this->getSdkGroup(), name: $this->getBulkActionName(self::getName()), + desc: 'Create rows', description: '/docs/references/grids/create-rows.md', auth: [AuthType::ADMIN, AuthType::KEY], responses: [ diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Transactions/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Transactions/Create.php index 9c4577c4c6..25a16e19e3 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Transactions/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Transactions/Create.php @@ -9,10 +9,9 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; +use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Database\Helpers\ID; -use Utopia\Database\Validator\UID; -use Utopia\DateTime\DateTime; use Utopia\Swoole\Response as SwooleResponse; use Utopia\Validator\Range; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Transactions/AddOperations.php b/src/Appwrite/Platform/Modules/Databases/Http/Transactions/Operations/Create.php similarity index 97% rename from src/Appwrite/Platform/Modules/Databases/Http/Transactions/AddOperations.php rename to src/Appwrite/Platform/Modules/Databases/Http/Transactions/Operations/Create.php index d8d31f0d8f..4974556cec 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Transactions/AddOperations.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Transactions/Operations/Create.php @@ -1,6 +1,6 @@ isEmpty()) { $dbForProject->purgeCachedDocument('database_' . $database->getSequence(), $relatedCollection->getId()); + $dbForProject->purgeCachedCollection('database_' . $database->getSequence() . '_collection_' . $relatedCollection->getSequence()); } $dbForProject->purgeCachedDocument('database_' . $database->getSequence(), $collectionId); + $dbForProject->purgeCachedCollection('database_' . $database->getSequence() . '_collection_' . $collection->getSequence()); } } @@ -383,9 +385,11 @@ class Databases extends Action } } finally { $dbForProject->purgeCachedDocument('database_' . $database->getSequence(), $collectionId); + $dbForProject->purgeCachedCollection('database_' . $database->getSequence() . '_collection_' . $collection->getSequence()); if (! $relatedCollection->isEmpty()) { $dbForProject->purgeCachedDocument('database_' . $database->getSequence(), $relatedCollection->getId()); + $dbForProject->purgeCachedCollection('database_' . $database->getSequence() . '_collection_' . $relatedCollection->getSequence()); } } } @@ -444,6 +448,7 @@ class Databases extends Action } finally { $this->trigger($database, $collection, $project, $event, $queueForRealtime, null, $index); $dbForProject->purgeCachedDocument('database_' . $database->getSequence(), $collectionId); + $dbForProject->purgeCachedCollection('database_' . $database->getSequence() . '_collection_' . $collection->getSequence()); } } @@ -500,6 +505,7 @@ class Databases extends Action } finally { $this->trigger($database, $collection, $project, $event, $queueForRealtime, null, $index); $dbForProject->purgeCachedDocument('database_' . $database->getSequence(), $collection->getId()); + $dbForProject->purgeCachedCollection('database_' . $database->getSequence() . '_collection_' . $collection->getSequence()); } } diff --git a/src/Appwrite/Platform/Workers/Certificates.php b/src/Appwrite/Platform/Workers/Certificates.php index 300383ef6d..a3fad056bf 100644 --- a/src/Appwrite/Platform/Workers/Certificates.php +++ b/src/Appwrite/Platform/Workers/Certificates.php @@ -373,6 +373,7 @@ class Certificates extends Action Console::warning('Cannot renew domain (' . $domain . ') on attempt no. ' . $attempt . ' certificate: ' . $errorMessage); $locale = new Locale(System::getEnv('_APP_LOCALE', 'en')); + $locale->setFallback(System::getEnv('_APP_LOCALE', 'en')); // Send mail to administrator mail $template = Template::fromFile(__DIR__ . '/../../../../app/config/locale/templates/email-certificate-failed.tpl'); diff --git a/src/Appwrite/Platform/Workers/Mails.php b/src/Appwrite/Platform/Workers/Mails.php index 117b689863..f07cfcf699 100644 --- a/src/Appwrite/Platform/Workers/Mails.php +++ b/src/Appwrite/Platform/Workers/Mails.php @@ -6,6 +6,7 @@ use Appwrite\Template\Template; use Exception; use PHPMailer\PHPMailer\PHPMailer; use Swoole\Runtime; +use Utopia\CLI\Console; use Utopia\Logger\Log; use Utopia\Platform\Action; use Utopia\Queue\Message; @@ -148,6 +149,17 @@ class Mails extends Action $mail->AltBody = \strip_tags($mail->AltBody); $mail->AltBody = \trim($mail->AltBody); + if (\str_contains($mail->Body, 'buttonText') || \str_contains($mail->AltBody, 'buttonText')) { + Console::warning('Email might contain placeholder. Logs relevant to verify and isolate the issue:'); + var_dump($mail->Body); + var_dump($mail->AltBody); + \var_dump($message->getPayload()); + \var_dump($message->getPid()); + \var_dump($message->getQueue()); + \var_dump($message->getTimestamp()); + Console::warning('End of placeholder detection report.'); + } + $replyTo = System::getEnv('_APP_SYSTEM_EMAIL_ADDRESS', APP_EMAIL_TEAM); $replyToName = \urldecode(System::getEnv('_APP_SYSTEM_EMAIL_NAME', APP_NAME . ' Server')); diff --git a/src/Appwrite/SDK/Method.php b/src/Appwrite/SDK/Method.php index 945c9e8fae..77e3e1f1af 100644 --- a/src/Appwrite/SDK/Method.php +++ b/src/Appwrite/SDK/Method.php @@ -18,6 +18,7 @@ class Method * @param string $namespace * @param ?string $group * @param string $name + * @param string $desc * @param string $description * @param array $auth * @param array $responses @@ -29,6 +30,7 @@ class Method * @param ContentType $requestType * @param array $parameters * @param array $additionalParameters + * @param string $desc */ public function __construct( protected string $namespace, @@ -44,7 +46,8 @@ class Method protected bool $packaging = false, protected ContentType $requestType = ContentType::JSON, protected array $parameters = [], - protected array $additionalParameters = [] + protected array $additionalParameters = [], + protected string $desc = '' ) { $this->validateMethod($name, $namespace); $this->validateAuthTypes($auth); @@ -137,6 +140,11 @@ class Method return $this->name; } + public function getDesc(): string + { + return $this->desc; + } + public function getDescription(): string { return $this->description; @@ -225,6 +233,12 @@ class Method return $this; } + public function setDesc(string $desc): self + { + $this->desc = $desc; + return $this; + } + public function setDescription(string $description): self { $this->description = $description; diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index 20d7a7e5e8..e9933f4a25 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -216,11 +216,13 @@ class OpenAPI3 extends Format $additionalMethod = [ 'name' => $methodObj->getMethodName(), 'namespace' => $methodObj->getNamespace(), + 'desc' => $method->getDesc() ?? '', 'auth' => \array_slice($methodSecurities, 0, $this->authCount), 'parameters' => [], 'required' => [], 'responses' => [], 'description' => ($desc) ? \file_get_contents($desc) : '', + 'demo' => Template::fromCamelCaseToDash($namespace) . '/' . Template::fromCamelCaseToDash($method->getMethodName()) . '.md', ]; // add deprecation only if method has it! diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 8cf5899823..1e8f9d5ee8 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -218,6 +218,10 @@ class Response extends SwooleResponse public const MODEL_COLUMN_DATETIME = 'columnDatetime'; public const MODEL_COLUMN_RELATIONSHIP = 'columnRelationship'; + // Transactions + public const MODEL_TRANSACTION = 'transaction'; + public const MODEL_TRANSACTION_LIST = 'transactionList'; + // Users public const MODEL_ACCOUNT = 'account'; public const MODEL_USER = 'user'; diff --git a/src/Appwrite/Utopia/Response/Model/Database.php b/src/Appwrite/Utopia/Response/Model/Database.php index b38f828047..44a0d52af8 100644 --- a/src/Appwrite/Utopia/Response/Model/Database.php +++ b/src/Appwrite/Utopia/Response/Model/Database.php @@ -43,8 +43,8 @@ class Database extends Model ->addRule('type', [ 'type' => self::TYPE_STRING, 'description' => 'Database type.', - 'default' => 'grids', - 'example' => 'grids', + 'default' => 'legacy', + 'example' => 'legacy', ]) ; } diff --git a/tests/e2e/Client.php b/tests/e2e/Client.php index 278d1cd0d5..e411b68454 100644 --- a/tests/e2e/Client.php +++ b/tests/e2e/Client.php @@ -216,7 +216,15 @@ class Client return $len; }); - if ($method != self::METHOD_GET) { + + if ($method === self::METHOD_HEAD) { + curl_setopt($ch, CURLOPT_NOBODY, true); // This is crucial for HEAD requests + curl_setopt($ch, CURLOPT_HEADER, false); + } else { + curl_setopt($ch, CURLOPT_NOBODY, false); + } + + if ($method != self::METHOD_GET && $method != self::METHOD_HEAD) { curl_setopt($ch, CURLOPT_POSTFIELDS, $query); } @@ -229,7 +237,7 @@ class Client $responseType = $responseHeaders['content-type'] ?? ''; $responseStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE); - if ($decode) { + if ($decode && $method !== self::METHOD_HEAD) { $strpos = strpos($responseType, ';'); $strpos = \is_bool($strpos) ? \strlen($responseType) : $strpos; switch (substr($responseType, 0, $strpos)) { @@ -255,6 +263,9 @@ class Client $json = null; break; } + } elseif ($method === self::METHOD_HEAD) { + // For HEAD requests, always set body to empty string regardless of decode flag + $responseBody = ''; } if ((curl_errno($ch)/* || 200 != $responseStatus*/)) { diff --git a/tests/e2e/Services/Databases/Grids/DatabasesBase.php b/tests/e2e/Services/Databases/Grids/DatabasesBase.php index 1ec957a50e..1e637f8d81 100644 --- a/tests/e2e/Services/Databases/Grids/DatabasesBase.php +++ b/tests/e2e/Services/Databases/Grids/DatabasesBase.php @@ -1382,8 +1382,7 @@ trait DatabasesBase 'columns' => ['actors'], ]); - // Indexes on array attributes are disabled due to MySQL bug - $this->assertEquals(400, $actorsArray['headers']['status-code']); + $this->assertEquals(202, $actorsArray['headers']['status-code']); $twoLevelsArray = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $data['moviesId'] . '/indexes', array_merge([ 'content-type' => 'application/json', @@ -1396,8 +1395,7 @@ trait DatabasesBase 'orders' => ['DESC', 'DESC'], ]); - // Indexes on array attributes are disabled due to MySQL bug - $this->assertEquals(400, $twoLevelsArray['headers']['status-code']); + $this->assertEquals(202, $twoLevelsArray['headers']['status-code']); $unknown = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $data['moviesId'] . '/indexes', array_merge([ 'content-type' => 'application/json', @@ -1423,8 +1421,7 @@ trait DatabasesBase 'orders' => ['DESC'], // Check order is removed in API ]); - // Indexes on array attributes are disabled due to MySQL bug - $this->assertEquals(400, $index1['headers']['status-code']); + $this->assertEquals(202, $index1['headers']['status-code']); $index2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $data['moviesId'] . '/indexes', array_merge([ 'content-type' => 'application/json', @@ -1436,8 +1433,7 @@ trait DatabasesBase 'columns' => ['integers'], // array attribute ]); - // Indexes on array attributes are disabled due to MySQL bug - $this->assertEquals(400, $index2['headers']['status-code']); + $this->assertEquals(202, $index2['headers']['status-code']); /** * Create Indexes by worker @@ -1451,7 +1447,7 @@ trait DatabasesBase ]), []); $this->assertIsArray($movies['body']['indexes']); - $this->assertCount(4, $movies['body']['indexes']); + $this->assertCount(8, $movies['body']['indexes']); $this->assertEquals($titleIndex['body']['key'], $movies['body']['indexes'][0]['key']); $this->assertEquals($releaseYearIndex['body']['key'], $movies['body']['indexes'][1]['key']); $this->assertEquals($releaseWithDate1['body']['key'], $movies['body']['indexes'][2]['key']); @@ -5373,6 +5369,1310 @@ trait DatabasesBase $this->assertCount(2, $rows['body']['rows']); } + /** + * @throws \Utopia\Database\Exception + * @throws \Utopia\Database\Exception\Query + */ + public function testNotContains(): void + { + // Create database + $database = $this->client->call(Client::METHOD_POST, '/databases', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ], [ + 'databaseId' => ID::unique(), + 'name' => 'NotContains test' + ]); + + $this->assertNotEmpty($database['body']['$id']); + $this->assertEquals(201, $database['headers']['status-code']); + $this->assertEquals('NotContains test', $database['body']['name']); + + $databaseId = $database['body']['$id']; + + // Create Collection + $movies = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'tableId' => ID::unique(), + 'name' => 'Movies', + 'rowSecurity' => true, + 'permissions' => [ + Permission::create(Role::user($this->getUser()['$id'])), + ], + ]); + + $this->assertEquals(201, $movies['headers']['status-code']); + $this->assertEquals($movies['body']['name'], 'Movies'); + + // Create Attributes + $title = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $movies['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'title', + 'size' => 256, + 'required' => true, + ]); + $this->assertEquals(202, $title['headers']['status-code']); + + $genre = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $movies['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'genre', + 'size' => 256, + 'required' => true, + ]); + + $this->assertEquals(202, $genre['headers']['status-code']); + + // Wait for worker + sleep(2); + + $row1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $movies['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'title' => 'Spider-Man: Homecoming', + 'genre' => 'Action', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row1['headers']['status-code']); + + $row2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $movies['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'title' => 'The Avengers', + 'genre' => 'Action', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row2['headers']['status-code']); + + $row3 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $movies['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'title' => 'Romantic Comedy', + 'genre' => 'Romance', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + + $this->assertEquals(201, $row3['headers']['status-code']); + + // Test notContains query - should return movies that don't contain "Spider" in title + $rows = $this->client->call( + Client::METHOD_GET, + '/databases/' . $databaseId . '/grids/tables/' . $movies['body']['$id'] . '/rows', + array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), + [ + 'queries' => [ + Query::select(['title', 'genre'])->toString(), + Query::notContains('title', ['Spider'])->toString(), + Query::limit(999)->toString(), + Query::offset(0)->toString() + ], + ] + ); + + $this->assertEquals(200, $rows['headers']['status-code']); + $this->assertCount(2, $rows['body']['rows']); + $this->assertEquals('The Avengers', $rows['body']['rows'][0]['title']); + $this->assertEquals('Romantic Comedy', $rows['body']['rows'][1]['title']); + } + + /** + * @throws \Utopia\Database\Exception + * @throws \Utopia\Database\Exception\Query + */ + public function testNotSearch(): void + { + // Create database + $database = $this->client->call(Client::METHOD_POST, '/databases', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ], [ + 'databaseId' => ID::unique(), + 'name' => 'NotSearch test' + ]); + + $this->assertNotEmpty($database['body']['$id']); + $this->assertEquals(201, $database['headers']['status-code']); + $this->assertEquals('NotSearch test', $database['body']['name']); + + $databaseId = $database['body']['$id']; + + // Create Collection + $books = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'tableId' => ID::unique(), + 'name' => 'Books', + 'rowSecurity' => true, + 'permissions' => [ + Permission::create(Role::user($this->getUser()['$id'])), + ], + ]); + + $this->assertEquals(201, $books['headers']['status-code']); + $this->assertEquals($books['body']['name'], 'Books'); + + // Create Attributes + $title = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $books['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'title', + 'size' => 256, + 'required' => true, + ]); + $this->assertEquals(202, $title['headers']['status-code']); + + $description = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $books['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'description', + 'size' => 2048, + 'required' => true, + ]); + + $this->assertEquals(202, $description['headers']['status-code']); + + \sleep(2); + + $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $books['body']['$id'] . '/indexes', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'fts_description', + 'type' => Database::INDEX_FULLTEXT, + 'columns' => ['description'], + ]); + + $row1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $books['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'title' => 'Science Fiction Adventures', + 'description' => 'A thrilling journey through space and time', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row1['headers']['status-code']); + + $row2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $books['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'title' => 'Romance Novel', + 'description' => 'A love story set in modern times', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row2['headers']['status-code']); + + $row3 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $books['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'title' => 'Mystery Thriller', + 'description' => 'A detective solves complex crimes', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + + $this->assertEquals(201, $row3['headers']['status-code']); + + // Test notSearch query - should return books that don't have "space" in the description + $rows = $this->client->call( + Client::METHOD_GET, + '/databases/' . $databaseId . '/grids/tables/' . $books['body']['$id'] . '/rows', + array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), + [ + 'queries' => [ + Query::notSearch('description', 'space')->toString(), + ], + ] + ); + + $this->assertEquals(200, $rows['headers']['status-code']); + $this->assertCount(2, $rows['body']['rows']); + $this->assertEquals('Romance Novel', $rows['body']['rows'][0]['title']); + $this->assertEquals('Mystery Thriller', $rows['body']['rows'][1]['title']); + } + + /** + * @throws \Utopia\Database\Exception + * @throws \Utopia\Database\Exception\Query + */ + public function testNotBetween(): void + { + // Create database + $database = $this->client->call(Client::METHOD_POST, '/databases', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ], [ + 'databaseId' => ID::unique(), + 'name' => 'NotBetween test' + ]); + + $this->assertNotEmpty($database['body']['$id']); + $this->assertEquals(201, $database['headers']['status-code']); + $this->assertEquals('NotBetween test', $database['body']['name']); + + $databaseId = $database['body']['$id']; + + // Create Collection + $products = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'tableId' => ID::unique(), + 'name' => 'Products', + 'rowSecurity' => true, + 'permissions' => [ + Permission::create(Role::user($this->getUser()['$id'])), + ], + ]); + + $this->assertEquals(201, $products['headers']['status-code']); + $this->assertEquals($products['body']['name'], 'Products'); + + // Create Attributes + $name = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $products['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'name', + 'size' => 256, + 'required' => true, + ]); + $this->assertEquals(202, $name['headers']['status-code']); + + $price = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $products['body']['$id'] . '/columns/float', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'price', + 'required' => true, + ]); + + $this->assertEquals(202, $price['headers']['status-code']); + + // Wait for worker + sleep(2); + + $row1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $products['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'name' => 'Cheap Product', + 'price' => 5.99, + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row1['headers']['status-code']); + + $row2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $products['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'name' => 'Mid Product', + 'price' => 25.00, + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row2['headers']['status-code']); + + $row3 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $products['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'name' => 'Expensive Product', + 'price' => 150.00, + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + + $this->assertEquals(201, $row3['headers']['status-code']); + + // Test notBetween query - should return products NOT priced between 10 and 50 + $rows = $this->client->call( + Client::METHOD_GET, + '/databases/' . $databaseId . '/grids/tables/' . $products['body']['$id'] . '/rows', + array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), + [ + 'queries' => [ + Query::notBetween('price', 10, 50)->toString(), + ], + ] + ); + + $this->assertEquals(200, $rows['headers']['status-code']); + $this->assertCount(2, $rows['body']['rows']); + $this->assertEquals('Cheap Product', $rows['body']['rows'][0]['name']); + $this->assertEquals('Expensive Product', $rows['body']['rows'][1]['name']); + } + + /** + * @throws \Utopia\Database\Exception + * @throws \Utopia\Database\Exception\Query + */ + public function testNotStartsWith(): void + { + // Create database + $database = $this->client->call(Client::METHOD_POST, '/databases', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ], [ + 'databaseId' => ID::unique(), + 'name' => 'NotStartsWith test' + ]); + + $this->assertNotEmpty($database['body']['$id']); + $this->assertEquals(201, $database['headers']['status-code']); + $this->assertEquals('NotStartsWith test', $database['body']['name']); + + $databaseId = $database['body']['$id']; + + // Create Collection + $employees = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'tableId' => ID::unique(), + 'name' => 'Employees', + 'rowSecurity' => true, + 'permissions' => [ + Permission::create(Role::user($this->getUser()['$id'])), + ], + ]); + + $this->assertEquals(201, $employees['headers']['status-code']); + $this->assertEquals($employees['body']['name'], 'Employees'); + + // Create Attributes + $name = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $employees['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'name', + 'size' => 256, + 'required' => true, + ]); + $this->assertEquals(202, $name['headers']['status-code']); + + $department = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $employees['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'department', + 'size' => 256, + 'required' => true, + ]); + + $this->assertEquals(202, $department['headers']['status-code']); + + // Wait for worker + sleep(2); + + $row1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $employees['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'name' => 'John Smith', + 'department' => 'Engineering', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row1['headers']['status-code']); + + $row2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $employees['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'name' => 'Jane Doe', + 'department' => 'Marketing', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row2['headers']['status-code']); + + $row3 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $employees['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'name' => 'Bob Johnson', + 'department' => 'Sales', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + + $this->assertEquals(201, $row3['headers']['status-code']); + + // Test notStartsWith query - should return employees whose names don't start with "John" + $rows = $this->client->call( + Client::METHOD_GET, + '/databases/' . $databaseId . '/grids/tables/' . $employees['body']['$id'] . '/rows', + array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), + [ + 'queries' => [ + Query::notStartsWith('name', 'John')->toString(), + ], + ] + ); + + $this->assertEquals(200, $rows['headers']['status-code']); + $this->assertCount(2, $rows['body']['rows']); + $this->assertEquals('Jane Doe', $rows['body']['rows'][0]['name']); + $this->assertEquals('Bob Johnson', $rows['body']['rows'][1]['name']); + } + + /** + * @throws \Utopia\Database\Exception + * @throws \Utopia\Database\Exception\Query + */ + public function testNotEndsWith(): void + { + // Create database + $database = $this->client->call(Client::METHOD_POST, '/databases', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ], [ + 'databaseId' => ID::unique(), + 'name' => 'NotEndsWith test' + ]); + + $this->assertNotEmpty($database['body']['$id']); + $this->assertEquals(201, $database['headers']['status-code']); + $this->assertEquals('NotEndsWith test', $database['body']['name']); + + $databaseId = $database['body']['$id']; + + // Create Collection + $files = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'tableId' => ID::unique(), + 'name' => 'Files', + 'rowSecurity' => true, + 'permissions' => [ + Permission::create(Role::user($this->getUser()['$id'])), + ], + ]); + + $this->assertEquals(201, $files['headers']['status-code']); + $this->assertEquals($files['body']['name'], 'Files'); + + // Create Attributes + $filename = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $files['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'filename', + 'size' => 256, + 'required' => true, + ]); + $this->assertEquals(202, $filename['headers']['status-code']); + + $type = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $files['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'type', + 'size' => 256, + 'required' => true, + ]); + + $this->assertEquals(202, $type['headers']['status-code']); + + // Wait for worker + sleep(2); + + $row1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $files['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'filename' => 'document.pdf', + 'type' => 'PDF', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row1['headers']['status-code']); + + $row2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $files['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'filename' => 'image.jpg', + 'type' => 'Image', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row2['headers']['status-code']); + + $row3 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $files['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'filename' => 'presentation.pptx', + 'type' => 'Presentation', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + + $this->assertEquals(201, $row3['headers']['status-code']); + + // Test notEndsWith query - should return files that don't end with ".pdf" + $rows = $this->client->call( + Client::METHOD_GET, + '/databases/' . $databaseId . '/grids/tables/' . $files['body']['$id'] . '/rows', + array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), + [ + 'queries' => [ + Query::notEndsWith('filename', '.pdf')->toString(), + ], + ] + ); + + $this->assertEquals(200, $rows['headers']['status-code']); + $this->assertCount(2, $rows['body']['rows']); + $this->assertEquals('image.jpg', $rows['body']['rows'][0]['filename']); + $this->assertEquals('presentation.pptx', $rows['body']['rows'][1]['filename']); + } + + /** + * @throws \Utopia\Database\Exception + * @throws \Utopia\Database\Exception\Query + */ + public function testCreatedBefore(): void + { + // Create database + $database = $this->client->call(Client::METHOD_POST, '/databases', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ], [ + 'databaseId' => ID::unique(), + 'name' => 'CreatedBefore test' + ]); + + $this->assertNotEmpty($database['body']['$id']); + $this->assertEquals(201, $database['headers']['status-code']); + $this->assertEquals('CreatedBefore test', $database['body']['name']); + + $databaseId = $database['body']['$id']; + + // Create Collection + $posts = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'tableId' => ID::unique(), + 'name' => 'Posts', + 'rowSecurity' => true, + 'permissions' => [ + Permission::create(Role::user($this->getUser()['$id'])), + ], + ]); + + $this->assertEquals(201, $posts['headers']['status-code']); + $this->assertEquals($posts['body']['name'], 'Posts'); + + // Create Attributes + $title = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $posts['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'title', + 'size' => 256, + 'required' => true, + ]); + $this->assertEquals(202, $title['headers']['status-code']); + + $content = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $posts['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'content', + 'size' => 512, + 'required' => true, + ]); + + $this->assertEquals(202, $content['headers']['status-code']); + + // Wait for worker + sleep(2); + + $row1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $posts['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'title' => 'Old Post', + 'content' => 'This is an old post content', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row1['headers']['status-code']); + + // Sleep to ensure different creation times + sleep(1); + + $row2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $posts['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'title' => 'Recent Post', + 'content' => 'This is a recent post content', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row2['headers']['status-code']); + + // Get the creation time of the second post to use as boundary + $secondPostCreatedAt = $row2['body']['$createdAt']; + + // Sleep again + sleep(1); + + $row3 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $posts['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'title' => 'Newest Post', + 'content' => 'This is the newest post content', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + + $this->assertEquals(201, $row3['headers']['status-code']); + + // Test createdBefore query - should return posts created before the second post + $rows = $this->client->call( + Client::METHOD_GET, + '/databases/' . $databaseId . '/grids/tables/' . $posts['body']['$id'] . '/rows', + array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), + [ + 'queries' => [ + Query::createdBefore($secondPostCreatedAt)->toString(), + ], + ] + ); + + $this->assertEquals(200, $rows['headers']['status-code']); + $this->assertCount(1, $rows['body']['rows']); + $this->assertEquals('Old Post', $rows['body']['rows'][0]['title']); + } + + /** + * @throws \Utopia\Database\Exception + * @throws \Utopia\Database\Exception\Query + */ + public function testCreatedAfter(): void + { + // Create database + $database = $this->client->call(Client::METHOD_POST, '/databases', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ], [ + 'databaseId' => ID::unique(), + 'name' => 'CreatedAfter test' + ]); + + $this->assertNotEmpty($database['body']['$id']); + $this->assertEquals(201, $database['headers']['status-code']); + $this->assertEquals('CreatedAfter test', $database['body']['name']); + + $databaseId = $database['body']['$id']; + + // Create Collection + $events = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'tableId' => ID::unique(), + 'name' => 'Events', + 'rowSecurity' => true, + 'permissions' => [ + Permission::create(Role::user($this->getUser()['$id'])), + ], + ]); + + $this->assertEquals(201, $events['headers']['status-code']); + $this->assertEquals($events['body']['name'], 'Events'); + + // Create Attributes + $name = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $events['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'name', + 'size' => 256, + 'required' => true, + ]); + $this->assertEquals(202, $name['headers']['status-code']); + + $description = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $events['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'description', + 'size' => 512, + 'required' => true, + ]); + + $this->assertEquals(202, $description['headers']['status-code']); + + // Wait for worker + sleep(2); + + $row1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $events['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'name' => 'Early Event', + 'description' => 'This is an early event', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row1['headers']['status-code']); + + // Sleep to ensure different creation times + sleep(1); + + $row2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $events['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'name' => 'Middle Event', + 'description' => 'This is a middle event', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row2['headers']['status-code']); + + // Get the creation time of the second event to use as boundary + $secondEventCreatedAt = $row2['body']['$createdAt']; + + // Sleep again + sleep(1); + + $row3 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $events['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'name' => 'Latest Event', + 'description' => 'This is the latest event', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + ] + ]); + + $this->assertEquals(201, $row3['headers']['status-code']); + + // Test createdAfter query - should return events created after the second event + $rows = $this->client->call( + Client::METHOD_GET, + '/databases/' . $databaseId . '/grids/tables/' . $events['body']['$id'] . '/rows', + array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), + [ + 'queries' => [ + Query::createdAfter($secondEventCreatedAt)->toString(), + ], + ] + ); + + $this->assertEquals(200, $rows['headers']['status-code']); + $this->assertCount(1, $rows['body']['rows']); + $this->assertEquals('Latest Event', $rows['body']['rows'][0]['name']); + } + + /** + * @throws \Utopia\Database\Exception + * @throws \Utopia\Database\Exception\Query + */ + public function testUpdatedBefore(): void + { + // Create database + $database = $this->client->call(Client::METHOD_POST, '/databases', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ], [ + 'databaseId' => ID::unique(), + 'name' => 'UpdatedBefore test' + ]); + + $this->assertNotEmpty($database['body']['$id']); + $this->assertEquals(201, $database['headers']['status-code']); + $this->assertEquals('UpdatedBefore test', $database['body']['name']); + + $databaseId = $database['body']['$id']; + + // Create Collection + $tasks = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'tableId' => ID::unique(), + 'name' => 'Tasks', + 'rowSecurity' => true, + 'permissions' => [ + Permission::create(Role::user($this->getUser()['$id'])), + Permission::update(Role::user($this->getUser()['$id'])), + ], + ]); + + $this->assertEquals(201, $tasks['headers']['status-code']); + $this->assertEquals($tasks['body']['name'], 'Tasks'); + + // Create Attributes + $title = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $tasks['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'title', + 'size' => 256, + 'required' => true, + ]); + $this->assertEquals(202, $title['headers']['status-code']); + + $status = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $tasks['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'status', + 'size' => 256, + 'required' => true, + ]); + + $this->assertEquals(202, $status['headers']['status-code']); + + // Wait for worker + sleep(2); + + $row1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $tasks['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'title' => 'Task One', + 'status' => 'pending', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + Permission::update(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row1['headers']['status-code']); + $taskOneId = $row1['body']['$id']; + + $row2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $tasks['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'title' => 'Task Two', + 'status' => 'pending', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + Permission::update(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row2['headers']['status-code']); + $taskTwoId = $row2['body']['$id']; + + $row3 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $tasks['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'title' => 'Task Three', + 'status' => 'pending', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + Permission::update(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row3['headers']['status-code']); + $taskThreeId = $row3['body']['$id']; + + // Update first task + sleep(1); + $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/grids/tables/' . $tasks['body']['$id'] . '/rows/' . $taskOneId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'data' => [ + 'status' => 'completed', + ] + ]); + + // Update second task and get its updated time + sleep(1); + $updatedTaskTwo = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/grids/tables/' . $tasks['body']['$id'] . '/rows/' . $taskTwoId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'data' => [ + 'status' => 'in_progress', + ] + ]); + $secondTaskUpdatedAt = $updatedTaskTwo['body']['$updatedAt']; + + // Update third task + sleep(1); + $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/grids/tables/' . $tasks['body']['$id'] . '/rows/' . $taskThreeId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'data' => [ + 'status' => 'review', + ] + ]); + + // Test updatedBefore query - should return tasks updated before the second task's update time + $rows = $this->client->call( + Client::METHOD_GET, + '/databases/' . $databaseId . '/grids/tables/' . $tasks['body']['$id'] . '/rows', + array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), + [ + 'queries' => [ + Query::updatedBefore($secondTaskUpdatedAt)->toString(), + ], + ] + ); + + $this->assertEquals(200, $rows['headers']['status-code']); + $this->assertCount(1, $rows['body']['rows']); + $this->assertEquals('Task One', $rows['body']['rows'][0]['title']); + $this->assertEquals('completed', $rows['body']['rows'][0]['status']); + } + + /** + * @throws \Utopia\Database\Exception + * @throws \Utopia\Database\Exception\Query + */ + public function testUpdatedAfter(): void + { + // Create database + $database = $this->client->call(Client::METHOD_POST, '/databases', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ], [ + 'databaseId' => ID::unique(), + 'name' => 'UpdatedAfter test' + ]); + + $this->assertNotEmpty($database['body']['$id']); + $this->assertEquals(201, $database['headers']['status-code']); + $this->assertEquals('UpdatedAfter test', $database['body']['name']); + + $databaseId = $database['body']['$id']; + + // Create Collection + $orders = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'tableId' => ID::unique(), + 'name' => 'Orders', + 'rowSecurity' => true, + 'permissions' => [ + Permission::create(Role::user($this->getUser()['$id'])), + Permission::update(Role::user($this->getUser()['$id'])), + ], + ]); + + $this->assertEquals(201, $orders['headers']['status-code']); + $this->assertEquals($orders['body']['name'], 'Orders'); + + // Create Attributes + $orderNumber = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $orders['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'orderNumber', + 'size' => 256, + 'required' => true, + ]); + $this->assertEquals(202, $orderNumber['headers']['status-code']); + + $status = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $orders['body']['$id'] . '/columns/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'status', + 'size' => 256, + 'required' => true, + ]); + + $this->assertEquals(202, $status['headers']['status-code']); + + // Wait for worker + sleep(2); + + $row1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $orders['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'orderNumber' => 'ORD-001', + 'status' => 'pending', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + Permission::update(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row1['headers']['status-code']); + $orderOneId = $row1['body']['$id']; + + $row2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $orders['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'orderNumber' => 'ORD-002', + 'status' => 'pending', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + Permission::update(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row2['headers']['status-code']); + $orderTwoId = $row2['body']['$id']; + + $row3 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/grids/tables/' . $orders['body']['$id'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'rowId' => ID::unique(), + 'data' => [ + 'orderNumber' => 'ORD-003', + 'status' => 'pending', + ], + 'permissions' => [ + Permission::read(Role::user($this->getUser()['$id'])), + Permission::update(Role::user($this->getUser()['$id'])), + ] + ]); + $this->assertEquals(201, $row3['headers']['status-code']); + $orderThreeId = $row3['body']['$id']; + + // Update first order + sleep(1); + $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/grids/tables/' . $orders['body']['$id'] . '/rows/' . $orderOneId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'data' => [ + 'status' => 'processing', + ] + ]); + + // Update second order and get its updated time + sleep(1); + $updatedOrderTwo = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/grids/tables/' . $orders['body']['$id'] . '/rows/' . $orderTwoId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'data' => [ + 'status' => 'shipped', + ] + ]); + $secondOrderUpdatedAt = $updatedOrderTwo['body']['$updatedAt']; + + // Update third order + sleep(1); + $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/grids/tables/' . $orders['body']['$id'] . '/rows/' . $orderThreeId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'data' => [ + 'status' => 'delivered', + ] + ]); + + // Test updatedAfter query - should return orders updated after the second order's update time + $rows = $this->client->call( + Client::METHOD_GET, + '/databases/' . $databaseId . '/grids/tables/' . $orders['body']['$id'] . '/rows', + array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), + [ + 'queries' => [ + Query::updatedAfter($secondOrderUpdatedAt)->toString(), + ], + ] + ); + + $this->assertEquals(200, $rows['headers']['status-code']); + $this->assertCount(1, $rows['body']['rows']); + $this->assertEquals('ORD-003', $rows['body']['rows'][0]['orderNumber']); + $this->assertEquals('delivered', $rows['body']['rows'][0]['status']); + } + /** * @depends testCreateDatabase * @param array $data diff --git a/tests/e2e/Services/Databases/Legacy/DatabasesBase.php b/tests/e2e/Services/Databases/Legacy/DatabasesBase.php index 61ee1f239b..11d64077d9 100644 --- a/tests/e2e/Services/Databases/Legacy/DatabasesBase.php +++ b/tests/e2e/Services/Databases/Legacy/DatabasesBase.php @@ -1382,8 +1382,7 @@ trait DatabasesBase 'attributes' => ['actors'], ]); - // Indexes on array attributes are disabled due to MySQL bug - $this->assertEquals(400, $actorsArray['headers']['status-code']); + $this->assertEquals(202, $actorsArray['headers']['status-code']); $twoLevelsArray = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $data['moviesId'] . '/indexes', array_merge([ 'content-type' => 'application/json', @@ -1396,8 +1395,7 @@ trait DatabasesBase 'orders' => ['DESC', 'DESC'], ]); - // Indexes on array attributes are disabled due to MySQL bug - $this->assertEquals(400, $twoLevelsArray['headers']['status-code']); + $this->assertEquals(202, $twoLevelsArray['headers']['status-code']); $unknown = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $data['moviesId'] . '/indexes', array_merge([ 'content-type' => 'application/json', @@ -1423,8 +1421,7 @@ trait DatabasesBase 'orders' => ['DESC'], // Check order is removed in API ]); - // Indexes on array attributes are disabled due to MySQL bug - $this->assertEquals(400, $index1['headers']['status-code']); + $this->assertEquals(202, $index1['headers']['status-code']); $index2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $data['moviesId'] . '/indexes', array_merge([ 'content-type' => 'application/json', @@ -1436,8 +1433,7 @@ trait DatabasesBase 'attributes' => ['integers'], // array attribute ]); - // Indexes on array attributes are disabled due to MySQL bug - $this->assertEquals(400, $index2['headers']['status-code']); + $this->assertEquals(202, $index2['headers']['status-code']); /** * Create Indexes by worker @@ -1451,7 +1447,7 @@ trait DatabasesBase ]), []); $this->assertIsArray($movies['body']['indexes']); - $this->assertCount(4, $movies['body']['indexes']); + $this->assertCount(8, $movies['body']['indexes']); $this->assertEquals($titleIndex['body']['key'], $movies['body']['indexes'][0]['key']); $this->assertEquals($releaseYearIndex['body']['key'], $movies['body']['indexes'][1]['key']); $this->assertEquals($releaseWithDate1['body']['key'], $movies['body']['indexes'][2]['key']); diff --git a/tests/e2e/Services/Functions/FunctionsCustomClientTest.php b/tests/e2e/Services/Functions/FunctionsCustomClientTest.php index ccabc2a79e..a60c9e59cf 100644 --- a/tests/e2e/Services/Functions/FunctionsCustomClientTest.php +++ b/tests/e2e/Services/Functions/FunctionsCustomClientTest.php @@ -74,6 +74,50 @@ class FunctionsCustomClientTest extends Scope $this->cleanupFunction($functionId); } + public function testCreateHeadExecution() + { + /** + * Test for SUCCESS + */ + $functionId = $this->setupFunction([ + 'functionId' => ID::unique(), + 'name' => 'Test', + 'execute' => [Role::user($this->getUser()['$id'])->toString()], + 'runtime' => 'node-22', + 'entrypoint' => 'index.js', + 'events' => [ + 'users.*.create', + 'users.*.delete', + ], + 'timeout' => 10, + ]); + $this->setupDeployment($functionId, [ + 'code' => $this->packageFunction('basic'), + 'activate' => true + ]); + + // Deny create async execution as guest + $execution = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/executions', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], [ + 'async' => true, + ]); + $this->assertEquals(401, $execution['headers']['status-code']); + + // Allow create async execution as user + $execution = $this->client->call(Client::METHOD_HEAD, '/functions/' . $functionId . '/executions', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'async' => true, + ]); + $this->assertEquals(200, $execution['headers']['status-code']); + $this->assertEmpty($execution['body']); + + $this->cleanupFunction($functionId); + } + public function testCreateCustomExecution(): array { /** diff --git a/tests/e2e/Services/Locale/LocaleBase.php b/tests/e2e/Services/Locale/LocaleBase.php index ee731a99e5..431a2a4409 100644 --- a/tests/e2e/Services/Locale/LocaleBase.php +++ b/tests/e2e/Services/Locale/LocaleBase.php @@ -269,4 +269,57 @@ trait LocaleBase return []; } + + public function testFallbackLocale() + { + $en = 'A mock translation for testing purposes.'; + $de = 'Eine Beispielübersetzung für Testzwecke.'; + + $response = $this->client->call(Client::METHOD_GET, '/mock/tests/locale', [ + 'x-appwrite-project' => $this->getProject()['$id'], + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertEquals($en, $response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/mock/tests/locale', [ + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-locale' => 'en' + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertEquals($en, $response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/mock/tests/locale', [ + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-locale' => 'de' + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertEquals($de, $response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/mock/tests/locale', [ + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-locale' => 'cs' + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertEquals($en, $response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/mock/tests/locale', [ + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-locale' => 'non-existing' + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertEquals($en, $response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/mock/tests/locale', [ + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-locale' => '' + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertEquals($en, $response['body']); + } } diff --git a/tests/e2e/Services/Migrations/MigrationsBase.php b/tests/e2e/Services/Migrations/MigrationsBase.php index 1fa17ffa95..3166688db1 100644 --- a/tests/e2e/Services/Migrations/MigrationsBase.php +++ b/tests/e2e/Services/Migrations/MigrationsBase.php @@ -1049,7 +1049,6 @@ trait MigrationsBase $this->assertEquals('Appwrite', $migration['body']['destination']); $this->assertContains(Resource::TYPE_ROW, $migration['body']['resources']); $this->assertEmpty($migration['body']['statusCounters']); - $errorJson = $migration['body']['errors'][0]; $errorData = json_decode($errorJson, true); @@ -1082,7 +1081,6 @@ trait MigrationsBase $this->assertEquals('Appwrite', $migration['body']['destination']); $this->assertContains(Resource::TYPE_ROW, $migration['body']['resources']); $this->assertEmpty($migration['body']['statusCounters']); - $errorJson = $migration['body']['errors'][0]; $errorData = json_decode($errorJson, true);