From d19a1dd13a6ac685657ff27abe8b1afc71e22566 Mon Sep 17 00:00:00 2001 From: cho0o0 Date: Sat, 28 Sep 2019 14:55:57 +0900 Subject: [PATCH 001/135] add ZH locale --- .../templates/zh.email.auth.confirm.tpl | 24 +++ .../templates/zh.email.auth.invitation.tpl | 27 +++ .../templates/zh.email.auth.recovery.tpl | 25 +++ app/config/locale/zh.continents.php | 11 + app/config/locale/zh.countries.php | 198 ++++++++++++++++++ app/config/locale/zh.php | 21 ++ app/init.php | 3 +- 7 files changed, 308 insertions(+), 1 deletion(-) create mode 100644 app/config/locale/templates/zh.email.auth.confirm.tpl create mode 100644 app/config/locale/templates/zh.email.auth.invitation.tpl create mode 100644 app/config/locale/templates/zh.email.auth.recovery.tpl create mode 100644 app/config/locale/zh.continents.php create mode 100644 app/config/locale/zh.countries.php create mode 100644 app/config/locale/zh.php diff --git a/app/config/locale/templates/zh.email.auth.confirm.tpl b/app/config/locale/templates/zh.email.auth.confirm.tpl new file mode 100644 index 0000000000..a557d451c7 --- /dev/null +++ b/app/config/locale/templates/zh.email.auth.confirm.tpl @@ -0,0 +1,24 @@ + + +
+ {{name}} 你好, +
+
+ 请点击下方的链接验证你的电子邮箱地址。 +
+ {{redirect}} +
+
+ 如果你没有请求验证本邮箱,请忽略这份邮件。 +
+
+ 谢谢。 +
+ 来自 {{project}} +
\ No newline at end of file diff --git a/app/config/locale/templates/zh.email.auth.invitation.tpl b/app/config/locale/templates/zh.email.auth.invitation.tpl new file mode 100644 index 0000000000..7ee56a401a --- /dev/null +++ b/app/config/locale/templates/zh.email.auth.invitation.tpl @@ -0,0 +1,27 @@ + + +
+ 你好, +
+
+ {{owner}}邀请您加入{{project}}项目的{{team}}小组。 +
+
+ 请点击下方的链接加入{{team}}小组: +
+ {{redirect}} +
+
+ 如果您没有加入该小组的计划,请忽略本邮件。 +
+
+ 谢谢。 +
+ 来自 {{project}} +
diff --git a/app/config/locale/templates/zh.email.auth.recovery.tpl b/app/config/locale/templates/zh.email.auth.recovery.tpl new file mode 100644 index 0000000000..8a473b5537 --- /dev/null +++ b/app/config/locale/templates/zh.email.auth.recovery.tpl @@ -0,0 +1,25 @@ + + +
+ {{name}} 你好, +
+
+ 请点击下方的链接重新设置{{project}}的密码。 + Follow this link to reset your {{project}} password. +
+ {{redirect}} +
+
+ 如果您未曾申请重设密码,请忽略本邮件。 +
+
+ 谢谢。 +
+ 来自 {{project}} +
diff --git a/app/config/locale/zh.continents.php b/app/config/locale/zh.continents.php new file mode 100644 index 0000000000..625302189e --- /dev/null +++ b/app/config/locale/zh.continents.php @@ -0,0 +1,11 @@ + '非洲', + 'AN' => '南极洲', + 'AS' => '亚洲', + 'EU' => '欧洲', + 'NA' => '北美洲', + 'OC' => '大洋洲', + 'SA' => '南美洲', +]; diff --git a/app/config/locale/zh.countries.php b/app/config/locale/zh.countries.php new file mode 100644 index 0000000000..c5c7224584 --- /dev/null +++ b/app/config/locale/zh.countries.php @@ -0,0 +1,198 @@ + '阿富汗', + 'AO' => '安哥拉', + 'AL' => '阿尔巴尼亚', + 'AD' => '安道尔', + 'AE' => '阿拉伯联合酋长国', + 'AR' => '阿根廷', + 'AM' => '亚美尼亚', + 'AG' => '安提瓜和巴布达', + 'AU' => '澳大利亚', + 'AT' => '奥地利', + 'AZ' => '阿塞拜疆', + 'BI' => '布隆迪', + 'BE' => '比利时', + 'BJ' => '贝宁', + 'BF' => '布基纳法索', + 'BD' => '孟加拉国', + 'BG' => '保加利亚', + 'BH' => '巴林', + 'BS' => '巴哈马', + 'BA' => '波黑', + 'BY' => '白罗斯', + 'BZ' => '伯利兹', + 'BO' => '玻利维亚', + 'BR' => '巴西', + 'BB' => '巴巴多斯', + 'BN' => '文莱', + 'BT' => '不丹', + 'BW' => '博茨瓦纳', + 'CF' => '中非共和国', + 'CA' => '加拿大', + 'CH' => '瑞士', + 'CL' => '智利', + 'CN' => '中国', + 'CI' => '象牙海岸', + 'CM' => '喀麦隆', + 'CD' => '刚果民主共和国', + 'CG' => '刚果共和国', + 'CO' => '哥伦比亚', + 'KM' => '科摩', + 'CV' => '佛得角', + 'CR' => '哥斯达黎加', + 'CU' => '古巴', + 'CY' => '塞浦路斯', + 'CZ' => '捷克', + 'DE' => '德国', + 'DJ' => '吉布提', + 'DM' => '多米尼克', + 'DK' => '丹麦', + 'DO' => '多明尼加共和国', + 'DZ' => '阿尔及利亚', + 'EC' => '厄瓜多尔', + 'EG' => '埃及', + 'ER' => '厄立特里亚', + 'ES' => '西班牙', + 'EE' => '爱沙尼亚', + 'ET' => '埃塞俄比亚', + 'FI' => '芬兰', + 'FJ' => '斐济', + 'FR' => '法国', + 'FM' => '密克罗尼西亚', + 'GA' => '加蓬', + 'GB' => '英国', + 'GE' => '格鲁吉亚', + 'GH' => '加纳', + 'GN' => '几内亚', + 'GM' => '冈比亚', + 'GW' => '几内亚比绍', + 'GQ' => '赤道几内亚', + 'GR' => '希腊', + 'GD' => '格林纳达', + 'GT' => '危地马拉', + 'GY' => '圭亚那', + 'HN' => '洪都拉斯', + 'HR' => '克罗地亚', + 'HT' => '海地', + 'HU' => '匈牙利', + 'ID' => '印度尼西亚', + 'IN' => '印度', + 'IE' => '爱尔兰', + 'IR' => '伊朗', + 'IQ' => '伊拉克', + 'IS' => '冰岛', + 'IL' => '以色列', + 'IT' => '意大利', + 'JM' => '牙买加', + 'JO' => '约旦', + 'JP' => '日本', + 'KZ' => '哈萨克斯坦', + 'KE' => '肯尼亚', + 'KG' => '吉尔吉斯斯坦', + 'KH' => '柬埔寨', + 'KI' => '基里巴斯', + 'KN' => '圣基茨和尼维斯', + 'KR' => '韩国', + 'KW' => '科威特', + 'LA' => '老挝', + 'LB' => '黎巴嫩', + 'LR' => '利比里亚', + 'LY' => '利比亚', + 'LC' => '圣卢西亚', + 'LI' => '列支敦士登', + 'LK' => '斯里兰卡', + 'LS' => '莱索托', + 'LT' => '立陶宛', + 'LU' => '卢森堡', + 'LV' => '拉脱维亚', + 'MA' => '摩洛哥', + 'MC' => '摩纳哥', + 'MD' => '摩尔多瓦', + 'MG' => '马达加斯加', + 'MV' => '马尔代夫', + 'MX' => '墨西哥', + 'MH' => '马绍尔群岛', + 'MK' => '马其顿共和国', + 'ML' => '马里', + 'MT' => '马耳他', + 'MM' => '缅甸', + 'ME' => '黑山', + 'MN' => '蒙古', + 'MZ' => '莫桑比克', + 'MR' => '毛里塔尼亚', + 'MU' => '毛里求斯', + 'MW' => '马拉维', + 'MY' => '马来西亚', + 'NA' => '纳米比亚', + 'NE' => '尼日尔', + 'NG' => '尼日利亚', + 'NI' => '尼加拉瓜', + 'NL' => '荷兰', + 'NO' => '挪威', + 'NP' => '尼泊尔', + 'NR' => '瑙鲁', + 'NZ' => '新西兰', + 'OM' => '阿曼', + 'PK' => '巴基斯坦', + 'PA' => '巴拿马', + 'PE' => '秘鲁', + 'PH' => '菲律宾', + 'PW' => '帕劳', + 'PG' => '巴布亚新几内亚', + 'PL' => '波兰', + 'KP' => '北朝鲜', + 'PT' => '葡萄牙', + 'PY' => '巴拉圭', + 'QA' => '卡塔尔', + 'RO' => '罗马尼亚', + 'RU' => '俄罗斯', + 'RW' => '卢旺达', + 'SA' => '沙特阿拉伯', + 'SD' => '苏丹', + 'SN' => '塞内加尔', + 'SG' => '新加坡', + 'SB' => '所罗门群岛', + 'SL' => '塞拉利昂', + 'SV' => '萨尔瓦多', + 'SM' => '圣马力诺', + 'SO' => '索马里', + 'RS' => '塞尔维亚', + 'SS' => '南苏丹', + 'ST' => '圣多美和普林西比', + 'SR' => '苏里南', + 'SK' => '斯洛伐克', + 'SI' => '斯洛文尼亚', + 'SE' => '瑞典', + 'SZ' => '斯威士兰', + 'SC' => '塞舌尔', + 'SY' => '叙利亚', + 'TD' => '乍得', + 'TG' => '多哥', + 'TH' => '泰国', + 'TJ' => '塔吉克斯坦', + 'TM' => '土库曼斯坦', + 'TL' => '东帝汶', + 'TO' => '汤加', + 'TT' => '特立尼达和多巴哥', + 'TN' => '突尼斯', + 'TR' => '土耳其', + 'TV' => '图瓦卢', + 'TZ' => '坦桑尼亚', + 'UG' => '乌干达', + 'UA' => '乌克兰', + 'UY' => '乌拉圭', + 'US' => '美国', + 'UZ' => '乌兹别克斯', + 'VA' => '梵蒂冈', + 'VC' => '圣文森特和格林纳丁斯', + 'VE' => '委内瑞拉', + 'VN' => '越南', + 'VU' => '瓦努阿图', + 'WS' => '萨摩亚', + 'YE' => '也门', + 'ZA' => '南非', + 'ZM' => '赞比亚', + 'ZW' => '津巴布韦', +]; diff --git a/app/config/locale/zh.php b/app/config/locale/zh.php new file mode 100644 index 0000000000..b4499416fe --- /dev/null +++ b/app/config/locale/zh.php @@ -0,0 +1,21 @@ + '"懂得取舍,方显睿智。"', // This is the line printed in the homepage and console 'view-source' + 'settings.locale' => 'zh', + 'settings.direction' => 'ltr', + + // Service - Users + 'auth.emails.team' => '%s 小组', + 'auth.emails.confirm.title' => '账户确认', + 'auth.emails.confirm.body' => 'zh.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => '重设密码', + 'auth.emails.recovery.body' => 'zh.email.auth.recovery.tpl', + 'auth.emails.invitation.title' => '邀请加入%s小组(%s)', // I used brackets to keep the order + 'auth.emails.invitation.body' => 'zh.email.auth.invitation.tpl', + + 'locale.country.unknown' => '未知', + + 'countries' => include 'zh.countries.php', + 'continents' => include 'zh.continents.php', +]; diff --git a/app/init.php b/app/init.php index fb23c9bdf1..8f55ef455e 100644 --- a/app/init.php +++ b/app/init.php @@ -24,7 +24,7 @@ const APP_EMAIL_TEAM = 'team@' . APP_DOMAIN; const APP_EMAIL_SECURITY = 'security@' . APP_DOMAIN; const APP_USERAGENT = APP_NAME . '-Server/%s Please report abuse at ' . APP_EMAIL_SECURITY; const APP_MODE_ADMIN = 'admin'; -const APP_LOCALES = ['en', 'he']; +const APP_LOCALES = ['en', 'he', 'zh']; const APP_PAGING_LIMIT = 15; $register = new Registry(); @@ -128,6 +128,7 @@ Locale::$exceptions = false; Locale::setLanguage('en', include __DIR__ . '/config/locale/en.php'); Locale::setLanguage('he', include __DIR__ . '/config/locale/he.php'); +Locale::setLanguage('zh', include __DIR__ . '/config/locale/zh.php'); if(in_array($locale, APP_LOCALES)) { Locale::setDefault($locale); From 09d47851211ef533d1d04eef80f53fe772805c99 Mon Sep 17 00:00:00 2001 From: Sandor Nagy Date: Tue, 1 Oct 2019 00:43:07 +0200 Subject: [PATCH 002/135] Added hungarian translations --- app/config/locale/hu.continents.php | 11 + app/config/locale/hu.countries.php | 198 ++++++++++++++++++ app/config/locale/hu.php | 21 ++ .../templates/hu.email.auth.confirm.tpl | 24 +++ .../templates/hu.email.auth.invitation.tpl | 27 +++ .../templates/hu.email.auth.recovery.tpl | 24 +++ docker-compose.yml | 140 ++++++------- 7 files changed, 370 insertions(+), 75 deletions(-) create mode 100644 app/config/locale/hu.continents.php create mode 100644 app/config/locale/hu.countries.php create mode 100644 app/config/locale/hu.php create mode 100644 app/config/locale/templates/hu.email.auth.confirm.tpl create mode 100644 app/config/locale/templates/hu.email.auth.invitation.tpl create mode 100644 app/config/locale/templates/hu.email.auth.recovery.tpl diff --git a/app/config/locale/hu.continents.php b/app/config/locale/hu.continents.php new file mode 100644 index 0000000000..57a88d6f7c --- /dev/null +++ b/app/config/locale/hu.continents.php @@ -0,0 +1,11 @@ + 'Afrika', + 'AN' => 'Antarktika', + 'AS' => 'Ázsia', + 'EU' => 'Európa', + 'NA' => 'Észak-Amerika', + 'OC' => 'Óceánia', + 'SA' => 'Dél-Amerika', +]; diff --git a/app/config/locale/hu.countries.php b/app/config/locale/hu.countries.php new file mode 100644 index 0000000000..949313c35a --- /dev/null +++ b/app/config/locale/hu.countries.php @@ -0,0 +1,198 @@ + 'Afganisztán', + 'AO' => 'Angola', + 'AL' => 'Albánia', + 'AD' => 'Andorra', + 'AE' => 'Egyesült Arab Emírségek', + 'AR' => 'Argentína', + 'AM' => 'Örményország', + 'AG' => 'Antigua és Barbuda', + 'AU' => 'Ausztrália', + 'AT' => 'Ausztria', + 'AZ' => 'Azerbajdzsán', + 'BI' => 'Burundi', + 'BE' => 'Belgium', + 'BJ' => 'Benin', + 'BF' => 'Burkina Faso', + 'BD' => 'Banglades', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrein', + 'BS' => 'Bahamák', + 'BA' => 'Bosznia-Hercegovina', + 'BY' => 'Fehéroroszország', + 'BZ' => 'Belize', + 'BO' => 'Bolívia', + 'BR' => 'Brazília', + 'BB' => 'Barbadosz', + 'BN' => 'Brunei', + 'BT' => 'Bhután', + 'BW' => 'Botswana', + 'CF' => 'Közép-afrikai Köztársaság', + 'CA' => 'Kanada', + 'CH' => 'Svájc', + 'CL' => 'Chile', + 'CN' => 'Kína', + 'CI' => 'Elefántcsontpart', + 'CM' => 'Kamerun', + 'CD' => 'Kongói Demokratikus Köztársaság', + 'CG' => 'Kongói Köztársaság', + 'CO' => 'Kolumbia', + 'KM' => 'Comoros', + 'CV' => 'Zöld-foki Köztársaság', + 'CR' => 'Costa Rica', + 'CU' => 'Kuba', + 'CY' => 'Ciprus', + 'CZ' => 'Csehország', + 'DE' => 'Németország', + 'DJ' => 'Djibouti', + 'DM' => 'Dominika', + 'DK' => 'Dánia', + 'DO' => 'Dominikai Köztársaság', + 'DZ' => 'Algíria', + 'EC' => 'Ecuador', + 'EG' => 'Egyiptom', + 'ER' => 'Eritrea', + 'ES' => 'Spanyolország', + 'EE' => 'Észtország', + 'ET' => 'Etiópia', + 'FI' => 'Finnország', + 'FJ' => 'Fidzsi-szigetek', + 'FR' => 'Franciaország', + 'FM' => 'Mikronéziai Szövetségi Államok', + 'GA' => 'Gabon', + 'GB' => 'Egyesült Királyság', + 'GE' => 'Grúzia', + 'GH' => 'Ghána', + 'GN' => 'Guinea', + 'GM' => 'Gambia', + 'GW' => 'Guinea-Bissau', + 'GQ' => 'Egyenlítői-Guinea', + 'GR' => 'Görögország', + 'GD' => 'Grenada', + 'GT' => 'Guatemala', + 'GY' => 'Guyana', + 'HN' => 'Honduras', + 'HR' => 'Horvátország', + 'HT' => 'Haiti', + 'HU' => 'Magyarország', + 'ID' => 'Indonézia', + 'IN' => 'India', + 'IE' => 'Írország', + 'IR' => 'Irán', + 'IQ' => 'Iraq', + 'IS' => 'Izland', + 'IL' => 'Izrael', + 'IT' => 'Olaszország', + 'JM' => 'Jamaika', + 'JO' => 'Jordánia', + 'JP' => 'Japán', + 'KZ' => 'Kazakhsztán', + 'KE' => 'Kenya', + 'KG' => 'Kirgizisztán', + 'KH' => 'Kambodzsa', + 'KI' => 'Kiribati', + 'KN' => 'Saint Kitts és Nevis', + 'KR' => 'Dél Korea', + 'KW' => 'Kuwait', + 'LA' => 'Laosz', + 'LB' => 'Libanon', + 'LR' => 'Libéria', + 'LY' => 'Líbia', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LS' => 'Lesotho', + 'LT' => 'Litvánia', + 'LU' => 'Luxembourg', + 'LV' => 'Lettország', + 'MA' => 'Marokkó', + 'MC' => 'Monaco', + 'MD' => 'Moldova', + 'MG' => 'Madagaszkár', + 'MV' => 'Maldív-szigetek', + 'MX' => 'Mexikó', + 'MH' => 'Marshall-szigetek', + 'MK' => 'Macedónia', + 'ML' => 'Mali', + 'MT' => 'Málta', + 'MM' => 'Mianmar', + 'ME' => 'Montenegró', + 'MN' => 'Mongólia', + 'MZ' => 'Mozambik', + 'MR' => 'Mauritánia', + 'MU' => 'Mauritius', + 'MW' => 'Malawi', + 'MY' => 'Malajzia', + 'NA' => 'Namíbia', + 'NE' => 'Niger', + 'NG' => 'Nigeria', + 'NI' => 'Nikaragua', + 'NL' => 'Hollandia', + 'NO' => 'Norvégia', + 'NP' => 'Nepál', + 'NR' => 'Nauru', + 'NZ' => 'Új-Zéland', + 'OM' => 'Omán', + 'PK' => 'Pakisztán', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PH' => 'Fülöp-szigetek', + 'PW' => 'Palau', + 'PG' => 'Pápua Új-Guinea', + 'PL' => 'Lengyelország', + 'KP' => 'Észak-Korea', + 'PT' => 'Portugália', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RO' => 'Románia', + 'RU' => 'Oroszország', + 'RW' => 'Rwanda', + 'SA' => 'Szaúd-Arábia', + 'SD' => 'Szudán', + 'SN' => 'Szenegál', + 'SG' => 'Szingapúr', + 'SB' => 'Salamon-szigetek', + 'SL' => 'Sierra Leone', + 'SV' => 'El Salvador', + 'SM' => 'San Marino', + 'SO' => 'Szomália', + 'RS' => 'Szerbia', + 'SS' => 'Dél-Szudán', + 'ST' => 'São Tomé és Príncipe', + 'SR' => 'Szurinám', + 'SK' => 'Szlovákia', + 'SI' => 'Szlovénia', + 'SE' => 'Svédország', + 'SZ' => 'Swaziland', + 'SC' => 'Seychelles-szigetek', + 'SY' => 'Szíria', + 'TD' => 'Csád', + 'TG' => 'Togo', + 'TH' => 'Tájföld', + 'TJ' => 'Tádzsikisztán', + 'TM' => 'Türkmenisztán', + 'TL' => 'Timor-Leste', + 'TO' => 'Tonga', + 'TT' => 'Trinidad és Tobago', + 'TN' => 'Tunézia', + 'TR' => 'Törökország', + 'TV' => 'Tuvalu', + 'TZ' => 'Tanzania', + 'UG' => 'Uganda', + 'UA' => 'Ukraina', + 'UY' => 'Uruguay', + 'US' => 'Egyesült Államok', + 'UZ' => 'Üzbegisztán', + 'VA' => 'Vatikánváros', + 'VC' => 'Saint Vincent és a Grenadine-szigetek', + 'VE' => 'Venezuela', + 'VN' => 'Vietnám', + 'VU' => 'Vanuatu', + 'WS' => 'Szamoa', + 'YE' => 'Yemen', + 'ZA' => 'Dél-Afrikai Köztársaság', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/app/config/locale/hu.php b/app/config/locale/hu.php new file mode 100644 index 0000000000..a4ca49b5c2 --- /dev/null +++ b/app/config/locale/hu.php @@ -0,0 +1,21 @@ + '"The art of being wise is the art of knowing what to overlook."', // This is the line printed in the homepage and console 'view-source' + 'settings.locale' => 'hu', + 'settings.direction' => 'ltr', + + // Service - Users + 'auth.emails.team' => '%s Csapat', + 'auth.emails.confirm.title' => 'Fiók megerősítés', + 'auth.emails.confirm.body' => 'hu.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => 'Jelszó Visszaállítás', + 'auth.emails.recovery.body' => 'hu.email.auth.recovery.tpl', + 'auth.emails.invitation.title' => 'Meghívás a %s Csapathoz %s', + 'auth.emails.invitation.body' => 'hu.email.auth.invitation.tpl', + + 'locale.country.unknown' => 'Ismeretlen', + + 'countries' => include 'hu.countries.php', + 'continents' => include 'hu.continents.php', +]; diff --git a/app/config/locale/templates/hu.email.auth.confirm.tpl b/app/config/locale/templates/hu.email.auth.confirm.tpl new file mode 100644 index 0000000000..680e0da2ec --- /dev/null +++ b/app/config/locale/templates/hu.email.auth.confirm.tpl @@ -0,0 +1,24 @@ + + +
+ Szia {{name}}, +
+
+ Kattints erre a linkre, hogy megerősítsd az e-mail címed. +
+ {{redirect}} +
+
+ Ha nem kérelmezted, hogy megerősítsük ezt a címet, ignoráld ezt a levelet. +
+
+ Köszönettel, +
+ {{project}} csapat +
diff --git a/app/config/locale/templates/hu.email.auth.invitation.tpl b/app/config/locale/templates/hu.email.auth.invitation.tpl new file mode 100644 index 0000000000..6dce55a639 --- /dev/null +++ b/app/config/locale/templates/hu.email.auth.invitation.tpl @@ -0,0 +1,27 @@ + + +
+ Szia, +
+
+ Azért küldtük ezt az e-mailt {{owner}} mert meg szeretnénk hívni a {{team}} csapatba a következő projektre {{project}}. +
+
+ Kattints erre a linkre, hogy a {{team}} csapat tagja legyél: +
+ {{redirect}} +
+
+ Ha nem vegy ebben érdekelt ignoráld ezt az üzenetet. +
+
+ Köszönettel, +
+ {{project}} csapat +
diff --git a/app/config/locale/templates/hu.email.auth.recovery.tpl b/app/config/locale/templates/hu.email.auth.recovery.tpl new file mode 100644 index 0000000000..564d55bd0b --- /dev/null +++ b/app/config/locale/templates/hu.email.auth.recovery.tpl @@ -0,0 +1,24 @@ + + +
+ Szia {{name}}, +
+
+ Kattints erre a linkre, hogy visszaállítsuk a {{project}} jelszavad. +
+ {{redirect}} +
+
+ Ha nem kérvényezted, hogy visszaállítsuk a jelszavad ignoráld ezt a levelet. +
+
+ Köszönettel, +
+ {{project}} csapat +
diff --git a/docker-compose.yml b/docker-compose.yml index c45a3294f7..9798004826 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,81 +1,71 @@ -version: '3' +version: "3" services: - appwrite: - build: . - restart: unless-stopped - volumes: - - ./app:/usr/share/nginx/html/app - - ./public:/usr/share/nginx/html/public - - ./src:/usr/share/nginx/html/src - - ./vendor:/usr/share/nginx/html/vendor - - ./docker/nginx.conf:/etc/nginx/nginx.conf:rw - - ./storage/uploads:/storage/uploads:rw - - ./storage/cache:/storage/cache:rw - ports: - - "80:80" - - "443:443" - depends_on: - - mariadb - - redis - - smtp - - clamav - - influxdb - - telegraf - environment: - - _APP_ENV=development - - _APP_OPENSSL_KEY_V1=your-secret-key - - _APP_REDIS_HOST=redis - - _APP_REDIS_PORT=6379 - - _APP_DB_HOST=mariadb - - _APP_DB_PORT=3306 - - _APP_DB_SCHEMA=appwrite - - _APP_DB_USER=user - - _APP_DB_PASS=password - - _APP_INFLUXDB_HOST=influxdb - - _APP_INFLUXDB_PORT=8086 - - _APP_STATSD_HOST=telegraf - - _APP_STATSD_PORT=8125 - - mariadb: - image: appwrite/mariadb:1.0.0 # fix issues when upgrading using: mysql_upgrade -u root -p - restart: unless-stopped - environment: - - MYSQL_ROOT_PASSWORD=rootsecretpassword - - MYSQL_DATABASE=appwrite - - MYSQL_USER=user - - MYSQL_PASSWORD=password - volumes: - - ./storage/db:/var/lib/mysql:rw - ports: - - 3306:3306/tcp + appwrite: + image: appwrite/appwrite + restart: unless-stopped + volumes: + - ./storage:/storage:rw + ports: + - "80:80" + depends_on: + - mariadb + - redis + - smtp + - clamav + - influxdb + - telegraf + environment: + - _APP_ENV=development + - _APP_OPENSSL_KEY_V1=your-secret-key + - _APP_REDIS_HOST=redis + - _APP_REDIS_PORT=6379 + - _APP_DB_HOST=mariadb + - _APP_DB_PORT=3306 + - _APP_DB_SCHEMA=appwrite + - _APP_DB_USER=root + - _APP_DB_PASS=password + - _APP_INFLUXDB_HOST=influxdb + - _APP_INFLUXDB_PORT=8086 + - _APP_STATSD_HOST=telegraf + - _APP_STATSD_PORT=8125 - smtp: - image: appwrite/smtp:1.0.0 - environment: - - MAILNAME=appwrite - - RELAY_NETWORKS=:192.168.0.0/24:10.0.0.0/16 - ports: - - "25:25" + mariadb: + image: appwrite/mariadb:1.0.0 + restart: unless-stopped + environment: + - MYSQL_ROOT_PASSWORD=password + volumes: + - ./storage/db:/var/lib/mysql:rw + ports: + - 3306:3306/tcp - clamav: - image: appwrite/clamav:1.0.4 - restart: unless-stopped - volumes: - - ./storage:/storage:rw - - redis: - image: redis:5.0 - restart: unless-stopped + smtp: + image: appwrite/smtp:1.0.0 + environment: + - MAILNAME=appwrite + - RELAY_NETWORKS=:192.168.0.0/24:10.0.0.0/16 + ports: + - "25:25" - influxdb: - image: influxdb:1.6 - volumes: - - ./storage/influxdb:/var/lib/influxdb - ports: - - "8086:8086" + clamav: + image: appwrite/clamav:1.0.4 + restart: unless-stopped + volumes: + - ./storage:/storage:rw + + redis: + image: redis:5.0 + restart: unless-stopped - telegraf: - image: appwrite/telegraf:1.0.0 - ports: - - "8125:8125/udp" \ No newline at end of file + influxdb: + image: influxdb:1.6 + volumes: + - ./storage/influxdb:/var/lib/influxdb + ports: + - "8086:8086" + + telegraf: + image: appwrite/telegraf:1.0.0 + ports: + - "8125:8125/udp" \ No newline at end of file From a069aabc6354951f02e64dd8207cb7546d822052 Mon Sep 17 00:00:00 2001 From: Mattia Panzeri Date: Tue, 1 Oct 2019 01:09:55 +0200 Subject: [PATCH 003/135] Improve IT translations --- app/config/locale/it.countries.php | 388 +++++++++--------- app/config/locale/it.php | 11 +- .../templates/it.email.auth.confirm.tpl | 2 +- .../templates/it.email.auth.invitation.tpl | 6 +- .../templates/it.email.auth.recovery.tpl | 4 +- 5 files changed, 207 insertions(+), 204 deletions(-) diff --git a/app/config/locale/it.countries.php b/app/config/locale/it.countries.php index 6d539332aa..1afb659471 100644 --- a/app/config/locale/it.countries.php +++ b/app/config/locale/it.countries.php @@ -2,197 +2,197 @@ return [ 'AF' => 'Afghanistan', - 'AO' => 'Angola', - 'AL' => 'Albania', - 'AD' => 'Andorra', - 'AE' => 'Emirati Arabi Uniti', - 'AR' => 'Argentina', - 'AM' => 'Armenia', - 'AG' => 'Antigua e Barbuda', - 'AU' => 'Australia', - 'AT' => 'Austria', - 'AZ' => 'Azerbaigian', - 'BI' => 'Burundi', - 'BE' => 'Belgio', - 'BJ' => 'Benin', - 'BF' => 'Burkina Faso', - 'BD' => 'Bangladesh', - 'BG' => 'Bulgaria', - 'BH' => 'Bahrein', - 'BS' => 'Bahamas', - "BA" => "Bosnia ed Erzegovina", - 'BY' => 'Bielorussia', - 'BZ' => 'Belize', - 'BO' => 'Bolivia', - 'BR' => 'Brasile', - 'BB' => 'Barbados', - 'BN' => 'Brunei', - 'BT' => 'Bhutan', - 'BW' => 'Botswana', - "CF" => "Repubblica centrafricana", - 'CA' => 'Canada', - 'CH' => 'Svizzera', - 'CL' => 'Cile', - 'CN' => 'Cina', - 'CI' => 'Costa d\'Avorio', - 'CM' => 'Camerun', - 'CD' => 'DR Congo', - 'CG' => 'Repubblica del Congo', - 'CO' => 'Colombia', - 'KM' => 'Comore', - 'CV' => 'Capo Verde', - 'CR' => 'Costa Rica', - 'CU' => 'Cuba', - 'CY' => 'Cipro', - 'CZ' => 'Czechia', - 'DE' => 'Germania', - 'DJ' => 'Gibuti', - 'DM' => 'Dominica', - 'DK' => 'Danimarca', - 'DO' => 'Repubblica Dominicana', - 'DZ' => 'Algeria', - 'EC' => 'Ecuador', - 'EG' => 'Egitto', - 'ER' => 'Eritrea', - 'ES' => 'Spagna', - 'EE' => 'Estonia', - 'ET' => 'Etiopia', - 'FI' => 'Finlandia', - 'FJ' => 'Figi', - 'FR' => 'France', - 'FM' => 'Micronesia', - 'GA' => 'Gabon', - 'GB' => 'Regno Unito', - 'GE' => 'Georgia', - 'GH' => 'Ghana', - 'GN' => 'Guinea', - 'GM' => 'Gambia', - 'GW' => 'Guinea-Bissau', - 'GQ' => 'Guinea equatoriale', - 'GR' => 'Grecia', - 'GD' => 'Grenada', - 'GT' => 'Guatemala', - 'GY' => 'Guyana', - 'HN' => 'Honduras', - 'HR' => 'Croazia', - 'HT' => 'Haiti', - 'HU' => 'Ungheria', - 'ID' => 'Indonesia', - 'IN' => 'India', - 'IE' => 'Irlanda', - 'IR' => 'Iran', - 'IQ' => 'Iraq', - 'IS' => 'Islanda', - 'IL' => 'Israele', - 'IT' => 'Italia', - 'JM' => 'Giamaica', - 'JO' => 'Jordan', - 'JP' => 'Giappone', - 'KZ' => 'Kazakistan', - 'KE' => 'Kenya', - 'KG' => 'Kirghizistan', - 'KH' => 'Cambogia', - 'KI' => 'Kiribati', - 'KN' => 'Saint Kitts e Nevis', - "KR" => "Corea del Sud", - 'KW' => 'Kuwait', - 'LA' => 'Laos', - 'LB' => 'Libano', - 'LR' => 'Liberia', - 'LY' => 'Libia', - 'LC' => 'Santa Lucia', - 'LI' => 'Liechtenstein', - 'LK' => 'Sri Lanka', - 'LS' => 'Lesotho', - 'LT' => 'Lituania', - 'LU' => 'Lussemburgo', - 'LV' => 'Lettonia', - 'MA' => 'Marocco', - 'MC' => 'Monaco', - 'MD' => 'Moldavia', - 'MG' => 'Madagascar', - 'MV' => 'Maldive', - 'MX' => 'Messico', - 'MH' => 'Isole Marshall', - 'MK' => 'Macedonia', - 'ML' => 'Mali', - 'MT' => 'Malta', - 'MM' => 'Myanmar', - 'ME' => 'Montenegro', - 'MN' => 'Mongolia', - 'MZ' => 'Mozambico', - 'MR' => 'Mauritania', - 'MU' => 'Mauritius', - 'MW' => 'Malawi', - 'MY' => 'Malaysia', - 'NA' => 'Namibia', - 'NE' => 'Niger', - 'NG' => 'Nigeria', - 'NI' => 'Nicaragua', - 'NL' => 'Paesi Bassi', - 'NO' => 'Norvegia', - 'NP' => 'Nepal', - 'NR' => 'Nauru', - 'NZ' => 'Nuova Zelanda', - 'OM' => 'Oman', - 'PK' => 'Pakistan', - 'PA' => 'Panama', - 'PE' => 'Perù', - 'PH' => 'Filippine', - 'PW' => 'Palau', - 'PG' => 'Papua New Guinea', - 'PL' => 'Polonia', - 'KP' => 'Corea del Nord', - 'PT' => 'Portogallo', - 'PY' => 'Paraguay', - 'QA' => 'Qatar', - 'RO' => 'Romania', - 'RU' => 'Russia', - 'RW' => 'Ruanda', - 'SA' => 'Arabia Saudita', - 'SD' => 'Sudan', - 'SN' => 'Senegal', - 'SG' => 'Singapore', - 'SB' => 'Isole Salomone', - 'SL' => 'Sierra Leone', - 'SV' => 'El Salvador', - 'SM' => 'San Marino', - 'SO' => 'Somalia', - 'RS' => 'Serbia', - 'SS' => 'Sudan del Sud', - 'ST' => 'São Tomé and Príncipe', - 'SR' => 'Suriname', - 'SK' => 'Slovacchia', - 'SI' => 'Slovenia', - 'SE' => 'Svezia', - 'SZ' => 'Swaziland', - 'SC' => 'Seychelles', - 'SY' => 'Siria', - 'TD' => 'Chad', - 'TG' => 'Togo', - 'TH' => 'Thailand', - 'TJ' => 'Tagikistan', - 'TM' => 'Turkmenistan', - 'TL' => 'Timor Est', - 'TO' => 'Tonga', - 'TT' => 'Trinidad e Tobago', - 'TN' => 'Tunisia', - 'TR' => 'Turchia', - 'TV' => 'Tuvalu', - 'TZ' => 'Tanzania', - 'UG' => 'Uganda', - 'UA' => 'Ucraina', - 'UY' => 'Uruguay', - 'US' => 'Stati Uniti', - 'UZ' => 'Uzbekistan', - 'VA' => 'Città del Vaticano', - 'VC' => 'Saint Vincent e Grenadine', - 'VE' => 'Venezuela', - 'VN' => 'Vietnam', - 'VU' => 'Vanuatu', - 'WS' => 'Samoa', - 'YE' => 'Yemen', - 'ZA' => 'Sudafrica', - 'ZM' => 'Zambia', - 'ZW' => 'Zimbabwe', -]; \ No newline at end of file + 'AO' => 'Angola', + 'AL' => 'Albania', + 'AD' => 'Andorra', + 'AE' => 'Emirati Arabi Uniti', + 'AR' => 'Argentina', + 'AM' => 'Armenia', + 'AG' => 'Antigua e Barbuda', + 'AU' => 'Australia', + 'AT' => 'Austria', + 'AZ' => 'Azerbaigian', + 'BI' => 'Burundi', + 'BE' => 'Belgio', + 'BJ' => 'Benin', + 'BF' => 'Burkina Faso', + 'BD' => 'Bangladesh', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrein', + 'BS' => 'Bahamas', + "BA" => "Bosnia ed Erzegovina", + 'BY' => 'Bielorussia', + 'BZ' => 'Belize', + 'BO' => 'Bolivia', + 'BR' => 'Brasile', + 'BB' => 'Barbados', + 'BN' => 'Brunei', + 'BT' => 'Bhutan', + 'BW' => 'Botswana', + "CF" => "Repubblica Centrafricana", + 'CA' => 'Canada', + 'CH' => 'Svizzera', + 'CL' => 'Cile', + 'CN' => 'Cina', + 'CI' => 'Costa d\'Avorio', + 'CM' => 'Camerun', + 'CD' => 'Repubblica Democratica del Congo', + 'CG' => 'Repubblica del Congo', + 'CO' => 'Colombia', + 'KM' => 'Unione delle Comore', + 'CV' => 'Capo Verde', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CY' => 'Cipro', + 'CZ' => 'Repubblica Ceca', + 'DE' => 'Germania', + 'DJ' => 'Gibuti', + 'DM' => 'Dominica', + 'DK' => 'Danimarca', + 'DO' => 'Repubblica Dominicana', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EG' => 'Egitto', + 'ER' => 'Eritrea', + 'ES' => 'Spagna', + 'EE' => 'Estonia', + 'ET' => 'Etiopia', + 'FI' => 'Finlandia', + 'FJ' => 'Figi', + 'FR' => 'Francia', + 'FM' => 'Micronesia', + 'GA' => 'Gabon', + 'GB' => 'Regno Unito', + 'GE' => 'Georgia', + 'GH' => 'Ghana', + 'GN' => 'Guinea', + 'GM' => 'Gambia', + 'GW' => 'Guinea-Bissau', + 'GQ' => 'Guinea equatoriale', + 'GR' => 'Grecia', + 'GD' => 'Grenada', + 'GT' => 'Guatemala', + 'GY' => 'Guyana', + 'HN' => 'Honduras', + 'HR' => 'Croazia', + 'HT' => 'Haiti', + 'HU' => 'Ungheria', + 'ID' => 'Indonesia', + 'IN' => 'India', + 'IE' => 'Irlanda', + 'IR' => 'Iran', + 'IQ' => 'Iraq', + 'IS' => 'Islanda', + 'IL' => 'Israele', + 'IT' => 'Italia', + 'JM' => 'Giamaica', + 'JO' => 'Jordan', + 'JP' => 'Giappone', + 'KZ' => 'Kazakistan', + 'KE' => 'Kenya', + 'KG' => 'Kirghizistan', + 'KH' => 'Cambogia', + 'KI' => 'Kiribati', + 'KN' => 'Saint Kitts e Nevis', + "KR" => "Corea del Sud", + 'KW' => 'Kuwait', + 'LA' => 'Laos', + 'LB' => 'Libano', + 'LR' => 'Liberia', + 'LY' => 'Libia', + 'LC' => 'Santa Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LS' => 'Lesotho', + 'LT' => 'Lituania', + 'LU' => 'Lussemburgo', + 'LV' => 'Lettonia', + 'MA' => 'Marocco', + 'MC' => 'Monaco', + 'MD' => 'Moldavia', + 'MG' => 'Madagascar', + 'MV' => 'Maldive', + 'MX' => 'Messico', + 'MH' => 'Isole Marshall', + 'MK' => 'Macedonia', + 'ML' => 'Mali', + 'MT' => 'Malta', + 'MM' => 'Myanmar', + 'ME' => 'Montenegro', + 'MN' => 'Mongolia', + 'MZ' => 'Mozambico', + 'MR' => 'Mauritania', + 'MU' => 'Mauritius', + 'MW' => 'Malawi', + 'MY' => 'Malaysia', + 'NA' => 'Namibia', + 'NE' => 'Niger', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Paesi Bassi', + 'NO' => 'Norvegia', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NZ' => 'Nuova Zelanda', + 'OM' => 'Oman', + 'PK' => 'Pakistan', + 'PA' => 'Panama', + 'PE' => 'Perù', + 'PH' => 'Filippine', + 'PW' => 'Palau', + 'PG' => 'Papua Nuova Guinea', + 'PL' => 'Polonia', + 'KP' => 'Corea del Nord', + 'PT' => 'Portogallo', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RO' => 'Romania', + 'RU' => 'Russia', + 'RW' => 'Ruanda', + 'SA' => 'Arabia Saudita', + 'SD' => 'Sudan', + 'SN' => 'Senegal', + 'SG' => 'Singapore', + 'SB' => 'Isole Salomone', + 'SL' => 'Sierra Leone', + 'SV' => 'El Salvador', + 'SM' => 'San Marino', + 'SO' => 'Somalia', + 'RS' => 'Serbia', + 'SS' => 'Sudan del Sud', + 'ST' => 'São Tomé e Príncipe', + 'SR' => 'Suriname', + 'SK' => 'Slovacchia', + 'SI' => 'Slovenia', + 'SE' => 'Svezia', + 'SZ' => 'Swaziland', + 'SC' => 'Seychelles', + 'SY' => 'Siria', + 'TD' => 'Chad', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tagikistan', + 'TM' => 'Turkmenistan', + 'TL' => 'Timor Est', + 'TO' => 'Tonga', + 'TT' => 'Trinidad e Tobago', + 'TN' => 'Tunisia', + 'TR' => 'Turchia', + 'TV' => 'Tuvalu', + 'TZ' => 'Tanzania', + 'UG' => 'Uganda', + 'UA' => 'Ucraina', + 'UY' => 'Uruguay', + 'US' => 'Stati Uniti', + 'UZ' => 'Uzbekistan', + 'VA' => 'Città del Vaticano', + 'VC' => 'Saint Vincent e Grenadine', + 'VE' => 'Venezuela', + 'VN' => 'Vietnam', + 'VU' => 'Vanuatu', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'ZA' => 'Sudafrica', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/app/config/locale/it.php b/app/config/locale/it.php index 071a17b8f6..4be58ed8b1 100644 --- a/app/config/locale/it.php +++ b/app/config/locale/it.php @@ -4,15 +4,18 @@ return [ 'settings.inspire' => '"L\'arte di essere saggi è l\'arte di sapere cosa trascurare."', // Questa è la riga stampata nella homepage e nella console 'view-source' 'settings.locale' => 'it', 'settings.direction' => 'ltr', + // Servizio - Utenti - 'auth.emails.team' => '%s Squadra', + 'auth.emails.team' => 'Team %s', 'auth.emails.confirm.title' => 'Conferma dell\'account', 'auth.emails.confirm.body' => 'en.email.auth.confirm.tpl', - 'auth.emails.recovery.title' => 'Reimpostazione della password', + 'auth.emails.recovery.title' => 'Recupero password', 'auth.emails.recovery.body' => 'en.email.auth.recovery.tpl', - 'auth.emails.invitation.title' => 'Invito a %s squadra %s', + 'auth.emails.invitation.title' => 'Invito al team %s di %s', 'auth.emails.invitation.body' => 'en.email.auth.invitation.tpl', + 'locale.country.unknown' => 'Sconosciuto', + 'countries' => include 'it.countries.php', 'continents' => include 'it.continents.php', -]; \ No newline at end of file +]; diff --git a/app/config/locale/templates/it.email.auth.confirm.tpl b/app/config/locale/templates/it.email.auth.confirm.tpl index 8106722d8d..fedbe80182 100644 --- a/app/config/locale/templates/it.email.auth.confirm.tpl +++ b/app/config/locale/templates/it.email.auth.confirm.tpl @@ -21,5 +21,5 @@
Grazie,
- {{project}} squadra + Il team di {{project}} \ No newline at end of file diff --git a/app/config/locale/templates/it.email.auth.invitation.tpl b/app/config/locale/templates/it.email.auth.invitation.tpl index be7becac4e..9ec03cf39b 100644 --- a/app/config/locale/templates/it.email.auth.invitation.tpl +++ b/app/config/locale/templates/it.email.auth.invitation.tpl @@ -11,10 +11,10 @@ Ciao,

- Questa mail ti stata inviata perch {{owner}} volevo invitarti a diventare un membro del team al {{team}} squadra a {{project}}. + Questa mail ti è stata inviata perchè {{owner}} vuole invitarti a diventare un membro del team {{team}} del progetto {{project}}.

- Segui questo link per unirti a {{team}} squadra: + Segui questo link per unirti al team {{team}}:
{{redirect}}
@@ -24,5 +24,5 @@
Grazie,
- {{project}} squadra + Il team di {{project}} \ No newline at end of file diff --git a/app/config/locale/templates/it.email.auth.recovery.tpl b/app/config/locale/templates/it.email.auth.recovery.tpl index 6a5adb5cbe..2756b1569d 100644 --- a/app/config/locale/templates/it.email.auth.recovery.tpl +++ b/app/config/locale/templates/it.email.auth.recovery.tpl @@ -10,7 +10,7 @@ Ciao {{name}},

- Segui questo link per reimpostare la tua {{project}} password. + Segui questo link per reimpostare la tua password per {{project}}.
{{redirect}}
@@ -20,5 +20,5 @@
Grazie,
- {{project}} squadra + Il team di {{project}} \ No newline at end of file From 03537f2f399ab7fe29349a9854fff82e9a20f65d Mon Sep 17 00:00:00 2001 From: Mattia Panzeri Date: Tue, 1 Oct 2019 10:13:22 +0200 Subject: [PATCH 004/135] Fix PR conflicts --- app/config/locale/it.continents.php | 18 +- app/config/locale/it.countries.php | 396 ++++++++++++++-------------- app/config/locale/it.php | 42 +-- 3 files changed, 228 insertions(+), 228 deletions(-) diff --git a/app/config/locale/it.continents.php b/app/config/locale/it.continents.php index 22672575ba..c69f11e5e6 100644 --- a/app/config/locale/it.continents.php +++ b/app/config/locale/it.continents.php @@ -1,10 +1,10 @@ - 'Africa', - 'AN' => 'Antartide', - 'AS' => 'Asia', - 'EU' => 'Europa', - 'NA' => 'Nord America', - 'OC' => 'Oceania', - 'SA' => 'Sud America', + 'Africa', + 'AN' => 'Antartide', + 'AS' => 'Asia', + 'EU' => 'Europa', + 'NA' => 'Nord America', + 'OC' => 'Oceania', + 'SA' => 'Sud America', ]; \ No newline at end of file diff --git a/app/config/locale/it.countries.php b/app/config/locale/it.countries.php index 1afb659471..23a37e273c 100644 --- a/app/config/locale/it.countries.php +++ b/app/config/locale/it.countries.php @@ -1,198 +1,198 @@ - 'Afghanistan', - 'AO' => 'Angola', - 'AL' => 'Albania', - 'AD' => 'Andorra', - 'AE' => 'Emirati Arabi Uniti', - 'AR' => 'Argentina', - 'AM' => 'Armenia', - 'AG' => 'Antigua e Barbuda', - 'AU' => 'Australia', - 'AT' => 'Austria', - 'AZ' => 'Azerbaigian', - 'BI' => 'Burundi', - 'BE' => 'Belgio', - 'BJ' => 'Benin', - 'BF' => 'Burkina Faso', - 'BD' => 'Bangladesh', - 'BG' => 'Bulgaria', - 'BH' => 'Bahrein', - 'BS' => 'Bahamas', - "BA" => "Bosnia ed Erzegovina", - 'BY' => 'Bielorussia', - 'BZ' => 'Belize', - 'BO' => 'Bolivia', - 'BR' => 'Brasile', - 'BB' => 'Barbados', - 'BN' => 'Brunei', - 'BT' => 'Bhutan', - 'BW' => 'Botswana', - "CF" => "Repubblica Centrafricana", - 'CA' => 'Canada', - 'CH' => 'Svizzera', - 'CL' => 'Cile', - 'CN' => 'Cina', - 'CI' => 'Costa d\'Avorio', - 'CM' => 'Camerun', - 'CD' => 'Repubblica Democratica del Congo', - 'CG' => 'Repubblica del Congo', - 'CO' => 'Colombia', - 'KM' => 'Unione delle Comore', - 'CV' => 'Capo Verde', - 'CR' => 'Costa Rica', - 'CU' => 'Cuba', - 'CY' => 'Cipro', - 'CZ' => 'Repubblica Ceca', - 'DE' => 'Germania', - 'DJ' => 'Gibuti', - 'DM' => 'Dominica', - 'DK' => 'Danimarca', - 'DO' => 'Repubblica Dominicana', - 'DZ' => 'Algeria', - 'EC' => 'Ecuador', - 'EG' => 'Egitto', - 'ER' => 'Eritrea', - 'ES' => 'Spagna', - 'EE' => 'Estonia', - 'ET' => 'Etiopia', - 'FI' => 'Finlandia', - 'FJ' => 'Figi', - 'FR' => 'Francia', - 'FM' => 'Micronesia', - 'GA' => 'Gabon', - 'GB' => 'Regno Unito', - 'GE' => 'Georgia', - 'GH' => 'Ghana', - 'GN' => 'Guinea', - 'GM' => 'Gambia', - 'GW' => 'Guinea-Bissau', - 'GQ' => 'Guinea equatoriale', - 'GR' => 'Grecia', - 'GD' => 'Grenada', - 'GT' => 'Guatemala', - 'GY' => 'Guyana', - 'HN' => 'Honduras', - 'HR' => 'Croazia', - 'HT' => 'Haiti', - 'HU' => 'Ungheria', - 'ID' => 'Indonesia', - 'IN' => 'India', - 'IE' => 'Irlanda', - 'IR' => 'Iran', - 'IQ' => 'Iraq', - 'IS' => 'Islanda', - 'IL' => 'Israele', - 'IT' => 'Italia', - 'JM' => 'Giamaica', - 'JO' => 'Jordan', - 'JP' => 'Giappone', - 'KZ' => 'Kazakistan', - 'KE' => 'Kenya', - 'KG' => 'Kirghizistan', - 'KH' => 'Cambogia', - 'KI' => 'Kiribati', - 'KN' => 'Saint Kitts e Nevis', - "KR" => "Corea del Sud", - 'KW' => 'Kuwait', - 'LA' => 'Laos', - 'LB' => 'Libano', - 'LR' => 'Liberia', - 'LY' => 'Libia', - 'LC' => 'Santa Lucia', - 'LI' => 'Liechtenstein', - 'LK' => 'Sri Lanka', - 'LS' => 'Lesotho', - 'LT' => 'Lituania', - 'LU' => 'Lussemburgo', - 'LV' => 'Lettonia', - 'MA' => 'Marocco', - 'MC' => 'Monaco', - 'MD' => 'Moldavia', - 'MG' => 'Madagascar', - 'MV' => 'Maldive', - 'MX' => 'Messico', - 'MH' => 'Isole Marshall', - 'MK' => 'Macedonia', - 'ML' => 'Mali', - 'MT' => 'Malta', - 'MM' => 'Myanmar', - 'ME' => 'Montenegro', - 'MN' => 'Mongolia', - 'MZ' => 'Mozambico', - 'MR' => 'Mauritania', - 'MU' => 'Mauritius', - 'MW' => 'Malawi', - 'MY' => 'Malaysia', - 'NA' => 'Namibia', - 'NE' => 'Niger', - 'NG' => 'Nigeria', - 'NI' => 'Nicaragua', - 'NL' => 'Paesi Bassi', - 'NO' => 'Norvegia', - 'NP' => 'Nepal', - 'NR' => 'Nauru', - 'NZ' => 'Nuova Zelanda', - 'OM' => 'Oman', - 'PK' => 'Pakistan', - 'PA' => 'Panama', - 'PE' => 'Perù', - 'PH' => 'Filippine', - 'PW' => 'Palau', - 'PG' => 'Papua Nuova Guinea', - 'PL' => 'Polonia', - 'KP' => 'Corea del Nord', - 'PT' => 'Portogallo', - 'PY' => 'Paraguay', - 'QA' => 'Qatar', - 'RO' => 'Romania', - 'RU' => 'Russia', - 'RW' => 'Ruanda', - 'SA' => 'Arabia Saudita', - 'SD' => 'Sudan', - 'SN' => 'Senegal', - 'SG' => 'Singapore', - 'SB' => 'Isole Salomone', - 'SL' => 'Sierra Leone', - 'SV' => 'El Salvador', - 'SM' => 'San Marino', - 'SO' => 'Somalia', - 'RS' => 'Serbia', - 'SS' => 'Sudan del Sud', - 'ST' => 'São Tomé e Príncipe', - 'SR' => 'Suriname', - 'SK' => 'Slovacchia', - 'SI' => 'Slovenia', - 'SE' => 'Svezia', - 'SZ' => 'Swaziland', - 'SC' => 'Seychelles', - 'SY' => 'Siria', - 'TD' => 'Chad', - 'TG' => 'Togo', - 'TH' => 'Thailand', - 'TJ' => 'Tagikistan', - 'TM' => 'Turkmenistan', - 'TL' => 'Timor Est', - 'TO' => 'Tonga', - 'TT' => 'Trinidad e Tobago', - 'TN' => 'Tunisia', - 'TR' => 'Turchia', - 'TV' => 'Tuvalu', - 'TZ' => 'Tanzania', - 'UG' => 'Uganda', - 'UA' => 'Ucraina', - 'UY' => 'Uruguay', - 'US' => 'Stati Uniti', - 'UZ' => 'Uzbekistan', - 'VA' => 'Città del Vaticano', - 'VC' => 'Saint Vincent e Grenadine', - 'VE' => 'Venezuela', - 'VN' => 'Vietnam', - 'VU' => 'Vanuatu', - 'WS' => 'Samoa', - 'YE' => 'Yemen', - 'ZA' => 'Sudafrica', - 'ZM' => 'Zambia', - 'ZW' => 'Zimbabwe', -]; + 'Afghanistan', + 'AO' => 'Angola', + 'AL' => 'Albania', + 'AD' => 'Andorra', + 'AE' => 'Emirati Arabi Uniti', + 'AR' => 'Argentina', + 'AM' => 'Armenia', + 'AG' => 'Antigua e Barbuda', + 'AU' => 'Australia', + 'AT' => 'Austria', + 'AZ' => 'Azerbaigian', + 'BI' => 'Burundi', + 'BE' => 'Belgio', + 'BJ' => 'Benin', + 'BF' => 'Burkina Faso', + 'BD' => 'Bangladesh', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrein', + 'BS' => 'Bahamas', + 'BA' => 'Bosnia ed Erzegovina', + 'BY' => 'Bielorussia', + 'BZ' => 'Belize', + 'BO' => 'Bolivia', + 'BR' => 'Brasile', + 'BB' => 'Barbados', + 'BN' => 'Brunei', + 'BT' => 'Bhutan', + 'BW' => 'Botswana', + 'CF' => 'Repubblica Centrafricana', + 'CA' => 'Canada', + 'CH' => 'Svizzera', + 'CL' => 'Cile', + 'CN' => 'Cina', + 'CI' => 'Costa d\'Avorio', + 'CM' => 'Camerun', + 'CD' => 'Repubblica Democratica del Congo', + 'CG' => 'Repubblica del Congo', + 'CO' => 'Colombia', + 'KM' => 'Unione delle Comore', + 'CV' => 'Capo Verde', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CY' => 'Cipro', + 'CZ' => 'Repubblica Ceca', + 'DE' => 'Germania', + 'DJ' => 'Gibuti', + 'DM' => 'Dominica', + 'DK' => 'Danimarca', + 'DO' => 'Repubblica Dominicana', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EG' => 'Egitto', + 'ER' => 'Eritrea', + 'ES' => 'Spagna', + 'EE' => 'Estonia', + 'ET' => 'Etiopia', + 'FI' => 'Finlandia', + 'FJ' => 'Figi', + 'FR' => 'Francia', + 'FM' => 'Micronesia', + 'GA' => 'Gabon', + 'GB' => 'Regno Unito', + 'GE' => 'Georgia', + 'GH' => 'Ghana', + 'GN' => 'Guinea', + 'GM' => 'Gambia', + 'GW' => 'Guinea-Bissau', + 'GQ' => 'Guinea equatoriale', + 'GR' => 'Grecia', + 'GD' => 'Grenada', + 'GT' => 'Guatemala', + 'GY' => 'Guyana', + 'HN' => 'Honduras', + 'HR' => 'Croazia', + 'HT' => 'Haiti', + 'HU' => 'Ungheria', + 'ID' => 'Indonesia', + 'IN' => 'India', + 'IE' => 'Irlanda', + 'IR' => 'Iran', + 'IQ' => 'Iraq', + 'IS' => 'Islanda', + 'IL' => 'Israele', + 'IT' => 'Italia', + 'JM' => 'Giamaica', + 'JO' => 'Jordan', + 'JP' => 'Giappone', + 'KZ' => 'Kazakistan', + 'KE' => 'Kenya', + 'KG' => 'Kirghizistan', + 'KH' => 'Cambogia', + 'KI' => 'Kiribati', + 'KN' => 'Saint Kitts e Nevis', + 'KR' => 'Corea del Sud', + 'KW' => 'Kuwait', + 'LA' => 'Laos', + 'LB' => 'Libano', + 'LR' => 'Liberia', + 'LY' => 'Libia', + 'LC' => 'Santa Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LS' => 'Lesotho', + 'LT' => 'Lituania', + 'LU' => 'Lussemburgo', + 'LV' => 'Lettonia', + 'MA' => 'Marocco', + 'MC' => 'Monaco', + 'MD' => 'Moldavia', + 'MG' => 'Madagascar', + 'MV' => 'Maldive', + 'MX' => 'Messico', + 'MH' => 'Isole Marshall', + 'MK' => 'Macedonia', + 'ML' => 'Mali', + 'MT' => 'Malta', + 'MM' => 'Myanmar', + 'ME' => 'Montenegro', + 'MN' => 'Mongolia', + 'MZ' => 'Mozambico', + 'MR' => 'Mauritania', + 'MU' => 'Mauritius', + 'MW' => 'Malawi', + 'MY' => 'Malaysia', + 'NA' => 'Namibia', + 'NE' => 'Niger', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Paesi Bassi', + 'NO' => 'Norvegia', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NZ' => 'Nuova Zelanda', + 'OM' => 'Oman', + 'PK' => 'Pakistan', + 'PA' => 'Panama', + 'PE' => 'Perù', + 'PH' => 'Filippine', + 'PW' => 'Palau', + 'PG' => 'Papua Nuova Guinea', + 'PL' => 'Polonia', + 'KP' => 'Corea del Nord', + 'PT' => 'Portogallo', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RO' => 'Romania', + 'RU' => 'Russia', + 'RW' => 'Ruanda', + 'SA' => 'Arabia Saudita', + 'SD' => 'Sudan', + 'SN' => 'Senegal', + 'SG' => 'Singapore', + 'SB' => 'Isole Salomone', + 'SL' => 'Sierra Leone', + 'SV' => 'El Salvador', + 'SM' => 'San Marino', + 'SO' => 'Somalia', + 'RS' => 'Serbia', + 'SS' => 'Sudan del Sud', + 'ST' => 'São Tomé e Príncipe', + 'SR' => 'Suriname', + 'SK' => 'Slovacchia', + 'SI' => 'Slovenia', + 'SE' => 'Svezia', + 'SZ' => 'Swaziland', + 'SC' => 'Seychelles', + 'SY' => 'Siria', + 'TD' => 'Chad', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tagikistan', + 'TM' => 'Turkmenistan', + 'TL' => 'Timor Est', + 'TO' => 'Tonga', + 'TT' => 'Trinidad e Tobago', + 'TN' => 'Tunisia', + 'TR' => 'Turchia', + 'TV' => 'Tuvalu', + 'TZ' => 'Tanzania', + 'UG' => 'Uganda', + 'UA' => 'Ucraina', + 'UY' => 'Uruguay', + 'US' => 'Stati Uniti', + 'UZ' => 'Uzbekistan', + 'VA' => 'Città del Vaticano', + 'VC' => 'Saint Vincent e Grenadine', + 'VE' => 'Venezuela', + 'VN' => 'Vietnam', + 'VU' => 'Vanuatu', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'ZA' => 'Sudafrica', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; \ No newline at end of file diff --git a/app/config/locale/it.php b/app/config/locale/it.php index 4be58ed8b1..77f593f25c 100644 --- a/app/config/locale/it.php +++ b/app/config/locale/it.php @@ -1,21 +1,21 @@ - '"L\'arte di essere saggi è l\'arte di sapere cosa trascurare."', // Questa è la riga stampata nella homepage e nella console 'view-source' - 'settings.locale' => 'it', - 'settings.direction' => 'ltr', - - // Servizio - Utenti - 'auth.emails.team' => 'Team %s', - 'auth.emails.confirm.title' => 'Conferma dell\'account', - 'auth.emails.confirm.body' => 'en.email.auth.confirm.tpl', - 'auth.emails.recovery.title' => 'Recupero password', - 'auth.emails.recovery.body' => 'en.email.auth.recovery.tpl', - 'auth.emails.invitation.title' => 'Invito al team %s di %s', - 'auth.emails.invitation.body' => 'en.email.auth.invitation.tpl', - - 'locale.country.unknown' => 'Sconosciuto', - - 'countries' => include 'it.countries.php', - 'continents' => include 'it.continents.php', -]; + '"L\'arte di essere saggi è l\'arte di sapere cosa trascurare."', // Questa è la riga stampata nella homepage e nella console 'view-source' + 'settings.locale' => 'it', + 'settings.direction' => 'ltr', + + // Servizio - Utenti + 'auth.emails.team' => 'Team %s', + 'auth.emails.confirm.title' => 'Conferma dell\'account', + 'auth.emails.confirm.body' => 'en.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => 'Recupero password', + 'auth.emails.recovery.body' => 'en.email.auth.recovery.tpl', + 'auth.emails.invitation.title' => 'Invito al team %s di %s', + 'auth.emails.invitation.body' => 'en.email.auth.invitation.tpl', + + 'locale.country.unknown' => 'Sconosciuto', + + 'countries' => include 'it.countries.php', + 'continents' => include 'it.continents.php', +]; \ No newline at end of file From b83dade16c5101784f56cd00800a7a0808b9ad8f Mon Sep 17 00:00:00 2001 From: Carike Blignaut-Staden Date: Tue, 1 Oct 2019 16:36:10 +0200 Subject: [PATCH 005/135] Created new PHP pages for Afrikaans and updated them. af.countries.php stil in progress --- .vs/appwrite/v16/.suo | Bin 0 -> 23040 bytes .vs/slnx.sqlite | Bin 0 -> 217088 bytes app/config/locale/af.continents.php | 11 + app/config/locale/af.countries.php | 198 ++++++++++++++++++ app/config/locale/af.php | 21 ++ .../templates/af.email.auth.confirm.tpl | 24 +++ .../templates/af.email.auth.invitation.tpl | 27 +++ .../templates/af.email.auth.recovery.tpl | 24 +++ 8 files changed, 305 insertions(+) create mode 100644 .vs/appwrite/v16/.suo create mode 100644 .vs/slnx.sqlite create mode 100644 app/config/locale/af.continents.php create mode 100644 app/config/locale/af.countries.php create mode 100644 app/config/locale/af.php create mode 100644 app/config/locale/templates/af.email.auth.confirm.tpl create mode 100644 app/config/locale/templates/af.email.auth.invitation.tpl create mode 100644 app/config/locale/templates/af.email.auth.recovery.tpl diff --git a/.vs/appwrite/v16/.suo b/.vs/appwrite/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..778ec426b1f93edef8a3a7402b49953d0ab39445 GIT binary patch literal 23040 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 U$p4#Vvb~f$`X(HjbpPf50r{6?J^%m! literal 0 HcmV?d00001 diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..b77903a9763386620c65deb696b7d2306bb6741f GIT binary patch literal 217088 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 rIHS%wK 'Afrika', + 'AN' => 'Antarktika', + 'AS' => 'Asi', + 'EU' => 'Europa', + 'NA' => 'Noord-Amerika', + 'OC' => 'Oseani', + 'SA' => 'Suid-Amerika', +]; diff --git a/app/config/locale/af.countries.php b/app/config/locale/af.countries.php new file mode 100644 index 0000000000..34cbef452f --- /dev/null +++ b/app/config/locale/af.countries.php @@ -0,0 +1,198 @@ + 'Afghanistan', + 'AO' => 'Angola', + 'AL' => 'Albanië', + 'AD' => 'Andorra', + 'AE' => 'Verenigde Arabiese Emirate', + 'AR' => 'Argentinië', + 'AM' => 'Armenië', + 'AG' => 'Antigua and Barbuda', + 'AU' => 'Australia', + 'AT' => 'Austria', + 'AZ' => 'Azerbaijan', + 'BI' => 'Burundi', + 'BE' => 'Belgium', + 'BJ' => 'Benin', + 'BF' => 'Burkina Faso', + 'BD' => 'Bangladesh', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrain', + 'BS' => 'Bahamas', + 'BA' => 'Bosnia and Herzegovina', + 'BY' => 'Belarus', + 'BZ' => 'Belize', + 'BO' => 'Bolivia', + 'BR' => 'Brazil', + 'BB' => 'Barbados', + 'BN' => 'Brunei', + 'BT' => 'Bhutan', + 'BW' => 'Botswana', + 'CF' => 'Central African Republic', + 'CA' => 'Kanada', + 'CH' => 'Switserland', + 'CL' => 'Chile', + 'CN' => 'China', + 'CI' => 'Ivory Coast', + 'CM' => 'Cameroon', + 'CD' => 'DR Congo', + 'CG' => 'Republic of the Congo', + 'CO' => 'Colombia', + 'KM' => 'Comoros', + 'CV' => 'Cape Verde', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CY' => 'Cyprus', + 'CZ' => 'Czechia', + 'DE' => 'Germany', + 'DJ' => 'Djibouti', + 'DM' => 'Dominica', + 'DK' => 'Denmark', + 'DO' => 'Dominican Republic', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EG' => 'Egypt', + 'ER' => 'Eritrea', + 'ES' => 'Spain', + 'EE' => 'Estonia', + 'ET' => 'Ethiopia', + 'FI' => 'Finland', + 'FJ' => 'Fiji', + 'FR' => 'France', + 'FM' => 'Micronesia', + 'GA' => 'Gabon', + 'GB' => 'United Kingdom', + 'GE' => 'Georgia', + 'GH' => 'Ghana', + 'GN' => 'Guinea', + 'GM' => 'Gambia', + 'GW' => 'Guinea-Bissau', + 'GQ' => 'Equatorial Guinea', + 'GR' => 'Greece', + 'GD' => 'Grenada', + 'GT' => 'Guatemala', + 'GY' => 'Guyana', + 'HN' => 'Honduras', + 'HR' => 'Croatia', + 'HT' => 'Haiti', + 'HU' => 'Hungary', + 'ID' => 'Indonesia', + 'IN' => 'India', + 'IE' => 'Ireland', + 'IR' => 'Iran', + 'IQ' => 'Iraq', + 'IS' => 'Iceland', + 'IL' => 'Israel', + 'IT' => 'Italy', + 'JM' => 'Jamaica', + 'JO' => 'Jordan', + 'JP' => 'Japan', + 'KZ' => 'Kazakhstan', + 'KE' => 'Kenya', + 'KG' => 'Kyrgyzstan', + 'KH' => 'Cambodia', + 'KI' => 'Kiribati', + 'KN' => 'Saint Kitts and Nevis', + 'KR' => 'South Korea', + 'KW' => 'Kuwait', + 'LA' => 'Laos', + 'LB' => 'Lebanon', + 'LR' => 'Liberia', + 'LY' => 'Libya', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LS' => 'Lesotho', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'LV' => 'Latvia', + 'MA' => 'Morocco', + 'MC' => 'Monaco', + 'MD' => 'Moldova', + 'MG' => 'Madagascar', + 'MV' => 'Maldives', + 'MX' => 'Mexico', + 'MH' => 'Marshall Islands', + 'MK' => 'Macedonia', + 'ML' => 'Mali', + 'MT' => 'Malta', + 'MM' => 'Myanmar', + 'ME' => 'Montenegro', + 'MN' => 'Mongolia', + 'MZ' => 'Mozambique', + 'MR' => 'Mauritania', + 'MU' => 'Mauritius', + 'MW' => 'Malawi', + 'MY' => 'Malaysia', + 'NA' => 'Namibia', + 'NE' => 'Niger', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Netherlands', + 'NO' => 'Norway', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NZ' => 'New Zealand', + 'OM' => 'Oman', + 'PK' => 'Pakistan', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PH' => 'Philippines', + 'PW' => 'Palau', + 'PG' => 'Papua New Guinea', + 'PL' => 'Poland', + 'KP' => 'North Korea', + 'PT' => 'Portugal', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RO' => 'Romania', + 'RU' => 'Russia', + 'RW' => 'Rwanda', + 'SA' => 'Saudi Arabia', + 'SD' => 'Sudan', + 'SN' => 'Senegal', + 'SG' => 'Singapore', + 'SB' => 'Solomon Islands', + 'SL' => 'Sierra Leone', + 'SV' => 'El Salvador', + 'SM' => 'San Marino', + 'SO' => 'Somalia', + 'RS' => 'Serbia', + 'SS' => 'South Sudan', + 'ST' => 'São Tomé and Príncipe', + 'SR' => 'Suriname', + 'SK' => 'Slovakia', + 'SI' => 'Slovenia', + 'SE' => 'Sweden', + 'SZ' => 'Swaziland', + 'SC' => 'Seychelles', + 'SY' => 'Syria', + 'TD' => 'Chad', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tajikistan', + 'TM' => 'Turkmenistan', + 'TL' => 'Timor-Leste', + 'TO' => 'Tonga', + 'TT' => 'Trinidad and Tobago', + 'TN' => 'Tunisia', + 'TR' => 'Turkey', + 'TV' => 'Tuvalu', + 'TZ' => 'Tanzania', + 'UG' => 'Uganda', + 'UA' => 'Ukraine', + 'UY' => 'Uruguay', + 'US' => 'United States', + 'UZ' => 'Uzbekistan', + 'VA' => 'Vatican City', + 'VC' => 'Saint Vincent and the Grenadines', + 'VE' => 'Venezuela', + 'VN' => 'Vietnam', + 'VU' => 'Vanuatu', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'ZA' => 'South Africa', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/app/config/locale/af.php b/app/config/locale/af.php new file mode 100644 index 0000000000..ae66ae30ea --- /dev/null +++ b/app/config/locale/af.php @@ -0,0 +1,21 @@ + '"Wie nie waag nie, sal nie wen nie."', // This is the line printed in the homepage and console 'view-source' + 'settings.locale' => 'af', + 'settings.direction' => 'ltr', + + // Service - Users + 'auth.emails.team' => '%s span', + 'auth.emails.confirm.title' => 'Profiel Bevestiging', + 'auth.emails.confirm.body' => 'af.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => 'Verander Wagwoord', + 'auth.emails.recovery.body' => 'af.email.auth.recovery.tpl', + 'auth.emails.invitation.title' => 'Uitnodiging na %s span by %s', + 'auth.emails.invitation.body' => 'af.email.auth.invitation.tpl', + + 'locale.country.unknown' => 'Onbekend', + + 'countries' => include 'af.countries.php', + 'continents' => include 'af.continents.php', +]; diff --git a/app/config/locale/templates/af.email.auth.confirm.tpl b/app/config/locale/templates/af.email.auth.confirm.tpl new file mode 100644 index 0000000000..e0a6c40356 --- /dev/null +++ b/app/config/locale/templates/af.email.auth.confirm.tpl @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/app/config/locale/templates/af.email.auth.invitation.tpl b/app/config/locale/templates/af.email.auth.invitation.tpl new file mode 100644 index 0000000000..eed6cf69d1 --- /dev/null +++ b/app/config/locale/templates/af.email.auth.invitation.tpl @@ -0,0 +1,27 @@ + + +
+ Hallo, +
+
+ Hierdie epos is vir jou gestuur omdat {{owner}} jou graag wou nooi om 'n spanlid te word van {{team}} by {{project}}. +
+
+ Om by die {{team}} span aan te sluit: +
+ {{redirect}} +
+
+ As jy nie belangstel nie, kan jy die boodskap ignoreer. +
+
+ Baie dankie, +
+ {{project}} span +
diff --git a/app/config/locale/templates/af.email.auth.recovery.tpl b/app/config/locale/templates/af.email.auth.recovery.tpl new file mode 100644 index 0000000000..0b5cec7b22 --- /dev/null +++ b/app/config/locale/templates/af.email.auth.recovery.tpl @@ -0,0 +1,24 @@ + + +
+ Hallo {{name}}, +
+
+ Volg hierdie web adres om jou wagwoord te verander vir {{project}}. +
+ {{redirect}} +
+
+ As jy nie gevra het om you wagwoord te verander nie, kan jy die boodskap ignoreer. +
+
+ Baie dankie, +
+ {{project}} span +
From f6fd091da660e6a2fc3ada7f04b5a8095224bc94 Mon Sep 17 00:00:00 2001 From: Carike Blignaut-Staden Date: Tue, 1 Oct 2019 17:14:00 +0200 Subject: [PATCH 006/135] Updated the Afrikaans-translation of the remaining countries. --- .vs/appwrite/v16/.suo | Bin 23040 -> 19456 bytes app/config/locale/af.countries.php | 206 ++++++++++++++--------------- 2 files changed, 103 insertions(+), 103 deletions(-) diff --git a/.vs/appwrite/v16/.suo b/.vs/appwrite/v16/.suo index 778ec426b1f93edef8a3a7402b49953d0ab39445..a03af2a26673e7d6dfbba0e484f98ef4443dc9c8 100644 GIT binary patch delta 2292 zcmds2YfPJE6#m|?S4zuDfl`5uG76M!uyWmoT&k2?J78qQkVwoX)C89l#$^Gvg)i~P zVuBg;cz4Of7^1<=5ulWF3N$>t9e6a8ftBT*N%KBwzTh~f{8Ka6kk=a7kj+WG1+q1%w?lRSK~8xH%3+`r=mNR{s?T!MVAh5CW9F!DTvX76rJL4`KH;Mc z%Zza^LJkU=u9!A*N%M>}t=nyAQ6`m2S}+w_EpRgRaK!{Y3=J?orzu@wBIrOOhzrdD zJeWg<2jF;VGpL4x_)J3p{$)ychG;$G>;Hbf($=laU1pE`H2R_X6D!k)2`-&R=8jpR zyQv*EgeyVaAW_YK>h+3L$i8sv&mjQpMR+ml4jb+4U{ZfMz zsPt`9LraO7ZzLD|TlEWM)JKsXrUvsyZjbcbuqoVhxCuz_mi*9~t${RaAdy)43=@rL z)uoU9WX%!eaC}FaE-%5a>IA>IiSToj`x$Cre6h)|Dk{(&H5`KPcI@XGlj^#i-8~E| z5zlMnAeY0du83&Kis#&5|2tPdEBfX=&$*ZVb&uTIHXKw|FAMS)Urwt%zp!WY(#6hK z7c#HCeY-F1zYT1JviogI@GS_5oCq=qBq1H%)M@zJ3$ z&9=8YxgXve=G6iy%=m!Zxh&>x%@FyE$q2A~^$K(@E_Z)sGX|v}&BY^OOH-O@rg4Ji znnuX(b?d@Pgr00F<6vb}8BoGXzw(MxZ|b|jL|16I_z-EOUb?#1B~s{0=?CgEC;UY^ z=5<+@ysw|_Y9D;zUEQ}|MRT0r!Jh*e8;S z-U$c4s@Y@_ob+hls^|D)D0yUjC=!m0kClJO|J6Ugjr8CiaSEx=;jKMWr%g3W>r+oX zyz$JUJ9MXH+a*VGi_}>`TH|cx$>YD=+`oR;9zW3$JDb(gzFmBHbgX~i)L8%6@Wkjq f7)SZ-``*a@a&78~AJ3N#Jr{iX*2S1Tct`vWUv~O> delta 2282 zcmdUwUu;uV9LIa^`j6Y&_0MWoy1&pl%V=vmHmq8dYPXfU!M4D|96of>5t@vyk+N*_ zfub)ykjVBknF&OV4?-d@TaAf^M3NC>j7DRk4~U5x2t~%!RhpAt72}9x zn661tL~_Jh8O6jfUb?~-G!BiM5#ztmo6wtq1y}+5Wo#HLzz*tx1K^YlF5m_Yzylru zi0wnMsHCkN4c2OV7l-JSGOY0Cw^f=C(k39!p=EJ{WZGUWh~up_6u^mR}?+0joF*-VO~vzrXyC4QJ*mJX03FmZBXHD z@%HqoQlay#c)wMUuO~&<90_XI`rl6T`G-IlM8M-93Syue>;XNX7wiR3fH-&(JO!Qx z39t`51D*x@0iW}8=${8E&Mm%}|JZ0+_j7+=sQ7Dks=f<>e4 zJnoLK$7uMJzE%e)8VS;f+Cg$SD6UjkeD&GfOtvsl$WG@Xh5VHE!Y7q4*j}2>9m~FQ zLZ79t)OYB5xL#C$*h&kL&uiHIG_Lx|ua1M22fA-5q7nZtQF>kJIS8=xF*y^iF!s(Ooz8jf{2sXn#CN zosv(O=uG^x&97kPOzNz(V%RhVyr@cLjl*r|a^p{{bFcsT=C16L`qq!{lB;JL`J5?} zTy(y1urixEvF0%l1eImyVbWgv&hqGPlz@Wh&{VG%0$o}npsAjfZ8bvm^X4`Tz0P%! zH?qh}vz|d=*Tl#*Ltn}Azun^3M9zZcYN5~3P4~A7*Mw?;m+rJ#q-rfESRmy?8=+j^ zPVEMAeKIu<@Xd_dyr?rQ9<$+tvJx`lVtEv{ 'Verenigde Arabiese Emirate', 'AR' => 'Argentinië', 'AM' => 'Armenië', - 'AG' => 'Antigua and Barbuda', - 'AU' => 'Australia', - 'AT' => 'Austria', + 'AG' => 'Antigua en Barbuda', + 'AU' => 'Australië', + 'AT' => 'Oostenryk', 'AZ' => 'Azerbaijan', 'BI' => 'Burundi', - 'BE' => 'Belgium', + 'BE' => 'België', 'BJ' => 'Benin', 'BF' => 'Burkina Faso', - 'BD' => 'Bangladesh', - 'BG' => 'Bulgaria', + 'BD' => 'Bangladesj', + 'BG' => 'Bulgarye', 'BH' => 'Bahrain', 'BS' => 'Bahamas', - 'BA' => 'Bosnia and Herzegovina', + 'BA' => 'Bosnië en Herzegovina', 'BY' => 'Belarus', 'BZ' => 'Belize', 'BO' => 'Bolivia', - 'BR' => 'Brazil', + 'BR' => 'Brasilië', 'BB' => 'Barbados', 'BN' => 'Brunei', - 'BT' => 'Bhutan', + 'BT' => 'Bhoetan', 'BW' => 'Botswana', 'CF' => 'Central African Republic', 'CA' => 'Kanada', 'CH' => 'Switserland', 'CL' => 'Chile', - 'CN' => 'China', - 'CI' => 'Ivory Coast', - 'CM' => 'Cameroon', - 'CD' => 'DR Congo', - 'CG' => 'Republic of the Congo', + 'CN' => 'Sjina', + 'CI' => 'Ivoorkus', + 'CM' => 'Kameroen', + 'CD' => 'Demokratiese Republiek van die Kongo', + 'CG' => 'Republiek van die Kongo', 'CO' => 'Colombia', 'KM' => 'Comoros', - 'CV' => 'Cape Verde', + 'CV' => 'Kaap Verde', 'CR' => 'Costa Rica', - 'CU' => 'Cuba', - 'CY' => 'Cyprus', - 'CZ' => 'Czechia', - 'DE' => 'Germany', - 'DJ' => 'Djibouti', + 'CU' => 'Kuba', + 'CY' => 'Ciprus', + 'CZ' => 'Tsjeggiese Republiek', + 'DE' => 'Duitsland', + 'DJ' => 'Djiboeti', 'DM' => 'Dominica', - 'DK' => 'Denmark', - 'DO' => 'Dominican Republic', - 'DZ' => 'Algeria', + 'DK' => 'Denemarke', + 'DO' => 'Dominikaanse Republiek', + 'DZ' => 'Algerië', 'EC' => 'Ecuador', - 'EG' => 'Egypt', + 'EG' => 'Egipte', 'ER' => 'Eritrea', - 'ES' => 'Spain', - 'EE' => 'Estonia', - 'ET' => 'Ethiopia', + 'ES' => 'Spanje', + 'EE' => 'Estland', + 'ET' => 'Ethiopië', 'FI' => 'Finland', - 'FJ' => 'Fiji', - 'FR' => 'France', - 'FM' => 'Micronesia', - 'GA' => 'Gabon', - 'GB' => 'United Kingdom', + 'FJ' => 'Fidji', + 'FR' => 'Frankryk', + 'FM' => 'Mikronesië', + 'GA' => 'Gaboen', + 'GB' => 'Verenigde Koninkryk', 'GE' => 'Georgia', 'GH' => 'Ghana', - 'GN' => 'Guinea', - 'GM' => 'Gambia', - 'GW' => 'Guinea-Bissau', - 'GQ' => 'Equatorial Guinea', - 'GR' => 'Greece', + 'GN' => 'Guinee', + 'GM' => 'Gambië', + 'GW' => 'Guinee-Bissau', + 'GQ' => 'Ekwatoriaal-Guinee', + 'GR' => 'Griekeland', 'GD' => 'Grenada', 'GT' => 'Guatemala', 'GY' => 'Guyana', 'HN' => 'Honduras', - 'HR' => 'Croatia', + 'HR' => 'Kroasië', 'HT' => 'Haiti', - 'HU' => 'Hungary', - 'ID' => 'Indonesia', - 'IN' => 'India', + 'HU' => 'Hongarye', + 'ID' => 'Indonesië', + 'IN' => 'Indië', 'IE' => 'Ireland', 'IR' => 'Iran', - 'IQ' => 'Iraq', - 'IS' => 'Iceland', + 'IQ' => 'Irak', + 'IS' => 'Ysland', 'IL' => 'Israel', - 'IT' => 'Italy', + 'IT' => 'Italië', 'JM' => 'Jamaica', 'JO' => 'Jordan', 'JP' => 'Japan', - 'KZ' => 'Kazakhstan', - 'KE' => 'Kenya', + 'KZ' => 'Kazakstan', + 'KE' => 'Kenia', 'KG' => 'Kyrgyzstan', - 'KH' => 'Cambodia', + 'KH' => 'Kambodja', 'KI' => 'Kiribati', - 'KN' => 'Saint Kitts and Nevis', - 'KR' => 'South Korea', + 'KN' => 'Saint Kitts en Nevis', + 'KR' => 'Suid-Korea', 'KW' => 'Kuwait', 'LA' => 'Laos', - 'LB' => 'Lebanon', - 'LR' => 'Liberia', - 'LY' => 'Libya', + 'LB' => 'Libanon', + 'LR' => 'Liberië', + 'LY' => 'Libië', 'LC' => 'Saint Lucia', 'LI' => 'Liechtenstein', 'LK' => 'Sri Lanka', 'LS' => 'Lesotho', - 'LT' => 'Lithuania', - 'LU' => 'Luxembourg', + 'LT' => 'Litaue', + 'LU' => 'Luxemburg', 'LV' => 'Latvia', - 'MA' => 'Morocco', + 'MA' => 'Marokko', 'MC' => 'Monaco', - 'MD' => 'Moldova', - 'MG' => 'Madagascar', + 'MD' => 'Moldawië', + 'MG' => 'Madagaskar', 'MV' => 'Maldives', - 'MX' => 'Mexico', - 'MH' => 'Marshall Islands', - 'MK' => 'Macedonia', + 'MX' => 'Meksiko', + 'MH' => 'Marshall-eilande', + 'MK' => 'Macedonië', 'ML' => 'Mali', 'MT' => 'Malta', 'MM' => 'Myanmar', 'ME' => 'Montenegro', - 'MN' => 'Mongolia', - 'MZ' => 'Mozambique', - 'MR' => 'Mauritania', + 'MN' => 'Mongolië', + 'MZ' => 'Mosambiek', + 'MR' => 'Mauritanië', 'MU' => 'Mauritius', 'MW' => 'Malawi', - 'MY' => 'Malaysia', - 'NA' => 'Namibia', + 'MY' => 'Maleisië', + 'NA' => 'Namibië', 'NE' => 'Niger', - 'NG' => 'Nigeria', + 'NG' => 'Nigerië', 'NI' => 'Nicaragua', - 'NL' => 'Netherlands', - 'NO' => 'Norway', + 'NL' => 'Nederland', + 'NO' => 'Noorweë', 'NP' => 'Nepal', 'NR' => 'Nauru', - 'NZ' => 'New Zealand', + 'NZ' => 'Nieu-Seeland', 'OM' => 'Oman', 'PK' => 'Pakistan', 'PA' => 'Panama', 'PE' => 'Peru', - 'PH' => 'Philippines', + 'PH' => 'Filippyne', 'PW' => 'Palau', - 'PG' => 'Papua New Guinea', - 'PL' => 'Poland', - 'KP' => 'North Korea', + 'PG' => 'Papoea-Nieu-Guinee', + 'PL' => 'Pole', + 'KP' => 'Noord-Korea', 'PT' => 'Portugal', 'PY' => 'Paraguay', - 'QA' => 'Qatar', - 'RO' => 'Romania', - 'RU' => 'Russia', + 'QA' => 'Katar', + 'RO' => 'Roemenië', + 'RU' => 'Rusland', 'RW' => 'Rwanda', - 'SA' => 'Saudi Arabia', - 'SD' => 'Sudan', + 'SA' => 'Saoedi-Arabië', + 'SD' => 'Soedan', 'SN' => 'Senegal', 'SG' => 'Singapore', - 'SB' => 'Solomon Islands', + 'SB' => 'Salomo-eilande', 'SL' => 'Sierra Leone', 'SV' => 'El Salvador', 'SM' => 'San Marino', - 'SO' => 'Somalia', - 'RS' => 'Serbia', - 'SS' => 'South Sudan', - 'ST' => 'São Tomé and Príncipe', + 'SO' => 'Somalië', + 'RS' => 'Serwië', + 'SS' => 'Suid-Soedan', + 'ST' => 'São Tomé en Príncipe', 'SR' => 'Suriname', - 'SK' => 'Slovakia', - 'SI' => 'Slovenia', - 'SE' => 'Sweden', + 'SK' => 'Slowakye', + 'SI' => 'Slowenië', + 'SE' => 'Swede', 'SZ' => 'Swaziland', - 'SC' => 'Seychelles', - 'SY' => 'Syria', + 'SC' => 'Seychelle', + 'SY' => 'Sirië', 'TD' => 'Chad', 'TG' => 'Togo', 'TH' => 'Thailand', - 'TJ' => 'Tajikistan', + 'TJ' => 'Tadjikistan', 'TM' => 'Turkmenistan', - 'TL' => 'Timor-Leste', + 'TL' => 'Oos-Timor', 'TO' => 'Tonga', - 'TT' => 'Trinidad and Tobago', - 'TN' => 'Tunisia', - 'TR' => 'Turkey', + 'TT' => 'Trinidad en Tobago', + 'TN' => 'Tunisië', + 'TR' => 'Turkye', 'TV' => 'Tuvalu', - 'TZ' => 'Tanzania', + 'TZ' => 'Tanzanië', 'UG' => 'Uganda', - 'UA' => 'Ukraine', + 'UA' => 'Oekraïne', 'UY' => 'Uruguay', - 'US' => 'United States', - 'UZ' => 'Uzbekistan', - 'VA' => 'Vatican City', - 'VC' => 'Saint Vincent and the Grenadines', + 'US' => 'Verenigde State', + 'UZ' => 'Oesbekistan', + 'VA' => 'Vatikaanstad', + 'VC' => 'Sint Vincent en die Grenadines', 'VE' => 'Venezuela', - 'VN' => 'Vietnam', + 'VN' => 'Viëtnam', 'VU' => 'Vanuatu', 'WS' => 'Samoa', - 'YE' => 'Yemen', - 'ZA' => 'South Africa', + 'YE' => 'Jemen', + 'ZA' => 'Suid-Afrika', 'ZM' => 'Zambia', 'ZW' => 'Zimbabwe', -]; +]; \ No newline at end of file From cfb3e024a6edae0093b5e77d55d9693f84516239 Mon Sep 17 00:00:00 2001 From: Sibi Bose <30630364+the-bose@users.noreply.github.com> Date: Tue, 1 Oct 2019 21:14:25 +0530 Subject: [PATCH 007/135] Create ta.continents.php --- app/config/locale/ta.continents.php | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 app/config/locale/ta.continents.php diff --git a/app/config/locale/ta.continents.php b/app/config/locale/ta.continents.php new file mode 100644 index 0000000000..4b16c1b807 --- /dev/null +++ b/app/config/locale/ta.continents.php @@ -0,0 +1,11 @@ + 'ஆப்பிரிக்கா', + 'AN' => 'அந்தாட்டிக்கா', + 'AS' => 'ஆசியா', + 'EU' => 'ஐரோப்பா', + 'NA' => 'வட அமெரிக்கா', + 'OC' => 'ஓசியானியா', + 'SA' => 'தென் அமெரிக்கா', +]; From 1b513f25cec596cd818afff2efc1937f05f960e0 Mon Sep 17 00:00:00 2001 From: Ishanka D Senevirathne <33729848+IshankaDSenevirathne@users.noreply.github.com> Date: Tue, 1 Oct 2019 21:22:24 +0530 Subject: [PATCH 008/135] added si.countries.php to support the country names in Sinhala language --- app/config/locale/si.countries.php | 198 +++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 app/config/locale/si.countries.php diff --git a/app/config/locale/si.countries.php b/app/config/locale/si.countries.php new file mode 100644 index 0000000000..1b850827fe --- /dev/null +++ b/app/config/locale/si.countries.php @@ -0,0 +1,198 @@ + 'ඇෆ්ගනිස්ථානය', + 'AO' => 'ඇන්ගෝලා', + 'AL' => 'ඇල්බේනියාව', + 'AD' => 'ඇන්ඩෝරා', + 'AE' => 'එක්සත් අරාබි එමීර් රාජ්යය', + 'AR' => 'ආර්ජන්ටිනාව', + 'AM' => 'ආර්මේනියාව', + 'AG' => 'ඇන්ටිගුවා සහ බාබුඩා', + 'AU' => 'ඕස්ට්‍රේලියාව', + 'AT' => 'ඔස්ට්‍රියාව', + 'AZ' => 'අසර්බයිජානය', + 'BI' => 'බුරුන්ඩි', + 'BE' => 'බෙල්ජියම', + 'BJ' => 'බෙනින්', + 'BF' => 'බුර්කිනා ෆාසෝ', + 'BD' => 'බංග්ලාදේශය', + 'BG' => 'බල්ගේරියාව', + 'BH' => 'බහරේනය', + 'BS' => 'බහමාස්', + 'BA' => 'බොස්නියාව සහ හර්සගොවිනාව', + 'BY' => 'බෙලාරුස්', + 'BZ' => 'බෙලීස්', + 'BO' => 'බොලිවියාව', + 'BR' => 'බ්‍රසීලය', + 'BB' => 'බාබඩෝස්', + 'BN' => 'බෘනායි', + 'BT' => 'භූතානය', + 'BW' => 'බොට්ස්වානා', + 'CF' => 'මධ්‍යම අප්‍රිකානු ජනරජය', + 'CA' => 'කැනඩාව', + 'CH' => 'ස්විට්සර්ලන්තය', + 'CL' => 'චිලී', + 'CN' => 'චීනය', + 'CI' => 'අයිවරි කෝස්ට්', + 'CM' => 'කැමරූන්', + 'CD' => 'කොංගෝ ප්‍රජාතන්ත්‍රවාදී ජනරජය', + 'CG' => 'කොංගෝ ජනරජය', + 'CO' => 'කොලොම්බියාව', + 'KM' => 'කොමරෝස්', + 'CV' => 'කේප් වර්ඩ්', + 'CR' => 'කොස්ටාරිකාව', + 'CU' => 'කියුබාව', + 'CY' => 'සයිප්‍රසය', + 'CZ' => 'චෙක් ජනරජය', + 'DE' => 'ජර්මනිය', + 'DJ' => 'ජිබුටි', + 'DM' => 'ඩොමිනිකා', + 'DK' => 'ඩෙන්මාර්කය', + 'DO' => 'ඩොමිනිකානු ජනරජය', + 'DZ' => 'ඇල්ජීරියාව', + 'EC' => 'ඉක්වදෝරය', + 'EG' => 'ඊජිප්තුව', + 'ER' => 'එරිත්‍රියාව', + 'ES' => 'ස්පාඤ්ඤය', + 'EE' => 'එස්තෝනියාව', + 'ET' => 'ඉතියෝපියාව', + 'FI' => 'ෆින්ලන්තය', + 'FJ' => 'ෆීජි', + 'FR' => 'ප්‍රංශය', + 'FM' => 'මයික්‍රොනීසියාව', + 'GA' => 'ගැබොන්', + 'GB' => 'එක්සත් රාජධානිය', + 'GE' => 'ජෝර්ජියාව', + 'GH' => 'ගහනාව', + 'GN' => 'ගිනියාව', + 'GM' => 'ගැම්බියාව', + 'GW' => 'ගිනි-බිසව්', + 'GQ' => 'සමක ගිනියාව', + 'GR' => 'ග්‍රීසිය', + 'GD' => 'ග්‍රෙනාඩා', + 'GT' => 'ග්වාතමාලාව', + 'GY' => 'ගයනා', + 'HN' => 'හොන්ඩුරාස්', + 'HR' => 'ක්‍රොඒෂියාව', + 'HT' => 'හයිටි', + 'HU' => 'හංගේරියාව', + 'ID' => 'ඉන්දුනීසියාව', + 'IN' => 'ඉන්දියාව', + 'IE' => 'අයර්ලන්තය', + 'IR' => 'ඉරානය', + 'IQ' => 'ඉරාකය', + 'IS' => 'අයිස්ලන්තය', + 'IL' => 'ඊශ්රායෙල්', + 'IT' => 'ඉතාලිය', + 'JM' => 'ජැමෙයිකාව', + 'JO' => 'ජෝර්දානය', + 'JP' => 'ජපානය', + 'KZ' => 'කසකස්තානය', + 'KE' => 'කෙන්යාව', + 'KG' => 'ක්‍රිගිස්තානය', + 'KH' => 'කාම්බෝජය', + 'KI' => 'කිරිබති', + 'KN' => 'ශාන්ත කිට්ස් සහ නෙවිස්', + 'KR' => 'දකුණු කොරියාව', + 'KW' => 'කුවේට්', + 'LA' => 'ලාඕසය', + 'LB' => 'ලෙබනනය', + 'LR' => 'ලයිබීරියාව', + 'LY' => 'ලිබියාව', + 'LC' => 'ශාන්ත ලුසියා', + 'LI' => 'ලිච්ටෙන්ස්ටයින්', + 'LK' => 'ශ්‍රී ලංකාව', + 'LS' => 'ලෙසෝතෝ', + 'LT' => 'ලිතුවේනියාව', + 'LU' => 'ලක්සම්බර්ග්', + 'LV' => 'ලැට්වියාව', + 'MA' => 'මොරොක්කෝව', + 'MC' => 'මොනාකෝ', + 'MD' => 'මෝල්ඩෝවා', + 'MG' => 'මැඩගස්කරය', + 'MV' => 'මාලදිවයින', + 'MX' => 'මෙක්සිකෝව', + 'MH' => 'මාෂල් දූපත්', + 'MK' => 'මැසිඩෝනියාව', + 'ML' => 'මාලි', + 'MT' => 'මෝල්ටාව', + 'MM' => 'මියන්මාරය', + 'ME' => 'මොන්ටිනිග්‍රෝ', + 'MN' => 'මොන්ගෝලියාව', + 'MZ' => 'මොසැම්බික්', + 'MR' => 'මොරිටේනියාව', + 'MU' => 'මොරිෂස්', + 'MW' => 'මලාවි', + 'MY' => 'මැලේසියාව', + 'NA' => 'නැමීබියාව', + 'NE' => 'නයිජර්', + 'NG' => 'නයිජීරියාව', + 'NI' => 'නිකරගුවාව', + 'NL' => 'නෙදර්ලන්තය', + 'NO' => 'නෝර්වේ', + 'NP' => 'නේපාලය', + 'NR' => 'නාවුරූ', + 'NZ' => 'නිව්සීලන්තය', + 'OM' => 'ඕමානය', + 'PK' => 'පාකිස්තානය', + 'PA' => 'පැනමාව', + 'PE' => 'පේරු', + 'PH' => 'පිලිපීනය', + 'PW' => 'පලාවු', + 'PG' => 'පැපුවා නිව්ගීනියාව', + 'PL' => 'පෝලන්තය', + 'KP' => 'උතුරු කොරියාව', + 'PT' => 'පෘතුගාලය', + 'PY' => 'පැරගුවේ', + 'QA' => 'කටාර්', + 'RO' => 'රුමේනියාව', + 'RU' => 'රුසියාව', + 'RW' => 'රුවන්ඩාව', + 'SA' => 'සවුදි අරාබිය', + 'SD' => 'සුඩානය', + 'SN' => 'සෙනෙගල්', + 'SG' => 'සිංගප්පූරුව', + 'SB' => 'සොලමන් දූපත්', + 'SL' => 'සියාරා ලියොන්', + 'SV' => 'එල් සැල්වදෝරය', + 'SM' => 'සැන් මරිනෝ', + 'SO' => 'සෝමාලියාව', + 'RS' => 'සර්බියාව', + 'SS' => 'දකුණු සුඩානය', + 'ST' => 'සාඕ ටොමේ සහ ප්‍රින්සිප්', + 'SR' => 'සුරිනේම්', + 'SK' => 'ස්ලොවැකියාව', + 'SI' => 'ස්ලොවේනියාව', + 'SE' => 'ස්වීඩනය', + 'SZ' => 'ස්වාසිලන්තය', + 'SC' => 'සීෂෙල්ස්', + 'SY' => 'සිරියාව', + 'TD' => 'චැඩ්', + 'TG' => 'ටෝගෝ ජනරජය', + 'TH' => 'තායිලන්තය', + 'TJ' => 'ටජිකිස්තානය', + 'TM' => 'ටර්ක්මෙනිස්තානය', + 'TL' => 'ටිමෝර්-ලෙස්ටේ', + 'TO' => 'ටොංගා', + 'TT' => 'ට්රිනිඩෑඩ් සහ ටොබැගෝ', + 'TN' => 'ටියුනීසියාව', + 'TR' => 'තුර්කිය', + 'TV' => 'ටුවාලු', + 'TZ' => 'ටැන්සානියාව', + 'UG' => 'උගන්ඩාව', + 'UA' => 'යුක්රේනය', + 'UY' => 'උරුගුවේ', + 'US' => 'එක්සත් ජනපදය', + 'UZ' => 'උස්බෙකිස්තානය', + 'VA' => 'වතිකානු නගරය', + 'VC' => 'ශාන්ත වින්සන්ට් සහ ග්‍රෙනඩින්ස්', + 'VE' => 'වෙනිසියුලාව', + 'VN' => 'වියට්නාමය', + 'VU' => 'වනුවාටු', + 'WS' => 'සැමෝවා', + 'YE' => 'යේමනය', + 'ZA' => 'දකුණු අප්‍රිකාව', + 'ZM' => 'සැම්බියාව', + 'ZW' => 'සිම්බාබ්වේ', +]; From 3fc5cc8a34dd8c737d7de9bf73a8f6a4a5bc8e6c Mon Sep 17 00:00:00 2001 From: rizkyrajitha Date: Tue, 1 Oct 2019 21:28:17 +0530 Subject: [PATCH 009/135] added si_lk locale from sri lanka --- app/config/locale/si.continents.php | 11 +++++++ app/config/locale/si.php | 18 +++++++++++ .../templates/si.email.auth.confirm.tpl | 25 +++++++++++++++ .../templates/si.email.auth.invitation.tpl | 31 +++++++++++++++++++ .../templates/si.email.auth.recovery.tpl | 25 +++++++++++++++ app/init.php | 1 + 6 files changed, 111 insertions(+) create mode 100644 app/config/locale/si.continents.php create mode 100644 app/config/locale/si.php create mode 100644 app/config/locale/templates/si.email.auth.confirm.tpl create mode 100644 app/config/locale/templates/si.email.auth.invitation.tpl create mode 100644 app/config/locale/templates/si.email.auth.recovery.tpl diff --git a/app/config/locale/si.continents.php b/app/config/locale/si.continents.php new file mode 100644 index 0000000000..10395d9add --- /dev/null +++ b/app/config/locale/si.continents.php @@ -0,0 +1,11 @@ + 'අප්‍රිකාව', + 'AN' => 'ඇන්ටාක්ටිකාව', + 'AS' => 'ආසියාව', + 'EU' => 'යුරෝපය', + 'NA' => 'උතුරු ඇමරිකාව', + 'OC' => 'ඕෂනියා', + 'SA' => 'දකුණු ඇමරිකාව', +]; diff --git a/app/config/locale/si.php b/app/config/locale/si.php new file mode 100644 index 0000000000..bf09272469 --- /dev/null +++ b/app/config/locale/si.php @@ -0,0 +1,18 @@ + '"ප්‍රඥාවන්ත වීමේ කලාව යනු නොසලකා හැරිය යුතු දේ දැන ගැනීමේ කලාවයි."', // This is the line printed in the homepage and console 'view-source' + 'settings.locale' => 'si', + 'settings.direction' => 'ltr', + // Service - Users + 'auth.emails.team' => '%s කණ්ඩායම', + 'auth.emails.confirm.title' => 'ගිණුම් තහවුරු කිරීම', + 'auth.emails.confirm.body' => 'si.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => 'මුරපදය යළි පිහිටුවන්න', + 'auth.emails.recovery.body' => 'si.email.auth.recovery.tpl', + + 'auth.emails.invitation.title' => 'ආරාධනයයි , %s කණ්ඩායමට %s ව්‍යාපෘතියෙහි', + 'auth.emails.invitation.body' => 'si.email.auth.invitation.tpl', + 'locale.country.unknown' => 'Unknown', + 'countries' => include 'si.countries.php', + 'continents' => include 'si.continents.php', +]; \ No newline at end of file diff --git a/app/config/locale/templates/si.email.auth.confirm.tpl b/app/config/locale/templates/si.email.auth.confirm.tpl new file mode 100644 index 0000000000..c7be6ec681 --- /dev/null +++ b/app/config/locale/templates/si.email.auth.confirm.tpl @@ -0,0 +1,25 @@ + + +
+ ආයුබෝවන් {{name}}, +
+
+ ඔබගේ විද්‍යුත් තැපැල් ලිපිනය සත්‍යාපනය කිරීමට මෙම සබැඳිය අනුගමනය කරන්න. +
+ {{redirect}} +
+
+ + ඔබ මෙම ලිපිනය සත්‍යාපනය කිරීමට ඉල්ලා නොසිටියේ නම්, ඔබට මෙම පණිවිඩය නොසලකා හැරිය හැක. +
+
+ ස්තූතියි, +
+ {{project}} කණ්ඩායම +
\ No newline at end of file diff --git a/app/config/locale/templates/si.email.auth.invitation.tpl b/app/config/locale/templates/si.email.auth.invitation.tpl new file mode 100644 index 0000000000..1a0842d2e8 --- /dev/null +++ b/app/config/locale/templates/si.email.auth.invitation.tpl @@ -0,0 +1,31 @@ + + +
+ ආයුබෝවන්, +
+
+ + මෙම තැපෑල ඔබ වෙත එවනු ලැබුවේ {{owner}}ට ඔබව , {{project}} ව්‍යාපෘතියෙහි {{team}} කණ්ඩායමේ කණ්ඩායම් සාමාජිකයෙකු වීමට ආරාධනා කිරීමට අවශ්‍ය වූ නිසාය. + +
+
+ + {{team}} කණ්ඩායමට එක්වීමට මෙම සබැඳිය අනුගමනය කරන්න: + +
+ {{redirect}} +
+
+ ඔබ උනන්දුවක් නොදක්වන්නේ නම්, ඔබට මෙම පණිවිඩය නොසලකා හැරිය හැකිය. +
+
+ ස්තූතියි, +
+ {{project}} කණ්ඩායම. +
\ No newline at end of file diff --git a/app/config/locale/templates/si.email.auth.recovery.tpl b/app/config/locale/templates/si.email.auth.recovery.tpl new file mode 100644 index 0000000000..bcf32b61ba --- /dev/null +++ b/app/config/locale/templates/si.email.auth.recovery.tpl @@ -0,0 +1,25 @@ + + +
+ ආයුබෝවන් {{name}}, +
+
+ ඔබගේ {{project}} ව්‍යාපෘතියෙහි මුරපදය නැවත සැකසීමට මෙම සබැඳිය අනුගමනය කරන්න + +
+ {{redirect}} +
+
+ ඔබගේ මුරපදය නැවත සැකසීමට ඔබ ඉල්ලා නොසිටියේ නම්, ඔබට මෙම පණිවිඩය නොසලකා හැරිය හැක. +
+
+ ස්තූතියි, +
+ {{project}} කණ්ඩායම +
\ No newline at end of file diff --git a/app/init.php b/app/init.php index 92e3d9d90b..98b059b7a7 100644 --- a/app/init.php +++ b/app/init.php @@ -133,6 +133,7 @@ Locale::setLanguage('ua', include __DIR__ . '/config/locale/ua.php'); Locale::setLanguage('pt-br', include __DIR__ . '/config/locale/pt-br.php'); Locale::setLanguage('es', include __DIR__ . '/config/locale/es.php'); Locale::setLanguage('ro', include __DIR__ . '/config/locale/ro.php'); +Locale::setLanguage('si', include __DIR__ . '/config/locale/si.php'); if (in_array($locale, APP_LOCALES)) { Locale::setDefault($locale); From 70e8d9559eb5cf2db7bff1849f151d320cb35324 Mon Sep 17 00:00:00 2001 From: Sibi Bose <30630364+the-bose@users.noreply.github.com> Date: Tue, 1 Oct 2019 22:30:40 +0530 Subject: [PATCH 010/135] Create ta.countries.php --- app/config/locale/ta.countries.php | 198 +++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 app/config/locale/ta.countries.php diff --git a/app/config/locale/ta.countries.php b/app/config/locale/ta.countries.php new file mode 100644 index 0000000000..83d83b29d8 --- /dev/null +++ b/app/config/locale/ta.countries.php @@ -0,0 +1,198 @@ + 'ஆப்கானித்தான்', + 'AO' => 'அங்கோலா', + 'AL' => 'அல்பேனியா', + 'AD' => 'அந்தோரா', + 'AE' => 'ஐக்கிய அரபு அமீரகம்', + 'AR' => 'அர்கெந்தீனா', + 'AM' => 'ஆர்மீனியா', + 'AG' => 'அன்டிகுவா பர்புடா', + 'AU' => 'ஆத்திரேலியா', + 'AT' => 'ஆஸ்திரியா', + 'AZ' => 'அசர்பைஜான்', + 'BI' => 'புருண்டி', + 'BE' => 'பெல்ஜியம்', + 'BJ' => 'பெனின்', + 'BF' => 'புர்கினா பாசோ', + 'BD' => 'வங்காளதேசம்', + 'BG' => 'பல்கேரியா', + 'BH' => 'பஹ்ரேய்ன்', + 'BS' => 'பகாமாசு', + 'BA' => 'பொஸ்னியாவும், ஹெர்ஸகொவினாவும்', + 'BY' => 'பெலாருஸ்', + 'BZ' => 'பெலிசு', + 'BO' => 'பொலீவியா', + 'BR' => 'பிரேஸில்', + 'BB' => 'பார்படோஸ்', + 'BN' => 'புரூணை', + 'BT' => 'பூட்டான்', + 'BW' => 'பொட்ஸ்வானா', + 'CF' => 'மத்திய ஆபிரிக்கக் குடியரசு', + 'CA' => 'கனடா', + 'CH' => 'சுவிட்சர்லாந்து', + 'CL' => 'சிலி', + 'CN' => 'சீனா', + 'CI' => 'ஐவரி கோஸ்ட்', + 'CM' => 'கமரூன்', + 'CD' => 'காங்கோ மக்களாட்சிக் குடியரசு', + 'CG' => 'காங்கோ குடியரசு', + 'CO' => 'கொலம்பியா', + 'KM' => 'கொமொரோசு', + 'CV' => 'கேப் வர்டி', + 'CR' => 'கோஸ்ட்டா ரிக்கா', + 'CU' => 'கியூபா', + 'CY' => 'சைப்பிரசு', + 'CZ' => 'செக் குடியரசு', + 'DE' => 'ஜெர்மனி', + 'DJ' => 'ஜிபூட்டி', + 'DM' => 'டொமினிக்கா', + 'DK' => 'டென்மார்க்', + 'DO' => 'டொமினிகன் குடியரசு', + 'DZ' => 'அல்ஜீரியா', + 'EC' => 'எக்குவடோர்', + 'EG' => 'எகிப்து', + 'ER' => 'எரித்திரியா', + 'ES' => 'ஸ்பெயின்', + 'EE' => 'எசுத்தோனியா', + 'ET' => 'எதியோப்பியா', + 'FI' => 'பின்லாந்து', + 'FJ' => 'பிஜி', + 'FR' => 'பிரான்ஸ்', + 'FM' => 'மைக்குரோனீசியக் கூட்டு நாடுகள்', + 'GA' => 'காபொன்', + 'GB' => 'ஐக்கிய இராச்சியம்', + 'GE' => 'ஜோர்ஜியா', + 'GH' => 'கானா', + 'GN' => 'கினியா', + 'GM' => 'கம்பியா', + 'GW' => 'கினி-பிசாவு', + 'GQ' => 'எக்குவடோரியல் கினி', + 'GR' => 'கிரேக்க நாடு', + 'GD' => 'கிரெனடா', + 'GT' => 'குவாத்தமாலா', + 'GY' => 'கயானா', + 'HN' => 'ஹொண்டூராஸ்', + 'HR' => 'குரோவாசியா', + 'HT' => 'ஹைத்தி', + 'HU' => 'ஹங்கேரி', + 'ID' => 'இந்தோனேசியா', + 'IN' => 'இந்தியா', + 'IE' => 'அயர்லாந்து', + 'IR' => 'ஈரான்', + 'IQ' => 'ஈராக்', + 'IS' => 'ஐசுலாந்து', + 'IL' => 'இசுரேல்', + 'IT' => 'இத்தாலி', + 'JM' => 'ஜமேக்கா', + 'JO' => 'ஜோர்தான்', + 'JP' => 'ஜப்பான்', + 'KZ' => 'கசக்கஸ்தான்', + 'KE' => 'கென்யா', + 'KG' => 'கிர்கிசுத்தான்', + 'KH' => 'கம்போடியா', + 'KI' => 'கிரிபட்டி', + 'KN' => 'செயிண்ட். கிட்ஸ் நெவிஸ்', + 'KR' => 'தென் கொரியா', + 'KW' => 'குவைத்', + 'LA' => 'லாவோஸ்', + 'LB' => 'லெபனான்', + 'LR' => 'லைபீரியா', + 'LY' => 'லிபியா', + 'LC' => 'செயிண்ட். லூசியா', + 'LI' => 'லெய்செஸ்டீன்', + 'LK' => 'இலங்கை', + 'LS' => 'லெசோத்தோ', + 'LT' => 'லித்துவேனியா', + 'LU' => 'லக்சம்பர்க்', + 'LV' => 'லாத்வியா', + 'MA' => 'மொரோக்கோ', + 'MC' => 'மொனாகோ', + 'MD' => 'மோல்டோவா', + 'MG' => 'மடகாஸ்கர்', + 'MV' => 'மாலைதீவுகள்', + 'MX' => 'மெக்சிகோ', + 'MH' => 'மார்ஷல் தீவுகள்', + 'MK' => 'மசிடோனியக் குடியரசு', + 'ML' => 'மாலி', + 'MT' => 'மால்ட்டா', + 'MM' => 'மியன்மார்', + 'ME' => 'மொண்டெனேகுரோ', + 'MN' => 'மங்கோலியா', + 'MZ' => 'மொசாம்பிக்', + 'MR' => 'மௌரித்தானியா', + 'MU' => 'மொரிசியசு', + 'MW' => 'மலாவி', + 'MY' => 'மலேசியா', + 'NA' => 'நமீபியா', + 'NE' => 'நைஜர்', + 'NG' => 'நைஜீரியா', + 'NI' => 'நிக்கராகுவா', + 'NL' => 'நெதர்லாந்து', + 'NO' => 'நோர்வே', + 'NP' => 'நேபாளம்', + 'NR' => 'நவூரு', + 'NZ' => 'நியூசிலாந்து', + 'OM' => 'ஓமான்', + 'PK' => 'பாகிஸ்தான்', + 'PA' => 'பனாமா', + 'PE' => 'பெரு', + 'PH' => 'பிலிப்பைன்ஸ்', + 'PW' => 'பலாவு', + 'PG' => 'பப்புவா நியூகினியா', + 'PL' => 'போலந்து', + 'KP' => 'வட கொரியா', + 'PT' => 'போர்த்துக்கல்', + 'PY' => 'பராகுவே', + 'QA' => 'கட்டார்', + 'RO' => 'உருமேனியா', + 'RU' => 'ரஷ்யா', + 'RW' => 'ருவாண்டா', + 'SA' => 'சவூதி அரேபியா', + 'SD' => 'சூடான்', + 'SN' => 'செனிகல்', + 'SG' => 'சிங்கப்பூர்', + 'SB' => 'சொலமன் தீவுகள்', + 'SL' => 'சியேரா லியோனி', + 'SV' => 'எல் சல்வடோர்', + 'SM' => 'சான் மரீனோ', + 'SO' => 'சோமாலியா', + 'RS' => 'செர்பியா', + 'SS' => 'தென் சூடான்', + 'ST' => 'சாவோ தொமே மற்றும் பிரின்சிப்பி', + 'SR' => 'சுரிநாம்', + 'SK' => 'சிலவாக்கியா', + 'SI' => 'சுலோவீனியா', + 'SE' => 'சுவீடன்', + 'SZ' => 'சுவாசிலாந்து', + 'SC' => 'சீசெல்சு', + 'SY' => 'சிரியா', + 'TD' => 'சாட்', + 'TG' => 'டோகோ', + 'TH' => 'தாய்லாந்து', + 'TJ' => 'தாஜிக்ஸ்தான்', + 'TM' => 'துருக்மெனிஸ்தான்', + 'TL' => 'திமோர்-லெஸ்தே', + 'TO' => 'டொங்கா', + 'TT' => 'ட்ரினிடாட்டும் டொபாகோவும்', + 'TN' => 'துனீசியா', + 'TR' => 'துருக்கி', + 'TV' => 'துவாலு', + 'TZ' => 'தான்ஸானியா', + 'UG' => 'உகாண்டா', + 'UA' => 'உக்ரைன்', + 'UY' => 'உருகுவை', + 'US' => 'ஐக்கிய அமெரிக்கா', + 'UZ' => 'உஸ்பெகிஸ்தான்', + 'VA' => 'வத்திக்கான் நகர்', + 'VC' => 'செயின்ட் வின்செண்டு மற்றும் கிரெனடீன்கள்', + 'VE' => 'வெனிசுவேலா', + 'VN' => 'வியட்நாம்', + 'VU' => 'வனுவாட்டு', + 'WS' => 'சமோவா', + 'YE' => 'யேமன்', + 'ZA' => 'தென்னாபிரிக்கா', + 'ZM' => 'சாம்பியா', + 'ZW' => 'ஸிம்பாப்வே', +]; From e55019e8a54d81c5d122b35b775d8173c2efeaa5 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 1 Oct 2019 20:10:16 +0300 Subject: [PATCH 011/135] Replace Github with GitHub --- README.md | 46 ++++++++++++++-------------- app/views/console/comps/footer.phtml | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index d6568bc8e0..a82d9c2a24 100644 --- a/README.md +++ b/README.md @@ -100,26 +100,26 @@ We really ❤️ pull requests! If you wish to help, you can learn more about ho Created by [Eldad Fux](https://twitter.com/eldadfux) with the amazing help of our **amazing contributors:** -* 🇺🇸 Justin Dorfman ([Github](https://github.com/jdorfman), [Twitter](https://twitter.com/jdorfman)) -* 🇺🇳 0xflotus ([Github](https://github.com/0xflotus)) -* 🇳🇴 Petter Charles Redfern ([Github](https://github.com/Chaaarles)) -* 🇧🇷 Jessé Souza ([Github](https://github.com/jessescn)) -* 🇪🇸 Esther Álvarez Feijoo ([Github](https://github.com/EstherAF)) -* 🇮🇳 Christy Jacob ([Github](https://github.com/christyjacob4), [Linkedin](https://www.linkedin.com/in/christyjacob4/)) -* 🇺🇦 Dmitriy Danilov ([Github](https://github.com/daniloff200), [Twitter](https://twitter.com/daniloff200)) -* 🇮🇩 Zeet ([Github](https://github.com/Kiy4h)) -* 🇫🇮 Pessi Päivärinne ([Github](https://github.com/pessip)) -* 🇺🇳 Sergi Vos ([Github](https://github.com/sergivb01), [Twitter](https://twitter.com/sergivb01), [Linkedin](https://www.linkedin.com/in/sergivb01/)) -* 🇮🇱 Tomer Cohen ([Github](https://github.com/tomer), [Twitter](https://twitter.com/tomer)) -* 🇧🇷 Tatiana ([Github](https://github.com/tacoelho)) -* 🇬🇷 Panagiotis Skarlas ([Github](https://github.com/1qk1), [Twitter](https://twitter.com/qktweets)) -* 🇷🇺 Alexey Pyltsyn ([Github](https://github.com/lex111)) -* 🇩🇪 Robin C ([Github](https://github.com/Taminoful)) -* 🇮🇳 Parikshit Hooda ([Github](https://github.com/Parikshit-Hooda)) -* 🇫🇷 Corentin Le Fur ([Github](https://github.com/crtlf)) -* 🇬🇧 Callum Lowry ([Github](https://github.com/Girxffe)) -* 🇷🇴 Bogdan Covrig ([Github](https://github.com/BogDAAAMN), [Twitter](https://twitter.com/BogdanCovrig)) -* 🇳🇱 Kolkies ([Github](https://github.com/kolkies.dev)) -* 🇹🇷 Mustafa Dur ([Github](https://github.com/tosbaha)) -* 🇵🇹 Luís Pinto ([Github](https://github.com/LiTO773)) -* 🇮🇳 Saksham Saxena ([Github](https://github.com/sakkshm)) +* 🇺🇸 Justin Dorfman ([GitHub](https://github.com/jdorfman), [Twitter](https://twitter.com/jdorfman)) +* 🇺🇳 0xflotus ([GitHub](https://github.com/0xflotus)) +* 🇳🇴 Petter Charles Redfern ([GitHub](https://github.com/Chaaarles)) +* 🇧🇷 Jessé Souza ([GitHub](https://github.com/jessescn)) +* 🇪🇸 Esther Álvarez Feijoo ([GitHub](https://github.com/EstherAF)) +* 🇮🇳 Christy Jacob ([GitHub](https://github.com/christyjacob4), [Linkedin](https://www.linkedin.com/in/christyjacob4/)) +* 🇺🇦 Dmitriy Danilov ([GitHub](https://github.com/daniloff200), [Twitter](https://twitter.com/daniloff200)) +* 🇮🇩 Zeet ([GitHub](https://github.com/Kiy4h)) +* 🇫🇮 Pessi Päivärinne ([GitHub](https://github.com/pessip)) +* 🇺🇳 Sergi Vos ([GitHub](https://github.com/sergivb01), [Twitter](https://twitter.com/sergivb01), [Linkedin](https://www.linkedin.com/in/sergivb01/)) +* 🇮🇱 Tomer Cohen ([GitHub](https://github.com/tomer), [Twitter](https://twitter.com/tomer)) +* 🇧🇷 Tatiana ([GitHub](https://github.com/tacoelho)) +* 🇬🇷 Panagiotis Skarlas ([GitHub](https://github.com/1qk1), [Twitter](https://twitter.com/qktweets)) +* 🇷🇺 Alexey Pyltsyn ([GitHub](https://github.com/lex111)) +* 🇩🇪 Robin C ([GitHub](https://github.com/Taminoful)) +* 🇮🇳 Parikshit Hooda ([GitHub](https://github.com/Parikshit-Hooda)) +* 🇫🇷 Corentin Le Fur ([GitHub](https://github.com/crtlf)) +* 🇬🇧 Callum Lowry ([GitHub](https://github.com/Girxffe)) +* 🇷🇴 Bogdan Covrig ([GitHub](https://github.com/BogDAAAMN), [Twitter](https://twitter.com/BogdanCovrig)) +* 🇳🇱 Kolkies ([GitHub](https://github.com/kolkies.dev)) +* 🇹🇷 Mustafa Dur ([GitHub](https://github.com/tosbaha)) +* 🇵🇹 Luís Pinto ([GitHub](https://github.com/LiTO773)) +* 🇮🇳 Saksham Saxena ([GitHub](https://github.com/sakkshm)) diff --git a/app/views/console/comps/footer.phtml b/app/views/console/comps/footer.phtml index 13b1b3e785..bde82eeb0e 100644 --- a/app/views/console/comps/footer.phtml +++ b/app/views/console/comps/footer.phtml @@ -4,7 +4,7 @@ $home = $this->getParam('home', '');
-
\ No newline at end of file + diff --git a/docker/nginx.conf b/docker/nginx.conf index d92e24fbb4..db1dc8c20f 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -88,7 +88,7 @@ http { add_header Cache-Control "public"; } - # CSS and Javascript + # CSS and JavaScript location ~* \.(?:css|js)$ { expires 1y; access_log off; @@ -145,4 +145,4 @@ http { deny all; } } -} \ No newline at end of file +} From 753bbd9995614ba97a1b61f5d1fc615114894a33 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Wed, 2 Oct 2019 22:04:19 +0300 Subject: [PATCH 048/135] Updated credits --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f026c6c26b..e3590efe12 100644 --- a/README.md +++ b/README.md @@ -124,3 +124,4 @@ Created by [Eldad Fux](https://twitter.com/eldadfux) with the amazing help of ou * 🇵🇹 Luís Pinto ([GitHub](https://github.com/LiTO773)) * 🇮🇳 Saksham Saxena ([GitHub](https://github.com/sakkshm)) * 🇮🇱 Dima Vishnevetsky ([GitHub](https://github.com/dimshik100), [Twitter](https://twitter.com/dimshik100)) +* 🇭🇺 lacexd ([GitHub](https://github.com/lacexd)) From 0f992ce41757dc3cf7fc574c45ec77184fc23fb2 Mon Sep 17 00:00:00 2001 From: Bogdan Covrig Date: Thu, 3 Oct 2019 00:30:52 +0200 Subject: [PATCH 049/135] Add Slack logo icon --- public/images/oauth/slack.png | Bin 0 -> 20144 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/oauth/slack.png diff --git a/public/images/oauth/slack.png b/public/images/oauth/slack.png new file mode 100644 index 0000000000000000000000000000000000000000..13f9ae1ffd1d9d954ab9c15637fb6176ca708de6 GIT binary patch literal 20144 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 a2^1V=87Td1GP?DzqBM?aA+wdw`Tai|ojeZ! literal 0 HcmV?d00001 From 5997df1417381d2952e005d5c5d4571cc3db90f8 Mon Sep 17 00:00:00 2001 From: Bogdan Covrig Date: Thu, 3 Oct 2019 00:34:53 +0200 Subject: [PATCH 050/135] Updated Slack logo icon transparancy --- public/images/oauth/slack.png | Bin 20144 -> 22351 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/oauth/slack.png b/public/images/oauth/slack.png index 13f9ae1ffd1d9d954ab9c15637fb6176ca708de6..9de2cbc5b3a4be8b5dc01d97b35bd3d0b1935093 100644 GIT binary patch delta 6576 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 delta 4351 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 Date: Thu, 3 Oct 2019 00:36:57 +0200 Subject: [PATCH 051/135] Add Swedish templates --- .../templates/sv.email.auth.confirm.tpl | 24 +++++++++++++++++ .../templates/sv.email.auth.invitation.tpl | 27 +++++++++++++++++++ .../templates/sv.email.auth.recovery.tpl | 24 +++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 app/config/locale/templates/sv.email.auth.confirm.tpl create mode 100644 app/config/locale/templates/sv.email.auth.invitation.tpl create mode 100644 app/config/locale/templates/sv.email.auth.recovery.tpl diff --git a/app/config/locale/templates/sv.email.auth.confirm.tpl b/app/config/locale/templates/sv.email.auth.confirm.tpl new file mode 100644 index 0000000000..0b1e4451ff --- /dev/null +++ b/app/config/locale/templates/sv.email.auth.confirm.tpl @@ -0,0 +1,24 @@ + + +
+ Hej {{name}}, +
+
+ Vänligen följ länken nedan för att verifiera din epostadress. +
+ {{redirect}} +
+
+ Om du inte vill verifiera din epostadress så kan du ignorera detta meddelande. +
+
+ Tack, +
+ {{project}}-teamet +
\ No newline at end of file diff --git a/app/config/locale/templates/sv.email.auth.invitation.tpl b/app/config/locale/templates/sv.email.auth.invitation.tpl new file mode 100644 index 0000000000..604e94227d --- /dev/null +++ b/app/config/locale/templates/sv.email.auth.invitation.tpl @@ -0,0 +1,27 @@ + + +
+ Hej, +
+
+ {{owner}} vill bjuda in dig att bli del av {{team}}-teamet inom {{project}}. +
+
+ Följ denna länk för att bli del av {{team}}-teamet: +
+ {{redirect}} +
+
+ Om du inte är intresserad så kan du ignorera detta meddelande. +
+
+ Tack, +
+ {{project}}-teamet +
diff --git a/app/config/locale/templates/sv.email.auth.recovery.tpl b/app/config/locale/templates/sv.email.auth.recovery.tpl new file mode 100644 index 0000000000..dba9221559 --- /dev/null +++ b/app/config/locale/templates/sv.email.auth.recovery.tpl @@ -0,0 +1,24 @@ + + +
+ Hej {{name}}, +
+
+ Följ denna länk för att ändra ditt {{project}} lösenord. +
+ {{redirect}} +
+
+ Om du inte bett om att ändr ditt lösenord så kan du ignorera detta meddelande. +
+
+ Tack, +
+ {{project}}-teamet +
From 594aec163afc66b0d0fa69bc7d08d721b7cff6da Mon Sep 17 00:00:00 2001 From: Simon B Date: Thu, 3 Oct 2019 01:28:56 +0200 Subject: [PATCH 052/135] Add Swedish country and continent names, and link up the new translations --- app/config/locale/sv.continents.php | 11 ++ app/config/locale/sv.countries.php | 198 ++++++++++++++++++++++++++++ app/config/locale/sv.php | 21 +++ 3 files changed, 230 insertions(+) create mode 100644 app/config/locale/sv.continents.php create mode 100644 app/config/locale/sv.countries.php create mode 100644 app/config/locale/sv.php diff --git a/app/config/locale/sv.continents.php b/app/config/locale/sv.continents.php new file mode 100644 index 0000000000..ba158cccfe --- /dev/null +++ b/app/config/locale/sv.continents.php @@ -0,0 +1,11 @@ + 'Afrika', + 'AN' => 'Antarktis', + 'AS' => 'Asien', + 'EU' => 'Europa', + 'NA' => 'Nordamerika', + 'OC' => 'Oceanien', + 'SA' => 'Sydamerika', +]; diff --git a/app/config/locale/sv.countries.php b/app/config/locale/sv.countries.php new file mode 100644 index 0000000000..7bfc8f22a2 --- /dev/null +++ b/app/config/locale/sv.countries.php @@ -0,0 +1,198 @@ + 'Afganistan', + 'AO' => 'Angola', + 'AL' => 'Albanien', + 'AD' => 'Andorra', + 'AE' => 'Förenade Arabemiraterna', + 'AR' => 'Argentina', + 'AM' => 'Armenien', + 'AG' => 'Antigua och Barbuda', + 'AU' => 'Australien', + 'AT' => 'Österrike', + 'AZ' => 'Azerbajdzjan', + 'BI' => 'Burundi', + 'BE' => 'Belgien', + 'BJ' => 'Benin', + 'BF' => 'Burkina Faso', + 'BD' => 'Bangladesh', + 'BG' => 'Bulgarien', + 'BH' => 'Bahrain', + 'BS' => 'Bahamas', + 'BA' => 'Bosnien och Hercegovina', + 'BY' => 'Vitrysslnd', + 'BZ' => 'Belize', + 'BO' => 'Bolivien', + 'BR' => 'Brasilien', + 'BB' => 'Barbados', + 'BN' => 'Brune', + 'BT' => 'Butan', + 'BW' => 'Botswana', + 'CF' => 'Centralafrikanska republiken', + 'CA' => 'Kanada', + 'CH' => 'Schweiz', + 'CL' => 'Chile', + 'CN' => 'Kina', + 'CI' => 'Elfenbenskusten', + 'CM' => 'Kamerun', + 'CD' => 'Kongo-Kinshasa', + 'CG' => 'Kongo-Brazzaville', + 'CO' => 'Colombia', + 'KM' => 'Komorerna', + 'CV' => 'Kap Verde', + 'CR' => 'Costa Rica', + 'CU' => 'Kuba', + 'CY' => 'Cypern', + 'CZ' => 'Tjeckien', + 'DE' => 'Tyskland', + 'DJ' => 'Djibouti', + 'DM' => 'Dominica', + 'DK' => 'Danmark', + 'DO' => 'Dominikanska republiken', + 'DZ' => 'Algeriet', + 'EC' => 'Ekvador', + 'EG' => 'Egypten', + 'ER' => 'Eritrea', + 'ES' => 'Spanien', + 'EE' => 'Estonia', + 'ET' => 'Etiopien', + 'FI' => 'Finland', + 'FJ' => 'Fiji', + 'FR' => 'Frankrike', + 'FM' => 'Mikronesien', + 'GA' => 'Gabon', + 'GB' => 'Storbrittannien', + 'GE' => 'Georgien', + 'GH' => 'Ghana', + 'GN' => 'Guinea', + 'GM' => 'Gambia', + 'GW' => 'Guinea-Bissau', + 'GQ' => 'Ekvatorialguinea', + 'GR' => 'Grekland', + 'GD' => 'Grenada', + 'GT' => 'Guatemala', + 'GY' => 'Guyana', + 'HN' => 'Honduras', + 'HR' => 'Kroatien', + 'HT' => 'Haiti', + 'HU' => 'Ungern', + 'ID' => 'Indonesien', + 'IN' => 'Indien', + 'IE' => 'Irland', + 'IR' => 'Iran', + 'IQ' => 'Irak', + 'IS' => 'Island', + 'IL' => 'Israel', + 'IT' => 'Italien', + 'JM' => 'Jamaika', + 'JO' => 'Jordanien', + 'JP' => 'Japan', + 'KZ' => 'Kazakstan', + 'KE' => 'Kenya', + 'KG' => 'Kirgizistan', + 'KH' => 'Kambodja', + 'KI' => 'Kiribati', + 'KN' => 'Saint Kitts och Nevis', + 'KR' => 'Sydkorea', + 'KW' => 'Kuwait', + 'LA' => 'Laos', + 'LB' => 'Libanon', + 'LR' => 'Liberien', + 'LY' => 'Libyen', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LS' => 'Lesotho', + 'LT' => 'Litauen', + 'LU' => 'Luxemburg', + 'LV' => 'Latvien', + 'MA' => 'Marocko', + 'MC' => 'Monaco', + 'MD' => 'Moldavien', + 'MG' => 'Madagaskar', + 'MV' => 'Maldiverna', + 'MX' => 'Mexiko', + 'MH' => 'Marshall Islands', + 'MK' => 'Nordmakedonien', + 'ML' => 'Mali', + 'MT' => 'Malta', + 'MM' => 'Myanmar', + 'ME' => 'Montenegro', + 'MN' => 'Mongolien', + 'MZ' => 'Moçambique', + 'MR' => 'Mauritanien', + 'MU' => 'Mauritius', + 'MW' => 'Malawi', + 'MY' => 'Malaysia', + 'NA' => 'Namibia', + 'NE' => 'Niger', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Nederländerna', + 'NO' => 'Norge', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NZ' => 'Nya Zealand', + 'OM' => 'Oman', + 'PK' => 'Pakistan', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PH' => 'Filppinerna', + 'PW' => 'Palau', + 'PG' => 'Papua New Guinea', + 'PL' => 'Polen', + 'KP' => 'Nordkorea', + 'PT' => 'Portugal', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RO' => 'Rumänien', + 'RU' => 'Ryssland', + 'RW' => 'Rwanda', + 'SA' => 'Saudiarabien', + 'SD' => 'Sudan', + 'SN' => 'Senegal', + 'SG' => 'Singapor', + 'SB' => 'Solomonöarna', + 'SL' => 'Sierra Leone', + 'SV' => 'El Salvador', + 'SM' => 'San Marino', + 'SO' => 'Somalien', + 'RS' => 'Serbien', + 'SS' => 'Sydsudan', + 'ST' => 'São Tomé och Príncipe', + 'SR' => 'Surinam', + 'SK' => 'Slovakien', + 'SI' => 'Slovenien', + 'SE' => 'Sverige', + 'SZ' => 'Swaziland', + 'SC' => 'Seychellerna', + 'SY' => 'Syrien', + 'TD' => 'Tchad', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tadzjikistan', + 'TM' => 'Turkmenistan', + 'TL' => 'Timor-Leste', + 'TO' => 'Tonga', + 'TT' => 'Trinidad och Tobago', + 'TN' => 'Tunisien', + 'TR' => 'Turkiet', + 'TV' => 'Tuvalu', + 'TZ' => 'Tanzania', + 'UG' => 'Uganda', + 'UA' => 'Ukraina', + 'UY' => 'Uruguay', + 'US' => 'Amerikas Förenta Stater', + 'UZ' => 'Uzbekistan', + 'VA' => 'Vatikanstaten', + 'VC' => 'Sankt Vincent och Grenadinerna', + 'VE' => 'Venezuela', + 'VN' => 'Vietnam', + 'VU' => 'Vanuatu', + 'WS' => 'Samoa', + 'YE' => 'Jemen', + 'ZA' => 'Sydafrika', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/app/config/locale/sv.php b/app/config/locale/sv.php new file mode 100644 index 0000000000..9f34de341a --- /dev/null +++ b/app/config/locale/sv.php @@ -0,0 +1,21 @@ + '"The art of being wise is the art of knowing what to overlook."', // This is the line printed in the homepage and console 'view-source' + 'settings.locale' => 'sv', + 'settings.direction' => 'ltr', + + // Service - Users + 'auth.emails.team' => '%s-teamet', + 'auth.emails.confirm.title' => 'Kontobekräftelse', + 'auth.emails.confirm.body' => 'sv.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => 'Ändra lösenord', + 'auth.emails.recovery.body' => 'sv.email.auth.recovery.tpl', + 'auth.emails.invitation.title' => 'Inbjudan till %s-teamet i %s', + 'auth.emails.invitation.body' => 'sv.email.auth.invitation.tpl', + + 'locale.country.unknown' => 'Okänt', + + 'countries' => include 'sv.countries.php', + 'continents' => include 'sv.continents.php', +]; From 6d2af65bbc6bb2012dd2c6ee987c94a9679ff019 Mon Sep 17 00:00:00 2001 From: Bogdan Covrig Date: Thu, 3 Oct 2019 01:43:54 +0200 Subject: [PATCH 053/135] Add Slack provider --- app/config/providers.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/config/providers.php b/app/config/providers.php index 01b7b6b429..7b7402f71a 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -46,4 +46,9 @@ return [ 'icon' => 'icon-linkedin', 'enabled' => true, ], + 'slack' => [ + 'developers' => 'https://api.slack.com/', + 'icon' => 'icon-slack', + 'enabled' => true, + ], ]; From 2d1ff748f23b07449336dd04f7f60c86ba6d5b45 Mon Sep 17 00:00:00 2001 From: Bogdan Covrig Date: Thu, 3 Oct 2019 01:45:06 +0200 Subject: [PATCH 054/135] [WIP] Add Slack accestoken and code functions --- src/Auth/OAuth/Slack.php | 125 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 src/Auth/OAuth/Slack.php diff --git a/src/Auth/OAuth/Slack.php b/src/Auth/OAuth/Slack.php new file mode 100644 index 0000000000..a50f82e33a --- /dev/null +++ b/src/Auth/OAuth/Slack.php @@ -0,0 +1,125 @@ +appID). + '&scope='.urlencode("identity.avatar,identity.basic,identity.email,identity.team"). + '&redirect_uri='.urlencode($this->callback); + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code):string + { + $accessToken = $this->request( + 'GET', + 'https://slack.com/api/oauth.access'. + '?client_id='.urlencode($this->appID). + '&client_secret='.urlencode($this->appSecret). + '&redirect_uri='.urlencode($this->callback). + '&code='.urlencode($code) + ); + + $accessToken = json_decode($accessToken, true); // + + if (isset($accessToken['access_token'])) { + return $accessToken['access_token']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserID(string $accessToken):string + { + $user = $this->getUser($accessToken); + + if (isset($user['user']['id'])) { + return $user['user']['id']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken):string + { + $user = $this->getUser($accessToken); + + if (isset($user['user']['email'])) { + return $user['user']['email']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken):string + { + $user = $this->getUser($accessToken); + + if (isset($user['user']['name'])) { + return $user['user']['name']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken):array + { + if (empty($this->user)) { + $user = $this->request( + 'GET', + 'https://slack.com/api/users.identity&token='.urlencode($accessToken)); + + $this->user = json_decode($user, true); + } + + return $this->user; + } +} + +//http://localhost:8080/v1/auth/oauth/slack?project=5d94eda5e2b8a&success=http://localhost:8080/?success=1&failure=http://localhost:8080/auth/signin?failure=2 From c6f6cdca0a65dfa86cc387d82a766a3ce39c51c7 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Thu, 3 Oct 2019 06:51:55 +0300 Subject: [PATCH 055/135] Updated docs --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7242dcdd3c..a1d0e90ec4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -93,10 +93,10 @@ This is also important for the Appwrite lead developers to be able to give techn ## Setup -To set up a working development environment just clone the project git repository and install the backend and frontend dependencies using the proper package manager and create run the docker-compose stack. +To set up a working development environment just fork the project git repository and install the backend and frontend dependencies using the proper package manager and create run the docker-compose stack. ```bash -git clone git@github.com:appwrite/appwrite.git +git clone git@github.com:[YOUR_FORK_HERE]/appwrite.git cd appwrite From 581b2ef4c6ba223ead844053a6d5d647c14f9b8b Mon Sep 17 00:00:00 2001 From: Carike Blignaut-Staden Date: Thu, 3 Oct 2019 16:37:25 +0200 Subject: [PATCH 056/135] Delete .vs/slnx.sqlite Not required --- .vs/slnx.sqlite | Bin 217088 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .vs/slnx.sqlite diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite deleted file mode 100644 index b77903a9763386620c65deb696b7d2306bb6741f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217088 zcmeFa2YegH(Kmd+9S%4EcPEmf*hQ+7l0Xt9!6I3fD3X$>LN!vdEXgzofFvZ4pa4+C zHFPg=jpHK6l5M&7?!+~5w__)99LJ8G>bR#TPO+Wx&d%HccSkDrlYCFU_kAAlC+&ZC zc6M)Ow%pz9;&$Wu)zMU>qCcJ(3Z^RRxk;SO#x1F+;5e=o{s-W{{+9<4K~DhM4DrK7 zTe)gStAjDCpE90Y^;7Rn-btQS?(?N{U2i&haXo*L{bTzE`^v*rk){8?VF6JUQP8oO zinCy|&o;I`IvkGd-MDY4FCJ@;^hbxIsc3w-m!iW1%c8MJXSla>A||zMLq}_OM@45> zd&f}~TR&GF+hunJ{H^U8&%eE*a;y2W+pEU%WoJPfh`D@XF}s38k%@&bGDTf2HS)3s}DTkFP-s?!&FodrIh?Hpe!*cXdfRkx;PO_=W1rK>w8&|G#`l3m6b zu`|3K?AzV3ykkSfx(%IcS~qN|SkE8&J*!vG*J@dpi0_Vu zBMD<^orhRhBW&nc*0G_ZtF2>W#a6vU$8ai|+PA$jO@Jz@GDV=>de*fwLx36DTH8BJ zS?wLGJ2F|iFl4~4O|2W+R+CZm1P7*jEARx6vO502x@sBAPK8z>w1B~y{1v3_wR ztK*>{8=o8Edk(LF&eRrKRUK`)G}UL02_X(%{697(hVLxYjt@uJfx zvoddBj<>;rjZBvt}8`%;y+! zT7ym`^SGX48gY2t&+ah)UVqVtwNWX(zni4d8PlCtCyX2a6A$w4eIqbS>NAyo34P>s zM~5QGRB&iydj*?3x;xjvObYWA>xn+eSx{4DJ4MBws9%=V*UJK(K!UloX6@e%-XHpQkWuvIS0OL5ELoGHXZfT^CG5hEu(4 z+P3DoCTu?|m$3#zQ(D>B1H(jj=lO6uLlLY6SYIAnDmn{x!pyfXGxHfnp?2xzdGf5k) zWtG!m9w63i!w|7%{cA&oWX|;R&+#O3*fz+_bvTc)=PCC0FFX?bdoz4zlG$c^#nR64 zkAbU$$<*4uWF)aW0*^(RnOA#StZ468*4neWyCO82z!96$r)e1Eao$Il&l(CZgUotl-N#*V4a$58rV&BY}KfSE~iocV?AwCFg6P9Xz86j z@V1uYmLU}6$(;JW`nY-{M6!Qb3uG;jwLsPaSqo$>khMV80$B@WEs(Xq{~`;VK1pzJ z3(p>9FS(tW<*AM2#!l91e?EqmAd?sA3%7(L4Zga%P{h|z*X;KN1K~zrsIRuExv8Zg z(g5VTKy71VI8^6r?DL0xet)>d*Afo&u{y&o^?~M=V1J{puCXrQ@AEesn1cObD^p)X zLrWOA4K+1HLgt$4Bau*TV_nGSZ)mLdH8eHX`hxYLurJaW@JDJ}0!@t(AotbRg&Lci zd?0ej*AQw9`+{{rzpp;r+|8tWs$<~m<6QU`j60=`hBt`?ZW zL0^kMSPPeHXb3hn20)g6U#PLJxv?n}@-;REn|%!}p+;Y@C0y&P>x=Z)H@1YE`}&)F zAWuVcBv9)MHMhX!LV<{{xv{a)*VO2b)P+IfT7SeBZmILvg#uw;OH&{SHASGNra--~ zu0PP+*w^3JU)uyV^@o}QE&di?b2tdv^)-Ziec^_H&)*mb*Y$<^8~YpmzDR#dbEL1O z*4NkH(g$q^P2JZQsPok}*Vfk6)`nVwaP9uO`fy*Mug=#Lu5G3U4mQ=cXwA~s7-^^v z`TCo}5hf#CBn(|8QWx|E{q=D5x;kk0rWUYQWC|~EH7a&S@U61NrndO#aLPZ&E^xm3 zwnQYDiiFoDdPc%5;;*f#_1DzZ`dcdejSFg<7t{u(*aU7)!A4kt847A%S$}nXbwF0n z;hbtaul_;(p?XlgS3O!ys_p-a276Z3tOc?b$XXz4fvg3x7RXv4Yk{lWL7ZJFIA8zTJ?*a{Jf*mFg`%8=0>Oa(>tc@F;NOV(O)dEnJ| zQ_)T^ezE|U!-@_2DmQ_wc~a(btk!%x@3Ut}R9tx0W8+I~+8zYK4dn#&CQf}reM-Ga z{mti8Im?!{K-L0T3uG;jwLsPaSqo$>khMV80$B@WEs(W9)&lc61Q0wwl8>VCk4s4c%N~mCHRTkIIYe$6K*hqq zn;81wXD23x@-e%}`7$*GVpXv0vG~9~-$){|I~v(zlB;Zp+Jq|dMdL|R_S6`)$*$2< zq%RTQ18SS{i*}M6BcuKBsR&b6$qwqFBk>r>kusa3G)l%A3C1E||G2qm;UF0~o&qD8 zDlHzM#*QcYqN&j#Q(j@eR%#@YFb|`t5z->ga(t=yXlT$>vMfwSp#0&8MVzvbF?(Dm zo8BjK^gM z-cII%j+Puvn1|bxZ8SDOU{h_yTdB-YbTAc<$IN+0Yk9%FsX>brrCX>;W6^=Z)G+)w z&{VSUD3WnUG8{KIThV6fLeWqJzGYx4G<6fTTQn5xn`o34_E4q$@zAJ6@oo~dKbnYG zXUFLqsV%fT-!Kz6X6~Q!H_#x`dD1QBi-hrmC?+|}*VA;ObB}AgqIINWe=xSwVzz>{ zG}A;zqUL$6q>IK+Bo+y!64p{{v{K;#^TaiEHJK~|8Q2YdbtX}#uCnI)P5DJDNz!mU z4&N~`WfgalO~Y}xPgy$6)D={1=w}aK6!KwcDqFOistqMZ;dlS0to&s(t%uCrqOgP7 zHWZ8QI?hy}q@4^C8cf88qLxXZs7<>N%QVYhu~g)0V4PyPh!2)wf(di0Pi@t-z{2B4 zalsO@dI)~bZW5_zFNb}rMcqHl3mk91Q%Tu^W%ZWvk=9^5>5n6ST;7-dVQMix_ z1$PH6GR#>Za*IGccv4BkqhTLBGO*cxycW}2sQ(9tg2%;&C%zLEH&a^&!+o)M$Shrc z6EzsSRSb^I)}Mz88%eVMSa86cGdUn~1vZz6ImrL~yn@Q|1{yS>1RGM&9Eq^GSV=u= zXP0PXNMEg_jyi#MQ!yomo&# zEuReUG-nk0Nb5vAW+_rSU%SO=-`+8oE1E}5JOb0GrC|PCW?z>GhKIW&itv2p#?t&M zGJ9myBz9RP-8JYp+o7nXvZ-^lE*+1tc?519W;v$JW_JOX2>mG)OeE6^7tbO~!Dvmv z+`1zfA1=`?RWOr`Q9Te%?Tkc5(iu}`P-T1K3Fx;;2P^P=rBE_?I&}cn9}U!LL`?;g zJ2TY03X#hPftaP!6%>@y71`IQnD&^#9^G@Mid+tGhx>?k_6ye+modqq+r)=q+61k2 zK_D-`luQeG{n3GREt5+~k`VjWO`1BTm~N24krC51^NN6*bBQVVgh>)roL!g=lU*jyhohLaqRxF zfE#jrq4>~9JQ=Cpml1!mm-HnLR_=MIvCIP<7Rt4)?dsmpxwNOdvunA*NF{CDMfgESW}yD_kT{+uHVy-nGkm;R5YFZQX{t3*jx1DFdIS>RR5h(U3ERy&ytP z-)J-zu1*f>7tDdzL)N^|MbadAD`ceV-D$%W!FwQU!s-;<1ENXI2Jp68dsY{O)n^Vs zIQNW`A)Ir@TnJ~Lz7WD0r>%f+>ZwOTSa!;B5Eh;S0aq~Qw5uyQQH2SM<7TVf>N{$U zI-*{seofpZM#L@R8nM;;vhyVGePTfUx^lW$C6+mNiaDag@v-*?`4h*l96y71@8=zl z!u$92-pd?Uz+3p3W7H9KZ1y6uSS&- zwMRKtSS0)9QqQjhzx;|YODGa#c+3Bz=LgCb{sZR%XC?n5{$>7Y{%h(=wO*a6mUy1` zJjCD5U*oyKbFt@i{>%K?{E42Fv&1vN@8bLTP5esvIsQn`QGA`J%`?p-xj*J-^Tl$m zEbt0%cmKlvC;Nx?H|#IiAF|(KKVZMueun)x`>?&wzRAAQex$w5KHFYwSL}A%pHz?2 z<$lfmoU&T{)cuh15BE*-qvCt+%iU+WPY}QFj=7I_hacs zC5sR%5&0b@>i5crBNxU+$oe}RLbJe(J%Eu}-;+I_>=cmpOoIg}%IG=Ie?fi=Ki>%o> z&chek2k^mz`v~JOl@AYaf514tOK`u(_%5XX4&yL)0ncwSjt~0WZ!nHeTimZPjt}|V zuP}};liV*cj!!b&FEEae^W29R#}^6i1B~M{4fj6A(XGP0hjH{*aPO-8H2XlGZ%>S5 zeMd_tL!`&sT6#E2^8Z{*N9gr|dkgEr2S)B^EZ$FiKgBq{fO9{=IO+3ajN|hP_alt& zK>dG+ankKg7H4-+u*(}5Cs}@gagy_Og)g^9l0Hq$*D#AN{e6s+X*e_w6>U@#KLsZW z#_pm+Vw}3mBN(SH@-W89J`Z7>n)quh-bXrq72~AigBT~h9>6&1bw9?b`R>CwHQ&7$ zCmrv>I1P!rF;4p4g>lmNPK=YjcVL|Ky&dD!7Pn!X^t~11r0*>lCw*_mIO%&6#;NUY z#5n1G1IB51T#s?m{W=y8lJ18vPHlQE#!2^UFi!1wHO5KzgBT~>4`7^hzY61|`&Ted zx?hQL(sw_`N#83lPC8zWankEDjFVoMVx08)GR8@-OJu&x4!1Yb=1YZqy&WD{-~}TD zFN;CnNRXQH;vzm^heypF;0^VG<8fp}a}{tGP2y+R;hiivyo2hvFpsaY55dnlBMIGS z%U$5*OYA#BWWMur`8oE%C^%Bm`RB2GaIRpt|6&e5%N~vu$D^VfC+$ zdigS&?o&<4e7P;{M@{DNb0B5#ohF!SR#zx%#a(6m;&B=2_uLVMp9ZTdYk>9Lriar&ojpA&G&(H$@DS!(>hrZiw|uDE0Xb>EoZ}zd}Yg+ZPNa+4kn<{C)SPy(|)iv zw%|C<_q7zSX!dutGR<@!*AiAs#;>)QT{G>=IucX5|7sDkrhQgNu*|fdYGEnA$aXm2 z)B@Iy6ZoTAn0*XBsAi@-`JI|r?P*_Aqr?|bD!>}n=rUsO?hR-ggQKaQ5p?$ujXc$tieZA%eakxp&G`m`+};OBx(PT52pd6&u2a}OUBPLkLdt!t>D|4%cA7ZsbZtj z?8B+VrZM|%=CIMH`D$h}DGmOaSxhM1Co_{VYJQj*%sA+Kna*M<=5Lwi;`3313RX(@ ztCWj;jxF3bmDOzUpOj&rL!U`0s{#EaB`6B{MvAds<_{@iRLu!e=;ZTk;Q1(E21>g- zrm)J$$C1yjV{mLtW_C7uGxAuU)d(3EMlQRC=C{aURT!KVlbBx2L!mOOYiJqPu}a}!i~Eu?*!xtC4T>3dTjt3OtMpngyNHmv_Yt$tm7SbadfTfI%a zQN0#C1DC5`QqNbt;QunF}HKz8f$HG?wy45aqg}PKdLTyxQ)w%G_Jyk7Kb5*Y@ zs+{tP@{#gu<$dKX<%i1mmG6L;;0(vfj=hdujvbDWW1FML(dAg~SOVUHI>$W6Oh=hx zibHj{95&$-;Sa(u!CUZS;Wgnq!t=rt!o$LS!tKHh!a?D3;UeK2;Z)%SVN@6v283gU zEy4z2mC!CM5*mdXp;DM86e}+%PbrTnUsdi=Zc}bhu2%Ldmni2eXDO#BCn&p>5oL!G zR*q4QQZ^{7m1W8jWr5P5R4bLR-=S2QqD)fUiXi`8{)_y3`Iqv$@=xVA}7jrV=;&%AGVU-7;OJ18FWKIpy6d$adi@0H$5yytn(@Sg15>)qwu z;SG7Wd3(HF-sRpU-WG42cb<2qx6C`mt9o5to97eHA3VSGyyN+?=QYoFz|--B=V8x% zp4-9KanN(Q=OWmHajNG8&!}hEGvGPav&FN)v&z%%S>$Q-)Oaev+fnSv^LRZD_ut)r zcK_D>f%`4@o9^$qUvfX=e%$?4_ucMW+=tv>aevu;zWYq~7u@^Y3HMHS*uCAo$-UOS z!rkg#;I4Pi2am>7cY%A7TXNf_PoOqIE2N91 zbEVUy6Q$i!TpE;u($UgJX|>cL9Vssi;=!S`{G>sHrwuB%*^x-I~}$C&FlSJD-8MO??YHoMljI$cX$3tbH^pKG?O+*Rnx zak*W*^RLc7I)Cka&-qj551ikH9VJgWA9X(9ywiD;^BU)V=a-ycbe`@!$+^cl;*2`` zoLimU&Na?u&c)7Vr{6i(Im21%%y%kIr;`&u7Jo1PLVR2Nk@$V_+v0QLH^hg;d&S$t z>%{}&W#Wb6+2SeU@nT9G68pto@hEYJRz z@Swfnc*XIe<7vlZjt3ogIc|1b>$uW!iI6L}1v~!<|9k#J{w@9u{=57O{1f~`Y^bt7 zClB7HCvC54_&p6@(eS$(zO3PQH2k)P-_r0U4PVson;O0#@;3Wi+w%m^5j;!q48hX` zPZ2yx@C3m(2)<76IKg8Cj}kmW@G!wc1YaZgD#3#U4-ni>a38_F1osf!O>h^%odkCf z+)i*C!L0%Rf@=w`A-J00Ai)8Gs|dbAa3#Thf-49vC%BB@ zQi3lNT*4q=`x3#$1Q!upNN@qc`2^f^!JYCOC`WOoB5APA52x;8cQB2*wD$ zKyWg_NdzYnoIr3q!Eprp2=)@}A=phYN{}K*5+n$A5sVPT35E%V2x0^~33d=f2?hxU z2>J;k1Yv>@K_5Yo;8=oQf@27_6Ko^cN^ms67J{P)HWO?j=ppDP*hsK}U_HS)g0%!) z1ZxOZ6RaXwNzh5Kf?zqpGJ+0*c7is7r39@6O9&Pd97(W<;0S_+1PcgS2$~6+2pS0j z1PuiB1a$;{f?9$af@%UE!F+;w1ak?h2r3EY5X>f+MKF_K2ElZKX#^DnJt@CLyT2wo?6jo|wPuM&KZ z;1z=J61+_C9fEHYe2d^Ef)@$CN$>)}^90WkJWKEl!P5j!5j;uo1i?25zE1Es!D9rE z5Ff{a|q5RIE&y+f-@NSxzhb7*=992gBJcESZJjOcpw3 zU^pGaX&6>uSdQUT49hSq#jpg!Vu9yuMJy;}K>-V~-?b@eirD^SAK__zU?{ z_>>q?j^X=xct`U5ggn>`;BV+v z)~hR(#r7AyZ+l6{aX7aup+AgF8dODoqD7?Tb-hM zJ?lJ+?KACDJXP?nE7)DOPi((*|4uA*zh(Qe?Iqje@&)df-4D4hb)Vqg;r)j9Zuim3 zr=ru{?ygtnIR4_Eq5Rsd%BMKqlKv+BLi&;8+tN3shvAnCmr5r{ebO4K8QxiQCC+=D z>$l2l%G0hN%Da^NT+hqfm782&bzQ4mA+K?r2dnc(xtd*NN~wILOOod~KX!iTd_}oX zepNZuaW8lp_Bx+--s`-nK;%Ekq&0QY@L;aX#WdzDhSDi`3sM=4y33vjPc z3RhJF+;=fW>&^l0WlG_)Sb+NurEvW(zi!TX}Ui^DNXnLDTS-H0q#CZX&vESN@+)OFWE;mt1>jgJbO0&`pl)?qs z0Czp5G%H<)DO%GGaEBOZ*{jIL8mtK*M|t^Fc)G3c3G;$l68ifX4<(*1*IOv75be}Fjj)pUP9Uf;5w?vJ3T<`s2+ z*g(|R)cv6%7|9c@s{8v4Iq8*U>}^3qMd=QGED5Hst^0d1onBq{AA_nG*4O>pv0rE_ z?EY<-Z&+jZZzW1*mEC_dn#{D$?%#sfNw2i~k3!RD*4q7>(L$EhcK;?UmR@i7_u$10 zEAIYo)L&mYH>|n)H)3bebJDgkuDbg-U^mx!(pFlJ(q&fO{p+yb>uc}+wb)OLtMC3U z;?RHpvIf<$tibzMTd24O?_Y&i%dEotSE81Nb$EX#7PPFy`&VGW%v!vEISz4JjrT7@ z+ojjz{T(Q@aYf$WP8For z{YO$-U!V6cq5|m^djAo~kY1zrFPthYvK@An-oF6beu8y+e+ydBuu|`DM$>4&5oyBf zq*v=_H+qBu8?D#R4q%tCuGr6RAnO^{>}S^_NnfOAi>}i%wjaeXtlXE@Vj1Jw zeQ6Dr(O2(Ft5LS}`hBU7CLrSqe(8KPTxJcwbRKF)tN5jJF`@k~qY7sM^GbecB{ipc zEx&XQj&yA`zjQXrZdlJRnT3MtEBYlfkzN07#SAnd{i0$z#&KQWG0iRH!<5Z_JyC(> z^|gIRxl72g!Ro$aDqhL3zV9fbeoViLD8<_7w-6;HqV@}jVz*Gh+3ieYk&FbfEV-!9}$5o$CFyd)LRWI?&G&~6XI z$cH8QQE0}bFUihqhM&X10{l&E?VSr02{m^6KqQ3>>{qV+Y|fRbSqo$>khMV80$B@WEs(W9)&f}zWG#@j zK-L0T3;Y`vXn+I!dS-o|^8o#g)pgbWhU%7{j4>ia+6AoRdzJp$o|=18E{7iw;4@HK=25npp-W23LB(I2S`H}%!m z`Xh$-fBQV4Cr|pE@BeK5f0J|}2jBgFQ+-aoAAaM1fqH@(RX3?^@H_r8)vf$ld0Tl| zc~rSoxlB1t*`;h(I+cJjO_Ak~<#*(lfG^8q@{oMAyj*UOr^$-yj`DPP>fn3;ulr;7yY5%q zUw7Z`-VeVtPr)exUG9bMN_Rf|qWm|~52fd&2c$zFZ1yi}fvg3x7RXv4Yk{l^sokoO1M%95|Z-Nvkp>IFtfOD>EcGivmfV84?^lfut1~5}YrA zq~#eBoG5{$Wf>BjB!Q%k3<=JVKvH{#1SdxzsVzf-Gb50+G(&=8B9PRokvzT}I2i&- zOEM%l5dukzGbA_&0!c?^NO1N8k``r1aOMM&j>wSUyayyL%#h%q2P7@Xkl=U+B(-En zaI6E8nu#>|R*@mW zi3mt4&ye6K1SCz(kl_3SB$Z`IaP9$;N;4!l^8iUj84{d#fTTi=^yo+qoN<7p0*!RZ z`W!gc07>~75}atjNbqeY9HW!J(2@fO86fFnBIPZs&4D8fko1={DHl#JK)r9&^ai$E zIJ*F8*K0J_S<7;dtvi8*5<&$1W1~% zkrGGe!hr;=Bygo^li(l%8K$1eF1rJ}40|yBpNzRbq_y8n% zGbA`P07)K=v@DSWrvxC$t&z&ZIdD7xl3W=QoD6^@Cy|=pQ*+>C07kO!*GQNDIR{P# zK+@$zYV_QlW7kNR5vk^#zfH1%aiE~4;=Iluv-ST?@-3YDDSX%O4E2lfO}~%SU#ah^ zC#$>EpQx{^FT+;=pHv?K&%hn<1;DG-E7Tq8HZ`R7!1w-^t4q`twN9M}U;8Ul9){o9 ztEx-2!Pox&p!`yKNBJ@Q7XCZR^U4#-eah|d?Y)D_<;q3MIm)T<<-Jj5SQ$``Rkpx) z_f{$G$|9vvse!NVO;d`MJjJUx;G27YmVYaMAipKQ318fMNq$CtT>h$jHwc^k%UU37 zfvg3x7RXv4Yk{l*N`%Fo2uH3!ShO7Bh-C;1I}jGMBeb+3G%rPHYDH*Vf)H4Y z&~PL|{UU_ABM|%x5o#A8RJR~hH6v6uAocv)qpUw9$`iu!gN2vv|0xI4KS~Wt}H;fVhRKMRrv_>CsQhqeFrcvmuNYdn8Xr1 z9F)iaycG;4$q1?!LGd8SZUnD{;Bg_iod_-w!RcUN-!C9s&LdoA7kHaA$pK@=rhdvs zP6PM=zM!sy@8xmI>+rq&i{ab&o0KM{T(QZo$#=>p%Uj{hJ*W3a-lx1bdC&1~@>Y7i zo)0~bc=mga^Q`vx;0yAv!rJ}0?g965_iXqA{MX@2@5e}UU4M1G=(^UGaJ9N-I{yw| zUq9dsI~$$(;s@fx;+No@!6q>eP7-{{aie3*(eB6>-WI+loF!})Y6T~JJ@8@vVtzYc z3*Rez-F`Eiy0_IHu*s9)D(VHUf&vM-x)}oo{Plu!?lF)xXAV^WpMdCPhcooDuVR=I5`SH(5Go;x^8ET@_E3hU*6!`L_nVW&n zWNbXi0*#F^;1Z>>O~6%BLdM=mr!*0)^vieat+4gJIyJHKV;h^ z`MM44nra%mImOsJq&XXb9gPRIGbJ@%LzFQtkbD~q^=gW0yyg^RpDWE<5A4`Ypk7p1 zW2UaACm3^uRKE_GvDGypMiTKIaCUC*XcA6YWulk}tk4u`&RT=ynkCo=SqxFe=#l1h z85lJiFh)ZZ7`Z=7)7AhZHoPVV<6>85$XI?U%~@@zOVgX>8lsHx2hyxnz=%z+>(AJ< zamHed?b}k#N?@Be&(ydhv0$n{o*2>;(UYveQ<*p@61=&S6Qi0{2T*E1ZHHX;NJilr-KpG9@Fuqvm2jfHH;B+(sy)D{5jfC4g6zW(I&)?|dwqzC)FX z0hcJ1Gyqpo5t(B(o;O7yf34uGsfSFS{Kk6EJ@(sCe5z_e!UZ8m(aPXPoz`8y+W$1 z25!AAG|fWk?{JMHK$#<@I-jA8rd+1XI0BUMN%Q9$q@pI%4_r5=fP02iH_vbdP07p^ z#u1=Qo>V&*%IJ?TsCT9WX>LeE2^bJnP(mLN?Qp((UoaWbk-tW8POSt6Qt*Nk)dl=9I)A+$Bw|z{*HnEnfr3@0TjdAzy!7OGF0XnKqKp z5jZwW^QRiFmx$omr2FuKDRTU~IulB*UaRew+DwP&NnW7@PI~4kf&$3P&!_pR6~t!$`GbP9atdS^rw&bkBx_hbF7XGtrONzqoG_(F zQ+WGKMko%PtE9@w22O1Rsmao}u~rsn~tvCktLyEI0Cr&+4b1s=Vp>NNzDN%%Hj z*pdW(xHskizdiyqhGF<-t|1D1Go;E%@MSnJgOOl3lE}n>D_^P+em%=X@h! zOA`2HsX_pL-5$NY>=TQ<@J9$74yl9(4*l-i7K_43f)w)m1!sl*pBBH;A(h#HLvN{# zkpxVb5dwJSuZOp0j!U{i9Gv_29d)e==guo->Q?nf$`MMHe2zTR9rOIfbDnpVCm{U* zzIDIY^^yA}`F`~Xd6oAU?!}&OdAhy%9+z~R6m)&bb)5S$bvgVlV2}54IK}Ql`D5>i za-RHwyVqUip6s^EKa{`a`K9+|&k4%M-i7Yp%TK`mfM-0F(u>k%uJ_=4wCRuyCCJL79G$^jnH0$UIJK=clF_PZuITTSR4 ziVXDueK0zrDG_BH+Do>TgI@dwi}@B^O$)~W%bK`wKRel($!jbUVRCC0WArdf8^jCg zO0vv8gOV&AOe@J!$zz$4-7MCt8!Nruag2U(q<}@)BFJ{#_(;^(DYh9zVi{WvBC+(* zx=1Xs#UK((AC(q~rIMT3S=`$Cz$VtHnyQ*hy@!!BZ8cIitB_eqOK-%JTG(gvm- zwyj1;uGbaOUI@q+zs{ftb7-$MD8kZRx*{yG#-IpGuTCq%Qpr{9v~^8*-BY}h(KP9G zS|>ZBoQba!R^T!1B)?8u&U8WrbV_nr5#N-qi=30aFRgjnfjFNrYAupsoX5r@UME9K&Sgf_ zy>C@|tAeYok~Je!9-V4)^ghe{XS4Oz(p+Y}QBx_OoK9tI@z^z^{nO0~uq2E-iCvJzwZY>%Iq(3C#!w7lVUcOLrd#OhC<7V5HmKe2JvF0`UFc`$JCsrTUKgWA!!g z0z9uip+2nMr{1o9qW(d>0lo`(xq1auS8nsfL zrWUJts#kR=e~0e{{8sruc}say`JVEU@{IC0>?OEcxkWjod`0=Pa=vn=@&#p|l2CRk zVfdE7CS|R%LTObNDD}#GWtK8kDS(skB*iX&Dt{#ZN`6=ViTpZzW#9$*N%;}^e)$gh zM(_|^Azv(?E1xExDDRfz@}L}qZx3vgSIZspk#dtEqa(b zgq#2QL%8{$KZKkA`9td|Zyf<{{^t+j=70VWZvN*F;pTtX#78W+`JX@3NvRbCxcQ$y zgq#2QL%8{$KZKkA`9rw*pFf0~|6y|<6~N8^{2|=@&mY3g|NJ4`{Ldf4&Hwx%-2BfU z!p;BuwYd48zZN(D^Vj0$fBstB{Lf#DoB#Q1aq~Za4Q~GDuffg#{55{O-ZixZxcQ&I z1~>o1-YFvD=70Vg-2Bg9gPZ^PYpO8s>PiCK{Lf!aoByw-&Hq=^=Krf{^Z(Vf`Trno z{y#{Y{}0mU|AVyo{~&GtKWN(ge~>o+AEeFy2Wj*FLE8L(05|{h2XOO0e*icC^9S-! zqyxD7pFfa8sYwL1{r>=M|35(6|M%1O|NXT6e?M*i-!EZ-{VoF9{=c8L|L@1`|FBzt z@^Je-=_WeJ*x}Q^DgdqEuwLsPaSqo$>khMV80$B@WEs(W9)&f}zWG#@j zK-L2PVGGpSCC+B&TFMG+cKcPqk&$i5@XqA6Vc0~lEjk>I?5*CB)UiF%H#%UigP+2) z64O|T`RNinlG~Dr5GxHOAXY;$D#PCY-A+rH=Vq=p1;Wc zv3-Mm<$qZ9?B)I+w!qj-#aXb~XB%6Oy>sKfp}u&mJ<`v9(h`ji_fm9tU>R)s>kRjH zvaW1pQrk9kw03t?bau6O996N^nmu71+hunJ{H^U8&%eE*a;y2W+pEU%WoJPfh`D@X zF}q;P&&0whpCMePDslnt#xBZ)#;18&I0&x<~ct2m1QhqRo$AF zHDS72m#*%ZKy%q$Np=}$#Ln<`uy1$A@{SD^>o#<*Y2C1;VpYeMiq@X)wVhp1?V66R zZjcK8_pDw$U#kW7?(L4k52TExbsl12jj*9(S;vNsuC|Vi6B-oGy$rp z$`pZi>si;%3;||nYi;i^Wwm##?#N{6!jJ*GHnnbOThY3qvMvy)N(*eUt6pT;Xe_pG z{b(>2?T<#n6IEbt553$f=p`9@=^E>~@Y6T89l0+WV=AW2YGt$Z!Et;Um5l~u17+hr z`1R*d+JsgTGi61l^uJtW&kgZChgU#nYKzB4hla=V$?mGL8jrJ}7seI*h7CqG zN*W3d4@VMh!O&o&cf9B{%B+lD^C+`sAGRLDn6s9FzBm5r+pA9PapQ^yGYbk5m zV;*tVY`DHY;;dQ5G4nY_oYtTd$vm#-m_{64_p>|9zt>;%VQo}O@9!pQbjEb&)d}Oq z|HOm5d*2AmlKM=gUqT;w-O-^4{GecHWP1ghJi0sAz)TAB73+yU$yrcSWjjU1o~U1z z)z`}coj`)QwPx+<>RjKGzVqlj=|YC?rRQmi!97N&kjR#aB%QknenJ2PZQRU%3g>bb zz|Y4|U5NcquZ*fUrzCS9G-n!mpq^oDq|edwsAr@FCUr8?Z0%>xvifz?s(zlrtjQKQ zodq2}y~(T{xp!SK5gAVPvT56z=bEtntX#$#3{7ceV-E}y-JR#d?F>b*7GQmOY^mrh z*aopw`i&*Cau_=Qd?;Bpw%q0{fX|(r62Uq(*)*`5>e#AL z4P8#7{KtCQreJIo+R@TG=_ZNq|J?bU+T}gp^C!<*m*07U_$-`0a}5yx<9}yNn(WN? z`CR92X1_UO&+6-fsX@F0Mk7gUTC?+}&W_C$*1U>fQg(0d>|O!mrmbhg#?DP0<9S*) zYL9Acd~JkRjJEEI@$*4N>&A+u!KCRKyfZw%;&20)@wbh_r&@+n#6ov)R)kFxrtH*U z#j*`+*NnSrX5_;2$l9(#e)7dhUFS+{tvuklp`G*v}&*h90AayS~myYWy=#%0GLP z%G?G%`#Jt!c&yQGHr*XZnH@*nLH0qgiS9y&@zk`%hf|TgpQi+Saj44yuS31b>wu4k z8zTJ?m<&RZ-gJ!h2i@_Q=^N?n$%h*(X^x4jnsB(J%Rp;>G*q`=_&X%4r2{dZPR7s;}YxfBg)= z|LZ$>R=}(UvKGi%AZvlF1+o^%S|DqItOc?b$XXz4fvg3x7GM^jJ^pz9pZzL4|IdCE zp8sc`kLUk^BZQs*XP?j3|If75aO%(1=hZvZE7h~q5p|Q=pcW{fC~qoHD~FV`l~Ltr zrA?Wxi1IJwSLH|Ko8^n;6Xl4!R&JI{Wy$+n@0;GIy?1&q^Pc4G^RD#H^?E!Xd4A-1 z!gHPH9M3LKx2M@t?yc61Q0V2;E6m5w<@ZjMb7+1IRwL%~G2dSrN@-u2qD zz0dy4_F=)8C~{>idkD^FFy<7EIYe$6A*n-IuOCIzYz`nDX=Yl2D@|6S;T~DLWeS z4Z&#zro1V;$$Y7J!bC40CBrA<1MyMcP#iu1Z*IGS6!nN?G`7=JvM?!f<)9+_h^kq; z(ggLfWF$BgAKn?+XDT;i7nwa797>K35BQ?+nY6@k#BBD;5s_QWDz`BC#&w;dIQ7e9 zus@hE>pXv0vG~9~-$)|DKG12Bt89qcgevky<4IHY)EKqNuF+Ja zFA?7ZYMb(lc9I+;qy2DHgej|J2lddAcnsu7naxoeC1Z^QV-c`_++4J9kc=Epfsss= z77tKk#}j?g)aZ~YudrV$H4;gfhtbpsX%S~RzEpfPG-xVW7A7N5{&2)1PFcv9J+6~Y z?-RLtFgTTF+2h-5deF!dj_i)a7`s`DV~v*?*W`u0ntH?V8FEv>!ec0Bcn>(&O*zHe z$z0IUlA{UpaGSD?#s&y%F0+-&3`GZ1@p#OfceIul+?yJ-NKv|lnlu(27)%Yr$AL{H z3y&fhcO=7cbF&p~rY;l>Mc^z0Q=zGwsNJHWVBbWew6KRN?T?2>EsA%Op#9NA#5y}p z-$-qt<@tu0z%g_GoWFqvk8vJ`MIZyap|8%Izsj2LH{}`6g3zgjQW7xYII86fUGf!QJqA zNt0RTED*UxpdLJ_B;wJq4;~rVY(HL$=`Ga%gG0gN;=>c)iHe)4t%KpdSUhBwF29Ky zjNK{*M`r8KLxqhbS$`}zV9uEw5V-=IOT?Tse|ZB9noxobDQJ#F*j%inp0%?}G%}=1 zm()=w&~8fRk_CR&PA*Z;OqVLICAD_bVGd0GQeFO%8mf`q**?iC}oRJ2DaWU3&245A&Var#XCyL`&X_WTD%%rJK)+2o^a7KoQwL!E(LkL>)KoCJGega*5V?F1 zh*>&aK|wiPk)1}x)JtdNOcl8t;12htNyTMMa_BbjC0b~em{E}YQZg;%^+yL-5j5@O z5|Sju&bmogG^LnskZ>fM>6&>(z|FbD6dYla)K$zc1ZE&6;ZYM-xpi_*fym`Caw4RY z3Z_7h;Up2x%4%QJQ9TsaGbZPQaKJk<+82wa*^4HFI=~KEk23A|4#o5W#d*+US(agC zUC%4eg~=|H=fhFVT2W`n&tU>f;_A+}j;@UzI=N^PU2b4BHqy_Yig%<{%vGUfK)!H1 zl%^Fb(2b#%c9Bq6;;S0=Z75Nh8$lgJ~R?fMymH^#GmXXeThRaSLT5Z3+39@ zc6D#)T-wv!*|pqYq!KrbD#+IAOH?z(^s*(ACDW*Ig^L7gTif2zyLMSGT%f(Dt=mv{ zA-p9rW#Cwg1q)!5nx!WX%g*1W4GIa^S6yk*as6jZ_5h zfvgFuQ*aN6CXF^Igf~ETNj8+=r6-<9+ph%P{FtKEWFB)Sd;i}jtmV{q)MwRO)$`Pp z+M^z!mMZ^HexTf^>{m`vb|@Q^1@QLomVYn5AwMDC0&oAv$$j!lxlS&Y?cNW)-}OG^ zz1Dk}0+!wo#bN9Jd zy6fD00R=DIpy#EtTdoiawZYZoDt9@Zzj40i zeB5~>_yYDgd!5Uj^PH;q2k|xWaq&j+0&$PnD=rsn!~(}Z9Pc^4?Rd~}&~c_C?%3>D z?3m+Fg+GH=;922L;WFW5VL(_bGzsN`lm89)1|H{ci%fJtl4$|@E!$4xUVI(b-+gWCxf}kZ$cKFrOgZYEPI{kiN@O z56mn`x5^3A3ev51hDinKR{1%Nj<0(eeaBAL=oY=kPSWV;NHg%CNc2I=co{oEqg(7S zcDzQn=sR|tMz_d6wojv5Y!A@~Ed6}qUtXHF3#@pC28r|9++cmniUvAUrJIv#GY^z4M zw$sr>XV3n|d1P#hMmO6df9xoYZnk0J*k*cLi6ng%6XuU?(u!DB?$PMhF4C>htzBfJ zMz?l_4I15Y>l#~6^swbtG`3EoTTQ)IqgzegrO~aXUZc^ire3Ylt#Ym+ddMozN{w!v zN;)+i(jc)BHM`(2GRI*T`Tc?Z#8r|A|S~R+K2sabG&)SYn8r|BC zjT+tBUIC46ZLbE6ZXJ5{8r?kf^2h2ly0sns8r^zJsMYA!_N~$A*7mK|=+^f2X>@D* z&e!PHaWPM$TibW8Mz^+al}5L=Z>2`Jw(lH`ZXI{CHM+IkXK8fvts;MHrbf56`wXH7 zt?fQtqg%)6G>vX;ckPuRXdRE*D*?Hx4dY#VB?wyEU3(=6TH9TFB?wyEU3(=6TH9TF zB?wyES9>K0TH9B9B?wyEQF|o_TH8x|B?wyEOM4{qA#foFeIr2}hH0i5WAKK+mM6g(wFA~meXuk+GNLUeq`8X6 z;C+EDaDoRnIK0Drow6}_X<)06LvY$*Br$Hacgh&NJg_y@9U<&e=~_$2;O&8}5)VdU zX=Z|Q@Djnw!O{)83#ZGKjKNz3TZ;`xlc6}c7EQTDWAHA)mXO0yI87NlhoL0APq32U zP)^2^qiD)>Zs8cbRj{>2SpA^ZO=r1n4{?v#ZsF8lt3Ou1seV)oyH zT6eiymHr{UBYjhPSh`WVLONU8Cq<=hsa2|$N+hT2BiGMduehFeJ?OgGb%pC3SHiW$ zwaT@~RpXlKn&h%OKXSh7eBJqi^C9PL&I8U1ohLhYIYZ8k&UUBYS>eoe3gVx{_r*70 z&%tBjUE)FUOX3+~Ox!5eif+fdj@KN|J05o2=(yZ*j^hN_e{hUrjibp??ofnJg%5-` zg_nfKgU7arxNy4F4;1q-M4HM@;HTN7Q$8TSnC(O`l z8$f@uut6B`3Pm=X=8Y|tg#yMfU1$Z9^;buRg3(xYa5OboorvJT+E<+#iP@eMo}DRl zSXrXOyQAQ%W^1Fw^vpD2v6Tt01g0U5r(HrGX9M4zqd@T4*d;^pQE(b-KJ>Z5lZ8T! zMjwXbPGQvt#_!j_}LWLN0=wn<5g%AMSy#XQgqwro}?7r47exAj+pW%^i=A?Sei9HE>QVCm{aAAc)E%y+OX7*$O zoy>OW451C01(Jsy3APt!3CqXvScih`n>eH_HJQeO?FH=WjKw?#Y+o)C{GbG8mLR|x$AKzV`rXf zzv#sI4#xU}1;RYLon^G?_b!|R9>6Z!2MbW6BgsPHdYoBUk_{!Fu#9Tg8vZ&=X%FWA zhrRa>ud3+UhtHn9Pj6rdNeBsqDuDn216WXzCeoCmU;zRI2&9>WYA5H!j$*-15k>4B zdspmTQS`C*-n-)Op0#Gzoa5{7yWa1g?|YK#n)}R}wP(+sK5N#j@oi=wPse?ivriTL zChA($o}}!OZq#pak&bcL=bF@AN>JGn@UoAj_A zqaoLPkb0`FqB{@Y{060_T+RgR(x0Gisp-?ex3ML&UA|zxfosX4*g#Jb=%Wf?{0aJL7QyP08t(_ay22-m1iuW zp1pD@w*IM(b=N!7DRnSJ$ukyn1>x10ZzKCu>)*gW)%w?SNj5fD&%+!` zHPItG7`^euF8xp6$^4vZq8iO6rEU2%S>TmRBeHRs>`4C=vEtjc! zfu5(I>f#W2`Z_MOh6Zz{ssF{*Q|)JWN*D$7IZJZnd#nUBr_RkVO4x|`l?|i`iH@PhSlx!U*l4D2RD9q$$>m>cG;tDCr+*$7 z)I*BaM*N!J*>dU8B?wZQ|HgS6GS+56yC2IsqjYm0Fs%|C4trsq%u zaOnZa^Z#q~K|W)b@rCiK@vw1&vCcTfScQ_GZHza{jXeD?{d25TAJuQrH=x{>>+`YB zAC!DI`9$*8k@W$j->Kk^3UoMJ|b)7FijY7nvN{Gtx8CKKy6+lkm&o2f{aow}dYZuMMvV&k64v zE(rY``ZV-L=wYn**M?Sv=7lDP28MEiKL_6oJ{Y_*xCYt-bAks2_XrjTb*$~54cr>I zC~!hxQQ(lkUV(i7&;D2Z_xZQ@&w}oNJWr6sGPM9_2L8q>{VnmdxLaI@<>|TNIIPoW zh=asFSg99^nD(poruMM5MO&lQXf-|`4NFyZU3VYUNA_f;#-p^1tg3TP!rfEn7ijee z4$sW_l0u_G6HdAvE3Ygm%sr{TxU(@-J!A&hPd!X^yQ;Q9YE#qd{yzN!nt_=zDc>11 z({<^LPNKG7rDl$=vQKqXudq*bO)pbxkgB7yk1n4`>m{!y=>!k8oOs7`L~14TQpCu? zR}88uFnDIJc6WR)(%jUcTzU|7c}|tmanw_cf=X{KEu^T=OVK=HJ~WR+N4h&|4L=*vPorX z8=CZ=jEPD{BYpSkI~~5e^#^H*f@sbQMvK-_{u9V92&ql>Y(5c5&#o2$x}LVvTVtVyMycD@)U&i00z z!A(+{RjQx#PvK&#`1>Ejhl#UD%%k4ljN>0N+CKWK3}kVY_%#!Gs5piC8Al{#wNb9^iRnFCS(@;`746(_r14#i6ub#MKM3}kVo*qMo3A*yL*qLSLcrhhn|!!w5< zs@JoGRER}1Q#NC(scc?Q4+$M5Yi5=p#P?dZpbD{&Dw2v&p2MNIX0)XunjIOa6=H$& zyGaWYQS7eQXCR9$;;T&LA>ue^3ehETcZP_1>SMD6iOu4%Y(ay?^v*_wRm~mJMv8Jw z)<8u1X!gLtVw%bVvgc$CEALY;tn4z;lo+l5U|P8-Vp(HzjTtbRn!Yn&UQ?6)i~gtU zftqHtbTmxFG|BaV4B!X;pkV|8P>eqnzGp0-l!skJQY?gJ7l%Dhf?+pH8)?{cs+Bn7 zagXTF(uj^|JR|yrBqSrcIXKfKLAxMgv`5j*HLf(S4IAw>{LDADhVV;+W^yr2Tj%4X zp6stW89k^&guikw1S&lLzST{msq7{m2~9psM=-x@X+zY{(9b4GqZK1Ki-h5h5w)a) zUdUx_#;8_0bKIOXUyr*v)r7qVb-m_$Fk^qnP3WxmbP+IT-|Qv~5QAwMH%g@;&!{1( zfP6t$k;4*N&mocnsTwGS4Byl2Qv$=M*r%jOPqI%*k)B|m5+6R^!RP}C<!hbGLSKt{G5qA zRJ2m-Q7Ms;v>B(C|1$@o{^@_<7%I}c8xtYd=G^nV#jz9BM_=}@81c>@{~hB{k#c>v zHAEhofs7)1B@?+q%y*WgYlxhlIRsI?oF$|}%%ed;Rh@6%s2=Tp?EvQ1wrPi$? zw1&v3ZK;Un#SGL6QR)0{dx)&dK*kXHWhU|vajY|i?jdq?mLQB~k7NrPET+;xr@qTO zM2^ZDh)5sK9ynM`;a)t#cRIC#yMIDU3a?j6o zs3EFm%(U)stViyl38z}En38x$_}vlc_r9-v;!A#m75xjz2a`7?HzvAf&gkROd!jc+FNO7h2Ss;>MnDIgB={rpb>zLs z%aO;FPC#p<9vT4$M@B`4MoJ?^k!bjj@E74X!cT_p3SS+*46=bV^a5(av%?34_XzJE z?i_9x)Py6rnU+>@OKgXZ)uk_dYEB({`2l~tXMgE}igYl8^vhg5fFPA~~a-7kK z^9e^n`m%>n1fvZ<>mTbo^hfk<`WDzQXwe(>!}Pr{_iL|f;z#HWye{q+SBTR@BjgaB zP@I|miuL_G8{v+5it!j8DOGjdY=Lz-dLOgfR5bBrj^0Hd;fct(qi#H2qL223yJtTp3Mm9U97sAgi ztOC*_^q~cPiK8^lh~$V-Q7taY6f~_1b4O5U1}SK?jk_s zje_lo^sxwmQoM-2fGL>xb>}Z2zkc^_dT+_@(A0QC@tbNI_(+)p%z}mNtsei#j`{#I z+%YEZk&!HJ$xJ>#eFu)iq3f!zGZsel0;Q4BIf7F)a*f_(OtgOLJMEtjau&N6{1?j@ zovZ!x+UvbNOMU)$$4Xz%aWT;{Kdu+y?P`_3hb&>chS8o;?_9l1a@g7xQsL!U*#t&9 zsSU;%9rf}|3Kv`=n9!qm22P!dS&=)0eOlhDz3AN{7i5#PNry~t9S*q@q^Llw?C=W{n8no%EZQH@-XQH!Wv;+vqnfW_-8HY_l{W zD1f#?eYeqX+6eXCDvQHbg4j=%x~cCVS1p4m5;p45R4yy9rT(xlMZ+EOE%cjqMSVBR z^0pKoW>E;Yn49P~x0oC0H@BD@C|*@3=7Hrye5Ft1v}Hd(u*5(9J^j4Mr# z>?6idgj{A<$lt8Y;M+{UX%XtXoPKkeZIUg|)G5Gj@hwh2TK`7boJTkm7|xOe^8u8R z5Y8vC=IiA2qeF6h-eLQ?ESYa;IldR4+6&6?)lk<-ztSS!#HUl@#`t zm0xaFx>XcT&rCj*-U4nZ*tps9;A=O?+9Ttk#q@HgPhTT_l`2eV)?@hO0?UK%jmkzu zeDty1!g?-6X)KYyWPtv<^{c!2OKh@!l~V>Bx z8{0s?xs9!-?02df94W^(m!5&|WO{&G(`EFVThpcVu&FqJeSSluf-ot_zw0PAlR%$b zB>Nmw5x`a~FnqFtTXa*a;O~5WuuXNS6zrl5H`NEOb@|p&(U@VUQkGk41b@;{e?z$UD3zc`3)Of;HZ#&qb;=x#hv`A?^UjxroI#^N z|3=P}9r^^rWa^#T1gpJ-X8G}^9>GaYPZPb6JJ$24Jm*>Z12;MSXzA-IS{06NOh1#d z%_az+^9eNae5W7nJVI?lJwWxogo=eJ`U6f+H-|@Tbb1EL*E;nBF!ga0E|WD;Y6i%h zaw-PM!BOtPO9K}@Wa8`%d4p!+4nKA44*$&_e##z4_>G?M8$5o@5liUheCl7c(|ddN z|BaQtJGFOxVgUBAgW3<;yUDMTZzLa1UW0Q0$0X+`C*l-9&t&_=7qA7mA#q}&GI2nn zf1(p?0e&BUJN^{b`Ikb|zd1e|Yy1P^L*m`zdD!9q8|(Z}VlQKze^2cC*oN5JSWB!S zHaj*Uws)*gEHCDVeZUW*JEG5HrT;*5YxJCGQ}mE%d9)|?{0*$_cS76$=E(X;DzX@> z`eBi-kx=-@@Vnt>u%6!%J~w+praIZRiZF+-HVHhsr}8g1-dc z2;LXm7;FjF1g8i0#ag{HpsUsegxmJM0Hs>%ZK;&c7OZ{c^QF&OhAWk97NgG2Sya7>B`vKwl%@i0NPJ z@9D2XL*jOQy?%;b4J!h@^+G+V>*81OrFc)gEFOim!L8zAak^MZS_5OnSnV$Du1rgH z(7Nm6?BxQ_6L7#Pu?EXftm{-*x zRqu_o?0TzKRMtZ2tV!?e^a&dN%`h>59$aQ_@vkLT@?tC*C`aMZ(r47lZimmk`reSs zFSdWvhsZo2@1);6Air+@Ueus%kdu1Y!^u!0l-sY$+;)e1mIbd!35=V=xhi;BcGw7Z zZ4+thWrs~vXNRp_CO_CZcU@L~lC}TYuHQFVVv6AY_SQ0om zm0~`SLx9qV@tq-;Jx+a?Nt7eJzIc^>^Qim^{pJDnWy*i02QyJFd_7t)6Wlb?ff-K` z@B;Ovke(y;UkqB1vG$AaMcKS;-Is&pkmJyN87CXpD08D21!kn=tQF$6CcT6COI&3A zDh=tmtm`6&4?L(;U5tn1du)F~Hh;w8F~eirFNGp)=`;;vvT>hmaQr(azivLy&R(G3 zJau}WezVZwIr_~@x@Re!)lJR%ck;WOXXAXQ%LLo!;e4mb0viS6lrXzxtfQ|X53Li< zr^l-raQKKf?usE3S5X_mtI0sRuYV=8nur7H?!GFP4Ht6^U2n zL|^?+fxdqT6lZ$^U79K<{X?Mm`=0{OlB0)8t-0~Hsx3|Ynt^tTY|V~mJ^Ott|1ntn z^3TC1J71{w+Ky;T6FW1|svRZc*kU_8BU!wjnY@S^2dfS_ch+WRri<6I&=<_RM-scv}BodAvEPHsT!U$0(OL2^oDz!rXbh4T{B*r8stEoWp2X#Q)hd*Qf z#>jV(9QoX8AO3P%SQkdi7!D1}#;-S@84>?~m-)_`MpP5?yA(yYG(^+tS3Y474>4n%SwZ zXiF16XP~vp>a5=DQLm5#=<uhD-eTueegqPgKLmp>1j6 zl?=4`j*@W={(AO3~Foq>&kQvwZv8G-#_U%#FISO2^IC;T_zl>3SPMgD{R!~9+SA>&)) zb?jMhHO@9x7;}=JLVMs&=nlyH17;-mPwt*<2fG39;yl1ji3=e&Sd=(8F)YzF5yE+Z z*W(Yyx5m$ouZYiy9~d7P&yV|JpT=H@-5J{$I|Xur8L|CiyT{r^e~rEyeIj~O^up+g z(M8dNaf?9LXejb+8<&ig+Y+={dQD}rn@8RO>{*L z>n<{K(6gl+c3x!U#E~U(W%6Ya22NMxF!@4}dlezgZ|m9u<1ZAs?#N+AMn>+HDp>WYYYPm@$jIAB7%Z0D7G+xoi)?q~uq{K8 zdsf!glU-Y2Wd@P|*B~a}43fKAS-<(OK}@!iw3q|{w$-E6FkmAMN-id0fP)UxHAJVm zxPu;Ky6l0ShU``c6rH4a4t~F)lU&R}Hx!+A(j0VM(Y@(}hSmRtK}?Jn1Bt(xm50p^ zFL(7Z98a@1{i_t+o6ePr?oH1MMJK_lBmK%?WwSRwmBC7=+`IE_sfvfqXV~d%R&WuUUjTaL;=Ws|oYm4QkeH*m+J3{*CG%kfB+9&b4wq39lKY^x7f zbT;*1m)A_DH?m5;O`oCYta)$KVW3jBQ#O?4s8`B5Wuv!TrYnB$cTHpZ(cbh-WjfRd z-T5#@(Y@(BMA5zV>R?6p)~m^i?yXmo6x~~YCMvqO{!CDGZ~Yms=-&EskfM9*!#G9v z)`tTX-P^9mD!Mm6$0)itKSwj2?{smL*C?jfdE5I)MfaBb0gCR;H)Wl&&SMyNwX#lG z=dBOQI%SJ=6s#P97_vFsqax1OlAMyaDj=6(7r`jz?$eF9`}-(s)*e6a|p^5fdO z+HG1|o1yjd{l)8ckK3;WlY`L$)*ow};#iNs_7QVT>C=Ka!+vepozh#2x3mTGh!Nn$ z{50FHvBli41(OSz4mWf5bYRXQ)8S^%k`By6C>`_vO*$|+p>(*Iv!?@d7D|VUJxe+; zkCEws^x$9Q2PQW%9d73A>A;*vro+viB^{UtQ9AzN^ruA;*zro+viB^{WD$#g(`@h{SW$(c-tn>kZDa#tVA z{nNi(_ms9^9!Kf;SM>vvJ4%O(Ia501t(<*YFz1u`;ntVQk{_4{%5*>|@-OlOlS7#f zH*@xMV9qGh;bza04$LDd9WLz$*ItvO|G?yu(&1vxo({}8DIG5MEa|{JRHnndrmgtxva9s zb8RW$p#$B5GrPL97vdKAUgF63-uxCwUZk=5hUT&ccN^{20^y4^{Lev|U(vk< zk{D_D-(<@27RY7PTjsiRuUiX5GwLk}%Jvq>Y1CVYDdStZv_NVjGX&D5%<*(>f&4~h z2ytYLB)3J0a-=BAmD>>IP~PW+MhD)A0Z|38|zj?VtqCFaAv-$9AtiQN+&6Mn4Kzr<;PC*rrn zH^SjmqSs&?Y8+_n z1rxtrjNJ?krbxck-_f7b_t7WmcfmU8dHON>ywKKAOK1-60UQNOe1@1Ori*XH8^*21 z523P98219c6?{JUQ1EtG_qzb6^H&;|8}oznjSpba@T}nY;9%(fe;If(a8KZRV+CyZ zpBXp?TK|Uy#s&5clm&{7#{voexBi{}hoSMm*1z0;lz)Hzj~*4>KiWMSi~JOMJMwho z&d8OKGb2kQM@2?Q$|AWDE&LVa9ruMd!MecF;iJOi!UMy3pR6&no0>=fZnUB zrluZ*DU|J~PtuMpjwO6>gn2$JsJi4us~L*h3si(Q=?=S^zq6 zJ@o@KhroKw_ADWT1)B|$v8kiiQoXK+zAqWXag)X6;@(W;L1F?~uN+%dKLJ*x2bGPa zM8mFK?fkhSDcX}kEi<%OB*`ME%Gho?-!Z@@Ju7^lQXwy7v9#|K_9^S{ACvJ@$K89r zk4%br$P{-nCa(65{xjlO)2HF+eo+aJgo;Pz-WgFalLgzvKX|mqF0IJs1X3D4Y z*YM_r?;ZB>l+^b&^IEr|51|_p_zv_6=HyKY-&^eCtzX}N$aWBnfK)BO4Fkxu@@Zt~ zT2YYk3l}x>en9!u?#5VjFw6@>-OF(51$P&f$s5(l04JWFLMF>h9_!kRL-?h=`?U;~Ll?+XO=7DqtS03S z879slqk`5mHTAe|9*wG0Z^;;dxU|dx!^B$ZeW2KzdTg1Vqsz!#T@QVvhlC#QAunl=IK=7% z9qPEf^*I^H$cnc!kt;-<)y1nwP{D97yZn^i`s}QMi14lKffb^bdIkAWW>rPb^lL*z zwp`PeI8f|m<&{%OxVJtl6CG*!Peyu$s3DtdG8wr3yb`k=d{!@g3Q>C*XN3mf+_7{tc7tH)hV&EpZc#U?f=K7v~i8uLu8_Uly&4VK_>b5pdjW{ zWY|ewbB}%A`{}Z)wn1@P1u-3L_eG5YvfPbRiZL3D_^e@t?*;a$QT2KDsgd(J_NkHc zS+*pKGl#kQcWe>Wc_W|ibegHy=MD$^PNP|-dGfHqSVz4P`)R$Y^!ZM683e`GWcxF~jR?9AB7v6EuQ#FobDW7V;Fv7=&# z#SV#$kByG)7uz#7I93+x9V>|y;zq<|EF9Be5Am1ichN7RA4T7RUBs88&%$EDL$Ho` zJM1G~joT70i(Y_R6Hbq&qbK0r#HMI%bYZj-_7bN@Cr8IcM@EN7hr+HxUszV?0^15X z(OA?U*%kQ(nj4=*-jBQ)c?B9A+anJ^wsA9VSKJ)AG;)4qP2}XriMVN@F|s5wAJUFP zapS^)xNUK-$lypn+`Ld6$&0j$gd+l07Jq~cw4=)N=h7S)<4NnM<#vKhqAt~t-?uHv0JA~t~;qW)kYJ3;^JoG{6 zKcQDc&xIZjJqVkOx4^2y6`{*Q>q2LRP6?e9S`}&v)j*SER_HLC<`@T!lD$KFKmyb& z)FqT3Y9ES(^x&Vc*7$Ysli<6-oxzuaPX`}`9f)ng8*$!aQ}E*8xxq7n>EQ9W0iq#T z9h@6HA~-ELF*qi;UvL=idn^rh4|Wdb!meWwCt-dId>{BC@F6Tl>}My z-2%~o;r|P_M0^7~5%2lm@W1ST1{x{%!(PNq{;Odz;u8OP{xkip{uBHw{73s2`{((O zg!PC?{;`lL?dc!n@9XaYtB)Q1N#j^!sR28A#vEfNjOC9vMj6A6A-ExOccTOg)f^*c z`1M^de*LZfnf|{1CbV3h)wk;p=yz(Z0T_R*(9U2uo#8ZwQyETSIGI5`kY-QlMdJd~&sAZ^OSi-PaLWMS(VHCqi zh65NzFznB;AH%*3!x{Er*qdQ5hCLaEF$`rG!cf7m2g6{7K@8;#0~rP|^k*nz=*Q5P zp_HKy!|n{d8G14FWaz=rouL~;2}4(gE)2yCMGT!K$9)`Oml<0R!sL%=-Ix!S5LA;u78h%kg1LJUEM0E3^wV9*%^gT~+^@cqrOi{USZ zKNbIhFuct062prOFEBjM@EpUl49_q;&F~b%lMGKVJkGG4;W36s86IJH znBgIY2N@n1IE~>{hEo_$W@wdA?n^VI7+M%s zGn~Y5qF>jv@)O8Cp4{WeJ(k>K$X!M5N^)0_yPVu*{zdJD=Qn$(=#& zVdNf4?sRgekvo;#DdZkP?!n|vCU+9K6Um)G?s#$!B6l3Q2a-FM+%e>iCU+FMBgs90 z+!5sNPwsx??n~})a`z#3Z*un{cTaMM$zm(jsMVHg)M`sLYPF>rwc1jRT5YLDt+rI7 zR$Ho3t1Z>2)s|}1YD+b0wWS)h+ER^LZK+1Bwp625TdGm3E!C*imTJ^$OEqe>r5d%` zQjJ<|sYb1~RHIf~s!^*g)u`2$YSd~=HEOk`8nxO|jaqG~My<9~qgGq0QL8Q0sMVHg z)M`sLYPF>rwOR2)#4&yCQ_>{)y|Xo-)ktjL&&WlcMoz0lRJpqa`{|WkQsg7WO2!hjjhj$?ZmN3AtU#?Luxbxkco5Cby8>PKNH&3Z#=SojmDuluoX6 zI!Gr+I=e{+SI7IbcG5{oCn24FClCy6y`{LMyc8 z##z45(V@k-DeuV8^w6Zx*wFr=Jwt;+eM3D$MWK$NWGDnH_`e5#2!0v-DEM~pwcrcE zCxZ_M?+M-(ygs-kxFL99aBc83Slc@`xHMQ7T!{PiX2L@L_~5AE@ZbO(58F&S^?`;n}0E+`R2d)Wh4qO^IKd>fna`HFGBECp|h!X-k zlFuc#C+~+0;)djw%`+@IK%xB)VQ^@(+fHHp^5@rh-S7%WK4N*tP)lo*rP7m|VgiC&OI zTwt7)D27f$0u~N;#ea@}9sd}b4Ljn`K{jxId|Uj6_?Gzk_&P`iTI0vZm&NPi3vhSf z@<4rHA!Hth1t#ORgG1w!;$!0b!Wv@#crVBZI>r<6Kx|j+=h)Yf5WJ2151xx{kKG^J z7P}#~1veqCi>-;Z#*U9I!%YYaVzXk0;$Fltv3+AhV*O*iV#TqJu|zBo-4*>g`gQc< z=-aTH_*`^5?n~Sjy&<|Kx<0xtx+dC+n-Z2q>u^`XtmvW9NzpOUeWOF7{iD5bV?xJh zA{xM||7TcM{1}=HJ0j0v&3}JnTjYkw7FbzahZTQoWER%@lOkgx`{G1L z|41*a_B%!rkwAD?_~-D~SnIzX-VuH-yghtBPI}w`YmDo|>%wcot>NRb&aVqE2+s;1 z8lDs$gH`^JaQ|?xaB;X}IDs|(F5Jubb?9SQYuteq{`S!Qp>3fXLR&)XvA$muY7HG9 z7>ipIhT`6Y-mt}(2WyN$|KI*!u+IL(|BnAP|MULG{SRQ3eWU*>{|5gBxS#Q4tg)B- z>-`J;v;BwRuEw$c{rp35V`FbvY0UE{akIkT#xKS<#wW%*kU2dMqlpg~cNjMsR~ciB zeX-K+Z}c*XaZh^!9mOu(v+%Y4vHmvhT6j+1uHTRQ7H-hDz%s--eU09#AFnUd>+}Ws zEd5Yuri{_|m1jwUx)8X|>u7}y3hNct5%$(=71k(RqHwXoYK4mwE>yTcVU@!93g;=D ztFThx9EGzL&Qf@k!Xp(Pq402pGZoHIc$mUN6;4+;P2p5RY!fIvMB%{-Co7yp2)io^ zCny}R@F0cb6do9qKjfZ*!tDwllZYL!pB4V3@JGTe;s=G_EBsF3w+g>e__e~X6n;r~ zrT9YO=L$bl_^HBA6n?DmBZVI-{6OLR3g1)suEKW|zOC>rh5u3brouNA?o{}?!q*h; zQ246CR}{Xi@Fj&W5?&!*Q24yU=M+Ax@EO9*;%S9XDST4l6AGz31hf;BpUVT+!72YE z3LhrS*RN4{wZg50dHO{PFH{KoRVY_nFfGUA3XNv<{~wZSRcQ76VRa0(3^fc(7#1^B zGc00Q$gqH+ieWy(JchXpl?-zjW;4uUIEvv&h9ejbXPC(_gW)iSLm8$sOkmv`P@z%rW9wGog9;x|c)!B?6y8g?N!+9GZiRO# zyi?&F3b!e|UEysCZ&i2;;YM+@!kZM{sPG1b*DJhE;k636nqx19{2K&U^9|xE<=>+4 zN`+S_+^q0&g_{&^B)miqD-0-;q;R3a1q!Pa&Q~~3;ar84gnNiN z3TG>%aTy9?G%ia;F`^F^G%kz5g2rXwOhuoe@GymkDx9uxn!>3Hrw~H_LE*s)Co7z! zaH7Hqgymwq!h;l!Q+S}lu?oj19IbGa!jTFOARH)0DBNG+ehT+hI9%aA3inpHm%=>> z2Z&(`hbkPRutMP;3I{73q_AA!K*IjwLWLI)Liv%ftLUR}cZIzb_EOkWVGo7f6?Rit zLRcWWD(s@LSYZ)iM?FtrM}@fxJ1EQ{%oXbuUZ(I;g_kJ2Sm8y49YlYHWeWQ#?5nVp zFh_J&Sg5d*!UDo}VmCtQ0TPBqLSbB@_K5bk!d(jgQuwFBKNSA1@Hd6OD*Q#^&kBE1 z_@lxf6n?MpJB8mW{6^u|3cphLrNS>1ey;E{g`X6s)SwBP{sh8`$V8K2telb2X zb{daDpZ+vs74|CU8Z(T8uyz_`^uW5wum6A*)0_I!`fXSzouD6uz1t^4_xVSMZVqh< zt;LS*(b%n>8JZZ{-#;_dGZYE_9DG0cT<{K9=07!956k>}2a9os-iLwbAOW~Ma9W@- za5yvu`UP+n3%BO&fJXie{)=ICaDlch`3WQewwebt$E%AEXQ7}2aU%WJ)3wwiKU={vQ z>?Z8WufbmYk+G4nLD+Y17yUi@Ay(ISL^noHjn-oqeeY-~_RT|)A0zKZo`K!L+hBR{ zQrI3$!TR7lf3L{Y$Vh)j?2Gq~6h@N%K=|+Q58+Q>i}3F7CAe{LW_V(Fgnvl50=wNs z*y+ZdgT}A=0s0Uq85ZH9H^2A|77IQRZ;O}2V>l0StynMCiWKhhnYw~vEq3D&#tEI(Usj~$w=&G{$^~>vO>MQ3(Y8EA9>U+ zm*#ZwJKIrf^BMz3xJMc6HEBWA9fMO7Y=<2>PoS4tzcrpmoB zMPA`#X(~^r40@bdzD< zbg=1nY9>!D(Z^c!jC#paq>){(R`MZ~8#~wcJU@EjrB=gw% z`h}_xk0*b1b4?}m*>N1?IORWZDf^F=ku7Y5eNH;gFkRY$b)RK0rpYWfk0kWV)?UTe zSwoJOky0C1*J_}3@86at?$1CYi`Md4vlEbA!#HW?+CvnNXCji}Vae&Z;u;YgBI{in zvUol-dA77mOWd}lW0{QoGSkIxisj;XtBO-~Vd)%toj%u#cy^4H1#7DP<@Zk{O zC$iZuq@y9ek7ZM`4~FO~1(^mhUTiMs<#OhVC`P z^;U~y=Lmm$6>j`7GZT^qY=c`#z`NbZp)C8U3zm zmQ8km{aeu0kErpWi{WOiwoh>BbKBCyyBTN=atM?y$26VZ>Lrl5dk2R&&uq(ds>FFx zBAqn^r&oF6=6yz-Yqn_D85KR1nJhAr#W`mGN0FGvSz0nuwMm3=0R1x%#dVp8``ASLgi2Wk zqPR8_ac`>Y_;z(LWu)6L9`g7PF{_^AJj$H5H1T!@TAf*U+8jffoh?MXl{KVR&H`nr zS*K6>c`4$WHk7^0OmH4LnU#Sk{*#GVBMs2Ym)d7drnDi67uu5MnE9wI*&pThi#I*~ zC1%R2Yt>Pm1H2URU>nN8X62F-S6PEccnIPFFJZDpkV6I@Y4Q-ncV5CtX2X-COxd#P zs^#*z#!OW4ZAR*eX8WNSP=ID6M`sBT-((9oLE8Uo@cr$J{DIZ&hDcLnR3tC_1+=)& z!VPfoZ_q~M-7k^f8JJ?#G9LF@kJ zz^uTiK+izf|C#@3|8+Qp-{?OSd%1bWZ;(ISZCqxYXjB`Mje$l7?9_gsKdIlMU#K4k zoBiYT0a&N~Ek1zVzsn)NSSUt|9@^j9Tex5EQtc$|aBW|$6FxBWUw#T^IErBSsh)0v z#VAs4n#d?gN&6dSP#F$K)ySKCQCK!lK?(*qx`0OxY)fervYzjef)S1iE39npO7l3K zD~kLSEOE#bAPOvzow0XH!O&C*g3NK>8Ca5n4Gx(+6=>gwVJELk3ideqf@f(1u2iYA z+PWBMeq^^4>~WMkI4YZ(me)5*S%S?}oPtG;J~mUGJSOjC=#qk64##_VweIBTn3CpE z5d~Vm=TX?ZWau&MDa9=&9l``!hSZAO#~FvXHC;HFj8T z3g$QRL?|Ff%qB6w%$M90Y;H)p9Ml~2ycBG16oTH=T;GVU#eO0`1zQ_M2vOa$yYU_OXBSGjmd~rkaDGrp9@qgGnt&!IrAbuqmTQjG8!FmX{UQIn|Hzx&duL_N|MX z>g(*_yc8^b72?qe<3^62GVzWFv;f1N50bh57tFg%a=Au*&e%dS<&(ob#-TCFJ zcs#)cscxKu_Wjbs7IZ5(ptg!sjggFsE~AxohUG~qjRc@`eF{^ms-Jvsbc=3 zc{SBA0^$iRN)_=JnHM{I!V6NJy@j4*zqpWJ+^}?RQ$y9f{wphMYlIb?m+Is$bSoq$ z1yf$Ke$`aZwfS>WFyxgB1A2{1=dQFqJU0d7T?L>vti=7`bryZM6fAb-Ncy4%iXlNlsb77Bw#gb6m2X%4?*Xj;;~y%x~?Pf;6N*h@UJBN^ia<0Uc7(t_mwX`>CsL*)!uB(;&_zj6w^v&s z|20p`$9>J5>esS>%}YY?mR%rhS;g$rQpM&a-R$OIid%Fwi?_68J{y2^n~-%a*)8UN zE%P`XZf4K=-D2<4GMCfgX3vt2N|g?m3E6Dvn4{9+V$Pn9*(x0__AKd`#p!ShAhM<7 zC{Bl)IeR*e}NR zm$n?s>41g2f02%3I2~^0?CDs=>2R}WNykb~2Q23Oi*&5ubhw$br(-#%!_A&C9c3-c z*rYC-)%zclGN5H?z&9QPUK{>wsp;3!%!zOFM3w|KSqXv#zJHORMk_&X{_F`l+Def7 ziHr#N##VbGD@PX{qCqaC1Qr6U0fkr#4OnV&)5FI4FGp(muV}t zS=wG&XMCpTuQ0tgdLmTP#;S$bG>1VktaUb-J$qpq>q-t)y9dtDk~Ef;ash5;EUmz4 zb!)|tpT_diC0?+CO43+iW)?44JOyd2Hr?U{E38Kv>&>j<1&b{|jkTvsykG@&N@Mlu z5ieMQC26cbGm952o-S#uL>ZZBK$kR@tG4ilQCqVYz86U~Tcj1~XrB(^$LO;suMIm&T&iDPFKb^3zzZy2J}sP{%aZst)mj6_B6C zBGn~cu!8c^SfDz^3sy*nG?u59c)=p)rLin^iWjVq{4`djF7d)e=4Te9u_AQ~5^~M3 z&S|ViWv;pe3081k8p~0qAi)aBNf+8{N{gDG#u`-C^J-k~z5-GSVFh(aV-ade9xQUF zG*+Rq`ZvvoP!FOvJk#GyUB|RsjH*CqK+iN*qjGtuL~69t($rkp3_EV9R>RB)iqcr1 zO7R2f(eSL%8D5yiQdRaXQtl;#T~GH&W6>%bw;AdZjae@#Nn;f&8>z)+H9?D~YZ~j> zGAEDP7qZjZJB_96-e6G{Vkoud8(rz@oyPjs!)Y?QzrQ$*^{#Bx?kkDymlmh7>~*wy zIeV7x8fxa?z%-`Z6A^>TX~|&PMq5@<0>!Oys z6Y{~1Q1flBWEH0|J(uZLnbjtmK55L*_j5CtF(KWa$S`AfktrI8CIOe?A}obwDFA`8)6nhQ5rLRD@SE86|)syn8qaE%+WSacTHoWZ`M89 ztWY}@_6xeFFx@vZomlMs44bP*3iEukJrI{e>CI*KZ&un2B`HkV9g(PooGf`OlHF67sSmebqya zoXslNChv<=m?)c%XUg~4!Q`^)+QYMQ{^&FY9 zy*LF4nWO2n$@!8Lq+*UpGN%@zFjyf` zC3Tox(anfF?>f|xpDsN#>s{Sa(_PgtV?;et)A-v|HMEoDdSAEHR97X*64w-tOI4CA zadk=^VmDG&(h!5pyzZPj*q+#%ngVukVQRA7(I}MwJG3}8$?j-OW8EksEB0=wiToK< ze_TqCHdAqGf*p%PL(ht(Fg2bN;as6wd(4HYgUnESg=&SCq{eZq$lsF+#l^CC>NOUpYOhn>8 zg`R*s;i1qC@vZT*Lg&M}-n`HW@rm)F#$)l4c+|Kt_I+$;Xo1)idm47q7DAuk#@I&a z6dV^@5}O$tYg~$x2orENzGtk1*a_=+Z$$5lUK_nAdNS+zufpk`wW&5hX#rQA^#8lxBSog z@4+dD_5QQ{D^VE#3x8yavH|AOv7~`{^u5I@-)cd2eka5B2bhdeuT`%OSKHCln6qYQdI{XixvGbqUfLNUppxC8k<4+ip+X4j})!N z^v}pF=n}SVttHtxk4c3CjD;xQ4Ye90GPwqVr0L2anpRh+qQg0 z*l4c_>`@A&8D{er^Hru=lx&7Bu9qhz7B$z_=&$Q+O;PjN8n9mw7be?v-WD^-Jeby)CcmVDvGmbyfAG>{~wH zL4+)X>U;S-vKG(JOJbR2@_nu$8fNvw24WUgbMNx0zKkX%)+y51h-8HBDsUiVj!)6eYH9Im&~+XcmX^ z9T?h3_VFDA+5zlS?RNxO4JM5Qk;@@$&tKc0TAW*U?`d)0Qj2r5v}tkQklkxHlWPw^ z`l=W%Yi z(&o;sFF3cn_a|xFIJer|nxx&%`J={zec7i*fZ^=pd)BmlsCm{^H8(A7BvScN9IpE7 zz1hdNplN&UW^~s?U1eis-C}CIgMDW+gX#+QB%iwETN}nczWPiX%09l(TN}bYzOhT= z`ytfj-P#@;rt0!w_Ng&q5c{aoS7_zzQ}uix`}ituZ29gGuU?)Kcz~d8~M~V z+FA+w_;PfuEBjRbc442&-(vQu{4HXi%HPgvFjPvU=*Nb+Dd@kpc_`Baols;6%C zQbaH`YarsfJ$qoe;QrWDM@3XasQWbuc>FdupnU)W>HI5u3%6 zSwdj?g6=k<4&7ebtN0Ge7KRv~$Qm|S%*Zi%Yg&!G^`@@6jyjL>nXXA^M?Kf&&lQ)t z{2c_}CS^`(b3~_@QRvf@zr8iT%@vnezjH(ZH+D5@bYh?Cgj5(!+bgtu4pUuC9{HB= zjgneN_Nh*vCm2gqH_r=+C8|5gVNTUS^PF;t>XO@Ym|8=$gZ+Qs3!=gY>;GTC@;@vW zB%d>eCLd1T0&9C0g`NsLWn3ZNO`aUwJ@7+vnZLJK0FC@-#RVc|1oc0RlH_9j5`7Tt z@J&gM(c6o!^fk$TVn?!@agk98TYQnk-=PNr4Tl_Npk@(tpTKoxl z!QA+Scv(D(GyLyB7vYiEow4imYs7L$3C@chqkkEz42=qmij52P3-pWa5!w*g5bGK| z(|=|x9x4bFM1KpN9ymSvUZ^S16n!$J1+?gGp;>`h(RINO{2xS52tMO~Cb}eer~l6A z=-@*C!f1JLs()(ewcs%SuxO{?CjTaVL^NSciRz)-0=F4!B0mIUf!87*`oqRs#?6t} zagIXX6L=2n=`}?bio3)$ILUu#RXk0Fj<5=D%<3f1`W-4pU6aNMB*y!|eqsVi%Jnu8LxpC>d=B14owjpFVt1am? z_bXc6-c|C5s+lCCF|6l`Y3OW?qvea#n~etfOmpR2zFW?yl1G%9S2olyY^-cpw31hN zhs&gbr>aJA&6MBL+*rMEAr@g+;Z2Z{G%c@g#&QbY(bBuLf$T59dw@K+)eNDA+-;Lr z41zX79@Zn;d|akq7_fMjLLwlM!P4lk*rONlC4f*Dy(MLLQ@RYF>$jtxl(4)$gBV zRxV$@T-p~{pnoY(AT=$;8gf~6lROwg)GtDMj%aGC(La|}!5UyubowXs7P=uxdOwz4 zp4&?=9rvY8K$dX4N-wLLyQsc?Nt6DhOgRm{`V;aeJ*Ph|KSF6x>f7Z5JU&CjaHsU~ z2n^pHvZzc|OZd0hybv&Kv3cRU(#Z=y)!^y!5QwaR`uQ^1)3D>r-t#;aSU*>umR2Hq znHqaHT0ccr0Tm>ZCf6b-zy_j|=GYH*JV{6X)st#xQeP@7kD{r3mJ!xEU&8xFdX0nC z-h9!Q6zRjw7!=vwWz-kTWA`e4b4?{*P%UexqGLrRNsAn;<_It86XhX8#cGe$GGu~m zVP@p&LNxC9BTLO42Yw7wSvPPtC@rUcAKXRsA#Wlh5(dXI0l zjGHfP*VaV!LJddnaBEdlccRmJRy)(th5JsjJUBs;puQL9`Wn^sj=mG+b9|w@b_V^X zNuPGQG;FY}dRb-7e42xvkgr#m{<5aJ%7&&z^|VSoURHW^^qjnNr4bhzNV-vE^sIIo z{ifNob}B`T6q96cQNutA4O=D%v)XE>i!O?H*zC5|S$@*kV* z3P+=`TGa?=t8%pCE)neC(jtdD+#|@`B`tEeIh^9ezvNU2!7jBNq&nrU z+T${1&9t)9j;G(WlGBc(-y}}bj-}t!FtuaoH?8lqRpxJe)pq$+?qdY5uliGdl{?(? zRe#8@a&tJp>Ua572zGzfWAdwr>iVijWhaJtzHHpfD3#QJHENp8T%;?A&YdomRWnKW zH0CGqjkc6{$WWBlOutF+r!~=Ut^$qpn>)#)Wlx1I!sey|ns2JLNt5;nd(}KnL}lBT z&9;e8KkjaiA44fRlK5#2^qae`dWstDwW&l_<>t!9#Z}FfW#};*8k7*hN8?2k7iOJ& zwuyV5TKY|LS*?bCbHOf=(@AqSf$64*$gbQZP_NY6Ih+lV*{Xu`Wp!7&k8;PTC&kN^ zWHJ5b{;OI|You|=91Z7t^C*yO&>|U#ZC=q%>i^ek_xh6WU|0X5)GA7H)yn%JqaD%@GuHTq}tO<2pjIJzQwNOWLy zH|YPr1gr9=X+$b^v`j`3( z*lN8@Z-G_z1NAa2kA4t4#67TL*edG9bg`Ex5drN>?G^1_Z6hoJ%+`i$Jv8B626t(N zj(P^|a=n|WC(^MM3hK6YxgF4@wZE-9<2bzTJ0QPR zX{4Ly#_XWHR%oO5;=eI&7 zT?TQ3b_R87g-$x@b}ONSGqA7~TIo`OP>r}GRkUI)XoX(7%y1>mc0QTk3Z-+!?=BM*9rJ`P`4$3(n%V~v*x_NfL zqgnO^t-0zHoB!EZ;^{yp@vSHczhA76oBBgzZIU} z3jK4taHLS*OhR=t!zr_6fPOZ=qr*Bk8^>K#4 z3M^=ahPW&vbx_|K*0U8F;n~j@Y&Bm{)C$FLSu`XfHyekr!V6oW3@&p+YM;qqxk9u; zd$dCD+tgT;p)MtUi>;&;+TW%oC9zraO^c^%D>T4OO-kayMv-h%_S<^5LJeGMQYyVa z$<<`O(ao8LHn@k=WOT<_oQ6iYLmgGd>58g2t#rZFB-fm*UuEXtz%+EhCn8l2hKzC< zVLeimhIY7>>1MZMhZm-y8E$5Jn-_LZLoIx;DiRrLzD=gvdPi{@isACZRA#k_rcWB` z;QP55%$U^q0!L)f3U}mEhRC26E+bQFl+I*%BO928ez?rA%)E~C1&;SaWn8{r<*~Vh z*kTq!Q5p*4R*uSGDrPIZFb!pKGe_Gz-8BteakK8pP}7`}up;Q5hPJqw>BQnVUtn?d zNY~lzfw-LK3oN$cG<3%uWz!}>#c61bJMy~?LrEG+`Q`K$GokL+bWTHk zyv_Ln>n+7;XphU>l^tWI>@Q41ecY^aZSuZ24aITu@k|-tBMr52vuibT-8x@jC8J9k zI^*WV(EJeD5m+3Z(oh$dLx@bMH@i#HP!pFKp?Zl-A5xr#j<`&!*^?-tgY|}zG!(=g zk!1RuZfU58OO1UMNyelWrJ*4%OI9(pO)a#;<%?9$kvX+c4wtDldzZGUg<7~HlFX@v zR(O{41=eR5rJ)lpQ>)(OO>I#cYT+_mX1p~E6jzw-vm_0@aG4Mp?mk~&@pMg3vU?_b z>5THVSbC?SA1=o_iYCMP0*kXp8cO13m9io;&lgy1-O^AMcbpS)ieWaJiSLny#<+}2 zwPTmSURZ1;X{9<&4b6;+8k)t^J$+#I^92@Hm-JY>qMH%Pif(a~q{le&({;YU;^~$i z?W%?uBkGYJ#owl?VU};}mLBP&XdLGYEQW6B;rtm?f86H_ET-c0K6WgQ^92?|L`?HNsBP9^ zeg3B8=g{tdJb7#K(qs#6*P8}O0BQ7V&m{H4Pl-zVV{ChCA;bid__Iip|BXc71V^-P_SS zqgO#=|4c{?7Di`A$K#gz0kE*N^ziU-A?}rXIrLcQj?h)1^Ft?xR)%Urv&HDpA)$S6D|`@l z!9NqcKX?=Fe?JG-2b+Uc!9#;1ao>BNU;(TS{1W&8w-4MC*cv!5a8jTya8zJIVDCU_ zpa9zWKlwlMzv6$ye~bSL*djQ^zsg_bKNx2Q2K#&Bez~ymhw+uM!+6@bPsEI^IG3=- zXu*x{^TaTbYYa7d8+p)?_+EcUe@4GczfxSPpQE3keW-2IkJjhXnTk?9UytBS!Pnvq zQ6&x&+XTAg#3+^xo% z4BTnsG*ZW!0=xXQ#c7;moDwo}d?YC%&FHDTbjJ1Rs3Pr*E}FoWcK!cp?@OSpDz3Hf zJ?Grv+!2JHM`i>XXs`uGKvcjH2N1`m>2B!8p6G56j2awrhd2*W9Ab z#k`pCGMZNtc-TYA9hRyCcLY<$j zbmMf!%zwwnVqpC3g&kpDVqVRFQJoVHy2gn4a?)0TS?6QXx2rjVJ4u{LIn3KEzgVZN<8 zhc_^rf}M<@qR50eImfxiX*YN~Y#vZbT|iGATnhsCJbSq-vW=39_(NrFe6?DYzsr5i# zi4(_b4%6e=@mp1lV8U8dN=1S)lxN3)fL&KA8Si>G1)CXrInX{xH`s);^RD+W00)_7 z9jX~P9byf6qx^so?f5|6z)f!)*vp!LI;))te*3FuNFEh((0t#j^fT@?@AosVHE&|Z z2~vugH!tyN7&ykv&%pUeYB?OwQK{s2)L!~KrMjFr6Kxhc=pE2g+ z>N!igdV0(%K^Gz!l16!gNElnxI}a9WT4_!8Bypz8b?Qa}Nj_b@O0E5!eS-t$-^~wr z@*Pm=67zkPw-sI(1DL^9sJv{NXbPUDQi2^kwbE)ronYKp-?OHnvj>J@z|VQ)udB1> z6^mSdj=mAr7?Q7s#|mfY9cL}l3ZiQS>g9onA60rtJXQS0+@+e{-rc)_!Ch0W14YY;PXs{r zL4`bEvY#m8;XF6?sdE~y=c89e)o~d`k@_|c4@G{rP|s*Ij$p*DF475kgc1%IT7q&O z--D#lSi&=eE)D)}zv1?~d)GKhw187)ZYkiDnxzFCoS;^~8ErHaaBv!0%Bl+loqH*G zEddZ|3@&5esdX5Fdeuy$yNe&-IvL$3a!SIL8Vao2C(DTwluSnc@%(=EtzW%b930N% znaUqd)u@VF74QjLzpAUVRl$4v2{U5sOeyyUa zzo)D2*Yj8X@4D(xDyaGsy6PH&$?lv9)OV#R^vtm_u)hPTj8?GWP>!SY5ysoSD^LSyG=4HN< zS5|ft`3=)tcvMXCF|d}q!_SyuH1Q8>Uw`L7x5C68XRQ_;V&NyP)KZQveX{gAmgkwi z-mXp9@D$)IeymR7bq3h@RZ*bR#@O_SmW?&bo2o* zGB|x>ch_iM?SWBml&Y6Y9q9v3^;CY<0kVQgma03$I#LxT3#ubjN)}X0R7$*u7W2=s z$9dY9F13_TPoK;Zi_}BZxEkCXzUiBJy3^1$Y|WGVCaN*j+F!l(2>00oqfDP-?#Hej zeTv!dnfd3cUR44O?wxAQQG>1pyWQQr;C|{@+J8HeB<~IWd%t-x>cJ z@cW}9b)l`HRiQ=k^Wq)xCGkn|2+lNs=YRP3v0ubqj6EHDD6~9wSL_-@CTxuz7Mm8U zkBtsJ7uhQkibd^D!`tk?*l*asjC>7y43CB1x9^O;8NLQ57X~8F*jsR7{k+I~k%z;- zva|N4$cE5Aq9g2Xy9N6XOCpCvX4(fLD!_QV+)mhm==;8}_u<5F4-EIfe}NvLv*6_C zx@fcNNrIU<+hf)v1hta=u&)#3OfC6o{bOBC=*hxOy2~iPyBC)uIM`C}uL>i3RVh|4 zmFW3-Ud_NR{z9}?5MI;&Lu{Qyg}c9oM-s+Y?H}NW;ZVYS;)lcYtFTZtMt_1FNJupO zgLnYp{)&Iv_NNNVPnh~$+mB#_ML%kDxqALzv^fNZqZ;Vnszz#`>`u^66fg*4CnjXVOiLGuId0C!z!evien)nGm@V%jC;_2eVo#+mnf zdkb4C-{zsD5AHDU@#V(K^EO}Zo4mOpy-{k$n@i^P{<604u=K82uOfA43+NKMm!xQ{ zn->$q6S&AcNHLs`O!Gh*Pr6^+ugL?bTxZcb$=3!ffNTBrD)q^+7*6}zXnWfTX_Uth z?;Ql!@U;S_s`p3%Q`?!ZfT?YKt$?Yme64_~s}g37v-8I&)d7W&Z($|g%QI|sO&^uP zm3*zxtIc#=Dh+b32TqNe;Mieem#w^d4nlKrV1o!uED=8qY!gQZPRZ?3@!IR0+k2aKya^~`OQg8)d^JiP|BvZug~E3 zdGr(4`{5bfUhvu&PZTnaR1D`mGQL~LIAX{b%XoZf_7dLgmKSm$0T?n>8kw_gW^WeX3_dA!^>1PL2H-!Wu6~t*y1plM^(%RY;oqgM(D2vw38^a!e0BXU_py4JmeQ<) zY1!TG;6nrTL`{t`qP(EcKN7qPG0{7l8+Z6pd_1(;M+o9Dy$M0@b^+tr`_$}w4A(== z&PVgLnw^j0Yc)F`N!WN)!r3Gsm^)Rfln0fwLok)|D3^jG_*zZMOZZy36fEXzHLe$N zyS-oBoiro+%#dF%;!NY_c#g>$RbtK1B)2rpgd+MN(uA)87p_X}KJ*{Cy zitI#l*=l<43gSGq(=4iZI?7X<%hJv=t;x_yfn~vG0-*y!)rhkHvh}p}b@m0=g2;X+ zr4LM(q&|Y(|GTMcQyWvKr1ndVPW~hLi{y8b*C+cCvu`4-`>!URNPI1^4yOT3h<_IU zdHey`^}FLo$0x_F*cjk6JvZ(pM{_(t%V;5UP31&c27GpoUdtRp~IDpsjX$^tK20AKY2UA>w>%@$~Sfv&D*Z5H5J4=zf8t{#O9 zFtel}h#tXsntSV7&CCEQd$eD{0~qxRm|S(O2H*1^a@?30em z04A$3mtI7vPpdWquq@SE!_x|j**gQg>=y!E-3rxa1T`ygouW?IJ0qxBkAkNYd^MYy z0cw^yY-n8<=<2;caI~I>Aiz&^vVI6P8GvV<9wjmNs3Wh+04b|`v?zCd1~6GY_DHIM zuI>%SWq_2`oz5!SR)+`Y+-7_Rh*=FKV=WKR)m5v_05$7*HboVx%>Xb<3erVI3S%;W z%F-Jpqtb=^nUi#%)Mf-Nt4FSa{J9GM|GMS`0>-2NWn6PAvZIy1!ihW);0M*bL_fo- zEL=or+@2twHa=-}77ikW#g&Z{v2*Cmm03865XAK;Pmo6~tj@wsg!1a$7XGC4+*lk% z7Hj}?NWwNa(()`EMaca`M=ABzSo}m5xTjCK(()|)M98PZ`Krz93RPv{CBjXWFEMJW zBdyGer^rHe`l3%*o)u4#1$}*I!5GqRmg!O_WZ@~YM~4r0ny<;iX~da8=vROz5a+k2 zDhtOEJ%JScNQ}?IT|~e4{Nv?yS91y(lkvmTWo1XRqx05I&H$eNMaXhjb!-Mebq^xd z10HsjYBE5oQ^RByP;gvVUY`Lxo#wtmWVx$SlM!$_t7v4oE3eOZ!RgL&)!V8u8GzGi zzA8eNyTw#z08lSPmb>EG48Z9$ClVlYsQIoc17x~>M1m~$X7>QohwAw8835DuGZY0Z zaIkacdp>m;Ak>FImb-VV%mAY9N0z(7F&O~UsUzfPd8mfeW&ln1{5%x3WlY8oPamo| zV>5uK4~;B$Yg3Z}M4bkQ4_WTY$7BFcr`pQz(9pF7I^FYIHAHRw@bsZ;3wZj_$a1$f zH5owEskTy^!l7J~0X&`LG(sF?xj9kK1!FQmrc-Me(!0JNcEZ+9wNP+$>N7y6>!pDE z5r?tts7%TLp#BBOa#wSF1~7F!q@2P8S?;Qh%>b(Id5=AaX>)?E{P>KZ)a5<)A*Nlm zF&UuLofl1)#B-Tb)VK^l>a>>Om(eZAuT_@;MqLkdT@bwrPB~*TK&U(Y=|z^iI%6}y zr+bFskOhs;0HRL)G!(MjTb7{I<@xWSEJ3M@lG{9A-77Odsq2?iAsB(dfhMoy@fvz|!?R|-+krc;;jF!UkIU8UNL2cN#GzxOQs zB2fdJ+f-$MPp3+FH-N|K7F1;bOjlB87t3^{V=@P*2d6hd+^u0pr#!R2`iXZV2kXMe zWcE|pi=zFyx2VX>)vlyY)J>g#d}fY%-1x$S*`P4CrdBJ@?5k=3HSGSQ@lNF`GfnF0 z>D?Eva7<<&RXq`UJ}8_5>N2y{;Fh;ZJ6^ip-(xegd@rT8%1}MV>MGV|8r8FwVsv07 zM zO$v=ny_$MHWLp2U{%HNo`hoSRb+>h6=)v&q;cLU^My^c%HvM?|+HkLZLF$|79G?)d zB9#Z4pfO#M`Y_R(I4W^)VrHT?F*0FVSELS$|1V$6t4(L1d9!5_yrM~*R$jkiZ;8~a4R3Y^SC@uMSEMs>8)vVvDdk2T*mu87Vx ze`fqV@>_G08H~JOu8LTZyUjzxe~8usfj=enaC}}kjCg+M8W)6H;rYC!1LgN*p0EvVw(|#a2d`!JQrwzw%GBpLu31fj|oo*T_3BoKezvCzh?it z{gnMJ`{vO0aAW8_`-*UxJsA3(eVTn3qV`qWDc}I!i@q8CWjjG8SM$U*)|_2wH5yJp zEN$PT=ViM467|+Wu8!JAbG`Nu)p)J15I58dM4gQBC|F0C9o`JSDakyVC*VVg&> zKS9y>`=VCNV#rG2STh^FCFzhcX!K0u(}2Zc`*}SJbkY>Y&N%mE*8m#Olgu+2g5<1w zN5e+=srPQq7brreS$jJ@==|85U7i9MFtu0cE<|ddY#r??pzCB4g$IU*>^+jMQ6P2&ET$Z zkl{~XIO3r2mUjSo*6dMh=cHlp}S(%Nc3eVKujvi^q_#l z&SI373KfIcRVpRmFoo+M6h!_YgP#UH5fUpcM3+V!YC5liu$==cCHOCe`yLehmx_4n z56d{!nisRm0uo?`@r;8y!pxN5vplY7!%5J7k9rsk^}B=dXr7N}^BO6H^58?U#)y0J zV7QMq0kA7GR1`G{mO$p-o3HWghSjZqJV{MBBV2 z>8M(_825Wi($gQ*zwP!7aF|;Y*95}GAY;l4<1I}I{$S5dfVNuQBkI zQXHsJ81Sz#aFLg-L;f`eF62j981%0(Z~@;_h5c&^UdAaraGsjZRx+84E@fX3dAl0} z=esXEY+AN~_~}3kpXG@F*cjN%1*jN+O~Ff4N+yeo*%QkX2e9$W>@p%8UnIcB^LXCS zu>fZWuI5RA9`!&-1-;)OzDr+KH<9TyuWo|vDTxVKtqu=>KLfWgr?ka`C96{MG%_5| zUBw1$#Q7~ay`&&IVB*!U&Q^h5}3JX`1Y#t3ZO#5Yt?0-J(gQ7OUfUnJ9@ zK)Gv-1kYz`Y7sm&en~JdGs~D^%vJd@jneN59ylB@oyCh<_8Bvc1>TYBoiSz_^S$qp zo-t+`^SmWFGsaBg;649(&NfbAl=~17^=1dupjR>Vnu2Nos;GKR!Shuc zHR2?vaY1ivy+-vjj39U1;4iDJNRi{si|lygkB_In-^3x|b4Kg?RSJyQ&jvqBZ3;a2 z1#$MC4gQPYtin)xQ-VAA2Zi}w8}^jo3tUkZZm%hLo=S;t#KuNa6V~u3LwnCb89T-OewNW|mp~{Ildl#kSU2xAO3EI0JB%-QrmX@FI02 z>!{U*3_%=zfg#8&teDk+u*V1k;o-BCpISf5*>+^i4}>Z ziN%TeiMjZmpB#NFQJ*MJj7UTif%tCV^xul_ioYD+39SBhc>HgRZ;js)-x9wfo{MjW z=YJn?`YYor;!ER;18VlIF?RV|B>|KaIxYOQY zZ?_+_x7l0mTkI`}9+0y)+Z*jZMA=_yudtWei|zULTp;)-+x5WkkFcZodfy#=7tsn| zj_!=^h;ENQ7Tp%z8oedDC3;0P7u_7)810L8L{~;vM3+VvN9RZ9MrTGRN9z%9U_>+u zpMl+xcO!2_c12!}?2PP)Y>zyK_yb!bw?wu?u88C!nV`y$@W@vJ#K2#nW z5sHQa)^6)vL}T0qtjJDlhqc{$%-V+N2e(*T5S=lHQw%m@9_z4H0?o11T5Qd?=2|nY z$yU8pZjG>_R>0hCzH7c^?t-`9PIHI3-F(cPpWdB*H~m(6SNi4jPMj~f9eya=;E8fe zdQ19>bYFUNdSiNJdVYFodPHhxYIo}0)LW^?Qn#c!QY%v{QX^7}le<%Mle?0SCAX$K z(sR=@)05Nn>GE_mwIj7XwG9y~wxq5|~ZZ#Zchc0+mcr# zHz)g&9m$o+70IQ^TykS_adLigZt|AomekDD?gs6o>D}{~{x|h(ALPs#gcfHV*(4^3W&^S># z_EM-V6dS0_j|dG54GBen5|*1n4WU7y0Y%Nvg?=XVUrawVKNb23(+|v#g?=P-H&cYY z5c&brx6Qu^{VUU_%r}Joj_I$>*O|f}n(52tYeIi3^i`q15&DYI|6uy0`D>vsGkwDR z71I~ZUoyqEgwUTeeZl-0)91~fGW~)1?@XUFcQSp({0Yccw5c<5(9|(O;=(9qf5&C_h+l4;O^nUX(p^pmvj?hPhJ}mShp$`guKDYRMW8A4ANdYaHvg`OhxWT7jBo+Na+ z&}BkT6nX;FiRSS_j}y97=&?eNVTw5XLXQ%9q|hUTE)lv|=pvzq3q4Hep-jh{3xysc zbb-+MLgxuRm?xBy^V0Mxir>&Ja3XXoJvc zLZ>o?T}9~LLMIEIBy^(C2|~vU9Vc`wQy5)@)(fo@S}U|hXtmHPp_M`_gqAb4&Ao(< z6gom^T4+jWQfNYGTxg6aj_C^v4GFb`nnDesL7@Rfjn9RC#uR25p`Qx>f>y2pBm`FC3nGTmxD!1OL_8`C?j`ZccUT@vV^cw4W;q&}! zU1QzA=|`-mm?9>Z&?iLiI+1@*(ma3DfybOiq%x*BYMg1ebtO}55eU6p=w(7L6?%!# ziaxDVX~ZrQ%JVt+=X3gL>-$2tGwrf25_+M~3(|`NQAZ!X`^?Ao z1XG-KF7!O1=L$VX=$Dw{%=7dLl%wF=a(PhXnekZw*dNzYE#;QYQ1Q*Yv|zVAifNZp&-65W})Ak~#x9$k_;BJ$_RhSa>& zY{dVoO2v|&05$L%d?`N=y*2sc5kEM3RrJE>V0>1*DjtgcA@*GCcI*^f z5?dc@#@;}!{h9q9b_0Hcy@2NsLGYgFsS!Gr;2gW%KFMBU9}v02o?(xPd>Z+2QL0^JCN)Y7)fdYb${+2?_6MK_W2?y-ICJtv%S z6f>?O`O%vY%aW5>N*=2{8LUloXb~r^jef-qbQ3Aa>LIuH?%uYRE)~V8jqXC{lme#- z@1p^$m9*g@*h4`Ujv%j0rH#}Q67}F1QxYwrjHvpVItI}sisGOd4T#4CrCM@-q%-ga z`r6yuh*Lw=WB{fWqrwSGNoGUKrb_n!F}ZO%0Mh2)++=J2p!rv-wvv*m!u%771uG4_ z$HSf^&>no!EcYbL%fNbEN#3W78dg?YU}>@rOIgvtI=9T6ExwU$?Hk&=$W4-}*5W!y zYBT;ycC@5Z%1EJ^d^LNO6Y62qCM0-nMq5gt^KEem=Rq_w|GtDu(Oq36&;Twg6Ywo8u+^l&iOQuz)a#MjDq_(1a3 zMeNOi_5IA?hzdBZ7Y{3V0PCsf3j5QW)zi}7(zBK=>H$7%vWKsO`;lU|df;>UdJ`AG z2bFcJL&b0~7<825JbO}is{_XNVZIs?v-w&%$u^v5tBV*qORpJ+>*#SI*db)1hVXGp0gMqYmlr>=^9rWyMojPdQ*u z=4;i7llWS7;zYhyoyLcpb*sbK#xq}a;5aU~W#b@RyXiissF`U15!YHaRM!R{d4W*Q&p2_*(T>wVH)AaD1*WX?(|@Je+*%heVRk z*^|V0WRDV_b{xR@zB02i{M>lhmpYVYQkgmN+8Ghg)QL&3#*+lpAf6FN#Jayf{bu^b^!@3pVUwk^0>`JrsXwKDl6o+84Mzw# z2+{o_$v-83mV7+<_2dQk{$Gr5{}DJf@Yjha6E`O=NVFvuC8i}t#y`Y406&P|AHO!f zDc&4k6rUC^iG2u*{|{pK#;%Ti3AX)1V&h_#{kr|EeFx(1bs}m&gPjJh{^y7V_zgt* zUlTndIwP8jyaOxygORHv1CeFc)v!OGZq0+e*+L|Nm&}LE>&!2i%gt$KsqvZdhVet= zL1T;YWn-0bm@&Xw(D0pY^!r&RfdBN`B3BftRYQ4@Y&s8d4P(VpHbRzD(`M&n6 zsK`~Y_egaPe*EN!(;|+Y(+4)JG2hc_V{>rcCr=tJZaAxh&I$G@)o0Z$%28R}+e=|3eFary;k8faia|?-Ja=nSmxaeZIZL&*uWni2h4blwrEVR- z(eJvhby;}rdo{WM9Pw$CX5q0<=OChdtUb&Rbk@o&JoU*}34(^U_Cg_C^R=+0tILgz>V@#zB{j<_ld=iCWYm-ba1y}g1Z(*>7j;g?H2??TI65nOUf#E4Q_7CNp^6SijG(${~cV>|341NQk8|HI5{`MON1OT*caj{J@jj`@Do=)%{&zs z%B!<*6Q|#lj&}Z7SJ{89vsY!|C$2mvJ(1(Jv^onXamqa44N~~BD~5Bp7CR9O9dT_I zp5f#g>U;*On>z~SS$Kz2cm%CrI-<%foWg0IUyDgX+T;jpvTz7z&uDzpclP7Uf&0Xf zmt^4#PDj?Z;-t|5^GRLb(OLL^JLknZ?5Zr>zPW?@`^ig$3wuIms>;IQo1}WeN3d@5 zMJ=t&!rPnb>Gf05!m2FXybH7LaHa6?E|k9DO5xpID1F|Q!neCn`U6)AukJ$WbFLH) z-G$O;Tq&Hm3#H%J()uiXw`q0Z@iSKa<)~C=;kjKj;I``$s5M{jq#o2fhtw`#hLKI7LFm1N;l z?T%lkq_Qkrsre*iIoQ~dRA%8nJr2Ke__lB&%IoTtX5l+cYniT=O>jUSaNKoAW#KkW z3lplD!!6CiU7FO_wD%w+SeHitA88U`6Jr3UXE=hgEIg!X4dI+{qHkTEg{Rc7G|O)r%`Sja1^%EB3%I@|e-@=7bR@P?+Pj(ntK~qlM z;~Y<4*QYWI4`^OlN(dNl*0L--pR15np{G5~sLalkY!U#*o2@)MLp@_>&3~_ZyXn$K ziT{Fpj<6!zpjshk`g&zm*=ed3di74N*s6;y&rVf$)KXVek)5Inb)qdAC(!x6TMH}FPh+e>RwT0cD((LS!YeD!;scW2B^8O8PIA(>tH_oYK6OV{mM!x? zbw^U3Emf7&!^m4;i7IfJ>l3MOM)v>SNP8gt2BQDpo&H+-d_?|Vj_>-(=?Yl?KS}*H z^&0H|&qg1J+!wt$x-4>i^pMmesk>6wM>5eFsf$zRrrJ_RrKY4p$=@Y^o_s#C8z}61 zk~bwUPM(|WjjT^D$0>l-i4PM$Pdp#__rwEbb>gKxmC z*ayf*p2l9lneo%($Hw=IPmboJ8zaAur?D&W3!wim#d(115W9a_Y*B2#*wk1hp9=W8 z{gVAS_6M%C&&3YGGJ8R!Jz8havd2d|>{7%S{5bl0^hNzeKTL;vV7Lc{dtkT+hI`=u zU=Oe-XlKvruJs$+R+U@#u#@MaQb zl;DHx4NHgLlIwO@rP#XH6bz{p+e4dzh){#zA)OL`!sLS>xl8a^Lh5u$-$sM^OMV7k z-VXEUMLam26!GAIQpAHZN)Zo^DMdUusTA?xuu{Z>lS&cqyC$NT;DldY=e`p2ALh{3LDy3ps1U^zJ6$U4;d$ctvXmoS}%%Y9ovjdkZ z72p-9hri7|+|l_3J^Uv3uwSL9hu`2H_AB{&_;=jH&?tBxzr{Vwe18w$$I&)0adlCc z9_o^invr~)pyunvOn70bM)KS_C3vrDWcwF1@^#fnpGr|9cd17Dl>Ci+O*OK;u#xwu zMiSrO$h*0sYZ!pg6!=i3R2+i92Ykfcn)O|M9Drr*zz8Ll!Sqj+lEL)8N~zf^@DG)e zp`~8NHMA{?N4}MN1F1c~RKMlk@T(N{#;e>LekFfz{Dyl28U>I1F76HH`+MU~Rc$rR z2L7&63_NKHysJ_&?B7u-8TNluDK)Iy)`Of zikT_o!I{M>;>|U#;m994uRm10`IS8iQJT4D;auZtvj4BK&I-U2{lLhiNGSa0@K3@I zg)a-YA>Q4-;i|9^dK=#4kA`jl4xlY`2>ie;>$lbu*0t7I=|8|%`yNF2J2QP0V*8b* zK7)t!^Qo<=OH%!*6H@!8Dw3ZjUrj!jyaOK9J;~$Y1%Trd6TeS9m$(Or|8jTuR<(<8S%Yh|BC$%82-Csm&XQUr^F79)z}}~uh@^;U$@T(X8%Zg zsvU{`A^OAUJ<-df1JRSC^Wb|Qf=9wnfCIQ8a+Y-rP7)XcC!lxDUztziG=VG34d!X) z!FbMLME(1j@hHv|ILBx<4lyPe;ou*GF9q)pUJ+auTo&9fSmUe=EAkPwapGbz&(|9# z75Om9qG2a~ht=iELP~bn#@6<}L4XHcS#{o0yXlAawyq}wGOzBOtkro_#E5FWs)Y{p z!Q#&mSLF@0QMI70rH=prK51DVXaw4A7O9)BIu9TM?cp!gQ3omG*}B5jIY1Cdd{igS z!){wb_8Y81wYV~Op4#Q|E>T?}PzSUNyU4Rxb%lT(h|pQKYGHK_hy%Lo;VrH0t6)9$ z-?btKxPiZi&(v8fazGr=)|v~8bz~(u01jv`USVV%et8a91KM(PkhG4dA_ueq73V(a z0rytG8<1=PnWMRiYqhK@2h0KOPkSGSBQ47Tc;I~;9tm&?@LEDqFb4tI18I07n$JH=sFOGHqzQ*#{s|*Rp(%&rMK3BTodp_P z30rIJ@G6{ugxv$nkyPYht))5+oYgtl+Cj2uI#+oP=33V*;uY28V6r6$f&a8hCu>Cx zMq4V@6B$YuTbqOBmT(P)F`~4>m>lf46e)a&Xi-|HCI?$CRe*JPkxO--s^w)lSahi` zoXA*OQjvo>*WY3%S49pMU6Of@e%ATQa%9(qOdr4L0Q81eRF;FmS7mDBBdVQSmFHmW50D=_mSha)V_!OTl|MLCbu5tQX%xI5?#fTmkeo`Z3h9+q>iYpE8M<;1kBUj|1~n}cbW zhN*70_#`Wheu!`5B~Q*0SylK>l0^P z*l<}6rd{e!XG>MLt}+M1F7>B+lc>+!Y}Gl~b|;_~z}B{7M~+X0aK)uL*mpg+TnD9G zog1y&P0Mx+pi>rJsJ#GEH*c0?g zOL8&wc-cG4MN60GY&8ts9cEpT@?2Dj+|6q(s?Onak%pOn8(WJjbNFJUN33?QsV43n z>vH&Ha@N=SH8#_x#E5|DTnvPW>zOO6rN!{n1^in-D?mA|U*GQf<*~spY97QU|AI zrD{{@dM0X;Z+B3=9lIJH|;P1aAc~G)3IU!k*OeQ`@B*E7bKTbTAxDS5*UrlU6 z+`y9(het0=><2G^ddI{6<@hu4+v4ZPTjI;&OX3G28sK=u0*uB!jlB* zuSVaN^q0wL)!kg|B&Ss`*kKjG)oH*~W`Q zvrndTw7C!$RnNs7u?K;%V^4w=%5&4RJ|9h|O*06ir?ZDmS0_`a2+r5M+ncz~n<()l zjGMfPsoq2-Ic7^~Bk6=};DmuWRu{&N`l5pUe3hd+vcOkb`CKbLFWrOXRIXsu&8JvN zIa>4S?q@3J^-|)WshqAk`oNjWVSP07*=QLY#n;N|d@sJ{ZGe+(yuh!4 z@$G;a-Xh0ih#V1|Q^_@h4I+%-5>>Lwv3L|1D~kM(QM3p!&f~m^DES ze5qqC1q`yv={3~Y5puTqWg+9|g^ZsSGJaaf`1eA_&O*jd3K>5xWc;v@@hr_Bx~6^R zKh)gQ*1i$n+r|ytST*nrzGirf`JTGwXB*^e740Cv*E|>kpYyefIPjUi#`AxGpZ}gA zEq~aKl{()yVn2wxAF5Y#IXeL=k_8yp{}ebO+DUkRSO{k#&}RJ zC(*g`1sIp*)HsE33H*z%dC&(wuF@srx-=?1RLr}C+8lN`tCiSdeUeL2|P|x}`ygmCndb1$* z_w2W*XPN7Jv+kn_#6_nZsuH{>Y1|*!WTegHE6FF5Ur!An4tjHPVRB+Jl=ut2+V4wThV%N4 zOYEDdh<_A+CH_?W8}SPeb#F<0YCM4m{lAVq3oHFqu}!fSMB$$mD@UZgU5K%_)xOkT zZ=Y-*WY^k3oP+lQqUYzMz0u>Mv!bISA4Xn@JdHR4+tatC&q<$}UXZR!eV+P#>P5sD zye#rfU}ZV&p#_z9D>GxHWuecxrewV%@(PdMWf!=;lx+ z)EPP|G$XVZ&Leyo$b>tsi>*%UaBFWX2b%aPzQ|NjDu3J{`@h9t9>_~08cE^H8r{!VdIjl&zU|cHodoTZJ z?>y{2^NQ5HgH-8W`NO)BJnTRf+Y(|!zx4@a)4r-+1^jEE6Z_QEX%_pL|e5KvS46cmsbKi z5N)PmyP3mzIi9^^^RNK%S+ZPU139zy0>ZJWyUTh+@8gx`VGJS@0v4LMt1Fn4hb8C$ z+!4V7*0#3}>T}OeY#>gNJnyb$Qr@XtQvk+I%n8n3RWoh{_TTDRQ7#b3z_gB07Iu zG#4`huUM}#4|5T9)DW+(w{vfQyLFGwQJELtK#%Zl zR|tbqK~BdXuQD(0fu5XqxjA7mD#&@KD-_F-C+B^x5SF8YocC&BNgmcCwh>XR7V8ep z-zyK>5gDiuG|pj`$I#o4?_`^dN>+$;-)_SowT;NVpxi__=L{0i^Q-N zY4I^F0Laq^rIWin50eqqi3<0NO7k!lku~Ln*(|tL-?1VOGZ7g(kD}m5epz`Qb|Naz zMfK}!b$NIJs+YAJ#|RGSbJ478v_@qfzJO!!loxcZ>FvkYRw$+_$@WlvR z=kZ!vnOm*qcV)TetjB3#MXp^<9l&(T&eYLbR+(#489lK&9br|jRo&AYxYHwDrKH|1 zFpsoFNhNLrSILpq$&tt8yo+{OITQF7554rKPzQ zYUMQmND88PIgqN_+)09S>FwHt-_D|(mAU1rGu*93H+MyDnR>V$cPf3$+T4k%rM zJOcglI3Q*mLa6Irl?Nn&Ov(Z}!ZwHU}~d0ifm1p4t_+TP#Y$-mv$J;O@E(J0FUm_TLg zO>0L|n+GU?U?~fGySlKR=NPiytYh-PCJ=~=ptbnnKf9$^rzQ`CLU9GZqANHi52V7- zWjHz&c|aDZYmNs7L{;B`u@nA(Wnf1j{d)T8^sP8)ZE1R9I*@u9=c`?Xv(lEQ=A`OU z!Q`)!_b0!cJQY^`Na9uC_qW25zdSKHk%+$?e=>dpko!l)8xVQ_7qM@}E{?5%hyFxZ z;BWzbRL#wRJW~~$H$Zq~)-eEv=Ar*I?J5480nBI8YbqTWSi8arVR& zo|0Po+X4FGl028t8)c6_33|THrp_AR&gLsCQ$9u|^hKjB~ zMe0-RsmDQ`hY8B%28*(4y-tvFy*+y=l=-PkB_se&GsnZDs`wa`snniytf%JE6BH!R zb4iMEd(tr;Md<@l^jtzQ@S#2CXejc7muip}-JK|@{KcMhl&36dH%UF0r1)!l!jVwq zN3YvYYO3*kMQT5>XB+{wsZ)Iqw@(iBmWJpgWq8h>vBZ->TA(!wl9b^Qd+)`_Fkyna z19znq@4Y6~d+ZsDJY`FZblC+-%5bCIa5ysPp~(+ftE+}ODN?`EKHxB@&zYmDqARQR zaGHCYDgMxqOv-$bJ^oN+*6)&Z4GdWB71TD_;}?3gq%>%`SJ3LRYY%}|6+Y4R8x9rf z4iLy&?C}dcrAW&mbFZMa%pN-*T6Nfnai&t}sD{%8bdI#A&4Uj25ats7Kvk3dDQGXS zrycCk_ViV;z7{X^BzA zB>~;AUAI4UYiiWYrMI&*HE**b)AsY+n(EcMzQ13=GW{vrymg8_cP_M>n%u|Y>{vGU zA#ip30O#plj|iKc?E}I?&N23^Imqe#*>H2VH?Q|+0|R-=?J4^rk8Y?>#g~9?+8*Bo zT|M|ntYUDvSI`RERr^4zqC#~CZ+^6^zviu0WX5a=3*K~XLYJYSleYQIK;E7{OJ~5) zk;kt!3X;gM$)4N@eSXp9XG<$nE%h}td+g~mJtfN!&&i4*f#teQ8b2Z(5Ps$x!glJnNeKskR`t zdCNk3>?FwboI(N)xa(X%2l&j1d=vLIS>4sLhE#|`V~Ra-0yMlcgFsGGUx~R?lqHJJn4Fp&>v+_99K~8s{Y=y05m3Dxr828G-IKsS2PP$&^aOI zEtnO?K&;0T>Owa9W^CC3vh7dV<~P>awe?(>YOctIK)%|puY+7K*ZSMnU`^YONk&m< zoMca{_1sTe3;BkF{uH#2u zEcet6{7x*K@dvW7T~-EJNr{@D=v#{Zo8Pb^lS?7+P90JKo^bWGZQgvMJ-MVv6H|KU zApd+0w5w}q9%)Y=?a`Ds7%TnN2)Rs75?ImU8k!62v7?~r9rG-rF{O3p+SB)fjvlGH z1aZ+VNTN*qHjae8egj0I2fN#zOX!WWCyywuB|}g|k*}dyZda$Fsk>dxV(KrXX}dH9 z=_puUWJQ76gO4{M3BL0twDQl=0!7T5tw?zS;u3g`QZ^bV^xrmbz(+_N5q+g zUU)+kg~s0Y_!uU$`4?$BuP?8R`cdc%wV7%>Z1xe^9 z?RpFPx<7PiMopm+va3vJ=wDxDd{ckT8>~pZ@rBuM4B0h7Xy_+(f{I)z#Jtgp(D(nS z#OVQ?y#Af^W$D%FeNrFb+rJAZo`;gJB_BBS#%jG@E`L|D{@39M2i;r9wAv) zo4eb)S3wc@eE-uNS_tcFw|zv1r!1*yp}K6BDcj@FLX_2FAGii(?YEz*mps-2^`W`Q zz1%)7m*?Z~b7PwBCEZ(Nv0j)U!qZOEY?m#1EyOX%%mPi*z*$qPe; zdoH1e0kR5u-T^{N`p(e60BP}*`pTl&KE+VpYhx#^m; zk@{omrPM>I>r>~aI#b7`_D_vVC6ezXf0}$Gc|BtLx8PjA8OhS5k@#EUKN8O;9>m#x z`NUwNIdK#``zIzw#6OO|iP-)R$8U;fP{`>P| zlVc<7-S(UIPWwsw7W*Q*!#>fTZ%?yFaqRvVP`TlM!#yzE1H(Nq+ylcsFx&(GeS4t7 znqe4N=5YMv23}huiZWsx8+(w;b3$#4flu|r$|2b3ir)^!ZZdkD5ZO`)1{gvKs-l|rC`5s; z?pfGmbaSkF8n1e&qKBsyG0`pe6fnJ? zLkdvJyF&~1H8wjhFc*b^;Fh*-Pcjtv&K_m^8eet>9ha#=!>WyadlaJ7zwKGLuW_F9 za_9(i{J7>1!A75dZz%RG;}~ZUYV;IUYl69CD86x<@xqY&*~UrEjP63~sHBPJaYIWm zcz?17$v#GNrPZij0et@g3Dm#`WN`E5?LmYlKD8&&EaPbBc{_+aRlB7_3Q)Np4=vco rIHS%wK Date: Thu, 3 Oct 2019 16:38:52 +0200 Subject: [PATCH 057/135] Delete .suo Not required --- .vs/appwrite/v16/.suo | Bin 19456 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .vs/appwrite/v16/.suo diff --git a/.vs/appwrite/v16/.suo b/.vs/appwrite/v16/.suo deleted file mode 100644 index a03af2a26673e7d6dfbba0e484f98ef4443dc9c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19456 zcmeHOZ;Ts96(1)w{lmYMwn-=ft|e{Ll67{yzO#L4Lwx5mN!#m{T+$R_A?>Z#7bm{6 zYx^!av3kV^QN+c8s6(Ip-HF#e z?|SX?IhWwE-p=go%)FU5Z{EE3X8ilt@BGW<@80{iXbDHfPVvtA?P8ZFKZ5iQ`Mz6- zcOlKZch=X}nY|N$bE_O*k=PrMaTLJz9K z0?dLI2EcO5`9%kS|AYAWJ^=gSSI(RNZoFJ^GiJmRu#`j*<0s5}FlUfc^;T??CVs9% zNrN^;He|(+^AA=+xC8KCS-B0KnUapgO~Ey-}c_>;L_jub@!b^}FA4{d2waas4;(R1kjo?Iv6Q zU60?p{w3Gk0^(2(aJ}7*v|M+b)7t>DoQx^!Df2$o=9?@d<9ktNzgzCZh(7}OC}0FY znQ%Yg0N_4=#4GC#n|05gE60iOb#1k3_X0Zs#+0h|HI zzM%`-HcUX{DU0)B0oqO#aag?v!?VMF=pPZJq)y;w2Sysca&8$;0dEa>pMaPdtWI4%Rd@V% zA#9$Cy=2R=ho!$4hm=u_hw^`Y{r^q=XCQaxAb;lZqZB-2 zTfHWvFlAupFw%qkqr9N5z|e|+0)4R1hx4$;%eE}^N?WIn_jwTOpLQnol(76y+0VV2 zp%p)6o{1h*0;R4~m(K?=e(KKDg~H;$6=miA(+mL7%twFYLL+0KO{FIyYfrQ0RyNUZH z!z4ye4X6gKu?T8k*w727oZnOKKhpQ=SI(R7rGFpvKidb)H63>RH<|tyk-Q&v{QcJd zDEr9MVe$7{|0C~F286{w)c>}R{@1$y+=%->WvSc)kn9+4vi)Ds_M<)(cK!8x|0iA< zIuaiRy!%f-_J8VsoKyB84E}!a|MY!a$Nk?Pcdzu{xc+$xMNf=#5|)N0T!DT>?*}~* z%=HH7pIzgp>w`KIgV*0N4NZt%7{?Nc!vDd(EZTZ-*472-C26)wsQ;4p$+e9n=_V%xLl{9cO74HE*_e*L2y|s6y%yzsqWIF8n|6ycOjEfxn z-j1zUL)sL}c*_AAJd^`3(W<6LGlw-!sd52%lquG=9M+|zaqPbw=APCm{jw~>k_)Iu zi-~Ecr2@_am~Wu164HikO`b)HoV;vfV0p)ij3UJrUdZQu@QXh@@YkOlc;V~E#y|UJ zI~p*rQ~1s{9)E+DRnSL{eC*}Rk5s??%Jerb-~FqfuD0@@!)aZ~e|!CRJ6oNOY?As?kM6af zr2lb%|1R#;1amm+4%)@L@5N^4pSB#q<>Co9!DjchY8g>z95w9zfgex1EgV;Iw(9*U z*WQ9t-a1TgZJ^#g4UMN{YdFs7eHG~?j8mRq3-K84=2GiCV&9RtB+@w7&Ejk!f%hq) z;a0_joz{`k@XMgz3QF-?8Yzw=4VV-uJhS$1Qs`n0T16gIZN@tT+;w0hRtDa^@C!VL zrvGAxxDv^XtN2|?$Fft2_>`thB;vZFX&F^XPibjIRnzKZO3h}ollt1~qtnHjnJt#A z+R@d?@!aW}RjuXBP3~Tq zWOr-Dsh-x-*0gfSuwn^gY)-{&#z&QSESXeNWBGzIY8eGR6}K#XEEQGNn64*RTLsKM z5rGciYz_Q&+t2R9ldi&nPfo9EVRviA-X>>jTIs{&$TL_@&d)J1^a)WPb#@IAV7)tK zp2vRVuebEu`(VH;5w-mjOXwN@DZ%sF8uBW*Em6Vk!ZMz`A9fU{VRsC$XT;e}&p=|= zvzN2!O?~Kkg?`}PjIQ6V?jUI~)c-d}?V z=}d7N_s7JRG5>67Eba{kBhVgUAjd(}G0F6XAwAbZr9qxOD2=dPijJ-Z!j*7o;) z Date: Thu, 3 Oct 2019 11:39:38 -0400 Subject: [PATCH 058/135] feat(locale): add zh-tw --- .../templates/zh-tw.email.auth.confirm.tpl | 24 +++ .../templates/zh-tw.email.auth.invitation.tpl | 27 +++ .../templates/zh-tw.email.auth.recovery.tpl | 25 +++ app/config/locale/zh-tw.continents.php | 11 + app/config/locale/zh-tw.countries.php | 198 ++++++++++++++++++ app/config/locale/zh-tw.php | 19 ++ app/init.php | 3 +- 7 files changed, 306 insertions(+), 1 deletion(-) create mode 100644 app/config/locale/templates/zh-tw.email.auth.confirm.tpl create mode 100644 app/config/locale/templates/zh-tw.email.auth.invitation.tpl create mode 100644 app/config/locale/templates/zh-tw.email.auth.recovery.tpl create mode 100644 app/config/locale/zh-tw.continents.php create mode 100644 app/config/locale/zh-tw.countries.php create mode 100644 app/config/locale/zh-tw.php diff --git a/app/config/locale/templates/zh-tw.email.auth.confirm.tpl b/app/config/locale/templates/zh-tw.email.auth.confirm.tpl new file mode 100644 index 0000000000..9ba081bb91 --- /dev/null +++ b/app/config/locale/templates/zh-tw.email.auth.confirm.tpl @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/app/config/locale/templates/zh-tw.email.auth.invitation.tpl b/app/config/locale/templates/zh-tw.email.auth.invitation.tpl new file mode 100644 index 0000000000..08fb921fd7 --- /dev/null +++ b/app/config/locale/templates/zh-tw.email.auth.invitation.tpl @@ -0,0 +1,27 @@ + + +
+ 你好, +
+
+ {{owner}}邀請您加入{{project}}項目的{{team}}小組。 +
+
+ 請點擊下方的鏈接加入{{team}}小組: +
+ {{redirect}} +
+
+ 如果您沒有加入該小組的計劃,請忽略本郵件。 +
+
+ 謝謝。 +
+ 來自 {{project}} +
\ No newline at end of file diff --git a/app/config/locale/templates/zh-tw.email.auth.recovery.tpl b/app/config/locale/templates/zh-tw.email.auth.recovery.tpl new file mode 100644 index 0000000000..8a473b5537 --- /dev/null +++ b/app/config/locale/templates/zh-tw.email.auth.recovery.tpl @@ -0,0 +1,25 @@ + + +
+ {{name}} 你好, +
+
+ 请点击下方的链接重新设置{{project}}的密码。 + Follow this link to reset your {{project}} password. +
+ {{redirect}} +
+
+ 如果您未曾申请重设密码,请忽略本邮件。 +
+
+ 谢谢。 +
+ 来自 {{project}} +
diff --git a/app/config/locale/zh-tw.continents.php b/app/config/locale/zh-tw.continents.php new file mode 100644 index 0000000000..e2a47e4855 --- /dev/null +++ b/app/config/locale/zh-tw.continents.php @@ -0,0 +1,11 @@ + '非洲', + 'AN' => '南極洲', + 'AS' => '亞洲', + 'EU' => '歐洲', + 'NA' => '北美洲', + 'OC' => '大洋洲', + 'SA' => '南美洲', +]; diff --git a/app/config/locale/zh-tw.countries.php b/app/config/locale/zh-tw.countries.php new file mode 100644 index 0000000000..348e8b8bf9 --- /dev/null +++ b/app/config/locale/zh-tw.countries.php @@ -0,0 +1,198 @@ + '阿富汗', + 'AO' => '安哥拉', + 'AL' => '阿爾巴尼亞', + 'AD' => '安道爾', + 'AE' => '阿拉伯聯合酋長國', + 'AR' => '阿根廷', + 'AM' => '亞美尼亞', + 'AG' => '安提瓜和巴布達', + 'AU' => '澳大利亞', + 'AT' => '奧地利', + 'AZ' => '阿塞拜疆', + 'BI' => '布隆迪', + 'BE' => '比利時', + 'BJ' => '貝甯', + 'BF' => '布基納法索', + 'BD' => '孟加拉國', + 'BG' => '保加利亞', + 'BH' => '巴林', + 'BS' => '巴哈馬', + 'BA' => '波黑', + 'BY' => '白羅斯', + 'BZ' => '伯利茲', + 'BO' => '玻利維亞', + 'BR' => '巴西', + 'BB' => '巴巴多斯', + 'BN' => '文萊', + 'BT' => '不丹', + 'BW' => '博茨瓦納', + 'CF' => '中非共和國', + 'CA' => '加拿大', + 'CH' => '瑞士', + 'CL' => '智利', + 'CN' => '中國', + 'CI' => '象牙海岸', + 'CM' => '喀麥隆', + 'CD' => '剛果民主共和國', + 'CG' => '剛果共和國', + 'CO' => '哥倫比亞', + 'KM' => '科摩', + 'CV' => '佛得角', + 'CR' => '哥斯達黎加', + 'CU' => '古巴', + 'CY' => '塞浦路斯', + 'CZ' => '捷克', + 'DE' => '德國', + 'DJ' => '吉布提', + 'DM' => '多米尼克', + 'DK' => '丹麥', + 'DO' => '多明尼加共和國', + 'DZ' => '阿爾及利亞', + 'EC' => '厄瓜多爾', + 'EG' => '埃及', + 'ER' => '厄立特裏亞', + 'ES' => '西班牙', + 'EE' => '愛沙尼亞', + 'ET' => '埃塞俄比亞', + 'FI' => '芬蘭', + 'FJ' => '斐濟', + 'FR' => '法國', + 'FM' => '密克羅尼西亞', + 'GA' => '加蓬', + 'GB' => '英國', + 'GE' => '格魯吉亞', + 'GH' => '加納', + 'GN' => '幾內亞', + 'GM' => '岡比亞', + 'GW' => '幾內亞比紹', + 'GQ' => '赤道幾內亞', + 'GR' => '希臘', + 'GD' => '格林納達', + 'GT' => '危地馬拉', + 'GY' => '圭亞那', + 'HN' => '洪都拉斯', + 'HR' => '克羅地亞', + 'HT' => '海地', + 'HU' => '匈牙利', + 'ID' => '印度尼西亞', + 'IN' => '印度', + 'IE' => '愛爾蘭', + 'IR' => '伊朗', + 'IQ' => '伊拉克', + 'IS' => '冰島', + 'IL' => '以色列', + 'IT' => '意大利', + 'JM' => '牙買加', + 'JO' => '約旦', + 'JP' => '日本', + 'KZ' => '哈薩克斯坦', + 'KE' => '肯尼亞', + 'KG' => '吉爾吉斯斯坦', + 'KH' => '柬埔寨', + 'KI' => '基裏巴斯', + 'KN' => '聖基茨和尼維斯', + 'KR' => '韓國', + 'KW' => '科威特', + 'LA' => '老撾', + 'LB' => '黎巴嫩', + 'LR' => '利比裏亞', + 'LY' => '利比亞', + 'LC' => '聖盧西亞', + 'LI' => '列支敦士登', + 'LK' => '斯裏蘭卡', + 'LS' => '萊索托', + 'LT' => '立陶宛', + 'LU' => '盧森堡', + 'LV' => '拉脫維亞', + 'MA' => '摩洛哥', + 'MC' => '摩納哥', + 'MD' => '摩爾多瓦', + 'MG' => '馬達加斯加', + 'MV' => '馬爾代夫', + 'MX' => '墨西哥', + 'MH' => '馬紹爾群島', + 'MK' => '馬其頓共和國', + 'ML' => '馬裏', + 'MT' => '馬耳他', + 'MM' => '緬甸', + 'ME' => '黑山', + 'MN' => '蒙古', + 'MZ' => '莫桑比克', + 'MR' => '毛裏塔尼亞', + 'MU' => '毛裏求斯', + 'MW' => '馬拉維', + 'MY' => '馬來西亞', + 'NA' => '納米比亞', + 'NE' => '尼日爾', + 'NG' => '尼日利亞', + 'NI' => '尼加拉瓜', + 'NL' => '荷蘭', + 'NO' => '挪威', + 'NP' => '尼泊爾', + 'NR' => '瑙魯', + 'NZ' => '新西蘭', + 'OM' => '阿曼', + 'PK' => '巴基斯坦', + 'PA' => '巴拿馬', + 'PE' => '秘魯', + 'PH' => '菲律賓', + 'PW' => '帕勞', + 'PG' => '巴布亞新幾內亞', + 'PL' => '波蘭', + 'KP' => '北朝鮮', + 'PT' => '葡萄牙', + 'PY' => '巴拉圭', + 'QA' => '卡塔爾', + 'RO' => '羅馬尼亞', + 'RU' => '俄羅斯', + 'RW' => '盧旺達', + 'SA' => '沙特阿拉伯', + 'SD' => '蘇丹', + 'SN' => '塞內加爾', + 'SG' => '新加坡', + 'SB' => '所羅門群島', + 'SL' => '塞拉利昂', + 'SV' => '薩爾瓦多', + 'SM' => '聖馬力諾', + 'SO' => '索馬裏', + 'RS' => '塞爾維亞', + 'SS' => '南蘇丹', + 'ST' => '聖多美和普林西比', + 'SR' => '蘇裏南', + 'SK' => '斯洛伐克', + 'SI' => '斯洛文尼亞', + 'SE' => '瑞典', + 'SZ' => '斯威士蘭', + 'SC' => '塞舌爾', + 'SY' => '敘利亞', + 'TD' => '乍得', + 'TG' => '多哥', + 'TH' => '泰國', + 'TJ' => '塔吉克斯坦', + 'TM' => '土庫曼斯坦', + 'TL' => '東帝汶', + 'TO' => '湯加', + 'TT' => '特立尼達和多巴哥', + 'TN' => '突尼斯', + 'TR' => '土耳其', + 'TV' => '圖瓦盧', + 'TZ' => '坦桑尼亞', + 'UG' => '烏幹達', + 'UA' => '烏克蘭', + 'UY' => '烏拉圭', + 'US' => '美國', + 'UZ' => '烏茲別克斯', + 'VA' => '梵蒂岡', + 'VC' => '聖文森特和格林納丁斯', + 'VE' => '委內瑞拉', + 'VN' => '越南', + 'VU' => '瓦努阿圖', + 'WS' => '薩摩亞', + 'YE' => '也門', + 'ZA' => '南非', + 'ZM' => '贊比亞', + 'ZW' => '津巴布韋', +]; \ No newline at end of file diff --git a/app/config/locale/zh-tw.php b/app/config/locale/zh-tw.php new file mode 100644 index 0000000000..6d4d83d461 --- /dev/null +++ b/app/config/locale/zh-tw.php @@ -0,0 +1,19 @@ + '"懂得取舍,方顯睿智。"', // This is the line printed in the homepage and console 'view-source' + 'settings.locale' => 'zh-tw', + 'settings.direction' => 'ltr', + + // Service - Users + 'auth.emails.team' => '%s 小組', + 'auth.emails.confirm.title' => '賬戶確認', + 'auth.emails.confirm.body' => 'zh-tw.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => '重設密碼', + 'auth.emails.recovery.body' => 'zh.email.auth.recovery.tpl', + 'auth.emails.invitation.title' => '邀請加入%s小組(%s)', + 'auth.emails.invitation.body' => 'zh-tw.email.auth.invitation.tpl', + 'locale.country.unknown' => '未知', + 'countries' => include 'zh-tw.countries.php', + 'continents' => include 'zh-tw.continents.php', +]; \ No newline at end of file diff --git a/app/init.php b/app/init.php index 30d45e602c..7734ed864b 100644 --- a/app/init.php +++ b/app/init.php @@ -24,7 +24,7 @@ const APP_EMAIL_TEAM = 'team@'.APP_DOMAIN; const APP_EMAIL_SECURITY = 'security@'.APP_DOMAIN; const APP_USERAGENT = APP_NAME.'-Server/%s Please report abuse at '.APP_EMAIL_SECURITY; const APP_MODE_ADMIN = 'admin'; -const APP_LOCALES = ['cat', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'id', 'it', 'nl', /* 'no',*/ 'pt-br', 'pt-pt', 'ro', 'tr', 'ua', 'zh']; +const APP_LOCALES = ['cat', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'id', 'it', 'nl', /* 'no',*/ 'pt-br', 'pt-pt', 'ro', 'tr', 'ua', 'zh', 'zh-tw']; const APP_PAGING_LIMIT = 15; $register = new Registry(); @@ -147,6 +147,7 @@ Locale::setLanguage('ru', include __DIR__ . '/config/locale/ru.php'); Locale::setLanguage('tr', include __DIR__.'/config/locale/tr.php'); Locale::setLanguage('ua', include __DIR__.'/config/locale/ua.php'); Locale::setLanguage('zh', include __DIR__.'/config/locale/zh.php'); +Locale::setLanguage('zh-tw', include __DIR__.'/config/locale/zh-tw.php'); if (in_array($locale, APP_LOCALES)) { Locale::setDefault($locale); From b1f01e9dbfa216a3606439c346bfdd908ccacf2a Mon Sep 17 00:00:00 2001 From: Bogdan Covrig Date: Thu, 3 Oct 2019 18:19:39 +0200 Subject: [PATCH 059/135] Add Slack provider. Fix getUser request path --- src/Auth/OAuth/Slack.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Auth/OAuth/Slack.php b/src/Auth/OAuth/Slack.php index a50f82e33a..120dd4233d 100644 --- a/src/Auth/OAuth/Slack.php +++ b/src/Auth/OAuth/Slack.php @@ -24,10 +24,12 @@ class Slack extends OAuth */ public function getLoginURL():string { + // https://api.slack.com/docs/oauth#step_1_-_sending_users_to_authorize_and_or_install return 'https://slack.com/oauth/authorize'. '?client_id='.urlencode($this->appID). - '&scope='.urlencode("identity.avatar,identity.basic,identity.email,identity.team"). - '&redirect_uri='.urlencode($this->callback); + '&scope=identity.avatar+identity.basic+identity.email+identity.team'. + '&redirect_uri='.urlencode($this->callback). + '&state='.urlencode(json_encode($this->state)); } /** @@ -37,13 +39,14 @@ class Slack extends OAuth */ public function getAccessToken(string $code):string { + // https://api.slack.com/docs/oauth#step_3_-_exchanging_a_verification_code_for_an_access_token $accessToken = $this->request( 'GET', 'https://slack.com/api/oauth.access'. '?client_id='.urlencode($this->appID). '&client_secret='.urlencode($this->appSecret). - '&redirect_uri='.urlencode($this->callback). - '&code='.urlencode($code) + '&code='.urlencode($code). + '&redirect_uri='.urlencode($this->callback) ); $accessToken = json_decode($accessToken, true); // @@ -110,10 +113,13 @@ class Slack extends OAuth */ protected function getUser(string $accessToken):array { + if (empty($this->user)) { + // https://api.slack.com/methods/users.identity $user = $this->request( 'GET', - 'https://slack.com/api/users.identity&token='.urlencode($accessToken)); + 'https://slack.com/api/users.identity?token='.urlencode($accessToken), + ); $this->user = json_decode($user, true); } @@ -121,5 +127,3 @@ class Slack extends OAuth return $this->user; } } - -//http://localhost:8080/v1/auth/oauth/slack?project=5d94eda5e2b8a&success=http://localhost:8080/?success=1&failure=http://localhost:8080/auth/signin?failure=2 From 44869a00e6c7ecb1331be9b380e281b697c691b2 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Thu, 3 Oct 2019 20:58:18 +0300 Subject: [PATCH 060/135] Updated docs examples --- app/sdks/dart/README.md | 6 +- app/sdks/dart/lib/services/auth.dart | 20 +- app/sdks/dart/lib/services/locale.dart | 6 +- app/sdks/js/README.md | 10 +- .../js/docs/examples/projects/create-task.md | 2 +- .../docs/examples/projects/create-webhook.md | 2 +- .../js/docs/examples/projects/update-task.md | 2 +- .../docs/examples/projects/update-webhook.md | 2 +- app/sdks/js/src/sdk.js | 602 +++++++++--------- app/sdks/node/README.md | 8 +- app/sdks/node/docs/examples/account/delete.md | 2 +- .../node/docs/examples/account/get-prefs.md | 2 +- .../docs/examples/account/get-security.md | 2 +- .../docs/examples/account/get-sessions.md | 2 +- app/sdks/node/docs/examples/account/get.md | 2 +- .../docs/examples/account/update-email.md | 2 +- .../node/docs/examples/account/update-name.md | 2 +- .../docs/examples/account/update-password.md | 2 +- .../docs/examples/account/update-prefs.md | 2 +- .../node/docs/examples/auth/confirm-resend.md | 2 +- app/sdks/node/docs/examples/auth/confirm.md | 2 +- app/sdks/node/docs/examples/auth/login.md | 2 +- .../docs/examples/auth/logout-by-session.md | 2 +- app/sdks/node/docs/examples/auth/logout.md | 2 +- app/sdks/node/docs/examples/auth/oauth.md | 2 +- .../node/docs/examples/auth/recovery-reset.md | 2 +- app/sdks/node/docs/examples/auth/recovery.md | 2 +- app/sdks/node/docs/examples/auth/register.md | 2 +- .../node/docs/examples/avatars/get-browser.md | 2 +- .../docs/examples/avatars/get-credit-card.md | 2 +- .../node/docs/examples/avatars/get-favicon.md | 2 +- .../node/docs/examples/avatars/get-flag.md | 2 +- .../node/docs/examples/avatars/get-image.md | 2 +- .../node/docs/examples/avatars/get-q-r.md | 2 +- .../examples/database/create-collection.md | 2 +- .../docs/examples/database/create-document.md | 2 +- .../examples/database/delete-collection.md | 2 +- .../docs/examples/database/delete-document.md | 2 +- .../docs/examples/database/get-collection.md | 2 +- .../docs/examples/database/get-document.md | 2 +- .../examples/database/list-collections.md | 2 +- .../docs/examples/database/list-documents.md | 2 +- .../examples/database/update-collection.md | 2 +- .../docs/examples/database/update-document.md | 2 +- .../docs/examples/locale/get-countries-e-u.md | 2 +- .../examples/locale/get-countries-phones.md | 2 +- .../docs/examples/locale/get-countries.md | 2 +- .../docs/examples/locale/get-currencies.md | 2 +- .../node/docs/examples/locale/get-locale.md | 2 +- .../node/docs/examples/projects/create-key.md | 2 +- .../docs/examples/projects/create-platform.md | 2 +- .../docs/examples/projects/create-project.md | 2 +- .../docs/examples/projects/create-task.md | 2 +- .../docs/examples/projects/create-webhook.md | 2 +- .../node/docs/examples/projects/delete-key.md | 2 +- .../docs/examples/projects/delete-platform.md | 2 +- .../docs/examples/projects/delete-project.md | 2 +- .../docs/examples/projects/delete-task.md | 2 +- .../docs/examples/projects/delete-webhook.md | 2 +- .../node/docs/examples/projects/get-key.md | 2 +- .../docs/examples/projects/get-platform.md | 2 +- .../examples/projects/get-project-usage.md | 2 +- .../docs/examples/projects/get-project.md | 2 +- .../node/docs/examples/projects/get-task.md | 2 +- .../docs/examples/projects/get-webhook.md | 2 +- .../node/docs/examples/projects/list-keys.md | 2 +- .../docs/examples/projects/list-platforms.md | 2 +- .../docs/examples/projects/list-projects.md | 2 +- .../node/docs/examples/projects/list-tasks.md | 2 +- .../docs/examples/projects/list-webhooks.md | 2 +- .../node/docs/examples/projects/update-key.md | 2 +- .../docs/examples/projects/update-platform.md | 2 +- .../projects/update-project-o-auth.md | 2 +- .../docs/examples/projects/update-project.md | 2 +- .../docs/examples/projects/update-task.md | 4 +- .../docs/examples/projects/update-webhook.md | 4 +- .../node/docs/examples/storage/create-file.md | 2 +- .../node/docs/examples/storage/delete-file.md | 2 +- .../examples/storage/get-file-download.md | 2 +- .../docs/examples/storage/get-file-preview.md | 2 +- .../docs/examples/storage/get-file-view.md | 2 +- .../node/docs/examples/storage/get-file.md | 2 +- .../node/docs/examples/storage/list-files.md | 2 +- .../node/docs/examples/storage/update-file.md | 2 +- .../teams/create-team-membership-resend.md | 2 +- .../examples/teams/create-team-membership.md | 2 +- .../node/docs/examples/teams/create-team.md | 2 +- .../examples/teams/delete-team-membership.md | 2 +- .../node/docs/examples/teams/delete-team.md | 2 +- .../docs/examples/teams/get-team-members.md | 2 +- app/sdks/node/docs/examples/teams/get-team.md | 2 +- .../node/docs/examples/teams/list-teams.md | 2 +- .../teams/update-team-membership-status.md | 2 +- .../node/docs/examples/teams/update-team.md | 2 +- .../node/docs/examples/users/create-user.md | 2 +- .../examples/users/delete-user-sessions.md | 2 +- .../examples/users/delete-users-session.md | 2 +- .../node/docs/examples/users/get-user-logs.md | 2 +- .../docs/examples/users/get-user-prefs.md | 2 +- .../docs/examples/users/get-user-sessions.md | 2 +- app/sdks/node/docs/examples/users/get-user.md | 2 +- .../node/docs/examples/users/list-users.md | 2 +- .../docs/examples/users/update-user-status.md | 2 +- app/sdks/node/lib/services/auth.js | 36 +- app/sdks/node/lib/services/locale.js | 6 +- app/sdks/php/README.md | 8 +- app/sdks/php/docs/auth.md | 1 + .../docs/examples/projects/update-webhook.md | 2 +- app/sdks/php/docs/locale.md | 2 +- app/sdks/php/src/Appwrite/Services/Auth.php | 18 +- app/sdks/php/src/Appwrite/Services/Locale.php | 6 +- app/sdks/python/README.md | 4 +- app/sdks/ruby/README.md | 4 +- composer.lock | 65 +- 114 files changed, 499 insertions(+), 503 deletions(-) diff --git a/app/sdks/dart/README.md b/app/sdks/dart/README.md index e7f5e5a81b..2e742434d8 100644 --- a/app/sdks/dart/README.md +++ b/app/sdks/dart/README.md @@ -1,7 +1,7 @@ # [Appwrite SDK for Dart](https://appwrite.io)   [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Appwrite%20is%20a%20backend%20as%20a%20service%20for%20building%20web%20or%20mobile%20apps&url=http%3A%2F%2Fappwrite.io&via=appwrite_io&hashtags=JS%2Cjavascript%2Creactjs%2Cangular%2Cios%2Candroid) ![License](https://img.shields.io/github/license/appwrite/sdk-for-dart.svg?v=1) -![Version](https://img.shields.io/badge/api%20version-0.1.15-blue.svg?v=1) +![Version](https://img.shields.io/badge/api%20version-latest-blue.svg?v=1) **WORK IN PROGRESS - NOT READY FOR USAGE - Want to help us improve this client SDK? Send a pull request to Appwrite [SDK generator repository](https://github.com/appwrite/sdk-generator).** @@ -11,7 +11,7 @@ Appwrite backend as a service cuts up to 70% of the time and costs required for ![Appwrite](https://appwrite.io/images/github.png) -**API Version: 0.1.15** +**API Version: latest** ## Installation @@ -30,4 +30,4 @@ pub get ## License -Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. +Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/dart/lib/services/auth.dart b/app/sdks/dart/lib/services/auth.dart index c1b1a18d5f..0db9f429db 100644 --- a/app/sdks/dart/lib/services/auth.dart +++ b/app/sdks/dart/lib/services/auth.dart @@ -3,18 +3,18 @@ import "package:appwrite/client.dart"; import 'package:dio/dio.dart'; class Auth extends Service { - + Auth(Client client): super(client); /// Allow the user to login into his account by providing a valid email and /// password combination. Use the success and failure arguments to provide a - /// redirect URL\'s back to your app when login is completed. - /// + /// redirect URL\'s back to your app when login is completed. + /// /// Please notice that in order to avoid a [Redirect /// Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) /// the only valid redirect URL's are the once from domains you have set when /// added your platforms in the console interface. - /// + /// /// When accessing this route using JavaScript from the browser, success and /// failure parameter URLs are required. Appwrite server will respond with a /// 301 redirect status code and will set the user session cookie. This @@ -84,7 +84,7 @@ class Auth extends Service { /// **userId** and **token** arguments will be passed as query parameters to /// the redirect URL you have provided when sending your request to the /// /auth/recovery endpoint. - /// + /// /// Please notice that in order to avoid a [Redirect /// Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) /// the only valid redirect URL's are the once from domains you have set when @@ -104,18 +104,18 @@ class Auth extends Service { /// Use this endpoint to allow a new user to register an account in your /// project. Use the success and failure URL's to redirect users back to your /// application after signup completes. - /// + /// /// If registration completes successfully user will be sent with a /// confirmation email in order to confirm he is the owner of the account email /// address. Use the confirmation parameter to redirect the user from the /// confirmation email back to your app. When the user is redirected, use the /// /auth/confirm endpoint to complete the account confirmation. - /// + /// /// Please notice that in order to avoid a [Redirect /// Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) /// the only valid redirect URL's are the once from domains you have set when /// added your platforms in the console interface. - /// + /// /// When accessing this route using JavaScript from the browser, success and /// failure parameter URLs are required. Appwrite server will respond with a /// 301 redirect status code and will set the user session cookie. This @@ -152,7 +152,7 @@ class Auth extends Service { /// This endpoint allows the user to request your app to resend him his email /// confirmation message. The redirect arguments acts the same way as in /// /auth/register endpoint. - /// + /// /// Please notice that in order to avoid a [Redirect /// Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) /// the only valid redirect URL's are the once from domains you have set when @@ -166,4 +166,4 @@ class Auth extends Service { return await this.client.call('post', path: path, params: params); } -} +} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/locale.dart b/app/sdks/dart/lib/services/locale.dart index 29f87ac5ea..406d25bbb9 100644 --- a/app/sdks/dart/lib/services/locale.dart +++ b/app/sdks/dart/lib/services/locale.dart @@ -49,9 +49,9 @@ class Locale extends Service { return await this.client.call('get', path: path, params: params); } - /// List of all currencies, including currency symol, name, plural, and decimal - /// digits for all major and minor currencies. You can use the locale header to - /// get the data in supported language. + /// List of all currencies, including currency symbol, name, plural, and + /// decimal digits for all major and minor currencies. You can use the locale + /// header to get the data in supported language. Future getCurrencies() async { String path = '/locale/currencies'; diff --git a/app/sdks/js/README.md b/app/sdks/js/README.md index 0a0a4bf1d1..e415254ed5 100644 --- a/app/sdks/js/README.md +++ b/app/sdks/js/README.md @@ -1,9 +1,9 @@ -# [Appwrite SDK for JavaScript](https://appwrite.io)   [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Appwrite%20is%20a%20backend%20as%20a%20service%20for%20building%20web%20or%20mobile%20apps&url=http%3A%2F%2Fappwrite.io&via=appwrite_io&hashtags=JS%2Cjavascript%2Creactjs%2Cangular%2Cios%2Candroid) +# [Appwrite SDK for Javascript](https://appwrite.io)   [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Appwrite%20is%20a%20backend%20as%20a%20service%20for%20building%20web%20or%20mobile%20apps&url=http%3A%2F%2Fappwrite.io&via=appwrite_io&hashtags=JS%2Cjavascript%2Creactjs%2Cangular%2Cios%2Candroid) ![License](https://img.shields.io/github/license/appwrite/sdk-for-js.svg?v=1) -![Version](https://img.shields.io/badge/api%20version-0.1.15-blue.svg?v=1) +![Version](https://img.shields.io/badge/api%20version-latest-blue.svg?v=1) -This SDK is compatible with Appwrite server version 0.2.0 for older versions check previous releases. +This SDK is compitable with Appwrite server version 0.2.0 for older versions check previous releases. Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) @@ -11,7 +11,7 @@ Appwrite backend as a service cuts up to 70% of the time and costs required for ![Appwrite](https://appwrite.io/images/github.png) -**API Version: 0.1.15** +**API Version: latest** ## Installation @@ -23,4 +23,4 @@ npm install appwrite --save ## License -Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. +Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/create-task.md b/app/sdks/js/docs/examples/projects/create-task.md index 4338198465..3262b4d9fe 100644 --- a/app/sdks/js/docs/examples/projects/create-task.md +++ b/app/sdks/js/docs/examples/projects/create-task.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.projects.createTask('[PROJECT_ID]', '[NAME]', 'play', '', 1, 'GET', 'https://example.com'); +let promise = sdk.projects.createTask('[PROJECT_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/js/docs/examples/projects/create-webhook.md b/app/sdks/js/docs/examples/projects/create-webhook.md index 66a76c26c2..1136c5eedf 100644 --- a/app/sdks/js/docs/examples/projects/create-webhook.md +++ b/app/sdks/js/docs/examples/projects/create-webhook.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.projects.createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 0); +let promise = sdk.projects.createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 1); promise.then(function (response) { console.log(response); diff --git a/app/sdks/js/docs/examples/projects/update-task.md b/app/sdks/js/docs/examples/projects/update-task.md index 3544916e3b..54116a41d0 100644 --- a/app/sdks/js/docs/examples/projects/update-task.md +++ b/app/sdks/js/docs/examples/projects/update-task.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.projects.updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 1, 'GET', 'https://example.com'); +let promise = sdk.projects.updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/js/docs/examples/projects/update-webhook.md b/app/sdks/js/docs/examples/projects/update-webhook.md index f580952533..ce876d5a64 100644 --- a/app/sdks/js/docs/examples/projects/update-webhook.md +++ b/app/sdks/js/docs/examples/projects/update-webhook.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.projects.updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 1); +let promise = sdk.projects.updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); promise.then(function (response) { console.log(response); diff --git a/app/sdks/js/src/sdk.js b/app/sdks/js/src/sdk.js index 8b5ca9f3ea..5c21f8af5f 100644 --- a/app/sdks/js/src/sdk.js +++ b/app/sdks/js/src/sdk.js @@ -133,7 +133,7 @@ let addGlobalHeader = function(key, value) { globalHeaders[key] = {key: key.toLowerCase(), value: value.toLowerCase()}; }; - + let addGlobalParam = function(key, value) { globalParams.push({key: key, value: value}); }; @@ -346,17 +346,17 @@ if(email === undefined) { throw new Error('Missing required parameter: "email"'); } - + if(password === undefined) { throw new Error('Missing required parameter: "password"'); } - + let path = '/account/email'; return http .patch(path, {'content-type': 'application/json'}, { - 'email': email, + 'email': email, 'password': password }); }, @@ -373,7 +373,7 @@ if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + let path = '/account/name'; return http @@ -397,17 +397,17 @@ if(password === undefined) { throw new Error('Missing required parameter: "password"'); } - + if(oldPassword === undefined) { throw new Error('Missing required parameter: "oldPassword"'); } - + let path = '/account/password'; return http .patch(path, {'content-type': 'application/json'}, { - 'password': password, + 'password': password, 'old-password': oldPassword }); }, @@ -441,7 +441,7 @@ if(prefs === undefined) { throw new Error('Missing required parameter: "prefs"'); } - + let path = '/account/prefs'; return http @@ -493,13 +493,13 @@ * * Allow the user to login into his account by providing a valid email and * password combination. Use the success and failure arguments to provide a - * redirect URL\'s back to your app when login is completed. - * + * redirect URL\'s back to your app when login is completed. + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when * added your platforms in the console interface. - * + * * When accessing this route using JavaScript from the browser, success and * failure parameter URLs are required. Appwrite server will respond with a * 301 redirect status code and will set the user session cookie. This @@ -516,25 +516,25 @@ if(email === undefined) { throw new Error('Missing required parameter: "email"'); } - + if(password === undefined) { throw new Error('Missing required parameter: "password"'); } - + if(success === undefined) { throw new Error('Missing required parameter: "success"'); } - + if(failure === undefined) { throw new Error('Missing required parameter: "failure"'); } - + let path = '/auth/login'; return iframe('post', path, {project: config.project, - 'email': email, - 'password': password, - 'success': success, + 'email': email, + 'password': password, + 'success': success, 'failure': failure }); }, @@ -571,7 +571,7 @@ if(id === undefined) { throw new Error('Missing required parameter: "id"'); } - + let path = '/auth/logout/{id}'.replace(new RegExp('{id}', 'g'), id); return http @@ -593,13 +593,13 @@ if(provider === undefined) { throw new Error('Missing required parameter: "provider"'); } - + let path = '/auth/oauth/{provider}'.replace(new RegExp('{provider}', 'g'), provider); return http .get(path, {'content-type': 'application/json'}, { - 'success': success, + 'success': success, 'failure': failure }); }, @@ -622,17 +622,17 @@ if(email === undefined) { throw new Error('Missing required parameter: "email"'); } - + if(reset === undefined) { throw new Error('Missing required parameter: "reset"'); } - + let path = '/auth/recovery'; return http .post(path, {'content-type': 'application/json'}, { - 'email': email, + 'email': email, 'reset': reset }); }, @@ -644,7 +644,7 @@ * **userId** and **token** arguments will be passed as query parameters to * the redirect URL you have provided when sending your request to the * /auth/recovery endpoint. - * + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when @@ -660,27 +660,27 @@ if(userId === undefined) { throw new Error('Missing required parameter: "userId"'); } - + if(token === undefined) { throw new Error('Missing required parameter: "token"'); } - + if(passwordA === undefined) { throw new Error('Missing required parameter: "passwordA"'); } - + if(passwordB === undefined) { throw new Error('Missing required parameter: "passwordB"'); } - + let path = '/auth/recovery/reset'; return http .put(path, {'content-type': 'application/json'}, { - 'userId': userId, - 'token': token, - 'password-a': passwordA, + 'userId': userId, + 'token': token, + 'password-a': passwordA, 'password-b': passwordB }); }, @@ -691,18 +691,18 @@ * Use this endpoint to allow a new user to register an account in your * project. Use the success and failure URL's to redirect users back to your * application after signup completes. - * + * * If registration completes successfully user will be sent with a * confirmation email in order to confirm he is the owner of the account email * address. Use the confirmation parameter to redirect the user from the * confirmation email back to your app. When the user is redirected, use the * /auth/confirm endpoint to complete the account confirmation. - * + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when * added your platforms in the console interface. - * + * * When accessing this route using JavaScript from the browser, success and * failure parameter URLs are required. Appwrite server will respond with a * 301 redirect status code and will set the user session cookie. This @@ -721,23 +721,23 @@ if(email === undefined) { throw new Error('Missing required parameter: "email"'); } - + if(password === undefined) { throw new Error('Missing required parameter: "password"'); } - + if(confirm === undefined) { throw new Error('Missing required parameter: "confirm"'); } - + let path = '/auth/register'; return iframe('post', path, {project: config.project, - 'email': email, - 'password': password, - 'confirm': confirm, - 'success': success, - 'failure': failure, + 'email': email, + 'password': password, + 'confirm': confirm, + 'success': success, + 'failure': failure, 'name': name }); }, @@ -758,17 +758,17 @@ if(userId === undefined) { throw new Error('Missing required parameter: "userId"'); } - + if(token === undefined) { throw new Error('Missing required parameter: "token"'); } - + let path = '/auth/register/confirm'; return http .post(path, {'content-type': 'application/json'}, { - 'userId': userId, + 'userId': userId, 'token': token }); }, @@ -779,7 +779,7 @@ * This endpoint allows the user to request your app to resend him his email * confirmation message. The redirect arguments acts the same way as in * /auth/register endpoint. - * + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when @@ -792,7 +792,7 @@ if(confirm === undefined) { throw new Error('Missing required parameter: "confirm"'); } - + let path = '/auth/register/confirm/resend'; return http @@ -823,14 +823,14 @@ if(code === undefined) { throw new Error('Missing required parameter: "code"'); } - + let path = '/avatars/browsers/{code}'.replace(new RegExp('{code}', 'g'), code); return http .get(path, {'content-type': 'application/json'}, { - 'width': width, - 'height': height, + 'width': width, + 'height': height, 'quality': quality }); }, @@ -853,14 +853,14 @@ if(code === undefined) { throw new Error('Missing required parameter: "code"'); } - + let path = '/avatars/credit-cards/{code}'.replace(new RegExp('{code}', 'g'), code); return http .get(path, {'content-type': 'application/json'}, { - 'width': width, - 'height': height, + 'width': width, + 'height': height, 'quality': quality }); }, @@ -878,7 +878,7 @@ if(url === undefined) { throw new Error('Missing required parameter: "url"'); } - + let path = '/avatars/favicon'; return http @@ -905,14 +905,14 @@ if(code === undefined) { throw new Error('Missing required parameter: "code"'); } - + let path = '/avatars/flags/{code}'.replace(new RegExp('{code}', 'g'), code); return http .get(path, {'content-type': 'application/json'}, { - 'width': width, - 'height': height, + 'width': width, + 'height': height, 'quality': quality }); }, @@ -934,14 +934,14 @@ if(url === undefined) { throw new Error('Missing required parameter: "url"'); } - + let path = '/avatars/image'; return http .get(path, {'content-type': 'application/json'}, { - 'url': url, - 'width': width, + 'url': url, + 'width': width, 'height': height }); }, @@ -962,15 +962,15 @@ if(text === undefined) { throw new Error('Missing required parameter: "text"'); } - + let path = '/avatars/qr'; return http .get(path, {'content-type': 'application/json'}, { - 'text': text, - 'size': size, - 'margin': margin, + 'text': text, + 'size': size, + 'margin': margin, 'download': download }); } @@ -998,9 +998,9 @@ return http .get(path, {'content-type': 'application/json'}, { - 'search': search, - 'limit': limit, - 'offset': offset, + 'search': search, + 'limit': limit, + 'offset': offset, 'orderType': orderType }); }, @@ -1020,15 +1020,15 @@ if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + let path = '/database'; return http .post(path, {'content-type': 'application/json'}, { - 'name': name, - 'read': read, - 'write': write, + 'name': name, + 'read': read, + 'write': write, 'rules': rules }); }, @@ -1046,7 +1046,7 @@ if(collectionId === undefined) { throw new Error('Missing required parameter: "collectionId"'); } - + let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); return http @@ -1071,19 +1071,19 @@ if(collectionId === undefined) { throw new Error('Missing required parameter: "collectionId"'); } - + if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); return http .put(path, {'content-type': 'application/json'}, { - 'name': name, - 'read': read, - 'write': write, + 'name': name, + 'read': read, + 'write': write, 'rules': rules }); }, @@ -1101,7 +1101,7 @@ if(collectionId === undefined) { throw new Error('Missing required parameter: "collectionId"'); } - + let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); return http @@ -1134,20 +1134,20 @@ if(collectionId === undefined) { throw new Error('Missing required parameter: "collectionId"'); } - + let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); return http .get(path, {'content-type': 'application/json'}, { - 'filters': filters, - 'offset': offset, - 'limit': limit, - 'order-field': orderField, - 'order-type': orderType, - 'order-cast': orderCast, - 'search': search, - 'first': first, + 'filters': filters, + 'offset': offset, + 'limit': limit, + 'order-field': orderField, + 'order-type': orderType, + 'order-cast': orderCast, + 'search': search, + 'first': first, 'last': last }); }, @@ -1170,21 +1170,21 @@ if(collectionId === undefined) { throw new Error('Missing required parameter: "collectionId"'); } - + if(data === undefined) { throw new Error('Missing required parameter: "data"'); } - + let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); return http .post(path, {'content-type': 'application/json'}, { - 'data': data, - 'read': read, - 'write': write, - 'parentDocument': parentDocument, - 'parentProperty': parentProperty, + 'data': data, + 'read': read, + 'write': write, + 'parentDocument': parentDocument, + 'parentProperty': parentProperty, 'parentPropertyType': parentPropertyType }); }, @@ -1203,11 +1203,11 @@ if(collectionId === undefined) { throw new Error('Missing required parameter: "collectionId"'); } - + if(documentId === undefined) { throw new Error('Missing required parameter: "documentId"'); } - + let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); return http @@ -1231,22 +1231,22 @@ if(collectionId === undefined) { throw new Error('Missing required parameter: "collectionId"'); } - + if(documentId === undefined) { throw new Error('Missing required parameter: "documentId"'); } - + if(data === undefined) { throw new Error('Missing required parameter: "data"'); } - + let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); return http .patch(path, {'content-type': 'application/json'}, { - 'data': data, - 'read': read, + 'data': data, + 'read': read, 'write': write }); }, @@ -1266,11 +1266,11 @@ if(collectionId === undefined) { throw new Error('Missing required parameter: "collectionId"'); } - + if(documentId === undefined) { throw new Error('Missing required parameter: "documentId"'); } - + let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); return http @@ -1356,9 +1356,9 @@ /** * List of currencies * - * List of all currencies, including currency symol, name, plural, and decimal - * digits for all major and minor currencies. You can use the locale header to - * get the data in supported language. + * List of all currencies, including currency symbol, name, plural, and + * decimal digits for all major and minor currencies. You can use the locale + * header to get the data in supported language. * * @throws {Error} * @return {Promise} */ @@ -1410,26 +1410,26 @@ if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } - + let path = '/projects'; return http .post(path, {'content-type': 'application/json'}, { - 'name': name, - 'teamId': teamId, - 'description': description, - 'logo': logo, - 'url': url, - 'legalName': legalName, - 'legalCountry': legalCountry, - 'legalState': legalState, - 'legalCity': legalCity, - 'legalAddress': legalAddress, + 'name': name, + 'teamId': teamId, + 'description': description, + 'logo': logo, + 'url': url, + 'legalName': legalName, + 'legalCountry': legalCountry, + 'legalState': legalState, + 'legalCity': legalCity, + 'legalAddress': legalAddress, 'legalTaxId': legalTaxId }); }, @@ -1445,7 +1445,7 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); return http @@ -1475,25 +1475,25 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); return http .patch(path, {'content-type': 'application/json'}, { - 'name': name, - 'description': description, - 'logo': logo, - 'url': url, - 'legalName': legalName, - 'legalCountry': legalCountry, - 'legalState': legalState, - 'legalCity': legalCity, - 'legalAddress': legalAddress, + 'name': name, + 'description': description, + 'logo': logo, + 'url': url, + 'legalName': legalName, + 'legalCountry': legalCountry, + 'legalState': legalState, + 'legalCity': legalCity, + 'legalAddress': legalAddress, 'legalTaxId': legalTaxId }); }, @@ -1509,7 +1509,7 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); return http @@ -1529,7 +1529,7 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); return http @@ -1551,21 +1551,21 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + if(scopes === undefined) { throw new Error('Missing required parameter: "scopes"'); } - + let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); return http .post(path, {'content-type': 'application/json'}, { - 'name': name, + 'name': name, 'scopes': scopes }); }, @@ -1582,11 +1582,11 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(keyId === undefined) { throw new Error('Missing required parameter: "keyId"'); } - + let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); return http @@ -1609,25 +1609,25 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(keyId === undefined) { throw new Error('Missing required parameter: "keyId"'); } - + if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + if(scopes === undefined) { throw new Error('Missing required parameter: "scopes"'); } - + let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); return http .put(path, {'content-type': 'application/json'}, { - 'name': name, + 'name': name, 'scopes': scopes }); }, @@ -1644,11 +1644,11 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(keyId === undefined) { throw new Error('Missing required parameter: "keyId"'); } - + let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); return http @@ -1671,18 +1671,18 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(provider === undefined) { throw new Error('Missing required parameter: "provider"'); } - + let path = '/projects/{projectId}/oauth'.replace(new RegExp('{projectId}', 'g'), projectId); return http .patch(path, {'content-type': 'application/json'}, { - 'provider': provider, - 'appId': appId, + 'provider': provider, + 'appId': appId, 'secret': secret }); }, @@ -1698,7 +1698,7 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); return http @@ -1723,24 +1723,24 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(type === undefined) { throw new Error('Missing required parameter: "type"'); } - + if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); return http .post(path, {'content-type': 'application/json'}, { - 'type': type, - 'name': name, - 'key': key, - 'store': store, + 'type': type, + 'name': name, + 'key': key, + 'store': store, 'url': url }); }, @@ -1757,11 +1757,11 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(platformId === undefined) { throw new Error('Missing required parameter: "platformId"'); } - + let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); return http @@ -1786,23 +1786,23 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(platformId === undefined) { throw new Error('Missing required parameter: "platformId"'); } - + if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); return http .put(path, {'content-type': 'application/json'}, { - 'name': name, - 'key': key, - 'store': store, + 'name': name, + 'key': key, + 'store': store, 'url': url }); }, @@ -1819,11 +1819,11 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(platformId === undefined) { throw new Error('Missing required parameter: "platformId"'); } - + let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); return http @@ -1843,7 +1843,7 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); return http @@ -1872,44 +1872,44 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + if(status === undefined) { throw new Error('Missing required parameter: "status"'); } - + if(schedule === undefined) { throw new Error('Missing required parameter: "schedule"'); } - + if(security === undefined) { throw new Error('Missing required parameter: "security"'); } - + if(httpMethod === undefined) { throw new Error('Missing required parameter: "httpMethod"'); } - + if(httpUrl === undefined) { throw new Error('Missing required parameter: "httpUrl"'); } - + let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); return http .post(path, {'content-type': 'application/json'}, { - 'name': name, - 'status': status, - 'schedule': schedule, - 'security': security, - 'httpMethod': httpMethod, - 'httpUrl': httpUrl, - 'httpHeaders': httpHeaders, - 'httpUser': httpUser, + 'name': name, + 'status': status, + 'schedule': schedule, + 'security': security, + 'httpMethod': httpMethod, + 'httpUrl': httpUrl, + 'httpHeaders': httpHeaders, + 'httpUser': httpUser, 'httpPass': httpPass }); }, @@ -1926,11 +1926,11 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(taskId === undefined) { throw new Error('Missing required parameter: "taskId"'); } - + let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); return http @@ -1960,48 +1960,48 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(taskId === undefined) { throw new Error('Missing required parameter: "taskId"'); } - + if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + if(status === undefined) { throw new Error('Missing required parameter: "status"'); } - + if(schedule === undefined) { throw new Error('Missing required parameter: "schedule"'); } - + if(security === undefined) { throw new Error('Missing required parameter: "security"'); } - + if(httpMethod === undefined) { throw new Error('Missing required parameter: "httpMethod"'); } - + if(httpUrl === undefined) { throw new Error('Missing required parameter: "httpUrl"'); } - + let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); return http .put(path, {'content-type': 'application/json'}, { - 'name': name, - 'status': status, - 'schedule': schedule, - 'security': security, - 'httpMethod': httpMethod, - 'httpUrl': httpUrl, - 'httpHeaders': httpHeaders, - 'httpUser': httpUser, + 'name': name, + 'status': status, + 'schedule': schedule, + 'security': security, + 'httpMethod': httpMethod, + 'httpUrl': httpUrl, + 'httpHeaders': httpHeaders, + 'httpUser': httpUser, 'httpPass': httpPass }); }, @@ -2018,11 +2018,11 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(taskId === undefined) { throw new Error('Missing required parameter: "taskId"'); } - + let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); return http @@ -2042,7 +2042,7 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + let path = '/projects/{projectId}/usage'.replace(new RegExp('{projectId}', 'g'), projectId); return http @@ -2062,7 +2062,7 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); return http @@ -2088,33 +2088,33 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + if(events === undefined) { throw new Error('Missing required parameter: "events"'); } - + if(url === undefined) { throw new Error('Missing required parameter: "url"'); } - + if(security === undefined) { throw new Error('Missing required parameter: "security"'); } - + let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); return http .post(path, {'content-type': 'application/json'}, { - 'name': name, - 'events': events, - 'url': url, - 'security': security, - 'httpUser': httpUser, + 'name': name, + 'events': events, + 'url': url, + 'security': security, + 'httpUser': httpUser, 'httpPass': httpPass }); }, @@ -2131,11 +2131,11 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(webhookId === undefined) { throw new Error('Missing required parameter: "webhookId"'); } - + let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); return http @@ -2162,37 +2162,37 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(webhookId === undefined) { throw new Error('Missing required parameter: "webhookId"'); } - + if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + if(events === undefined) { throw new Error('Missing required parameter: "events"'); } - + if(url === undefined) { throw new Error('Missing required parameter: "url"'); } - + if(security === undefined) { throw new Error('Missing required parameter: "security"'); } - + let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); return http .put(path, {'content-type': 'application/json'}, { - 'name': name, - 'events': events, - 'url': url, - 'security': security, - 'httpUser': httpUser, + 'name': name, + 'events': events, + 'url': url, + 'security': security, + 'httpUser': httpUser, 'httpPass': httpPass }); }, @@ -2209,11 +2209,11 @@ if(projectId === undefined) { throw new Error('Missing required parameter: "projectId"'); } - + if(webhookId === undefined) { throw new Error('Missing required parameter: "webhookId"'); } - + let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); return http @@ -2244,9 +2244,9 @@ return http .get(path, {'content-type': 'application/json'}, { - 'search': search, - 'limit': limit, - 'offset': offset, + 'search': search, + 'limit': limit, + 'offset': offset, 'orderType': orderType }); }, @@ -2268,15 +2268,15 @@ if(files === undefined) { throw new Error('Missing required parameter: "files"'); } - + let path = '/storage/files'; return http .post(path, {'content-type': 'multipart/form-data'}, { - 'files': files, - 'read': read, - 'write': write, + 'files': files, + 'read': read, + 'write': write, 'folderId': folderId }); }, @@ -2294,7 +2294,7 @@ if(fileId === undefined) { throw new Error('Missing required parameter: "fileId"'); } - + let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); return http @@ -2319,14 +2319,14 @@ if(fileId === undefined) { throw new Error('Missing required parameter: "fileId"'); } - + let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); return http .put(path, {'content-type': 'application/json'}, { - 'read': read, - 'write': write, + 'read': read, + 'write': write, 'folderId': folderId }); }, @@ -2344,7 +2344,7 @@ if(fileId === undefined) { throw new Error('Missing required parameter: "fileId"'); } - + let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); return http @@ -2367,7 +2367,7 @@ if(fileId === undefined) { throw new Error('Missing required parameter: "fileId"'); } - + let path = '/storage/files/{fileId}/download'.replace(new RegExp('{fileId}', 'g'), fileId); return http @@ -2396,16 +2396,16 @@ if(fileId === undefined) { throw new Error('Missing required parameter: "fileId"'); } - + let path = '/storage/files/{fileId}/preview'.replace(new RegExp('{fileId}', 'g'), fileId); return http .get(path, {'content-type': 'application/json'}, { - 'width': width, - 'height': height, - 'quality': quality, - 'background': background, + 'width': width, + 'height': height, + 'quality': quality, + 'background': background, 'output': output }); }, @@ -2424,7 +2424,7 @@ if(fileId === undefined) { throw new Error('Missing required parameter: "fileId"'); } - + let path = '/storage/files/{fileId}/view'.replace(new RegExp('{fileId}', 'g'), fileId); return http @@ -2456,9 +2456,9 @@ return http .get(path, {'content-type': 'application/json'}, { - 'search': search, - 'limit': limit, - 'offset': offset, + 'search': search, + 'limit': limit, + 'offset': offset, 'orderType': orderType }); }, @@ -2479,13 +2479,13 @@ if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + let path = '/teams'; return http .post(path, {'content-type': 'application/json'}, { - 'name': name, + 'name': name, 'roles': roles }); }, @@ -2503,7 +2503,7 @@ if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } - + let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); return http @@ -2526,11 +2526,11 @@ if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } - + if(name === undefined) { throw new Error('Missing required parameter: "name"'); } - + let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); return http @@ -2553,7 +2553,7 @@ if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } - + let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); return http @@ -2575,7 +2575,7 @@ if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } - + let path = '/teams/{teamId}/members'.replace(new RegExp('{teamId}', 'g'), teamId); return http @@ -2590,12 +2590,12 @@ * Use this endpoint to invite a new member to your team. An email with a link * to join the team will be sent to the new member email address. If member * doesn't exists in the project it will be automatically created. - * + * * Use the redirect parameter to redirect the user from the invitation email * back to your app. When the user is redirected, use the * /teams/{teamId}/memberships/{inviteId}/status endpoint to finally join the * user to the team. - * + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when @@ -2612,27 +2612,27 @@ if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } - + if(email === undefined) { throw new Error('Missing required parameter: "email"'); } - + if(roles === undefined) { throw new Error('Missing required parameter: "roles"'); } - + if(redirect === undefined) { throw new Error('Missing required parameter: "redirect"'); } - + let path = '/teams/{teamId}/memberships'.replace(new RegExp('{teamId}', 'g'), teamId); return http .post(path, {'content-type': 'application/json'}, { - 'email': email, - 'name': name, - 'roles': roles, + 'email': email, + 'name': name, + 'roles': roles, 'redirect': redirect }); }, @@ -2651,11 +2651,11 @@ if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } - + if(inviteId === undefined) { throw new Error('Missing required parameter: "inviteId"'); } - + let path = '/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); return http @@ -2679,15 +2679,15 @@ if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } - + if(inviteId === undefined) { throw new Error('Missing required parameter: "inviteId"'); } - + if(redirect === undefined) { throw new Error('Missing required parameter: "redirect"'); } - + let path = '/teams/{teamId}/memberships/{inviteId}/resend'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); return http @@ -2704,12 +2704,12 @@ * is being redirect back to your app from the invitation email. Use the * success and failure URL's to redirect users back to your application after * the request completes. - * + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when * added your platforms in the console interface. - * + * * When not using the success or failure redirect arguments this endpoint will * result with a 200 status code on success and with 401 status error on * failure. This behavior was applied to help the web clients deal with @@ -2728,25 +2728,25 @@ if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } - + if(inviteId === undefined) { throw new Error('Missing required parameter: "inviteId"'); } - + if(userId === undefined) { throw new Error('Missing required parameter: "userId"'); } - + if(secret === undefined) { throw new Error('Missing required parameter: "secret"'); } - + let path = '/teams/{teamId}/memberships/{inviteId}/status'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); return iframe('patch', path, {project: config.project, - 'userId': userId, - 'secret': secret, - 'success': success, + 'userId': userId, + 'secret': secret, + 'success': success, 'failure': failure }); } @@ -2772,9 +2772,9 @@ return http .get(path, {'content-type': 'application/json'}, { - 'search': search, - 'limit': limit, - 'offset': offset, + 'search': search, + 'limit': limit, + 'offset': offset, 'orderType': orderType }); }, @@ -2793,18 +2793,18 @@ if(email === undefined) { throw new Error('Missing required parameter: "email"'); } - + if(password === undefined) { throw new Error('Missing required parameter: "password"'); } - + let path = '/users'; return http .post(path, {'content-type': 'application/json'}, { - 'email': email, - 'password': password, + 'email': email, + 'password': password, 'name': name }); }, @@ -2821,7 +2821,7 @@ if(userId === undefined) { throw new Error('Missing required parameter: "userId"'); } - + let path = '/users/{userId}'.replace(new RegExp('{userId}', 'g'), userId); return http @@ -2842,7 +2842,7 @@ if(userId === undefined) { throw new Error('Missing required parameter: "userId"'); } - + let path = '/users/{userId}/logs'.replace(new RegExp('{userId}', 'g'), userId); return http @@ -2863,7 +2863,7 @@ if(userId === undefined) { throw new Error('Missing required parameter: "userId"'); } - + let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); return http @@ -2884,7 +2884,7 @@ if(userId === undefined) { throw new Error('Missing required parameter: "userId"'); } - + let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); return http @@ -2905,7 +2905,7 @@ if(userId === undefined) { throw new Error('Missing required parameter: "userId"'); } - + let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); return http @@ -2927,11 +2927,11 @@ if(userId === undefined) { throw new Error('Missing required parameter: "userId"'); } - + if(sessionId === undefined) { throw new Error('Missing required parameter: "sessionId"'); } - + let path = '/users/{userId}/sessions/:session'.replace(new RegExp('{userId}', 'g'), userId); return http @@ -2954,11 +2954,11 @@ if(userId === undefined) { throw new Error('Missing required parameter: "userId"'); } - + if(status === undefined) { throw new Error('Missing required parameter: "status"'); } - + let path = '/users/{userId}/status'.replace(new RegExp('{userId}', 'g'), userId); return http @@ -2987,4 +2987,4 @@ }; }; -})(window); +})(window); \ No newline at end of file diff --git a/app/sdks/node/README.md b/app/sdks/node/README.md index ee747f480a..a5b915af70 100644 --- a/app/sdks/node/README.md +++ b/app/sdks/node/README.md @@ -1,9 +1,9 @@ # [Appwrite SDK for NodeJS](https://appwrite.io)   [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Appwrite%20is%20a%20backend%20as%20a%20service%20for%20building%20web%20or%20mobile%20apps&url=http%3A%2F%2Fappwrite.io&via=appwrite_io&hashtags=JS%2Cjavascript%2Creactjs%2Cangular%2Cios%2Candroid) ![License](https://img.shields.io/github/license/appwrite/sdk-for-node.svg?v=1) -![Version](https://img.shields.io/badge/api%20version-0.1.15-blue.svg?v=1) +![Version](https://img.shields.io/badge/api%20version-latest-blue.svg?v=1) -This SDK is compatible with Appwrite server version 0.2.0 for older versions check previous releases. +This SDK is compitable with Appwrite server version 0.2.0 for older versions check previous releases. Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) @@ -11,7 +11,7 @@ Appwrite backend as a service cuts up to 70% of the time and costs required for ![Appwrite](https://appwrite.io/images/github.png) -**API Version: 0.1.15** +**API Version: latest** ## Installation @@ -23,4 +23,4 @@ npm install node-appwrite --save ## License -Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. +Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/node/docs/examples/account/delete.md b/app/sdks/node/docs/examples/account/delete.md index d83a9a69c9..0710fd6dfc 100644 --- a/app/sdks/node/docs/examples/account/delete.md +++ b/app/sdks/node/docs/examples/account/delete.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Account.Client(); +let client = new sdk.Client(); let account = new sdk.Account(client); diff --git a/app/sdks/node/docs/examples/account/get-prefs.md b/app/sdks/node/docs/examples/account/get-prefs.md index dc62c3610c..bdff57e923 100644 --- a/app/sdks/node/docs/examples/account/get-prefs.md +++ b/app/sdks/node/docs/examples/account/get-prefs.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Account.Client(); +let client = new sdk.Client(); let account = new sdk.Account(client); diff --git a/app/sdks/node/docs/examples/account/get-security.md b/app/sdks/node/docs/examples/account/get-security.md index 285fc07676..03a6561fff 100644 --- a/app/sdks/node/docs/examples/account/get-security.md +++ b/app/sdks/node/docs/examples/account/get-security.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Account.Client(); +let client = new sdk.Client(); let account = new sdk.Account(client); diff --git a/app/sdks/node/docs/examples/account/get-sessions.md b/app/sdks/node/docs/examples/account/get-sessions.md index 07bf3a7d2b..02b464a497 100644 --- a/app/sdks/node/docs/examples/account/get-sessions.md +++ b/app/sdks/node/docs/examples/account/get-sessions.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Account.Client(); +let client = new sdk.Client(); let account = new sdk.Account(client); diff --git a/app/sdks/node/docs/examples/account/get.md b/app/sdks/node/docs/examples/account/get.md index dce8b618cd..b2e078d061 100644 --- a/app/sdks/node/docs/examples/account/get.md +++ b/app/sdks/node/docs/examples/account/get.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Account.Client(); +let client = new sdk.Client(); let account = new sdk.Account(client); diff --git a/app/sdks/node/docs/examples/account/update-email.md b/app/sdks/node/docs/examples/account/update-email.md index d60214ad6d..29b50314f2 100644 --- a/app/sdks/node/docs/examples/account/update-email.md +++ b/app/sdks/node/docs/examples/account/update-email.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Account.Client(); +let client = new sdk.Client(); let account = new sdk.Account(client); diff --git a/app/sdks/node/docs/examples/account/update-name.md b/app/sdks/node/docs/examples/account/update-name.md index 9c21bd720f..d8b4734cbb 100644 --- a/app/sdks/node/docs/examples/account/update-name.md +++ b/app/sdks/node/docs/examples/account/update-name.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Account.Client(); +let client = new sdk.Client(); let account = new sdk.Account(client); diff --git a/app/sdks/node/docs/examples/account/update-password.md b/app/sdks/node/docs/examples/account/update-password.md index a7fe84181e..5aa6622ffa 100644 --- a/app/sdks/node/docs/examples/account/update-password.md +++ b/app/sdks/node/docs/examples/account/update-password.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Account.Client(); +let client = new sdk.Client(); let account = new sdk.Account(client); diff --git a/app/sdks/node/docs/examples/account/update-prefs.md b/app/sdks/node/docs/examples/account/update-prefs.md index 000a78de2d..c76e735e18 100644 --- a/app/sdks/node/docs/examples/account/update-prefs.md +++ b/app/sdks/node/docs/examples/account/update-prefs.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Account.Client(); +let client = new sdk.Client(); let account = new sdk.Account(client); diff --git a/app/sdks/node/docs/examples/auth/confirm-resend.md b/app/sdks/node/docs/examples/auth/confirm-resend.md index d4fa48a514..443870394b 100644 --- a/app/sdks/node/docs/examples/auth/confirm-resend.md +++ b/app/sdks/node/docs/examples/auth/confirm-resend.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Auth.Client(); +let client = new sdk.Client(); let auth = new sdk.Auth(client); diff --git a/app/sdks/node/docs/examples/auth/confirm.md b/app/sdks/node/docs/examples/auth/confirm.md index 434e0b6ac2..527df2d6ff 100644 --- a/app/sdks/node/docs/examples/auth/confirm.md +++ b/app/sdks/node/docs/examples/auth/confirm.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Auth.Client(); +let client = new sdk.Client(); let auth = new sdk.Auth(client); diff --git a/app/sdks/node/docs/examples/auth/login.md b/app/sdks/node/docs/examples/auth/login.md index e47d7faee3..f71a562e09 100644 --- a/app/sdks/node/docs/examples/auth/login.md +++ b/app/sdks/node/docs/examples/auth/login.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Auth.Client(); +let client = new sdk.Client(); let auth = new sdk.Auth(client); diff --git a/app/sdks/node/docs/examples/auth/logout-by-session.md b/app/sdks/node/docs/examples/auth/logout-by-session.md index ad035add2a..df964c0caf 100644 --- a/app/sdks/node/docs/examples/auth/logout-by-session.md +++ b/app/sdks/node/docs/examples/auth/logout-by-session.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Auth.Client(); +let client = new sdk.Client(); let auth = new sdk.Auth(client); diff --git a/app/sdks/node/docs/examples/auth/logout.md b/app/sdks/node/docs/examples/auth/logout.md index d90f59e754..d34102cbd7 100644 --- a/app/sdks/node/docs/examples/auth/logout.md +++ b/app/sdks/node/docs/examples/auth/logout.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Auth.Client(); +let client = new sdk.Client(); let auth = new sdk.Auth(client); diff --git a/app/sdks/node/docs/examples/auth/oauth.md b/app/sdks/node/docs/examples/auth/oauth.md index c124332439..e2e5886847 100644 --- a/app/sdks/node/docs/examples/auth/oauth.md +++ b/app/sdks/node/docs/examples/auth/oauth.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Auth.Client(); +let client = new sdk.Client(); let auth = new sdk.Auth(client); diff --git a/app/sdks/node/docs/examples/auth/recovery-reset.md b/app/sdks/node/docs/examples/auth/recovery-reset.md index da9fc758d8..f43a8b3305 100644 --- a/app/sdks/node/docs/examples/auth/recovery-reset.md +++ b/app/sdks/node/docs/examples/auth/recovery-reset.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Auth.Client(); +let client = new sdk.Client(); let auth = new sdk.Auth(client); diff --git a/app/sdks/node/docs/examples/auth/recovery.md b/app/sdks/node/docs/examples/auth/recovery.md index 167b31bc73..9e340a7f32 100644 --- a/app/sdks/node/docs/examples/auth/recovery.md +++ b/app/sdks/node/docs/examples/auth/recovery.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Auth.Client(); +let client = new sdk.Client(); let auth = new sdk.Auth(client); diff --git a/app/sdks/node/docs/examples/auth/register.md b/app/sdks/node/docs/examples/auth/register.md index d5b0a2fb77..708719a56f 100644 --- a/app/sdks/node/docs/examples/auth/register.md +++ b/app/sdks/node/docs/examples/auth/register.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Auth.Client(); +let client = new sdk.Client(); let auth = new sdk.Auth(client); diff --git a/app/sdks/node/docs/examples/avatars/get-browser.md b/app/sdks/node/docs/examples/avatars/get-browser.md index 128499b65b..50d3fefcf1 100644 --- a/app/sdks/node/docs/examples/avatars/get-browser.md +++ b/app/sdks/node/docs/examples/avatars/get-browser.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Avatars.Client(); +let client = new sdk.Client(); let avatars = new sdk.Avatars(client); diff --git a/app/sdks/node/docs/examples/avatars/get-credit-card.md b/app/sdks/node/docs/examples/avatars/get-credit-card.md index 8a773ed5d1..f64488cc12 100644 --- a/app/sdks/node/docs/examples/avatars/get-credit-card.md +++ b/app/sdks/node/docs/examples/avatars/get-credit-card.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Avatars.Client(); +let client = new sdk.Client(); let avatars = new sdk.Avatars(client); diff --git a/app/sdks/node/docs/examples/avatars/get-favicon.md b/app/sdks/node/docs/examples/avatars/get-favicon.md index 7f4b41ee68..ac449e9f1a 100644 --- a/app/sdks/node/docs/examples/avatars/get-favicon.md +++ b/app/sdks/node/docs/examples/avatars/get-favicon.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Avatars.Client(); +let client = new sdk.Client(); let avatars = new sdk.Avatars(client); diff --git a/app/sdks/node/docs/examples/avatars/get-flag.md b/app/sdks/node/docs/examples/avatars/get-flag.md index 2b8ec243f8..d53f2aa555 100644 --- a/app/sdks/node/docs/examples/avatars/get-flag.md +++ b/app/sdks/node/docs/examples/avatars/get-flag.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Avatars.Client(); +let client = new sdk.Client(); let avatars = new sdk.Avatars(client); diff --git a/app/sdks/node/docs/examples/avatars/get-image.md b/app/sdks/node/docs/examples/avatars/get-image.md index b516fa98ff..e541b90e61 100644 --- a/app/sdks/node/docs/examples/avatars/get-image.md +++ b/app/sdks/node/docs/examples/avatars/get-image.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Avatars.Client(); +let client = new sdk.Client(); let avatars = new sdk.Avatars(client); diff --git a/app/sdks/node/docs/examples/avatars/get-q-r.md b/app/sdks/node/docs/examples/avatars/get-q-r.md index 1c89a18c3b..9611a617ef 100644 --- a/app/sdks/node/docs/examples/avatars/get-q-r.md +++ b/app/sdks/node/docs/examples/avatars/get-q-r.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Avatars.Client(); +let client = new sdk.Client(); let avatars = new sdk.Avatars(client); diff --git a/app/sdks/node/docs/examples/database/create-collection.md b/app/sdks/node/docs/examples/database/create-collection.md index 83406de2e1..912dab3e48 100644 --- a/app/sdks/node/docs/examples/database/create-collection.md +++ b/app/sdks/node/docs/examples/database/create-collection.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Database.Client(); +let client = new sdk.Client(); let database = new sdk.Database(client); diff --git a/app/sdks/node/docs/examples/database/create-document.md b/app/sdks/node/docs/examples/database/create-document.md index da63b2460c..458e6e97d4 100644 --- a/app/sdks/node/docs/examples/database/create-document.md +++ b/app/sdks/node/docs/examples/database/create-document.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Database.Client(); +let client = new sdk.Client(); let database = new sdk.Database(client); diff --git a/app/sdks/node/docs/examples/database/delete-collection.md b/app/sdks/node/docs/examples/database/delete-collection.md index 40cb89a051..7be40b41bf 100644 --- a/app/sdks/node/docs/examples/database/delete-collection.md +++ b/app/sdks/node/docs/examples/database/delete-collection.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Database.Client(); +let client = new sdk.Client(); let database = new sdk.Database(client); diff --git a/app/sdks/node/docs/examples/database/delete-document.md b/app/sdks/node/docs/examples/database/delete-document.md index 6fb720be40..d74f2dd16c 100644 --- a/app/sdks/node/docs/examples/database/delete-document.md +++ b/app/sdks/node/docs/examples/database/delete-document.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Database.Client(); +let client = new sdk.Client(); let database = new sdk.Database(client); diff --git a/app/sdks/node/docs/examples/database/get-collection.md b/app/sdks/node/docs/examples/database/get-collection.md index ba1be93ec0..69a39382bf 100644 --- a/app/sdks/node/docs/examples/database/get-collection.md +++ b/app/sdks/node/docs/examples/database/get-collection.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Database.Client(); +let client = new sdk.Client(); let database = new sdk.Database(client); diff --git a/app/sdks/node/docs/examples/database/get-document.md b/app/sdks/node/docs/examples/database/get-document.md index 9ec5531d5c..5a676580bd 100644 --- a/app/sdks/node/docs/examples/database/get-document.md +++ b/app/sdks/node/docs/examples/database/get-document.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Database.Client(); +let client = new sdk.Client(); let database = new sdk.Database(client); diff --git a/app/sdks/node/docs/examples/database/list-collections.md b/app/sdks/node/docs/examples/database/list-collections.md index e24cfe1e1e..2f746de896 100644 --- a/app/sdks/node/docs/examples/database/list-collections.md +++ b/app/sdks/node/docs/examples/database/list-collections.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Database.Client(); +let client = new sdk.Client(); let database = new sdk.Database(client); diff --git a/app/sdks/node/docs/examples/database/list-documents.md b/app/sdks/node/docs/examples/database/list-documents.md index 698cb9f85e..641a572420 100644 --- a/app/sdks/node/docs/examples/database/list-documents.md +++ b/app/sdks/node/docs/examples/database/list-documents.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Database.Client(); +let client = new sdk.Client(); let database = new sdk.Database(client); diff --git a/app/sdks/node/docs/examples/database/update-collection.md b/app/sdks/node/docs/examples/database/update-collection.md index 909efb4e31..fd3480d1e0 100644 --- a/app/sdks/node/docs/examples/database/update-collection.md +++ b/app/sdks/node/docs/examples/database/update-collection.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Database.Client(); +let client = new sdk.Client(); let database = new sdk.Database(client); diff --git a/app/sdks/node/docs/examples/database/update-document.md b/app/sdks/node/docs/examples/database/update-document.md index 021228737d..1284e7b646 100644 --- a/app/sdks/node/docs/examples/database/update-document.md +++ b/app/sdks/node/docs/examples/database/update-document.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Database.Client(); +let client = new sdk.Client(); let database = new sdk.Database(client); diff --git a/app/sdks/node/docs/examples/locale/get-countries-e-u.md b/app/sdks/node/docs/examples/locale/get-countries-e-u.md index 3361060d2c..3aabf5713b 100644 --- a/app/sdks/node/docs/examples/locale/get-countries-e-u.md +++ b/app/sdks/node/docs/examples/locale/get-countries-e-u.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Locale.Client(); +let client = new sdk.Client(); let locale = new sdk.Locale(client); diff --git a/app/sdks/node/docs/examples/locale/get-countries-phones.md b/app/sdks/node/docs/examples/locale/get-countries-phones.md index 8479614d0a..79cc6f5b6b 100644 --- a/app/sdks/node/docs/examples/locale/get-countries-phones.md +++ b/app/sdks/node/docs/examples/locale/get-countries-phones.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Locale.Client(); +let client = new sdk.Client(); let locale = new sdk.Locale(client); diff --git a/app/sdks/node/docs/examples/locale/get-countries.md b/app/sdks/node/docs/examples/locale/get-countries.md index 8f9017ce8a..a4e878bc6a 100644 --- a/app/sdks/node/docs/examples/locale/get-countries.md +++ b/app/sdks/node/docs/examples/locale/get-countries.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Locale.Client(); +let client = new sdk.Client(); let locale = new sdk.Locale(client); diff --git a/app/sdks/node/docs/examples/locale/get-currencies.md b/app/sdks/node/docs/examples/locale/get-currencies.md index a488f188cc..59d8137dee 100644 --- a/app/sdks/node/docs/examples/locale/get-currencies.md +++ b/app/sdks/node/docs/examples/locale/get-currencies.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Locale.Client(); +let client = new sdk.Client(); let locale = new sdk.Locale(client); diff --git a/app/sdks/node/docs/examples/locale/get-locale.md b/app/sdks/node/docs/examples/locale/get-locale.md index 95a08dcecf..57e5d69e78 100644 --- a/app/sdks/node/docs/examples/locale/get-locale.md +++ b/app/sdks/node/docs/examples/locale/get-locale.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Locale.Client(); +let client = new sdk.Client(); let locale = new sdk.Locale(client); diff --git a/app/sdks/node/docs/examples/projects/create-key.md b/app/sdks/node/docs/examples/projects/create-key.md index 35a88cff31..227e8fc5ba 100644 --- a/app/sdks/node/docs/examples/projects/create-key.md +++ b/app/sdks/node/docs/examples/projects/create-key.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/create-platform.md b/app/sdks/node/docs/examples/projects/create-platform.md index edb47f78c2..ce9c7e01e1 100644 --- a/app/sdks/node/docs/examples/projects/create-platform.md +++ b/app/sdks/node/docs/examples/projects/create-platform.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/create-project.md b/app/sdks/node/docs/examples/projects/create-project.md index 95b3cb523a..8f0d8b47ef 100644 --- a/app/sdks/node/docs/examples/projects/create-project.md +++ b/app/sdks/node/docs/examples/projects/create-project.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/create-task.md b/app/sdks/node/docs/examples/projects/create-task.md index 8ec1cfa937..8923742294 100644 --- a/app/sdks/node/docs/examples/projects/create-task.md +++ b/app/sdks/node/docs/examples/projects/create-task.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/create-webhook.md b/app/sdks/node/docs/examples/projects/create-webhook.md index 049245b52f..8135e8d66e 100644 --- a/app/sdks/node/docs/examples/projects/create-webhook.md +++ b/app/sdks/node/docs/examples/projects/create-webhook.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/delete-key.md b/app/sdks/node/docs/examples/projects/delete-key.md index 0c02006000..3ca5caba8a 100644 --- a/app/sdks/node/docs/examples/projects/delete-key.md +++ b/app/sdks/node/docs/examples/projects/delete-key.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/delete-platform.md b/app/sdks/node/docs/examples/projects/delete-platform.md index b38bb217be..8c01703dd0 100644 --- a/app/sdks/node/docs/examples/projects/delete-platform.md +++ b/app/sdks/node/docs/examples/projects/delete-platform.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/delete-project.md b/app/sdks/node/docs/examples/projects/delete-project.md index d1c2603ec5..7755f35c1f 100644 --- a/app/sdks/node/docs/examples/projects/delete-project.md +++ b/app/sdks/node/docs/examples/projects/delete-project.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/delete-task.md b/app/sdks/node/docs/examples/projects/delete-task.md index e3f305060c..a3b985b784 100644 --- a/app/sdks/node/docs/examples/projects/delete-task.md +++ b/app/sdks/node/docs/examples/projects/delete-task.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/delete-webhook.md b/app/sdks/node/docs/examples/projects/delete-webhook.md index da0e24a0fe..3b41b8c433 100644 --- a/app/sdks/node/docs/examples/projects/delete-webhook.md +++ b/app/sdks/node/docs/examples/projects/delete-webhook.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/get-key.md b/app/sdks/node/docs/examples/projects/get-key.md index 239a3b1535..e0b2a85856 100644 --- a/app/sdks/node/docs/examples/projects/get-key.md +++ b/app/sdks/node/docs/examples/projects/get-key.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/get-platform.md b/app/sdks/node/docs/examples/projects/get-platform.md index 218d8e69cf..c035141e0c 100644 --- a/app/sdks/node/docs/examples/projects/get-platform.md +++ b/app/sdks/node/docs/examples/projects/get-platform.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/get-project-usage.md b/app/sdks/node/docs/examples/projects/get-project-usage.md index a204b64c73..32c13c13a3 100644 --- a/app/sdks/node/docs/examples/projects/get-project-usage.md +++ b/app/sdks/node/docs/examples/projects/get-project-usage.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/get-project.md b/app/sdks/node/docs/examples/projects/get-project.md index 7b0fe5151a..15b685a554 100644 --- a/app/sdks/node/docs/examples/projects/get-project.md +++ b/app/sdks/node/docs/examples/projects/get-project.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/get-task.md b/app/sdks/node/docs/examples/projects/get-task.md index 1c7338d005..83040a39f1 100644 --- a/app/sdks/node/docs/examples/projects/get-task.md +++ b/app/sdks/node/docs/examples/projects/get-task.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/get-webhook.md b/app/sdks/node/docs/examples/projects/get-webhook.md index cec3f37933..cb98367d6f 100644 --- a/app/sdks/node/docs/examples/projects/get-webhook.md +++ b/app/sdks/node/docs/examples/projects/get-webhook.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/list-keys.md b/app/sdks/node/docs/examples/projects/list-keys.md index 0f406419ef..a0a894a68e 100644 --- a/app/sdks/node/docs/examples/projects/list-keys.md +++ b/app/sdks/node/docs/examples/projects/list-keys.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/list-platforms.md b/app/sdks/node/docs/examples/projects/list-platforms.md index c448faa376..bb7f1370cb 100644 --- a/app/sdks/node/docs/examples/projects/list-platforms.md +++ b/app/sdks/node/docs/examples/projects/list-platforms.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/list-projects.md b/app/sdks/node/docs/examples/projects/list-projects.md index 3299e0293a..e4651ef686 100644 --- a/app/sdks/node/docs/examples/projects/list-projects.md +++ b/app/sdks/node/docs/examples/projects/list-projects.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/list-tasks.md b/app/sdks/node/docs/examples/projects/list-tasks.md index c2bd77b10b..98e381116f 100644 --- a/app/sdks/node/docs/examples/projects/list-tasks.md +++ b/app/sdks/node/docs/examples/projects/list-tasks.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/list-webhooks.md b/app/sdks/node/docs/examples/projects/list-webhooks.md index 0d5caec857..35da55721b 100644 --- a/app/sdks/node/docs/examples/projects/list-webhooks.md +++ b/app/sdks/node/docs/examples/projects/list-webhooks.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/update-key.md b/app/sdks/node/docs/examples/projects/update-key.md index 34226548ad..cd445aef25 100644 --- a/app/sdks/node/docs/examples/projects/update-key.md +++ b/app/sdks/node/docs/examples/projects/update-key.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/update-platform.md b/app/sdks/node/docs/examples/projects/update-platform.md index 1609aec578..6adcad9ed9 100644 --- a/app/sdks/node/docs/examples/projects/update-platform.md +++ b/app/sdks/node/docs/examples/projects/update-platform.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/update-project-o-auth.md b/app/sdks/node/docs/examples/projects/update-project-o-auth.md index b393b6ccb3..229f7e9c3b 100644 --- a/app/sdks/node/docs/examples/projects/update-project-o-auth.md +++ b/app/sdks/node/docs/examples/projects/update-project-o-auth.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/update-project.md b/app/sdks/node/docs/examples/projects/update-project.md index 096078e913..486cef2a4d 100644 --- a/app/sdks/node/docs/examples/projects/update-project.md +++ b/app/sdks/node/docs/examples/projects/update-project.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); diff --git a/app/sdks/node/docs/examples/projects/update-task.md b/app/sdks/node/docs/examples/projects/update-task.md index 90462a191a..c834dc01ff 100644 --- a/app/sdks/node/docs/examples/projects/update-task.md +++ b/app/sdks/node/docs/examples/projects/update-task.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = projects.updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); +let promise = projects.updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 1, 'GET', 'https://example.com'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/node/docs/examples/projects/update-webhook.md b/app/sdks/node/docs/examples/projects/update-webhook.md index ba17d1c726..59783387f7 100644 --- a/app/sdks/node/docs/examples/projects/update-webhook.md +++ b/app/sdks/node/docs/examples/projects/update-webhook.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Projects.Client(); +let client = new sdk.Client(); let projects = new sdk.Projects(client); @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = projects.updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); +let promise = projects.updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 1); promise.then(function (response) { console.log(response); diff --git a/app/sdks/node/docs/examples/storage/create-file.md b/app/sdks/node/docs/examples/storage/create-file.md index cbac1fcc3c..f9da6bb145 100644 --- a/app/sdks/node/docs/examples/storage/create-file.md +++ b/app/sdks/node/docs/examples/storage/create-file.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Storage.Client(); +let client = new sdk.Client(); let storage = new sdk.Storage(client); diff --git a/app/sdks/node/docs/examples/storage/delete-file.md b/app/sdks/node/docs/examples/storage/delete-file.md index aea8c60d10..9e8d13880f 100644 --- a/app/sdks/node/docs/examples/storage/delete-file.md +++ b/app/sdks/node/docs/examples/storage/delete-file.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Storage.Client(); +let client = new sdk.Client(); let storage = new sdk.Storage(client); diff --git a/app/sdks/node/docs/examples/storage/get-file-download.md b/app/sdks/node/docs/examples/storage/get-file-download.md index 9014aa2205..2967170695 100644 --- a/app/sdks/node/docs/examples/storage/get-file-download.md +++ b/app/sdks/node/docs/examples/storage/get-file-download.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Storage.Client(); +let client = new sdk.Client(); let storage = new sdk.Storage(client); diff --git a/app/sdks/node/docs/examples/storage/get-file-preview.md b/app/sdks/node/docs/examples/storage/get-file-preview.md index 7d753238dd..0c09e8ca8d 100644 --- a/app/sdks/node/docs/examples/storage/get-file-preview.md +++ b/app/sdks/node/docs/examples/storage/get-file-preview.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Storage.Client(); +let client = new sdk.Client(); let storage = new sdk.Storage(client); diff --git a/app/sdks/node/docs/examples/storage/get-file-view.md b/app/sdks/node/docs/examples/storage/get-file-view.md index b0a1ad8fac..a3074fbed1 100644 --- a/app/sdks/node/docs/examples/storage/get-file-view.md +++ b/app/sdks/node/docs/examples/storage/get-file-view.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Storage.Client(); +let client = new sdk.Client(); let storage = new sdk.Storage(client); diff --git a/app/sdks/node/docs/examples/storage/get-file.md b/app/sdks/node/docs/examples/storage/get-file.md index f17b7cfdc5..a1a3baf009 100644 --- a/app/sdks/node/docs/examples/storage/get-file.md +++ b/app/sdks/node/docs/examples/storage/get-file.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Storage.Client(); +let client = new sdk.Client(); let storage = new sdk.Storage(client); diff --git a/app/sdks/node/docs/examples/storage/list-files.md b/app/sdks/node/docs/examples/storage/list-files.md index 4c32689bd0..59a331a2b5 100644 --- a/app/sdks/node/docs/examples/storage/list-files.md +++ b/app/sdks/node/docs/examples/storage/list-files.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Storage.Client(); +let client = new sdk.Client(); let storage = new sdk.Storage(client); diff --git a/app/sdks/node/docs/examples/storage/update-file.md b/app/sdks/node/docs/examples/storage/update-file.md index 7adcb7c349..d5bd4de646 100644 --- a/app/sdks/node/docs/examples/storage/update-file.md +++ b/app/sdks/node/docs/examples/storage/update-file.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Storage.Client(); +let client = new sdk.Client(); let storage = new sdk.Storage(client); diff --git a/app/sdks/node/docs/examples/teams/create-team-membership-resend.md b/app/sdks/node/docs/examples/teams/create-team-membership-resend.md index df025f82fe..1f387d0b3b 100644 --- a/app/sdks/node/docs/examples/teams/create-team-membership-resend.md +++ b/app/sdks/node/docs/examples/teams/create-team-membership-resend.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Teams.Client(); +let client = new sdk.Client(); let teams = new sdk.Teams(client); diff --git a/app/sdks/node/docs/examples/teams/create-team-membership.md b/app/sdks/node/docs/examples/teams/create-team-membership.md index 24bbadb908..7a2c9be298 100644 --- a/app/sdks/node/docs/examples/teams/create-team-membership.md +++ b/app/sdks/node/docs/examples/teams/create-team-membership.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Teams.Client(); +let client = new sdk.Client(); let teams = new sdk.Teams(client); diff --git a/app/sdks/node/docs/examples/teams/create-team.md b/app/sdks/node/docs/examples/teams/create-team.md index f3f5a5cd2f..73dd77ecc5 100644 --- a/app/sdks/node/docs/examples/teams/create-team.md +++ b/app/sdks/node/docs/examples/teams/create-team.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Teams.Client(); +let client = new sdk.Client(); let teams = new sdk.Teams(client); diff --git a/app/sdks/node/docs/examples/teams/delete-team-membership.md b/app/sdks/node/docs/examples/teams/delete-team-membership.md index cf0fc89d49..435a65026f 100644 --- a/app/sdks/node/docs/examples/teams/delete-team-membership.md +++ b/app/sdks/node/docs/examples/teams/delete-team-membership.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Teams.Client(); +let client = new sdk.Client(); let teams = new sdk.Teams(client); diff --git a/app/sdks/node/docs/examples/teams/delete-team.md b/app/sdks/node/docs/examples/teams/delete-team.md index bfc9fb176a..0204d40c98 100644 --- a/app/sdks/node/docs/examples/teams/delete-team.md +++ b/app/sdks/node/docs/examples/teams/delete-team.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Teams.Client(); +let client = new sdk.Client(); let teams = new sdk.Teams(client); diff --git a/app/sdks/node/docs/examples/teams/get-team-members.md b/app/sdks/node/docs/examples/teams/get-team-members.md index 5ff7341e4e..35fd3062fe 100644 --- a/app/sdks/node/docs/examples/teams/get-team-members.md +++ b/app/sdks/node/docs/examples/teams/get-team-members.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Teams.Client(); +let client = new sdk.Client(); let teams = new sdk.Teams(client); diff --git a/app/sdks/node/docs/examples/teams/get-team.md b/app/sdks/node/docs/examples/teams/get-team.md index 3706c9177c..b716b7ea01 100644 --- a/app/sdks/node/docs/examples/teams/get-team.md +++ b/app/sdks/node/docs/examples/teams/get-team.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Teams.Client(); +let client = new sdk.Client(); let teams = new sdk.Teams(client); diff --git a/app/sdks/node/docs/examples/teams/list-teams.md b/app/sdks/node/docs/examples/teams/list-teams.md index 066c2e6517..609c708753 100644 --- a/app/sdks/node/docs/examples/teams/list-teams.md +++ b/app/sdks/node/docs/examples/teams/list-teams.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Teams.Client(); +let client = new sdk.Client(); let teams = new sdk.Teams(client); diff --git a/app/sdks/node/docs/examples/teams/update-team-membership-status.md b/app/sdks/node/docs/examples/teams/update-team-membership-status.md index 9332a584c4..8d65bf33b0 100644 --- a/app/sdks/node/docs/examples/teams/update-team-membership-status.md +++ b/app/sdks/node/docs/examples/teams/update-team-membership-status.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Teams.Client(); +let client = new sdk.Client(); let teams = new sdk.Teams(client); diff --git a/app/sdks/node/docs/examples/teams/update-team.md b/app/sdks/node/docs/examples/teams/update-team.md index 1c55d96522..6afb377091 100644 --- a/app/sdks/node/docs/examples/teams/update-team.md +++ b/app/sdks/node/docs/examples/teams/update-team.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Teams.Client(); +let client = new sdk.Client(); let teams = new sdk.Teams(client); diff --git a/app/sdks/node/docs/examples/users/create-user.md b/app/sdks/node/docs/examples/users/create-user.md index 1f0926fade..d07ab1eabf 100644 --- a/app/sdks/node/docs/examples/users/create-user.md +++ b/app/sdks/node/docs/examples/users/create-user.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Users.Client(); +let client = new sdk.Client(); let users = new sdk.Users(client); diff --git a/app/sdks/node/docs/examples/users/delete-user-sessions.md b/app/sdks/node/docs/examples/users/delete-user-sessions.md index d7578d40da..33f803298d 100644 --- a/app/sdks/node/docs/examples/users/delete-user-sessions.md +++ b/app/sdks/node/docs/examples/users/delete-user-sessions.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Users.Client(); +let client = new sdk.Client(); let users = new sdk.Users(client); diff --git a/app/sdks/node/docs/examples/users/delete-users-session.md b/app/sdks/node/docs/examples/users/delete-users-session.md index 7703352a0b..530503da4b 100644 --- a/app/sdks/node/docs/examples/users/delete-users-session.md +++ b/app/sdks/node/docs/examples/users/delete-users-session.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Users.Client(); +let client = new sdk.Client(); let users = new sdk.Users(client); diff --git a/app/sdks/node/docs/examples/users/get-user-logs.md b/app/sdks/node/docs/examples/users/get-user-logs.md index 484bb9cdac..85d0a125a0 100644 --- a/app/sdks/node/docs/examples/users/get-user-logs.md +++ b/app/sdks/node/docs/examples/users/get-user-logs.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Users.Client(); +let client = new sdk.Client(); let users = new sdk.Users(client); diff --git a/app/sdks/node/docs/examples/users/get-user-prefs.md b/app/sdks/node/docs/examples/users/get-user-prefs.md index 0719091111..46d959e1cb 100644 --- a/app/sdks/node/docs/examples/users/get-user-prefs.md +++ b/app/sdks/node/docs/examples/users/get-user-prefs.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Users.Client(); +let client = new sdk.Client(); let users = new sdk.Users(client); diff --git a/app/sdks/node/docs/examples/users/get-user-sessions.md b/app/sdks/node/docs/examples/users/get-user-sessions.md index 4e049f257e..b3dfe28405 100644 --- a/app/sdks/node/docs/examples/users/get-user-sessions.md +++ b/app/sdks/node/docs/examples/users/get-user-sessions.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Users.Client(); +let client = new sdk.Client(); let users = new sdk.Users(client); diff --git a/app/sdks/node/docs/examples/users/get-user.md b/app/sdks/node/docs/examples/users/get-user.md index c46b9d7a3e..96676c0196 100644 --- a/app/sdks/node/docs/examples/users/get-user.md +++ b/app/sdks/node/docs/examples/users/get-user.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Users.Client(); +let client = new sdk.Client(); let users = new sdk.Users(client); diff --git a/app/sdks/node/docs/examples/users/list-users.md b/app/sdks/node/docs/examples/users/list-users.md index b4f51cfddd..455e42db4d 100644 --- a/app/sdks/node/docs/examples/users/list-users.md +++ b/app/sdks/node/docs/examples/users/list-users.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Users.Client(); +let client = new sdk.Client(); let users = new sdk.Users(client); diff --git a/app/sdks/node/docs/examples/users/update-user-status.md b/app/sdks/node/docs/examples/users/update-user-status.md index 009fcf1314..858833a50c 100644 --- a/app/sdks/node/docs/examples/users/update-user-status.md +++ b/app/sdks/node/docs/examples/users/update-user-status.md @@ -1,7 +1,7 @@ const sdk = require('node-appwrite'); // Init SDK -let client = new Users.Client(); +let client = new sdk.Client(); let users = new sdk.Users(client); diff --git a/app/sdks/node/lib/services/auth.js b/app/sdks/node/lib/services/auth.js index 39cf72ad10..e8bdd2bc2c 100644 --- a/app/sdks/node/lib/services/auth.js +++ b/app/sdks/node/lib/services/auth.js @@ -7,13 +7,13 @@ class Auth extends Service { * * Allow the user to login into his account by providing a valid email and * password combination. Use the success and failure arguments to provide a - * redirect URL\'s back to your app when login is completed. - * + * redirect URL\'s back to your app when login is completed. + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when * added your platforms in the console interface. - * + * * When accessing this route using JavaScript from the browser, success and * failure parameter URLs are required. Appwrite server will respond with a * 301 redirect status code and will set the user session cookie. This @@ -29,7 +29,7 @@ class Auth extends Service { */ async login(email, password, success, failure) { let path = '/auth/login'; - + return await this.client.call('post', path, {'content-type': 'application/json'}, { 'email': email, @@ -51,7 +51,7 @@ class Auth extends Service { */ async logout() { let path = '/auth/logout'; - + return await this.client.call('delete', path, {'content-type': 'application/json'}, { }); @@ -70,7 +70,7 @@ class Auth extends Service { */ async logoutBySession(id) { let path = '/auth/logout/{id}'.replace(new RegExp('{id}', 'g'), id); - + return await this.client.call('delete', path, {'content-type': 'application/json'}, { }); @@ -87,7 +87,7 @@ class Auth extends Service { */ async oauth(provider, success = '', failure = '') { let path = '/auth/oauth/{provider}'.replace(new RegExp('{provider}', 'g'), provider); - + return await this.client.call('get', path, {'content-type': 'application/json'}, { 'success': success, @@ -112,7 +112,7 @@ class Auth extends Service { */ async recovery(email, reset) { let path = '/auth/recovery'; - + return await this.client.call('post', path, {'content-type': 'application/json'}, { 'email': email, @@ -127,7 +127,7 @@ class Auth extends Service { * **userId** and **token** arguments will be passed as query parameters to * the redirect URL you have provided when sending your request to the * /auth/recovery endpoint. - * + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when @@ -142,7 +142,7 @@ class Auth extends Service { */ async recoveryReset(userId, token, passwordA, passwordB) { let path = '/auth/recovery/reset'; - + return await this.client.call('put', path, {'content-type': 'application/json'}, { 'userId': userId, @@ -158,18 +158,18 @@ class Auth extends Service { * Use this endpoint to allow a new user to register an account in your * project. Use the success and failure URL's to redirect users back to your * application after signup completes. - * + * * If registration completes successfully user will be sent with a * confirmation email in order to confirm he is the owner of the account email * address. Use the confirmation parameter to redirect the user from the * confirmation email back to your app. When the user is redirected, use the * /auth/confirm endpoint to complete the account confirmation. - * + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when * added your platforms in the console interface. - * + * * When accessing this route using JavaScript from the browser, success and * failure parameter URLs are required. Appwrite server will respond with a * 301 redirect status code and will set the user session cookie. This @@ -187,7 +187,7 @@ class Auth extends Service { */ async register(email, password, confirm, success = '', failure = '', name = '') { let path = '/auth/register'; - + return await this.client.call('post', path, {'content-type': 'application/json'}, { 'email': email, @@ -214,7 +214,7 @@ class Auth extends Service { */ async confirm(userId, token) { let path = '/auth/register/confirm'; - + return await this.client.call('post', path, {'content-type': 'application/json'}, { 'userId': userId, @@ -228,7 +228,7 @@ class Auth extends Service { * This endpoint allows the user to request your app to resend him his email * confirmation message. The redirect arguments acts the same way as in * /auth/register endpoint. - * + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when @@ -240,7 +240,7 @@ class Auth extends Service { */ async confirmResend(confirm) { let path = '/auth/register/confirm/resend'; - + return await this.client.call('post', path, {'content-type': 'application/json'}, { 'confirm': confirm @@ -248,4 +248,4 @@ class Auth extends Service { } } -module.exports = Auth; +module.exports = Auth; \ No newline at end of file diff --git a/app/sdks/node/lib/services/locale.js b/app/sdks/node/lib/services/locale.js index 0a9ffad1a9..5231e1a1e4 100644 --- a/app/sdks/node/lib/services/locale.js +++ b/app/sdks/node/lib/services/locale.js @@ -76,9 +76,9 @@ class Locale extends Service { /** * List of currencies * - * List of all currencies, including currency symol, name, plural, and decimal - * digits for all major and minor currencies. You can use the locale header to - * get the data in supported language. + * List of all currencies, including currency symbol, name, plural, and + * decimal digits for all major and minor currencies. You can use the locale + * header to get the data in supported language. * * @throws Exception * @return {} diff --git a/app/sdks/php/README.md b/app/sdks/php/README.md index 0e095a413d..8a58765489 100644 --- a/app/sdks/php/README.md +++ b/app/sdks/php/README.md @@ -1,9 +1,9 @@ # [Appwrite SDK for PHP](https://appwrite.io)   [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Appwrite%20is%20a%20backend%20as%20a%20service%20for%20building%20web%20or%20mobile%20apps&url=http%3A%2F%2Fappwrite.io&via=appwrite_io&hashtags=JS%2Cjavascript%2Creactjs%2Cangular%2Cios%2Candroid) ![License](https://img.shields.io/github/license/appwrite/sdk-for-php.svg?v=1) -![Version](https://img.shields.io/badge/api%20version-0.1.15-blue.svg?v=1) +![Version](https://img.shields.io/badge/api%20version-latest-blue.svg?v=1) -This SDK is compatible with Appwrite server version 0.2.0 for older versions check previous releases. +This SDK is compitable with Appwrite server version 0.2.0 for older versions check previous releases. Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) @@ -11,7 +11,7 @@ Appwrite backend as a service cuts up to 70% of the time and costs required for ![Appwrite](https://appwrite.io/images/github.png) -**API Version: 0.1.15** +**API Version: latest** ## Installation @@ -23,4 +23,4 @@ composer require appwrite/appwrite ## License -Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. +Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/php/docs/auth.md b/app/sdks/php/docs/auth.md index 8808237478..7a0bef9733 100644 --- a/app/sdks/php/docs/auth.md +++ b/app/sdks/php/docs/auth.md @@ -146,3 +146,4 @@ Please notice that in order to avoid a [Redirect Attacks](https://github.com/OWA | Field Name | Type | Description | Default | | --- | --- | --- | --- | | confirm | string | Confirmation URL to redirect user to your app after confirm token has been sent to user email. | | + diff --git a/app/sdks/php/docs/examples/projects/update-webhook.md b/app/sdks/php/docs/examples/projects/update-webhook.md index 6f176a01fb..a7e42dcce2 100644 --- a/app/sdks/php/docs/examples/projects/update-webhook.md +++ b/app/sdks/php/docs/examples/projects/update-webhook.md @@ -12,4 +12,4 @@ $client $projects = new Projects($client); -$result = $projects->updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 1); \ No newline at end of file +$result = $projects->updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); \ No newline at end of file diff --git a/app/sdks/php/docs/locale.md b/app/sdks/php/docs/locale.md index 7635546481..e977fa99cf 100644 --- a/app/sdks/php/docs/locale.md +++ b/app/sdks/php/docs/locale.md @@ -38,5 +38,5 @@ GET https://appwrite.test/v1/locale/countries/phones GET https://appwrite.test/v1/locale/currencies ``` -** List of all currencies, including currency symol, name, plural, and decimal digits for all major and minor currencies. You can use the locale header to get the data in supported language. ** +** List of all currencies, including currency symbol, name, plural, and decimal digits for all major and minor currencies. You can use the locale header to get the data in supported language. ** diff --git a/app/sdks/php/src/Appwrite/Services/Auth.php b/app/sdks/php/src/Appwrite/Services/Auth.php index 818a5e1dba..aa0c32c3f2 100644 --- a/app/sdks/php/src/Appwrite/Services/Auth.php +++ b/app/sdks/php/src/Appwrite/Services/Auth.php @@ -13,13 +13,13 @@ class Auth extends Service * * Allow the user to login into his account by providing a valid email and * password combination. Use the success and failure arguments to provide a - * redirect URL\'s back to your app when login is completed. - * + * redirect URL\'s back to your app when login is completed. + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when * added your platforms in the console interface. - * + * * When accessing this route using JavaScript from the browser, success and * failure parameter URLs are required. Appwrite server will respond with a * 301 redirect status code and will set the user session cookie. This @@ -143,7 +143,7 @@ class Auth extends Service * **userId** and **token** arguments will be passed as query parameters to * the redirect URL you have provided when sending your request to the * /auth/recovery endpoint. - * + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when @@ -176,18 +176,18 @@ class Auth extends Service * Use this endpoint to allow a new user to register an account in your * project. Use the success and failure URL's to redirect users back to your * application after signup completes. - * + * * If registration completes successfully user will be sent with a * confirmation email in order to confirm he is the owner of the account email * address. Use the confirmation parameter to redirect the user from the * confirmation email back to your app. When the user is redirected, use the * /auth/confirm endpoint to complete the account confirmation. - * + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when * added your platforms in the console interface. - * + * * When accessing this route using JavaScript from the browser, success and * failure parameter URLs are required. Appwrite server will respond with a * 301 redirect status code and will set the user session cookie. This @@ -250,7 +250,7 @@ class Auth extends Service * This endpoint allows the user to request your app to resend him his email * confirmation message. The redirect arguments acts the same way as in * /auth/register endpoint. - * + * * Please notice that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when @@ -271,4 +271,4 @@ class Auth extends Service ], $params); } -} +} \ No newline at end of file diff --git a/app/sdks/php/src/Appwrite/Services/Locale.php b/app/sdks/php/src/Appwrite/Services/Locale.php index 1ae5ae0427..b03c1c3e73 100644 --- a/app/sdks/php/src/Appwrite/Services/Locale.php +++ b/app/sdks/php/src/Appwrite/Services/Locale.php @@ -90,9 +90,9 @@ class Locale extends Service /** * List of currencies * - * List of all currencies, including currency symol, name, plural, and decimal - * digits for all major and minor currencies. You can use the locale header to - * get the data in supported language. + * List of all currencies, including currency symbol, name, plural, and + * decimal digits for all major and minor currencies. You can use the locale + * header to get the data in supported language. * * @throws Exception * @return array diff --git a/app/sdks/python/README.md b/app/sdks/python/README.md index 59928110e1..08f7338bfd 100644 --- a/app/sdks/python/README.md +++ b/app/sdks/python/README.md @@ -1,7 +1,7 @@ # [Appwrite SDK for Python](https://appwrite.io)   [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Appwrite%20is%20a%20backend%20as%20a%20service%20for%20building%20web%20or%20mobile%20apps&url=http%3A%2F%2Fappwrite.io&via=appwrite_io&hashtags=JS%2Cjavascript%2Creactjs%2Cangular%2Cios%2Candroid) ![License](https://img.shields.io/github/license/appwrite/sdk-for-python.svg?v=1) -![Version](https://img.shields.io/badge/api%20version-0.1.15-blue.svg?v=1) +![Version](https://img.shields.io/badge/api%20version-latest-blue.svg?v=1) **WORK IN PROGRESS - NOT READY FOR USAGE - Want to help us improve this client SDK? Send a pull request to Appwrite [SDK generator repository](https://github.com/appwrite/sdk-generator).** @@ -11,7 +11,7 @@ Appwrite backend as a service cuts up to 70% of the time and costs required for ![Appwrite](https://appwrite.io/images/github.png) -**API Version: 0.1.15** +**API Version: latest** ## Installation diff --git a/app/sdks/ruby/README.md b/app/sdks/ruby/README.md index 82892eac6b..a8d5f466ba 100644 --- a/app/sdks/ruby/README.md +++ b/app/sdks/ruby/README.md @@ -1,7 +1,7 @@ # [Appwrite SDK for Ruby](https://appwrite.io)   [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Appwrite%20is%20a%20backend%20as%20a%20service%20for%20building%20web%20or%20mobile%20apps&url=http%3A%2F%2Fappwrite.io&via=appwrite_io&hashtags=JS%2Cjavascript%2Creactjs%2Cangular%2Cios%2Candroid) ![License](https://img.shields.io/github/license/appwrite/sdk-for-ruby.svg?v=1) -![Version](https://img.shields.io/badge/api%20version-0.1.15-blue.svg?v=1) +![Version](https://img.shields.io/badge/api%20version-latest-blue.svg?v=1) **WORK IN PROGRESS - NOT READY FOR USAGE - Want to help us improve this client SDK? Send a pull request to Appwrite [SDK generator repository](https://github.com/appwrite/sdk-generator).** @@ -11,7 +11,7 @@ Appwrite backend as a service cuts up to 70% of the time and costs required for ![Appwrite](https://appwrite.io/images/github.png) -**API Version: 0.1.15** +**API Version: latest** ## Installation diff --git a/composer.lock b/composer.lock index 40ac77a0cc..bd903a6a74 100644 --- a/composer.lock +++ b/composer.lock @@ -92,7 +92,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "21f848c7c8a6f3f721c23d9c8bbdf8fff886863d" + "reference": "30bd70b62d5b5ff0c7902383d1b92ca523a20004" }, "require": { "ext-curl": "*", @@ -122,7 +122,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2019-10-01 17:57:36" + "time": "2019-10-03 17:55:27" }, { "name": "bacon/bacon-qr-code", @@ -1994,7 +1994,7 @@ }, { "name": "phpdocumentor/reflection-common", - "version": "dev-master", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", @@ -2046,40 +2046,36 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.3.2", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e" + "reference": "8fcadfe5f85c38705151c9ab23b4781f23e6a70e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/b83ff7cfcfee7827e1e78b637a5904fe6a96698e", - "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8fcadfe5f85c38705151c9ab23b4781f23e6a70e", + "reference": "8fcadfe5f85c38705151c9ab23b4781f23e6a70e", "shasum": "" }, "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", - "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", - "webmozart/assert": "^1.0" + "php": ">=7.1", + "phpdocumentor/type-resolver": "^0", + "webmozart/assert": "^1" }, "require-dev": { - "doctrine/instantiator": "^1.0.5", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.4" + "doctrine/instantiator": "^1", + "mockery/mockery": "^1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-master": "5.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2093,35 +2089,34 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2019-09-12T14:27:41+00:00" + "time": "2019-06-15T20:45:01+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "dev-master", + "version": "0.7.x-dev", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9" + "reference": "6f6f66c1d4e14e9b0ad124cae85864dfa03104c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", - "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6f6f66c1d4e14e9b0ad124cae85864dfa03104c7", + "reference": "6f6f66c1d4e14e9b0ad124cae85864dfa03104c7", "shasum": "" }, "require": { - "php": "^7.1", - "phpdocumentor/reflection-common": "^2.0" + "php": ">=7.1", + "phpdocumentor/reflection-common": "~2.0.0-beta1" }, "require-dev": { - "ext-tokenizer": "^7.1", "mockery/mockery": "~1", - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "~6" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "0.x-dev" } }, "autoload": { @@ -2140,26 +2135,26 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2019-08-22T18:11:29+00:00" + "time": "2019-08-22T17:55:41+00:00" }, { "name": "phpspec/prophecy", - "version": "dev-master", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "bcdce71d674f4f7b86df0ff3a418d43b7fe141f7" + "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bcdce71d674f4f7b86df0ff3a418d43b7fe141f7", - "reference": "bcdce71d674f4f7b86df0ff3a418d43b7fe141f7", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/f6811d96d97bdf400077a0cc100ae56aa32b9203", + "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", "sebastian/comparator": "^1.1|^2.0|^3.0", "sebastian/recursion-context": "^1.0|^2.0|^3.0" }, @@ -2203,7 +2198,7 @@ "spy", "stub" ], - "time": "2019-09-09T15:23:21+00:00" + "time": "2019-10-03T11:07:50+00:00" }, { "name": "phpunit/php-code-coverage", From 8cca93737141aea855826c790378ac31983e6b7b Mon Sep 17 00:00:00 2001 From: eldadfux Date: Thu, 3 Oct 2019 23:57:57 +0300 Subject: [PATCH 061/135] Fixed database not casting string properly --- app/controllers/database.php | 2 ++ app/sdks/php/docs/examples/projects/create-webhook.md | 2 +- app/sdks/php/docs/examples/projects/update-task.md | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/database.php b/app/controllers/database.php index e27d1feff7..31cd12fb56 100644 --- a/app/controllers/database.php +++ b/app/controllers/database.php @@ -435,6 +435,8 @@ $utopia->post('/v1/database/:collectionId/documents') if (isset($data['$uid'])) { throw new Exception('$uid is not allowed for creating new documents, try update instead', 400); } + + $data = (is_string($data) && $result = json_decode($data, true)) ? $result : $data; // Cast to JSON array $collection = $projectDB->getDocument($collectionId/*, $isDev*/); diff --git a/app/sdks/php/docs/examples/projects/create-webhook.md b/app/sdks/php/docs/examples/projects/create-webhook.md index 6eacda1fc0..1bf92c8925 100644 --- a/app/sdks/php/docs/examples/projects/create-webhook.md +++ b/app/sdks/php/docs/examples/projects/create-webhook.md @@ -12,4 +12,4 @@ $client $projects = new Projects($client); -$result = $projects->createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 0); \ No newline at end of file +$result = $projects->createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 1); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/update-task.md b/app/sdks/php/docs/examples/projects/update-task.md index 59308c5d6d..0d9f3fb7a6 100644 --- a/app/sdks/php/docs/examples/projects/update-task.md +++ b/app/sdks/php/docs/examples/projects/update-task.md @@ -12,4 +12,4 @@ $client $projects = new Projects($client); -$result = $projects->updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); \ No newline at end of file +$result = $projects->updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 1, 'GET', 'https://example.com'); \ No newline at end of file From f0f3211ef056839c932b2e8d32c8be8c9e30f3a3 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Thu, 3 Oct 2019 23:59:06 +0300 Subject: [PATCH 062/135] Casting string to object --- app/controllers/database.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/database.php b/app/controllers/database.php index 31cd12fb56..a9de951e89 100644 --- a/app/controllers/database.php +++ b/app/controllers/database.php @@ -428,6 +428,8 @@ $utopia->post('/v1/database/:collectionId/documents') }, 'Parent document property connection type. You can set this value to **assign**, **append** or **prepend**, default value is assign. Use when you want your new document to be a child of a parent document.', true) ->action( function ($collectionId, $data, $read, $write, $parentDocument, $parentProperty, $parentPropertyType) use ($response, $projectDB, $webhook, $audit) { + $data = (is_string($data) && $result = json_decode($data, true)) ? $result : $data; // Cast to JSON array + if (empty($data)) { throw new Exception('Missing payload', 400); } @@ -436,8 +438,6 @@ $utopia->post('/v1/database/:collectionId/documents') throw new Exception('$uid is not allowed for creating new documents, try update instead', 400); } - $data = (is_string($data) && $result = json_decode($data, true)) ? $result : $data; // Cast to JSON array - $collection = $projectDB->getDocument($collectionId/*, $isDev*/); if (is_null($collection->getUid()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { From 0b54e349d147aea977b62dbc9aa8bb1fc08678e4 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Fri, 4 Oct 2019 00:59:35 +0300 Subject: [PATCH 063/135] Updated domain name --- app/app.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/app/app.php b/app/app.php index 4e4af39873..6301d08728 100644 --- a/app/app.php +++ b/app/app.php @@ -435,12 +435,8 @@ $utopia->get('/v1/proxy') $utopia->get('/v1/open-api-2.json') ->label('scope', 'public') ->label('docs', false) - ->param('platform', 'client', function () { - return new WhiteList(['client', 'server']); - }, 'Choose target platform.', true) - ->param('extensions', 0, function () { - return new Range(0, 1); - }, 'Show extra data.', true) + ->param('platform', 'client', function () {return new WhiteList(['client', 'server']);}, 'Choose target platform.', true) + ->param('extensions', 0, function () {return new Range(0, 1);}, 'Show extra data.', true) ->action( function ($platform, $extensions) use ($response, $request, $utopia, $domain, $version, $services) { function fromCamelCase($input) @@ -494,7 +490,7 @@ $utopia->get('/v1/open-api-2.json') 'url' => 'https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE', ], ], - 'host' => $domain, + 'host' => $request->getServer('_APP_HOME', $domain), 'basePath' => '/v1', 'schemes' => ['https'], 'consumes' => ['application/json', 'multipart/form-data'], From 0ea43c0cdd9d728a908574d37c901b70949e7fcf Mon Sep 17 00:00:00 2001 From: eldadfux Date: Fri, 4 Oct 2019 01:05:12 +0300 Subject: [PATCH 064/135] Updated SDKs generator --- app/tasks/sdks.php | 9 +++++---- composer.lock | 12 ++++++------ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/tasks/sdks.php b/app/tasks/sdks.php index 2b62b76e89..a29a1312c1 100644 --- a/app/tasks/sdks.php +++ b/app/tasks/sdks.php @@ -17,10 +17,11 @@ use Appwrite\SDK\Language\Dart; $cli = new CLI(); $version = '0.2.0'; // Server version +$warning = '**This SDK is compatible with Appwrite server version ' . $version . '. For older versions, please check [previous releases](/releases).**'; $cli ->task('generate') - ->action(function () use ($version) { + ->action(function () use ($warning) { function getSSLPage($url) { $ch = curl_init(); @@ -43,7 +44,7 @@ $cli 'gitRepo' => 'git@github.com:appwrite/sdk-for-php.git', 'gitRepoName' => 'sdk-for-php', 'gitUserName' => 'appwrite', - 'warning' => 'This SDK is compitable with Appwrite server version ' . $version . ' for older versions check previous releases.', + 'warning' => $warning, 'platform' => 'server', ], 'js' => [ @@ -53,7 +54,7 @@ $cli 'gitRepo' => 'git@github.com:appwrite/sdk-for-js.git', 'gitRepoName' => 'sdk-for-js', 'gitUserName' => 'appwrite', - 'warning' => 'This SDK is compitable with Appwrite server version ' . $version . ' for older versions check previous releases.', + 'warning' => $warning, 'platform' => 'client', ], 'node' => [ @@ -63,7 +64,7 @@ $cli 'gitRepo' => 'git@github.com:appwrite/sdk-for-node.git', 'gitRepoName' => 'sdk-for-node', 'gitUserName' => 'appwrite', - 'warning' => 'This SDK is compitable with Appwrite server version ' . $version . ' for older versions check previous releases.', + 'warning' => $warning, 'platform' => 'server', ], 'python' => [ diff --git a/composer.lock b/composer.lock index bd903a6a74..3d9d1aabdc 100644 --- a/composer.lock +++ b/composer.lock @@ -12,12 +12,12 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-for-php.git", - "reference": "456e2f153393bd67b7d706db1ec104ba211cf25a" + "reference": "bc702c165342f3d943e17d580ab3eb66e100eb44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-for-php/zipball/456e2f153393bd67b7d706db1ec104ba211cf25a", - "reference": "456e2f153393bd67b7d706db1ec104ba211cf25a", + "url": "https://api.github.com/repos/appwrite/sdk-for-php/zipball/bc702c165342f3d943e17d580ab3eb66e100eb44", + "reference": "bc702c165342f3d943e17d580ab3eb66e100eb44", "shasum": "" }, "require": { @@ -39,7 +39,7 @@ "BSD-3-Clause" ], "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)", - "time": "2019-10-01T18:05:56+00:00" + "time": "2019-10-03T17:57:02+00:00" }, { "name": "appwrite/php-clamav", @@ -92,7 +92,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "30bd70b62d5b5ff0c7902383d1b92ca523a20004" + "reference": "e0cfa4cb8d45b3faf8222f4e7f803f3054431ce8" }, "require": { "ext-curl": "*", @@ -122,7 +122,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2019-10-03 17:55:27" + "time": "2019-10-03 22:01:52" }, { "name": "bacon/bacon-qr-code", From 02fcfcf164017a455f397fc2b3aaa32dd9a37960 Mon Sep 17 00:00:00 2001 From: Utkarsh Raj Singh Date: Fri, 4 Oct 2019 04:22:27 +0530 Subject: [PATCH 065/135] Updated locale for consistent meaning --- app/config/locale/hi.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/hi.php b/app/config/locale/hi.php index 95dced4f53..c6f0255bde 100644 --- a/app/config/locale/hi.php +++ b/app/config/locale/hi.php @@ -1,7 +1,7 @@ '"बुद्धिमान होने कला यह जानने की कला है कि क्या अनदेखी करना चाहिए।"', // This is the line printed in the homepage and console 'view-source' + 'settings.inspire' => '"यह जान लेना की क्या अनदेखा किया जा सकता है, ही बुद्धिमता का प्रतीक है |"', // This is the line printed in the homepage and console 'view-source' 'settings.locale' => 'hi', 'settings.direction' => 'ltr', From 39aaf56a5d2243530623ab9026ad5aafdb9cfc3a Mon Sep 17 00:00:00 2001 From: Utkarsh Raj Singh Date: Fri, 4 Oct 2019 04:26:01 +0530 Subject: [PATCH 066/135] Add translation for untranslated words --- app/config/locale/hi.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/hi.php b/app/config/locale/hi.php index c6f0255bde..f48dcdb70a 100644 --- a/app/config/locale/hi.php +++ b/app/config/locale/hi.php @@ -14,7 +14,7 @@ return [ 'auth.emails.invitation.title' => 'इनविटेशन %s टीम %s', 'auth.emails.invitation.body' => 'hi.email.auth.invitation.tpl', - 'locale.country.unknown' => 'Unknown', + 'locale.country.unknown' => 'अज्ञात', 'countries' => include 'hi.countries.php', 'continents' => include 'hi.continents.php', From c01d0f84cefcfebcd1574d693c76169a06a5827a Mon Sep 17 00:00:00 2001 From: Valerian Pereira Date: Fri, 4 Oct 2019 09:15:30 +0530 Subject: [PATCH 067/135] File Name Fixed --- docs/{EnviornementVariables.md => EnvironmentVariables.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{EnviornementVariables.md => EnvironmentVariables.md} (100%) diff --git a/docs/EnviornementVariables.md b/docs/EnvironmentVariables.md similarity index 100% rename from docs/EnviornementVariables.md rename to docs/EnvironmentVariables.md From 3295ea9b62f7f9f838ff4b9f71d17069db50ddd6 Mon Sep 17 00:00:00 2001 From: Hillary Sousa Date: Fri, 4 Oct 2019 01:07:39 -0300 Subject: [PATCH 068/135] editing country names in pt-br and translating inspirational quote --- app/config/locale/pt-br.countries.php | 18 +++++++++--------- app/config/locale/pt-br.php | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/config/locale/pt-br.countries.php b/app/config/locale/pt-br.countries.php index 3825ebe8f8..9c9bb99e14 100644 --- a/app/config/locale/pt-br.countries.php +++ b/app/config/locale/pt-br.countries.php @@ -20,15 +20,15 @@ return [ 'BG' => 'Bulgária', 'BH' => 'Bahrein', 'BS' => 'Bahamas', - 'BA' => 'Bósnia and Herzegovina', - 'BY' => 'Bielorússia', + 'BA' => 'Bósnia e Herzegovina', + 'BY' => 'Bielorrússia', 'BZ' => 'Belize', 'BO' => 'Bolívia', 'BR' => 'Brasil', 'BB' => 'Barbados', 'BN' => 'Brunei', 'BT' => 'Butão', - 'BW' => 'Botsuana', + 'BW' => 'Botswana', 'CF' => 'República Centro-Africana', 'CA' => 'Canadá', 'CH' => 'Suíça', @@ -38,13 +38,13 @@ return [ 'CM' => 'Camarões', 'CD' => 'República Democrática do Congo', 'CG' => 'República do Congo', - 'CO' => 'Colombia', + 'CO' => 'Colômbia', 'KM' => 'Comores', 'CV' => 'Cabo Verde', 'CR' => 'Costa Rica', 'CU' => 'Cuba', 'CY' => 'Chipre', - 'CZ' => 'Tchéquia', + 'CZ' => 'República Tcheca', 'DE' => 'Alemanha', 'DJ' => 'Djibouti', 'DM' => 'Dominica', @@ -53,14 +53,14 @@ return [ 'DZ' => 'Argélia', 'EC' => 'Equador', 'EG' => 'Egito', - 'ER' => 'Eritrea', + 'ER' => 'Eritreia', 'ES' => 'Espanha', 'EE' => 'Estônia', 'ET' => 'Etiópia', 'FI' => 'Finlândia', 'FJ' => 'Fiji', 'FR' => 'França', - 'FM' => 'Micronésia', + 'FM' => 'Estados Federados da Micronésia', 'GA' => 'Gabão', 'GB' => 'Reino Unido', 'GE' => 'Geórgia', @@ -171,7 +171,7 @@ return [ 'TD' => 'Chade', 'TG' => 'Togo', 'TH' => 'Tailândia', - 'TJ' => 'Tajisquistão', + 'TJ' => 'Tajiquistão', 'TM' => 'Turcomenistão', 'TL' => 'Timor-Leste', 'TO' => 'Tonga', @@ -186,7 +186,7 @@ return [ 'US' => 'Estados Unidos', 'UZ' => 'Uzbequistão', 'VA' => 'Cidade do Vaticano', - 'VC' => 'São Vincente e Granadinas', + 'VC' => 'São Vicente e Granadinas', 'VE' => 'Venezuela', 'VN' => 'Vietnã', 'VU' => 'Vanuatu', diff --git a/app/config/locale/pt-br.php b/app/config/locale/pt-br.php index cc08622883..5fcd96fae0 100644 --- a/app/config/locale/pt-br.php +++ b/app/config/locale/pt-br.php @@ -1,7 +1,7 @@ '"The art of being wise is the art of knowing what to overlook."', // This is the line printed in the homepage and console 'view-source' + 'settings.inspire' => '"A arte de ser sábio é a arte de saber o que deixar passar."', // This is the line printed in the homepage and console 'view-source' 'settings.locale' => 'pt-br', 'settings.direction' => 'ltr', From d58ed472fc10ca855f952ca8fa51d58c3e23998d Mon Sep 17 00:00:00 2001 From: Pedro Woyames Date: Fri, 4 Oct 2019 01:10:29 -0300 Subject: [PATCH 069/135] adjusting the PT-BR translation for a more appropriate speech --- app/config/locale/templates/pt-br.email.auth.confirm.tpl | 2 +- app/config/locale/templates/pt-br.email.auth.invitation.tpl | 4 ++-- app/config/locale/templates/pt-br.email.auth.recovery.tpl | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/config/locale/templates/pt-br.email.auth.confirm.tpl b/app/config/locale/templates/pt-br.email.auth.confirm.tpl index aaee0d5ba8..f949c3f248 100644 --- a/app/config/locale/templates/pt-br.email.auth.confirm.tpl +++ b/app/config/locale/templates/pt-br.email.auth.confirm.tpl @@ -10,7 +10,7 @@ Olá {{name}},

- Por favor, confirme o seu email acessando este link abaixo. + Por favor, confirme o seu email acessando o link abaixo.
{{redirect}}
diff --git a/app/config/locale/templates/pt-br.email.auth.invitation.tpl b/app/config/locale/templates/pt-br.email.auth.invitation.tpl index e7a5645c5b..d0dceefb2f 100644 --- a/app/config/locale/templates/pt-br.email.auth.invitation.tpl +++ b/app/config/locale/templates/pt-br.email.auth.invitation.tpl @@ -10,10 +10,10 @@ Olá,

- Este email foi enviado a você porque
{{owner}} deseja lhe convidar a se tornar membro da equipe {{team}} no {{project}}. + Este email foi enviado a você porque
{{owner}} deseja convida-lo para se tornar membro da equipe {{team}} no {{project}}.

- Siga este link para se juntar a equipe {{team}}: + Siga o link abaixo para se juntar a equipe {{team}}:
{{redirect}}
diff --git a/app/config/locale/templates/pt-br.email.auth.recovery.tpl b/app/config/locale/templates/pt-br.email.auth.recovery.tpl index e70a712cbf..4e722f2aee 100644 --- a/app/config/locale/templates/pt-br.email.auth.recovery.tpl +++ b/app/config/locale/templates/pt-br.email.auth.recovery.tpl @@ -10,7 +10,7 @@ Olá {{name}},

- Acesse este link para redefinir sua senha do {{project}}. + Acesse o link abaixo para redefinir sua senha do {{project}}.
{{redirect}}
From 22caf516ced9348da2fcd91073f043d77135e61f Mon Sep 17 00:00:00 2001 From: Pratik Mehta Date: Fri, 4 Oct 2019 10:40:00 +0530 Subject: [PATCH 070/135] Typo-changes => Grammar changes. => Spelling mistakes changes. --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e3590efe12..fd3227e5f9 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Appwrite is a simple self-hosted backend server for web and mobile developers with a shiny dashboard and a very easy to use REST API. -Appwrite API services aim to make developers life a lot easier by hiding the complexity of common and repetitive software development tasks. +Appwrite API services aim to make developer's life a lot easier by hiding the complexity of common and repetitive software development tasks. Using Appwrite you can easily manage user authentication with multiple sign-in methods, a database for storing and querying user and teams data, storage and file management, image manipulation and cropping, scheduled cron tasks and many other features to help you get more results in faster times and with a lot less code. @@ -28,7 +28,7 @@ Using Appwrite you can easily manage user authentication with multiple sign-in m Appwrite backend server is designed to run in a container environment. Running your server is as easy as running one command from your terminal. You can either run Appwrite on your localhost using docker-compose or on any other container orchestration tool like Kubernetes, Docker Swarm or Rancher. -The easiest way to start running your Appwrite server is by running our docker compose file: +The easiest way to start running your Appwrite server is by running our docker-compose file: ```bash mkdir appwrite-ce && \ @@ -59,15 +59,15 @@ Getting started with Appwrite is as easy as creating a new project, choosing you ### Services * [**Auth**](https://appwrite.io/docs/auth) - Manage user authentication using multiple sign-in methods and account recovery. -* [**Account**](https://appwrite.io/docs/account) - Manage current user account. Track and manage the user sessions, devices and security audit log. +* [**Account**](https://appwrite.io/docs/account) - Manage current user account. Track and manage the user sessions, devices, and security audit log. * [**Users**](https://appwrite.io/docs/users) - Manage and list all project users when in admin mode. * [**Teams**](https://appwrite.io/docs/teams) - Manage and group users in teams. Manage memberships, invites and user roles within a team. -* [**Database**](https://appwrite.io/docs/database) - Manage database collections and document. Read, create, update and delete documents and filter lists of documents collections using an advanced filter with graph like capabilities. +* [**Database**](https://appwrite.io/docs/database) - Manage database collections and document. Read, create, update and delete documents and filter lists of documents collections using an advanced filter with graph-like capabilities. * [**Storage**](https://appwrite.io/docs/storage) - Manage storage files. Read, create, delete and preview files. Manipulate the preview of your files to fit your app perfectly. All files are scanned by ClamAV and stored in a secure and encrypted way. -* [**Locale**](https://appwrite.io/docs/locale) - Track user's location, and manage your app locale based data. +* [**Locale**](https://appwrite.io/docs/locale) - Track user's location, and manage your app locale-based data. * [**Avatars**](https://appwrite.io/docs/avatars) - Manage your user's avatars, country's flags, browser icons, credit card symbols and generate QR codes. -For the complete API documentation, visit [https://appwrite.io/docs](https://appwrite.io/docs). For more tutorials, news and announcments check out our [blog](https://medium.com/appwrite-io). +For the complete API documentation, visit [https://appwrite.io/docs](https://appwrite.io/docs). For more tutorials, news and announcements check out our [blog](https://medium.com/appwrite-io). ### SDKs From 91730da10afd5b7e7b0a9faa22ff533659731b7f Mon Sep 17 00:00:00 2001 From: eldadfux Date: Fri, 4 Oct 2019 08:14:22 +0300 Subject: [PATCH 071/135] Updated SDKs --- app/sdks/dart/README.md | 4 +- app/sdks/dart/lib/client.dart | 2 +- app/sdks/js/README.md | 6 +-- app/sdks/js/src/sdk.js | 2 +- app/sdks/js/src/sdk.min.js | 2 +- app/sdks/node/README.md | 6 +-- .../docs/examples/projects/create-task.md | 2 +- .../docs/examples/projects/create-webhook.md | 2 +- .../docs/examples/projects/update-task.md | 2 +- .../docs/examples/projects/update-webhook.md | 2 +- app/sdks/node/lib/client.js | 2 +- app/sdks/php/README.md | 6 +-- app/sdks/php/docs/account.md | 18 +++---- app/sdks/php/docs/auth.md | 18 +++---- app/sdks/php/docs/avatars.md | 12 ++--- app/sdks/php/docs/database.md | 20 +++---- .../php/docs/examples/projects/update-task.md | 2 +- .../docs/examples/projects/update-webhook.md | 2 +- app/sdks/php/docs/locale.md | 10 ++-- app/sdks/php/docs/projects.md | 54 +++++++++---------- app/sdks/php/docs/storage.md | 16 +++--- app/sdks/php/docs/teams.md | 20 +++---- app/sdks/php/docs/users.md | 18 +++---- app/sdks/php/src/Appwrite/Client.php | 2 +- app/sdks/python/README.md | 4 +- app/sdks/python/appwrite/client.py | 2 +- app/sdks/ruby/README.md | 4 +- app/tasks/sdks.php | 2 +- 28 files changed, 115 insertions(+), 127 deletions(-) diff --git a/app/sdks/dart/README.md b/app/sdks/dart/README.md index 2e742434d8..de99069bd5 100644 --- a/app/sdks/dart/README.md +++ b/app/sdks/dart/README.md @@ -1,4 +1,4 @@ -# [Appwrite SDK for Dart](https://appwrite.io)   [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Appwrite%20is%20a%20backend%20as%20a%20service%20for%20building%20web%20or%20mobile%20apps&url=http%3A%2F%2Fappwrite.io&via=appwrite_io&hashtags=JS%2Cjavascript%2Creactjs%2Cangular%2Cios%2Candroid) +# Appwrite SDK for Dart ![License](https://img.shields.io/github/license/appwrite/sdk-for-dart.svg?v=1) ![Version](https://img.shields.io/badge/api%20version-latest-blue.svg?v=1) @@ -11,8 +11,6 @@ Appwrite backend as a service cuts up to 70% of the time and costs required for ![Appwrite](https://appwrite.io/images/github.png) -**API Version: latest** - ## Installation Add this to your package's pubspec.yaml file: diff --git a/app/sdks/dart/lib/client.dart b/app/sdks/dart/lib/client.dart index 2dd5f8f4a3..77a4092f08 100644 --- a/app/sdks/dart/lib/client.dart +++ b/app/sdks/dart/lib/client.dart @@ -9,7 +9,7 @@ class Client { Dio http; Client() { - this.endPoint = 'https://appwrite.test/v1'; + this.endPoint = 'https://https://appwrite.io/v1'; this.headers = { 'content-type': 'application/json', 'x-sdk-version': 'appwrite:dart:0.0.2', diff --git a/app/sdks/js/README.md b/app/sdks/js/README.md index e415254ed5..395936655f 100644 --- a/app/sdks/js/README.md +++ b/app/sdks/js/README.md @@ -1,9 +1,9 @@ -# [Appwrite SDK for Javascript](https://appwrite.io)   [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Appwrite%20is%20a%20backend%20as%20a%20service%20for%20building%20web%20or%20mobile%20apps&url=http%3A%2F%2Fappwrite.io&via=appwrite_io&hashtags=JS%2Cjavascript%2Creactjs%2Cangular%2Cios%2Candroid) +# Appwrite SDK for Javascript ![License](https://img.shields.io/github/license/appwrite/sdk-for-js.svg?v=1) ![Version](https://img.shields.io/badge/api%20version-latest-blue.svg?v=1) -This SDK is compitable with Appwrite server version 0.2.0 for older versions check previous releases. +**This SDK is compatible with Appwrite server version 0.2.0. For older versions, please check previous releases.** Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) @@ -11,8 +11,6 @@ Appwrite backend as a service cuts up to 70% of the time and costs required for ![Appwrite](https://appwrite.io/images/github.png) -**API Version: latest** - ## Installation To install via [NPM](https://www.npmjs.com/): diff --git a/app/sdks/js/src/sdk.js b/app/sdks/js/src/sdk.js index 5c21f8af5f..f142af9c29 100644 --- a/app/sdks/js/src/sdk.js +++ b/app/sdks/js/src/sdk.js @@ -2,7 +2,7 @@ window.Appwrite = function () { let config = { - endpoint: 'https://appwrite.test/v1', + endpoint: 'https://https://appwrite.io/v1', project: '', key: '', locale: '', diff --git a/app/sdks/js/src/sdk.min.js b/app/sdks/js/src/sdk.min.js index 1b8e4af978..4bd61f2d4c 100644 --- a/app/sdks/js/src/sdk.min.js +++ b/app/sdks/js/src/sdk.min.js @@ -1,4 +1,4 @@ -(function(window){window.Appwrite=function(){let config={endpoint:'https://appwrite.test/v1',project:'',key:'',locale:'',mode:'',};let setEndpoint=function(endpoint){config.endpoint=endpoint;return this};let setProject=function(value){http.addGlobalHeader('X-Appwrite-Project',value);config.project=value;return this};let setKey=function(value){http.addGlobalHeader('X-Appwrite-Key',value);config.key=value;return this};let setLocale=function(value){http.addGlobalHeader('X-Appwrite-Locale',value);config.locale=value;return this};let setMode=function(value){http.addGlobalHeader('X-Appwrite-Mode',value);config.mode=value;return this};let http=function(document){let globalParams=[],globalHeaders=[];let addParam=function(url,param,value){let a=document.createElement('a'),regex=/(?:\?|&|&)+([^=]+)(?:=([^&]*))*/g;let match,str=[];a.href=url;param=encodeURIComponent(param);while(match=regex.exec(a.search))if(param!==match[1])str.push(match[1]+(match[2]?"="+match[2]:""));str.push(param+(value?"="+encodeURIComponent(value):""));a.search=str.join("&");return a.href};let buildQuery=function(params){let str=[];for(let p in params){if(Array.isArray(params[p])){for(let index=0;indexupdateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 1, 'GET', 'https://example.com'); \ No newline at end of file +$result = $projects->updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/update-webhook.md b/app/sdks/php/docs/examples/projects/update-webhook.md index a7e42dcce2..6f176a01fb 100644 --- a/app/sdks/php/docs/examples/projects/update-webhook.md +++ b/app/sdks/php/docs/examples/projects/update-webhook.md @@ -12,4 +12,4 @@ $client $projects = new Projects($client); -$result = $projects->updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); \ No newline at end of file +$result = $projects->updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 1); \ No newline at end of file diff --git a/app/sdks/php/docs/locale.md b/app/sdks/php/docs/locale.md index e977fa99cf..5ea8ab37fb 100644 --- a/app/sdks/php/docs/locale.md +++ b/app/sdks/php/docs/locale.md @@ -3,7 +3,7 @@ ## Get User Locale ```http request -GET https://appwrite.test/v1/locale +GET https://https://appwrite.io/v1/locale ``` ** Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in supported language. ** @@ -11,7 +11,7 @@ GET https://appwrite.test/v1/locale ## List Countries ```http request -GET https://appwrite.test/v1/locale/countries +GET https://https://appwrite.io/v1/locale/countries ``` ** List of all countries. You can use the locale header to get the data in supported language. ** @@ -19,7 +19,7 @@ GET https://appwrite.test/v1/locale/countries ## List EU Countries ```http request -GET https://appwrite.test/v1/locale/countries/eu +GET https://https://appwrite.io/v1/locale/countries/eu ``` ** List of all countries that are currently members of the EU. You can use the locale header to get the data in supported language. UK brexit date is currently set to 2019-10-31 and will be updated if and when needed. ** @@ -27,7 +27,7 @@ GET https://appwrite.test/v1/locale/countries/eu ## List Countries Phone Codes ```http request -GET https://appwrite.test/v1/locale/countries/phones +GET https://https://appwrite.io/v1/locale/countries/phones ``` ** List of all countries phone codes. You can use the locale header to get the data in supported language. ** @@ -35,7 +35,7 @@ GET https://appwrite.test/v1/locale/countries/phones ## List of currencies ```http request -GET https://appwrite.test/v1/locale/currencies +GET https://https://appwrite.io/v1/locale/currencies ``` ** List of all currencies, including currency symbol, name, plural, and decimal digits for all major and minor currencies. You can use the locale header to get the data in supported language. ** diff --git a/app/sdks/php/docs/projects.md b/app/sdks/php/docs/projects.md index 56b64f8874..6db3e1b510 100644 --- a/app/sdks/php/docs/projects.md +++ b/app/sdks/php/docs/projects.md @@ -3,13 +3,13 @@ ## List Projects ```http request -GET https://appwrite.test/v1/projects +GET https://https://appwrite.io/v1/projects ``` ## Create Project ```http request -POST https://appwrite.test/v1/projects +POST https://https://appwrite.io/v1/projects ``` ### Parameters @@ -31,7 +31,7 @@ POST https://appwrite.test/v1/projects ## Get Project ```http request -GET https://appwrite.test/v1/projects/{projectId} +GET https://https://appwrite.io/v1/projects/{projectId} ``` ### Parameters @@ -43,7 +43,7 @@ GET https://appwrite.test/v1/projects/{projectId} ## Update Project ```http request -PATCH https://appwrite.test/v1/projects/{projectId} +PATCH https://https://appwrite.io/v1/projects/{projectId} ``` ### Parameters @@ -65,7 +65,7 @@ PATCH https://appwrite.test/v1/projects/{projectId} ## Delete Project ```http request -DELETE https://appwrite.test/v1/projects/{projectId} +DELETE https://https://appwrite.io/v1/projects/{projectId} ``` ### Parameters @@ -77,7 +77,7 @@ DELETE https://appwrite.test/v1/projects/{projectId} ## List Keys ```http request -GET https://appwrite.test/v1/projects/{projectId}/keys +GET https://https://appwrite.io/v1/projects/{projectId}/keys ``` ### Parameters @@ -89,7 +89,7 @@ GET https://appwrite.test/v1/projects/{projectId}/keys ## Create Key ```http request -POST https://appwrite.test/v1/projects/{projectId}/keys +POST https://https://appwrite.io/v1/projects/{projectId}/keys ``` ### Parameters @@ -103,7 +103,7 @@ POST https://appwrite.test/v1/projects/{projectId}/keys ## Get Key ```http request -GET https://appwrite.test/v1/projects/{projectId}/keys/{keyId} +GET https://https://appwrite.io/v1/projects/{projectId}/keys/{keyId} ``` ### Parameters @@ -116,7 +116,7 @@ GET https://appwrite.test/v1/projects/{projectId}/keys/{keyId} ## Update Key ```http request -PUT https://appwrite.test/v1/projects/{projectId}/keys/{keyId} +PUT https://https://appwrite.io/v1/projects/{projectId}/keys/{keyId} ``` ### Parameters @@ -131,7 +131,7 @@ PUT https://appwrite.test/v1/projects/{projectId}/keys/{keyId} ## Delete Key ```http request -DELETE https://appwrite.test/v1/projects/{projectId}/keys/{keyId} +DELETE https://https://appwrite.io/v1/projects/{projectId}/keys/{keyId} ``` ### Parameters @@ -144,7 +144,7 @@ DELETE https://appwrite.test/v1/projects/{projectId}/keys/{keyId} ## Update Project OAuth ```http request -PATCH https://appwrite.test/v1/projects/{projectId}/oauth +PATCH https://https://appwrite.io/v1/projects/{projectId}/oauth ``` ### Parameters @@ -159,7 +159,7 @@ PATCH https://appwrite.test/v1/projects/{projectId}/oauth ## List Platforms ```http request -GET https://appwrite.test/v1/projects/{projectId}/platforms +GET https://https://appwrite.io/v1/projects/{projectId}/platforms ``` ### Parameters @@ -171,7 +171,7 @@ GET https://appwrite.test/v1/projects/{projectId}/platforms ## Create Platform ```http request -POST https://appwrite.test/v1/projects/{projectId}/platforms +POST https://https://appwrite.io/v1/projects/{projectId}/platforms ``` ### Parameters @@ -188,7 +188,7 @@ POST https://appwrite.test/v1/projects/{projectId}/platforms ## Get Platform ```http request -GET https://appwrite.test/v1/projects/{projectId}/platforms/{platformId} +GET https://https://appwrite.io/v1/projects/{projectId}/platforms/{platformId} ``` ### Parameters @@ -201,7 +201,7 @@ GET https://appwrite.test/v1/projects/{projectId}/platforms/{platformId} ## Update Platform ```http request -PUT https://appwrite.test/v1/projects/{projectId}/platforms/{platformId} +PUT https://https://appwrite.io/v1/projects/{projectId}/platforms/{platformId} ``` ### Parameters @@ -218,7 +218,7 @@ PUT https://appwrite.test/v1/projects/{projectId}/platforms/{platformId} ## Delete Platform ```http request -DELETE https://appwrite.test/v1/projects/{projectId}/platforms/{platformId} +DELETE https://https://appwrite.io/v1/projects/{projectId}/platforms/{platformId} ``` ### Parameters @@ -231,7 +231,7 @@ DELETE https://appwrite.test/v1/projects/{projectId}/platforms/{platformId} ## List Tasks ```http request -GET https://appwrite.test/v1/projects/{projectId}/tasks +GET https://https://appwrite.io/v1/projects/{projectId}/tasks ``` ### Parameters @@ -243,7 +243,7 @@ GET https://appwrite.test/v1/projects/{projectId}/tasks ## Create Task ```http request -POST https://appwrite.test/v1/projects/{projectId}/tasks +POST https://https://appwrite.io/v1/projects/{projectId}/tasks ``` ### Parameters @@ -264,7 +264,7 @@ POST https://appwrite.test/v1/projects/{projectId}/tasks ## Get Task ```http request -GET https://appwrite.test/v1/projects/{projectId}/tasks/{taskId} +GET https://https://appwrite.io/v1/projects/{projectId}/tasks/{taskId} ``` ### Parameters @@ -277,7 +277,7 @@ GET https://appwrite.test/v1/projects/{projectId}/tasks/{taskId} ## Update Task ```http request -PUT https://appwrite.test/v1/projects/{projectId}/tasks/{taskId} +PUT https://https://appwrite.io/v1/projects/{projectId}/tasks/{taskId} ``` ### Parameters @@ -299,7 +299,7 @@ PUT https://appwrite.test/v1/projects/{projectId}/tasks/{taskId} ## Delete Task ```http request -DELETE https://appwrite.test/v1/projects/{projectId}/tasks/{taskId} +DELETE https://https://appwrite.io/v1/projects/{projectId}/tasks/{taskId} ``` ### Parameters @@ -312,7 +312,7 @@ DELETE https://appwrite.test/v1/projects/{projectId}/tasks/{taskId} ## Get Project ```http request -GET https://appwrite.test/v1/projects/{projectId}/usage +GET https://https://appwrite.io/v1/projects/{projectId}/usage ``` ### Parameters @@ -324,7 +324,7 @@ GET https://appwrite.test/v1/projects/{projectId}/usage ## List Webhooks ```http request -GET https://appwrite.test/v1/projects/{projectId}/webhooks +GET https://https://appwrite.io/v1/projects/{projectId}/webhooks ``` ### Parameters @@ -336,7 +336,7 @@ GET https://appwrite.test/v1/projects/{projectId}/webhooks ## Create Webhook ```http request -POST https://appwrite.test/v1/projects/{projectId}/webhooks +POST https://https://appwrite.io/v1/projects/{projectId}/webhooks ``` ### Parameters @@ -354,7 +354,7 @@ POST https://appwrite.test/v1/projects/{projectId}/webhooks ## Get Webhook ```http request -GET https://appwrite.test/v1/projects/{projectId}/webhooks/{webhookId} +GET https://https://appwrite.io/v1/projects/{projectId}/webhooks/{webhookId} ``` ### Parameters @@ -367,7 +367,7 @@ GET https://appwrite.test/v1/projects/{projectId}/webhooks/{webhookId} ## Update Webhook ```http request -PUT https://appwrite.test/v1/projects/{projectId}/webhooks/{webhookId} +PUT https://https://appwrite.io/v1/projects/{projectId}/webhooks/{webhookId} ``` ### Parameters @@ -386,7 +386,7 @@ PUT https://appwrite.test/v1/projects/{projectId}/webhooks/{webhookId} ## Delete Webhook ```http request -DELETE https://appwrite.test/v1/projects/{projectId}/webhooks/{webhookId} +DELETE https://https://appwrite.io/v1/projects/{projectId}/webhooks/{webhookId} ``` ### Parameters diff --git a/app/sdks/php/docs/storage.md b/app/sdks/php/docs/storage.md index 74182191fd..fd9268ef8e 100644 --- a/app/sdks/php/docs/storage.md +++ b/app/sdks/php/docs/storage.md @@ -3,7 +3,7 @@ ## List Files ```http request -GET https://appwrite.test/v1/storage/files +GET https://https://appwrite.io/v1/storage/files ``` ** Get a list of all the user files. You can use the query params to filter your results. On admin mode, this endpoint will return a list of all of the project files. [Learn more about different API modes](/docs/modes). ** @@ -20,7 +20,7 @@ GET https://appwrite.test/v1/storage/files ## Create File ```http request -POST https://appwrite.test/v1/storage/files +POST https://https://appwrite.io/v1/storage/files ``` ** Create a new file. The user who creates the file will automatically be assigned to read and write access unless he has passed custom values for read and write arguments. ** @@ -37,7 +37,7 @@ POST https://appwrite.test/v1/storage/files ## Get File ```http request -GET https://appwrite.test/v1/storage/files/{fileId} +GET https://https://appwrite.io/v1/storage/files/{fileId} ``` ** Get file by its unique ID. This endpoint response returns a JSON object with the file metadata. ** @@ -51,7 +51,7 @@ GET https://appwrite.test/v1/storage/files/{fileId} ## Update File ```http request -PUT https://appwrite.test/v1/storage/files/{fileId} +PUT https://https://appwrite.io/v1/storage/files/{fileId} ``` ** Update file by its unique ID. Only users with write permissions have access to update this resource. ** @@ -68,7 +68,7 @@ PUT https://appwrite.test/v1/storage/files/{fileId} ## Delete File ```http request -DELETE https://appwrite.test/v1/storage/files/{fileId} +DELETE https://https://appwrite.io/v1/storage/files/{fileId} ``` ** Delete a file by its unique ID. Only users with write permissions have access to delete this resource. ** @@ -82,7 +82,7 @@ DELETE https://appwrite.test/v1/storage/files/{fileId} ## Get File for Download ```http request -GET https://appwrite.test/v1/storage/files/{fileId}/download +GET https://https://appwrite.io/v1/storage/files/{fileId}/download ``` ** Get file content by its unique ID. The endpoint response return with a 'Content-Disposition: attachment' header that tells the browser to start downloading the file to user downloads directory. ** @@ -96,7 +96,7 @@ GET https://appwrite.test/v1/storage/files/{fileId}/download ## Get File Preview ```http request -GET https://appwrite.test/v1/storage/files/{fileId}/preview +GET https://https://appwrite.io/v1/storage/files/{fileId}/preview ``` ** Get file preview image. Currently, this method supports preview for image files (jpg, png, and gif), other supported formats, like pdf, docs, slides, and spreadsheets will return file icon image. You can also pass query string arguments for cutting and resizing your preview image. ** @@ -115,7 +115,7 @@ GET https://appwrite.test/v1/storage/files/{fileId}/preview ## Get File for View ```http request -GET https://appwrite.test/v1/storage/files/{fileId}/view +GET https://https://appwrite.io/v1/storage/files/{fileId}/view ``` ** Get file content by its unique ID. This endpoint is similar to the download method but returns with no 'Content-Disposition: attachment' header. ** diff --git a/app/sdks/php/docs/teams.md b/app/sdks/php/docs/teams.md index a444072aeb..e71ca83e8f 100644 --- a/app/sdks/php/docs/teams.md +++ b/app/sdks/php/docs/teams.md @@ -3,7 +3,7 @@ ## List Teams ```http request -GET https://appwrite.test/v1/teams +GET https://https://appwrite.io/v1/teams ``` ** Get a list of all the current user teams. You can use the query params to filter your results. On admin mode, this endpoint will return a list of all of the project teams. [Learn more about different API modes](/docs/modes). ** @@ -20,7 +20,7 @@ GET https://appwrite.test/v1/teams ## Create Team ```http request -POST https://appwrite.test/v1/teams +POST https://https://appwrite.io/v1/teams ``` ** Create a new team. The user who creates the team will automatically be assigned as the owner of the team. The team owner can invite new members, who will be able add new owners and update or delete the team from your project. ** @@ -35,7 +35,7 @@ POST https://appwrite.test/v1/teams ## Get Team ```http request -GET https://appwrite.test/v1/teams/{teamId} +GET https://https://appwrite.io/v1/teams/{teamId} ``` ** Get team by its unique ID. All team members have read access for this resource. ** @@ -49,7 +49,7 @@ GET https://appwrite.test/v1/teams/{teamId} ## Update Team ```http request -PUT https://appwrite.test/v1/teams/{teamId} +PUT https://https://appwrite.io/v1/teams/{teamId} ``` ** Update team by its unique ID. Only team owners have write access for this resource. ** @@ -64,7 +64,7 @@ PUT https://appwrite.test/v1/teams/{teamId} ## Delete Team ```http request -DELETE https://appwrite.test/v1/teams/{teamId} +DELETE https://https://appwrite.io/v1/teams/{teamId} ``` ** Delete team by its unique ID. Only team owners have write access for this resource. ** @@ -78,7 +78,7 @@ DELETE https://appwrite.test/v1/teams/{teamId} ## Get Team Members ```http request -GET https://appwrite.test/v1/teams/{teamId}/members +GET https://https://appwrite.io/v1/teams/{teamId}/members ``` ** Get team members by the team unique ID. All team members have read access for this list of resources. ** @@ -92,7 +92,7 @@ GET https://appwrite.test/v1/teams/{teamId}/members ## Create Team Membership ```http request -POST https://appwrite.test/v1/teams/{teamId}/memberships +POST https://https://appwrite.io/v1/teams/{teamId}/memberships ``` ** Use this endpoint to invite a new member to your team. An email with a link to join the team will be sent to the new member email address. If member doesn't exists in the project it will be automatically created. @@ -114,7 +114,7 @@ Please notice that in order to avoid a [Redirect Attacks](https://github.com/OWA ## Delete Team Membership ```http request -DELETE https://appwrite.test/v1/teams/{teamId}/memberships/{inviteId} +DELETE https://https://appwrite.io/v1/teams/{teamId}/memberships/{inviteId} ``` ** This endpoint allows a user to leave a team or for a team owner to delete the membership of any other team member. ** @@ -129,7 +129,7 @@ DELETE https://appwrite.test/v1/teams/{teamId}/memberships/{inviteId} ## Create Team Membership (Resend) ```http request -POST https://appwrite.test/v1/teams/{teamId}/memberships/{inviteId}/resend +POST https://https://appwrite.io/v1/teams/{teamId}/memberships/{inviteId}/resend ``` ** Use this endpoint to resend your invitation email for a user to join a team. ** @@ -145,7 +145,7 @@ POST https://appwrite.test/v1/teams/{teamId}/memberships/{inviteId}/resend ## Update Team Membership Status ```http request -PATCH https://appwrite.test/v1/teams/{teamId}/memberships/{inviteId}/status +PATCH https://https://appwrite.io/v1/teams/{teamId}/memberships/{inviteId}/status ``` ** Use this endpoint to let user accept an invitation to join a team after he is being redirect back to your app from the invitation email. Use the success and failure URL's to redirect users back to your application after the request completes. diff --git a/app/sdks/php/docs/users.md b/app/sdks/php/docs/users.md index 9f3fbf530c..abd22e4884 100644 --- a/app/sdks/php/docs/users.md +++ b/app/sdks/php/docs/users.md @@ -3,7 +3,7 @@ ## List Users ```http request -GET https://appwrite.test/v1/users +GET https://https://appwrite.io/v1/users ``` ** Get a list of all the project users. You can use the query params to filter your results. ** @@ -20,7 +20,7 @@ GET https://appwrite.test/v1/users ## Create User ```http request -POST https://appwrite.test/v1/users +POST https://https://appwrite.io/v1/users ``` ** Create a new user. ** @@ -36,7 +36,7 @@ POST https://appwrite.test/v1/users ## Get User ```http request -GET https://appwrite.test/v1/users/{userId} +GET https://https://appwrite.io/v1/users/{userId} ``` ** Get user by its unique ID. ** @@ -50,7 +50,7 @@ GET https://appwrite.test/v1/users/{userId} ## Get User Logs ```http request -GET https://appwrite.test/v1/users/{userId}/logs +GET https://https://appwrite.io/v1/users/{userId}/logs ``` ** Get user activity logs list by its unique ID. ** @@ -64,7 +64,7 @@ GET https://appwrite.test/v1/users/{userId}/logs ## Get User Prefs ```http request -GET https://appwrite.test/v1/users/{userId}/prefs +GET https://https://appwrite.io/v1/users/{userId}/prefs ``` ** Get user preferences by its unique ID. ** @@ -78,7 +78,7 @@ GET https://appwrite.test/v1/users/{userId}/prefs ## Get User Sessions ```http request -GET https://appwrite.test/v1/users/{userId}/sessions +GET https://https://appwrite.io/v1/users/{userId}/sessions ``` ** Get user sessions list by its unique ID. ** @@ -92,7 +92,7 @@ GET https://appwrite.test/v1/users/{userId}/sessions ## Delete User Sessions ```http request -DELETE https://appwrite.test/v1/users/{userId}/sessions +DELETE https://https://appwrite.io/v1/users/{userId}/sessions ``` ** Delete all user sessions by its unique ID. ** @@ -106,7 +106,7 @@ DELETE https://appwrite.test/v1/users/{userId}/sessions ## Delete User Session ```http request -DELETE https://appwrite.test/v1/users/{userId}/sessions/:session +DELETE https://https://appwrite.io/v1/users/{userId}/sessions/:session ``` ** Delete user sessions by its unique ID. ** @@ -121,7 +121,7 @@ DELETE https://appwrite.test/v1/users/{userId}/sessions/:session ## Update user status ```http request -PATCH https://appwrite.test/v1/users/{userId}/status +PATCH https://https://appwrite.io/v1/users/{userId}/status ``` ** Update user status by its unique ID. ** diff --git a/app/sdks/php/src/Appwrite/Client.php b/app/sdks/php/src/Appwrite/Client.php index 1d6a3faf46..0a07f6588d 100644 --- a/app/sdks/php/src/Appwrite/Client.php +++ b/app/sdks/php/src/Appwrite/Client.php @@ -28,7 +28,7 @@ class Client * * @var string */ - protected $endpoint = 'https://appwrite.test/v1'; + protected $endpoint = 'https://https://appwrite.io/v1'; /** * Global Headers diff --git a/app/sdks/python/README.md b/app/sdks/python/README.md index 08f7338bfd..2ced831bf7 100644 --- a/app/sdks/python/README.md +++ b/app/sdks/python/README.md @@ -1,4 +1,4 @@ -# [Appwrite SDK for Python](https://appwrite.io)   [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Appwrite%20is%20a%20backend%20as%20a%20service%20for%20building%20web%20or%20mobile%20apps&url=http%3A%2F%2Fappwrite.io&via=appwrite_io&hashtags=JS%2Cjavascript%2Creactjs%2Cangular%2Cios%2Candroid) +# Appwrite SDK for Python ![License](https://img.shields.io/github/license/appwrite/sdk-for-python.svg?v=1) ![Version](https://img.shields.io/badge/api%20version-latest-blue.svg?v=1) @@ -11,8 +11,6 @@ Appwrite backend as a service cuts up to 70% of the time and costs required for ![Appwrite](https://appwrite.io/images/github.png) -**API Version: latest** - ## Installation To install via [PyPI](https://pypi.org/): diff --git a/app/sdks/python/appwrite/client.py b/app/sdks/python/appwrite/client.py index a9d3b11ada..0de0b48346 100644 --- a/app/sdks/python/appwrite/client.py +++ b/app/sdks/python/appwrite/client.py @@ -4,7 +4,7 @@ import requests class Client: def __init__(self): self._self_signed = False - self._endpoint = 'https://appwrite.test/v1' + self._endpoint = 'https://https://appwrite.io/v1' self._global_headers = { 'content-type': '', 'x-sdk-version': 'appwrite:python:1.0.0', diff --git a/app/sdks/ruby/README.md b/app/sdks/ruby/README.md index a8d5f466ba..4124c7550a 100644 --- a/app/sdks/ruby/README.md +++ b/app/sdks/ruby/README.md @@ -1,4 +1,4 @@ -# [Appwrite SDK for Ruby](https://appwrite.io)   [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Appwrite%20is%20a%20backend%20as%20a%20service%20for%20building%20web%20or%20mobile%20apps&url=http%3A%2F%2Fappwrite.io&via=appwrite_io&hashtags=JS%2Cjavascript%2Creactjs%2Cangular%2Cios%2Candroid) +# Appwrite SDK for Ruby ![License](https://img.shields.io/github/license/appwrite/sdk-for-ruby.svg?v=1) ![Version](https://img.shields.io/badge/api%20version-latest-blue.svg?v=1) @@ -11,8 +11,6 @@ Appwrite backend as a service cuts up to 70% of the time and costs required for ![Appwrite](https://appwrite.io/images/github.png) -**API Version: latest** - ## Installation To install via [Gem](https://rubygems.org/): diff --git a/app/tasks/sdks.php b/app/tasks/sdks.php index a29a1312c1..8f2cd6043e 100644 --- a/app/tasks/sdks.php +++ b/app/tasks/sdks.php @@ -17,7 +17,7 @@ use Appwrite\SDK\Language\Dart; $cli = new CLI(); $version = '0.2.0'; // Server version -$warning = '**This SDK is compatible with Appwrite server version ' . $version . '. For older versions, please check [previous releases](/releases).**'; +$warning = '**This SDK is compatible with Appwrite server version ' . $version . '. For older versions, please check previous releases.**'; $cli ->task('generate') From bf53c7006cfad6dd477193a50edfcbb9f54a0397 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Fri, 4 Oct 2019 08:14:42 +0300 Subject: [PATCH 072/135] Changelog for 0.3.0 --- CHANGES.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 5ae0928e7a..c4a1bc2503 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,14 @@ +# Version 0.3.0 (PRE-RELEASE) + +## Planned Issues + +* Added 7 new locales for locale service and email templates (cz, hu, no*, ru, sv, ta, vi, zh) +* New users service routes to allow updates pref, email and name update +* 2 stage Docker build +* New database rule validation options +* Update docs example with auth info +* Limit HTTP origin check only to browser integrations + # Version 0.2.0 (PRE-RELEASE) ## Features From 725ff4f424681d29f9128646bcceb18d4888f28c Mon Sep 17 00:00:00 2001 From: eldadfux Date: Fri, 4 Oct 2019 08:16:24 +0300 Subject: [PATCH 073/135] Updated OAuth logos --- docs/AddOAuthProvider.md | 2 +- public/images/oauth/bitbucket.png | Bin 14109 -> 6826 bytes public/images/oauth/dropbox.png | Bin 2814 -> 7524 bytes public/images/oauth/gitlab.png | Bin 8905 -> 5382 bytes public/images/oauth/google.png | Bin 6847 -> 6988 bytes public/images/oauth/microsoft.png | Bin 769 -> 4840 bytes 6 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/AddOAuthProvider.md b/docs/AddOAuthProvider.md index bca7d3bc82..c6eb210a3c 100644 --- a/docs/AddOAuthProvider.md +++ b/docs/AddOAuthProvider.md @@ -22,7 +22,7 @@ Make sure to fill all data needed and that your provider array key name is in ca ### Add Provider Logo -Add a logo image to your new provider in this path: `./public/images/oauth`. Your logo should be a png 100×100px file with the name of your provider (all lowercase). Please make sure to leave about 20px padding around the logo to be consistent with other logos. +Add a logo image to your new provider in this path: `./public/images/oauth`. Your logo should be a png 100×100px file with the name of your provider (all lowercase). Please make sure to leave about 30px padding around the logo to be consistent with other logos. ### Add Provider Class diff --git a/public/images/oauth/bitbucket.png b/public/images/oauth/bitbucket.png index 8c7442e9e71cd97c7d67653b5c8feac70d116a0e..afc980fbe3a411e74b583f1b5ab2a1293efbd535 100644 GIT binary patch literal 6826 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 Y0F)L#Zy|EQvH$=807*qoM6N<$g193o<^TWy literal 14109 zcmeHNeNa@_6+ipIy3iFC6a{N_p^L7>#`Po0R0|J=RhBp?h>hu3-6TrQ1Z7i=Vg6;pqIjDX4FfemqN)5csH_S%7g)43WbbF);&>3PgMISYPZS3 z&p$u^PsZFZ<;mw&H9LQG?jU{1XTrOGQYFxyYTqjMR^H^S06n+C&XMOGz?rn6D{sLL)45~kI6-E@QkQ(G*9nS zkoZDaZ!7vd+)-TjgPKuldEo+>a#%o$*8hq#?*-O$SZ zawYO1fX+WI;wv!O4h9G;z3N4AGd-tT{045d-15OyP9_X=K(lYzNB|wq;p5U@2uY3m z*zQ!}Dkl>XYG8~1?JMHx2!xT+|MdK0U(}sh+~{}`0hG7~STKnW*({NW$}T;#mVIdQdu#Tb;;cO zQl>8lgiAD`CIBxvn;V~V1)*XE*7ntrb6QfVWJj!;bMgXU^(E zFi^12CqldJ0DIE?`Fq#1`2wj*0B^TG+Qp3>91iFFxbS!N;p*^&gg91WCs5x(ngA)k z0Z-n|PhT%C<`(=!r@^cbjMbX;`h*1i&iJ69ATxliv60m15a+>5qvqvYv9vuZ(Z&av z^=jtYnU}|kVPP`3xcoMsAx;zSe$=Hrd2+{9A6dht)}yV5BhLElH_aX~JRd_HUgXX$Le z&$SO(Z*{~JC7R5I`@^@Fr6fldZ7)lu1L}^F4kDWP>(}L$pK;G{KDgo{v-81*krCz~ z)1>VTc4V-rGBxt-8`W1yG{Hm;hA(AyUBgcPtT#8gy3djvb0M?DhLPnxOC6@qo3*Tt zGzT(K!i9D*N>_J{D^Hn}mr|L^K0{kL@}07*2TtNpY5vGL4gJ)L&0$V9*UNN1yk0g< z;cEk#MX^Pt3W9NU%zrbBoHJjd`6{N>Mla_yTg8Q{Ud?7NP7c+<^a3zaMvFF7m!Gqq@QT2cY9f8YOm)Hk zq3g(JFrAVcDTPIwo9mmmJUWUSh(H=E&^dL%8th0%8JoYJWp8=d(VH;#PK1;eq_WB7 z3WYD!pSee@Nr3Upp?6D}>rP~D=Jqf+I%10Vj@i9BEq!Ks+M%h3UO9B-hr4%+{4{f6 z2?gCb3nfn;_oagX%^g`xO1;-|7~8D&<7c-XWIi7-SL4j}%;h(O(r7_7LB`bb^gUHc zRd(`oasnoO#r#n~J^Qx+gl2{rTyb+VwtAoSoIr`m20c>>nG(3&&{GcM3ePrWG!sh| zknb!l!L}ll$`wk>%mkQ9L5NPV0zm`B+BC;H9P|1S)n}mlgnr-rDg~6!#~)BijSRMe zX1*LvRmzMjkZsEMpqT|BXcBkEbGm29}denLFi){M7kfU%aHk$-?>t! zRTILYJK-U;R91t)(bi5p+1(*K>1%?$AJL8bHH122Vy*9wSQ((?^fQaUS(N$Qiy4+LDhqDDwN-_D)u5PLn{|YEC;{n(ikarv^ZBmHb_e~Y`PgbOSR0XoFfy@qO3dQ@>nyOLcfw>!V#e#+(zo|Vc>=RPYp+Ez$ z*afl`P|_xNI;PtAS%BREh*~;Uxc;cO5$$Pu3-y;Xc;$l^4wLyRuA!#Sb8wxNOPMac zh)qDhWOHF&YVmKb3Oz90J@%#&d%vMm-6^Ow6>6CV>#rY;x394=+8$h8*1KotzAS=6TRZg243loTL@&&;8WsYNImmp$5>Zk#ENpNyQv;-8) z)lE^tyd;QjDv<;f%+(^ydhFhyM0cBPP=JWsNel`P0DFfXB!VE!n}`BJ2BFeSCquCX zT9@!R=GWLygoD5m32{^UMZ7(mkY^WZ9y)36p1s}FW6!~29$pH?SdnD&QYeWoF=sD@ zVysBAc`1}cmzcAcLNQh(**sBbW%>c;JyUMnmfdzCO}S6-QFa{=itVUex{RJx@@x?w44WNCq=1f*Fyr2l?r zo_T&R?mcsEyt{K}&b=`p4aMiUuW{JG0f2<* zKSNR0W;_7^JaY$GSrEwH)yvh>-qnp(SyqDmD+0Ngd90A#G1KH?kjB*d4b6gL165zwk?bG|{3&O>Q8sj~PA zEMY;$-xtf^)Up6PcGJ^*Kr<@D9g5(_vdAvJn*SI3OdJjba_0|_#-vk9x8Ota<+2OW zy_SI15hh-d{89{BP&UVBARrltBq1SD1|*n(p{fZlkH>LtF6{?3Ae9!Q23X(`I^W1o;Q)VuDXxjw1T+h5!Wvs*Y2=qq6J4A7OwG)= zxCnAU4VYG^$4$Vrz)xB~`?NszJU4~wSt4paK~gcV?fcKnKB0}moLYr#xoj%Y2j>ms zmbJ`2dC@5R_c|5#e=HJ$jjQ=9G@twpU9>CO?PB%mRbw#npMjVMZepe!@okM$IpUF< zJQd+KKr^t#lA;)1c3G~xsOI-6a^fY)^`$D;aEknZu&8e}OyC~7#9v)-7yoGgwGB`hG6#z3hDg^LdxwSVZKo6HWEMaL9L>eCIo zkS~%!$MlF!isrq?5Gi6kN_-ZIjaS4PN=b98b-D6tkudZfP7$kuUH;(Rz_c1q3DCZwnfzq)!^>f zmuDerN~Rz5o=hShSj@Lcg9ROMVhJCZz8FbU6=jyam^IwT)_sQJon29wSzh=a2{xai zu}GT9<3iCMPEJG}eoWCU8X1v}wQ7-YF?Bhf1FJZc69eJ$u@3Q^Ec$HNdaSrbpIF=c z7C@mrwF6u;R^v`-0f$$_|3FRgx*W%h0W0SwU+S^o3t!XD$h@r?v7oUwnse< zPg`a*m>2|CvFg3%h!RK<$kQD_z(xB-$J$9t1ano59`TOd2dZO{vYP#i>zxt$LBECLeP3QhvF7 zw>C;^q_&4`?t3CzgO`P?!^ILh!aEX-Cty9uKV6&TCzO6Dos4GGu5VnQyV4x7TJ7-)`A_Wjqj(JmEl@F1w!@k?kZeILlf3$kU4@P^!e9C}Ap)idkjYz0A zxDNg%=ZmPXm)XJVJ^Y!3>6BggukXLUPr-`r3=%8BrKD9t$~9^=D#!V&7%-QQ)m^YI zka>}mYPZo-?W6YtDW(GE5vDt41ZEtb4@I_spZ)OLMj<@DuVkqdE&}2X3zl-^i)1(n z{R-yf&U~WIvkpH6eR!a}aK38($KKX~Rxo58l8mN}`4zv6+RaP41IO0NmDpC>qQ3tR zWJKUg3mO+DCc#&H6JfWt9#u5+=dZ*Z^8EGnoL*iO?+t3d(L1+0Cnb^Pr00A|@_|dk$cx}D zIWa$@>+mSuP^6dPYeP(Xv&Q9%({OR>CTxY~l-p3}bnt@+v{&CIeW5Ppw9C zE*Q3U+x&cDaEN)yu2{WLJ@I=n(qM_aInXJjWfO6;u!Z>E{GmS3_ShoN@hRcs_XpXi zclcWPw)laRE+YHFP@n9L)`8R57fT~UY-FHznPOnms}SNm!)Nwc8c~y z_q-jmTmj-&@E5KjiuT zS@R|Q!tD6t%FqJKDmZz9+&tAa`q*iWq09BY^Zsiv*8Ss^@8!hx8uH2Q>krnwGUq~3 z)G9PNlq@s^8b)YF=o&_IV)JXR*D%`)7;P4<^5j)MR9=)%7T#Lx$HQKIAmvE>o*--TemS;v=@kD|XCs7sh?-QY zI$-$${W_c+M?FR%=F1CTmM%41Wuwnte2Z@lQW@~=PR?$XBOQLs*p=jH z3aO?Q&)d53YV$UOJIQDSgXjLjadKa5YqknbSz7J&H+=cY{7Ow!)X=rw{;XF`&(3lC z=;!q};VF`-xT>7re$&5<%+S5$Wlis9B4&x7-B!5*s>HovH+gyf3aN8nQk6OV zLym7LE@mTUz+1(-SZ1-x@e+&+)WuJ!5ey{Nrhn^XwB4(xzt>lsJDXRc z9axMrPW9tjZ2by*-*thgpBnRdBV=IK+-W_q@JfIKgM&j)(pw<(Cg~y6Jd+tGdI8N*fjeySa@xFn3OJYHfULzuBculEp3rd(gNtUD}Qw7cf3- zdGBoN%C#5}Vm#Vha{RGtt!c$6aO;Xd?2j12m-$eSG zHA%C7)poShxn>ixmH1cdax+iL_R$L|eGxhsCW&?Z;B5z-GvmYLQkP7GzSu9KKJrr-wN*J;4#p_kpv;llAKNt z$K~?WnW@r=``3>LBPG8}Ho>THN|6KKs}qqt&!!z1e4am0kmh#$yhWDFj7xyDlY6%5 zw)vMirT6JV@l=|I2|n!pAf=3Br)JO$=Erqov~-CxzqG{YOyK%*+3zfHu&tyGe>nUX8gE$k@tW!LnmG-sj~czD!*8o_HGjU2~a8Me}s;JGnM4;UJNtna%>!B$eR%*t~f&ypzDaVZQ8d z`1fq3GIqYC#<%O#f968)5*g;Jv*x*4bMyP6;L-YG$QTv@gW(b}paLLZ_|WP19=0pNZG0K)!>6t`UfIJ5@<9!UToO!{+}vHuT4l;z&N z_d^_J`v<+(O&yx>SDmYbv8Q|_KtU~oyqgT77puo!m_~?xYmS9d@V${xZ*WlMXl8Xx z-1r2I^{TW_+>8_smX=FmYDE3?3EM98P&pY&YmmLeaK&aZsT@~+OrZihTWFV5p$8_(YAsk3m(L*=MTO?Mw>a&Gc}^adEtEpp@O z`Da}2m#?yHzp^dL2$tw|ZaPcmad4Xdd{h=va1$Hjkhp3JN@r28@CwZN#5vP$cbSHw z%Im4ao;~q~J%e`?&9YBMR9i48+|wh1vOXOHt^#2k)uci{{_wIDJSFiz>Qv+pP zSP>AFjo1Qb4nloN0|&l$6vht1UmARa{J=uw8iIo6_-o?m;#-8mlf4Zf+5q5@JLMVe;YVB` z>~s%K2i6!2u#@(PfZM3_0_E|D2N$mIf~G^H0bH`eMZ=P@HzOwotsy~k;t?U3;-v!(1H@q3Jx%?)s^`Tc!eR|to;Y!>S*HgW+!|(Zw zpY2JFbdW(FmC-S(H0TvNLs8cy3wLnnP#lNpx$95ZdOcpW7D)k1Oo@(I?9@B(Vs&md z33O^uPk?>KEMksjUi_}2N@^`5FVFT9evUT-OdbH@b$r_$_Q`w$G8ZO`nr|*?VC>wc zosar^nsDxYW2aF3oGBL(839qLz1KBF~C;Pf;!D=FLw4y2art)lLvyLq*TgHaXn?GlaP_K3N3LGX#_z_B4=-O z%J&{sN}KyhRrRIgwUud@KoI0ICNQohXX8?Z^4WgRXDx1b;3cgBrJm)6f#yIP^y6AT z;|odOki4unu6{i1v}hJ}lP#-asRH;T*P+nB@BlYoB1`2fK-&SRy+{CZ1xn{T995(d9LCxwWj> z(X~;PV5qv+3U32~FS{`R?M+Cr?fOhYl#zxu8b;xtAI=2`Q4xvx_aIt2G*HKG zG~foo?-I@LuC4H1uOEbYdtA#j-1(Cf)LMre&LHWay|tG3{Om%u{{S_gOgc|rlB}DXWrD=L z)26x9F7}X;HYJX@hUi+GmxiTJX0%oxtE^nD<=2ff{mi_;vH4tawQ_A0oCuh}S@Xn? zOqDTABXwqI?DB^XQ1M&s^9t`^UDZqyMRLk2{a-FP0ogLaF^n;kuTFnB_cBcgb)V#N zGqV^nt1H`3xpwDdUuBJ~5(r}CeypU@c6b5zT=sUp+Rj;5GjCp8Q7o`_-j` z5?)({IBN9PumrA9)(Z!X;^}+GuQ%iOeqTiPm=k?igOqeFQ_SBgQ`a(ovQU{2 z?casWtjUc+3Ww9LxvoUHK;jv1jcV(0$ujv2%mr^XlDVs`0fQ)YxuNkwv{I86(q9N-)ZgH7an|bI4(I7KBQ*p5;f|e~25ep)ZiVAg0 zyW}kXUY*qmk5+l-GjF5{HHdLME2Y8DrC@%LMwjN4<(o+Xs`chz;2TOSS0_D+C0!X! zp{h>2(^#C<;%*LB8mlOu6t+V!qdNK|>!5=r%~)gd8+B{R?jwSypv=r8Vml4Bz~5`< zgSzbnrq;Z7UEDW1P*#g@n;q4(c#pUJP{`^Jr!K|XK>|o0z8KEKZv8Y1z)4Ff_*FWeG z@Uy}`_U`x%U^I9zL%qPF{?Wt=?J0Fk;V2xWEGLhVJ$dF%qC|#T(7oF@Sen^ay=?19 zY|C)(p($T>2BMP(O|-<$$<7+%&w6PLs=rUa5y4B3*m6O8%|sUNh=*o*dR$$055Hg1 zOY)?`g+w0tW*Qe|BKU9`o51x)$(g~@Hh+scYO!fnMGI;3vHrKz>@zh7f2x_^n#NVp z6{kkD{7HaKGWC0rlmh9Exfs^=+hsXxwIYodTiej2E;l`R5e~JoC9O^>KR3`b+0RGO zeR+OzCSMxv(M#@F~WQ{R4_xQ{}0Rh;JE(Nq+ormEr`7F$eNvrzie4iy+(n388^ zdu4+iPH+41c2NPpsq}>GNRrIFp-Xng@`SKsB)O>M8O9%A7$zb~ zHmPIb-QUpsACrS&Ip*CA_mgLXENk{+sS3mFOaE5jU3IkmHe7NkQe37J3}vLI3YvS| zo!-gH3xZwtYlXfq#urfE|3$Tq2(X=XE8Qgq?FB?L4LY09pVZpOk6CkMwj3u=n~yV| z-9`F1kHJqK9sPHuvp9yr9p`1^QFx_W0K21d-R}gF^NsG{*1!$9>+`BIHD8)&*ky9J zYr$;k>?b^sb&e^ft^IZngVWNhwg9v7eND6>RQ4H$pD@9@YD1AZfzw+-E+Q*)-J!LW z-`sG)>tpM8)LO_!hCa}r9*(0`nmgqEzR)~Y0DT^FL6XnH-?PV5{j{$LC-HDEpZy## zgc4#LJ+wC-=O}axMeq8-h%4;gdamiamA0Mnu7pa|xS@KJyAt7;1uaSTc_vi5aEACS zxo3tV^Jj;O4x&1VbGP#O$CL4^!#1+Ka0F;>p@8JFi9mGvyNsE6rM%3n=C49K2)6xJ zAB3Xv(>!O{VwX@RNJ}^zFR|50qqo!e97Zo4&YNQ>LdiQT>66~jrR;#5e4kS;`r*vM z_4{=g<^Y;!` zH-gtr-KU=~+A&24>DPrZAk2AJQ_cBnHQ=3$8PD;2&?GsKZww-<3Mzeg1iuyvCMr-) zvD2BWZM8^3US(v=loq|q4h0TcBJ+&r>W>;u>PTCW_f&ihF74t!=uSC{ey}OrF8HeJ zJnKH9>17(r@}Z8Vy4w^fPNe|bnE2Wfm~N^xT=) zcZBs?fN#3x5c>%UW00V!mwH|cKz4XmxV*wIteHNPC>n^1xsLwj7mG60BO-pmWQUH` zU1QX>b9(!{ql;k9sb-hpAU3n_N&~lh7afRy$FK2%G|Fb9M6X?slf7Jc-V#d0?E5A^ zxJna+ut#|O1bc?L_*GHdUB#ACJP$-En;4a?X|_*=QuGVt<9TuSy<%^+@tKLZbmKv~ zhFrfw|CNP!b5+zK^L>6iQ{nMp_@!V>eLh#KHkENo_Z8J9mP4H_ zXgm3@7<$BbScdVv)68^QR<|Uh&aY>2yIck_EY_+~k5kQ)s}EB|JEDgUsO*hn)^NPZ z{?IJ*2lwBZHv$J0GV5d!tM#j4-f9br`Y+bn`Ajmc;p|`0(P?uiO281*d>#9^q(JJ* z5PMtIEOVAdA*sNcA1Xzup;|{wZ>)U zC|ZN;qCE%G0A~j0u3ogOi~Z~RAJtn!`53fIbQsgyEa&y!@nhHb#~(W%ll6^c*x&?k zIRl*Ys1XFRz_nu2fx6Bw={XKs%EzZU75qt#L9(ot#^A-u?^)M!zZ($_kr;qz=tI<> z=Sx45Yt0Ogq$v{Jal;EDuo7z@;&wZS_Sfzg^1j_P^1YqdkI#@l)TdqX^@N8{QCkou zCTBewbRfr+z=H~p-EzO)GQ33G-|nmTx`7he53jKHn-639Utxmd3r+)1z#wP)9$pJ_ qyZ_w(lkt}SQ~Li)JgHrUpaCWk6})*&Cjb3Y0cCj&xoR1UPyYu=ccAS6 literal 2814 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 diff --git a/public/images/oauth/gitlab.png b/public/images/oauth/gitlab.png index 35cb5e9dab01596bc9363aac8b2a4110e3599eef..2ed27d2c41e8eb4797fe214a74c75ce777c25598 100644 GIT binary patch literal 5382 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 G#{U5ax{;+DK{}U}Zn*#Z>3wJJ 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 diff --git a/public/images/oauth/microsoft.png b/public/images/oauth/microsoft.png index 9e40f2342d3303c98732400e58cfdd5d7a45f586..17aa8af89b75eae88b79efcb6e3f6008c3bb9ff6 100644 GIT binary patch literal 4840 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 Gk^ckQnnVQv literal 769 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U^?OH;uum9_jZn9o^YT*+yCho z+#K{8n0QS~b~Zd^;>>y zm;XKI`So3)*V?E3EDkF-ytpUTk40laCqs0CAtUSE7FOQFkE9F^uyG%1;<8Ee)(~r9 z6)hJAk>+O~Fh&T7h1~H4lO_=XtVVf9b_lM{kY4$}TK#@o)Wwag8(AZ(pZd#03q%JL zUf#eOs*ucmt6TTQ=iM(GKc%`h|9L;*_u`|6*YI1!XRTx2n?KWjeQBBD#b@sI=g(^h zKd59nZ)?uPqHWQ~5Wafl6shQdUE$xek{x$$SJ=8$!81KGT_%JN2gU~NRK>vnr;f)4LZd2H{U{l{u^;zo| zpM9~Z z8?J5PNKkz$($3(Qur^chfY&KaKE^o*qAn{nOq~)e!(`F8b(t%Jw&rpRmI9`1-)@Gm zAiqM62Q1fSi7~EOGUt)N0nRn1x=azCmPZvEgd?(}h%@+3{ Date: Fri, 4 Oct 2019 08:47:23 +0300 Subject: [PATCH 074/135] Updated API spec --- app/app.php | 4 ++-- app/init.php | 1 + package-lock.json | 19 ++++++++++++------- package.json | 2 +- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/app/app.php b/app/app.php index 6301d08728..02637ccec1 100644 --- a/app/app.php +++ b/app/app.php @@ -438,7 +438,7 @@ $utopia->get('/v1/open-api-2.json') ->param('platform', 'client', function () {return new WhiteList(['client', 'server']);}, 'Choose target platform.', true) ->param('extensions', 0, function () {return new Range(0, 1);}, 'Show extra data.', true) ->action( - function ($platform, $extensions) use ($response, $request, $utopia, $domain, $version, $services) { + function ($platform, $extensions) use ($response, $request, $utopia, $domain, $services) { function fromCamelCase($input) { preg_match_all('!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!', $input, $matches); @@ -476,7 +476,7 @@ $utopia->get('/v1/open-api-2.json') $output = [ 'swagger' => '2.0', 'info' => [ - 'version' => $version, + 'version' => APP_VERSION_STABLE, 'title' => APP_NAME, 'description' => 'Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)', 'termsOfService' => 'https://appwrite.io/policy/terms', diff --git a/app/init.php b/app/init.php index 30d45e602c..a2e173171f 100644 --- a/app/init.php +++ b/app/init.php @@ -26,6 +26,7 @@ const APP_USERAGENT = APP_NAME.'-Server/%s Please report abuse at '.APP_EMAIL_SE const APP_MODE_ADMIN = 'admin'; const APP_LOCALES = ['cat', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'id', 'it', 'nl', /* 'no',*/ 'pt-br', 'pt-pt', 'ro', 'tr', 'ua', 'zh']; const APP_PAGING_LIMIT = 15; +const APP_VERSION_STABLE = '0.2.0'; $register = new Registry(); $request = new Request(); diff --git a/package-lock.json b/package-lock.json index 82fc5d86f2..081a3b7fd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -834,9 +834,9 @@ } }, "appwrite": { - "version": "1.0.21", - "resolved": "https://registry.npmjs.org/appwrite/-/appwrite-1.0.21.tgz", - "integrity": "sha512-NfNG9JQkOQypanMKOGzPzHVTZP1MTDipbTkRveIfmNd0W25OAqpE1up9f7KHaAi8yha1uyqkYW6l9QgjECZMEw==", + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/appwrite/-/appwrite-1.0.22.tgz", + "integrity": "sha512-ofwb9opdkoY+AV8W2AkZY1z7gAqRlBZhbFj4ZMC9+UYhRAtLfaGnuyfRaWIKMFt7DII2Or261newdlwL/R2NsQ==", "dev": true }, "archy": { @@ -2517,7 +2517,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2932,7 +2933,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2988,6 +2990,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3031,12 +3034,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, diff --git a/package.json b/package.json index 1a46663e6e..d106d2ce2e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "license": "BSD-3-Clause", "repository": "public", "devDependencies": { - "appwrite": "^1.0.21", + "appwrite": "^1.0.22", "gulp": "^4.0.0", "gulp-clean-css": "^4.0.0", "gulp-concat": "2.5.2", From bf450fbab65daba7e19f41fd8d2f45d228e72911 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Fri, 4 Oct 2019 10:50:20 +0300 Subject: [PATCH 075/135] Updated encoding --- CHANGES.md | 2 +- app/config/locale/af.continents.php | 4 ++-- app/sdks/js/README.md | 6 ++++++ app/sdks/js/docs/examples/projects/create-webhook.md | 2 +- app/sdks/js/docs/examples/projects/update-webhook.md | 2 +- app/sdks/node/docs/examples/projects/create-task.md | 2 +- app/sdks/php/docs/examples/projects/create-task.md | 2 +- app/sdks/php/docs/examples/projects/update-task.md | 2 +- .../php/docs/examples/projects/update-webhook.md | 2 +- composer.lock | 12 ++++++------ 10 files changed, 21 insertions(+), 15 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index c4a1bc2503..2e18e89e9a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,7 @@ ## Planned Issues -* Added 7 new locales for locale service and email templates (cz, hu, no*, ru, sv, ta, vi, zh) +* Added 7 new locales for locale service and email templates (af_ZA, cz, hu, no*, ru, sv, ta, vi, zh) * New users service routes to allow updates pref, email and name update * 2 stage Docker build * New database rule validation options diff --git a/app/config/locale/af.continents.php b/app/config/locale/af.continents.php index 5f64309e59..0d465620c4 100644 --- a/app/config/locale/af.continents.php +++ b/app/config/locale/af.continents.php @@ -3,9 +3,9 @@ return [ 'AF' => 'Afrika', 'AN' => 'Antarktika', - 'AS' => 'Asi', + 'AS' => 'Asië', 'EU' => 'Europa', 'NA' => 'Noord-Amerika', - 'OC' => 'Oseani', + 'OC' => 'Oseanië', 'SA' => 'Suid-Amerika', ]; diff --git a/app/sdks/js/README.md b/app/sdks/js/README.md index 395936655f..4e6cd6bc0f 100644 --- a/app/sdks/js/README.md +++ b/app/sdks/js/README.md @@ -19,6 +19,12 @@ To install via [NPM](https://www.npmjs.com/): npm install appwrite --save ``` +Install with CDN: + +```html + +``` + ## License Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/create-webhook.md b/app/sdks/js/docs/examples/projects/create-webhook.md index 1136c5eedf..66a76c26c2 100644 --- a/app/sdks/js/docs/examples/projects/create-webhook.md +++ b/app/sdks/js/docs/examples/projects/create-webhook.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.projects.createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 1); +let promise = sdk.projects.createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 0); promise.then(function (response) { console.log(response); diff --git a/app/sdks/js/docs/examples/projects/update-webhook.md b/app/sdks/js/docs/examples/projects/update-webhook.md index ce876d5a64..f580952533 100644 --- a/app/sdks/js/docs/examples/projects/update-webhook.md +++ b/app/sdks/js/docs/examples/projects/update-webhook.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.projects.updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); +let promise = sdk.projects.updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 1); promise.then(function (response) { console.log(response); diff --git a/app/sdks/node/docs/examples/projects/create-task.md b/app/sdks/node/docs/examples/projects/create-task.md index fda7179388..8923742294 100644 --- a/app/sdks/node/docs/examples/projects/create-task.md +++ b/app/sdks/node/docs/examples/projects/create-task.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = projects.createTask('[PROJECT_ID]', '[NAME]', 'play', '', 1, 'GET', 'https://example.com'); +let promise = projects.createTask('[PROJECT_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/php/docs/examples/projects/create-task.md b/app/sdks/php/docs/examples/projects/create-task.md index 436ebc6f06..fab9e27653 100644 --- a/app/sdks/php/docs/examples/projects/create-task.md +++ b/app/sdks/php/docs/examples/projects/create-task.md @@ -12,4 +12,4 @@ $client $projects = new Projects($client); -$result = $projects->createTask('[PROJECT_ID]', '[NAME]', 'play', '', 1, 'GET', 'https://example.com'); \ No newline at end of file +$result = $projects->createTask('[PROJECT_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/update-task.md b/app/sdks/php/docs/examples/projects/update-task.md index 59308c5d6d..0d9f3fb7a6 100644 --- a/app/sdks/php/docs/examples/projects/update-task.md +++ b/app/sdks/php/docs/examples/projects/update-task.md @@ -12,4 +12,4 @@ $client $projects = new Projects($client); -$result = $projects->updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); \ No newline at end of file +$result = $projects->updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 1, 'GET', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/update-webhook.md b/app/sdks/php/docs/examples/projects/update-webhook.md index 6f176a01fb..a7e42dcce2 100644 --- a/app/sdks/php/docs/examples/projects/update-webhook.md +++ b/app/sdks/php/docs/examples/projects/update-webhook.md @@ -12,4 +12,4 @@ $client $projects = new Projects($client); -$result = $projects->updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 1); \ No newline at end of file +$result = $projects->updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); \ No newline at end of file diff --git a/composer.lock b/composer.lock index 3d9d1aabdc..365bdd5a2d 100644 --- a/composer.lock +++ b/composer.lock @@ -12,12 +12,12 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-for-php.git", - "reference": "bc702c165342f3d943e17d580ab3eb66e100eb44" + "reference": "ab0fe8f5669e6a8fc7a8d5e8c711f939412fb33e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-for-php/zipball/bc702c165342f3d943e17d580ab3eb66e100eb44", - "reference": "bc702c165342f3d943e17d580ab3eb66e100eb44", + "url": "https://api.github.com/repos/appwrite/sdk-for-php/zipball/ab0fe8f5669e6a8fc7a8d5e8c711f939412fb33e", + "reference": "ab0fe8f5669e6a8fc7a8d5e8c711f939412fb33e", "shasum": "" }, "require": { @@ -39,7 +39,7 @@ "BSD-3-Clause" ], "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)", - "time": "2019-10-03T17:57:02+00:00" + "time": "2019-10-03T22:07:26+00:00" }, { "name": "appwrite/php-clamav", @@ -92,7 +92,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "e0cfa4cb8d45b3faf8222f4e7f803f3054431ce8" + "reference": "0ece44cf81c04ebb8784a60830b088238189ec78" }, "require": { "ext-curl": "*", @@ -122,7 +122,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2019-10-03 22:01:52" + "time": "2019-10-04 05:50:53" }, { "name": "bacon/bacon-qr-code", From 748e8b3871e1e2453f0113760c6c76bfd99a4d84 Mon Sep 17 00:00:00 2001 From: Kiy4h <34406802+Kiy4h@users.noreply.github.com> Date: Fri, 4 Oct 2019 15:25:01 +0700 Subject: [PATCH 076/135] id: translate inspirational quote --- app/config/locale/id.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/id.php b/app/config/locale/id.php index 09f3775118..3997a4c50b 100644 --- a/app/config/locale/id.php +++ b/app/config/locale/id.php @@ -1,7 +1,7 @@ '"The art of being wise is the art of knowing what to overlook."', // This is the line printed in the homepage and console 'view-source' + 'settings.inspire' => '"Seni menjadi bijak adalah seni mengetahui apa yang harus diabaikan."', // This is the line printed in the homepage and console 'view-source' 'settings.locale' => 'id', 'settings.direction' => 'ltr', From 07118d7358e002794cc7c2078cb788b5af934873 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Fri, 4 Oct 2019 19:59:16 +0530 Subject: [PATCH 077/135] feat: started with apple OAuth --- app/config/providers.php | 5 ++ public/images/oauth/apple.png | Bin 0 -> 1683 bytes src/Auth/OAuth/Apple.php | 133 ++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 public/images/oauth/apple.png create mode 100644 src/Auth/OAuth/Apple.php diff --git a/app/config/providers.php b/app/config/providers.php index 9a84950aca..aad044270c 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -51,4 +51,9 @@ return [ 'icon' => 'icon-dropbox', 'enabled' => true, ], + 'apple' => [ + 'developers' => 'https://www.dropbox.com/developers/documentation', + 'icon' => 'icon-apple', + 'enabled' => true, + ], ]; diff --git a/public/images/oauth/apple.png b/public/images/oauth/apple.png new file mode 100644 index 0000000000000000000000000000000000000000..ca56e16bc8a523c01a7aef8ee98a37b1bf11b570 GIT binary patch literal 1683 zcmbW2`&-h70>-~UA?gw@sfeW=B&VhmG@9a?-B3|P^A=dmf&_1rX{Jsy+>QkXqG(bAEW=_jx|g=l7QzO7`Dmgfs#GU=uOm zK-iaM{5LS@m-ZfcLjwS4H1WXRh>Ra*#Y|2T!8Gqavma!E*!z{#se&fw(Q+83q+{R* z0LsNBU+N@<`GsQWe%NhL%npHBY7|NEPz<>_*xjmBzWR3htj6|Uj+>8XTZm?IDm3k% z{&H#{Tp7Tv&8;viK4ZF*hQtzg7i^BYB=94J!O?jtl*Fuf5JEhDhZC-py&(zs9BE0t+3UZXHUUI|$l%2dR(5YMw&mVo`y#QiyY=Nd>-H^_ za{qxQNMakuIjB!8pOj=eHtz_;R!;^8O37gXmyVynKMT&tAtqH3&Lt{|}&AJTj|SI@Io*|r`0 zm-rFncG{6Q_Rw8OeIW6!&)GyWGoDq#8S+x|_8PBUJuUr=adQAAm2kYRywc?hGsN@u zdT06XL{{YiB|%7T5p-Q^u}nVBK^Af9q~1I2t9xAu1ZYCbbla0E`V62J@4vc96Eh%OtSd%DpTm1n<@ zL*1;k^+Hl=dSL3z5O5n94!paaV_*eV1B<|7K5TNXef_t;Hzivp8_wlu?1LXIwVI9* zSN}n%dX9Mnii?i;M?uT3ND*r0P4FiO16GUnzIeL3`TFcq$4jve(}A;AjT&IhJJMC;m}Kn@V}S9 z*O&~nr1=`CxRTy+A61ZOMvtBEbpGbgf!T83%7O`#hKz0*6iYsOGSzb53Eb158nE@C zdE(%<2|)j%o~Kx-W{=H@5J486A+F2U24@z~EMJ2eSazfZJ)TA?bh7oBEqeAHDf(sS ztzGTU745UxFieVvXb7Sbj;NuBM1q+P?47t8mDgm*7Fad+uDO?VF>YqyH{IA)AdjtT zKx5UB^@TGLU79YCz&8B%`9Ns)cJ9H4DKUfo9t-DC7wl0Tt7K^Mc5X|8bYF_>tF7;I z9}ILEuiM(pm7;q&Sl@}&5*{OSsBhBKM*fB1{EjR7ZSb!k`(5%FMA|}L8Xr<@?ojVj zvE^uWg7+);YVQ1x3L#h4Hv)3O*EM-oa}PG8_+ZjUrKj}*YGbY1HJF!nE;Y8R@m1{W zsl;Ph`V|p7(1PwZ5xJ*TgGAAuO-;1goHCs zaGaJV|GYnciTWhNJED7>ms_c;ubW4j#t}{XrP>$2h~tmsWzEFU7-@KIqi!`9b`+bLuVY-ysR? zzCFCv#s2Enf4R3YFz!lxDCuEDi>rb|KO|?xLrW!x2I@|Z%S^|lB?TY$$DVp2DSK(b zw5k)TTrIHp2cG`^|oFYDEJt@UwE>T@h-MH+tR#ZtXkk#uq4)3qP zXqv<<5rJB&JNuY;oXWLHZNxL(B_|O+yV8SxD4nYJ z-%rQtFJ#;uKJnB!kiwwl<57p{d_fX#!wo-@gX1lOqV5E<0S<90x2ic>v6EKx<2L7d nD=c47Wfx#nNBBRKwTrequest( + 'POST', + 'https://appleid.apple.com/auth/token', + $headers, + 'code='.urlencode($code). + '&client_id='.urlencode($this->appID). + '&client_secret='.urlencode($this->appSecret). + '&redirect_uri='.urlencode($this->callback). + '&grant_type=authorization_code' + ); + + var_dump($accessToken); + exit(); + + $accessToken = json_decode($accessToken, true); + + if (isset($accessToken['access_token'])) { + return $accessToken['access_token']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserID(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['account_id'])) { + return $user['account_id']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['email'])) { + return $user['email']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['name'])) { + return $user['name']['display_name']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + if (empty($this->user)) { + $headers[] = 'Authorization: Bearer '. urlencode($accessToken); + $user = $this->request('POST', 'https://api.dropboxapi.com/2/users/get_current_account', $headers); + $this->user = json_decode($user, true); + } + + return $this->user; + } +} From 07579b2aaf97bedb1305804c0c5cd4483d5d6fec Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Fri, 4 Oct 2019 20:34:36 +0530 Subject: [PATCH 078/135] chore: merge fix --- CHANGES.md | 15 ++++- CODE_OF_CONDUCT.md | 4 +- CONTRIBUTING.md | 8 +-- README.md | 69 ++++++++++---------- build.sh | 6 +- composer.lock | 73 ++++++++++----------- docker-compose.yml | 6 +- docker/nginx.conf | 4 +- docs/AddOAuthProvider.md | 2 +- docs/EnvironmentVariables.md | 119 +++++++++++++++++++++++++++++++++++ package-lock.json | 19 +++--- package.json | 2 +- 12 files changed, 229 insertions(+), 98 deletions(-) create mode 100644 docs/EnvironmentVariables.md diff --git a/CHANGES.md b/CHANGES.md index 135facb846..c4a1bc2503 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,14 @@ +# Version 0.3.0 (PRE-RELEASE) + +## Planned Issues + +* Added 7 new locales for locale service and email templates (cz, hu, no*, ru, sv, ta, vi, zh) +* New users service routes to allow updates pref, email and name update +* 2 stage Docker build +* New database rule validation options +* Update docs example with auth info +* Limit HTTP origin check only to browser integrations + # Version 0.2.0 (PRE-RELEASE) ## Features @@ -5,7 +16,7 @@ * Added option to limit access to the Appwrite console * Added option to disable abuse check and rate limits * Added input field with the server API endpoint for easy access -* Added new OAuth providers for Google and Gitlab +* Added new OAuth providers for Google and GitLab * Added 15 new locales for locale service and email templates (cat, de, es, fi, fr, gr, hi, id, it, nl, pt-br, pt-pt, ro, tr, ua) * Improved test coverage for the project and synced DEV & CI environments settings @@ -20,4 +31,4 @@ * Changed auth service 'redirect' param to 'confirm' for better clarity * Updated all SDKs to sync with API changes -# Version 0.1.15 (NOT-RELEASED) \ No newline at end of file +# Version 0.1.15 (NOT-RELEASED) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index e07b9c1595..5dba194a2b 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -3,9 +3,9 @@ ## Our Pledge In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and +contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, +size, disability, ethnicity, sex characteristics, gender identity, expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f985e7c6da..a1d0e90ec4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,7 +42,7 @@ We use prettier for our JS coding standards and for auto-formatting our code. Appwrite is built to scale. Please keep in mind that the Appwrite stack can run in different environments and different scales. -We wish Appwrite will be as easy to set up and in a single, local host and easy to grow to a large environment with thousands and even hundreds of instances. +We wish Appwrite will be as easy to set up and in a single, localhost and easy to grow to a large environment with thousands and even hundreds of instances. When contributing code please take into account the following considerations: @@ -67,7 +67,7 @@ Although the Appwrite API is a monolithic app, it has a very clear separation of ### The Microservice Part -Each container in Appwrite is a microservice by its own. Each service is an independent process which can scale without regard to any of the other services. +Each container in Appwrite is a microservice on its own. Each service is an independent process that can scale without regard to any of the other services. Currently, all of the Appwrite microservices are intended to communicate using TCP protocol over a private network. You should be aware to not expose any of the services to the public-facing network, besides the public port 80 and 443 who by default are used to expose the Appwrite HTTP API. @@ -93,10 +93,10 @@ This is also important for the Appwrite lead developers to be able to give techn ## Setup -To set up a working development environment just clone the project git repository and install the backend and frontend dependencies using the proper package manager and create run the docker-compose stack. +To set up a working development environment just fork the project git repository and install the backend and frontend dependencies using the proper package manager and create run the docker-compose stack. ```bash -git clone git@github.com:appwrite/appwrite.git +git clone git@github.com:[YOUR_FORK_HERE]/appwrite.git cd appwrite diff --git a/README.md b/README.md index 05bc994470..e3590efe12 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ Appwrite is a simple self-hosted backend server for web and mobile developers with a shiny dashboard and a very easy to use REST API. -Appwrite API services aims to make developers life a lot easier by hiding the complexity of common and repetitive software development tasks. +Appwrite API services aim to make developers life a lot easier by hiding the complexity of common and repetitive software development tasks. -Using Appwrite you can easily manage user authentication with multiple sign-in methods, database for storing and querying user and teams data, storage and file management, image manipulation and cropping, scheduled cron tasks and many other features to help you get more results in faster times and with a lot less code. +Using Appwrite you can easily manage user authentication with multiple sign-in methods, a database for storing and querying user and teams data, storage and file management, image manipulation and cropping, scheduled cron tasks and many other features to help you get more results in faster times and with a lot less code. [https://appwrite.io](https://appwrite.io) @@ -26,7 +26,7 @@ Using Appwrite you can easily manage user authentication with multiple sign-in m ## Installation -Appwrite backend server is designed to run in a container environment. Running your server is as easy as running one command from your terminal. You can run Appwrite on your localhost using docker-compose or on any other container orchestration tool like Kubernetes, Docker Swarm or Rancher. +Appwrite backend server is designed to run in a container environment. Running your server is as easy as running one command from your terminal. You can either run Appwrite on your localhost using docker-compose or on any other container orchestration tool like Kubernetes, Docker Swarm or Rancher. The easiest way to start running your Appwrite server is by running our docker compose file: @@ -61,13 +61,13 @@ Getting started with Appwrite is as easy as creating a new project, choosing you * [**Auth**](https://appwrite.io/docs/auth) - Manage user authentication using multiple sign-in methods and account recovery. * [**Account**](https://appwrite.io/docs/account) - Manage current user account. Track and manage the user sessions, devices and security audit log. * [**Users**](https://appwrite.io/docs/users) - Manage and list all project users when in admin mode. -* [**Teams**](https://appwrite.io/docs/teams) - Manage and group users in teams. Manage memberships, invites and users roles within a team. -* [**Database**](https://appwrite.io/docs/database) - Manage database collections and document. Read, create, update and delete documents and filter lists of documents collections using advanced filter with graph like capabilities. -* [**Storage**](https://appwrite.io/docs/storage) - Manage storage files. Read, create, delete and preview files. Manipulate your files preview to fit your app perfectly. All files are scanned by ClamAV and stored in a secure and encrypted way. -* [**Locale**](https://appwrite.io/docs/locale) - Track users location, and manage your app locale based data. -* [**Avatars**](https://appwrite.io/docs/avatars) - Manage your users avatars, countries flags, browser icons, credit card symbols and generate QR codes. +* [**Teams**](https://appwrite.io/docs/teams) - Manage and group users in teams. Manage memberships, invites and user roles within a team. +* [**Database**](https://appwrite.io/docs/database) - Manage database collections and document. Read, create, update and delete documents and filter lists of documents collections using an advanced filter with graph like capabilities. +* [**Storage**](https://appwrite.io/docs/storage) - Manage storage files. Read, create, delete and preview files. Manipulate the preview of your files to fit your app perfectly. All files are scanned by ClamAV and stored in a secure and encrypted way. +* [**Locale**](https://appwrite.io/docs/locale) - Track user's location, and manage your app locale based data. +* [**Avatars**](https://appwrite.io/docs/avatars) - Manage your user's avatars, country's flags, browser icons, credit card symbols and generate QR codes. -For the complete API documentation, visit [https://appwrite.io/docs](https://appwrite.io/docs). For more tutorials, news and announcments checkout our [blog](https://medium.com/appwrite-io). +For the complete API documentation, visit [https://appwrite.io/docs](https://appwrite.io/docs). For more tutorials, news and announcments check out our [blog](https://medium.com/appwrite-io). ### SDKs @@ -94,33 +94,34 @@ Join our growing community around the world! Follow us on [Twitter](https://twit All code contributions - including those of people having commit access - must go through a pull request and approved by a core developer before being merged. This is to ensure proper review of all the code. -We really ❤️ pull requests! If you wish to help, you can learn more about how you can contribute to this project in the [contribution guide](CONTRIBUTING.md). +We truly ❤️ pull requests! If you wish to help, you can learn more about how you can contribute to this project in the [contribution guide](CONTRIBUTING.md). ## Credits Created by [Eldad Fux](https://twitter.com/eldadfux) with the amazing help of our **amazing contributors:** -* 🇺🇸 Justin Dorfman ([Github](https://github.com/jdorfman), [Twitter](https://twitter.com/jdorfman)) -* 🇺🇳 0xflotus ([Github](https://github.com/0xflotus)) -* 🇳🇴 Petter Charles Redfern ([Github](https://github.com/Chaaarles)) -* 🇧🇷 Jessé Souza ([Github](https://github.com/jessescn)) -* 🇪🇸 Esther Álvarez Feijoo ([Github](https://github.com/EstherAF)) -* 🇮🇳 Christy Jacob ([Github](https://github.com/christyjacob4), [Linkedin](https://www.linkedin.com/in/christyjacob4/)) -* 🇺🇦 Dmitriy Danilov ([Github](https://github.com/daniloff200), [Twitter](https://twitter.com/daniloff200)) -* 🇮🇩 Zeet ([Github](https://github.com/Kiy4h)) -* 🇫🇮 Pessi Päivärinne ([Github](https://github.com/pessip)) -* 🇺🇳 Sergi Vos ([Github](https://github.com/sergivb01), [Twitter](https://twitter.com/sergivb01), [Linkedin](https://www.linkedin.com/in/sergivb01/)) -* 🇮🇱 Tomer Cohen ([Github](https://github.com/tomer), [Twitter](https://twitter.com/tomer)) -* 🇮🇹 Tatiana ([Github](https://github.com/tacoelho)) -* 🇬🇷 Panagiotis Skarlas ([Github](https://github.com/1qk1), [Twitter](https://twitter.com/qktweets)) -* 🇷🇺 Alexey Pyltsyn ([Github](https://github.com/lex111)) -* 🇩🇪 Robin C ([Github](https://github.com/Taminoful)) -* 🇮🇳 Parikshit Hooda ([Github](https://github.com/Parikshit-Hooda)) -* 🇫🇷 Corentin Le Fur ([Github](https://github.com/crtlf)) -* 🇬🇧 Callum Lowry ([Github](https://github.com/Girxffe)) -* 🇷🇴 Bogdan Covrig ([Github](https://github.com/BogDAAAMN), [Twitter](https://twitter.com/BogdanCovrig)) -* 🇳🇱 Kolkies ([Github](https://github.com/kolkies.dev)) -* 🇹🇷 Mustafa Dur ([Github](https://github.com/tosbaha)) -* 🇵🇹 Luís Pinto ([Github](https://github.com/LiTO773)) -* 🇮🇳 Saksham Saxena ([Github](https://github.com/sakkshm)) -* 🇮🇱 Dima Vishnevetsky ([Github](https://github.com/dimshik100), [Twitter](https://twitter.com/dimshik100)) +* 🇺🇸 Justin Dorfman ([GitHub](https://github.com/jdorfman), [Twitter](https://twitter.com/jdorfman)) +* 🇺🇳 0xflotus ([GitHub](https://github.com/0xflotus)) +* 🇳🇴 Petter Charles Redfern ([GitHub](https://github.com/Chaaarles)) +* 🇧🇷 Jessé Souza ([GitHub](https://github.com/jessescn)) +* 🇪🇸 Esther Álvarez Feijoo ([GitHub](https://github.com/EstherAF)) +* 🇮🇳 Christy Jacob ([GitHub](https://github.com/christyjacob4), [LinkedIn](https://www.linkedin.com/in/christyjacob4/)) +* 🇺🇦 Dmitriy Danilov ([GitHub](https://github.com/daniloff200), [Twitter](https://twitter.com/daniloff200)) +* 🇮🇩 Zeet ([GitHub](https://github.com/Kiy4h)) +* 🇫🇮 Pessi Päivärinne ([GitHub](https://github.com/pessip)) +* 🇺🇳 Sergi Vos ([GitHub](https://github.com/sergivb01), [Twitter](https://twitter.com/sergivb01), [LinkedIn](https://www.linkedin.com/in/sergivb01/)) +* 🇮🇱 Tomer Cohen ([GitHub](https://github.com/tomer), [Twitter](https://twitter.com/tomer)) +* 🇮🇹 Tatiana ([GitHub](https://github.com/tacoelho)) +* 🇬🇷 Panagiotis Skarlas ([GitHub](https://github.com/1qk1), [Twitter](https://twitter.com/qktweets)) +* 🇷🇺 Alexey Pyltsyn ([GitHub](https://github.com/lex111)) +* 🇩🇪 Robin C ([GitHub](https://github.com/Taminoful)) +* 🇮🇳 Parikshit Hooda ([GitHub](https://github.com/Parikshit-Hooda)) +* 🇫🇷 Corentin Le Fur ([GitHub](https://github.com/crtlf)) +* 🇬🇧 Callum Lowry ([GitHub](https://github.com/Girxffe)) +* 🇷🇴 Bogdan Covrig ([GitHub](https://github.com/BogDAAAMN), [Twitter](https://twitter.com/BogdanCovrig)) +* 🇳🇱 Kolkies ([GitHub](https://github.com/kolkies.dev)) +* 🇹🇷 Mustafa Dur ([GitHub](https://github.com/tosbaha)) +* 🇵🇹 Luís Pinto ([GitHub](https://github.com/LiTO773)) +* 🇮🇳 Saksham Saxena ([GitHub](https://github.com/sakkshm)) +* 🇮🇱 Dima Vishnevetsky ([GitHub](https://github.com/dimshik100), [Twitter](https://twitter.com/dimshik100)) +* 🇭🇺 lacexd ([GitHub](https://github.com/lacexd)) diff --git a/build.sh b/build.sh index e4364c45d1..b3be98262e 100644 --- a/build.sh +++ b/build.sh @@ -8,7 +8,7 @@ echo "Updating git repository" git fetch origin git reset --hard origin/master -if test `find "./app/db/GeoLite2/GeoLite2-Country.mmdb" -mmin +259200` +if test $(find "./app/db/GeoLite2/GeoLite2-Country.mmdb" -mmin +259200) then printf "${RED}GEO country DB has not been updated for more than 6 months. Go to https://dev.maxmind.com/geoip/geoip2/geolite2/ for more info${NC}\n" fi @@ -23,8 +23,8 @@ composer update --ignore-platform-reqs --optimize-autoloader --no-dev --no-plugi echo 'Starting build...' -docker build -t appwrite/appwrite:$1 . +docker build -t appwrite/appwrite:"$1" . echo 'Pushing build to registry...' -docker push appwrite/appwrite:$1 \ No newline at end of file +docker push appwrite/appwrite:"$1" diff --git a/composer.lock b/composer.lock index 40ac77a0cc..3d9d1aabdc 100644 --- a/composer.lock +++ b/composer.lock @@ -12,12 +12,12 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-for-php.git", - "reference": "456e2f153393bd67b7d706db1ec104ba211cf25a" + "reference": "bc702c165342f3d943e17d580ab3eb66e100eb44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-for-php/zipball/456e2f153393bd67b7d706db1ec104ba211cf25a", - "reference": "456e2f153393bd67b7d706db1ec104ba211cf25a", + "url": "https://api.github.com/repos/appwrite/sdk-for-php/zipball/bc702c165342f3d943e17d580ab3eb66e100eb44", + "reference": "bc702c165342f3d943e17d580ab3eb66e100eb44", "shasum": "" }, "require": { @@ -39,7 +39,7 @@ "BSD-3-Clause" ], "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)", - "time": "2019-10-01T18:05:56+00:00" + "time": "2019-10-03T17:57:02+00:00" }, { "name": "appwrite/php-clamav", @@ -92,7 +92,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "21f848c7c8a6f3f721c23d9c8bbdf8fff886863d" + "reference": "e0cfa4cb8d45b3faf8222f4e7f803f3054431ce8" }, "require": { "ext-curl": "*", @@ -122,7 +122,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2019-10-01 17:57:36" + "time": "2019-10-03 22:01:52" }, { "name": "bacon/bacon-qr-code", @@ -1994,7 +1994,7 @@ }, { "name": "phpdocumentor/reflection-common", - "version": "dev-master", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", @@ -2046,40 +2046,36 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.3.2", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e" + "reference": "8fcadfe5f85c38705151c9ab23b4781f23e6a70e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/b83ff7cfcfee7827e1e78b637a5904fe6a96698e", - "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8fcadfe5f85c38705151c9ab23b4781f23e6a70e", + "reference": "8fcadfe5f85c38705151c9ab23b4781f23e6a70e", "shasum": "" }, "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", - "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", - "webmozart/assert": "^1.0" + "php": ">=7.1", + "phpdocumentor/type-resolver": "^0", + "webmozart/assert": "^1" }, "require-dev": { - "doctrine/instantiator": "^1.0.5", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.4" + "doctrine/instantiator": "^1", + "mockery/mockery": "^1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-master": "5.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2093,35 +2089,34 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2019-09-12T14:27:41+00:00" + "time": "2019-06-15T20:45:01+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "dev-master", + "version": "0.7.x-dev", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9" + "reference": "6f6f66c1d4e14e9b0ad124cae85864dfa03104c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", - "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6f6f66c1d4e14e9b0ad124cae85864dfa03104c7", + "reference": "6f6f66c1d4e14e9b0ad124cae85864dfa03104c7", "shasum": "" }, "require": { - "php": "^7.1", - "phpdocumentor/reflection-common": "^2.0" + "php": ">=7.1", + "phpdocumentor/reflection-common": "~2.0.0-beta1" }, "require-dev": { - "ext-tokenizer": "^7.1", "mockery/mockery": "~1", - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "~6" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "0.x-dev" } }, "autoload": { @@ -2140,26 +2135,26 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2019-08-22T18:11:29+00:00" + "time": "2019-08-22T17:55:41+00:00" }, { "name": "phpspec/prophecy", - "version": "dev-master", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "bcdce71d674f4f7b86df0ff3a418d43b7fe141f7" + "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bcdce71d674f4f7b86df0ff3a418d43b7fe141f7", - "reference": "bcdce71d674f4f7b86df0ff3a418d43b7fe141f7", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/f6811d96d97bdf400077a0cc100ae56aa32b9203", + "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", "sebastian/comparator": "^1.1|^2.0|^3.0", "sebastian/recursion-context": "^1.0|^2.0|^3.0" }, @@ -2203,7 +2198,7 @@ "spy", "stub" ], - "time": "2019-09-09T15:23:21+00:00" + "time": "2019-10-03T11:07:50+00:00" }, { "name": "phpunit/php-code-coverage", diff --git a/docker-compose.yml b/docker-compose.yml index c45a3294f7..fd9632f0af 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,7 +36,7 @@ services: - _APP_INFLUXDB_PORT=8086 - _APP_STATSD_HOST=telegraf - _APP_STATSD_PORT=8125 - + mariadb: image: appwrite/mariadb:1.0.0 # fix issues when upgrading using: mysql_upgrade -u root -p restart: unless-stopped @@ -63,7 +63,7 @@ services: restart: unless-stopped volumes: - ./storage:/storage:rw - + redis: image: redis:5.0 restart: unless-stopped @@ -78,4 +78,4 @@ services: telegraf: image: appwrite/telegraf:1.0.0 ports: - - "8125:8125/udp" \ No newline at end of file + - "8125:8125/udp" diff --git a/docker/nginx.conf b/docker/nginx.conf index d92e24fbb4..db1dc8c20f 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -88,7 +88,7 @@ http { add_header Cache-Control "public"; } - # CSS and Javascript + # CSS and JavaScript location ~* \.(?:css|js)$ { expires 1y; access_log off; @@ -145,4 +145,4 @@ http { deny all; } } -} \ No newline at end of file +} diff --git a/docs/AddOAuthProvider.md b/docs/AddOAuthProvider.md index bca7d3bc82..c6eb210a3c 100644 --- a/docs/AddOAuthProvider.md +++ b/docs/AddOAuthProvider.md @@ -22,7 +22,7 @@ Make sure to fill all data needed and that your provider array key name is in ca ### Add Provider Logo -Add a logo image to your new provider in this path: `./public/images/oauth`. Your logo should be a png 100×100px file with the name of your provider (all lowercase). Please make sure to leave about 20px padding around the logo to be consistent with other logos. +Add a logo image to your new provider in this path: `./public/images/oauth`. Your logo should be a png 100×100px file with the name of your provider (all lowercase). Please make sure to leave about 30px padding around the logo to be consistent with other logos. ### Add Provider Class diff --git a/docs/EnvironmentVariables.md b/docs/EnvironmentVariables.md new file mode 100644 index 0000000000..cd2d55ea92 --- /dev/null +++ b/docs/EnvironmentVariables.md @@ -0,0 +1,119 @@ +# Environment Variables + +Appwrite environment variables allow you to edit your server setup configuration and customize it. You can easily change the environment variables by changing them when running Appwrite using Docker CLI or Docker-Compose. + +## General Options + +### _APP_ENV + +Set your server running environment. By default the var is set to 'development' when deploying to production, change to: 'production'. + +### _APP_OPTIONS_ABUSE + +Allows you to disabled abuse checks and API rate limiting. By default set to 'enabled'. To cancel the abuse checking set to 'disabled'. It is not recommended to disable this check-in production environment. + +### _APP_OPENSSL_KEY_V1 + +This is your server private secret key that is used to encrypt all sensitive data on your server. Appwrite server is encrypting all secret data on your server like webhooks HTTP passwords, user sessions, and the storage files. The var is not set by default, if you wish to take advantage of Appwrite encryption capabilities you should change it and make sure to keep it a secret. + +### _APP_CONSOLE_WHITELIST_EMAILS + +This option is very useful for small teams or sole developers. To enable it, pass a list of allowed email addresses separated by a comma. + +### _APP_CONSOLE_WHITELIST_DOMAINS + +This option allows you to restrict access to Appwrite console for users sharing the same email domains. This option is very useful for team working with company emails domain. + +To enable this option, pass a list of allowed email domains separated by a comma. + +### _APP_CONSOLE_WHITELIST_IPS + +This last option available allows you to restrict access to Appwrite console for users sharing the same set op IP addresses. This option is very useful for team working with a VPN service or a company IP. + +To enable activate this option, pass a list of allowed IP addresses separated by a comma. + +## Redis Server + +Appwrite is using a Redis server for managing cache, queues and scheduled tasks. The Redis env vars are used to allow Appwrite server to connect to the Redis container. + +### _APP_REDIS_HOST + +Redis server hostname address. Default value is: 'redis' + +### _APP_REDIS_PORT + +Redis server TCP port. Default value is: '6379' + +## MariaDB Server + +Appwrite is using a MariaDB server for managing persistent database data. The MariaDB env vars are used to allow Appwrite server to connect to the MariaDB container. + +### _APP_DB_HOST + +MariaDB server host name address. Default value is: 'mariadb' + +### _APP_DB_PORT + +MariaDB server TCP port. Default value is: '3306' + +### _APP_DB_USER + +MariaDB server user name. Default value is: 'root' + +### _APP_DB_PASS + +MariaDB server user password. Default value is: 'password' + +### _APP_DB_SCHEMA + +MariaDB server database schema. Default value is: 'appwrite' + +## InfluxDB + +Appwrite is using an InfluxDB server for managing time-series data and server stats. The InfluxDB env vars are used to allow Appwrite server to connect to the InfluxDB container. + +### _APP_INFLUXDB_HOST + +InfluxDB server host name address. Default value is: 'influxdb' + +### _APP_INFLUXDB_PORT + +InfluxDB server TCP port. Default value is: '8086' + +## StatsD + +Appwrite is using a StatsD server for aggregating and sending stats data over a fast UDP connection. The StatsD env vars are used to allow Appwrite server to connect to the StatsD container. + +### _APP_INFLUXDB_HOST + +StatsD server host name address. Default value is: 'telegraf' + +### _APP_INFLUXDB_PORT + +StatsD server TCP port. Default value is: '8125' + +## SMTP + +Appwrite is using an SMTP server for emailing your projects users and server admins. The SMTP env vars are used to allow Appwrite server to connect to the SMTP container. + +If running in production, it might be easier to use a 3rd party SMTP server as it might be a little more difficult to set up a production SMTP server that will not send all your emails into your user's SPAM folder. + +### _APP_SMTP_HOST + +SMTP server host name address. Default value is: 'smtp' + +### _APP_SMTP_PORT + +SMTP server TCP port. Default value is: '25' + +### _APP_SMTP_SECURE + +SMTP secure connection protocol. Empty by default, Change to 'tls' if running on a secure connection. + +### _APP_SMTP_USERNAME + +SMTP server user name. Empty by default. + +### _APP_SMTP_PASSWORD + +SMTP server user password. Empty by default. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 82fc5d86f2..081a3b7fd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -834,9 +834,9 @@ } }, "appwrite": { - "version": "1.0.21", - "resolved": "https://registry.npmjs.org/appwrite/-/appwrite-1.0.21.tgz", - "integrity": "sha512-NfNG9JQkOQypanMKOGzPzHVTZP1MTDipbTkRveIfmNd0W25OAqpE1up9f7KHaAi8yha1uyqkYW6l9QgjECZMEw==", + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/appwrite/-/appwrite-1.0.22.tgz", + "integrity": "sha512-ofwb9opdkoY+AV8W2AkZY1z7gAqRlBZhbFj4ZMC9+UYhRAtLfaGnuyfRaWIKMFt7DII2Or261newdlwL/R2NsQ==", "dev": true }, "archy": { @@ -2517,7 +2517,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2932,7 +2933,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2988,6 +2990,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3031,12 +3034,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, diff --git a/package.json b/package.json index 1a46663e6e..d106d2ce2e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "license": "BSD-3-Clause", "repository": "public", "devDependencies": { - "appwrite": "^1.0.21", + "appwrite": "^1.0.22", "gulp": "^4.0.0", "gulp-clean-css": "^4.0.0", "gulp-concat": "2.5.2", From 92101ae7af47535f5d1ba73a1186fcce16faf791 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Fri, 4 Oct 2019 20:36:13 +0530 Subject: [PATCH 079/135] feat: added reference docs for Gitlab --- src/Auth/OAuth/Gitlab.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Auth/OAuth/Gitlab.php b/src/Auth/OAuth/Gitlab.php index fbf21a4bd3..fbc6df60fa 100644 --- a/src/Auth/OAuth/Gitlab.php +++ b/src/Auth/OAuth/Gitlab.php @@ -4,6 +4,9 @@ namespace Auth\OAuth; use Auth\OAuth; +// Reference Material +// https://docs.gitlab.com/ee/api/oauth2.html + class Gitlab extends OAuth { /** From e8583822cc08204a8d1e2cdaaa74c41386d985b8 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Fri, 4 Oct 2019 20:39:16 +0530 Subject: [PATCH 080/135] feat: added reference docs for Google --- src/Auth/OAuth/Google.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Auth/OAuth/Google.php b/src/Auth/OAuth/Google.php index c07758d6b5..42f4357bd7 100644 --- a/src/Auth/OAuth/Google.php +++ b/src/Auth/OAuth/Google.php @@ -4,6 +4,10 @@ namespace Auth\OAuth; use Auth\OAuth; +// Reference Material +// https://developers.google.com/oauthplayground/ +// https://developers.google.com/identity/protocols/OAuth2 +// https://developers.google.com/identity/protocols/OAuth2WebServer class Google extends OAuth { /** From 9042bfd826146283c30dea9f70ee27256b0acf8b Mon Sep 17 00:00:00 2001 From: Niladri Dutta Date: Fri, 4 Oct 2019 18:04:00 +0000 Subject: [PATCH 081/135] Add Norwegian translation --- app/config/locale/no.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 app/config/locale/no.php diff --git a/app/config/locale/no.php b/app/config/locale/no.php new file mode 100644 index 0000000000..c09fe5d521 --- /dev/null +++ b/app/config/locale/no.php @@ -0,0 +1,21 @@ + '"Kunsten å være klok er kunsten å vite hva man skal overse."', // This is the line printed in the homepage and console 'view-source' + 'settings.locale' => 'no', + 'settings.direction' => 'ltr', + + // Service - Users + 'auth.emails.team' => '%s Team', + 'auth.emails.confirm.title' => 'Bekreftelse av konto', + 'auth.emails.confirm.body' => 'no.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => 'Reset passord', + 'auth.emails.recovery.body' => 'no.email.auth.recovery.tpl', + 'auth.emails.invitation.title' => 'Invitasjon til %s Team på %s', + 'auth.emails.invitation.body' => 'no.email.auth.invitation.tpl', + + 'locale.country.unknown' => 'Ukjent', + + 'countries' => include 'no.countries.php', + 'continents' => include 'no.continents.php', +]; From 9423a34dd61aa8ea2dbb990e882ae08e76aa93df Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 5 Oct 2019 02:34:49 +0530 Subject: [PATCH 082/135] feat: update user prefs in User Service --- app/controllers/users.php | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/app/controllers/users.php b/app/controllers/users.php index 522bdfe8e5..777f6e568f 100644 --- a/app/controllers/users.php +++ b/app/controllers/users.php @@ -381,6 +381,35 @@ $utopia->patch('/v1/users/:userId/status') } ); +$utopia->patch('/v1/users/:userId/prefs') + ->desc('Update Account Prefs') + ->label('scope', 'users.write') + ->label('sdk.namespace', 'users') + ->label('sdk.method', 'updateUserPrefs') + ->param('prefs', '', function () { + return new \Utopia\Validator\Mock(); + }, 'Prefs key-value JSON object string.') + ->label('sdk.description', 'Update user preferences by its unique ID. You can pass only the specific settings you wish to update.') + ->action( + function ($userId, $prefs) use ($response, $projectDB) { + $user = $projectDB->getDocument($userId); + + if (empty($user->getUid()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { + throw new Exception('User not found', 404); + } + + $user = $projectDB->updateDocument(array_merge($user->getArrayCopy(), [ + 'prefs' => json_encode(array_merge(json_decode($user->getAttribute('prefs', '{}'), true), $prefs)), + ])); + if (false === $user) { + throw new Exception('Failed saving user to DB', 500); + } + + $response->json(array('result' => 'success')); + } + ); + + $utopia->delete('/v1/users/:userId/sessions/:session') ->desc('Delete User Session') ->label('scope', 'users.write') From d0e79d550fba06c8abff30bad700b0410108c26e Mon Sep 17 00:00:00 2001 From: estim Date: Sat, 5 Oct 2019 00:25:02 +0300 Subject: [PATCH 083/135] Create lt.php --- app/config/locale/lt.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 app/config/locale/lt.php diff --git a/app/config/locale/lt.php b/app/config/locale/lt.php new file mode 100644 index 0000000000..0ff7ab770e --- /dev/null +++ b/app/config/locale/lt.php @@ -0,0 +1,16 @@ + '"Menas būti išmintingu — tai menas žinoti, ką galima paniekti."', // This is the line printed in the homepage and console 'view-source' + 'settings.locale' => 'lt', + 'settings.direction' => 'ltr', + 'auth.emails.team' => 'Komanda %s', + 'auth.emails.confirm.title' => 'Paskyros patvirtinimas', + 'auth.emails.confirm.body' => 'lt.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => 'Atnaujinti slaptažodį', + 'auth.emails.recovery.body' => 'lt.email.auth.recovery.tpl', + 'auth.emails.invitation.title' => 'Pakeisti į komandą %s projektui %s', + 'auth.emails.invitation.body' => 'lt.email.auth.invitation.tpl', + 'locale.country.unknown' => 'Nežinoma', + 'countries' => include 'lt.countries.php', + 'continents' => include 'lt.continents.php', +]; From aaee177396e8fc627086da1530602b0dbd3347bf Mon Sep 17 00:00:00 2001 From: estim Date: Sat, 5 Oct 2019 00:27:47 +0300 Subject: [PATCH 084/135] Create lt.continents.php --- app/config/locale/lt.continents.php | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 app/config/locale/lt.continents.php diff --git a/app/config/locale/lt.continents.php b/app/config/locale/lt.continents.php new file mode 100644 index 0000000000..0fb4f37b72 --- /dev/null +++ b/app/config/locale/lt.continents.php @@ -0,0 +1,10 @@ + 'Afrika', + 'AN' => 'Antarktida', + 'AS' => 'Azija', + 'EU' => 'Europa', + 'NA' => 'Šiaurės Amerika', + 'OC' => 'Okeanija', + 'SA' => 'Pietų Amerika', +]; From 0c0d914fc333a676d2cf4716b3b0e58bc2fba55e Mon Sep 17 00:00:00 2001 From: estim Date: Sat, 5 Oct 2019 00:33:45 +0300 Subject: [PATCH 085/135] Create lt.countries.php --- app/config/locale/lt.countries.php | 197 +++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 app/config/locale/lt.countries.php diff --git a/app/config/locale/lt.countries.php b/app/config/locale/lt.countries.php new file mode 100644 index 0000000000..c644f6f7d4 --- /dev/null +++ b/app/config/locale/lt.countries.php @@ -0,0 +1,197 @@ + 'Afganistanas', + 'AO' => 'Angola', + 'AL' => 'Albanija', + 'AD' => 'Andora', + 'AE' => 'Jungtiniai Arabų Emyratai', + 'AR' => 'Argentina', + 'AM' => 'Armėnija', + 'AG' => 'Antigva ir Barbuda', + 'AU' => 'Australija', +    'AT' => 'Austrija', +    'AZ' => 'Azerbaidžanas', +    'BI' => 'Burundi', +    'BE' => 'Belgija', +    'BJ' => 'Beninas', +    'BF' => 'Burkina Faso', +    'BD' => 'Bangladešas', +    'BG' => 'Bulgarija', +    'BH' => 'Bahreinas', +    'BS' => 'Bahamai', +    'BA' => 'Bosnija ir Hercegovina', +    'BY' => 'Baltarusija', +    'BZ' => 'Baileys', +    'BO' => 'Bolivija', +    'BR' => 'Brazilija', +    'BB' => 'Barbadosas', +    'BN' => 'Brunėjus', +    'BT' => 'Butanas', +    'BW' => 'Botsvana', +    'CF' => 'Centrinės Afrikos Respublika', +    'CA' => 'Kanada', +    'CH' => 'Šveicarija', +    'CL' => 'Čilė', +    'CN' => 'Kinija', +    'CI' => 'Dramblio Kaulo Krantas', +    'CM' => 'Kamerūnas', +    'CD' => 'Kongo Demokratinė Respublika', +    'CG' => 'Kongo Respublika', +    'CO' => 'Kolumbija', +    'KM' => 'Komorai', +    'CV' => 'Žaliasis Kyšulys', +    'CR' => 'Kosta Rika', +    'CU' => 'Kuba', +    'CY' => 'Kipras', +    'CZ' => 'Čekija', +    'DE' => 'Vokietija', +    'DJ' => 'Džibutis', +    'DM' => 'Dominika', +    'DK' => 'Danija', +    'DO' => 'Dominikos Respublika', +    'DZ' => 'Alžyras', +    'EC' => 'Ekvadoras', +    'EG' => 'Egiptas', +    'ER' => 'Eritrėja', +    'ES' => 'Ispanija', +    'EE' => 'Estija', +    'ET' => 'Etiopija', +    'FI' => 'Suomija', +    'FJ' => 'Fidžis', +    'FR' => 'Prancūzija', +    'FM' => 'Mikronezija', +    'GA' => 'Gabonas', +    'GB' => 'Jungtinė Karalystė', +    'GE' => 'Gruzija', +    'GH' => 'Gana', +    'GN' => 'Gvinėja', +    'GM' => 'Gambija', +    'GW' => 'Bisau Gvinėja', +    'GQ' => 'Pusiaujo Gvinėja', +    'GR' => 'Graikija', +    'GD' => 'Grenada', +    'GT' => 'Gvatemala', +    'GY' => 'Gajana ", +    'HN' => 'Hondūras', +    'HR' => 'Kroatija', +    'HT' => 'Haitis', +    'HU' => 'Vengrija', +    'ID' => 'Indonezija', +    'IN' => 'Indija', +    'IE' => 'Airija', +    'IR' => 'Iranas', +    'IQ' => 'Irakas', +    'IS' => 'Islandija', +    'IL' => 'Izraelis', +    'IT' => 'Italija', +    'JM' => 'Jamaika', +    'JO' => 'Jordanija', +    'JP' => 'Japonija', +    'KZ' => 'Kazachstanas', +    'KE' => 'Kenija', +    'KG' => 'Kirgizija', +    'KH' => 'Kambodža', +    'KI' => 'Kiribati', +    'KN' => 'Sent Kitsas ir Nevis', +    'KR' => 'Pietų Korėja', +    'KW' => 'Kuveitas', +    'LA' => 'Laosas', +    'LB' => 'Libanas', +    'LR' => 'Liberija', +    'LY' => 'Libija', +    'LC' => 'Sent Lusija', +    'LI' => 'Lichtenšteinas', +    'LK' => 'Šri Lanka', +    'LS' => 'Lesotas', +    'LT' => 'Lietuva', +    'LU' => 'Liuksemburgas', +    'LV' => 'Latvija', +    'MA' => 'Marokas', +    'MC' => 'Monaco', +    'MD' => 'Moldova', +    'MG' => 'Madagaskaras', +    'MV' => 'Maldyvai', +    'MX' => 'Meksika', +    'MH' => 'Maršalo salos', +    'MK' => 'Makedonija', +    'ML' => 'Malis', +    'MT' => 'Malta', +    'MM' => 'Mianmaras', +    'ME' => 'Juodkalnija', +    'MN' => 'Mongolija', +    'MZ' => 'Mozambikas', +    'MR' => 'Mauritanija', +    'MU' => 'Mauricijus', +    'MW' => 'Malavis', +    'MY' => 'Malaizija', +    'NA' => 'Namibija', +    'NE' => 'Nigeris', +    'NG' => 'Nigerija', +    'NI' => 'Nikaragva', +    'NL' => 'Nyderlandai', +    'NE' => 'Norvegija', +    'NP' => 'Nepalas', +    'NR' => 'Nauru', +    'NZ' => 'Naujoji Zelandija', +    'OM' => 'Omanas', +    'PK' => 'Pakistanas', +    'PA' => 'Panama', +    'PE' => 'Peru', +    'PH' => 'Filipinai', +    'PW' => 'Palau', +    'PG' => 'Papua Naujoji Gvinėja', +    'PL' => 'Lenkija', +    'KP' => 'Šiaurės Korėja', +    'PT' => 'Portugalija', +    'PY' => 'Paragvajus', +    'QA' => 'Qatar', +    'RO' => 'Rumunija', +    'RU' => 'Rusija', +    'RW' => 'Ruanda', +    'SA' => 'Saudo Arabija', +    'SD' => 'Sudanas', +    'SN' => 'Senegalas', +    'SG' => 'Singapūras', +    'SB' => 'Saliamono Salos', +    'SL' => 'Siera Leonė', +    'SV' => 'Salvadoras', +    'SM' => 'San Marino', +    'SO' => 'Somalis', +    'RS' => 'Serbija', +    'SS' => 'Pietų Sudanas', +    'ST' => 'San Tomė ir Prinsipė', +    'SR' => 'Surinamas', +    'SK' => 'Slovakija', +    'SI' => 'Slovėnija', +    'SE' => 'Švedija', +    'SZ' => 'Svazilandas', +    'SC' => 'Seišeliai', +    'SY' => 'Sirija', +    'TD' => 'Chadas', +    'TG' => 'Togo', +    'TH' => 'Tailandas', +    'TJ' => 'Tadžikistanas', +    'TM' => 'Turkmėnistanas', +    'TL' => 'Rytų Timoras', +    'TO' => 'Tonga', +    'TT' => 'Trinidadas ir Tobagas', +    'TN' => 'Tunisas', +    'TR' => 'Turkija', +    'TV' => 'Tuvalu', +    'TZ' => 'Tanzanija', +    'UG' => 'Uganda', +    'UA' => 'Ukraina', +    'UY' => 'Urugvajus', +    'US' => 'JAV', +    'UZ' => 'Uzbekistanas', +    'VA' => 'Vatikanas', +    'VC' => 'Sent Vinsentas ir Grenadinai', +    'VE' => 'Venesuela', +    'VN' => 'Vietnamas', +    'VU' => 'Vanuatu', +    'WS' => 'Samoa', +    'YE' => 'Jemenas', +    'ZA' => 'Pietų Afrika', +    'ZM' => 'Zambija', +    'ZW' => 'Zimbabvė', +]; From 28fbd5eae48c012240fdb9feac664ca77f17b73f Mon Sep 17 00:00:00 2001 From: estim Date: Sat, 5 Oct 2019 00:37:01 +0300 Subject: [PATCH 086/135] Create lt.email.auth.confirm.tpl --- .../templates/lt.email.auth.confirm.tpl | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 app/config/locale/templates/lt.email.auth.confirm.tpl diff --git a/app/config/locale/templates/lt.email.auth.confirm.tpl b/app/config/locale/templates/lt.email.auth.confirm.tpl new file mode 100644 index 0000000000..42dbd28846 --- /dev/null +++ b/app/config/locale/templates/lt.email.auth.confirm.tpl @@ -0,0 +1,27 @@ + + +
+ Sveiki, +
+
+ Šis laiškas buvo išsiųstas dėl to, kad {{owner}} kviečia tapti komandos {{team}} nariu projekte {{project}}. +
+
+ Paspauskite nuorodą, kad prisijungti prie komandos {{team}} : +
+ {{redirect}} +
+
+ Jeigu jums neįdomu, ignoruokite šį pranešimą. +
+
+ Ačiū, +
+ komanda {{project}} +
From 7a6be6d2448faa94b5c62cb2dda23c85b45be509 Mon Sep 17 00:00:00 2001 From: estim Date: Sat, 5 Oct 2019 00:40:46 +0300 Subject: [PATCH 087/135] Create lt.email.auth.recovery.tpl --- .../templates/lt.email.auth.recovery.tpl | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 app/config/locale/templates/lt.email.auth.recovery.tpl diff --git a/app/config/locale/templates/lt.email.auth.recovery.tpl b/app/config/locale/templates/lt.email.auth.recovery.tpl new file mode 100644 index 0000000000..7aba4cd2ce --- /dev/null +++ b/app/config/locale/templates/lt.email.auth.recovery.tpl @@ -0,0 +1,24 @@ + + +
+ Sveiki, {{name}}, +
+
+ Paspauskite nuorodą, kad pakeisti slaptožodį projektui {{project}}. +
+ {{redirect}} +
+
+ Jei neprašėte atkurti slaptažodžio, ignoruokite šį laišką. +
+
+ Ačiū, +
+ komanda {{project}} +
From b3f6c9f51eab452b276807a337caf5fb526cb45c Mon Sep 17 00:00:00 2001 From: estim Date: Sat, 5 Oct 2019 00:41:18 +0300 Subject: [PATCH 088/135] Update lt.email.auth.confirm.tpl --- app/config/locale/templates/lt.email.auth.confirm.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/templates/lt.email.auth.confirm.tpl b/app/config/locale/templates/lt.email.auth.confirm.tpl index 42dbd28846..0c40a3cbc3 100644 --- a/app/config/locale/templates/lt.email.auth.confirm.tpl +++ b/app/config/locale/templates/lt.email.auth.confirm.tpl @@ -18,7 +18,7 @@ {{redirect}}

- Jeigu jums neįdomu, ignoruokite šį pranešimą. + Jei Jums neįdomu, ignoruokite šį laišką.

Ačiū, From 52f6ae29a85d1148b22aceb43fe2cda122e49a1d Mon Sep 17 00:00:00 2001 From: estim Date: Sat, 5 Oct 2019 00:42:29 +0300 Subject: [PATCH 089/135] Rename lt.email.auth.confirm.tpl to lt.email.auth.invitation.tpl --- .../{lt.email.auth.confirm.tpl => lt.email.auth.invitation.tpl} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/config/locale/templates/{lt.email.auth.confirm.tpl => lt.email.auth.invitation.tpl} (100%) diff --git a/app/config/locale/templates/lt.email.auth.confirm.tpl b/app/config/locale/templates/lt.email.auth.invitation.tpl similarity index 100% rename from app/config/locale/templates/lt.email.auth.confirm.tpl rename to app/config/locale/templates/lt.email.auth.invitation.tpl From b5896799abd5d2b6297f486ff0199b445b4bd03e Mon Sep 17 00:00:00 2001 From: estim Date: Sat, 5 Oct 2019 00:43:59 +0300 Subject: [PATCH 090/135] Create lt.email.auth.confirm.tpl --- .../templates/lt.email.auth.confirm.tpl | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 app/config/locale/templates/lt.email.auth.confirm.tpl diff --git a/app/config/locale/templates/lt.email.auth.confirm.tpl b/app/config/locale/templates/lt.email.auth.confirm.tpl new file mode 100644 index 0000000000..f1bc439b11 --- /dev/null +++ b/app/config/locale/templates/lt.email.auth.confirm.tpl @@ -0,0 +1,24 @@ + + +
+ Sveiki, {{name}}, +
+
+ Paspauskite nuorodą, kad patvirtinti savo el. paštą. +
+ {{redirect}} +
+
+ Jei neprašėte el. pašto patvirtinimo, ignoruokite šį laišką +
+
+ Ačiū, +
+ komanda {{project}} +
From e6c36fd2fa58a209c224be76f5aefe4e42e4ff03 Mon Sep 17 00:00:00 2001 From: estim Date: Sat, 5 Oct 2019 00:46:18 +0300 Subject: [PATCH 091/135] Update lt.countries.php --- app/config/locale/lt.countries.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/lt.countries.php b/app/config/locale/lt.countries.php index c644f6f7d4..4a80d3f129 100644 --- a/app/config/locale/lt.countries.php +++ b/app/config/locale/lt.countries.php @@ -71,7 +71,7 @@ return [     'GR' => 'Graikija',     'GD' => 'Grenada',     'GT' => 'Gvatemala', -    'GY' => 'Gajana ", +    'GY' => 'Gajana',     'HN' => 'Hondūras',     'HR' => 'Kroatija',     'HT' => 'Haitis', From 0e1f4a2968b805df2b16265d9512eaf07a5d2212 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Sat, 5 Oct 2019 08:44:10 +0300 Subject: [PATCH 092/135] Changed zh locale to zh-cn --- ...zh.email.auth.confirm.tpl => zh-cn.email.auth.confirm.tpl} | 0 ...il.auth.invitation.tpl => zh-cn.email.auth.invitation.tpl} | 0 ....email.auth.recovery.tpl => zh-cn.email.auth.recovery.tpl} | 0 app/config/locale/{zh.continents.php => zh-cn.continents.php} | 0 app/config/locale/{zh.countries.php => zh-cn.countries.php} | 0 app/config/locale/{zh.php => zh-cn.php} | 0 app/init.php | 4 ++-- 7 files changed, 2 insertions(+), 2 deletions(-) rename app/config/locale/templates/{zh.email.auth.confirm.tpl => zh-cn.email.auth.confirm.tpl} (100%) rename app/config/locale/templates/{zh.email.auth.invitation.tpl => zh-cn.email.auth.invitation.tpl} (100%) rename app/config/locale/templates/{zh.email.auth.recovery.tpl => zh-cn.email.auth.recovery.tpl} (100%) rename app/config/locale/{zh.continents.php => zh-cn.continents.php} (100%) rename app/config/locale/{zh.countries.php => zh-cn.countries.php} (100%) rename app/config/locale/{zh.php => zh-cn.php} (100%) diff --git a/app/config/locale/templates/zh.email.auth.confirm.tpl b/app/config/locale/templates/zh-cn.email.auth.confirm.tpl similarity index 100% rename from app/config/locale/templates/zh.email.auth.confirm.tpl rename to app/config/locale/templates/zh-cn.email.auth.confirm.tpl diff --git a/app/config/locale/templates/zh.email.auth.invitation.tpl b/app/config/locale/templates/zh-cn.email.auth.invitation.tpl similarity index 100% rename from app/config/locale/templates/zh.email.auth.invitation.tpl rename to app/config/locale/templates/zh-cn.email.auth.invitation.tpl diff --git a/app/config/locale/templates/zh.email.auth.recovery.tpl b/app/config/locale/templates/zh-cn.email.auth.recovery.tpl similarity index 100% rename from app/config/locale/templates/zh.email.auth.recovery.tpl rename to app/config/locale/templates/zh-cn.email.auth.recovery.tpl diff --git a/app/config/locale/zh.continents.php b/app/config/locale/zh-cn.continents.php similarity index 100% rename from app/config/locale/zh.continents.php rename to app/config/locale/zh-cn.continents.php diff --git a/app/config/locale/zh.countries.php b/app/config/locale/zh-cn.countries.php similarity index 100% rename from app/config/locale/zh.countries.php rename to app/config/locale/zh-cn.countries.php diff --git a/app/config/locale/zh.php b/app/config/locale/zh-cn.php similarity index 100% rename from app/config/locale/zh.php rename to app/config/locale/zh-cn.php diff --git a/app/init.php b/app/init.php index 5b6a68935c..fbc088f492 100644 --- a/app/init.php +++ b/app/init.php @@ -24,7 +24,7 @@ const APP_EMAIL_TEAM = 'team@'.APP_DOMAIN; const APP_EMAIL_SECURITY = 'security@'.APP_DOMAIN; const APP_USERAGENT = APP_NAME.'-Server/%s Please report abuse at '.APP_EMAIL_SECURITY; const APP_MODE_ADMIN = 'admin'; -const APP_LOCALES = ['cat', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'id', 'it', 'nl', /* 'no',*/ 'pt-br', 'pt-pt', 'ro', 'tr', 'ua', 'zh', 'zh-tw']; +const APP_LOCALES = ['cat', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'id', 'it', 'nl', 'no', 'pt-br', 'pt-pt', 'ro', 'tr', 'ua', 'zh-cn', 'zh-tw']; const APP_PAGING_LIMIT = 15; const APP_VERSION_STABLE = '0.2.0'; @@ -147,7 +147,7 @@ Locale::setLanguage('ro', include __DIR__.'/config/locale/ro.php'); Locale::setLanguage('ru', include __DIR__ . '/config/locale/ru.php'); Locale::setLanguage('tr', include __DIR__.'/config/locale/tr.php'); Locale::setLanguage('ua', include __DIR__.'/config/locale/ua.php'); -Locale::setLanguage('zh', include __DIR__.'/config/locale/zh.php'); +Locale::setLanguage('zh-cn', include __DIR__.'/config/locale/zh-cn.php'); Locale::setLanguage('zh-tw', include __DIR__.'/config/locale/zh-tw.php'); if (in_array($locale, APP_LOCALES)) { From d35c8bfbe391cb55cb84a3a3d89069154862a2a3 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Sat, 5 Oct 2019 08:44:15 +0300 Subject: [PATCH 093/135] Updated changelog --- CHANGES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 2e18e89e9a..2945388879 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,12 +2,13 @@ ## Planned Issues -* Added 7 new locales for locale service and email templates (af_ZA, cz, hu, no*, ru, sv, ta, vi, zh) +* Added 7 new locales for locale service and email templates (af, cz, hu, lt, no, ru, sv, ta, vi, zh-cn, zh-tw) * New users service routes to allow updates pref, email and name update * 2 stage Docker build * New database rule validation options * Update docs example with auth info * Limit HTTP origin check only to browser integrations +* Allow electron apps to not pass origin header # Version 0.2.0 (PRE-RELEASE) From 0ab14494024be3042fd2f226f7d315c0e2cf9aec Mon Sep 17 00:00:00 2001 From: eldadfux Date: Sat, 5 Oct 2019 08:57:00 +0300 Subject: [PATCH 094/135] Fix for broken CI --- app/config/locale/zh-cn.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/zh-cn.php b/app/config/locale/zh-cn.php index b4499416fe..5f56d10df3 100644 --- a/app/config/locale/zh-cn.php +++ b/app/config/locale/zh-cn.php @@ -16,6 +16,6 @@ return [ 'locale.country.unknown' => '未知', - 'countries' => include 'zh.countries.php', - 'continents' => include 'zh.continents.php', + 'countries' => include 'zh-cn.countries.php', + 'continents' => include 'zh-cn.continents.php', ]; From 4b88f319a8ee6919009f6c6eb24d3d71a7725c5d Mon Sep 17 00:00:00 2001 From: Dima Grossman Date: Sat, 5 Oct 2019 10:05:28 +0300 Subject: [PATCH 095/135] Add follow new releases badge Added a badge so people can be notified when appwrite releases new versions and awesome features. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fd3227e5f9..76f8bc1f7f 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ [![Chat With Us](https://img.shields.io/gitter/room/appwrite/community.svg)](https://gitter.im/appwrite/community?utm_source=share-link&utm_medium=link&utm_campaign=share-link) [![Build Status](https://travis-ci.org/appwrite/appwrite.svg?branch=master)](https://travis-ci.org/appwrite/appwrite) [![Follow Appwrite on StackShare](https://img.stackshare.io/misc/follow-on-stackshare-badge.svg)](https://stackshare.io/appwrite) +[![Follow new releases](https://app.releasly.co/assets/badges/badge-blue.svg)](https://app.releasly.co/sites/appwrite/appwrite?utm_source=github_badge) --- From 1444ca14bb559393651a53ef18a542802ba1445f Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 5 Oct 2019 14:37:49 +0530 Subject: [PATCH 096/135] feat: added user prefs endpoint --- app/controllers/users.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/controllers/users.php b/app/controllers/users.php index 777f6e568f..a77436b0c0 100644 --- a/app/controllers/users.php +++ b/app/controllers/users.php @@ -386,6 +386,9 @@ $utopia->patch('/v1/users/:userId/prefs') ->label('scope', 'users.write') ->label('sdk.namespace', 'users') ->label('sdk.method', 'updateUserPrefs') + ->param('userId', '', function () { + return new UID(); + }, 'User unique ID.') ->param('prefs', '', function () { return new \Utopia\Validator\Mock(); }, 'Prefs key-value JSON object string.') From 8f6c6e9f0f4eb44fdf9af00621989a0d85a5ced9 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 5 Oct 2019 14:52:38 +0530 Subject: [PATCH 097/135] chore: disabled Apple OAuth --- app/config/providers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/providers.php b/app/config/providers.php index f831183f7c..b45ca52a74 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -59,6 +59,6 @@ return [ 'apple' => [ 'developers' => 'https://www.dropbox.com/developers/documentation', 'icon' => 'icon-apple', - 'enabled' => true, + 'enabled' => false, ], ]; From 271896027e7dae6542feb374fc9f705c60d3f680 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Sat, 5 Oct 2019 12:24:53 +0300 Subject: [PATCH 098/135] Updated change log --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 2945388879..3203c99063 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,7 @@ ## Planned Issues -* Added 7 new locales for locale service and email templates (af, cz, hu, lt, no, ru, sv, ta, vi, zh-cn, zh-tw) +* Added 7 new locales for locale service and email templates (af, cz, hu, lt, no, ru, si, sv, ta, vi, zh-cn, zh-tw) * New users service routes to allow updates pref, email and name update * 2 stage Docker build * New database rule validation options From 54452dd2d931d7a0c76742a54e0b1bb7a8a05393 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Sat, 5 Oct 2019 15:07:52 +0300 Subject: [PATCH 099/135] User name is optional --- app/config/collections.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/collections.php b/app/config/collections.php index 524eaaa80b..122b722f90 100644 --- a/app/config/collections.php +++ b/app/config/collections.php @@ -197,7 +197,7 @@ $collections = [ 'key' => 'name', 'type' => 'text', 'default' => '', - 'required' => true, + 'required' => false, 'array' => false, ], [ From f36d266a649b88c8aae4a40b8183bffdd24c8787 Mon Sep 17 00:00:00 2001 From: lucianosz7 Date: Sat, 5 Oct 2019 09:13:13 -0300 Subject: [PATCH 100/135] =?UTF-8?q?Added=20javanese=20translation.=C2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/config/locale/jv.continents.php | 11 + app/config/locale/jv.countries.php | 198 ++++++++++++++++++ app/config/locale/jv.php | 21 ++ .../templates/jv.email.auth.confirm.tpl | 24 +++ .../templates/jv.email.auth.invitation.tpl | 28 +++ .../templates/jv.email.auth.recovery.tpl | 24 +++ 6 files changed, 306 insertions(+) create mode 100644 app/config/locale/jv.continents.php create mode 100644 app/config/locale/jv.countries.php create mode 100644 app/config/locale/jv.php create mode 100644 app/config/locale/templates/jv.email.auth.confirm.tpl create mode 100644 app/config/locale/templates/jv.email.auth.invitation.tpl create mode 100644 app/config/locale/templates/jv.email.auth.recovery.tpl diff --git a/app/config/locale/jv.continents.php b/app/config/locale/jv.continents.php new file mode 100644 index 0000000000..f20efb8cfa --- /dev/null +++ b/app/config/locale/jv.continents.php @@ -0,0 +1,11 @@ + 'Afrika', +    'AN' => 'Antartika', +    'AS' => 'Asia', +    'EU' => 'Eropa', +    'NA' => 'Amérika Lor', +    'OC' => 'Oseania', +    'SA' => 'Amérika Kidul', +]; diff --git a/app/config/locale/jv.countries.php b/app/config/locale/jv.countries.php new file mode 100644 index 0000000000..1b781e36bf --- /dev/null +++ b/app/config/locale/jv.countries.php @@ -0,0 +1,198 @@ + 'Afghanistan', +    'AO' => 'Angola', +    'AL' => 'Albania', +    'AD' => 'Andorra', +    'AE' => 'Uni Emirat Arab', +    'AR' => 'Argentina', +    'AM' => 'Armenia', +    'AG' => 'Antigua lan Barbuda', +    'AU' => 'Australia', +    'AT' => 'Austria', +    'AZ' => 'Azerbaijan', +    'BI' => 'Burundi', +    'BE' => 'Belgia', +    'BJ' => 'Benin', +    'BF' => 'Burkina Faso', +    'BD' => 'Bangladesh', +    'BG' => 'Bulgaria', +    'BH' => 'Bahrain', +    'BS' => 'Bahamas', +    'BA' => 'Bosnia lan Herzegovina', +    'BY' => 'Belarus', +    'BZ' => 'Belize', +    'BO' => 'Bolivia', +    'BR' => 'Brasil', +    'BB' => 'Barbados', +    'BN' => 'Brunei', +    'BT' => 'Bhutan', +    'BW' => 'Botswana', +    'CF' => 'Republik Afrika Tengah', +    'CA' => 'Kanada', +    'CH' => 'Swiss', +    'CL' => 'Chile', +    'CN' => 'China', +    'CI' => 'Pantai Gading', +    'CM' => 'Kamerun', +    'CD' => 'DR Kongo', +    'CG' => 'Republik Kongo', +    'CO' => 'Kolombia', +    'KM' => 'Comoros', +    'CV' => 'Cape Verde', +    'CR' => 'Costa Rica', +    'CU' => 'Kuba', +    'CY' => 'Siprus', +    'CZ' => 'Czechia', +    'DE' => 'Jerman', +    'DJ' => 'Djibouti', +    'DM' => 'Dominika', +    'DK' => 'Denmark', +    'DO' => 'Republik Dominika', +    'DZ' => 'Algeria', +    'EC' => 'Ekuador', +    'EG' => 'Mesir', +    'ER' => 'Eritrea', +    'ES' => 'Spanyol', +    'EE' => 'Estonia', +    'ET' => 'Ethiopia', +    'FI' => 'Finlandia', + 'FJ' => 'Fiji', +    'FR' => 'Prancis', +    'FM' => 'Mikronesia', +    'GA' => 'Gabon', +    'GB' => 'Inggris', +    'GE' => 'Georgia', +    'GH' => 'Ghana', +    'GN' => 'Guinea', +    'GM' => 'Gambia', +    'GW' => 'Guinea-Bissau', +    'GQ' => 'Guinea Khatulistiwa', +    'GR' => 'Yunani', +    'GD' => 'Grenada', +    'GT' => 'Guatemala', +    'GY' => 'Guyana', +    'HN' => 'Honduras', +    'HR' => 'Croatia', +    'HT' => 'Haiti', +    'HU' => 'Hongaria', +    'ID' => 'Indonesia', +    'IN' => 'India', +    'IE' => 'Irlandia', +    'IR' => 'Iran', +    'IQ' => 'Irak', +    'IS' => 'Islandia', +    'IL' => 'Israel', +    'IT' => 'Italia', +    'JM' => 'Jamaika', +    'JO' => 'Yordania', +    'JP' => 'Jepang', +    'KZ' => 'Kazakhstan', +    'KE' => 'Kenya', +    'KG' => 'Kyrgyzstan', +    'KH' => 'Kamboja', +    'KI' => 'Kiribati', +    'KN' => 'Saint Kitts lan Nevis', +    'KR' => 'Korea Kidul', +    'KW' => 'Kuwait', +    'LA' => 'Laos', +    'LB' => 'Libanon', +    'LR' => 'Liberia', +    'LY' => 'Libya', +    'LC' => 'Saint Lucia', +    'LI' => 'Liechtenstein', +    'LK' => 'Sri Lanka', +    'LS' => 'Lesotho', +    'LT' => 'Lithuania', +    'LU' => 'Luksemburg', +    'LV' => 'Latvia', +    'MA' => 'Maroko', +    'MC' => 'Monaco', +    'MD' => 'Moldova', +    'MG' => 'Madagascar', +    'MV' => 'Maldives', +    'MX' => 'Meksiko', +    'MH' => 'Kepulauan Marshall', +    'MK' => 'Makedonia', +    'ML' => 'Mali', +    'MT' => 'Malta', +    'MM' => 'Myanmar', + 'ME' => 'Montenegro', +    'MN' => 'Mongolia', +    'MZ' => 'Mozambique', +    'MR' => 'Mauritania', +    'MU' => 'Mauritius', +    'MW' => 'Malawi', +    'MY' => 'Malaysia', +    'NA' => 'Namibia', +    'NE' => 'Niger', +    'NG' => 'Nigeria', +    'NI' => 'Nikaragua', +    'NL' => 'Belanda', +    'NO' => 'Norwegia', +    'NP' => 'Nepal', +    'NR' => 'Nauru', +    'NZ' => 'Selandia Anyar', +    'OM' => 'Oman', +    'PK' => 'Pakistan', +    'PA' => 'Panama', +    'PE' => 'Peru', +    'PH' => 'Filipina', +    'PW' => 'Palau', +    'PG' => 'Papua Nugini', +    'PL' => 'Polandia', +    'KP' => 'Korea Lor', +    'PT' => 'Portugal', +    'PY' => 'Paraguay', +    'QA' => 'Qatar', +    'RO' => 'Romania', +    'RU' => 'Rusia', +    'RW' => 'Rwanda', +    'SA' => 'Arab Saudi', +    'SD' => 'Sudan', +    'SN' => 'Senegal', +    'SG' => 'Singapura', +    'SB' => 'Kepulauan Solomon', +    'SL' => 'Sierra Leone', +    'SV' => 'El Salvador', +    'SM' => 'San Marino', +    'SO' => 'Somalia', +    'RS' => 'Serbia', +    'SS' => 'Sudan Kidul', +    'ST' => 'São Tomé lan Príncipe', +    'SR' => 'Suriname', +    'SK' => 'Slowakia', +    'SI' => 'Slovenia', +    'SE' => 'Swedia', +    'SZ' => 'Swaziland', +    'SC' => 'Seychelles', +    'SY' => 'Suriah', +    'TD' => 'Chad', +    'TG' => 'Togo', +    'TH' => 'Thailand', +    'TJ' => 'Tajikistan', +    'TM' => 'Turkmenistan', +    'TL' => 'Timor-Leste', +    'TO' => 'Tonga', +    'TT' => 'Trinidad lan Tobago', +    'TN' => 'Tunisia', +    'TR' => 'Turki', + 'TV' => 'Tuvalu', +    'TZ' => 'Tanzania', +    'UG' => 'Uganda', +    'UA' => 'Ukraina', +    'UY' => 'Uruguay', +    'US' => 'Amerika Serikat', +    'UZ' => 'Uzbekistan', +    'VA' => 'Kota Vatikan', +    'VC' => 'Saint Vincent lan Grenadines', +    'VE' => 'Venezuela', +    'VN' => 'Vietnam', +    'VU' => 'Vanuatu', +    'WS' => 'Samoa', +    'YE' => 'Yaman', +    'ZA' => 'Afrika Kidul', +    'ZM' => 'Zambia', +    'ZW' => 'Zimbabwe', +]; diff --git a/app/config/locale/jv.php b/app/config/locale/jv.php new file mode 100644 index 0000000000..2326430e57 --- /dev/null +++ b/app/config/locale/jv.php @@ -0,0 +1,21 @@ + '"Kesenian sing wicaksana yaiku seni sing ngerti apa sing kudu dilalekake."', // This is the line printed in the homepage and console 'view-source' + 'settings.locale' => 'jv', + 'settings.direction' => 'ltr', + + // Service - Users + 'auth.emails.team' => 'Tim %s', + 'auth.emails.confirm.title' => 'Konfirmasi akun', + 'auth.emails.confirm.body' => 'jv.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => 'Reset Sandi', + 'auth.emails.recovery.body' => 'jv.email.auth.recovery.tpl', + 'auth.emails.invitation.title' => 'Undangan menyang %s Tim ing %s', + 'auth.emails.invitation.body' => 'jv.email.auth.invitation.tpl', + + 'locale.country.unknown' => 'Ora dingerteni', + + 'countries' => include 'jv.countries.php', + 'continents' => include 'jv.continents.php', +]; diff --git a/app/config/locale/templates/jv.email.auth.confirm.tpl b/app/config/locale/templates/jv.email.auth.confirm.tpl new file mode 100644 index 0000000000..c1afdc69a9 --- /dev/null +++ b/app/config/locale/templates/jv.email.auth.confirm.tpl @@ -0,0 +1,24 @@ + + +
+ Halo, {{name}}, +
+
+ Tindakake tautan iki kanggo verifikasi alamat email sampeyan. +
+ {{redirect}} +
+
+ Yen sampeyan ora njaluk verifikasi alamat iki, sampeyan bisa nglalekake pesen iki. +
+
+ Matur suwun, +
+ tim {{project}} +
diff --git a/app/config/locale/templates/jv.email.auth.invitation.tpl b/app/config/locale/templates/jv.email.auth.invitation.tpl new file mode 100644 index 0000000000..8c5de0f419 --- /dev/null +++ b/app/config/locale/templates/jv.email.auth.invitation.tpl @@ -0,0 +1,28 @@ + + + +
+ Halo, +
+
+ Email iki dikirim menyang sampeyan amarga {{owner}} pengin ngajak sampeyan dadi anggota tim ing {{team}} tim ing {{project}}. +
+
+ Tindakake link iki kanggo gabung ing {{team}}: +
+ {{redirect}} +
+
+ Yen sampeyan ora kasengsem, sampeyan bisa nglirwakake pesen iki. +
+
+ Matur suwun, +
+ tim {{project}} +
\ No newline at end of file diff --git a/app/config/locale/templates/jv.email.auth.recovery.tpl b/app/config/locale/templates/jv.email.auth.recovery.tpl new file mode 100644 index 0000000000..ed6c879aeb --- /dev/null +++ b/app/config/locale/templates/jv.email.auth.recovery.tpl @@ -0,0 +1,24 @@ + + +
+ Halo {{name}}, +
+
+ Tindakake link iki kanggo ngreset {{project}} sandhi. +
+ {{redirect}} +
+
+ Yen sampeyan ora njaluk ngreset sandhi, sampeyan bisa nglalekake pesen iki. +
+
+ Matur suwun, +
+ tim {{project}} +
From 080059837b56007eb7d65db1b36bd734a9653430 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 5 Oct 2019 18:39:01 +0530 Subject: [PATCH 101/135] feat: amazon OAuth (conditional) --- app/config/providers.php | 5 ++ app/controllers/auth.php | 3 + src/Auth/OAuth/Amazon.php | 127 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 src/Auth/OAuth/Amazon.php diff --git a/app/config/providers.php b/app/config/providers.php index b45ca52a74..7cfe0c9440 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -61,4 +61,9 @@ return [ 'icon' => 'icon-apple', 'enabled' => false, ], + 'amazon' => [ + 'developers' => 'https://www.dropbox.com/developers/documentation', + 'icon' => 'icon-amazon', + 'enabled' => true, + ], ]; diff --git a/app/controllers/auth.php b/app/controllers/auth.php index 75d7da05f2..22c4aaacae 100644 --- a/app/controllers/auth.php +++ b/app/controllers/auth.php @@ -730,6 +730,9 @@ $utopia->get('/v1/auth/oauth/:provider/redirect') $defaultState = ['success' => $project->getAttribute('url', ''), 'failure' => '']; $validateURL = new URL(); + // Uncomment this while testing amazon oAuth + $state = html_entity_decode($state); + if (!empty($state)) { try { $state = array_merge($defaultState, json_decode($state, true)); diff --git a/src/Auth/OAuth/Amazon.php b/src/Auth/OAuth/Amazon.php new file mode 100644 index 0000000000..d280b02765 --- /dev/null +++ b/src/Auth/OAuth/Amazon.php @@ -0,0 +1,127 @@ +appID). + '&redirect_uri='.urlencode($this->callback). + '&response_type=code'. + '&state='.urlencode(json_encode($this->state)). + '&scope=profile'; + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code): string + { + + $headers[] = 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8'; + $accessToken = $this->request( + 'POST', + 'https://api.amazon.com/auth/o2/token', + $headers, + 'code=' . urlencode($code) . + '&client_id=' . urlencode($this->appID) . + '&client_secret=' . urlencode($this->appSecret). + '&redirect_uri='.urlencode($this->callback). + '&grant_type=authorization_code' + ); + $accessToken = json_decode($accessToken, true); + + if (isset($accessToken['access_token'])) { + return $accessToken['access_token']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserID(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['user_id'])) { + return $user['user_id']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['email'])) { + return $user['email']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['name'])) { + return $user['name']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + if (empty($this->user)) { + $user = $this->request('GET', 'https://api.amazon.com/user/profile?access_token='.urlencode($accessToken)); + $this->user = json_decode($user, true); + } + return $this->user; + } +} From 0d53d260daa085195f5f990437c251f7f40d0f07 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 5 Oct 2019 18:42:46 +0530 Subject: [PATCH 102/135] feat: lint fix --- app/controllers/auth.php | 2 +- src/Auth/OAuth/Amazon.php | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/controllers/auth.php b/app/controllers/auth.php index 22c4aaacae..a904c1abd6 100644 --- a/app/controllers/auth.php +++ b/app/controllers/auth.php @@ -731,7 +731,7 @@ $utopia->get('/v1/auth/oauth/:provider/redirect') $validateURL = new URL(); // Uncomment this while testing amazon oAuth - $state = html_entity_decode($state); + // $state = html_entity_decode($state); if (!empty($state)) { try { diff --git a/src/Auth/OAuth/Amazon.php b/src/Auth/OAuth/Amazon.php index d280b02765..0b52f681f9 100644 --- a/src/Auth/OAuth/Amazon.php +++ b/src/Auth/OAuth/Amazon.php @@ -42,7 +42,6 @@ class Amazon extends OAuth */ public function getAccessToken(string $code): string { - $headers[] = 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8'; $accessToken = $this->request( 'POST', From 39faf2f05b82cd884e6ca0b392076f69da19cec4 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 5 Oct 2019 18:43:28 +0530 Subject: [PATCH 103/135] chore: disabled amazon oAuth --- app/config/providers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/providers.php b/app/config/providers.php index 7cfe0c9440..d4c05b9a9d 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -64,6 +64,6 @@ return [ 'amazon' => [ 'developers' => 'https://www.dropbox.com/developers/documentation', 'icon' => 'icon-amazon', - 'enabled' => true, + 'enabled' => false, ], ]; From 965a68afd381c7e80ae07644013c73a9952f5418 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 5 Oct 2019 18:46:07 +0530 Subject: [PATCH 104/135] chore: added Amazon OAuth Docs --- src/Auth/OAuth/Amazon.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Auth/OAuth/Amazon.php b/src/Auth/OAuth/Amazon.php index 0b52f681f9..d9cf84e73f 100644 --- a/src/Auth/OAuth/Amazon.php +++ b/src/Auth/OAuth/Amazon.php @@ -7,6 +7,7 @@ use Auth\OAuth; // Reference Material // https://developer.amazon.com/docs/login-with-amazon/authorization-code-grant.html // https://developer.amazon.com/docs/login-with-amazon/register-web.html +// https://developer.amazon.com/docs/login-with-amazon/obtain-customer-profile.html class Amazon extends OAuth { /** From b7e524f12587767617487dc05197b74c2925e38f Mon Sep 17 00:00:00 2001 From: Silvia O'Dwyer Date: Sat, 5 Oct 2019 16:20:41 +0100 Subject: [PATCH 105/135] Updated documentation and contributor guidelines. --- CONTRIBUTING.md | 16 ++++++++-------- docs/AddOAuthProvider.md | 15 +++++++++------ docs/EnvironmentVariables.md | 12 ++++++------ 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a1d0e90ec4..9cf174abfd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing -We would ❤️ for you to contribute to Appwrite and help make it better! As a contributor, here are the guidelines we would like you to follow: +We would ❤️ for you to contribute to Appwrite and help make it better! As a contributor, here are the guidelines we would like you to follow: ## Code of Conduct @@ -8,7 +8,7 @@ Help us keep Appwrite open and inclusive. Please read and follow our [Code of Co ## Technology Stack -To start helping us to improve Appwrite server, prior knowledge of Appwrite technology stack can help you with getting started. +To start helping us to improve Appwrite server, prior knowledge of Appwrite's technology stack can help you with getting started. Appwrite stack is combined from a variety of open-source technologies and tools. Appwrite backend API is written primarily with PHP version 7 and above on top of the Utopia PHP framework. Appwrite frontend is built with tools like gulp, less and litespeed.js. We use Docker as the container technology to package the Appwrite server for easy integration on cloud, on-premise or local hosts. @@ -26,9 +26,9 @@ Appwrite stack is combined from a variety of open-source technologies and tools. ## Package Managers -Appwrite is using a package manager for managing code dependencies for both backend and frontend development. We try our best to avoid creating any unnecessary and any new dependency to the project is subjected to a lead developer review and approval. +Appwrite uses a package manager for managing code dependencies for both backend and frontend development. We try our best to avoid creating any unnecessary and any new dependency to the project is subjected to a lead developer review and approval. -Many of Appwrite internal modules are also used as dependencies to allow other Appwrite's projects to reuse them and as a way to contribute them back to the community. +Many of Appwrite's internal modules are also used as dependencies to allow other Appwrite's projects to reuse them and as a way to contribute them back to the community. Appwrite uses PHPs Composer for managing dependencies on the server-side and JS NPM for managing dependencies on the frontend side. @@ -44,7 +44,7 @@ Appwrite is built to scale. Please keep in mind that the Appwrite stack can run We wish Appwrite will be as easy to set up and in a single, localhost and easy to grow to a large environment with thousands and even hundreds of instances. -When contributing code please take into account the following considerations: +When contributing code, please take into account the following considerations: * Response Time * Throughput @@ -57,11 +57,11 @@ When contributing code please take into account the following considerations: ## Architecture -Appwrite current structure is a combination of both Monolithic and Microservice architectures, but our final goal, as we grow is to be using only microservices. +Appwrite's current structure is a combination of both Monolithic and Microservice architectures, but our final goal, as we grow is to be using only microservices. ### The Monolithic Part -Appwrite main API container is designed as a monolithic app. This is a decision we made to allow us to develop the project faster while still being a very small team. +Appwrite's main API container is designed as a monolithic app. This is a decision we made to allow us to develop the project faster while still being a very small team. Although the Appwrite API is a monolithic app, it has a very clear separation of concern as each internal service or worker is separated by its container which will allow us as we grow to start breaking services for better maintenance and scalability. @@ -121,6 +121,6 @@ Before running the command make sure you have proper write permissions to Appwri ## Tutorials -From time to time our team will add tutorials that will help contributors find there way in the Appwrite source code. Below is a list of currently available tutorials: +From time to time our team will add tutorials that will help contributors find their way in the Appwrite source code. Below is a list of currently available tutorials: * [Adding Support for a New OAuth Provider](./docs/AddOAuthProvider.md) diff --git a/docs/AddOAuthProvider.md b/docs/AddOAuthProvider.md index c6eb210a3c..bbb20e138f 100644 --- a/docs/AddOAuthProvider.md +++ b/docs/AddOAuthProvider.md @@ -1,24 +1,27 @@ # Adding a New OAuth Provider -This document is part of the Appwrite contributors' guide. Before you continue reading this document make sure you have read the [code of conduct](../CODE_OF_CONDUCT.md) and the [contributing guide](../CONTRIBUTING.md). +This document is part of the Appwrite contributors' guide. Before you continue reading this document make sure you have read the [Code of Conduct](../CODE_OF_CONDUCT.md) and the [Contributing Guide](../CONTRIBUTING.md). ## Getting Started ### Agenda -OAuth providers help users to log in easily to apps and websites without the need to provide passwords or any other type of credentials. Appwrite goal is to have support from as many **major** OAuth providers as possible. +OAuth providers help users to log in easily to apps and websites without the need to provide passwords or any other type of credentials. Appwrite's goal is to have support from as many **major** OAuth providers as possible. As of the writing of these lines, we do not accept any minor OAuth providers. For us to accept some smaller and potentially unlimited number of OAuth providers, some product design and software architecture changes must be applied first. ### List Your new Provider -The first step to follow in adding a new OAuth provider is to add it to the list in providers config file array, located at: +The first step in adding a new OAuth provider is to add it to the list in providers config file array, located at: ``` ./app/config/providers.php ``` -Make sure to fill all data needed and that your provider array key name is in camelCase format and has no spaces or special characters. +Make sure to fill all data needed and that your provider array key name: + +- is in camelCase format +- has no spaces or special characters. ### Add Provider Logo @@ -36,7 +39,7 @@ Create a new class that extends the basic OAuth provider abstract class in this Note that the class name should start with a capital letter as PHP FIG standards suggest. -Once a new class is created, you can start to implement your new provider's login flow. The best way to do this right is to have a look at another provider's implementation and try to follow the same standards. +Once a new class is created, you can start to implement your new provider's login flow. The best way to do this corrrectly is to have a look at another provider's implementation and try to follow the same standards. Please mention in your documentation what resources or API docs you used to implement the provider's OAuth protocol. @@ -46,4 +49,4 @@ After you finished adding your new provider to Appwrite you should be able to se Add credentials and check both a successful and a failed login (where the user rejects integration on provider page). -If everything goes well, just send us the pull request and be ready to respond to any feedback which can arise during our code review. +If everything goes well, just submit a pull request and be ready to respond to any feedback which can arise during our code review. diff --git a/docs/EnvironmentVariables.md b/docs/EnvironmentVariables.md index cd2d55ea92..ad2adae667 100644 --- a/docs/EnvironmentVariables.md +++ b/docs/EnvironmentVariables.md @@ -6,15 +6,15 @@ Appwrite environment variables allow you to edit your server setup configuration ### _APP_ENV -Set your server running environment. By default the var is set to 'development' when deploying to production, change to: 'production'. +Set your server running environment. By default the var is set to 'development'. When deploying to production, change to: 'production'. ### _APP_OPTIONS_ABUSE -Allows you to disabled abuse checks and API rate limiting. By default set to 'enabled'. To cancel the abuse checking set to 'disabled'. It is not recommended to disable this check-in production environment. +Allows you to disable abuse checks and API rate limiting. By default set to 'enabled'. To cancel the abuse checking, set to 'disabled'. It is not recommended to disable this check in a production environment. ### _APP_OPENSSL_KEY_V1 -This is your server private secret key that is used to encrypt all sensitive data on your server. Appwrite server is encrypting all secret data on your server like webhooks HTTP passwords, user sessions, and the storage files. The var is not set by default, if you wish to take advantage of Appwrite encryption capabilities you should change it and make sure to keep it a secret. +This is your server private secret key that is used to encrypt all sensitive data on your server. Appwrite server encrypts all secret data on your server like webhooks, HTTP passwords, user sessions, and storage files. The var is not set by default, if you wish to take advantage of Appwrite encryption capabilities you should change it and make sure to keep it a secret. ### _APP_CONSOLE_WHITELIST_EMAILS @@ -34,7 +34,7 @@ To enable activate this option, pass a list of allowed IP addresses separated by ## Redis Server -Appwrite is using a Redis server for managing cache, queues and scheduled tasks. The Redis env vars are used to allow Appwrite server to connect to the Redis container. +Appwrite uses a Redis server for managing cache, queues and scheduled tasks. The Redis env vars are used to allow Appwrite server to connect to the Redis container. ### _APP_REDIS_HOST @@ -70,7 +70,7 @@ MariaDB server database schema. Default value is: 'appwrite' ## InfluxDB -Appwrite is using an InfluxDB server for managing time-series data and server stats. The InfluxDB env vars are used to allow Appwrite server to connect to the InfluxDB container. +Appwrite uses an InfluxDB server for managing time-series data and server stats. The InfluxDB env vars are used to allow Appwrite server to connect to the InfluxDB container. ### _APP_INFLUXDB_HOST @@ -82,7 +82,7 @@ InfluxDB server TCP port. Default value is: '8086' ## StatsD -Appwrite is using a StatsD server for aggregating and sending stats data over a fast UDP connection. The StatsD env vars are used to allow Appwrite server to connect to the StatsD container. +Appwrite uses a StatsD server for aggregating and sending stats data over a fast UDP connection. The StatsD env vars are used to allow Appwrite server to connect to the StatsD container. ### _APP_INFLUXDB_HOST From 590f089375bb40d520038fb038f88a57084ba32b Mon Sep 17 00:00:00 2001 From: Sumit Kharche <43902034+sumitkharche@users.noreply.github.com> Date: Sat, 5 Oct 2019 22:48:09 +0530 Subject: [PATCH 106/135] corrected grammar issues --- docs/EnvironmentVariables.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/EnvironmentVariables.md b/docs/EnvironmentVariables.md index cd2d55ea92..8ffdcab7c6 100644 --- a/docs/EnvironmentVariables.md +++ b/docs/EnvironmentVariables.md @@ -6,7 +6,7 @@ Appwrite environment variables allow you to edit your server setup configuration ### _APP_ENV -Set your server running environment. By default the var is set to 'development' when deploying to production, change to: 'production'. +Set your server running environment. By default the var is set to 'development' when deploying to production, change it to: 'production'. ### _APP_OPTIONS_ABUSE @@ -28,9 +28,9 @@ To enable this option, pass a list of allowed email domains separated by a comma ### _APP_CONSOLE_WHITELIST_IPS -This last option available allows you to restrict access to Appwrite console for users sharing the same set op IP addresses. This option is very useful for team working with a VPN service or a company IP. +This last option allows you to restrict access to Appwrite console for users sharing the same set op IP addresses. This option is very useful for team working with a VPN service or a company IP. -To enable activate this option, pass a list of allowed IP addresses separated by a comma. +To enable/activate this option, pass a list of allowed IP addresses separated by a comma. ## Redis Server @@ -116,4 +116,4 @@ SMTP server user name. Empty by default. ### _APP_SMTP_PASSWORD -SMTP server user password. Empty by default. \ No newline at end of file +SMTP server user password. Empty by default. From b19f62b6b0e779ace7a624bd508282998483bd28 Mon Sep 17 00:00:00 2001 From: sevenindirecto Date: Sat, 5 Oct 2019 19:36:29 +0200 Subject: [PATCH 107/135] Add Slovenian localization --- app/config/locale/sl.continents.php | 11 + app/config/locale/sl.countries.php | 198 ++++++++++++++++++ app/config/locale/sl.php | 21 ++ .../templates/sl.email.auth.confirm.tpl | 24 +++ .../templates/sl.email.auth.invitation.tpl | 27 +++ .../templates/sl.email.auth.recovery.tpl | 24 +++ 6 files changed, 305 insertions(+) create mode 100644 app/config/locale/sl.continents.php create mode 100644 app/config/locale/sl.countries.php create mode 100644 app/config/locale/sl.php create mode 100644 app/config/locale/templates/sl.email.auth.confirm.tpl create mode 100644 app/config/locale/templates/sl.email.auth.invitation.tpl create mode 100644 app/config/locale/templates/sl.email.auth.recovery.tpl diff --git a/app/config/locale/sl.continents.php b/app/config/locale/sl.continents.php new file mode 100644 index 0000000000..365662d62c --- /dev/null +++ b/app/config/locale/sl.continents.php @@ -0,0 +1,11 @@ + 'Afrika', + 'AN' => 'Antarktika', + 'AS' => 'Azija', + 'EU' => 'Evropa', + 'NA' => 'Severna Amerika', + 'OC' => 'Oceanija', + 'SA' => 'Južna Amerika', +]; diff --git a/app/config/locale/sl.countries.php b/app/config/locale/sl.countries.php new file mode 100644 index 0000000000..79589a345f --- /dev/null +++ b/app/config/locale/sl.countries.php @@ -0,0 +1,198 @@ + 'Afganistan', + 'AO' => 'Angola', + 'AL' => 'Albanija', + 'AD' => 'Andora', + 'AE' => 'Združeni Arabski Emirati', + 'AR' => 'Argenitna', + 'AM' => 'Armenija', + 'AG' => 'Antigva in Barbuda', + 'AU' => 'Avstralija', + 'AT' => 'Avstrija', + 'AZ' => 'Azerbajdžan', + 'BI' => 'Burundi ', + 'BE' => 'Belgija', + 'BJ' => 'Benin', + 'BF' => 'Burkina Faso', + 'BD' => 'Bangladeš', + 'BG' => 'Bolgarija', + 'BH' => 'Bahrajn', + 'BS' => 'Bahami', + 'BA' => 'Bosna in Hercegovina', + 'BY' => 'Belorusija', + 'BZ' => 'Belize', + 'BO' => 'Bolivija', + 'BR' => 'Brazilija', + 'BB' => 'Barbados', + 'BN' => 'Brunej', + 'BT' => 'Butan', + 'BW' => 'Bocvana', + 'CF' => 'Srednjeafriška republika', + 'CA' => 'Kanada', + 'CH' => 'Švica', + 'CL' => 'Čile', + 'CN' => 'Kitajska', + 'CI' => 'Slonokoščena obala', + 'CM' => 'Kamerun', + 'CD' => 'Demokratična republika Kongo', + 'CG' => 'Kongo', + 'CO' => 'Kolumbija', + 'KM' => 'Komori', + 'CV' => 'Kapverdski otoki (Zelenortski otoki)', + 'CR' => 'Kostarika', + 'CU' => 'Kuba', + 'CY' => 'Ciper', + 'CZ' => 'Češka', + 'DE' => 'Nemčija', + 'DJ' => 'Džibuti', + 'DM' => 'Dominika', + 'DK' => 'Danska', + 'DO' => 'Dominikanska republika', + 'DZ' => 'Alžirija', + 'EC' => 'Ekvador', + 'EG' => 'Egipt', + 'ER' => 'Eritreja', + 'ES' => 'Španija', + 'EE' => 'Estonija', + 'ET' => 'Etiopija', + 'FI' => 'Finska', + 'FJ' => 'Fidži', + 'FR' => 'Francija', + 'FM' => 'Mikronezija', + 'GA' => 'Gabon', + 'GB' => 'Velika Britanija', + 'GE' => 'Gruzija', + 'GH' => 'Gana', + 'GN' => 'Gvineja', + 'GM' => 'Gambija', + 'GW' => 'Gvineja-Bissau', + 'GQ' => 'Ekvatorialna Gvineja', + 'GR' => 'Grčija', + 'GD' => 'Grenada', + 'GT' => 'Gvatemala', + 'GY' => 'Gvajana', + 'HN' => 'Honduras', + 'HR' => 'Hrvaška', + 'HT' => 'Haiti', + 'HU' => 'Madžarska', + 'ID' => 'Indonezija', + 'IN' => 'Indija', + 'IE' => 'Irska', + 'IR' => 'Iran', + 'IQ' => 'Irak', + 'IS' => 'Islandija', + 'IL' => 'Izrael', + 'IT' => 'Italija', + 'JM' => 'Jamajka', + 'JO' => 'Jordanija', + 'JP' => 'Japonska', + 'KZ' => 'Kazahstan', + 'KE' => 'Kenija', + 'KG' => 'Kirgizistan (Kirgizija)', + 'KH' => 'Kambodža', + 'KI' => 'Kiribati', + 'KN' => 'Sveti Kits in Nevis', + 'KR' => 'Južna Koreja', + 'KW' => 'Kuvajt', + 'LA' => 'Laos', + 'LB' => 'Libanon', + 'LR' => 'Liberija', + 'LY' => 'Libija', + 'LC' => 'Sveta Lucija', + 'LI' => 'Lihtenštajn', + 'LK' => 'Šri Lanka', + 'LS' => 'Lesoto', + 'LT' => 'Litva', + 'LU' => 'Luksemburg', + 'LV' => 'Latvija', + 'MA' => 'Maroko', + 'MC' => 'Monako', + 'MD' => 'Moldavija', + 'MG' => 'Madagaskar', + 'MV' => 'Maldivi', + 'MX' => 'Mehika', + 'MH' => 'Maršalovi otoki', + 'MK' => 'Makedonija', + 'ML' => 'Mali', + 'MT' => 'Malta', + 'MM' => 'Mjanmar', + 'ME' => 'Črna Gora', + 'MN' => 'Mongolija', + 'MZ' => 'Mozambik', + 'MR' => 'Mavretanija', + 'MU' => 'Mauricius (Moris)', + 'MW' => 'Malavi', + 'MY' => 'Malezija', + 'NA' => 'Namibija', + 'NE' => 'Niger ', + 'NG' => 'Nigerija', + 'NI' => 'Nikaragva', + 'NL' => 'Nizozemska', + 'NO' => 'Norveška', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NZ' => 'Nova Zelandija', + 'OM' => 'Oman', + 'PK' => 'Pakistan', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PH' => 'Filipini', + 'PW' => 'Palau ', + 'PG' => 'Papua Nova Gvineja', + 'PL' => 'Poljska', + 'KP' => 'Severna Koreja', + 'PT' => 'Portugalska', + 'PY' => 'Paragvaj', + 'QA' => 'Katar', + 'RO' => 'Romunija', + 'RU' => 'Ruska federacija', + 'RW' => 'Ruanda', + 'SA' => 'Savdska Arabija', + 'SD' => 'Sudan', + 'SN' => 'Senegal', + 'SG' => 'Singapur', + 'SB' => 'Solomonovi otoki', + 'SL' => 'Siera Leone', + 'SV' => 'Salvador', + 'SM' => 'San Marino', + 'SO' => 'Somalija', + 'RS' => 'Srbija', + 'SS' => 'Južni Sudan', + 'ST' => 'Sao Tome in Principe', + 'SR' => 'Surinam', + 'SK' => 'Slovaška', + 'SI' => 'Slovenija', + 'SE' => 'Švedska', + 'SZ' => 'Svazi', + 'SC' => 'Sejšeli', + 'SY' => 'Sirija', + 'TD' => 'Čad', + 'TG' => 'Togo', + 'TH' => 'Tajska', + 'TJ' => 'Tadžikistan', + 'TM' => 'Turkmenistan', + 'TL' => 'Vzhodni Timor', + 'TO' => 'Tonga', + 'TT' => 'Trinidad in Tobago', + 'TN' => 'Tunizija', + 'TR' => 'Turčija', + 'TV' => 'Tuvalu', + 'TZ' => 'Tanzanija', + 'UG' => 'Uganda', + 'UA' => 'Ukrajina', + 'UY' => 'Urugvaj', + 'US' => 'Združene države Amerike', + 'UZ' => 'Uzbekistan', + 'VA' => 'Vatikan', + 'VC' => 'Sveti Vincent in Grenadini', + 'VE' => 'Venezuela', + 'VN' => 'Vietnam', + 'VU' => 'Republika Vanuatu', + 'WS' => 'Samoa', + 'YE' => 'Jemen', + 'ZA' => 'Južna afrika', + 'ZM' => 'Zambija', + 'ZW' => 'Zimbabve', +]; diff --git a/app/config/locale/sl.php b/app/config/locale/sl.php new file mode 100644 index 0000000000..4098628c29 --- /dev/null +++ b/app/config/locale/sl.php @@ -0,0 +1,21 @@ + '"Srčika modrosti je umetnost védenja, kaj spregledati."', // This is the line printed in the homepage and console 'view-source' + 'settings.locale' => 'sl', + 'settings.direction' => 'ltr', + + // Service - Users + 'auth.emails.team' => '%s Ekipa', + 'auth.emails.confirm.title' => 'Potrditev računa', + 'auth.emails.confirm.body' => 'sl.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => 'Ponastavitev gesla', + 'auth.emails.recovery.body' => 'sl.email.auth.recovery.tpl', + 'auth.emails.invitation.title' => 'Povabilo v %s Ekipo za %s', + 'auth.emails.invitation.body' => 'sl.email.auth.invitation.tpl', + + 'locale.country.unknown' => 'Neznano', + + 'countries' => include 'sl.countries.php', + 'continents' => include 'sl.continents.php', +]; diff --git a/app/config/locale/templates/sl.email.auth.confirm.tpl b/app/config/locale/templates/sl.email.auth.confirm.tpl new file mode 100644 index 0000000000..e7f15272da --- /dev/null +++ b/app/config/locale/templates/sl.email.auth.confirm.tpl @@ -0,0 +1,24 @@ + + +
+ Pozdravljeni {{name}}, +
+
+ Sledite tej povezavi za potrditev vašega email naslova. +
+ {{redirect}} +
+
+ Če niste zahtevali potrditve tega naslova, lahko to sporočilo prezrete. +
+
+ Hvala, +
+ {{project}} ekipa +
\ No newline at end of file diff --git a/app/config/locale/templates/sl.email.auth.invitation.tpl b/app/config/locale/templates/sl.email.auth.invitation.tpl new file mode 100644 index 0000000000..13467789a3 --- /dev/null +++ b/app/config/locale/templates/sl.email.auth.invitation.tpl @@ -0,0 +1,27 @@ + + +
+ Pozdravljeni, +
+
+ To sporočilo vam je bilo posredovano, ker vas je {{owner}} povabil/a, da postanete član {{team}} ekipe za {{project}}. +
+
+ Sledite tej povezavi, da se pridružite {{team}} ekipi: +
+ {{redirect}} +
+
+ Če vas ne zanima, lahko to sporočilo prezrete. +
+
+ Hvala, +
+ {{project}} ekipa +
diff --git a/app/config/locale/templates/sl.email.auth.recovery.tpl b/app/config/locale/templates/sl.email.auth.recovery.tpl new file mode 100644 index 0000000000..701805e12e --- /dev/null +++ b/app/config/locale/templates/sl.email.auth.recovery.tpl @@ -0,0 +1,24 @@ + + +
+ Pozdravljeni {{name}}, +
+
+ Za ponastavitev vašega {{project}} gesla sledite tej povezavi. +
+ {{redirect}} +
+
+ Če niste zahtevali ponastavitve gesla, lahko to sporočilo prezrete. +
+
+ Hvala, +
+ {{project}} ekipa +
From 480bea1fecd0ef22882945e7d8016f2f5331d977 Mon Sep 17 00:00:00 2001 From: Lorenz Henk Date: Sat, 5 Oct 2019 22:08:32 +0200 Subject: [PATCH 108/135] Fix typos in german translation of template files --- app/config/locale/templates/de.email.auth.confirm.tpl | 2 +- app/config/locale/templates/de.email.auth.invitation.tpl | 4 ++-- app/config/locale/templates/de.email.auth.recovery.tpl | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/config/locale/templates/de.email.auth.confirm.tpl b/app/config/locale/templates/de.email.auth.confirm.tpl index ae4ff2729b..2a3211bbab 100644 --- a/app/config/locale/templates/de.email.auth.confirm.tpl +++ b/app/config/locale/templates/de.email.auth.confirm.tpl @@ -18,7 +18,7 @@ Bitte ignoriere diese Nachricht, wenn du das Verifizieren deiner E-Mail Adresse nicht beantragt hast.

- Vielen dank, + Vielen Dank,
{{project}} Team \ No newline at end of file diff --git a/app/config/locale/templates/de.email.auth.invitation.tpl b/app/config/locale/templates/de.email.auth.invitation.tpl index dc218116a5..c6d9162730 100644 --- a/app/config/locale/templates/de.email.auth.invitation.tpl +++ b/app/config/locale/templates/de.email.auth.invitation.tpl @@ -13,7 +13,7 @@ diese E-Mail wurde dir geschickt, weil {{owner}} dich eingeladen hat Teammitglied im Team {{team}} bei {{project}} zu werden.

- Folge diesem Link um dem {{team}} Team beizutreten: + Folge diesem Link um dem Team {{team}} beizutreten:
{{redirect}}
@@ -21,7 +21,7 @@ Wenn du daran nicht interessiert bist, kannst du diese Nachricht ignorieren.

- Vielen dank, + Vielen Dank,
{{project}} Team diff --git a/app/config/locale/templates/de.email.auth.recovery.tpl b/app/config/locale/templates/de.email.auth.recovery.tpl index c9484a011c..6d2ccd7bae 100644 --- a/app/config/locale/templates/de.email.auth.recovery.tpl +++ b/app/config/locale/templates/de.email.auth.recovery.tpl @@ -18,7 +18,7 @@ Bitte ignoriere diese Nachricht, wenn du das Zurücksetzen deines Passworts nicht beantragt hast.

- Vielen dank, + Vielen Dank,
{{project}} Team From c21327efe9fa8eae513c9389904c46dbd826ee69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Skowro=C5=84ski?= <> Date: Sat, 5 Oct 2019 22:14:58 +0200 Subject: [PATCH 109/135] Translate Appwrite Locale and Email templates to Polish (#25) --- app/config/locale/pl.continents.php | 11 + app/config/locale/pl.countries.php | 198 ++++++++++++++++++ app/config/locale/pl.php | 21 ++ .../templates/pl.email.auth.confirm.tpl | 24 +++ .../templates/pl.email.auth.invitation.tpl | 27 +++ .../templates/pl.email.auth.recovery.tpl | 24 +++ 6 files changed, 305 insertions(+) create mode 100644 app/config/locale/pl.continents.php create mode 100644 app/config/locale/pl.countries.php create mode 100644 app/config/locale/pl.php create mode 100644 app/config/locale/templates/pl.email.auth.confirm.tpl create mode 100644 app/config/locale/templates/pl.email.auth.invitation.tpl create mode 100644 app/config/locale/templates/pl.email.auth.recovery.tpl diff --git a/app/config/locale/pl.continents.php b/app/config/locale/pl.continents.php new file mode 100644 index 0000000000..48a0b54435 --- /dev/null +++ b/app/config/locale/pl.continents.php @@ -0,0 +1,11 @@ + 'Africa', + 'AN' => 'Antarctica', + 'AS' => 'Asia', + 'EU' => 'Europe', + 'NA' => 'North America', + 'OC' => 'Oceania', + 'SA' => 'South America', +]; diff --git a/app/config/locale/pl.countries.php b/app/config/locale/pl.countries.php new file mode 100644 index 0000000000..60c75792b7 --- /dev/null +++ b/app/config/locale/pl.countries.php @@ -0,0 +1,198 @@ + 'Afghanistan', + 'AO' => 'Angola', + 'AL' => 'Albania', + 'AD' => 'Andorra', + 'AE' => 'United Arab Emirates', + 'AR' => 'Argentina', + 'AM' => 'Armenia', + 'AG' => 'Antigua and Barbuda', + 'AU' => 'Australia', + 'AT' => 'Austria', + 'AZ' => 'Azerbaijan', + 'BI' => 'Burundi', + 'BE' => 'Belgium', + 'BJ' => 'Benin', + 'BF' => 'Burkina Faso', + 'BD' => 'Bangladesh', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrain', + 'BS' => 'Bahamas', + 'BA' => 'Bosnia and Herzegovina', + 'BY' => 'Belarus', + 'BZ' => 'Belize', + 'BO' => 'Bolivia', + 'BR' => 'Brazil', + 'BB' => 'Barbados', + 'BN' => 'Brunei', + 'BT' => 'Bhutan', + 'BW' => 'Botswana', + 'CF' => 'Central African Republic', + 'CA' => 'Canada', + 'CH' => 'Switzerland', + 'CL' => 'Chile', + 'CN' => 'China', + 'CI' => 'Ivory Coast', + 'CM' => 'Cameroon', + 'CD' => 'DR Congo', + 'CG' => 'Republic of the Congo', + 'CO' => 'Colombia', + 'KM' => 'Comoros', + 'CV' => 'Cape Verde', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CY' => 'Cyprus', + 'CZ' => 'Czechia', + 'DE' => 'Germany', + 'DJ' => 'Djibouti', + 'DM' => 'Dominica', + 'DK' => 'Denmark', + 'DO' => 'Dominican Republic', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EG' => 'Egypt', + 'ER' => 'Eritrea', + 'ES' => 'Spain', + 'EE' => 'Estonia', + 'ET' => 'Ethiopia', + 'FI' => 'Finland', + 'FJ' => 'Fiji', + 'FR' => 'France', + 'FM' => 'Micronesia', + 'GA' => 'Gabon', + 'GB' => 'United Kingdom', + 'GE' => 'Georgia', + 'GH' => 'Ghana', + 'GN' => 'Guinea', + 'GM' => 'Gambia', + 'GW' => 'Guinea-Bissau', + 'GQ' => 'Equatorial Guinea', + 'GR' => 'Greece', + 'GD' => 'Grenada', + 'GT' => 'Guatemala', + 'GY' => 'Guyana', + 'HN' => 'Honduras', + 'HR' => 'Croatia', + 'HT' => 'Haiti', + 'HU' => 'Hungary', + 'ID' => 'Indonesia', + 'IN' => 'India', + 'IE' => 'Ireland', + 'IR' => 'Iran', + 'IQ' => 'Iraq', + 'IS' => 'Iceland', + 'IL' => 'Israel', + 'IT' => 'Italy', + 'JM' => 'Jamaica', + 'JO' => 'Jordan', + 'JP' => 'Japan', + 'KZ' => 'Kazakhstan', + 'KE' => 'Kenya', + 'KG' => 'Kyrgyzstan', + 'KH' => 'Cambodia', + 'KI' => 'Kiribati', + 'KN' => 'Saint Kitts and Nevis', + 'KR' => 'South Korea', + 'KW' => 'Kuwait', + 'LA' => 'Laos', + 'LB' => 'Lebanon', + 'LR' => 'Liberia', + 'LY' => 'Libya', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LS' => 'Lesotho', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'LV' => 'Latvia', + 'MA' => 'Morocco', + 'MC' => 'Monaco', + 'MD' => 'Moldova', + 'MG' => 'Madagascar', + 'MV' => 'Maldives', + 'MX' => 'Mexico', + 'MH' => 'Marshall Islands', + 'MK' => 'Macedonia', + 'ML' => 'Mali', + 'MT' => 'Malta', + 'MM' => 'Myanmar', + 'ME' => 'Montenegro', + 'MN' => 'Mongolia', + 'MZ' => 'Mozambique', + 'MR' => 'Mauritania', + 'MU' => 'Mauritius', + 'MW' => 'Malawi', + 'MY' => 'Malaysia', + 'NA' => 'Namibia', + 'NE' => 'Niger', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Netherlands', + 'NO' => 'Norway', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NZ' => 'New Zealand', + 'OM' => 'Oman', + 'PK' => 'Pakistan', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PH' => 'Philippines', + 'PW' => 'Palau', + 'PG' => 'Papua New Guinea', + 'PL' => 'Poland', + 'KP' => 'North Korea', + 'PT' => 'Portugal', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RO' => 'Romania', + 'RU' => 'Russia', + 'RW' => 'Rwanda', + 'SA' => 'Saudi Arabia', + 'SD' => 'Sudan', + 'SN' => 'Senegal', + 'SG' => 'Singapore', + 'SB' => 'Solomon Islands', + 'SL' => 'Sierra Leone', + 'SV' => 'El Salvador', + 'SM' => 'San Marino', + 'SO' => 'Somalia', + 'RS' => 'Serbia', + 'SS' => 'South Sudan', + 'ST' => 'São Tomé and Príncipe', + 'SR' => 'Suriname', + 'SK' => 'Slovakia', + 'SI' => 'Slovenia', + 'SE' => 'Sweden', + 'SZ' => 'Swaziland', + 'SC' => 'Seychelles', + 'SY' => 'Syria', + 'TD' => 'Chad', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tajikistan', + 'TM' => 'Turkmenistan', + 'TL' => 'Timor-Leste', + 'TO' => 'Tonga', + 'TT' => 'Trinidad and Tobago', + 'TN' => 'Tunisia', + 'TR' => 'Turkey', + 'TV' => 'Tuvalu', + 'TZ' => 'Tanzania', + 'UG' => 'Uganda', + 'UA' => 'Ukraine', + 'UY' => 'Uruguay', + 'US' => 'United States', + 'UZ' => 'Uzbekistan', + 'VA' => 'Vatican City', + 'VC' => 'Saint Vincent and the Grenadines', + 'VE' => 'Venezuela', + 'VN' => 'Vietnam', + 'VU' => 'Vanuatu', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'ZA' => 'South Africa', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/app/config/locale/pl.php b/app/config/locale/pl.php new file mode 100644 index 0000000000..cbd1dd2f51 --- /dev/null +++ b/app/config/locale/pl.php @@ -0,0 +1,21 @@ + '"The art of being wise is the art of knowing what to overlook."', // This is the line printed in the homepage and console 'view-source' + 'settings.locale' => 'en', + 'settings.direction' => 'ltr', + + // Service - Users + 'auth.emails.team' => '%s Team', + 'auth.emails.confirm.title' => 'Account Confirmation', + 'auth.emails.confirm.body' => 'en.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => 'Password Reset', + 'auth.emails.recovery.body' => 'en.email.auth.recovery.tpl', + 'auth.emails.invitation.title' => 'Invitation to %s Team at %s', + 'auth.emails.invitation.body' => 'en.email.auth.invitation.tpl', + + 'locale.country.unknown' => 'Unknown', + + 'countries' => include 'en.countries.php', + 'continents' => include 'en.continents.php', +]; diff --git a/app/config/locale/templates/pl.email.auth.confirm.tpl b/app/config/locale/templates/pl.email.auth.confirm.tpl new file mode 100644 index 0000000000..92078114e3 --- /dev/null +++ b/app/config/locale/templates/pl.email.auth.confirm.tpl @@ -0,0 +1,24 @@ + + +
+ Hello {{name}}, +
+
+ Follow this link to verify your email address. +
+ {{redirect}} +
+
+ If you didn’t ask to verify this address, you can ignore this message. +
+
+ Thanks, +
+ {{project}} team +
\ No newline at end of file diff --git a/app/config/locale/templates/pl.email.auth.invitation.tpl b/app/config/locale/templates/pl.email.auth.invitation.tpl new file mode 100644 index 0000000000..fda2bbcce0 --- /dev/null +++ b/app/config/locale/templates/pl.email.auth.invitation.tpl @@ -0,0 +1,27 @@ + + +
+ Hello, +
+
+ This mail was sent to you because {{owner}} wanted to invite you to become a team member at the {{team}} team over at {{project}}. +
+
+ Follow this link to join the {{team}} team: +
+ {{redirect}} +
+
+ If you are not interested, you can ignore this message. +
+
+ Thanks, +
+ {{project}} team +
diff --git a/app/config/locale/templates/pl.email.auth.recovery.tpl b/app/config/locale/templates/pl.email.auth.recovery.tpl new file mode 100644 index 0000000000..7a6fa2fa60 --- /dev/null +++ b/app/config/locale/templates/pl.email.auth.recovery.tpl @@ -0,0 +1,24 @@ + + +
+ Hello {{name}}, +
+
+ Follow this link to reset your {{project}} password. +
+ {{redirect}} +
+
+ If you didn’t ask to reset your password, you can ignore this message. +
+
+ Thanks, +
+ {{project}} team +
From d126ebc787c93333ed1cb1d8ac7400958cbf7987 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 6 Oct 2019 02:05:30 +0530 Subject: [PATCH 110/135] chore: added amazon image --- public/images/oauth/amazon.png | Bin 0 -> 4989 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/oauth/amazon.png diff --git a/public/images/oauth/amazon.png b/public/images/oauth/amazon.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce2da81e0a6929c408a1cbb0f05e7b9c3fb5d07 GIT binary patch literal 4989 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 AeE Date: Sat, 5 Oct 2019 22:41:17 +0200 Subject: [PATCH 111/135] Translate Appwrite Locale and Email templates to Polish (#25) --- app/config/locale/pl.continents.php | 12 +- app/config/locale/pl.countries.php | 248 +++++++++--------- app/config/locale/pl.php | 12 +- .../templates/pl.email.auth.confirm.tpl | 10 +- .../templates/pl.email.auth.invitation.tpl | 12 +- .../templates/pl.email.auth.recovery.tpl | 10 +- 6 files changed, 152 insertions(+), 152 deletions(-) diff --git a/app/config/locale/pl.continents.php b/app/config/locale/pl.continents.php index 48a0b54435..a3ab2b28f9 100644 --- a/app/config/locale/pl.continents.php +++ b/app/config/locale/pl.continents.php @@ -1,11 +1,11 @@ 'Africa', - 'AN' => 'Antarctica', - 'AS' => 'Asia', - 'EU' => 'Europe', - 'NA' => 'North America', + 'AF' => 'Afryka', + 'AN' => 'Antarktyda', + 'AS' => 'Azja', + 'EU' => 'Europa', + 'NA' => 'Ameryka Północna', 'OC' => 'Oceania', - 'SA' => 'South America', + 'SA' => 'Ameryka południowa', ]; diff --git a/app/config/locale/pl.countries.php b/app/config/locale/pl.countries.php index 60c75792b7..a0b4183c13 100644 --- a/app/config/locale/pl.countries.php +++ b/app/config/locale/pl.countries.php @@ -1,198 +1,198 @@ 'Afghanistan', + 'AF' => 'Afganistan', 'AO' => 'Angola', 'AL' => 'Albania', - 'AD' => 'Andorra', - 'AE' => 'United Arab Emirates', - 'AR' => 'Argentina', + 'AD' => 'Andora', + 'AE' => 'Zjednoczone Emiraty Arabskie', + 'AR' => 'Argentyna', 'AM' => 'Armenia', - 'AG' => 'Antigua and Barbuda', + 'AG' => 'Antigua i Barbuda', 'AU' => 'Australia', 'AT' => 'Austria', - 'AZ' => 'Azerbaijan', + 'AZ' => 'Azerbejdżan', 'BI' => 'Burundi', - 'BE' => 'Belgium', + 'BE' => 'Belgia', 'BJ' => 'Benin', 'BF' => 'Burkina Faso', - 'BD' => 'Bangladesh', - 'BG' => 'Bulgaria', - 'BH' => 'Bahrain', - 'BS' => 'Bahamas', - 'BA' => 'Bosnia and Herzegovina', - 'BY' => 'Belarus', + 'BD' => 'Bangladesz', + 'BG' => 'Bułgaria', + 'BH' => 'Bahrajn', + 'BS' => 'Bahamy', + 'BA' => 'Bośnia i Hercegowina', + 'BY' => 'Białoruś', 'BZ' => 'Belize', - 'BO' => 'Bolivia', - 'BR' => 'Brazil', + 'BO' => 'Boliwia', + 'BR' => 'Brazylia', 'BB' => 'Barbados', 'BN' => 'Brunei', 'BT' => 'Bhutan', 'BW' => 'Botswana', - 'CF' => 'Central African Republic', - 'CA' => 'Canada', - 'CH' => 'Switzerland', + 'CF' => 'Republika Środkowoafrykańska', + 'CA' => 'Kanada', + 'CH' => 'Szwajcaria', 'CL' => 'Chile', - 'CN' => 'China', - 'CI' => 'Ivory Coast', - 'CM' => 'Cameroon', + 'CN' => 'Chiny', + 'CI' => 'Wybrzeże Kości Słoniowej', + 'CM' => 'Kamerun', 'CD' => 'DR Congo', - 'CG' => 'Republic of the Congo', - 'CO' => 'Colombia', - 'KM' => 'Comoros', - 'CV' => 'Cape Verde', - 'CR' => 'Costa Rica', - 'CU' => 'Cuba', - 'CY' => 'Cyprus', - 'CZ' => 'Czechia', - 'DE' => 'Germany', - 'DJ' => 'Djibouti', + 'CG' => 'Republika Konga', + 'CO' => 'Kolumbia', + 'KM' => 'Komory', + 'CV' => 'Republika Zielonego Przylądka', + 'CR' => 'Kostaryka', + 'CU' => 'Kuba', + 'CY' => 'Cypr', + 'CZ' => 'Czechy', + 'DE' => 'Niemcy', + 'DJ' => 'Dżibuti', 'DM' => 'Dominica', - 'DK' => 'Denmark', - 'DO' => 'Dominican Republic', - 'DZ' => 'Algeria', - 'EC' => 'Ecuador', - 'EG' => 'Egypt', - 'ER' => 'Eritrea', - 'ES' => 'Spain', + 'DK' => 'Dania', + 'DO' => 'Republika Dominikańska', + 'DZ' => 'Algieria', + 'EC' => 'Ekwador', + 'EG' => 'Egipt', + 'ER' => 'Erytrea', + 'ES' => 'Hiszpania', 'EE' => 'Estonia', - 'ET' => 'Ethiopia', - 'FI' => 'Finland', - 'FJ' => 'Fiji', - 'FR' => 'France', - 'FM' => 'Micronesia', + 'ET' => 'Etiopia', + 'FI' => 'Finlandia', + 'FJ' => 'Fidżi', + 'FR' => 'Francja', + 'FM' => 'Mikronezja', 'GA' => 'Gabon', - 'GB' => 'United Kingdom', + 'GB' => 'Wielka Brytania', 'GE' => 'Georgia', 'GH' => 'Ghana', - 'GN' => 'Guinea', + 'GN' => 'Gwinea', 'GM' => 'Gambia', - 'GW' => 'Guinea-Bissau', - 'GQ' => 'Equatorial Guinea', - 'GR' => 'Greece', + 'GW' => 'Gwinea Bissau', + 'GQ' => 'Gwinea Równikowa', + 'GR' => 'Grecja', 'GD' => 'Grenada', - 'GT' => 'Guatemala', - 'GY' => 'Guyana', + 'GT' => 'Gwatemala', + 'GY' => 'Gujana', 'HN' => 'Honduras', - 'HR' => 'Croatia', + 'HR' => 'Chorwacja', 'HT' => 'Haiti', - 'HU' => 'Hungary', - 'ID' => 'Indonesia', - 'IN' => 'India', - 'IE' => 'Ireland', + 'HU' => 'Węgry', + 'ID' => 'Indonezja', + 'IN' => 'Indie', + 'IE' => 'Irlandia', 'IR' => 'Iran', - 'IQ' => 'Iraq', - 'IS' => 'Iceland', + 'IQ' => 'Irak', + 'IS' => 'Islandia', 'IL' => 'Israel', - 'IT' => 'Italy', - 'JM' => 'Jamaica', + 'IT' => 'Włochy', + 'JM' => 'Jamajka', 'JO' => 'Jordan', - 'JP' => 'Japan', - 'KZ' => 'Kazakhstan', - 'KE' => 'Kenya', - 'KG' => 'Kyrgyzstan', - 'KH' => 'Cambodia', + 'JP' => 'Japonia', + 'KZ' => 'Kazachstan', + 'KE' => 'Kenia', + 'KG' => 'Kirgistan', + 'KH' => 'Kambodża', 'KI' => 'Kiribati', - 'KN' => 'Saint Kitts and Nevis', - 'KR' => 'South Korea', - 'KW' => 'Kuwait', + 'KN' => 'Saint Kitts i Nevis', + 'KR' => 'Korea Południowa', + 'KW' => 'Kuwejt', 'LA' => 'Laos', - 'LB' => 'Lebanon', + 'LB' => 'Liban', 'LR' => 'Liberia', - 'LY' => 'Libya', + 'LY' => 'Libia', 'LC' => 'Saint Lucia', 'LI' => 'Liechtenstein', 'LK' => 'Sri Lanka', 'LS' => 'Lesotho', - 'LT' => 'Lithuania', - 'LU' => 'Luxembourg', - 'LV' => 'Latvia', - 'MA' => 'Morocco', + 'LT' => 'Litwa', + 'LU' => 'Luksemburg', + 'LV' => 'Łotwa', + 'MA' => 'Maroko', 'MC' => 'Monaco', - 'MD' => 'Moldova', - 'MG' => 'Madagascar', - 'MV' => 'Maldives', - 'MX' => 'Mexico', - 'MH' => 'Marshall Islands', + 'MD' => 'Mołdawia', + 'MG' => 'Madagaskar', + 'MV' => 'Malediwy', + 'MX' => 'Meksyk', + 'MH' => 'Wyspy Marshalla', 'MK' => 'Macedonia', 'ML' => 'Mali', 'MT' => 'Malta', - 'MM' => 'Myanmar', - 'ME' => 'Montenegro', + 'MM' => 'Birma', + 'ME' => 'Czarnogóra', 'MN' => 'Mongolia', - 'MZ' => 'Mozambique', - 'MR' => 'Mauritania', + 'MZ' => 'Mozambik', + 'MR' => 'Mauretania', 'MU' => 'Mauritius', 'MW' => 'Malawi', - 'MY' => 'Malaysia', + 'MY' => 'Malezja', 'NA' => 'Namibia', 'NE' => 'Niger', 'NG' => 'Nigeria', - 'NI' => 'Nicaragua', - 'NL' => 'Netherlands', - 'NO' => 'Norway', + 'NI' => 'Nikaragua', + 'NL' => 'Holandia', + 'NO' => 'Norwegia', 'NP' => 'Nepal', 'NR' => 'Nauru', - 'NZ' => 'New Zealand', + 'NZ' => 'Nowa Zelandia', 'OM' => 'Oman', 'PK' => 'Pakistan', 'PA' => 'Panama', 'PE' => 'Peru', - 'PH' => 'Philippines', + 'PH' => 'Filipiny', 'PW' => 'Palau', - 'PG' => 'Papua New Guinea', - 'PL' => 'Poland', - 'KP' => 'North Korea', - 'PT' => 'Portugal', - 'PY' => 'Paraguay', - 'QA' => 'Qatar', - 'RO' => 'Romania', - 'RU' => 'Russia', + 'PG' => 'Papua Nowa Gwinea', + 'PL' => 'Polska', + 'KP' => 'Korea Północna', + 'PT' => 'Portugalia', + 'PY' => 'Paragwaj', + 'QA' => 'Katar', + 'RO' => 'Rumunia', + 'RU' => 'Rosja', 'RW' => 'Rwanda', - 'SA' => 'Saudi Arabia', + 'SA' => 'Arabia Saudyjska', 'SD' => 'Sudan', 'SN' => 'Senegal', - 'SG' => 'Singapore', - 'SB' => 'Solomon Islands', + 'SG' => 'Singapur', + 'SB' => 'Wyspy Salomona', 'SL' => 'Sierra Leone', - 'SV' => 'El Salvador', + 'SV' => 'Salwador', 'SM' => 'San Marino', 'SO' => 'Somalia', 'RS' => 'Serbia', - 'SS' => 'South Sudan', - 'ST' => 'São Tomé and Príncipe', - 'SR' => 'Suriname', - 'SK' => 'Slovakia', - 'SI' => 'Slovenia', - 'SE' => 'Sweden', - 'SZ' => 'Swaziland', - 'SC' => 'Seychelles', + 'SS' => 'Sudan Południowy', + 'ST' => 'Wyspy Świętego Tomasza i Książęca', + 'SR' => 'Surinam', + 'SK' => 'Słowacja', + 'SI' => 'Słowenia', + 'SE' => 'Szwecja', + 'SZ' => 'Suazi', + 'SC' => 'Seszele', 'SY' => 'Syria', - 'TD' => 'Chad', + 'TD' => 'Czad', 'TG' => 'Togo', - 'TH' => 'Thailand', - 'TJ' => 'Tajikistan', + 'TH' => 'Tajlandia', + 'TJ' => 'Tadżykistan', 'TM' => 'Turkmenistan', - 'TL' => 'Timor-Leste', + 'TL' => 'Timor Wschodni', 'TO' => 'Tonga', - 'TT' => 'Trinidad and Tobago', - 'TN' => 'Tunisia', - 'TR' => 'Turkey', + 'TT' => 'Trynidad i Tobago', + 'TN' => 'Tunezja', + 'TR' => 'Turcja', 'TV' => 'Tuvalu', 'TZ' => 'Tanzania', 'UG' => 'Uganda', - 'UA' => 'Ukraine', - 'UY' => 'Uruguay', - 'US' => 'United States', + 'UA' => 'Ukraina', + 'UY' => 'Urugwaj', + 'US' => 'Stany Zjednoczone', 'UZ' => 'Uzbekistan', - 'VA' => 'Vatican City', - 'VC' => 'Saint Vincent and the Grenadines', - 'VE' => 'Venezuela', - 'VN' => 'Vietnam', + 'VA' => 'Watykan', + 'VC' => 'Saint Vincent i Grenadyny', + 'VE' => 'Wenezuela', + 'VN' => 'Wietnam', 'VU' => 'Vanuatu', 'WS' => 'Samoa', - 'YE' => 'Yemen', - 'ZA' => 'South Africa', + 'YE' => 'Jemen', + 'ZA' => 'Republika Południowej Afryki', 'ZM' => 'Zambia', 'ZW' => 'Zimbabwe', ]; diff --git a/app/config/locale/pl.php b/app/config/locale/pl.php index cbd1dd2f51..3c6ae708d4 100644 --- a/app/config/locale/pl.php +++ b/app/config/locale/pl.php @@ -1,20 +1,20 @@ '"The art of being wise is the art of knowing what to overlook."', // This is the line printed in the homepage and console 'view-source' + 'settings.inspire' => '"Sztuka bycia mądrym to sztuka wiedzieć, co przeoczyć."', // This is the line printed in the homepage and console 'view-source' 'settings.locale' => 'en', 'settings.direction' => 'ltr', // Service - Users - 'auth.emails.team' => '%s Team', - 'auth.emails.confirm.title' => 'Account Confirmation', + 'auth.emails.team' => 'Zespół %s', + 'auth.emails.confirm.title' => 'Potwierdzenie konta', 'auth.emails.confirm.body' => 'en.email.auth.confirm.tpl', - 'auth.emails.recovery.title' => 'Password Reset', + 'auth.emails.recovery.title' => 'Zresetowanie hasła', 'auth.emails.recovery.body' => 'en.email.auth.recovery.tpl', - 'auth.emails.invitation.title' => 'Invitation to %s Team at %s', + 'auth.emails.invitation.title' => 'Zaproszenie do zespołu %s - %s', 'auth.emails.invitation.body' => 'en.email.auth.invitation.tpl', - 'locale.country.unknown' => 'Unknown', + 'locale.country.unknown' => 'Nieznany', 'countries' => include 'en.countries.php', 'continents' => include 'en.continents.php', diff --git a/app/config/locale/templates/pl.email.auth.confirm.tpl b/app/config/locale/templates/pl.email.auth.confirm.tpl index 92078114e3..e46187999f 100644 --- a/app/config/locale/templates/pl.email.auth.confirm.tpl +++ b/app/config/locale/templates/pl.email.auth.confirm.tpl @@ -7,18 +7,18 @@
- Hello {{name}}, + Witaj {{name}},

- Follow this link to verify your email address. + Kliknij ten link, aby zweryfikować swój adres e-mail.
{{redirect}}

- If you didn’t ask to verify this address, you can ignore this message. + Jeśli nie prosiłeś o weryfikację tego adresu, możesz zignorować tę wiadomość.

- Thanks, + Dziękujemy,
- {{project}} team + zespół {{project}}
\ No newline at end of file diff --git a/app/config/locale/templates/pl.email.auth.invitation.tpl b/app/config/locale/templates/pl.email.auth.invitation.tpl index fda2bbcce0..d11586de75 100644 --- a/app/config/locale/templates/pl.email.auth.invitation.tpl +++ b/app/config/locale/templates/pl.email.auth.invitation.tpl @@ -7,21 +7,21 @@
- Hello, + Witaj,

- This mail was sent to you because {{owner}} wanted to invite you to become a team member at the {{team}} team over at {{project}}. + Ta wiadomość została do Ciebie wysłana, ponieważ {{owner}} chciałby zaprosić Cię do dołączenia do zespołu {{team}} w {{project}}.

- Follow this link to join the {{team}} team: + Kliknij ten link, aby dołączyć do zespołu {{team}}:
{{redirect}}

- If you are not interested, you can ignore this message. + Jeśli nie jesteś zainteresowany, możesz zignorować tę wiadomość.

- Thanks, + Dziękujemy,
- {{project}} team + zaspół {{project}}
diff --git a/app/config/locale/templates/pl.email.auth.recovery.tpl b/app/config/locale/templates/pl.email.auth.recovery.tpl index 7a6fa2fa60..78066ee064 100644 --- a/app/config/locale/templates/pl.email.auth.recovery.tpl +++ b/app/config/locale/templates/pl.email.auth.recovery.tpl @@ -7,18 +7,18 @@
- Hello {{name}}, + Witaj {{name}},

- Follow this link to reset your {{project}} password. + Kliknij ten link, aby zresetować hasło do {{project}}.
{{redirect}}

- If you didn’t ask to reset your password, you can ignore this message. + Jeśli nie prosiłeś o zresetowanie hasła, możesz zignorować tę wiadomość.

- Thanks, + Dziękujemy,
- {{project}} team + zaspół {{project}}
From 0422fe75a7d98039cf2612de4820060d5cdb2ac6 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 6 Oct 2019 02:15:28 +0530 Subject: [PATCH 112/135] feat: start vk oAuth --- src/Auth/OAuth/Apple.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Auth/OAuth/Apple.php b/src/Auth/OAuth/Apple.php index 2c9a99b8da..fbe4b65b1a 100644 --- a/src/Auth/OAuth/Apple.php +++ b/src/Auth/OAuth/Apple.php @@ -124,7 +124,7 @@ class Apple extends OAuth { if (empty($this->user)) { $headers[] = 'Authorization: Bearer '. urlencode($accessToken); - $user = $this->request('POST', 'https://api.dropboxapi.com/2/users/get_current_account', $headers); + $user = $this->request('POST', '', $headers); $this->user = json_decode($user, true); } From da9504a14c49fa5b2e70e3b7cbe172e157a41498 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 6 Oct 2019 02:17:28 +0530 Subject: [PATCH 113/135] chore: corrected apple Image size --- app/config/providers.php | 7 ++++++- public/images/oauth/apple.png | Bin 1683 -> 1360 bytes 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/config/providers.php b/app/config/providers.php index d4c05b9a9d..fe54486a03 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -57,7 +57,7 @@ return [ 'enabled' => true, ], 'apple' => [ - 'developers' => 'https://www.dropbox.com/developers/documentation', + 'developers' => 'https://developer.apple.com/', 'icon' => 'icon-apple', 'enabled' => false, ], @@ -66,4 +66,9 @@ return [ 'icon' => 'icon-amazon', 'enabled' => false, ], + 'amazon' => [ + 'developers' => 'https://www.dropbox.com/developers/documentation', + 'icon' => 'icon-amazon', + 'enabled' => false, + ], ]; diff --git a/public/images/oauth/apple.png b/public/images/oauth/apple.png index ca56e16bc8a523c01a7aef8ee98a37b1bf11b570..b0fdfd14f055970a22144a33cef8f0d79747b60d 100644 GIT binary patch literal 1360 zcmV-W1+V&vP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 nD=c47Wfx#nNBBRKwT Date: Sun, 6 Oct 2019 02:18:27 +0530 Subject: [PATCH 114/135] feat: added vk to providers --- app/config/providers.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/config/providers.php b/app/config/providers.php index fe54486a03..e268426287 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -66,9 +66,9 @@ return [ 'icon' => 'icon-amazon', 'enabled' => false, ], - 'amazon' => [ - 'developers' => 'https://www.dropbox.com/developers/documentation', - 'icon' => 'icon-amazon', + 'vk' => [ + 'developers' => 'https://vk.com/dev', + 'icon' => 'icon-vk', 'enabled' => false, ], ]; From ea2fc826372aa01603e95ea763bb5f21b6f012bf Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 6 Oct 2019 02:20:02 +0530 Subject: [PATCH 115/135] chore: updated amazon developers url --- app/config/providers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/providers.php b/app/config/providers.php index e268426287..5ebbf51651 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -62,7 +62,7 @@ return [ 'enabled' => false, ], 'amazon' => [ - 'developers' => 'https://www.dropbox.com/developers/documentation', + 'developers' => 'https://developer.amazon.com/apps-and-games/services-and-apis', 'icon' => 'icon-amazon', 'enabled' => false, ], From a375a82e42ed27ce3c09804b0bd7ca9085946636 Mon Sep 17 00:00:00 2001 From: Ahmed Karaman <20889958+ahmedkrmn@users.noreply.github.com> Date: Sat, 5 Oct 2019 23:21:32 +0200 Subject: [PATCH 116/135] Add Arabic locales --- app/config/locale/ar.continents.php | 11 + app/config/locale/ar.countries.php | 198 ++++++++++++++++++ app/config/locale/ar.php | 21 ++ .../templates/ar.email.auth.confirm.tpl | 24 +++ .../templates/ar.email.auth.invitation.tpl | 27 +++ .../templates/ar.email.auth.recovery.tpl | 24 +++ 6 files changed, 305 insertions(+) create mode 100644 app/config/locale/ar.continents.php create mode 100644 app/config/locale/ar.countries.php create mode 100644 app/config/locale/ar.php create mode 100644 app/config/locale/templates/ar.email.auth.confirm.tpl create mode 100644 app/config/locale/templates/ar.email.auth.invitation.tpl create mode 100644 app/config/locale/templates/ar.email.auth.recovery.tpl diff --git a/app/config/locale/ar.continents.php b/app/config/locale/ar.continents.php new file mode 100644 index 0000000000..8b1c3132f7 --- /dev/null +++ b/app/config/locale/ar.continents.php @@ -0,0 +1,11 @@ + 'أفريقيا', + 'AN' => 'القارة القطبية الجنوبية', + 'AS' => 'آسيا', + 'EU' => 'أوروبا', + 'NA' => 'امريكا الشمالية', + 'OC' => 'أوقيانوسيا', + 'SA' => 'امريكا الجنوبية', +]; diff --git a/app/config/locale/ar.countries.php b/app/config/locale/ar.countries.php new file mode 100644 index 0000000000..e5f1bb9cdc --- /dev/null +++ b/app/config/locale/ar.countries.php @@ -0,0 +1,198 @@ + 'أفغانستان', + 'AO' => 'أنغولا', + 'AL' => 'ألبانيا', + 'AD' => 'أندورا', + 'AE' => 'الإمارات العربية المتحدة', +    'AR' => 'الأرجنتين', +    'AM' => 'أرمينيا', +    'AG' => 'أنتيغوا وبربودا', +    'AU' => 'أستراليا', +    'AT' => 'النمسا', +    'AZ' => 'أذربيجان', +    'BI' => 'بوروندي', +    'BE' => 'بلجيكا', +    'BJ' => 'بنين', +    'BF' => 'بوركينا فاسو', +    'BD' => 'بنغلاديش', +    'BG' => 'بلغاريا', +    'BH' => 'البحرين', +    'BS' => 'جزر البهاما', +    'BA' => 'البوسنة والهرسك', +    'BY' => 'بيلاروسيا', +    'BZ' => 'بليز', +    'BO' => 'بوليفيا', +    'BR' => 'البرازيل', +    'BB' => 'بربادوس', +    'BN' => 'بروناي', +    'BT' => 'بوتان', +    'BW' => 'بوتسوانا', +    'CF' => 'جمهورية إفريقيا الوسطى', +    'CA' => 'كندا', +    'CH' => 'سويسرا', +    'CL' => 'تشيلي', +    'CN' => 'الصين', +    'CI' => 'ساحل العاج', +    'CM' => 'الكاميرون', +    'CD' => 'جمهورية الكونغو الديمقراطية', +    'CG' => 'جمهورية الكونغو', +    'CO' => 'كولومبيا', +    'KM' => 'جزر القمر', +    'CV' => 'الرأس الأخضر', +    'CR' => 'كوستاريكا', +    'CU' => 'كوبا', +    'CY' => 'قبرص', +    'CZ' => 'تشيكيا', +    'DE' => 'ألمانيا', +    'DJ' => 'جيبوتي', +    'DM' => 'دومينيكا', +    'DK' => 'الدنمارك', +    'DO' => 'جمهورية الدومينيكان', +    'DZ' => 'الجزائر', +    'EC' => 'إكوادور', +    'EG' => 'مصر', +    'ER' => 'إريتريا', +    'ES' => 'إسبانيا', +    'EE' => 'إستونيا', +    'ET' => 'إثيوبيا', +    'FI' => 'فنلندا', +    'FJ' => 'فيجي', +    'FR' => 'فرنسا', +    'FM' => 'ميكرونيزيا', +    'GA' => 'الغابون', +    'GB' => 'المملكة المتحدة', +    'GE' => 'جورجيا', +    'GH' => 'غانا', +    'GN' => 'غينيا', +    'GM' => 'غامبيا', +    'GW' => 'غينيا بيساو', +    'GQ' => 'غينيا الاستوائية', +    'GR' => 'اليونان', +    'GD' => 'غرينادا', +    'GT' => 'غواتيمالا', +    'GY' => 'غيانا', +    'HN' => 'هندوراس', +    'HR' => 'كرواتيا', +    'HT' => 'هايتي', +    'HU' => 'المجر', +    'ID' => 'إندونيسيا', +    'IN' => 'الهند', +    'IE' => 'أيرلندا', +    'IR' => 'إيران', +    'IQ' => 'العراق', +    'IS' => 'أيسلندا', +    'IL' => 'إسرائيل', +    'IT' => 'إيطاليا', +    'JM' => 'جامايكا', +    'JO' => 'الأردن', +    'JP' => 'اليابان', +    'KZ' => 'كازاخستان', +    'KE' => 'كينيا', +    'KG' => 'قيرغيزستان', +    'KH' => 'كمبوديا', +    'KI' => 'كيريباتي', +    'KN' => 'سانت كيتس ونيفيس', +    'KR' => 'كوريا الجنوبية', +    'KW' => 'الكويت', +    'LA' => 'لاوس', +    'LB' => 'لبنان', +    'LR' => 'ليبيريا', +    'LY' => 'ليبيا', +    'LC' => 'سانت لوسيا', +    'LI' => 'ليختنشتاين', +    'LK' => 'سري لانكا', +    'LS' => 'ليسوتو', +    'LT' => 'ليتوانيا', +    'LU' => 'لوكسمبورغ', +    'LV' => 'لاتفيا', +    'MA' => 'المغرب', +    'MC' => 'موناكو', +    'MD' => 'مولدوفا', +    'MG' => 'مدغشقر', +    'MV' => 'جزر المالديف', +    'MX' => 'المكسيك', +    'MH' => 'جزر مارشال', +    'MK' => 'مقدونيا', +    'ML' => 'مالي', +    'MT' => 'مالطا', +    'MM' => 'ميانمار', +    'ME' => 'الجبل الأسود', +    'MN' => 'منغوليا', +    'MZ' => 'موزمبيق', +    'MR' => 'موريتانيا', +    'MU' => 'موريشيوس', +    'MW' => 'ملاوي', +    'MY' => 'ماليزيا', +    'NA' => 'ناميبيا', +    'NE' => 'النيجر', +    'NG' => 'نيجيريا', +    'NI' => 'نيكاراغوا', +    'NL' => 'هولندا', +    'NO' => 'النرويج', +    'NP' => 'نيبال', +    'NR' => 'ناورو', +    'NZ' => 'نيوزيلندا', +    'OM' => 'عمان', +    'PK' => 'باكستان', +    'PA' => 'بنما', +    'PE' => 'بيرو', +    'PH' => 'الفلبين', +    'PW' => 'بالاو', +    'PG' => 'بابوا غينيا الجديدة', +    'PL' => 'بولندا', +    'KP' => 'كوريا الشمالية', +    'PT' => 'البرتغال', +    'PY' => 'باراجواي', +    'QA' => 'قطر', +    'RO' => 'رومانيا', +    'RU' => 'روسيا', +    'RW' => 'رواندا', +    'SA' => 'المملكة العربية السعودية', +    'SD' => 'السودان', +    'SN' => 'السنغال', +    'SG' => 'سنغافورة', +    'SB' => 'جزر سليمان', +    'SL' => 'سيراليون', +    'SV' => 'السلفادور', +    'SM' => 'سان مارينو', +    'SO' => 'الصومال', +    'RS' => 'صربيا', +    'SS' => 'جنوب السودان', +    'ST' => 'ساو تومي وبرينسيبي', +    'SR' => 'سورينام', +    'SK' => 'سلوفاكيا', +    'SI' => 'سلوفينيا', +    'SE' => 'السويد', +    'SZ' => 'سوازيلند', +    'SC' => 'سيشيل', +    'SY' => 'سوريا', +    'TD' => 'تشاد', +    'TG' => 'توغو', +    'TH' => 'تايلاند', +    'TJ' => 'طاجيكستان', +    'TM' => 'تركمانستان', +    'TL' => 'تيمور الشرقية', +    'TO' => 'تونجا', +    'TT' => 'ترينيداد وتوباغو', +    'TN' => 'تونس', +    'TR' => 'تركيا', +    'TV' => 'توفالو', +    'TZ' => 'تنزانيا', +    'UG' => 'أوغندا', +    'UA' => 'أوكرانيا', +    'UY' => 'أوروغواي', +    'UK' => 'الولايات المتحدة', +    'UZ' => 'أوزبكستان', +    'VA' => 'مدينة الفاتيكان', +    'VC' => 'سانت فنسنت وجزر غرينادين', +    'VE' => 'فنزويلا', +    'VN' => 'فيتنام', +    'VU' => 'فانواتو', +    'WS' => 'ساموا', +    'YE' => 'اليمن', +    'ZA' => 'جنوب إفريقيا', +    'ZM' => 'زامبيا', +    'ZW' => 'زيمبابوي', +]; diff --git a/app/config/locale/ar.php b/app/config/locale/ar.php new file mode 100644 index 0000000000..623df549d3 --- /dev/null +++ b/app/config/locale/ar.php @@ -0,0 +1,21 @@ + '"فن الحكمة هو فن معرفة ما يجب التغاضي عنه."', // This is the line printed in the homepage and console 'view-source' + 'settings.locale' => 'ar', + 'settings.direction' => 'rtl', + + // Service - Users + 'auth.emails.team' => 'فريق %s', + 'auth.emails.confirm.title' => 'تأكيد الحساب', + 'auth.emails.confirm.body' => 'ar.email.auth.confirm.tpl', + 'auth.emails.recovery.title' => 'إعادة تعيين كلمة المرور', + 'auth.emails.recovery.body' => 'ar.email.auth.recovery.tpl', + 'auth.emails.invitation.title' => 'دعوة لفريق %s في %s', + 'auth.emails.invitation.body' => 'ar.email.auth.invitation.tpl', + + 'locale.country.unknown' => 'مجهول', + + 'countries' => include 'ar.countries.php', + 'continents' => include 'ar.continents.php', +]; diff --git a/app/config/locale/templates/ar.email.auth.confirm.tpl b/app/config/locale/templates/ar.email.auth.confirm.tpl new file mode 100644 index 0000000000..8cd1929dd9 --- /dev/null +++ b/app/config/locale/templates/ar.email.auth.confirm.tpl @@ -0,0 +1,24 @@ + + +
+ مرحبا {{name}}, +
+
+ اتبع هذا الرابط للتحقق من عنوان بريدك الإلكتروني. +
+ {{redirect}} +
+
+ إذا لم تطلب التحقق من هذا العنوان، فيمكنك تجاهل هذه الرسالة. +
+
+ Thanks, +
+ فريق {{project}} +
\ No newline at end of file diff --git a/app/config/locale/templates/ar.email.auth.invitation.tpl b/app/config/locale/templates/ar.email.auth.invitation.tpl new file mode 100644 index 0000000000..fba4a731e3 --- /dev/null +++ b/app/config/locale/templates/ar.email.auth.invitation.tpl @@ -0,0 +1,27 @@ + + +
+ مرحبا، +
+
+ تم إرسال هذه الرسالة إليك لأن {{owner}} أراد دعوتك لتصبح عضوًا في فريق {{team}} في {{project}}. +
+
+ اتبع هذا الرابط للانضمام إلى فريق {{team}}: +
+ {{redirect}} +
+
+ إذا لم تكن مهتمًا، يمكنك تجاهل هذه الرسالة. +
+
+ شكرا، +
+ فريق {{project}} +
diff --git a/app/config/locale/templates/ar.email.auth.recovery.tpl b/app/config/locale/templates/ar.email.auth.recovery.tpl new file mode 100644 index 0000000000..06ca47f35e --- /dev/null +++ b/app/config/locale/templates/ar.email.auth.recovery.tpl @@ -0,0 +1,24 @@ + + +
+ مرحبا {{name}}، +
+
+ اتبع هذا الرابط لإعادة تعيين كلمة مرور {{project}}. +
+ {{redirect}} +
+
+ إذا لم تطلب إعادة تعيين كلمة المرور الخاصة بك، فيمكنك تجاهل هذه الرسالة. +
+
+ شكرا، +
+ فريق {{project}} +
From c9100004269b5ac2d8207d2cd260f66746489fb3 Mon Sep 17 00:00:00 2001 From: Ahmed Karaman <20889958+ahmedkrmn@users.noreply.github.com> Date: Sat, 5 Oct 2019 23:52:02 +0200 Subject: [PATCH 117/135] Add Arabic locales to app/init.php --- app/init.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/init.php b/app/init.php index 0a35bad743..acc5f51cfa 100644 --- a/app/init.php +++ b/app/init.php @@ -24,7 +24,7 @@ const APP_EMAIL_TEAM = 'team@'.APP_DOMAIN; const APP_EMAIL_SECURITY = 'security@'.APP_DOMAIN; const APP_USERAGENT = APP_NAME.'-Server/%s Please report abuse at '.APP_EMAIL_SECURITY; const APP_MODE_ADMIN = 'admin'; -const APP_LOCALES = ['cat', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'id', 'it', 'nl', 'no', 'pt-br', 'pt-pt', 'ro', 'tr', 'ua', 'zh-cn', 'zh-tw']; +const APP_LOCALES = ['ar', 'cat', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'id', 'it', 'nl', 'no', 'pt-br', 'pt-pt', 'ro', 'tr', 'ua', 'zh-cn', 'zh-tw']; const APP_PAGING_LIMIT = 15; const APP_VERSION_STABLE = '0.2.0'; @@ -129,6 +129,7 @@ $locale = $request->getParam('locale', $request->getHeader('X-Appwrite-Locale', Locale::$exceptions = false; +Locale::setLanguage('ar', include __DIR__.'/config/locale/ar.php'); Locale::setLanguage('cat', include __DIR__.'/config/locale/cat.php'); Locale::setLanguage('de', include __DIR__.'/config/locale/de.php'); Locale::setLanguage('en', include __DIR__.'/config/locale/en.php'); From 66f9ef70918dae2afb13eecd8e054ab6f64a87a8 Mon Sep 17 00:00:00 2001 From: Ahmed Karaman <20889958+ahmedkrmn@users.noreply.github.com> Date: Sun, 6 Oct 2019 01:44:24 +0200 Subject: [PATCH 118/135] Fix Parse error --- app/config/locale/ar.countries.php | 378 ++++++++++++++--------------- 1 file changed, 189 insertions(+), 189 deletions(-) diff --git a/app/config/locale/ar.countries.php b/app/config/locale/ar.countries.php index e5f1bb9cdc..a7f4a02228 100644 --- a/app/config/locale/ar.countries.php +++ b/app/config/locale/ar.countries.php @@ -6,193 +6,193 @@ return [ 'AL' => 'ألبانيا', 'AD' => 'أندورا', 'AE' => 'الإمارات العربية المتحدة', -    'AR' => 'الأرجنتين', -    'AM' => 'أرمينيا', -    'AG' => 'أنتيغوا وبربودا', -    'AU' => 'أستراليا', -    'AT' => 'النمسا', -    'AZ' => 'أذربيجان', -    'BI' => 'بوروندي', -    'BE' => 'بلجيكا', -    'BJ' => 'بنين', -    'BF' => 'بوركينا فاسو', -    'BD' => 'بنغلاديش', -    'BG' => 'بلغاريا', -    'BH' => 'البحرين', -    'BS' => 'جزر البهاما', -    'BA' => 'البوسنة والهرسك', -    'BY' => 'بيلاروسيا', -    'BZ' => 'بليز', -    'BO' => 'بوليفيا', -    'BR' => 'البرازيل', -    'BB' => 'بربادوس', -    'BN' => 'بروناي', -    'BT' => 'بوتان', -    'BW' => 'بوتسوانا', -    'CF' => 'جمهورية إفريقيا الوسطى', -    'CA' => 'كندا', -    'CH' => 'سويسرا', -    'CL' => 'تشيلي', -    'CN' => 'الصين', -    'CI' => 'ساحل العاج', -    'CM' => 'الكاميرون', -    'CD' => 'جمهورية الكونغو الديمقراطية', -    'CG' => 'جمهورية الكونغو', -    'CO' => 'كولومبيا', -    'KM' => 'جزر القمر', -    'CV' => 'الرأس الأخضر', -    'CR' => 'كوستاريكا', -    'CU' => 'كوبا', -    'CY' => 'قبرص', -    'CZ' => 'تشيكيا', -    'DE' => 'ألمانيا', -    'DJ' => 'جيبوتي', -    'DM' => 'دومينيكا', -    'DK' => 'الدنمارك', -    'DO' => 'جمهورية الدومينيكان', -    'DZ' => 'الجزائر', -    'EC' => 'إكوادور', -    'EG' => 'مصر', -    'ER' => 'إريتريا', -    'ES' => 'إسبانيا', -    'EE' => 'إستونيا', -    'ET' => 'إثيوبيا', -    'FI' => 'فنلندا', -    'FJ' => 'فيجي', -    'FR' => 'فرنسا', -    'FM' => 'ميكرونيزيا', -    'GA' => 'الغابون', -    'GB' => 'المملكة المتحدة', -    'GE' => 'جورجيا', -    'GH' => 'غانا', -    'GN' => 'غينيا', -    'GM' => 'غامبيا', -    'GW' => 'غينيا بيساو', -    'GQ' => 'غينيا الاستوائية', -    'GR' => 'اليونان', -    'GD' => 'غرينادا', -    'GT' => 'غواتيمالا', -    'GY' => 'غيانا', -    'HN' => 'هندوراس', -    'HR' => 'كرواتيا', -    'HT' => 'هايتي', -    'HU' => 'المجر', -    'ID' => 'إندونيسيا', -    'IN' => 'الهند', -    'IE' => 'أيرلندا', -    'IR' => 'إيران', -    'IQ' => 'العراق', -    'IS' => 'أيسلندا', -    'IL' => 'إسرائيل', -    'IT' => 'إيطاليا', -    'JM' => 'جامايكا', -    'JO' => 'الأردن', -    'JP' => 'اليابان', -    'KZ' => 'كازاخستان', -    'KE' => 'كينيا', -    'KG' => 'قيرغيزستان', -    'KH' => 'كمبوديا', -    'KI' => 'كيريباتي', -    'KN' => 'سانت كيتس ونيفيس', -    'KR' => 'كوريا الجنوبية', -    'KW' => 'الكويت', -    'LA' => 'لاوس', -    'LB' => 'لبنان', -    'LR' => 'ليبيريا', -    'LY' => 'ليبيا', -    'LC' => 'سانت لوسيا', -    'LI' => 'ليختنشتاين', -    'LK' => 'سري لانكا', -    'LS' => 'ليسوتو', -    'LT' => 'ليتوانيا', -    'LU' => 'لوكسمبورغ', -    'LV' => 'لاتفيا', -    'MA' => 'المغرب', -    'MC' => 'موناكو', -    'MD' => 'مولدوفا', -    'MG' => 'مدغشقر', -    'MV' => 'جزر المالديف', -    'MX' => 'المكسيك', -    'MH' => 'جزر مارشال', -    'MK' => 'مقدونيا', -    'ML' => 'مالي', -    'MT' => 'مالطا', -    'MM' => 'ميانمار', -    'ME' => 'الجبل الأسود', -    'MN' => 'منغوليا', -    'MZ' => 'موزمبيق', -    'MR' => 'موريتانيا', -    'MU' => 'موريشيوس', -    'MW' => 'ملاوي', -    'MY' => 'ماليزيا', -    'NA' => 'ناميبيا', -    'NE' => 'النيجر', -    'NG' => 'نيجيريا', -    'NI' => 'نيكاراغوا', -    'NL' => 'هولندا', -    'NO' => 'النرويج', -    'NP' => 'نيبال', -    'NR' => 'ناورو', -    'NZ' => 'نيوزيلندا', -    'OM' => 'عمان', -    'PK' => 'باكستان', -    'PA' => 'بنما', -    'PE' => 'بيرو', -    'PH' => 'الفلبين', -    'PW' => 'بالاو', -    'PG' => 'بابوا غينيا الجديدة', -    'PL' => 'بولندا', -    'KP' => 'كوريا الشمالية', -    'PT' => 'البرتغال', -    'PY' => 'باراجواي', -    'QA' => 'قطر', -    'RO' => 'رومانيا', -    'RU' => 'روسيا', -    'RW' => 'رواندا', -    'SA' => 'المملكة العربية السعودية', -    'SD' => 'السودان', -    'SN' => 'السنغال', -    'SG' => 'سنغافورة', -    'SB' => 'جزر سليمان', -    'SL' => 'سيراليون', -    'SV' => 'السلفادور', -    'SM' => 'سان مارينو', -    'SO' => 'الصومال', -    'RS' => 'صربيا', -    'SS' => 'جنوب السودان', -    'ST' => 'ساو تومي وبرينسيبي', -    'SR' => 'سورينام', -    'SK' => 'سلوفاكيا', -    'SI' => 'سلوفينيا', -    'SE' => 'السويد', -    'SZ' => 'سوازيلند', -    'SC' => 'سيشيل', -    'SY' => 'سوريا', -    'TD' => 'تشاد', -    'TG' => 'توغو', -    'TH' => 'تايلاند', -    'TJ' => 'طاجيكستان', -    'TM' => 'تركمانستان', -    'TL' => 'تيمور الشرقية', -    'TO' => 'تونجا', -    'TT' => 'ترينيداد وتوباغو', -    'TN' => 'تونس', -    'TR' => 'تركيا', -    'TV' => 'توفالو', -    'TZ' => 'تنزانيا', -    'UG' => 'أوغندا', -    'UA' => 'أوكرانيا', -    'UY' => 'أوروغواي', -    'UK' => 'الولايات المتحدة', -    'UZ' => 'أوزبكستان', -    'VA' => 'مدينة الفاتيكان', -    'VC' => 'سانت فنسنت وجزر غرينادين', -    'VE' => 'فنزويلا', -    'VN' => 'فيتنام', -    'VU' => 'فانواتو', -    'WS' => 'ساموا', -    'YE' => 'اليمن', -    'ZA' => 'جنوب إفريقيا', -    'ZM' => 'زامبيا', -    'ZW' => 'زيمبابوي', + 'AR' => 'الأرجنتين', + 'AM' => 'أرمينيا', + 'AG' => 'أنتيغوا وبربودا', + 'AU' => 'أستراليا', + 'AT' => 'النمسا', + 'AZ' => 'أذربيجان', + 'BI' => 'بوروندي', + 'BE' => 'بلجيكا', + 'BJ' => 'بنين', + 'BF' => 'بوركينا فاسو', + 'BD' => 'بنغلاديش', + 'BG' => 'بلغاريا', + 'BH' => 'البحرين', + 'BS' => 'جزر البهاما', + 'BA' => 'البوسنة والهرسك', + 'BY' => 'بيلاروسيا', + 'BZ' => 'بليز', + 'BO' => 'بوليفيا', + 'BR' => 'البرازيل', + 'BB' => 'بربادوس', + 'BN' => 'بروناي', + 'BT' => 'بوتان', + 'BW' => 'بوتسوانا', + 'CF' => 'جمهورية إفريقيا الوسطى', + 'CA' => 'كندا', + 'CH' => 'سويسرا', + 'CL' => 'تشيلي', + 'CN' => 'الصين', + 'CI' => 'ساحل العاج', + 'CM' => 'الكاميرون', + 'CD' => 'جمهورية الكونغو الديمقراطية', + 'CG' => 'جمهورية الكونغو', + 'CO' => 'كولومبيا', + 'KM' => 'جزر القمر', + 'CV' => 'الرأس الأخضر', + 'CR' => 'كوستاريكا', + 'CU' => 'كوبا', + 'CY' => 'قبرص', + 'CZ' => 'تشيكيا', + 'DE' => 'ألمانيا', + 'DJ' => 'جيبوتي', + 'DM' => 'دومينيكا', + 'DK' => 'الدنمارك', + 'DO' => 'جمهورية الدومينيكان', + 'DZ' => 'الجزائر', + 'EC' => 'إكوادور', + 'EG' => 'مصر', + 'ER' => 'إريتريا', + 'ES' => 'إسبانيا', + 'EE' => 'إستونيا', + 'ET' => 'إثيوبيا', + 'FI' => 'فنلندا', + 'FJ' => 'فيجي', + 'FR' => 'فرنسا', + 'FM' => 'ميكرونيزيا', + 'GA' => 'الغابون', + 'GB' => 'المملكة المتحدة', + 'GE' => 'جورجيا', + 'GH' => 'غانا', + 'GN' => 'غينيا', + 'GM' => 'غامبيا', + 'GW' => 'غينيا بيساو', + 'GQ' => 'غينيا الاستوائية', + 'GR' => 'اليونان', + 'GD' => 'غرينادا', + 'GT' => 'غواتيمالا', + 'GY' => 'غيانا', + 'HN' => 'هندوراس', + 'HR' => 'كرواتيا', + 'HT' => 'هايتي', + 'HU' => 'المجر', + 'ID' => 'إندونيسيا', + 'IN' => 'الهند', + 'IE' => 'أيرلندا', + 'IR' => 'إيران', + 'IQ' => 'العراق', + 'IS' => 'أيسلندا', + 'IL' => 'إسرائيل', + 'IT' => 'إيطاليا', + 'JM' => 'جامايكا', + 'JO' => 'الأردن', + 'JP' => 'اليابان', + 'KZ' => 'كازاخستان', + 'KE' => 'كينيا', + 'KG' => 'قيرغيزستان', + 'KH' => 'كمبوديا', + 'KI' => 'كيريباتي', + 'KN' => 'سانت كيتس ونيفيس', + 'KR' => 'كوريا الجنوبية', + 'KW' => 'الكويت', + 'LA' => 'لاوس', + 'LB' => 'لبنان', + 'LR' => 'ليبيريا', + 'LY' => 'ليبيا', + 'LC' => 'سانت لوسيا', + 'LI' => 'ليختنشتاين', + 'LK' => 'سري لانكا', + 'LS' => 'ليسوتو', + 'LT' => 'ليتوانيا', + 'LU' => 'لوكسمبورغ', + 'LV' => 'لاتفيا', + 'MA' => 'المغرب', + 'MC' => 'موناكو', + 'MD' => 'مولدوفا', + 'MG' => 'مدغشقر', + 'MV' => 'جزر المالديف', + 'MX' => 'المكسيك', + 'MH' => 'جزر مارشال', + 'MK' => 'مقدونيا', + 'ML' => 'مالي', + 'MT' => 'مالطا', + 'MM' => 'ميانمار', + 'ME' => 'الجبل الأسود', + 'MN' => 'منغوليا', + 'MZ' => 'موزمبيق', + 'MR' => 'موريتانيا', + 'MU' => 'موريشيوس', + 'MW' => 'ملاوي', + 'MY' => 'ماليزيا', + 'NA' => 'ناميبيا', + 'NE' => 'النيجر', + 'NG' => 'نيجيريا', + 'NI' => 'نيكاراغوا', + 'NL' => 'هولندا', + 'NO' => 'النرويج', + 'NP' => 'نيبال', + 'NR' => 'ناورو', + 'NZ' => 'نيوزيلندا', + 'OM' => 'عمان', + 'PK' => 'باكستان', + 'PA' => 'بنما', + 'PE' => 'بيرو', + 'PH' => 'الفلبين', + 'PW' => 'بالاو', + 'PG' => 'بابوا غينيا الجديدة', + 'PL' => 'بولندا', + 'KP' => 'كوريا الشمالية', + 'PT' => 'البرتغال', + 'PY' => 'باراجواي', + 'QA' => 'قطر', + 'RO' => 'رومانيا', + 'RU' => 'روسيا', + 'RW' => 'رواندا', + 'SA' => 'المملكة العربية السعودية', + 'SD' => 'السودان', + 'SN' => 'السنغال', + 'SG' => 'سنغافورة', + 'SB' => 'جزر سليمان', + 'SL' => 'سيراليون', + 'SV' => 'السلفادور', + 'SM' => 'سان مارينو', + 'SO' => 'الصومال', + 'RS' => 'صربيا', + 'SS' => 'جنوب السودان', + 'ST' => 'ساو تومي وبرينسيبي', + 'SR' => 'سورينام', + 'SK' => 'سلوفاكيا', + 'SI' => 'سلوفينيا', + 'SE' => 'السويد', + 'SZ' => 'سوازيلند', + 'SC' => 'سيشيل', + 'SY' => 'سوريا', + 'TD' => 'تشاد', + 'TG' => 'توغو', + 'TH' => 'تايلاند', + 'TJ' => 'طاجيكستان', + 'TM' => 'تركمانستان', + 'TL' => 'تيمور الشرقية', + 'TO' => 'تونجا', + 'TT' => 'ترينيداد وتوباغو', + 'TN' => 'تونس', + 'TR' => 'تركيا', + 'TV' => 'توفالو', + 'TZ' => 'تنزانيا', + 'UG' => 'أوغندا', + 'UA' => 'أوكرانيا', + 'UY' => 'أوروغواي', + 'UK' => 'الولايات المتحدة', + 'UZ' => 'أوزبكستان', + 'VA' => 'مدينة الفاتيكان', + 'VC' => 'سانت فنسنت وجزر غرينادين', + 'VE' => 'فنزويلا', + 'VN' => 'فيتنام', + 'VU' => 'فانواتو', + 'WS' => 'ساموا', + 'YE' => 'اليمن', + 'ZA' => 'جنوب إفريقيا', + 'ZM' => 'زامبيا', + 'ZW' => 'زيمبابوي', ]; From 4a85382da4ec98b67630950778a3edb18262b2ac Mon Sep 17 00:00:00 2001 From: stvmachine Date: Sun, 6 Oct 2019 14:28:03 +1100 Subject: [PATCH 119/135] Update es.email.auth.confirm.tpl The original translation doesn't include the punctuation on that way. --- app/config/locale/templates/es.email.auth.confirm.tpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/templates/es.email.auth.confirm.tpl b/app/config/locale/templates/es.email.auth.confirm.tpl index 3bb7e97b62..a5b9235be8 100644 --- a/app/config/locale/templates/es.email.auth.confirm.tpl +++ b/app/config/locale/templates/es.email.auth.confirm.tpl @@ -10,7 +10,7 @@ Hola {{name}},

- Sigue este enlace para verificar tu dirección de correo: + Sigue este enlace para verificar tu dirección de correo.
{{redirect}}
@@ -21,4 +21,4 @@ Gracias,
Equipo {{project}} - \ No newline at end of file + From d1735407dec405da25020b6ece38279aa70a12ca Mon Sep 17 00:00:00 2001 From: stvmachine Date: Sun, 6 Oct 2019 14:33:55 +1100 Subject: [PATCH 120/135] Update es.php On Spanish make more senses: "Team of" + team_name. --- app/config/locale/es.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/es.php b/app/config/locale/es.php index 0a56743689..8c337051f8 100644 --- a/app/config/locale/es.php +++ b/app/config/locale/es.php @@ -6,7 +6,7 @@ return [ 'settings.direction' => 'ltr', // Service - Users - 'auth.emails.team' => '%s Equipo', + 'auth.emails.team' => 'Equipo de %s', 'auth.emails.confirm.title' => 'Confirmación de la cuenta', 'auth.emails.confirm.body' => 'es.email.auth.confirm.tpl', 'auth.emails.recovery.title' => 'Reestablecer contraseña', From 37240777e07e9008a206475e8961dc1d88824c2d Mon Sep 17 00:00:00 2001 From: stvmachine Date: Sun, 6 Oct 2019 14:53:06 +1100 Subject: [PATCH 121/135] Update es.countries.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Typo errors related to accentuation: - Irán: https://es.wikipedia.org/wiki/Ir%C3%A1n - Malí: https://es.wikipedia.org/wiki/Mal%C3%AD Is more widely accepted: - `República Checa` than `Chequia`: https://es.wikipedia.org/wiki/Rep%C3%BAblica_Checa --- app/config/locale/es.countries.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/config/locale/es.countries.php b/app/config/locale/es.countries.php index a0c11ae5c6..18fe488c17 100644 --- a/app/config/locale/es.countries.php +++ b/app/config/locale/es.countries.php @@ -37,14 +37,14 @@ return [ 'CI' => 'Costa de Marfil', 'CM' => 'Camerún', 'CD' => 'República Democrática del Congo', - 'CG' => 'República del congo', + 'CG' => 'República del Congo', 'CO' => 'Colombia', 'KM' => 'Comoras', 'CV' => 'Cabo Verde', 'CR' => 'Costa Rica', 'CU' => 'Cuba', 'CY' => 'Chipre', - 'CZ' => 'Chequia', + 'CZ' => 'República Checa', 'DE' => 'Alemania', 'DJ' => 'Yibuti', 'DM' => 'Dominica', @@ -80,7 +80,7 @@ return [ 'ID' => 'Indonesia', 'IN' => 'India', 'IE' => 'Irlanda', - 'IR' => 'Iran', + 'IR' => 'Irán', 'IQ' => 'Irak', 'IS' => 'Islandia', 'IL' => 'Israel', @@ -115,7 +115,7 @@ return [ 'MX' => 'Mexico', 'MH' => 'Islas Marshall', 'MK' => 'Macedonia', - 'ML' => 'Mali', + 'ML' => 'Malí', 'MT' => 'Malta', 'MM' => 'Myanmar', 'ME' => 'Montenegro', From 99dd990a6c8634d522bf84949690f1cc07a1dc98 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 6 Oct 2019 16:30:05 +0530 Subject: [PATCH 122/135] feat: vk OAuth Done --- app/config/providers.php | 2 +- src/Auth/OAuth/Vk.php | 154 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 src/Auth/OAuth/Vk.php diff --git a/app/config/providers.php b/app/config/providers.php index 5ebbf51651..444519ba26 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -69,6 +69,6 @@ return [ 'vk' => [ 'developers' => 'https://vk.com/dev', 'icon' => 'icon-vk', - 'enabled' => false, + 'enabled' => true, ], ]; diff --git a/src/Auth/OAuth/Vk.php b/src/Auth/OAuth/Vk.php new file mode 100644 index 0000000000..46f2742ac1 --- /dev/null +++ b/src/Auth/OAuth/Vk.php @@ -0,0 +1,154 @@ +appID). + '&redirect_uri='.urlencode($this->callback). + '&response_type=code'. + '&state='.urlencode(json_encode($this->state)). + '&v='.urlencode($this->version). + '&scope=openid+email'; + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code): string + { + + $headers[] = 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8'; + $accessToken = $this->request( + 'POST', + 'https://oauth.vk.com/access_token?', + $headers, + 'code=' . urlencode($code) . + '&client_id=' . urlencode($this->appID) . + '&client_secret=' . urlencode($this->appSecret). + '&redirect_uri='.urlencode($this->callback) + ); + $accessToken = json_decode($accessToken, true); + + if(isset($accessToken['email'])){ + $this->user['email'] = $accessToken['email']; + } + + if(isset($accessToken['user_id'])){ + $this->user['user_id'] = $accessToken['user_id']; + } + + if (isset($accessToken['access_token'])) { + return $accessToken['access_token']; + } + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserID(string $accessToken): string + { + + $user = $this->getUser($accessToken); + + if (isset($user['user_id'])) { + return $user['user_id']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken): string + { + + $user = $this->getUser($accessToken); + + if (isset($user['email'])) { + return $user['email']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['name'])) { + return $user['name']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + if (empty($this->user['name'])) { + $user = $this->request( + 'GET', + 'https://api.vk.com/method/users.get?'. + 'v='.urlencode($this->version). + '&fields=id,name,email,first_name,last_name'. + '&access_token='.urlencode($accessToken) + ); + + $user = json_decode($user, true); + $this->user['name'] = $user['response'][0]['first_name'] ." ".$user['response'][0]['last_name']; + + } + return $this->user; + } +} From cb0ca885c1cb8e51bd07483e72cf9136bd358a91 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 6 Oct 2019 16:31:34 +0530 Subject: [PATCH 123/135] chore: lint fix --- src/Auth/OAuth/Vk.php | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/Auth/OAuth/Vk.php b/src/Auth/OAuth/Vk.php index 46f2742ac1..ad860aff84 100644 --- a/src/Auth/OAuth/Vk.php +++ b/src/Auth/OAuth/Vk.php @@ -40,7 +40,7 @@ class Vk extends OAuth 'client_id='.urlencode($this->appID). '&redirect_uri='.urlencode($this->callback). '&response_type=code'. - '&state='.urlencode(json_encode($this->state)). + '&state='.urlencode(json_encode($this->state)). '&v='.urlencode($this->version). '&scope=openid+email'; } @@ -52,7 +52,6 @@ class Vk extends OAuth */ public function getAccessToken(string $code): string { - $headers[] = 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8'; $accessToken = $this->request( 'POST', @@ -65,11 +64,11 @@ class Vk extends OAuth ); $accessToken = json_decode($accessToken, true); - if(isset($accessToken['email'])){ + if (isset($accessToken['email'])) { $this->user['email'] = $accessToken['email']; } - if(isset($accessToken['user_id'])){ + if (isset($accessToken['user_id'])) { $this->user['user_id'] = $accessToken['user_id']; } @@ -86,8 +85,7 @@ class Vk extends OAuth */ public function getUserID(string $accessToken): string { - - $user = $this->getUser($accessToken); + $user = $this->getUser($accessToken); if (isset($user['user_id'])) { return $user['user_id']; @@ -103,8 +101,7 @@ class Vk extends OAuth */ public function getUserEmail(string $accessToken): string { - - $user = $this->getUser($accessToken); + $user = $this->getUser($accessToken); if (isset($user['email'])) { return $user['email']; @@ -138,7 +135,7 @@ class Vk extends OAuth { if (empty($this->user['name'])) { $user = $this->request( - 'GET', + 'GET', 'https://api.vk.com/method/users.get?'. 'v='.urlencode($this->version). '&fields=id,name,email,first_name,last_name'. @@ -147,7 +144,6 @@ class Vk extends OAuth $user = json_decode($user, true); $this->user['name'] = $user['response'][0]['first_name'] ." ".$user['response'][0]['last_name']; - } return $this->user; } From 8a200a409ed9dc09200687b1d982d0e26a4a3c7f Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 6 Oct 2019 17:27:39 +0530 Subject: [PATCH 124/135] chore: added vk icon --- public/images/oauth/vk.png | Bin 0 -> 3163 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/oauth/vk.png diff --git a/public/images/oauth/vk.png b/public/images/oauth/vk.png new file mode 100644 index 0000000000000000000000000000000000000000..481303ab7cd4e3081831a63ff6629799896a1e6b GIT binary patch literal 3163 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 Date: Sun, 6 Oct 2019 18:26:44 +0530 Subject: [PATCH 125/135] feat: implemented abstract method parseState --- app/config/providers.php | 2 +- app/controllers/auth.php | 36 ++++++++++++++++++------------------ src/Auth/OAuth.php | 13 +++++++++++++ src/Auth/OAuth/Amazon.php | 10 ++++++++++ 4 files changed, 42 insertions(+), 19 deletions(-) diff --git a/app/config/providers.php b/app/config/providers.php index 444519ba26..140dbeaf6f 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -64,7 +64,7 @@ return [ 'amazon' => [ 'developers' => 'https://developer.amazon.com/apps-and-games/services-and-apis', 'icon' => 'icon-amazon', - 'enabled' => false, + 'enabled' => true, ], 'vk' => [ 'developers' => 'https://vk.com/dev', diff --git a/app/controllers/auth.php b/app/controllers/auth.php index a904c1abd6..849f783113 100644 --- a/app/controllers/auth.php +++ b/app/controllers/auth.php @@ -733,24 +733,6 @@ $utopia->get('/v1/auth/oauth/:provider/redirect') // Uncomment this while testing amazon oAuth // $state = html_entity_decode($state); - if (!empty($state)) { - try { - $state = array_merge($defaultState, json_decode($state, true)); - } catch (\Exception $exception) { - throw new Exception('Failed to parse login state params as passed from OAuth provider'); - } - } else { - $state = $defaultState; - } - - if (!$validateURL->isValid($state['success'])) { - throw new Exception('Invalid redirect URL for success login', 400); - } - - if (!empty($state['failure']) && !$validateURL->isValid($state['failure'])) { - throw new Exception('Invalid redirect URL for failure login', 400); - } - $appId = $project->getAttribute('usersOauth'.ucfirst($provider).'Appid', ''); $appSecret = $project->getAttribute('usersOauth'.ucfirst($provider).'Secret', '{}'); @@ -769,6 +751,24 @@ $utopia->get('/v1/auth/oauth/:provider/redirect') $oauth = new $classname($appId, $appSecret, $callback); + if (!empty($state)) { + try { + $state = array_merge($defaultState, $oauth->parseState($state)); + } catch (\Exception $exception) { + throw new Exception('Failed to parse login state params as passed from OAuth provider'); + } + } else { + $state = $defaultState; + } + + if (!$validateURL->isValid($state['success'])) { + throw new Exception('Invalid redirect URL for success login', 400); + } + + if (!empty($state['failure']) && !$validateURL->isValid($state['failure'])) { + throw new Exception('Invalid redirect URL for failure login', 400); + } + $accessToken = $oauth->getAccessToken($code); if (empty($accessToken)) { diff --git a/src/Auth/OAuth.php b/src/Auth/OAuth.php index 70d7f448cf..cbae4638e4 100644 --- a/src/Auth/OAuth.php +++ b/src/Auth/OAuth.php @@ -78,6 +78,19 @@ abstract class OAuth */ abstract public function getUserName(string $accessToken):string; + // The parseState function was designed specifically for Amazon OAuth Adapter to override. + // The response from Amazon is html encoded and hence it needs to be html_decoded before + // json_decoding + + /** + * @param $state + * + * @return json + */ + public function parseState(string $state) { + return json_decode($state, true); + } + /** * @param string $method * @param string $url diff --git a/src/Auth/OAuth/Amazon.php b/src/Auth/OAuth/Amazon.php index d9cf84e73f..95744e9ba3 100644 --- a/src/Auth/OAuth/Amazon.php +++ b/src/Auth/OAuth/Amazon.php @@ -23,6 +23,16 @@ class Amazon extends OAuth return 'amazon'; } + /** + * @param $state + * + * @return json + */ + public function parseState(string $state) { + return json_decode(html_entity_decode($state), true); + } + + /** * @return string */ From d2ebafb23749b52c21c079d89d01b7d3787d44b2 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 6 Oct 2019 18:28:01 +0530 Subject: [PATCH 126/135] chore: lint fix --- src/Auth/OAuth.php | 5 +++-- src/Auth/OAuth/Amazon.php | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Auth/OAuth.php b/src/Auth/OAuth.php index cbae4638e4..a96ebb7a68 100644 --- a/src/Auth/OAuth.php +++ b/src/Auth/OAuth.php @@ -79,7 +79,7 @@ abstract class OAuth abstract public function getUserName(string $accessToken):string; // The parseState function was designed specifically for Amazon OAuth Adapter to override. - // The response from Amazon is html encoded and hence it needs to be html_decoded before + // The response from Amazon is html encoded and hence it needs to be html_decoded before // json_decoding /** @@ -87,7 +87,8 @@ abstract class OAuth * * @return json */ - public function parseState(string $state) { + public function parseState(string $state) + { return json_decode($state, true); } diff --git a/src/Auth/OAuth/Amazon.php b/src/Auth/OAuth/Amazon.php index 95744e9ba3..71bb8aaee6 100644 --- a/src/Auth/OAuth/Amazon.php +++ b/src/Auth/OAuth/Amazon.php @@ -28,7 +28,8 @@ class Amazon extends OAuth * * @return json */ - public function parseState(string $state) { + public function parseState(string $state) + { return json_decode(html_entity_decode($state), true); } From f2139529ddebd2d5c04af9ac7d88e1122e3d2cd6 Mon Sep 17 00:00:00 2001 From: wenzdey <56051809+wenzdey@users.noreply.github.com> Date: Sun, 6 Oct 2019 12:33:42 -0500 Subject: [PATCH 127/135] Updated getcomposer url to supported secure link --- app/sdks/php/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/sdks/php/README.md b/app/sdks/php/README.md index 13c7005082..50f218e0df 100644 --- a/app/sdks/php/README.md +++ b/app/sdks/php/README.md @@ -13,7 +13,7 @@ Appwrite backend as a service cuts up to 70% of the time and costs required for ## Installation -To install via [Composer](http://getcomposer.org/): +To install via [Composer](https://getcomposer.org/): ```bash composer require appwrite/appwrite @@ -21,4 +21,4 @@ composer require appwrite/appwrite ## License -Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file +Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. From 4e155bbcc3abcb8a08e095689ea5ffb3cb0e1dc9 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Sun, 6 Oct 2019 20:38:55 +0300 Subject: [PATCH 128/135] Updated Changelog --- CHANGES.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3203c99063..3d8b3d7729 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,12 +3,13 @@ ## Planned Issues * Added 7 new locales for locale service and email templates (af, cz, hu, lt, no, ru, si, sv, ta, vi, zh-cn, zh-tw) -* New users service routes to allow updates pref, email and name update +* New users service routes to allow updates pref and name update * 2 stage Docker build * New database rule validation options * Update docs example with auth info * Limit HTTP origin check only to browser integrations * Allow electron apps to not pass origin header +* New OAuth adapters (Amazon, Dropbox, Microsoft, Slack, VK) # Version 0.2.0 (PRE-RELEASE) @@ -17,7 +18,7 @@ * Added option to limit access to the Appwrite console * Added option to disable abuse check and rate limits * Added input field with the server API endpoint for easy access -* Added new OAuth providers for Google and GitLab +* Added new OAuth providers for Google, Bitbucket and GitLab * Added 15 new locales for locale service and email templates (cat, de, es, fi, fr, gr, hi, id, it, nl, pt-br, pt-pt, ro, tr, ua) * Improved test coverage for the project and synced DEV & CI environments settings From 8a9990787e81d9fabb19dedcc29beeba003a9207 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Sun, 6 Oct 2019 21:04:13 +0300 Subject: [PATCH 129/135] Updated locale settings --- CHANGES.md | 2 +- app/init.php | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3d8b3d7729..3f97b37063 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,7 @@ ## Planned Issues -* Added 7 new locales for locale service and email templates (af, cz, hu, lt, no, ru, si, sv, ta, vi, zh-cn, zh-tw) +* Added 7 new locales for locale service and email templates (af, ar, cz, hu, lt, no, ru, si, sv, ta, vi, zh-cn, zh-tw) * New users service routes to allow updates pref and name update * 2 stage Docker build * New database rule validation options diff --git a/app/init.php b/app/init.php index acc5f51cfa..43b8b0f68f 100644 --- a/app/init.php +++ b/app/init.php @@ -24,7 +24,7 @@ const APP_EMAIL_TEAM = 'team@'.APP_DOMAIN; const APP_EMAIL_SECURITY = 'security@'.APP_DOMAIN; const APP_USERAGENT = APP_NAME.'-Server/%s Please report abuse at '.APP_EMAIL_SECURITY; const APP_MODE_ADMIN = 'admin'; -const APP_LOCALES = ['ar', 'cat', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'id', 'it', 'nl', 'no', 'pt-br', 'pt-pt', 'ro', 'tr', 'ua', 'zh-cn', 'zh-tw']; +const APP_LOCALES = ['af', 'ar', 'cat', 'cz', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'hu', 'id', 'it', 'lt', 'nl', 'no', 'pl', 'pt-br', 'pt-pt', 'ro', 'ru', 'si', 'sv', 'ta', 'tr', 'ua', 'vi', 'zh-cn', 'zh-tw']; const APP_PAGING_LIMIT = 15; const APP_VERSION_STABLE = '0.2.0'; @@ -129,8 +129,10 @@ $locale = $request->getParam('locale', $request->getHeader('X-Appwrite-Locale', Locale::$exceptions = false; +Locale::setLanguage('af', include __DIR__.'/config/locale/af.php'); Locale::setLanguage('ar', include __DIR__.'/config/locale/ar.php'); Locale::setLanguage('cat', include __DIR__.'/config/locale/cat.php'); +Locale::setLanguage('cz', include __DIR__.'/config/locale/cz.php'); Locale::setLanguage('de', include __DIR__.'/config/locale/de.php'); Locale::setLanguage('en', include __DIR__.'/config/locale/en.php'); Locale::setLanguage('es', include __DIR__.'/config/locale/es.php'); @@ -139,17 +141,23 @@ Locale::setLanguage('fr', include __DIR__.'/config/locale/fr.php'); Locale::setLanguage('gr', include __DIR__.'/config/locale/gr.php'); Locale::setLanguage('he', include __DIR__.'/config/locale/he.php'); Locale::setLanguage('hi', include __DIR__.'/config/locale/hi.php'); +Locale::setLanguage('hu', include __DIR__.'/config/locale/hu.php'); Locale::setLanguage('id', include __DIR__.'/config/locale/id.php'); Locale::setLanguage('it', include __DIR__.'/config/locale/it.php'); +Locale::setLanguage('lt', include __DIR__.'/config/locale/lt.php'); Locale::setLanguage('nl', include __DIR__.'/config/locale/nl.php'); -//Locale::setLanguage('no', include __DIR__.'/config/locale/no.php'); +Locale::setLanguage('no', include __DIR__.'/config/locale/no.php'); +Locale::setLanguage('pl', include __DIR__.'/config/locale/pl.php'); Locale::setLanguage('pt-br', include __DIR__.'/config/locale/pt-br.php'); Locale::setLanguage('pt-pt', include __DIR__.'/config/locale/pt-pt.php'); Locale::setLanguage('ro', include __DIR__.'/config/locale/ro.php'); Locale::setLanguage('ru', include __DIR__ . '/config/locale/ru.php'); +Locale::setLanguage('si', include __DIR__ . '/config/locale/si.php'); +Locale::setLanguage('sv', include __DIR__ . '/config/locale/sv.php'); +Locale::setLanguage('ta', include __DIR__ . '/config/locale/ta.php'); Locale::setLanguage('tr', include __DIR__.'/config/locale/tr.php'); Locale::setLanguage('ua', include __DIR__.'/config/locale/ua.php'); -Locale::setLanguage('si', include __DIR__ . '/config/locale/si.php'); +Locale::setLanguage('vi', include __DIR__.'/config/locale/vi.php'); Locale::setLanguage('zh-cn', include __DIR__.'/config/locale/zh-cn.php'); Locale::setLanguage('zh-tw', include __DIR__.'/config/locale/zh-tw.php'); From 2c08003de1f9ab175b70ef6cf2e044f28d192c77 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Sun, 6 Oct 2019 21:26:34 +0300 Subject: [PATCH 130/135] Fixed encoding --- app/config/locale/lt.countries.php | 371 +++++++++++++++-------------- app/init.php | 4 +- 2 files changed, 189 insertions(+), 186 deletions(-) diff --git a/app/config/locale/lt.countries.php b/app/config/locale/lt.countries.php index 4a80d3f129..b34622c071 100644 --- a/app/config/locale/lt.countries.php +++ b/app/config/locale/lt.countries.php @@ -1,4 +1,5 @@ 'Afganistanas', 'AO' => 'Angola', @@ -9,189 +10,189 @@ return [ 'AM' => 'Armėnija', 'AG' => 'Antigva ir Barbuda', 'AU' => 'Australija', -    'AT' => 'Austrija', -    'AZ' => 'Azerbaidžanas', -    'BI' => 'Burundi', -    'BE' => 'Belgija', -    'BJ' => 'Beninas', -    'BF' => 'Burkina Faso', -    'BD' => 'Bangladešas', -    'BG' => 'Bulgarija', -    'BH' => 'Bahreinas', -    'BS' => 'Bahamai', -    'BA' => 'Bosnija ir Hercegovina', -    'BY' => 'Baltarusija', -    'BZ' => 'Baileys', -    'BO' => 'Bolivija', -    'BR' => 'Brazilija', -    'BB' => 'Barbadosas', -    'BN' => 'Brunėjus', -    'BT' => 'Butanas', -    'BW' => 'Botsvana', -    'CF' => 'Centrinės Afrikos Respublika', -    'CA' => 'Kanada', -    'CH' => 'Šveicarija', -    'CL' => 'Čilė', -    'CN' => 'Kinija', -    'CI' => 'Dramblio Kaulo Krantas', -    'CM' => 'Kamerūnas', -    'CD' => 'Kongo Demokratinė Respublika', -    'CG' => 'Kongo Respublika', -    'CO' => 'Kolumbija', -    'KM' => 'Komorai', -    'CV' => 'Žaliasis Kyšulys', -    'CR' => 'Kosta Rika', -    'CU' => 'Kuba', -    'CY' => 'Kipras', -    'CZ' => 'Čekija', -    'DE' => 'Vokietija', -    'DJ' => 'Džibutis', -    'DM' => 'Dominika', -    'DK' => 'Danija', -    'DO' => 'Dominikos Respublika', -    'DZ' => 'Alžyras', -    'EC' => 'Ekvadoras', -    'EG' => 'Egiptas', -    'ER' => 'Eritrėja', -    'ES' => 'Ispanija', -    'EE' => 'Estija', -    'ET' => 'Etiopija', -    'FI' => 'Suomija', -    'FJ' => 'Fidžis', -    'FR' => 'Prancūzija', -    'FM' => 'Mikronezija', -    'GA' => 'Gabonas', -    'GB' => 'Jungtinė Karalystė', -    'GE' => 'Gruzija', -    'GH' => 'Gana', -    'GN' => 'Gvinėja', -    'GM' => 'Gambija', -    'GW' => 'Bisau Gvinėja', -    'GQ' => 'Pusiaujo Gvinėja', -    'GR' => 'Graikija', -    'GD' => 'Grenada', -    'GT' => 'Gvatemala', -    'GY' => 'Gajana', -    'HN' => 'Hondūras', -    'HR' => 'Kroatija', -    'HT' => 'Haitis', -    'HU' => 'Vengrija', -    'ID' => 'Indonezija', -    'IN' => 'Indija', -    'IE' => 'Airija', -    'IR' => 'Iranas', -    'IQ' => 'Irakas', -    'IS' => 'Islandija', -    'IL' => 'Izraelis', -    'IT' => 'Italija', -    'JM' => 'Jamaika', -    'JO' => 'Jordanija', -    'JP' => 'Japonija', -    'KZ' => 'Kazachstanas', -    'KE' => 'Kenija', -    'KG' => 'Kirgizija', -    'KH' => 'Kambodža', -    'KI' => 'Kiribati', -    'KN' => 'Sent Kitsas ir Nevis', -    'KR' => 'Pietų Korėja', -    'KW' => 'Kuveitas', -    'LA' => 'Laosas', -    'LB' => 'Libanas', -    'LR' => 'Liberija', -    'LY' => 'Libija', -    'LC' => 'Sent Lusija', -    'LI' => 'Lichtenšteinas', -    'LK' => 'Šri Lanka', -    'LS' => 'Lesotas', -    'LT' => 'Lietuva', -    'LU' => 'Liuksemburgas', -    'LV' => 'Latvija', -    'MA' => 'Marokas', -    'MC' => 'Monaco', -    'MD' => 'Moldova', -    'MG' => 'Madagaskaras', -    'MV' => 'Maldyvai', -    'MX' => 'Meksika', -    'MH' => 'Maršalo salos', -    'MK' => 'Makedonija', -    'ML' => 'Malis', -    'MT' => 'Malta', -    'MM' => 'Mianmaras', -    'ME' => 'Juodkalnija', -    'MN' => 'Mongolija', -    'MZ' => 'Mozambikas', -    'MR' => 'Mauritanija', -    'MU' => 'Mauricijus', -    'MW' => 'Malavis', -    'MY' => 'Malaizija', -    'NA' => 'Namibija', -    'NE' => 'Nigeris', -    'NG' => 'Nigerija', -    'NI' => 'Nikaragva', -    'NL' => 'Nyderlandai', -    'NE' => 'Norvegija', -    'NP' => 'Nepalas', -    'NR' => 'Nauru', -    'NZ' => 'Naujoji Zelandija', -    'OM' => 'Omanas', -    'PK' => 'Pakistanas', -    'PA' => 'Panama', -    'PE' => 'Peru', -    'PH' => 'Filipinai', -    'PW' => 'Palau', -    'PG' => 'Papua Naujoji Gvinėja', -    'PL' => 'Lenkija', -    'KP' => 'Šiaurės Korėja', -    'PT' => 'Portugalija', -    'PY' => 'Paragvajus', -    'QA' => 'Qatar', -    'RO' => 'Rumunija', -    'RU' => 'Rusija', -    'RW' => 'Ruanda', -    'SA' => 'Saudo Arabija', -    'SD' => 'Sudanas', -    'SN' => 'Senegalas', -    'SG' => 'Singapūras', -    'SB' => 'Saliamono Salos', -    'SL' => 'Siera Leonė', -    'SV' => 'Salvadoras', -    'SM' => 'San Marino', -    'SO' => 'Somalis', -    'RS' => 'Serbija', -    'SS' => 'Pietų Sudanas', -    'ST' => 'San Tomė ir Prinsipė', -    'SR' => 'Surinamas', -    'SK' => 'Slovakija', -    'SI' => 'Slovėnija', -    'SE' => 'Švedija', -    'SZ' => 'Svazilandas', -    'SC' => 'Seišeliai', -    'SY' => 'Sirija', -    'TD' => 'Chadas', -    'TG' => 'Togo', -    'TH' => 'Tailandas', -    'TJ' => 'Tadžikistanas', -    'TM' => 'Turkmėnistanas', -    'TL' => 'Rytų Timoras', -    'TO' => 'Tonga', -    'TT' => 'Trinidadas ir Tobagas', -    'TN' => 'Tunisas', -    'TR' => 'Turkija', -    'TV' => 'Tuvalu', -    'TZ' => 'Tanzanija', -    'UG' => 'Uganda', -    'UA' => 'Ukraina', -    'UY' => 'Urugvajus', -    'US' => 'JAV', -    'UZ' => 'Uzbekistanas', -    'VA' => 'Vatikanas', -    'VC' => 'Sent Vinsentas ir Grenadinai', -    'VE' => 'Venesuela', -    'VN' => 'Vietnamas', -    'VU' => 'Vanuatu', -    'WS' => 'Samoa', -    'YE' => 'Jemenas', -    'ZA' => 'Pietų Afrika', -    'ZM' => 'Zambija', -    'ZW' => 'Zimbabvė', + 'AT' => 'Austrija', + 'AZ' => 'Azerbaidžanas', + 'BI' => 'Burundi', + 'BE' => 'Belgija', + 'BJ' => 'Beninas', + 'BF' => 'Burkina Faso', + 'BD' => 'Bangladešas', + 'BG' => 'Bulgarija', + 'BH' => 'Bahreinas', + 'BS' => 'Bahamai', + 'BA' => 'Bosnija ir Hercegovina', + 'BY' => 'Baltarusija', + 'BZ' => 'Baileys', + 'BO' => 'Bolivija', + 'BR' => 'Brazilija', + 'BB' => 'Barbadosas', + 'BN' => 'Brunėjus', + 'BT' => 'Butanas', + 'BW' => 'Botsvana', + 'CF' => 'Centrinės Afrikos Respublika', + 'CA' => 'Kanada', + 'CH' => 'Šveicarija', + 'CL' => 'Čilė', + 'CN' => 'Kinija', + 'CI' => 'Dramblio Kaulo Krantas', + 'CM' => 'Kamerūnas', + 'CD' => 'Kongo Demokratinė Respublika', + 'CG' => 'Kongo Respublika', + 'CO' => 'Kolumbija', + 'KM' => 'Komorai', + 'CV' => 'Žaliasis Kyšulys', + 'CR' => 'Kosta Rika', + 'CU' => 'Kuba', + 'CY' => 'Kipras', + 'CZ' => 'Čekija', + 'DE' => 'Vokietija', + 'DJ' => 'Džibutis', + 'DM' => 'Dominika', + 'DK' => 'Danija', + 'DO' => 'Dominikos Respublika', + 'DZ' => 'Alžyras', + 'EC' => 'Ekvadoras', + 'EG' => 'Egiptas', + 'ER' => 'Eritrėja', + 'ES' => 'Ispanija', + 'EE' => 'Estija', + 'ET' => 'Etiopija', + 'FI' => 'Suomija', + 'FJ' => 'Fidžis', + 'FR' => 'Prancūzija', + 'FM' => 'Mikronezija', + 'GA' => 'Gabonas', + 'GB' => 'Jungtinė Karalystė', + 'GE' => 'Gruzija', + 'GH' => 'Gana', + 'GN' => 'Gvinėja', + 'GM' => 'Gambija', + 'GW' => 'Bisau Gvinėja', + 'GQ' => 'Pusiaujo Gvinėja', + 'GR' => 'Graikija', + 'GD' => 'Grenada', + 'GT' => 'Gvatemala', + 'GY' => 'Gajana', + 'HN' => 'Hondūras', + 'HR' => 'Kroatija', + 'HT' => 'Haitis', + 'HU' => 'Vengrija', + 'ID' => 'Indonezija', + 'IN' => 'Indija', + 'IE' => 'Airija', + 'IR' => 'Iranas', + 'IQ' => 'Irakas', + 'IS' => 'Islandija', + 'IL' => 'Izraelis', + 'IT' => 'Italija', + 'JM' => 'Jamaika', + 'JO' => 'Jordanija', + 'JP' => 'Japonija', + 'KZ' => 'Kazachstanas', + 'KE' => 'Kenija', + 'KG' => 'Kirgizija', + 'KH' => 'Kambodža', + 'KI' => 'Kiribati', + 'KN' => 'Sent Kitsas ir Nevis', + 'KR' => 'Pietų Korėja', + 'KW' => 'Kuveitas', + 'LA' => 'Laosas', + 'LB' => 'Libanas', + 'LR' => 'Liberija', + 'LY' => 'Libija', + 'LC' => 'Sent Lusija', + 'LI' => 'Lichtenšteinas', + 'LK' => 'Šri Lanka', + 'LS' => 'Lesotas', + 'LT' => 'Lietuva', + 'LU' => 'Liuksemburgas', + 'LV' => 'Latvija', + 'MA' => 'Marokas', + 'MC' => 'Monaco', + 'MD' => 'Moldova', + 'MG' => 'Madagaskaras', + 'MV' => 'Maldyvai', + 'MX' => 'Meksika', + 'MH' => 'Maršalo salos', + 'MK' => 'Makedonija', + 'ML' => 'Malis', + 'MT' => 'Malta', + 'MM' => 'Mianmaras', + 'ME' => 'Juodkalnija', + 'MN' => 'Mongolija', + 'MZ' => 'Mozambikas', + 'MR' => 'Mauritanija', + 'MU' => 'Mauricijus', + 'MW' => 'Malavis', + 'MY' => 'Malaizija', + 'NA' => 'Namibija', + 'NE' => 'Nigeris', + 'NG' => 'Nigerija', + 'NI' => 'Nikaragva', + 'NL' => 'Nyderlandai', + 'NE' => 'Norvegija', + 'NP' => 'Nepalas', + 'NR' => 'Nauru', + 'NZ' => 'Naujoji Zelandija', + 'OM' => 'Omanas', + 'PK' => 'Pakistanas', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PH' => 'Filipinai', + 'PW' => 'Palau', + 'PG' => 'Papua Naujoji Gvinėja', + 'PL' => 'Lenkija', + 'KP' => 'Šiaurės Korėja', + 'PT' => 'Portugalija', + 'PY' => 'Paragvajus', + 'QA' => 'Qatar', + 'RO' => 'Rumunija', + 'RU' => 'Rusija', + 'RW' => 'Ruanda', + 'SA' => 'Saudo Arabija', + 'SD' => 'Sudanas', + 'SN' => 'Senegalas', + 'SG' => 'Singapūras', + 'SB' => 'Saliamono Salos', + 'SL' => 'Siera Leonė', + 'SV' => 'Salvadoras', + 'SM' => 'San Marino', + 'SO' => 'Somalis', + 'RS' => 'Serbija', + 'SS' => 'Pietų Sudanas', + 'ST' => 'San Tomė ir Prinsipė', + 'SR' => 'Surinamas', + 'SK' => 'Slovakija', + 'SI' => 'Slovėnija', + 'SE' => 'Švedija', + 'SZ' => 'Svazilandas', + 'SC' => 'Seišeliai', + 'SY' => 'Sirija', + 'TD' => 'Chadas', + 'TG' => 'Togo', + 'TH' => 'Tailandas', + 'TJ' => 'Tadžikistanas', + 'TM' => 'Turkmėnistanas', + 'TL' => 'Rytų Timoras', + 'TO' => 'Tonga', + 'TT' => 'Trinidadas ir Tobagas', + 'TN' => 'Tunisas', + 'TR' => 'Turkija', + 'TV' => 'Tuvalu', + 'TZ' => 'Tanzanija', + 'UG' => 'Uganda', + 'UA' => 'Ukraina', + 'UY' => 'Urugvajus', + 'US' => 'JAV', + 'UZ' => 'Uzbekistanas', + 'VA' => 'Vatikanas', + 'VC' => 'Sent Vinsentas ir Grenadinai', + 'VE' => 'Venesuela', + 'VN' => 'Vietnamas', + 'VU' => 'Vanuatu', + 'WS' => 'Samoa', + 'YE' => 'Jemenas', + 'ZA' => 'Pietų Afrika', + 'ZM' => 'Zambija', + 'ZW' => 'Zimbabvė', ]; diff --git a/app/init.php b/app/init.php index 43b8b0f68f..d399a59dc6 100644 --- a/app/init.php +++ b/app/init.php @@ -24,7 +24,7 @@ const APP_EMAIL_TEAM = 'team@'.APP_DOMAIN; const APP_EMAIL_SECURITY = 'security@'.APP_DOMAIN; const APP_USERAGENT = APP_NAME.'-Server/%s Please report abuse at '.APP_EMAIL_SECURITY; const APP_MODE_ADMIN = 'admin'; -const APP_LOCALES = ['af', 'ar', 'cat', 'cz', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'hu', 'id', 'it', 'lt', 'nl', 'no', 'pl', 'pt-br', 'pt-pt', 'ro', 'ru', 'si', 'sv', 'ta', 'tr', 'ua', 'vi', 'zh-cn', 'zh-tw']; +const APP_LOCALES = ['af', 'ar', 'cat', 'cz', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'hu', 'id', 'it', 'jv', 'lt', 'nl', 'no', 'pl', 'pt-br', 'pt-pt', 'ro', 'ru', 'si', 'sl', 'sv', 'ta', 'tr', 'ua', 'vi', 'zh-cn', 'zh-tw']; const APP_PAGING_LIMIT = 15; const APP_VERSION_STABLE = '0.2.0'; @@ -144,6 +144,7 @@ Locale::setLanguage('hi', include __DIR__.'/config/locale/hi.php'); Locale::setLanguage('hu', include __DIR__.'/config/locale/hu.php'); Locale::setLanguage('id', include __DIR__.'/config/locale/id.php'); Locale::setLanguage('it', include __DIR__.'/config/locale/it.php'); +Locale::setLanguage('jv', include __DIR__.'/config/locale/jv.php'); Locale::setLanguage('lt', include __DIR__.'/config/locale/lt.php'); Locale::setLanguage('nl', include __DIR__.'/config/locale/nl.php'); Locale::setLanguage('no', include __DIR__.'/config/locale/no.php'); @@ -153,6 +154,7 @@ Locale::setLanguage('pt-pt', include __DIR__.'/config/locale/pt-pt.php'); Locale::setLanguage('ro', include __DIR__.'/config/locale/ro.php'); Locale::setLanguage('ru', include __DIR__ . '/config/locale/ru.php'); Locale::setLanguage('si', include __DIR__ . '/config/locale/si.php'); +Locale::setLanguage('sl', include __DIR__ . '/config/locale/sl.php'); Locale::setLanguage('sv', include __DIR__ . '/config/locale/sv.php'); Locale::setLanguage('ta', include __DIR__ . '/config/locale/ta.php'); Locale::setLanguage('tr', include __DIR__.'/config/locale/tr.php'); From 79de27fa27ec6d0e2b3fa34d3cba6fb85b5d6083 Mon Sep 17 00:00:00 2001 From: eldadfux Date: Sun, 6 Oct 2019 21:28:58 +0300 Subject: [PATCH 131/135] Updated encoding --- app/config/locale/jv.continents.php | 12 +- app/config/locale/jv.countries.php | 380 ++++++++++++++-------------- 2 files changed, 196 insertions(+), 196 deletions(-) diff --git a/app/config/locale/jv.continents.php b/app/config/locale/jv.continents.php index f20efb8cfa..0170466ce4 100644 --- a/app/config/locale/jv.continents.php +++ b/app/config/locale/jv.continents.php @@ -2,10 +2,10 @@ return [ 'AF' => 'Afrika', -    'AN' => 'Antartika', -    'AS' => 'Asia', -    'EU' => 'Eropa', -    'NA' => 'Amérika Lor', -    'OC' => 'Oseania', -    'SA' => 'Amérika Kidul', + 'AN' => 'Antartika', + 'AS' => 'Asia', + 'EU' => 'Eropa', + 'NA' => 'Amérika Lor', + 'OC' => 'Oseania', + 'SA' => 'Amérika Kidul', ]; diff --git a/app/config/locale/jv.countries.php b/app/config/locale/jv.countries.php index 1b781e36bf..fd48dfa891 100644 --- a/app/config/locale/jv.countries.php +++ b/app/config/locale/jv.countries.php @@ -2,197 +2,197 @@ return [ 'AF' => 'Afghanistan', -    'AO' => 'Angola', -    'AL' => 'Albania', -    'AD' => 'Andorra', -    'AE' => 'Uni Emirat Arab', -    'AR' => 'Argentina', -    'AM' => 'Armenia', -    'AG' => 'Antigua lan Barbuda', -    'AU' => 'Australia', -    'AT' => 'Austria', -    'AZ' => 'Azerbaijan', -    'BI' => 'Burundi', -    'BE' => 'Belgia', -    'BJ' => 'Benin', -    'BF' => 'Burkina Faso', -    'BD' => 'Bangladesh', -    'BG' => 'Bulgaria', -    'BH' => 'Bahrain', -    'BS' => 'Bahamas', -    'BA' => 'Bosnia lan Herzegovina', -    'BY' => 'Belarus', -    'BZ' => 'Belize', -    'BO' => 'Bolivia', -    'BR' => 'Brasil', -    'BB' => 'Barbados', -    'BN' => 'Brunei', -    'BT' => 'Bhutan', -    'BW' => 'Botswana', -    'CF' => 'Republik Afrika Tengah', -    'CA' => 'Kanada', -    'CH' => 'Swiss', -    'CL' => 'Chile', -    'CN' => 'China', -    'CI' => 'Pantai Gading', -    'CM' => 'Kamerun', -    'CD' => 'DR Kongo', -    'CG' => 'Republik Kongo', -    'CO' => 'Kolombia', -    'KM' => 'Comoros', -    'CV' => 'Cape Verde', -    'CR' => 'Costa Rica', -    'CU' => 'Kuba', -    'CY' => 'Siprus', -    'CZ' => 'Czechia', -    'DE' => 'Jerman', -    'DJ' => 'Djibouti', -    'DM' => 'Dominika', -    'DK' => 'Denmark', -    'DO' => 'Republik Dominika', -    'DZ' => 'Algeria', -    'EC' => 'Ekuador', -    'EG' => 'Mesir', -    'ER' => 'Eritrea', -    'ES' => 'Spanyol', -    'EE' => 'Estonia', -    'ET' => 'Ethiopia', -    'FI' => 'Finlandia', + 'AO' => 'Angola', + 'AL' => 'Albania', + 'AD' => 'Andorra', + 'AE' => 'Uni Emirat Arab', + 'AR' => 'Argentina', + 'AM' => 'Armenia', + 'AG' => 'Antigua lan Barbuda', + 'AU' => 'Australia', + 'AT' => 'Austria', + 'AZ' => 'Azerbaijan', + 'BI' => 'Burundi', + 'BE' => 'Belgia', + 'BJ' => 'Benin', + 'BF' => 'Burkina Faso', + 'BD' => 'Bangladesh', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrain', + 'BS' => 'Bahamas', + 'BA' => 'Bosnia lan Herzegovina', + 'BY' => 'Belarus', + 'BZ' => 'Belize', + 'BO' => 'Bolivia', + 'BR' => 'Brasil', + 'BB' => 'Barbados', + 'BN' => 'Brunei', + 'BT' => 'Bhutan', + 'BW' => 'Botswana', + 'CF' => 'Republik Afrika Tengah', + 'CA' => 'Kanada', + 'CH' => 'Swiss', + 'CL' => 'Chile', + 'CN' => 'China', + 'CI' => 'Pantai Gading', + 'CM' => 'Kamerun', + 'CD' => 'DR Kongo', + 'CG' => 'Republik Kongo', + 'CO' => 'Kolombia', + 'KM' => 'Comoros', + 'CV' => 'Cape Verde', + 'CR' => 'Costa Rica', + 'CU' => 'Kuba', + 'CY' => 'Siprus', + 'CZ' => 'Czechia', + 'DE' => 'Jerman', + 'DJ' => 'Djibouti', + 'DM' => 'Dominika', + 'DK' => 'Denmark', + 'DO' => 'Republik Dominika', + 'DZ' => 'Algeria', + 'EC' => 'Ekuador', + 'EG' => 'Mesir', + 'ER' => 'Eritrea', + 'ES' => 'Spanyol', + 'EE' => 'Estonia', + 'ET' => 'Ethiopia', + 'FI' => 'Finlandia', 'FJ' => 'Fiji', -    'FR' => 'Prancis', -    'FM' => 'Mikronesia', -    'GA' => 'Gabon', -    'GB' => 'Inggris', -    'GE' => 'Georgia', -    'GH' => 'Ghana', -    'GN' => 'Guinea', -    'GM' => 'Gambia', -    'GW' => 'Guinea-Bissau', -    'GQ' => 'Guinea Khatulistiwa', -    'GR' => 'Yunani', -    'GD' => 'Grenada', -    'GT' => 'Guatemala', -    'GY' => 'Guyana', -    'HN' => 'Honduras', -    'HR' => 'Croatia', -    'HT' => 'Haiti', -    'HU' => 'Hongaria', -    'ID' => 'Indonesia', -    'IN' => 'India', -    'IE' => 'Irlandia', -    'IR' => 'Iran', -    'IQ' => 'Irak', -    'IS' => 'Islandia', -    'IL' => 'Israel', -    'IT' => 'Italia', -    'JM' => 'Jamaika', -    'JO' => 'Yordania', -    'JP' => 'Jepang', -    'KZ' => 'Kazakhstan', -    'KE' => 'Kenya', -    'KG' => 'Kyrgyzstan', -    'KH' => 'Kamboja', -    'KI' => 'Kiribati', -    'KN' => 'Saint Kitts lan Nevis', -    'KR' => 'Korea Kidul', -    'KW' => 'Kuwait', -    'LA' => 'Laos', -    'LB' => 'Libanon', -    'LR' => 'Liberia', -    'LY' => 'Libya', -    'LC' => 'Saint Lucia', -    'LI' => 'Liechtenstein', -    'LK' => 'Sri Lanka', -    'LS' => 'Lesotho', -    'LT' => 'Lithuania', -    'LU' => 'Luksemburg', -    'LV' => 'Latvia', -    'MA' => 'Maroko', -    'MC' => 'Monaco', -    'MD' => 'Moldova', -    'MG' => 'Madagascar', -    'MV' => 'Maldives', -    'MX' => 'Meksiko', -    'MH' => 'Kepulauan Marshall', -    'MK' => 'Makedonia', -    'ML' => 'Mali', -    'MT' => 'Malta', -    'MM' => 'Myanmar', + 'FR' => 'Prancis', + 'FM' => 'Mikronesia', + 'GA' => 'Gabon', + 'GB' => 'Inggris', + 'GE' => 'Georgia', + 'GH' => 'Ghana', + 'GN' => 'Guinea', + 'GM' => 'Gambia', + 'GW' => 'Guinea-Bissau', + 'GQ' => 'Guinea Khatulistiwa', + 'GR' => 'Yunani', + 'GD' => 'Grenada', + 'GT' => 'Guatemala', + 'GY' => 'Guyana', + 'HN' => 'Honduras', + 'HR' => 'Croatia', + 'HT' => 'Haiti', + 'HU' => 'Hongaria', + 'ID' => 'Indonesia', + 'IN' => 'India', + 'IE' => 'Irlandia', + 'IR' => 'Iran', + 'IQ' => 'Irak', + 'IS' => 'Islandia', + 'IL' => 'Israel', + 'IT' => 'Italia', + 'JM' => 'Jamaika', + 'JO' => 'Yordania', + 'JP' => 'Jepang', + 'KZ' => 'Kazakhstan', + 'KE' => 'Kenya', + 'KG' => 'Kyrgyzstan', + 'KH' => 'Kamboja', + 'KI' => 'Kiribati', + 'KN' => 'Saint Kitts lan Nevis', + 'KR' => 'Korea Kidul', + 'KW' => 'Kuwait', + 'LA' => 'Laos', + 'LB' => 'Libanon', + 'LR' => 'Liberia', + 'LY' => 'Libya', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LS' => 'Lesotho', + 'LT' => 'Lithuania', + 'LU' => 'Luksemburg', + 'LV' => 'Latvia', + 'MA' => 'Maroko', + 'MC' => 'Monaco', + 'MD' => 'Moldova', + 'MG' => 'Madagascar', + 'MV' => 'Maldives', + 'MX' => 'Meksiko', + 'MH' => 'Kepulauan Marshall', + 'MK' => 'Makedonia', + 'ML' => 'Mali', + 'MT' => 'Malta', + 'MM' => 'Myanmar', 'ME' => 'Montenegro', -    'MN' => 'Mongolia', -    'MZ' => 'Mozambique', -    'MR' => 'Mauritania', -    'MU' => 'Mauritius', -    'MW' => 'Malawi', -    'MY' => 'Malaysia', -    'NA' => 'Namibia', -    'NE' => 'Niger', -    'NG' => 'Nigeria', -    'NI' => 'Nikaragua', -    'NL' => 'Belanda', -    'NO' => 'Norwegia', -    'NP' => 'Nepal', -    'NR' => 'Nauru', -    'NZ' => 'Selandia Anyar', -    'OM' => 'Oman', -    'PK' => 'Pakistan', -    'PA' => 'Panama', -    'PE' => 'Peru', -    'PH' => 'Filipina', -    'PW' => 'Palau', -    'PG' => 'Papua Nugini', -    'PL' => 'Polandia', -    'KP' => 'Korea Lor', -    'PT' => 'Portugal', -    'PY' => 'Paraguay', -    'QA' => 'Qatar', -    'RO' => 'Romania', -    'RU' => 'Rusia', -    'RW' => 'Rwanda', -    'SA' => 'Arab Saudi', -    'SD' => 'Sudan', -    'SN' => 'Senegal', -    'SG' => 'Singapura', -    'SB' => 'Kepulauan Solomon', -    'SL' => 'Sierra Leone', -    'SV' => 'El Salvador', -    'SM' => 'San Marino', -    'SO' => 'Somalia', -    'RS' => 'Serbia', -    'SS' => 'Sudan Kidul', -    'ST' => 'São Tomé lan Príncipe', -    'SR' => 'Suriname', -    'SK' => 'Slowakia', -    'SI' => 'Slovenia', -    'SE' => 'Swedia', -    'SZ' => 'Swaziland', -    'SC' => 'Seychelles', -    'SY' => 'Suriah', -    'TD' => 'Chad', -    'TG' => 'Togo', -    'TH' => 'Thailand', -    'TJ' => 'Tajikistan', -    'TM' => 'Turkmenistan', -    'TL' => 'Timor-Leste', -    'TO' => 'Tonga', -    'TT' => 'Trinidad lan Tobago', -    'TN' => 'Tunisia', -    'TR' => 'Turki', + 'MN' => 'Mongolia', + 'MZ' => 'Mozambique', + 'MR' => 'Mauritania', + 'MU' => 'Mauritius', + 'MW' => 'Malawi', + 'MY' => 'Malaysia', + 'NA' => 'Namibia', + 'NE' => 'Niger', + 'NG' => 'Nigeria', + 'NI' => 'Nikaragua', + 'NL' => 'Belanda', + 'NO' => 'Norwegia', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NZ' => 'Selandia Anyar', + 'OM' => 'Oman', + 'PK' => 'Pakistan', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PH' => 'Filipina', + 'PW' => 'Palau', + 'PG' => 'Papua Nugini', + 'PL' => 'Polandia', + 'KP' => 'Korea Lor', + 'PT' => 'Portugal', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RO' => 'Romania', + 'RU' => 'Rusia', + 'RW' => 'Rwanda', + 'SA' => 'Arab Saudi', + 'SD' => 'Sudan', + 'SN' => 'Senegal', + 'SG' => 'Singapura', + 'SB' => 'Kepulauan Solomon', + 'SL' => 'Sierra Leone', + 'SV' => 'El Salvador', + 'SM' => 'San Marino', + 'SO' => 'Somalia', + 'RS' => 'Serbia', + 'SS' => 'Sudan Kidul', + 'ST' => 'São Tomé lan Príncipe', + 'SR' => 'Suriname', + 'SK' => 'Slowakia', + 'SI' => 'Slovenia', + 'SE' => 'Swedia', + 'SZ' => 'Swaziland', + 'SC' => 'Seychelles', + 'SY' => 'Suriah', + 'TD' => 'Chad', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tajikistan', + 'TM' => 'Turkmenistan', + 'TL' => 'Timor-Leste', + 'TO' => 'Tonga', + 'TT' => 'Trinidad lan Tobago', + 'TN' => 'Tunisia', + 'TR' => 'Turki', 'TV' => 'Tuvalu', -    'TZ' => 'Tanzania', -    'UG' => 'Uganda', -    'UA' => 'Ukraina', -    'UY' => 'Uruguay', -    'US' => 'Amerika Serikat', -    'UZ' => 'Uzbekistan', -    'VA' => 'Kota Vatikan', -    'VC' => 'Saint Vincent lan Grenadines', -    'VE' => 'Venezuela', -    'VN' => 'Vietnam', -    'VU' => 'Vanuatu', -    'WS' => 'Samoa', -    'YE' => 'Yaman', -    'ZA' => 'Afrika Kidul', -    'ZM' => 'Zambia', -    'ZW' => 'Zimbabwe', + 'TZ' => 'Tanzania', + 'UG' => 'Uganda', + 'UA' => 'Ukraina', + 'UY' => 'Uruguay', + 'US' => 'Amerika Serikat', + 'UZ' => 'Uzbekistan', + 'VA' => 'Kota Vatikan', + 'VC' => 'Saint Vincent lan Grenadines', + 'VE' => 'Venezuela', + 'VN' => 'Vietnam', + 'VU' => 'Vanuatu', + 'WS' => 'Samoa', + 'YE' => 'Yaman', + 'ZA' => 'Afrika Kidul', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', ]; From 228096434d2f765a3cc8a3a7850a7a299dd367fe Mon Sep 17 00:00:00 2001 From: eldadfux Date: Sun, 6 Oct 2019 22:37:55 +0300 Subject: [PATCH 132/135] resorted docs --- CONTRIBUTING.md | 2 +- docs/{AddOAuthProvider.md => tutorials/add-oauth-provider.md} | 0 .../environment-variables.md} | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename docs/{AddOAuthProvider.md => tutorials/add-oauth-provider.md} (100%) rename docs/{EnvironmentVariables.md => tutorials/environment-variables.md} (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a1d0e90ec4..6d84a6b9be 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -123,4 +123,4 @@ Before running the command make sure you have proper write permissions to Appwri From time to time our team will add tutorials that will help contributors find there way in the Appwrite source code. Below is a list of currently available tutorials: -* [Adding Support for a New OAuth Provider](./docs/AddOAuthProvider.md) +* [Adding Support for a New OAuth Provider](./docs/tutorials/add-oauth-provider.md) diff --git a/docs/AddOAuthProvider.md b/docs/tutorials/add-oauth-provider.md similarity index 100% rename from docs/AddOAuthProvider.md rename to docs/tutorials/add-oauth-provider.md diff --git a/docs/EnvironmentVariables.md b/docs/tutorials/environment-variables.md similarity index 100% rename from docs/EnvironmentVariables.md rename to docs/tutorials/environment-variables.md From f3ce86ed6321405b66c1e7f1e745956cc259158b Mon Sep 17 00:00:00 2001 From: eldadfux Date: Sun, 6 Oct 2019 23:10:52 +0300 Subject: [PATCH 133/135] Exporting docs to md file+fixed routes indentation --- app/controllers/account.php | 24 +- app/controllers/auth.php | 140 ++------ app/controllers/avatars.php | 89 ++--- app/controllers/console.php | 4 +- app/controllers/database.php | 164 +++------ app/controllers/projects.php | 416 ++++++---------------- app/controllers/storage.php | 99 ++--- app/controllers/teams.php | 108 ++---- app/controllers/users.php | 72 +--- docs/references/auth/confirm-resend.md | 3 + docs/references/auth/confirm.md | 1 + docs/references/auth/login.md | 5 + docs/references/auth/logout-by-session.md | 1 + docs/references/auth/logout.md | 1 + docs/references/auth/recovery-reset.md | 3 + docs/references/auth/recovery.md | 1 + docs/references/auth/register.md | 7 + 17 files changed, 305 insertions(+), 833 deletions(-) create mode 100644 docs/references/auth/confirm-resend.md create mode 100644 docs/references/auth/confirm.md create mode 100644 docs/references/auth/login.md create mode 100644 docs/references/auth/logout-by-session.md create mode 100644 docs/references/auth/logout.md create mode 100644 docs/references/auth/recovery-reset.md create mode 100644 docs/references/auth/recovery.md create mode 100644 docs/references/auth/register.md diff --git a/app/controllers/account.php b/app/controllers/account.php index cb95a0f3e1..1809ade66b 100644 --- a/app/controllers/account.php +++ b/app/controllers/account.php @@ -202,9 +202,7 @@ $utopia->patch('/v1/account/name') ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateName') ->label('sdk.description', 'Update currently logged in user account name.') - ->param('name', '', function () { - return new Text(100); - }, 'User name') + ->param('name', '', function () { return new Text(100); }, 'User name') ->action( function ($name) use ($response, $user, $projectDB, $audit) { $user = $projectDB->updateDocument(array_merge($user->getArrayCopy(), [ @@ -228,12 +226,8 @@ $utopia->patch('/v1/account/password') ->label('sdk.namespace', 'account') ->label('sdk.method', 'updatePassword') ->label('sdk.description', 'Update currently logged in user password. For validation, user is required to pass the password twice.') - ->param('password', '', function () { - return new Password(); - }, 'New password') - ->param('old-password', '', function () { - return new Password(); - }, 'Old password') + ->param('password', '', function () { return new Password(); }, 'New password') + ->param('old-password', '', function () { return new Password(); }, 'Old password') ->action( function ($password, $oldPassword) use ($response, $user, $projectDB, $audit) { if (!Auth::passwordVerify($oldPassword, $user->getAttribute('password'))) { // Double check user password @@ -261,12 +255,8 @@ $utopia->patch('/v1/account/email') ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateEmail') ->label('sdk.description', 'Update currently logged in user account email address. After changing user address, user confirmation status is being reset and a new confirmation mail is sent. For security measures, user password is required to complete this request.') - ->param('email', '', function () { - return new Email(); - }, 'Email Address') - ->param('password', '', function () { - return new Password(); - }, 'User Password') + ->param('email', '', function () { return new Email(); }, 'Email Address') + ->param('password', '', function () { return new Password(); }, 'User Password') ->action( function ($email, $password) use ($response, $user, $projectDB, $audit) { if (!Auth::passwordVerify($password, $user->getAttribute('password'))) { // Double check user password @@ -308,9 +298,7 @@ $utopia->patch('/v1/account/prefs') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'updatePrefs') - ->param('prefs', '', function () { - return new \Utopia\Validator\Mock(); - }, 'Prefs key-value JSON object string.') + ->param('prefs', '', function () { return new \Utopia\Validator\Mock();}, 'Prefs key-value JSON object string.') ->label('sdk.description', 'Update currently logged in user account preferences. You can pass only the specific settings you wish to update.') ->action( function ($prefs) use ($response, $user, $projectDB, $audit) { diff --git a/app/controllers/auth.php b/app/controllers/auth.php index 849f783113..1d0e260c9c 100644 --- a/app/controllers/auth.php +++ b/app/controllers/auth.php @@ -24,27 +24,15 @@ $utopia->post('/v1/auth/register') ->label('scope', 'auth') ->label('sdk.namespace', 'auth') ->label('sdk.method', 'register') - ->label('sdk.description', "Use this endpoint to allow a new user to register an account in your project. Use the success and failure URL's to redirect users back to your application after signup completes.\n\nIf registration completes successfully user will be sent with a confirmation email in order to confirm he is the owner of the account email address. Use the confirmation parameter to redirect the user from the confirmation email back to your app. When the user is redirected, use the /auth/confirm endpoint to complete the account confirmation.\n\nPlease notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface.\n\nWhen accessing this route using JavaScript from the browser, success and failure parameter URLs are required. Appwrite server will respond with a 301 redirect status code and will set the user session cookie. This behavior is enforced because modern browsers are limiting 3rd party cookies in XHR of fetch requests to protect user privacy.") + ->label('sdk.description', '/docs/refernces/register.md') ->label('sdk.cookies', true) ->label('abuse-limit', 10) - ->param('email', '', function () { - return new Email(); - }, 'Account email') - ->param('password', '', function () { - return new Password(); - }, 'User password') - ->param('confirm', '', function () use ($clients) { - return new Host($clients); - }, 'Confirmation URL to redirect user after confirm token has been sent to user email') // TODO add our own built-in confirm page - ->param('success', null, function () use ($clients) { - return new Host($clients); - }, 'Redirect when registration succeed', true) - ->param('failure', null, function () use ($clients) { - return new Host($clients); - }, 'Redirect when registration failed', true) - ->param('name', '', function () { - return new Text(100); - }, 'User name', true) + ->param('email', '', function () { return new Email(); }, 'Account email') + ->param('password', '', function () { return new Password(); }, 'User password') + ->param('confirm', '', function () use ($clients) { return new Host($clients); }, 'Confirmation URL to redirect user after confirm token has been sent to user email') // TODO add our own built-in confirm page + ->param('success', null, function () use ($clients) { return new Host($clients); }, 'Redirect when registration succeed', true) + ->param('failure', null, function () use ($clients) { return new Host($clients); }, 'Redirect when registration failed', true) + ->param('name', '', function () { return new Text(100); }, 'User name', true) ->action( function ($email, $password, $confirm, $success, $failure, $name) use ($request, $response, $register, $audit, $projectDB, $project, $webhook) { if ('console' === $project->getUid()) { @@ -202,15 +190,11 @@ $utopia->post('/v1/auth/register/confirm') ->label('scope', 'public') ->label('sdk.namespace', 'auth') ->label('sdk.method', 'confirm') - ->label('sdk.description', 'Use this endpoint to complete the confirmation of the user account email address. Both the **userId** and **token** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/register endpoint.') + ->label('sdk.description', '/docs/refernces/confirm.md') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},userId:{param-userId}') - ->param('userId', '', function () { - return new UID(); - }, 'User unique ID') - ->param('token', '', function () { - return new Text(256); - }, 'Confirmation secret token') + ->param('userId', '', function () { return new UID(); }, 'User unique ID') + ->param('token', '', function () { return new Text(256); }, 'Confirmation secret token') ->action( function ($userId, $token) use ($response, $request, $projectDB, $audit) { $profile = $projectDB->getCollection([ // Get user by email address @@ -256,12 +240,10 @@ $utopia->post('/v1/auth/register/confirm/resend') ->label('scope', 'account') ->label('sdk.namespace', 'auth') ->label('sdk.method', 'confirmResend') - ->label('sdk.description', "This endpoint allows the user to request your app to resend him his email confirmation message. The redirect arguments acts the same way as in /auth/register endpoint.\n\nPlease notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface.") + ->label('sdk.description', '/docs/refernces/confirm-resend.md') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},userId:{param-userId}') - ->param('confirm', '', function () use ($clients) { - return new Host($clients); - }, 'Confirmation URL to redirect user to your app after confirm token has been sent to user email.') + ->param('confirm', '', function () use ($clients) { return new Host($clients); }, 'Confirmation URL to redirect user to your app after confirm token has been sent to user email.') ->action( function ($confirm) use ($response, $request, $projectDB, $user, $register, $project) { if ($user->getAttribute('confirm', false)) { @@ -322,22 +304,14 @@ $utopia->post('/v1/auth/login') ->label('scope', 'auth') ->label('sdk.namespace', 'auth') ->label('sdk.method', 'login') - ->label('sdk.description', "Allow the user to login into his account by providing a valid email and password combination. Use the success and failure arguments to provide a redirect URL\'s back to your app when login is completed. \n\nPlease notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface.\n\nWhen accessing this route using JavaScript from the browser, success and failure parameter URLs are required. Appwrite server will respond with a 301 redirect status code and will set the user session cookie. This behavior is enforced because modern browsers are limiting 3rd party cookies in XHR of fetch requests to protect user privacy.") + ->label('sdk.description', '/docs/refernces/login.md') ->label('sdk.cookies', true) ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},email:{param-email}') - ->param('email', '', function () { - return new Email(); - }, 'User account email address') - ->param('password', '', function () { - return new Password(); - }, 'User account password') - ->param('success', null, function () use ($clients) { - return new Host($clients); - }, 'URL to redirect back to your app after a successful login attempt.') - ->param('failure', null, function () use ($clients) { - return new Host($clients); - }, 'URL to redirect back to your app after a failed login attempt.') + ->param('email', '', function () { return new Email(); }, 'User account email address') + ->param('password', '', function () { return new Password(); }, 'User account password') + ->param('success', null, function () use ($clients) { return new Host($clients); }, 'URL to redirect back to your app after a successful login attempt.') + ->param('failure', null, function () use ($clients) { return new Host($clients); }, 'URL to redirect back to your app after a failed login attempt.') ->action( function ($email, $password, $success, $failure) use ($response, $request, $projectDB, $audit, $webhook) { $profile = $projectDB->getCollection([ // Get user by email address @@ -415,7 +389,7 @@ $utopia->delete('/v1/auth/logout') ->label('scope', 'account') ->label('sdk.namespace', 'auth') ->label('sdk.method', 'logout') - ->label('sdk.description', 'Use this endpoint to log out the currently logged in user from his account. When succeed this endpoint will delete the user session and remove the session secret cookie from the user client.') + ->label('sdk.description', '/docs/refernces/logout.md') ->label('abuse-limit', 100) ->action( function () use ($response, $request, $user, $projectDB, $audit, $webhook) { @@ -446,11 +420,9 @@ $utopia->delete('/v1/auth/logout/:id') ->label('scope', 'account') ->label('sdk.namespace', 'auth') ->label('sdk.method', 'logoutBySession') - ->label('sdk.description', 'Use this endpoint to log out the currently logged in user from all his account sessions across all his different devices. When using the option id argument, only the session unique ID provider will be deleted.') + ->label('sdk.description', '/docs/refernces/logout-by-session.md') ->label('abuse-limit', 100) - ->param('id', null, function () { - return new UID(); - }, 'User specific session unique ID number. if 0 delete all sessions.') + ->param('id', null, function () { return new UID(); }, 'User specific session unique ID number. if 0 delete all sessions.') ->action( function ($id) use ($response, $request, $user, $projectDB, $audit) { $tokens = $user->getAttribute('tokens', []); @@ -481,15 +453,11 @@ $utopia->post('/v1/auth/recovery') ->label('scope', 'auth') ->label('sdk.namespace', 'auth') ->label('sdk.method', 'recovery') - ->label('sdk.description', 'Sends the user an email with a temporary secret token for password reset. When the user clicks the confirmation link he is redirected back to your app password reset redirect URL with a secret token and email address values attached to the URL query string. Use the query string params to submit a request to the /auth/password/reset endpoint to complete the process.') + ->label('sdk.description', '/docs/refernces/recovery.md') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},email:{param-email}') - ->param('email', '', function () { - return new Email(); - }, 'User account email address.') - ->param('reset', '', function () use ($clients) { - return new Host($clients); - }, 'Reset URL in your app to redirect the user after the reset token has been sent to the user email.') + ->param('email', '', function () { return new Email(); }, 'User account email address.') + ->param('reset', '', function () use ($clients) { return new Host($clients); }, 'Reset URL in your app to redirect the user after the reset token has been sent to the user email.') ->action( function ($email, $reset) use ($request, $response, $projectDB, $register, $audit, $project) { $profile = $projectDB->getCollection([ // Get user by email address @@ -565,21 +533,13 @@ $utopia->put('/v1/auth/recovery/reset') ->label('scope', 'auth') ->label('sdk.namespace', 'auth') ->label('sdk.method', 'recoveryReset') - ->label('sdk.description', "Use this endpoint to complete the user account password reset. Both the **userId** and **token** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/recovery endpoint.\n\nPlease notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface.") + ->label('sdk.description', '/docs/refernces/recovery-reset.md') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},userId:{param-userId}') - ->param('userId', '', function () { - return new UID(); - }, 'User account email address.') - ->param('token', '', function () { - return new Text(256); - }, 'Valid reset token.') - ->param('password-a', '', function () { - return new Password(); - }, 'New password.') - ->param('password-b', '', function () { - return new Password(); - }, 'New password again.') + ->param('userId', '', function () { return new UID(); }, 'User account email address.') + ->param('token', '', function () { return new Text(256); }, 'Valid reset token.') + ->param('password-a', '', function () { return new Password(); }, 'New password.') + ->param('password-b', '', function () {return new Password(); }, 'New password again.') ->action( function ($userId, $token, $passwordA, $passwordB) use ($response, $projectDB, $audit) { if ($passwordA !== $passwordB) { @@ -639,15 +599,9 @@ $utopia->get('/v1/auth/oauth/:provider') ->label('sdk.location', true) ->label('abuse-limit', 50) ->label('abuse-key', 'ip:{ip}') - ->param('provider', '', function () use ($providers) { - return new WhiteList(array_keys($providers)); - }, 'OAuth Provider') - ->param('success', '', function () use ($clients) { - return new Host($clients); - }, 'URL to redirect back to your app after a successful login attempt.', true) - ->param('failure', '', function () use ($clients) { - return new Host($clients); - }, 'URL to redirect back to your app after a failed login attempt.', true) + ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'OAuth Provider') + ->param('success', '', function () use ($clients) { return new Host($clients); }, 'URL to redirect back to your app after a successful login attempt.', true) + ->param('failure', '', function () use ($clients) { return new Host($clients); }, 'URL to redirect back to your app after a failed login attempt.', true) ->action( function ($provider, $success, $failure) use ($response, $request, $project) { $callback = $request->getServer('REQUEST_SCHEME', 'https').'://'.$request->getServer('HTTP_HOST').'/v1/auth/oauth/callback/'.$provider.'/'.$project->getUid(); @@ -681,23 +635,13 @@ $utopia->get('/v1/auth/oauth/callback/:provider/:projectId') ->desc('OAuth Callback') ->label('error', __DIR__.'/../views/general/error.phtml') ->label('scope', 'auth') - //->label('sdk.namespace', 'auth') - //->label('sdk.method', 'oauthCallback') ->label('abuse-limit', 50) ->label('abuse-key', 'ip:{ip}') ->label('docs', false) - ->param('projectId', '', function () { - return new Text(1024); - }, 'Project unique ID') - ->param('provider', '', function () use ($providers) { - return new WhiteList(array_keys($providers)); - }, 'OAuth provider') - ->param('code', '', function () { - return new Text(1024); - }, 'OAuth code') - ->param('state', '', function () { - return new Text(2048); - }, 'Login state params', true) + ->param('projectId', '', function () { return new Text(1024); }, 'Project unique ID') + ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'OAuth provider') + ->param('code', '', function () { return new Text(1024); }, 'OAuth code') + ->param('state', '', function () { return new Text(2048); }, 'Login state params', true) ->action( function ($projectId, $provider, $code, $state) use ($response, $request, $domain) { $response->redirect($request->getServer('REQUEST_SCHEME', 'https').'://'.$domain.'/v1/auth/oauth/'.$provider.'/redirect?' @@ -710,20 +654,12 @@ $utopia->get('/v1/auth/oauth/:provider/redirect') ->label('error', __DIR__.'/../views/general/error.phtml') ->label('webhook', 'auth.oauth') ->label('scope', 'auth') - //->label('sdk.namespace', 'auth') - //->label('sdk.method', 'oauthRedirect') ->label('abuse-limit', 50) ->label('abuse-key', 'ip:{ip}') ->label('docs', false) - ->param('provider', '', function () use ($providers) { - return new WhiteList(array_keys($providers)); - }, 'OAuth provider') - ->param('code', '', function () { - return new Text(1024); - }, 'OAuth code') - ->param('state', '', function () { - return new Text(2048); - }, 'OAuth state params', true) + ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'OAuth provider') + ->param('code', '', function () { return new Text(1024); }, 'OAuth code') + ->param('state', '', function () { return new Text(2048); }, 'OAuth state params', true) ->action( function ($provider, $code, $state) use ($response, $request, $user, $projectDB, $project, $audit) { $callback = $request->getServer('REQUEST_SCHEME', 'https').'://'.$request->getServer('HTTP_HOST').'/v1/auth/oauth/callback/'.$provider.'/'.$project->getUid(); diff --git a/app/controllers/avatars.php b/app/controllers/avatars.php index 77580a59b4..0f42264490 100644 --- a/app/controllers/avatars.php +++ b/app/controllers/avatars.php @@ -87,81 +87,48 @@ $avatarCallback = function ($type, $code, $width, $height, $quality) use ($types $utopia->get('/v1/avatars/credit-cards/:code') ->desc('Get Credit Card Icon') - ->param('code', '', function () use ($types) { - return new WhiteList(array_keys($types['credit-cards'])); - }, 'Credit Card Code. Possible values: '.implode(', ', array_keys($types['credit-cards'])).'.') - ->param('width', 100, function () { - return new Range(0, 2000); - }, 'Image width. Pass an integer between 0 to 2000. Defaults to 100', true) - ->param('height', 100, function () { - return new Range(0, 2000); - }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100', true) - ->param('quality', 100, function () { - return new Range(0, 100); - }, 'Image quality. Pass an integer between 0 to 100. Defaults to 100', true) + ->param('code', '', function () use ($types) { return new WhiteList(array_keys($types['credit-cards'])); }, 'Credit Card Code. Possible values: '.implode(', ', array_keys($types['credit-cards'])).'.') + ->param('width', 100, function () { return new Range(0, 2000); }, 'Image width. Pass an integer between 0 to 2000. Defaults to 100', true) + ->param('height', 100, function () { return new Range(0, 2000); }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100', true) + ->param('quality', 100, function () { return new Range(0, 100); }, 'Image quality. Pass an integer between 0 to 100. Defaults to 100', true) ->label('scope', 'avatars.read') ->label('sdk.namespace', 'avatars') ->label('sdk.method', 'getCreditCard') ->label('sdk.description', 'Need to display your users with your billing method or there payment methods? The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.') - ->action(function ($code, $width, $height, $quality) use ($avatarCallback) { - return $avatarCallback('credit-cards', $code, $width, $height, $quality); + ->action(function ($code, $width, $height, $quality) use ($avatarCallback) { return $avatarCallback('credit-cards', $code, $width, $height, $quality); }); $utopia->get('/v1/avatars/browsers/:code') ->desc('Get Browser Icon') - ->param('code', '', function () use ($types) { - return new WhiteList(array_keys($types['browsers'])); - }, 'Browser Code.') - ->param('width', 100, function () { - return new Range(0, 2000); - }, 'Image width. Pass an integer between 0 to 2000. Defaults to 100', true) - ->param('height', 100, function () { - return new Range(0, 2000); - }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100', true) - ->param('quality', 100, function () { - return new Range(0, 100); - }, 'Image quality. Pass an integer between 0 to 100. Defaults to 100', true) + ->param('code', '', function () use ($types) { return new WhiteList(array_keys($types['browsers'])); }, 'Browser Code.') + ->param('width', 100, function () { return new Range(0, 2000); }, 'Image width. Pass an integer between 0 to 2000. Defaults to 100', true) + ->param('height', 100, function () { return new Range(0, 2000); }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100', true) + ->param('quality', 100, function () { return new Range(0, 100); }, 'Image quality. Pass an integer between 0 to 100. Defaults to 100', true) ->label('scope', 'avatars.read') ->label('sdk.namespace', 'avatars') ->label('sdk.method', 'getBrowser') ->label('sdk.description', 'You can use this endpoint to show different browser icons to your users, The code argument receives the browser code as appear in your user /account/sessions endpoint. Use width, height and quality arguments to change the output settings.') - ->action(function ($code, $width, $height, $quality) use ($avatarCallback) { - return $avatarCallback('browsers', $code, $width, $height, $quality); + ->action(function ($code, $width, $height, $quality) use ($avatarCallback) { return $avatarCallback('browsers', $code, $width, $height, $quality); }); $utopia->get('/v1/avatars/flags/:code') ->desc('Get Country Flag') - ->param('code', '', function () use ($types) { - return new WhiteList(array_keys($types['flags'])); - }, 'Country Code. ISO Alpha-2 country code format.') - ->param('width', 100, function () { - return new Range(0, 2000); - }, 'Image width. Pass an integer between 0 to 2000. Defaults to 100', true) - ->param('height', 100, function () { - return new Range(0, 2000); - }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100', true) - ->param('quality', 100, function () { - return new Range(0, 100); - }, 'Image quality. Pass an integer between 0 to 100. Defaults to 100', true) + ->param('code', '', function () use ($types) { return new WhiteList(array_keys($types['flags'])); }, 'Country Code. ISO Alpha-2 country code format.') + ->param('width', 100, function () { return new Range(0, 2000); }, 'Image width. Pass an integer between 0 to 2000. Defaults to 100', true) + ->param('height', 100, function () { return new Range(0, 2000); }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100', true) + ->param('quality', 100, function () { return new Range(0, 100); }, 'Image quality. Pass an integer between 0 to 100. Defaults to 100', true) ->label('scope', 'avatars.read') ->label('sdk.namespace', 'avatars') ->label('sdk.method', 'getFlag') ->label('sdk.description', 'You can use this endpoint to show different country flags icons to your users, The code argument receives the a 2 letter country code. Use width, height and quality arguments to change the output settings.') - ->action(function ($code, $width, $height, $quality) use ($avatarCallback) { - return $avatarCallback('flags', $code, $width, $height, $quality); + ->action(function ($code, $width, $height, $quality) use ($avatarCallback) { return $avatarCallback('flags', $code, $width, $height, $quality); }); $utopia->get('/v1/avatars/image') ->desc('Get Image from URL') - ->param('url', '', function () { - return new URL(); - }, 'Image URL which you want to crop.') - ->param('width', 400, function () { - return new Range(0, 2000); - }, 'Resize preview image width, Pass an integer between 0 to 4000', true) - ->param('height', 400, function () { - return new Range(0, 2000); - }, 'Resize preview image height, Pass an integer between 0 to 4000', true) + ->param('url', '', function () { return new URL(); }, 'Image URL which you want to crop.') + ->param('width', 400, function () { return new Range(0, 2000); }, 'Resize preview image width, Pass an integer between 0 to 4000', true) + ->param('height', 400, function () { return new Range(0, 2000); }, 'Resize preview image height, Pass an integer between 0 to 4000', true) ->label('scope', 'avatars.read') ->label('sdk.namespace', 'avatars') ->label('sdk.method', 'getImage') @@ -226,9 +193,7 @@ $utopia->get('/v1/avatars/image') $utopia->get('/v1/avatars/favicon') ->desc('Get Favicon') - ->param('url', '', function () { - return new URL(); - }, 'Website URL which you want to fetch the favicon from.') + ->param('url', '', function () { return new URL(); }, 'Website URL which you want to fetch the favicon from.') ->label('scope', 'avatars.read') ->label('sdk.namespace', 'avatars') ->label('sdk.method', 'getFavicon') @@ -377,18 +342,10 @@ $utopia->get('/v1/avatars/favicon') $utopia->get('/v1/avatars/qr') ->desc('Text to QR Generator') - ->param('text', '', function () { - return new Text(512); - }, 'Plain text to be converted to QR code image') - ->param('size', 400, function () { - return new Range(0, 1000); - }, 'QR code size. Pass an integer between 0 to 1000. Defaults to 400.', true) - ->param('margin', 1, function () { - return new Range(0, 10); - }, 'Margin From Edge. Pass an integer between 0 to 10. Defaults to 1.', true) - ->param('download', 0, function () { - return new Range(0, 1); - }, 'Return resulting image with \'Content-Disposition: attachment \' headers for the browser to start downloading it. Pass 0 for no header, or 1 for otherwise. Default value is set to 0.', true) + ->param('text', '', function () { return new Text(512); }, 'Plain text to be converted to QR code image') + ->param('size', 400, function () { return new Range(0, 1000); }, 'QR code size. Pass an integer between 0 to 1000. Defaults to 400.', true) + ->param('margin', 1, function () { return new Range(0, 10); }, 'Margin From Edge. Pass an integer between 0 to 10. Defaults to 1.', true) + ->param('download', 0, function () { return new Range(0, 1); }, 'Return resulting image with \'Content-Disposition: attachment \' headers for the browser to start downloading it. Pass 0 for no header, or 1 for otherwise. Default value is set to 0.', true) ->label('scope', 'avatars.read') ->label('sdk.namespace', 'avatars') ->label('sdk.method', 'getQR') diff --git a/app/controllers/console.php b/app/controllers/console.php index ef36ba9e01..b213158d2a 100644 --- a/app/controllers/console.php +++ b/app/controllers/console.php @@ -174,9 +174,7 @@ $utopia->get('/console/database/collection') ->desc('Platform console project settings') ->label('permission', 'public') ->label('scope', 'console') - ->param('id', '', function () { - return new UID(); - }, 'Collection unique ID.') + ->param('id', '', function () { return new UID(); }, 'Collection unique ID.') ->action(function ($id) use ($layout, $projectDB) { $collection = $projectDB->getDocument($id, false); diff --git a/app/controllers/database.php b/app/controllers/database.php index a9de951e89..6b2a2460a3 100644 --- a/app/controllers/database.php +++ b/app/controllers/database.php @@ -27,18 +27,10 @@ $utopia->get('/v1/database') ->label('sdk.namespace', 'database') ->label('sdk.method', 'listCollections') ->label('sdk.description', 'Get a list of all the user collections. You can use the query params to filter your results. On admin mode, this endpoint will return a list of all of the project collections. [Learn more about different API modes](/docs/modes).') - ->param('search', '', function () { - return new Text(256); - }, 'Search term to filter your list results.', true) - ->param('limit', 25, function () { - return new Range(0, 100); - }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true) - ->param('offset', 0, function () { - return new Range(0, 40000); - }, 'Results offset. The default value is 0. Use this param to manage pagination.', true) - ->param('orderType', 'ASC', function () { - return new WhiteList(['ASC', 'DESC']); - }, 'Order result by ASC or DESC order.', true) + ->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true) + ->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true) + ->param('offset', 0, function () { return new Range(0, 40000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true) + ->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true) ->action( function ($search, $limit, $offset, $orderType) use ($response, $projectDB) { /*$vl = new Structure($projectDB); @@ -82,9 +74,7 @@ $utopia->get('/v1/database/:collectionId') ->label('sdk.namespace', 'database') ->label('sdk.method', 'getCollection') ->label('sdk.description', 'Get collection by its unique ID. This endpoint response returns a JSON object with the collection metadata.') - ->param('collectionId', '', function () { - return new UID(); - }, 'Collection unique ID.') + ->param('collectionId', '', function () { return new UID(); }, 'Collection unique ID.') ->action( function ($collectionId) use ($response, $projectDB) { $collection = $projectDB->getDocument($collectionId, false); @@ -104,18 +94,10 @@ $utopia->post('/v1/database') ->label('sdk.namespace', 'database') ->label('sdk.method', 'createCollection') ->label('sdk.description', 'Create a new Collection.') - ->param('name', '', function () { - return new Text(256); - }, 'Collection name.') - ->param('read', [], function () { - return new ArrayList(new Text(64)); - }, 'An array of strings with read permissions. [Learn more about permissions and roles](/docs/permissions).', true) - ->param('write', [], function () { - return new ArrayList(new Text(64)); - }, 'An array of strings with write permissions. [Learn more about permissions and roles](/docs/permissions).', true) - ->param('rules', [], function () use ($projectDB) { - return new ArrayList(new Collection($projectDB, [Database::SYSTEM_COLLECTION_RULES], ['$collection' => Database::SYSTEM_COLLECTION_RULES, '$permissions' => ['read' => [], 'write' => []]])); - }, 'Array of [rule objects](/docs/rules). Each rule define a collection field name, data type and validation', true) + ->param('name', '', function () { return new Text(256); }, 'Collection name.') + ->param('read', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with read permissions. [Learn more about permissions and roles](/docs/permissions).', true) + ->param('write', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with write permissions. [Learn more about permissions and roles](/docs/permissions).', true) + ->param('rules', [], function () use ($projectDB) { return new ArrayList(new Collection($projectDB, [Database::SYSTEM_COLLECTION_RULES], ['$collection' => Database::SYSTEM_COLLECTION_RULES, '$permissions' => ['read' => [], 'write' => []]])); }, 'Array of [rule objects](/docs/rules). Each rule define a collection field name, data type and validation', true) ->action( function ($name, $read, $write, $rules) use ($response, $projectDB, $webhook, $audit) { $parsedRules = []; @@ -179,21 +161,11 @@ $utopia->put('/v1/database/:collectionId') ->label('sdk.namespace', 'database') ->label('sdk.method', 'updateCollection') ->label('sdk.description', 'Update collection by its unique ID.') - ->param('collectionId', '', function () { - return new UID(); - }, 'Collection unique ID.') - ->param('name', null, function () { - return new Text(256); - }, 'Collection name.') - ->param('read', [], function () { - return new ArrayList(new Text(64)); - }, 'An array of strings with read permissions. [Learn more about permissions and roles](/docs/permissions).', true) - ->param('write', [], function () { - return new ArrayList(new Text(64)); - }, 'An array of strings with write permissions. [Learn more about permissions and roles](/docs/permissions).', true) - ->param('rules', [], function () use ($projectDB) { - return new ArrayList(new Collection($projectDB, [Database::SYSTEM_COLLECTION_RULES], ['$collection' => Database::SYSTEM_COLLECTION_RULES, '$permissions' => ['read' => [], 'write' => []]])); - }, 'Array of [rule objects](/docs/rules). Each rule define a collection field name, data type and validation', true) + ->param('collectionId', '', function () { return new UID(); }, 'Collection unique ID.') + ->param('name', null, function () { return new Text(256); }, 'Collection name.') + ->param('read', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with read permissions. [Learn more about permissions and roles](/docs/permissions).', true) + ->param('write', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with write permissions. [Learn more about permissions and roles](/docs/permissions).', true) + ->param('rules', [], function () use ($projectDB) { return new ArrayList(new Collection($projectDB, [Database::SYSTEM_COLLECTION_RULES], ['$collection' => Database::SYSTEM_COLLECTION_RULES, '$permissions' => ['read' => [], 'write' => []]])); }, 'Array of [rule objects](/docs/rules). Each rule define a collection field name, data type and validation', true) ->action( function ($collectionId, $name, $read, $write, $rules) use ($response, $projectDB) { $collection = $projectDB->getDocument($collectionId, false); @@ -239,9 +211,7 @@ $utopia->delete('/v1/database/:collectionId') ->label('sdk.namespace', 'database') ->label('sdk.method', 'deleteCollection') ->label('sdk.description', 'Delete a collection by its unique ID. Only users with write permissions have access to delete this resource.') - ->param('collectionId', '', function () { - return new UID(); - }, 'Collection unique ID.') + ->param('collectionId', '', function () { return new UID(); }, 'Collection unique ID.') ->action( function ($collectionId) use ($response, $projectDB, $audit) { $collection = $projectDB->getDocument($collectionId, false); @@ -270,36 +240,16 @@ $utopia->get('/v1/database/:collectionId/documents') ->label('sdk.namespace', 'database') ->label('sdk.method', 'listDocuments') ->label('sdk.description', 'Get a list of all the user documents. You can use the query params to filter your results. On admin mode, this endpoint will return a list of all of the project documents. [Learn more about different API modes](/docs/modes).') - ->param('collectionId', null, function () { - return new UID(); - }, 'Collection unique ID.') - ->param('filters', [], function () { - return new ArrayList(new Text(128)); - }, 'Array of filter strings. Each filter is constructed from a key name, comparison operator (=, !=, >, <, <=, >=) and a value. You can also use a dot (.) separator in attribute names to filter by child document attributes. Examples: \'name=John Doe\' or \'category.$uid>=5bed2d152c362\'', true) - ->param('offset', 0, function () { - return new Range(0, 900000000); - }, 'Offset value. Use this value to manage pagination.', true) - ->param('limit', 50, function () { - return new Range(0, 1000); - }, 'Maximum number of documents to return in response. Use this value to manage pagination.', true) - ->param('order-field', '$uid', function () { - return new Text(128); - }, 'Document field that results will be sorted by.', true) - ->param('order-type', 'ASC', function () { - return new WhiteList(array('DESC', 'ASC')); - }, 'Order direction. Possible values are DESC for descending order, or ASC for ascending order.', true) - ->param('order-cast', 'string', function () { - return new WhiteList(array('int', 'string', 'date', 'time', 'datetime')); - }, 'Order field type casting. Possible values are int, string, date, time or datetime. The database will attempt to cast the order field to the value you pass here. The default value is a string.', true) - ->param('search', '', function () { - return new Text(256); - }, 'Search query. Enter any free text search. The database will try to find a match against all document attributes and children.', true) - ->param('first', 0, function () { - return new Range(0, 1); - }, 'Return only first document. Pass 1 for true or 0 for false. The default value is 0.', true) - ->param('last', 0, function () { - return new Range(0, 1); - }, 'Return only last document. Pass 1 for true or 0 for false. The default value is 0.', true) + ->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID.') + ->param('filters', [], function () { return new ArrayList(new Text(128)); }, 'Array of filter strings. Each filter is constructed from a key name, comparison operator (=, !=, >, <, <=, >=) and a value. You can also use a dot (.) separator in attribute names to filter by child document attributes. Examples: \'name=John Doe\' or \'category.$uid>=5bed2d152c362\'', true) + ->param('offset', 0, function () { return new Range(0, 900000000); }, 'Offset value. Use this value to manage pagination.', true) + ->param('limit', 50, function () { return new Range(0, 1000); }, 'Maximum number of documents to return in response. Use this value to manage pagination.', true) + ->param('order-field', '$uid', function () { return new Text(128); }, 'Document field that results will be sorted by.', true) + ->param('order-type', 'ASC', function () { return new WhiteList(array('DESC', 'ASC')); }, 'Order direction. Possible values are DESC for descending order, or ASC for ascending order.', true) + ->param('order-cast', 'string', function () { return new WhiteList(array('int', 'string', 'date', 'time', 'datetime')); }, 'Order field type casting. Possible values are int, string, date, time or datetime. The database will attempt to cast the order field to the value you pass here. The default value is a string.', true) + ->param('search', '', function () { return new Text(256); }, 'Search query. Enter any free text search. The database will try to find a match against all document attributes and children.', true) + ->param('first', 0, function () { return new Range(0, 1); }, 'Return only first document. Pass 1 for true or 0 for false. The default value is 0.', true) + ->param('last', 0, function () { return new Range(0, 1); }, 'Return only last document. Pass 1 for true or 0 for false. The default value is 0.', true) ->action( function ($collectionId, $filters, $offset, $limit, $orderField, $orderType, $orderCast, $search, $first, $last) use ($response, $projectDB, $isDev) { $collection = $projectDB->getDocument($collectionId, $isDev); @@ -356,12 +306,8 @@ $utopia->get('/v1/database/:collectionId/documents/:documentId') ->label('sdk.namespace', 'database') ->label('sdk.method', 'getDocument') ->label('sdk.description', 'Get document by its unique ID. This endpoint response returns a JSON object with the document data.') - ->param('collectionId', null, function () { - return new UID(); - }, 'Collection unique ID') - ->param('documentId', null, function () { - return new UID(); - }, 'Document unique ID') + ->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID') + ->param('documentId', null, function () { return new UID(); }, 'Document unique ID') ->action( function ($collectionId, $documentId) use ($response, $request, $projectDB, $isDev) { $document = $projectDB->getDocument($documentId, $isDev); @@ -405,27 +351,13 @@ $utopia->post('/v1/database/:collectionId/documents') ->label('sdk.namespace', 'database') ->label('sdk.method', 'createDocument') ->label('sdk.description', 'Create a new Document.') - ->param('collectionId', null, function () { - return new UID(); - }, 'Collection unique ID.') - ->param('data', [], function () { - return new \Utopia\Validator\Mock(); - }, 'Document data as JSON string.') - ->param('read', [], function () { - return new ArrayList(new Text(64)); - }, 'An array of strings with read permissions. [Learn more about permissions and roles](/docs/permissions).', true) - ->param('write', [], function () { - return new ArrayList(new Text(64)); - }, 'An array of strings with write permissions. [Learn more about permissions and roles](/docs/permissions).', true) - ->param('parentDocument', '', function () { - return new UID(); - }, 'Parent document unique ID. Use when you want your new document to be a child of a parent document.', true) - ->param('parentProperty', '', function () { - return new Key(); - }, 'Parent document property name. Use when you want your new document to be a child of a parent document.', true) - ->param('parentPropertyType', Document::SET_TYPE_ASSIGN, function () { - return new WhiteList([Document::SET_TYPE_ASSIGN, Document::SET_TYPE_APPEND, Document::SET_TYPE_PREPEND]); - }, 'Parent document property connection type. You can set this value to **assign**, **append** or **prepend**, default value is assign. Use when you want your new document to be a child of a parent document.', true) + ->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID.') + ->param('data', [], function () { return new \Utopia\Validator\Mock(); }, 'Document data as JSON string.') + ->param('read', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with read permissions. [Learn more about permissions and roles](/docs/permissions).', true) + ->param('write', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with write permissions. [Learn more about permissions and roles](/docs/permissions).', true) + ->param('parentDocument', '', function () { return new UID(); }, 'Parent document unique ID. Use when you want your new document to be a child of a parent document.', true) + ->param('parentProperty', '', function () { return new Key(); }, 'Parent document property name. Use when you want your new document to be a child of a parent document.', true) + ->param('parentPropertyType', Document::SET_TYPE_ASSIGN, function () { return new WhiteList([Document::SET_TYPE_ASSIGN, Document::SET_TYPE_APPEND, Document::SET_TYPE_PREPEND]); }, 'Parent document property connection type. You can set this value to **assign**, **append** or **prepend**, default value is assign. Use when you want your new document to be a child of a parent document.', true) ->action( function ($collectionId, $data, $read, $write, $parentDocument, $parentProperty, $parentPropertyType) use ($response, $projectDB, $webhook, $audit) { $data = (is_string($data) && $result = json_decode($data, true)) ? $result : $data; // Cast to JSON array @@ -524,21 +456,11 @@ $utopia->patch('/v1/database/:collectionId/documents/:documentId') ->label('scope', 'documents.write') ->label('sdk.namespace', 'database') ->label('sdk.method', 'updateDocument') - ->param('collectionId', null, function () { - return new UID(); - }, 'Collection unique ID') - ->param('documentId', null, function () { - return new UID(); - }, 'Document unique ID') - ->param('data', [], function () { - return new \Utopia\Validator\Mock(); - }, 'Document data as JSON string') - ->param('read', [], function () { - return new ArrayList(new Text(64)); - }, 'An array of strings with read permissions. [Learn more about permissions and roles](/docs/permissions).', true) - ->param('write', [], function () { - return new ArrayList(new Text(64)); - }, 'An array of strings with write permissions. [Learn more about permissions and roles](/docs/permissions).', true) + ->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID') + ->param('documentId', null, function () { return new UID(); }, 'Document unique ID') + ->param('data', [], function () { return new \Utopia\Validator\Mock(); }, 'Document data as JSON string') + ->param('read', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with read permissions. [Learn more about permissions and roles](/docs/permissions).', true) + ->param('write', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with write permissions. [Learn more about permissions and roles](/docs/permissions).', true) ->action( function ($collectionId, $documentId, $data, $read, $write) use ($response, $projectDB, &$output, $webhook, $audit, $isDev) { $collection = $projectDB->getDocument($collectionId/*, $isDev*/); @@ -611,12 +533,8 @@ $utopia->delete('/v1/database/:collectionId/documents/:documentId') ->label('sdk.namespace', 'database') ->label('sdk.method', 'deleteDocument') ->label('sdk.description', 'Delete document by its unique ID. This endpoint deletes only the parent documents, his attributes and relations to other documents. Child documents **will not** be deleted.') - ->param('collectionId', null, function () { - return new UID(); - }, 'Collection unique ID') - ->param('documentId', null, function () { - return new UID(); - }, 'Document unique ID') + ->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID') + ->param('documentId', null, function () { return new UID(); }, 'Document unique ID') ->action( function ($collectionId, $documentId) use ($response, $projectDB, $audit, $isDev) { $collection = $projectDB->getDocument($collectionId, $isDev); diff --git a/app/controllers/projects.php b/app/controllers/projects.php index 2633e023e9..b06e602d52 100644 --- a/app/controllers/projects.php +++ b/app/controllers/projects.php @@ -67,9 +67,7 @@ $utopia->get('/v1/projects/:projectId') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'getProject') - ->param('projectId', '', function () { - return new UID(); - }, 'Project unique ID.') + ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') ->action( function ($projectId) use ($request, $response, $providers, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -96,9 +94,7 @@ $utopia->get('/v1/projects/:projectId/usage') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'getProjectUsage') - ->param('projectId', '', function () { - return new UID(); - }, 'Project unique ID.') + ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') ->action( function ($projectId) use ($response, $consoleDB, $projectDB, $register) { $project = $consoleDB->getDocument($projectId); @@ -232,39 +228,17 @@ $utopia->post('/v1/projects') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'createProject') - ->param('name', null, function () { - return new Text(100); - }, 'Project name') - ->param('teamId', '', function () { - return new UID(); - }, 'Team unique ID.') - ->param('description', '', function () { - return new Text(255); - }, 'Project description', true) - ->param('logo', '', function () { - return new Text(1024); - }, 'Project logo', true) - ->param('url', '', function () { - return new URL(); - }, 'Project URL', true) - ->param('legalName', '', function () { - return new Text(256); - }, 'Project Legal Name', true) - ->param('legalCountry', '', function () { - return new Text(256); - }, 'Project Legal Country', true) - ->param('legalState', '', function () { - return new Text(256); - }, 'Project Legal State', true) - ->param('legalCity', '', function () { - return new Text(256); - }, 'Project Legal City', true) - ->param('legalAddress', '', function () { - return new Text(256); - }, 'Project Legal Address', true) - ->param('legalTaxId', '', function () { - return new Text(256); - }, 'Project Legal Tax ID', true) + ->param('name', null, function () { return new Text(100); }, 'Project name') + ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') + ->param('description', '', function () { return new Text(255); }, 'Project description', true) + ->param('logo', '', function () { return new Text(1024); }, 'Project logo', true) + ->param('url', '', function () { return new URL(); }, 'Project URL', true) + ->param('legalName', '', function () { return new Text(256); }, 'Project Legal Name', true) + ->param('legalCountry', '', function () { return new Text(256); }, 'Project Legal Country', true) + ->param('legalState', '', function () { return new Text(256); }, 'Project Legal State', true) + ->param('legalCity', '', function () { return new Text(256); }, 'Project Legal City', true) + ->param('legalAddress', '', function () { return new Text(256); }, 'Project Legal Address', true) + ->param('legalTaxId', '', function () { return new Text(256); }, 'Project Legal Tax ID', true) ->action( function ($name, $teamId, $description, $logo, $url, $legalName, $legalCountry, $legalState, $legalCity, $legalAddress, $legalTaxId) use ($response, $user, $consoleDB, $projectDB) { $team = $projectDB->getDocument($teamId); @@ -314,39 +288,17 @@ $utopia->patch('/v1/projects/:projectId') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'updateProject') - ->param('projectId', '', function () { - return new UID(); - }, 'Project unique ID.') - ->param('name', null, function () { - return new Text(100); - }, 'Project name') - ->param('description', '', function () { - return new Text(255); - }, 'Project description', true) - ->param('logo', '', function () { - return new Text(1024); - }, 'Project logo', true) - ->param('url', '', function () { - return new URL(); - }, 'Project URL', true) - ->param('legalName', '', function () { - return new Text(256); - }, 'Project Legal Name', true) - ->param('legalCountry', '', function () { - return new Text(256); - }, 'Project Legal Country', true) - ->param('legalState', '', function () { - return new Text(256); - }, 'Project Legal State', true) - ->param('legalCity', '', function () { - return new Text(256); - }, 'Project Legal City', true) - ->param('legalAddress', '', function () { - return new Text(256); - }, 'Project Legal Address', true) - ->param('legalTaxId', '', function () { - return new Text(256); - }, 'Project Legal Tax ID', true) + ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') + ->param('name', null, function () { return new Text(100); }, 'Project name') + ->param('description', '', function () { return new Text(255); }, 'Project description', true) + ->param('logo', '', function () { return new Text(1024); }, 'Project logo', true) + ->param('url', '', function () { return new URL(); }, 'Project URL', true) + ->param('legalName', '', function () { return new Text(256); }, 'Project Legal Name', true) + ->param('legalCountry', '', function () { return new Text(256); }, 'Project Legal Country', true) + ->param('legalState', '', function () { return new Text(256); }, 'Project Legal State', true) + ->param('legalCity', '', function () { return new Text(256); }, 'Project Legal City', true) + ->param('legalAddress', '', function () { return new Text(256); }, 'Project Legal Address', true) + ->param('legalTaxId', '', function () { return new Text(256); }, 'Project Legal Tax ID', true) ->action( function ($projectId, $name, $description, $logo, $url, $legalName, $legalCountry, $legalState, $legalCity, $legalAddress, $legalTaxId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -381,18 +333,10 @@ $utopia->patch('/v1/projects/:projectId/oauth') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'updateProjectOAuth') - ->param('projectId', '', function () { - return new UID(); - }, 'Project unique ID.') - ->param('provider', '', function () use ($providers) { - return new WhiteList(array_keys($providers)); - }, 'Provider Name', false) - ->param('appId', '', function () { - return new Text(256); - }, 'Provider App ID', true) - ->param('secret', '', function () { - return new text(256); - }, 'Provider Secret Key', true) + ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') + ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'Provider Name', false) + ->param('appId', '', function () { return new Text(256); }, 'Provider App ID', true) + ->param('secret', '', function () { return new text(256); }, 'Provider Secret Key', true) ->action( function ($projectId, $provider, $appId, $secret) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -430,9 +374,7 @@ $utopia->delete('/v1/projects/:projectId') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'deleteProject') - ->param('projectId', '', function () { - return new UID(); - }, 'Project unique ID.') + ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') ->action( function ($projectId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -466,9 +408,7 @@ $utopia->get('/v1/projects/:projectId/webhooks') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'listWebhooks') - ->param('projectId', '', function () { - return new UID(); - }, 'Project unique ID.') + ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') ->action( function ($projectId) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -500,12 +440,8 @@ $utopia->get('/v1/projects/:projectId/webhooks/:webhookId') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'getWebhook') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('webhookId', null, function () { - return new UID(); - }, 'Webhook unique ID.') + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('webhookId', null, function () { return new UID(); }, 'Webhook unique ID.') ->action( function ($projectId, $webhookId) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -536,27 +472,13 @@ $utopia->post('/v1/projects/:projectId/webhooks') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'createWebhook') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('name', null, function () { - return new Text(256); - }, 'Webhook name') - ->param('events', null, function () { - return new ArrayList(new Text(256)); - }, 'Webhook events list') - ->param('url', null, function () { - return new Text(2000); - }, 'Webhook URL') - ->param('security', null, function () { - return new Range(0, 1); - }, 'Certificate verification, 0 for disabled or 1 for enabled') - ->param('httpUser', '', function () { - return new Text(256); - }, 'Webhook HTTP user', true) - ->param('httpPass', '', function () { - return new Text(256); - }, 'Webhook HTTP password', true) + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('name', null, function () { return new Text(256); }, 'Webhook name') + ->param('events', null, function () { return new ArrayList(new Text(256)); }, 'Webhook events list') + ->param('url', null, function () { return new Text(2000); }, 'Webhook URL') + ->param('security', null, function () { return new Range(0, 1); }, 'Certificate verification, 0 for disabled or 1 for enabled') + ->param('httpUser', '', function () { return new Text(256); }, 'Webhook HTTP user', true) + ->param('httpPass', '', function () { return new Text(256); }, 'Webhook HTTP password', true) ->action( function ($projectId, $name, $events, $url, $security, $httpUser, $httpPass) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -614,30 +536,14 @@ $utopia->put('/v1/projects/:projectId/webhooks/:webhookId') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'updateWebhook') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('webhookId', null, function () { - return new UID(); - }, 'Webhook unique ID.') - ->param('name', null, function () { - return new Text(256); - }, 'Webhook name') - ->param('events', null, function () { - return new ArrayList(new Text(256)); - }, 'Webhook events list') - ->param('url', null, function () { - return new Text(2000); - }, 'Webhook URL') - ->param('security', null, function () { - return new Range(0, 1); - }, 'Certificate verification, 0 for disabled or 1 for enabled') - ->param('httpUser', '', function () { - return new Text(256); - }, 'Webhook HTTP user', true) - ->param('httpPass', '', function () { - return new Text(256); - }, 'Webhook HTTP password', true) + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('webhookId', null, function () { return new UID(); }, 'Webhook unique ID.') + ->param('name', null, function () { return new Text(256); }, 'Webhook name') + ->param('events', null, function () { return new ArrayList(new Text(256)); }, 'Webhook events list') + ->param('url', null, function () { return new Text(2000); }, 'Webhook URL') + ->param('security', null, function () { return new Range(0, 1); }, 'Certificate verification, 0 for disabled or 1 for enabled') + ->param('httpUser', '', function () { return new Text(256); }, 'Webhook HTTP user', true) + ->param('httpPass', '', function () { return new Text(256); }, 'Webhook HTTP password', true) ->action( function ($projectId, $webhookId, $name, $events, $url, $security, $httpUser, $httpPass) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -685,12 +591,8 @@ $utopia->delete('/v1/projects/:projectId/webhooks/:webhookId') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'deleteWebhook') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('webhookId', null, function () { - return new UID(); - }, 'Webhook unique ID.') + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('webhookId', null, function () { return new UID(); }, 'Webhook unique ID.') ->action( function ($projectId, $webhookId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -720,9 +622,7 @@ $utopia->get('/v1/projects/:projectId/keys') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'listKeys') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') ->action( function ($projectId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -740,12 +640,8 @@ $utopia->get('/v1/projects/:projectId/keys/:keyId') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'getKey') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('keyId', null, function () { - return new UID(); - }, 'Key unique ID.') + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('keyId', null, function () { return new UID(); }, 'Key unique ID.') ->action( function ($projectId, $keyId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -769,15 +665,9 @@ $utopia->post('/v1/projects/:projectId/keys') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'createKey') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('name', null, function () { - return new Text(256); - }, 'Key name') - ->param('scopes', null, function () use ($scopes) { - return new ArrayList(new WhiteList($scopes)); - }, 'Key scopes list') + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('name', null, function () { return new Text(256); }, 'Key name') + ->param('scopes', null, function () use ($scopes) { return new ArrayList(new WhiteList($scopes)); }, 'Key scopes list') ->action( function ($projectId, $name, $scopes) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -821,18 +711,10 @@ $utopia->put('/v1/projects/:projectId/keys/:keyId') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'updateKey') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('keyId', null, function () { - return new UID(); - }, 'Key unique ID.') - ->param('name', null, function () { - return new Text(256); - }, 'Key name') - ->param('scopes', null, function () use ($scopes) { - return new ArrayList(new WhiteList($scopes)); - }, 'Key scopes list') + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('keyId', null, function () { return new UID(); }, 'Key unique ID.') + ->param('name', null, function () { return new Text(256); }, 'Key name') + ->param('scopes', null, function () use ($scopes) { return new ArrayList(new WhiteList($scopes)); }, 'Key scopes list') ->action( function ($projectId, $keyId, $name, $scopes) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -865,12 +747,8 @@ $utopia->delete('/v1/projects/:projectId/keys/:keyId') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'deleteKey') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('keyId', null, function () { - return new UID(); - }, 'Key unique ID.') + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('keyId', null, function () { return new UID(); }, 'Key unique ID.') ->action( function ($projectId, $keyId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -900,9 +778,7 @@ $utopia->get('/v1/projects/:projectId/tasks') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'listTasks') - ->param('projectId', '', function () { - return new UID(); - }, 'Project unique ID.') + ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') ->action( function ($projectId) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -934,12 +810,8 @@ $utopia->get('/v1/projects/:projectId/tasks/:taskId') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'getTask') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('taskId', null, function () { - return new UID(); - }, 'Task unique ID.') + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('taskId', null, function () { return new UID(); }, 'Task unique ID.') ->action( function ($projectId, $taskId) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -970,36 +842,16 @@ $utopia->post('/v1/projects/:projectId/tasks') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'createTask') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('name', null, function () { - return new Text(256); - }, 'Task name') - ->param('status', null, function () { - return new WhiteList(['play', 'pause']); - }, 'Task status') - ->param('schedule', null, function () { - return new Cron(); - }, 'Task schedule syntax') - ->param('security', null, function () { - return new Range(0, 1); - }, 'Certificate verification, 0 for disabled or 1 for enabled') - ->param('httpMethod', '', function () { - return new WhiteList(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS', 'TRACE', 'CONNECT']); - }, 'Task HTTP method') - ->param('httpUrl', '', function () { - return new URL(); - }, 'Task HTTP URL') - ->param('httpHeaders', null, function () { - return new ArrayList(new Text(256)); - }, 'Task HTTP headers list', true) - ->param('httpUser', '', function () { - return new Text(256); - }, 'Task HTTP user', true) - ->param('httpPass', '', function () { - return new Text(256); - }, 'Task HTTP password', true) + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('name', null, function () { return new Text(256); }, 'Task name') + ->param('status', null, function () { return new WhiteList(['play', 'pause']); }, 'Task status') + ->param('schedule', null, function () { return new Cron(); }, 'Task schedule syntax') + ->param('security', null, function () { return new Range(0, 1); }, 'Certificate verification, 0 for disabled or 1 for enabled') + ->param('httpMethod', '', function () { return new WhiteList(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS', 'TRACE', 'CONNECT']); }, 'Task HTTP method') + ->param('httpUrl', '', function () { return new URL(); }, 'Task HTTP URL') + ->param('httpHeaders', null, function () { return new ArrayList(new Text(256)); }, 'Task HTTP headers list', true) + ->param('httpUser', '', function () { return new Text(256); }, 'Task HTTP user', true) + ->param('httpPass', '', function () { return new Text(256); }, 'Task HTTP password', true) ->action( function ($projectId, $name, $status, $schedule, $security, $httpMethod, $httpUrl, $httpHeaders, $httpUser, $httpPass) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -1072,39 +924,17 @@ $utopia->put('/v1/projects/:projectId/tasks/:taskId') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'updateTask') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('taskId', null, function () { - return new UID(); - }, 'Task unique ID.') - ->param('name', null, function () { - return new Text(256); - }, 'Task name') - ->param('status', null, function () { - return new WhiteList(['play', 'pause']); - }, 'Task status') - ->param('schedule', null, function () { - return new Cron(); - }, 'Task schedule syntax') - ->param('security', null, function () { - return new Range(0, 1); - }, 'Certificate verification, 0 for disabled or 1 for enabled') - ->param('httpMethod', '', function () { - return new WhiteList(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS', 'TRACE', 'CONNECT']); - }, 'Task HTTP method') - ->param('httpUrl', '', function () { - return new URL(); - }, 'Task HTTP URL') - ->param('httpHeaders', null, function () { - return new ArrayList(new Text(256)); - }, 'Task HTTP headers list', true) - ->param('httpUser', '', function () { - return new Text(256); - }, 'Task HTTP user', true) - ->param('httpPass', '', function () { - return new Text(256); - }, 'Task HTTP password', true) + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('taskId', null, function () { return new UID(); }, 'Task unique ID.') + ->param('name', null, function () { return new Text(256); }, 'Task name') + ->param('status', null, function () { return new WhiteList(['play', 'pause']); }, 'Task status') + ->param('schedule', null, function () { return new Cron(); }, 'Task schedule syntax') + ->param('security', null, function () { return new Range(0, 1); }, 'Certificate verification, 0 for disabled or 1 for enabled') + ->param('httpMethod', '', function () { return new WhiteList(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS', 'TRACE', 'CONNECT']); }, 'Task HTTP method') + ->param('httpUrl', '', function () { return new URL(); }, 'Task HTTP URL') + ->param('httpHeaders', null, function () { return new ArrayList(new Text(256)); }, 'Task HTTP headers list', true) + ->param('httpUser', '', function () { return new Text(256); }, 'Task HTTP user', true) + ->param('httpPass', '', function () { return new Text(256); }, 'Task HTTP password', true) ->action( function ($projectId, $taskId, $name, $status, $schedule, $security, $httpMethod, $httpUrl, $httpHeaders, $httpUser, $httpPass) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -1164,12 +994,8 @@ $utopia->delete('/v1/projects/:projectId/tasks/:taskId') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'deleteTask') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('taskId', null, function () { - return new UID(); - }, 'Task unique ID.') + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('taskId', null, function () { return new UID(); }, 'Task unique ID.') ->action( function ($projectId, $taskId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -1199,9 +1025,7 @@ $utopia->get('/v1/projects/:projectId/platforms') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'listPlatforms') - ->param('projectId', '', function () { - return new UID(); - }, 'Project unique ID.') + ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') ->action( function ($projectId) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -1221,12 +1045,8 @@ $utopia->get('/v1/projects/:projectId/platforms/:platformId') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'getPlatform') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('platformId', null, function () { - return new UID(); - }, 'Platform unique ID.') + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('platformId', null, function () { return new UID(); }, 'Platform unique ID.') ->action( function ($projectId, $platformId) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -1250,24 +1070,12 @@ $utopia->post('/v1/projects/:projectId/platforms') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'createPlatform') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('type', null, function () { - return new WhiteList(['web', 'ios', 'android', 'unity']); - }, 'Platform name') - ->param('name', null, function () { - return new Text(256); - }, 'Platform name') - ->param('key', '', function () { - return new Text(256); - }, 'Package name for android or bundle ID for iOS', true) - ->param('store', '', function () { - return new Text(256); - }, 'App store or Google Play store ID', true) - ->param('url', '', function () { - return new URL(); - }, 'Platform client URL', true) + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('type', null, function () { return new WhiteList(['web', 'ios', 'android', 'unity']); }, 'Platform name') + ->param('name', null, function () { return new Text(256); }, 'Platform name') + ->param('key', '', function () { return new Text(256); }, 'Package name for android or bundle ID for iOS', true) + ->param('store', '', function () { return new Text(256); }, 'App store or Google Play store ID', true) + ->param('url', '', function () { return new URL(); }, 'Platform client URL', true) ->action( function ($projectId, $type, $name, $key, $store, $url) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -1315,24 +1123,12 @@ $utopia->put('/v1/projects/:projectId/platforms/:platformId') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'updatePlatform') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('platformId', null, function () { - return new UID(); - }, 'Platform unique ID.') - ->param('name', null, function () { - return new Text(256); - }, 'Platform name') - ->param('key', '', function () { - return new Text(256); - }, 'Package name for android or bundle ID for iOS', true) - ->param('store', '', function () { - return new Text(256); - }, 'App store or Google Play store ID', true) - ->param('url', '', function () { - return new URL(); - }, 'Platform client URL', true) + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('platformId', null, function () { return new UID(); }, 'Platform unique ID.') + ->param('name', null, function () { return new Text(256); }, 'Platform name') + ->param('key', '', function () { return new Text(256); }, 'Package name for android or bundle ID for iOS', true) + ->param('store', '', function () { return new Text(256); }, 'App store or Google Play store ID', true) + ->param('url', '', function () { return new URL(); }, 'Platform client URL', true) ->action( function ($projectId, $platformId, $name, $key, $store, $url) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); @@ -1368,12 +1164,8 @@ $utopia->delete('/v1/projects/:projectId/platforms/:platformId') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') ->label('sdk.method', 'deletePlatform') - ->param('projectId', null, function () { - return new UID(); - }, 'Project unique ID.') - ->param('platformId', null, function () { - return new UID(); - }, 'Platform unique ID.') + ->param('projectId', null, function () { return new UID(); }, 'Project unique ID.') + ->param('platformId', null, function () { return new UID(); }, 'Platform unique ID.') ->action( function ($projectId, $platformId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); diff --git a/app/controllers/storage.php b/app/controllers/storage.php index c397d69e3f..81c1b6ceac 100644 --- a/app/controllers/storage.php +++ b/app/controllers/storage.php @@ -119,18 +119,10 @@ $utopia->get('/v1/storage/files') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'listFiles') ->label('sdk.description', 'Get a list of all the user files. You can use the query params to filter your results. On admin mode, this endpoint will return a list of all of the project files. [Learn more about different API modes](/docs/modes).') - ->param('search', '', function () { - return new Text(256); - }, 'Search term to filter your list results.', true) - ->param('limit', 25, function () { - return new Range(0, 100); - }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true) - ->param('offset', 0, function () { - return new Range(0, 2000); - }, 'Results offset. The default value is 0. Use this param to manage pagination.', true) - ->param('orderType', 'ASC', function () { - return new WhiteList(['ASC', 'DESC']); - }, 'Order result by ASC or DESC order.', true) + ->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true) + ->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true) + ->param('offset', 0, function () { return new Range(0, 2000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true) + ->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true) ->action( function ($search, $limit, $offset, $orderType) use ($response, $projectDB) { $results = $projectDB->getCollection([ @@ -159,9 +151,7 @@ $utopia->get('/v1/storage/files/:fileId') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFile') ->label('sdk.description', 'Get file by its unique ID. This endpoint response returns a JSON object with the file metadata.') - ->param('fileId', '', function () { - return new UID(); - }, 'File unique ID.') + ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') ->action( function ($fileId) use ($response, $projectDB) { $file = $projectDB->getDocument($fileId); @@ -180,24 +170,12 @@ $utopia->get('/v1/storage/files/:fileId/preview') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFilePreview') ->label('sdk.description', 'Get file preview image. Currently, this method supports preview for image files (jpg, png, and gif), other supported formats, like pdf, docs, slides, and spreadsheets will return file icon image. You can also pass query string arguments for cutting and resizing your preview image.') - ->param('fileId', '', function () { - return new UID(); - }, 'File unique ID') - ->param('width', 0, function () { - return new Range(0, 4000); - }, 'Resize preview image width, Pass an integer between 0 to 4000', true) - ->param('height', 0, function () { - return new Range(0, 4000); - }, 'Resize preview image height, Pass an integer between 0 to 4000', true) - ->param('quality', 100, function () { - return new Range(0, 100); - }, 'Preview image quality. Pass an integer between 0 to 100. Defaults to 100', true) - ->param('background', '', function () { - return new HexColor(); - }, 'Preview image background color. Only works with transparent images (png). Use a valid HEX color, no # is needed for prefix.', true) - ->param('output', null, function () use ($outputs) { - return new WhiteList(array_merge(array_keys($outputs), [null])); - }, 'Output format type (jpeg, jpg, png, gif and webp)', true) + ->param('fileId', '', function () { return new UID(); }, 'File unique ID') + ->param('width', 0, function () { return new Range(0, 4000); }, 'Resize preview image width, Pass an integer between 0 to 4000', true) + ->param('height', 0, function () { return new Range(0, 4000); }, 'Resize preview image height, Pass an integer between 0 to 4000', true) + ->param('quality', 100, function () { return new Range(0, 100); }, 'Preview image quality. Pass an integer between 0 to 100. Defaults to 100', true) + ->param('background', '', function () { return new HexColor(); }, 'Preview image background color. Only works with transparent images (png). Use a valid HEX color, no # is needed for prefix.', true) + ->param('output', null, function () use ($outputs) { return new WhiteList(array_merge(array_keys($outputs), [null])); }, 'Output format type (jpeg, jpg, png, gif and webp)', true) //->param('storage', 'local', function () {return new WhiteList(array('local'));}, 'Selected storage device. defaults to local') //->param('token', '', function () {return new Text(128);}, 'Preview token', true) ->action( @@ -304,9 +282,7 @@ $utopia->get('/v1/storage/files/:fileId/download') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFileDownload') ->label('sdk.description', 'Get file content by its unique ID. The endpoint response return with a \'Content-Disposition: attachment\' header that tells the browser to start downloading the file to user downloads directory.') - ->param('fileId', '', function () { - return new UID(); - }, 'File unique ID.') + ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') ->action( function ($fileId) use ($response, $request, $projectDB) { $file = $projectDB->getDocument($fileId); @@ -356,12 +332,8 @@ $utopia->get('/v1/storage/files/:fileId/view') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFileView') ->label('sdk.description', 'Get file content by its unique ID. This endpoint is similar to the download method but returns with no \'Content-Disposition: attachment\' header.') - ->param('fileId', '', function () { - return new UID(); - }, 'File unique ID.') - ->param('as', '', function () { - return new WhiteList(['pdf', /*'html',*/ 'text']); - }, 'Choose a file format to convert your file to. Currently you can only convert word and pdf files to pdf or txt. This option is currently experimental only, use at your own risk.', true) + ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') + ->param('as', '', function () { return new WhiteList(['pdf', /*'html',*/ 'text']); }, 'Choose a file format to convert your file to. Currently you can only convert word and pdf files to pdf or txt. This option is currently experimental only, use at your own risk.', true) ->action( function ($fileId, $as) use ($response, $request, $projectDB, $mimes) { $file = $projectDB->getDocument($fileId); @@ -428,18 +400,10 @@ $utopia->post('/v1/storage/files') ->label('sdk.method', 'createFile') ->label('sdk.description', 'Create a new file. The user who creates the file will automatically be assigned to read and write access unless he has passed custom values for read and write arguments.') ->label('sdk.consumes', 'multipart/form-data') - ->param('files', [], function () { - return new File(); - }, 'Binary Files.', false) - ->param('read', [], function () { - return new ArrayList(new Text(64)); - }, 'An array of strings with read permissions. [Learn more about permissions and roles](/docs/permissions).', true) - ->param('write', [], function () { - return new ArrayList(new Text(64)); - }, 'An array of strings with write permissions. [Learn more about permissions and roles](/docs/permissions).', true) - ->param('folderId', '', function () { - return new UID(); - }, 'Folder to associate files with.', true) + ->param('files', [], function () { return new File(); }, 'Binary Files.', false) + ->param('read', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with read permissions. [Learn more about permissions and roles](/docs/permissions).', true) + ->param('write', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with write permissions. [Learn more about permissions and roles](/docs/permissions).', true) + ->param('folderId', '', function () { return new UID(); }, 'Folder to associate files with.', true) ->action( function ($files, $read, $write, $folderId) use ($request, $response, $user, $projectDB, $audit, $usage) { $files = $request->getFiles('files'); @@ -558,18 +522,10 @@ $utopia->put('/v1/storage/files/:fileId') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'updateFile') ->label('sdk.description', 'Update file by its unique ID. Only users with write permissions have access to update this resource.') - ->param('fileId', '', function () { - return new UID(); - }, 'File unique ID.') - ->param('read', [], function () { - return new ArrayList(new Text(64)); - }, 'An array of strings with read permissions. [Learn more about permissions and roles](/docs/permissions).', true) - ->param('write', [], function () { - return new ArrayList(new Text(64)); - }, 'An array of strings with write permissions. [Learn more about permissions and roles](/docs/permissions).', true) - ->param('folderId', '', function () { - return new UID(); - }, 'Folder to associate files with.', true) + ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') + ->param('read', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with read permissions. [Learn more about permissions and roles](/docs/permissions).', true) + ->param('write', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with write permissions. [Learn more about permissions and roles](/docs/permissions).', true) + ->param('folderId', '', function () { return new UID(); }, 'Folder to associate files with.', true) ->action( function ($fileId, $read, $write, $folderId) use ($response, $projectDB) { $file = $projectDB->getDocument($fileId); @@ -600,9 +556,7 @@ $utopia->delete('/v1/storage/files/:fileId') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'deleteFile') ->label('sdk.description', 'Delete a file by its unique ID. Only users with write permissions have access to delete this resource.') - ->param('fileId', '', function () { - return new UID(); - }, 'File unique ID.') + ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') ->action( function ($fileId) use ($response, $projectDB, $audit, $usage) { $file = $projectDB->getDocument($fileId); @@ -638,11 +592,8 @@ $utopia->get('/v1/storage/files/:fileId/scan') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFileScan') ->label('sdk.hide', true) - ->param('fileId', '', function () { - return new UID(); - }, 'File unique ID.') - ->param('storage', 'local', function () { - return new WhiteList(['local']); + ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') + ->param('storage', 'local', function () { return new WhiteList(['local']); }) ->action( function ($fileId, $storage) use ($response, $request, $projectDB) { diff --git a/app/controllers/teams.php b/app/controllers/teams.php index 27a5fbe31a..84da0f23ec 100644 --- a/app/controllers/teams.php +++ b/app/controllers/teams.php @@ -24,18 +24,10 @@ $utopia->get('/v1/teams') ->label('sdk.namespace', 'teams') ->label('sdk.method', 'listTeams') ->label('sdk.description', 'Get a list of all the current user teams. You can use the query params to filter your results. On admin mode, this endpoint will return a list of all of the project teams. [Learn more about different API modes](/docs/modes).') - ->param('search', '', function () { - return new Text(256); - }, 'Search term to filter your list results.', true) - ->param('limit', 25, function () { - return new Range(0, 100); - }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true) - ->param('offset', 0, function () { - return new Range(0, 2000); - }, 'Results offset. The default value is 0. Use this param to manage pagination.', true) - ->param('orderType', 'ASC', function () { - return new WhiteList(['ASC', 'DESC']); - }, 'Order result by ASC or DESC order.', true) + ->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true) + ->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true) + ->param('offset', 0, function () { return new Range(0, 2000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true) + ->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true) ->action( function ($search, $limit, $offset, $orderType) use ($response, $projectDB) { $results = $projectDB->getCollection([ @@ -60,9 +52,7 @@ $utopia->get('/v1/teams/:teamId') ->label('sdk.namespace', 'teams') ->label('sdk.method', 'getTeam') ->label('sdk.description', 'Get team by its unique ID. All team members have read access for this resource.') - ->param('teamId', '', function () { - return new UID(); - }, 'Team unique ID.') + ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') ->action( function ($teamId) use ($response, $projectDB) { $team = $projectDB->getDocument($teamId); @@ -81,9 +71,7 @@ $utopia->get('/v1/teams/:teamId/members') ->label('sdk.namespace', 'teams') ->label('sdk.method', 'getTeamMembers') ->label('sdk.description', 'Get team members by the team unique ID. All team members have read access for this list of resources.') - ->param('teamId', '', function () { - return new UID(); - }, 'Team unique ID.') + ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') ->action( function ($teamId) use ($response, $projectDB) { $team = $projectDB->getDocument($teamId); @@ -135,12 +123,8 @@ $utopia->post('/v1/teams') ->label('sdk.namespace', 'teams') ->label('sdk.method', 'createTeam') ->label('sdk.description', 'Create a new team. The user who creates the team will automatically be assigned as the owner of the team. The team owner can invite new members, who will be able add new owners and update or delete the team from your project.') - ->param('name', null, function () { - return new Text(100); - }, 'Team name.') - ->param('roles', ['owner'], function () { - return new ArrayList(new Text(128)); - }, 'User roles array. Use this param to set the roles in the team for the user who created the team. The default role is **owner**, a role can be any string.', true) + ->param('name', null, function () { return new Text(100); }, 'Team name.') + ->param('roles', ['owner'], function () { return new ArrayList(new Text(128)); }, 'User roles array. Use this param to set the roles in the team for the user who created the team. The default role is **owner**, a role can be any string.', true) ->action( function ($name, $roles) use ($response, $projectDB, $user, $mode) { Authorization::disable(); @@ -201,12 +185,8 @@ $utopia->put('/v1/teams/:teamId') ->label('sdk.namespace', 'teams') ->label('sdk.method', 'updateTeam') ->label('sdk.description', 'Update team by its unique ID. Only team owners have write access for this resource.') - ->param('teamId', '', function () { - return new UID(); - }, 'Team unique ID.') - ->param('name', null, function () { - return new Text(100); - }, 'Team name.') + ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') + ->param('name', null, function () { return new Text(100); }, 'Team name.') ->action( function ($teamId, $name) use ($response, $projectDB) { $team = $projectDB->getDocument($teamId); @@ -233,9 +213,7 @@ $utopia->delete('/v1/teams/:teamId') ->label('sdk.namespace', 'teams') ->label('sdk.method', 'deleteTeam') ->label('sdk.description', 'Delete team by its unique ID. Only team owners have write access for this resource.') - ->param('teamId', '', function () { - return new UID(); - }, 'Team unique ID.') + ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') ->action( function ($teamId) use ($response, $projectDB) { $team = $projectDB->getDocument($teamId); @@ -275,21 +253,11 @@ $utopia->post('/v1/teams/:teamId/memberships') ->label('sdk.namespace', 'teams') ->label('sdk.method', 'createTeamMembership') ->label('sdk.description', "Use this endpoint to invite a new member to your team. An email with a link to join the team will be sent to the new member email address. If member doesn't exists in the project it will be automatically created.\n\nUse the redirect parameter to redirect the user from the invitation email back to your app. When the user is redirected, use the /teams/{teamId}/memberships/{inviteId}/status endpoint to finally join the user to the team.\n\nPlease notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface.") - ->param('teamId', '', function () { - return new UID(); - }, 'Team unique ID.') - ->param('email', '', function () { - return new Email(); - }, 'New team member email address.') - ->param('name', '', function () { - return new Text(100); - }, 'New team member name.', true) - ->param('roles', [], function () { - return new ArrayList(new Text(128)); - }, 'Invite roles array. Learn more about [roles and permissions](/docs/permissions).') - ->param('redirect', '', function () use ($clients) { - return new Host($clients); - }, 'Reset page to redirect user back to your app from the invitation email.') + ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') + ->param('email', '', function () { return new Email(); }, 'New team member email address.') + ->param('name', '', function () { return new Text(100); }, 'New team member name.', true) + ->param('roles', [], function () { return new ArrayList(new Text(128)); }, 'Invite roles array. Learn more about [roles and permissions](/docs/permissions).') + ->param('redirect', '', function () use ($clients) { return new Host($clients); }, 'Reset page to redirect user back to your app from the invitation email.') ->action( function ($teamId, $email, $name, $roles, $redirect) use ($request, $response, $register, $project, $user, $audit, $projectDB) { $name = (empty($name)) ? $email : $name; @@ -428,15 +396,9 @@ $utopia->post('/v1/teams/:teamId/memberships/:inviteId/resend') ->label('sdk.namespace', 'teams') ->label('sdk.method', 'createTeamMembershipResend') ->label('sdk.description', 'Use this endpoint to resend your invitation email for a user to join a team.') - ->param('teamId', '', function () { - return new UID(); - }, 'Team unique ID.') - ->param('inviteId', '', function () { - return new UID(); - }, 'Invite unique ID.') - ->param('redirect', '', function () use ($clients) { - return new Host($clients); - }, 'Reset page to redirect user back to your app from the invitation email.') + ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') + ->param('inviteId', '', function () { return new UID(); }, 'Invite unique ID.') + ->param('redirect', '', function () use ($clients) { return new Host($clients); }, 'Reset page to redirect user back to your app from the invitation email.') ->action( function ($teamId, $inviteId, $redirect) use ($response, $register, $project, $user, $audit, $projectDB) { $membership = $projectDB->getDocument($inviteId); @@ -515,24 +477,12 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') ->label('sdk.method', 'updateTeamMembershipStatus') ->label('sdk.description', "Use this endpoint to let user accept an invitation to join a team after he is being redirect back to your app from the invitation email. Use the success and failure URL's to redirect users back to your application after the request completes.\n\nPlease notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface.\n\nWhen not using the success or failure redirect arguments this endpoint will result with a 200 status code on success and with 401 status error on failure. This behavior was applied to help the web clients deal with browsers who don't allow to set 3rd party HTTP cookies needed for saving the account session token.") ->label('sdk.cookies', true) - ->param('teamId', '', function () { - return new UID(); - }, 'Team unique ID.') - ->param('inviteId', '', function () { - return new UID(); - }, 'Invite unique ID') - ->param('userId', '', function () { - return new UID(); - }, 'User unique ID') - ->param('secret', '', function () { - return new Text(256); - }, 'Secret Key') - ->param('success', null, function () use ($clients) { - return new Host($clients); - }, 'Redirect when registration succeed', true) - ->param('failure', null, function () use ($clients) { - return new Host($clients); - }, 'Redirect when registration failed', true) + ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') + ->param('inviteId', '', function () { return new UID(); }, 'Invite unique ID') + ->param('userId', '', function () { return new UID(); }, 'User unique ID') + ->param('secret', '', function () { return new Text(256); }, 'Secret Key') + ->param('success', null, function () use ($clients) { return new Host($clients); }, 'Redirect when registration succeed', true) + ->param('failure', null, function () use ($clients) { return new Host($clients); }, 'Redirect when registration failed', true) ->action( function ($teamId, $inviteId, $userId, $secret, $success, $failure) use ($response, $request, $user, $audit, $projectDB) { $invite = $projectDB->getDocument($inviteId); @@ -658,12 +608,8 @@ $utopia->delete('/v1/teams/:teamId/memberships/:inviteId') ->label('sdk.namespace', 'teams') ->label('sdk.method', 'deleteTeamMembership') ->label('sdk.description', 'This endpoint allows a user to leave a team or for a team owner to delete the membership of any other team member.') - ->param('teamId', '', function () { - return new UID(); - }, 'Team unique ID.') - ->param('inviteId', '', function () { - return new UID(); - }, 'Invite unique ID') + ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') + ->param('inviteId', '', function () { return new UID(); }, 'Invite unique ID') ->action( function ($teamId, $inviteId) use ($response, $projectDB, $audit) { $invite = $projectDB->getDocument($inviteId); diff --git a/app/controllers/users.php b/app/controllers/users.php index a77436b0c0..7cc4b4ed31 100644 --- a/app/controllers/users.php +++ b/app/controllers/users.php @@ -23,18 +23,10 @@ $utopia->get('/v1/users') ->label('sdk.namespace', 'users') ->label('sdk.method', 'listUsers') ->label('sdk.description', 'Get a list of all the project users. You can use the query params to filter your results.') - ->param('search', '', function () { - return new Text(256); - }, 'Search term to filter your list results.', true) - ->param('limit', 25, function () { - return new Range(0, 100); - }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true) - ->param('offset', 0, function () { - return new Range(0, 2000); - }, 'Results offset. The default value is 0. Use this param to manage pagination.', true) - ->param('orderType', 'ASC', function () { - return new WhiteList(['ASC', 'DESC']); - }, 'Order result by ASC or DESC order.', true) + ->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true) + ->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true) + ->param('offset', 0, function () { return new Range(0, 2000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true) + ->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true) ->action( function ($search, $limit, $offset, $orderType) use ($response, $projectDB, $providers) { $results = $projectDB->getCollection([ @@ -83,9 +75,7 @@ $utopia->get('/v1/users/:userId') ->label('sdk.namespace', 'users') ->label('sdk.method', 'getUser') ->label('sdk.description', 'Get user by its unique ID.') - ->param('userId', '', function () { - return new UID(); - }, 'User unique ID.') + ->param('userId', '', function () { return new UID(); }, 'User unique ID.') ->action( function ($userId) use ($response, $projectDB, $providers) { $user = $projectDB->getDocument($userId); @@ -124,9 +114,7 @@ $utopia->get('/v1/users/:userId/prefs') ->label('sdk.namespace', 'users') ->label('sdk.method', 'getUserPrefs') ->label('sdk.description', 'Get user preferences by its unique ID.') - ->param('userId', '', function () { - return new UID(); - }, 'User unique ID.') + ->param('userId', '', function () { return new UID(); }, 'User unique ID.') ->action( function ($userId) use ($response, $projectDB) { $user = $projectDB->getDocument($userId); @@ -157,9 +145,7 @@ $utopia->get('/v1/users/:userId/sessions') ->label('sdk.namespace', 'users') ->label('sdk.method', 'getUserSessions') ->label('sdk.description', 'Get user sessions list by its unique ID.') - ->param('userId', '', function () { - return new UID(); - }, 'User unique ID.') + ->param('userId', '', function () { return new UID(); }, 'User unique ID.') ->action( function ($userId) use ($response, $projectDB) { $user = $projectDB->getDocument($userId); @@ -221,9 +207,7 @@ $utopia->get('/v1/users/:userId/logs') ->label('sdk.namespace', 'users') ->label('sdk.method', 'getUserLogs') ->label('sdk.description', 'Get user activity logs list by its unique ID.') - ->param('userId', '', function () { - return new UID(); - }, 'User unique ID.') + ->param('userId', '', function () { return new UID(); }, 'User unique ID.') ->action( function ($userId) use ($response, $register, $projectDB, $project) { $user = $projectDB->getDocument($userId); @@ -284,15 +268,9 @@ $utopia->post('/v1/users') ->label('sdk.namespace', 'users') ->label('sdk.method', 'createUser') ->label('sdk.description', 'Create a new user.') - ->param('email', '', function () { - return new Email(); - }, 'User account email.') - ->param('password', '', function () { - return new Password(); - }, 'User account password.') - ->param('name', '', function () { - return new Text(100); - }, 'User account name.', true) + ->param('email', '', function () { return new Email(); }, 'User account email.') + ->param('password', '', function () { return new Password(); }, 'User account password.') + ->param('name', '', function () { return new Text(100); }, 'User account name.', true) ->action( function ($email, $password, $name) use ($response, $register, $projectDB, $providers) { $profile = $projectDB->getCollection([ // Get user by email address @@ -354,12 +332,8 @@ $utopia->patch('/v1/users/:userId/status') ->label('sdk.namespace', 'users') ->label('sdk.method', 'updateUserStatus') ->label('sdk.description', 'Update user status by its unique ID.') - ->param('userId', '', function () { - return new UID(); - }, 'User unique ID.') - ->param('status', '', function () { - return new WhiteList([Auth::USER_STATUS_ACTIVATED, Auth::USER_STATUS_BLOCKED, Auth::USER_STATUS_UNACTIVATED]); - }, 'User Status code. To activate the user pass '.Auth::USER_STATUS_ACTIVATED.', to blocking the user pass '.Auth::USER_STATUS_BLOCKED.' and for disabling the user pass '.Auth::USER_STATUS_UNACTIVATED) + ->param('userId', '', function () { return new UID(); }, 'User unique ID.') + ->param('status', '', function () { return new WhiteList([Auth::USER_STATUS_ACTIVATED, Auth::USER_STATUS_BLOCKED, Auth::USER_STATUS_UNACTIVATED]); }, 'User Status code. To activate the user pass '.Auth::USER_STATUS_ACTIVATED.', to blocking the user pass '.Auth::USER_STATUS_BLOCKED.' and for disabling the user pass '.Auth::USER_STATUS_UNACTIVATED) ->action( function ($userId, $status) use ($response, $projectDB) { $user = $projectDB->getDocument($userId); @@ -386,12 +360,8 @@ $utopia->patch('/v1/users/:userId/prefs') ->label('scope', 'users.write') ->label('sdk.namespace', 'users') ->label('sdk.method', 'updateUserPrefs') - ->param('userId', '', function () { - return new UID(); - }, 'User unique ID.') - ->param('prefs', '', function () { - return new \Utopia\Validator\Mock(); - }, 'Prefs key-value JSON object string.') + ->param('userId', '', function () { return new UID(); }, 'User unique ID.') + ->param('prefs', '', function () { return new \Utopia\Validator\Mock(); }, 'Prefs key-value JSON object string.') ->label('sdk.description', 'Update user preferences by its unique ID. You can pass only the specific settings you wish to update.') ->action( function ($userId, $prefs) use ($response, $projectDB) { @@ -420,12 +390,8 @@ $utopia->delete('/v1/users/:userId/sessions/:session') ->label('sdk.method', 'deleteUsersSession') ->label('sdk.description', 'Delete user sessions by its unique ID.') ->label('abuse-limit', 100) - ->param('userId', '', function () { - return new UID(); - }, 'User unique ID.') - ->param('sessionId', null, function () { - return new UID(); - }, 'User unique session ID.') + ->param('userId', '', function () { return new UID(); }, 'User unique ID.') + ->param('sessionId', null, function () { return new UID(); }, 'User unique session ID.') ->action( function ($userId, $sessionId) use ($response, $request, $projectDB) { $user = $projectDB->getDocument($userId); @@ -455,9 +421,7 @@ $utopia->delete('/v1/users/:userId/sessions') ->label('sdk.method', 'deleteUserSessions') ->label('sdk.description', 'Delete all user sessions by its unique ID.') ->label('abuse-limit', 100) - ->param('userId', '', function () { - return new UID(); - }, 'User unique ID.') + ->param('userId', '', function () { return new UID(); }, 'User unique ID.') ->action( function ($userId) use ($response, $request, $projectDB) { $user = $projectDB->getDocument($userId); diff --git a/docs/references/auth/confirm-resend.md b/docs/references/auth/confirm-resend.md new file mode 100644 index 0000000000..420f9bc113 --- /dev/null +++ b/docs/references/auth/confirm-resend.md @@ -0,0 +1,3 @@ +This endpoint allows the user to request your app to resend him his email confirmation message. The redirect arguments acts the same way as in /auth/register endpoint. + +Please notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. \ No newline at end of file diff --git a/docs/references/auth/confirm.md b/docs/references/auth/confirm.md new file mode 100644 index 0000000000..1826e605aa --- /dev/null +++ b/docs/references/auth/confirm.md @@ -0,0 +1 @@ +Use this endpoint to complete the confirmation of the user account email address. Both the **userId** and **token** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/register endpoint. \ No newline at end of file diff --git a/docs/references/auth/login.md b/docs/references/auth/login.md new file mode 100644 index 0000000000..1bbd0fbdb7 --- /dev/null +++ b/docs/references/auth/login.md @@ -0,0 +1,5 @@ +Allow the user to login into his account by providing a valid email and password combination. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. + +Please notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. + +When accessing this route using JavaScript from the browser, success and failure parameter URLs are required. Appwrite server will respond with a 301 redirect status code and will set the user session cookie. This behavior is enforced because modern browsers are limiting 3rd party cookies in XHR of fetch requests to protect user privacy. \ No newline at end of file diff --git a/docs/references/auth/logout-by-session.md b/docs/references/auth/logout-by-session.md new file mode 100644 index 0000000000..4184532fd9 --- /dev/null +++ b/docs/references/auth/logout-by-session.md @@ -0,0 +1 @@ +Use this endpoint to log out the currently logged in user from all his account sessions across all his different devices. When using the option id argument, only the session unique ID provider will be deleted. \ No newline at end of file diff --git a/docs/references/auth/logout.md b/docs/references/auth/logout.md new file mode 100644 index 0000000000..534b191187 --- /dev/null +++ b/docs/references/auth/logout.md @@ -0,0 +1 @@ +Use this endpoint to log out the currently logged in user from his account. When succeed this endpoint will delete the user session and remove the session secret cookie from the user client. \ No newline at end of file diff --git a/docs/references/auth/recovery-reset.md b/docs/references/auth/recovery-reset.md new file mode 100644 index 0000000000..8d1336450a --- /dev/null +++ b/docs/references/auth/recovery-reset.md @@ -0,0 +1,3 @@ +Use this endpoint to complete the user account password reset. Both the **userId** and **token** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/recovery endpoint. + +Please notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. \ No newline at end of file diff --git a/docs/references/auth/recovery.md b/docs/references/auth/recovery.md new file mode 100644 index 0000000000..e15db5ac6b --- /dev/null +++ b/docs/references/auth/recovery.md @@ -0,0 +1 @@ +Sends the user an email with a temporary secret token for password reset. When the user clicks the confirmation link he is redirected back to your app password reset redirect URL with a secret token and email address values attached to the URL query string. Use the query string params to submit a request to the /auth/password/reset endpoint to complete the process. \ No newline at end of file diff --git a/docs/references/auth/register.md b/docs/references/auth/register.md new file mode 100644 index 0000000000..a5195eef10 --- /dev/null +++ b/docs/references/auth/register.md @@ -0,0 +1,7 @@ +Use this endpoint to allow a new user to register an account in your project. Use the success and failure URL's to redirect users back to your application after signup completes. + +If registration completes successfully user will be sent with a confirmation email in order to confirm he is the owner of the account email address. Use the confirmation parameter to redirect the user from the confirmation email back to your app. When the user is redirected, use the /auth/confirm endpoint to complete the account confirmation. + +Please notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. + +When accessing this route using JavaScript from the browser, success and failure parameter URLs are required. Appwrite server will respond with a 301 redirect status code and will set the user session cookie. This behavior is enforced because modern browsers are limiting 3rd party cookies in XHR of fetch requests to protect user privacy. \ No newline at end of file From 511455b3f6f008d15ced318e62340a4fa2b40e06 Mon Sep 17 00:00:00 2001 From: Esteban Campos Date: Mon, 7 Oct 2019 09:40:34 +1100 Subject: [PATCH 134/135] Fixed typo errors --- app/config/locale/es.php | 2 +- app/config/locale/templates/es.email.auth.confirm.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/es.php b/app/config/locale/es.php index 0a56743689..cc8e82b7bd 100644 --- a/app/config/locale/es.php +++ b/app/config/locale/es.php @@ -6,7 +6,7 @@ return [ 'settings.direction' => 'ltr', // Service - Users - 'auth.emails.team' => '%s Equipo', + 'auth.emails.team' => 'Equipo %s', 'auth.emails.confirm.title' => 'Confirmación de la cuenta', 'auth.emails.confirm.body' => 'es.email.auth.confirm.tpl', 'auth.emails.recovery.title' => 'Reestablecer contraseña', diff --git a/app/config/locale/templates/es.email.auth.confirm.tpl b/app/config/locale/templates/es.email.auth.confirm.tpl index 3bb7e97b62..e8ab39bf86 100644 --- a/app/config/locale/templates/es.email.auth.confirm.tpl +++ b/app/config/locale/templates/es.email.auth.confirm.tpl @@ -10,7 +10,7 @@ Hola {{name}},

- Sigue este enlace para verificar tu dirección de correo: + Sigue este enlace para verificar tu dirección de correo.
{{redirect}}
From 0960b0043dd35bc34b2ae1771252e3ef18b0c9fc Mon Sep 17 00:00:00 2001 From: alvesgabriel Date: Sun, 6 Oct 2019 22:48:42 -0300 Subject: [PATCH 135/135] fix link to enviroment variables file in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 76f8bc1f7f..4afc72376d 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ docker-compose up -d --remove-orphans Once the Docker installation completes, go to http://localhost to access the Appwrite console from your browser. Please notice that on non-linux native hosts, the server might take a few minutes to start after installation completes. -For advanced, production and custom installation, check out our Docker [environment variables](/docs/EnviornementVariables.md) docs. +For advanced, production and custom installation, check out our Docker [environment variables](docs/tutorials/environment-variables.md) docs. ### Changing Port Number
+ {{name}} 你好, +
+
+ 請點擊下方的鏈接驗證你的電子郵箱地址。 +
+
{{redirect}} +
+
+ 如果你沒有請求驗證本郵箱,請忽略這份郵件。 +
+
+ 謝謝。 +
+ 來自 {{project}} +
+ Hallo {{name}}, +
+
+ Om jou epos adres te verifieer, kliek op die web adres hier: +
+
{{redirect}} +
+
+ As jy nie aangevra het om jou epos adres te verifieer nie, kan jy die boodskap ignoreer. +
+
+ Baie dankie, +
+ {{project}} span +