diff --git a/.circleci/config.yml b/.circleci/config.yml index dad2c3fc78..f26cadb5ac 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,12 +5,6 @@ executors: working_directory: /tmp/workspace docker: - image: misskey/ci:latest - - image: circleci/mongo:latest - with-redis: - working_directory: /tmp/workspace - docker: - - image: misskey/ci:latest - - image: circleci/mongo:latest - image: circleci/redis:latest docker: working_directory: /tmp/workspace diff --git a/CHANGELOG.md b/CHANGELOG.md index 7df2ea9b88..3e225b8aa6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ If you encounter any problems with updating, please try the following: 1. `npm run clean` or `npm run cleanall` 2. Retry update (Don't forget `npm i`) +11.1.4 (2019/04/17) +------------------- +### Fixes +* タイムライン取得時に削除されたファイルを添付している投稿が含まれているとサーバーでエラーになる問題を修正 +* 管理画面のインスタンスメニューで変更前の設定が読み込まれないことがある問題を修正 +* 猫ではないのに猫のままで表示される問題を修正 +* admin/driveのアイコンがずれてる問題を修正 +* チャートで大きな数値を扱えない問題を修正 +* UIの修正 + 11.1.3 (2019/04/16) ------------------- ### Fixes diff --git a/README.md b/README.md index b163843a19..5b40c13bac 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md). - + @@ -163,7 +163,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
DamilloraAtsuko TominagaAtsuko Tominaga natalie Hiratake Hekovic
-**Last updated:** Mon, 15 Apr 2019 01:59:07 UTC +**Last updated:** Mon, 15 Apr 2019 12:07:08 UTC :four_leaf_clover: Copyright diff --git a/docs/docker.en.md b/docs/docker.en.md index 344279083b..701514e45f 100644 --- a/docs/docker.en.md +++ b/docs/docker.en.md @@ -9,9 +9,17 @@ This guide describes how to install and setup Misskey with Docker. *1.* Download Misskey ---------------------------------------------------------------- -1. `git clone -b master git://github.com/syuilo/misskey.git` Clone Misskey repository's master branch. -2. `cd misskey` Move to misskey directory. -3. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag. +1. Clone Misskey repository's master branch. + + `git clone -b master git://github.com/syuilo/misskey.git` + +2. Move to misskey directory. + + `cd misskey` + +3. Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag. + + `git checkout master` *2.* Configure Misskey ---------------------------------------------------------------- @@ -71,9 +79,9 @@ Well done! Now you have an environment to run Misskey. Just `docker-compose up -d`. GLHF! ### How to update your Misskey server to the latest version -1. `git fetch` -2. `git stash` -3. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` +1. `git stash` +2. `git checkout master` +3. `git pull` 4. `git stash pop` 5. `docker-compose build` 6. Check [ChangeLog](../CHANGELOG.md) for migration information diff --git a/docs/docker.fr.md b/docs/docker.fr.md index e89a8f1b15..c43ab4f650 100644 --- a/docs/docker.fr.md +++ b/docs/docker.fr.md @@ -10,9 +10,17 @@ Ce guide explique comment installer et configurer Misskey avec Docker. *1.* Télécharger Misskey ---------------------------------------------------------------- -1. `git clone -b master git://github.com/syuilo/misskey.git` Clone le dépôt de Misskey sur la branche master. -2. `cd misskey` Naviguez dans le dossier du dépôt. -3. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` Checkout sur le tag de la [dernière version](https://github.com/syuilo/misskey/releases/latest). +1. Clone le dépôt de Misskey sur la branche master. + + `git clone -b master git://github.com/syuilo/misskey.git` + +2. Naviguez dans le dossier du dépôt. + + `cd misskey` + +3. Checkout sur le tag de la [dernière version](https://github.com/syuilo/misskey/releases/latest). + + `git checkout master` *2.* Configuration de Misskey ---------------------------------------------------------------- @@ -38,9 +46,9 @@ Parfait, Vous avez un environnement prêt pour démarrer Misskey. Utilisez la commande `docker-compose up -d`. GLHF! ### How to update your Misskey server to the latest version -1. `git fetch` -2. `git stash` -3. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` +1. `git stash` +2. `git checkout master` +3. `git pull` 4. `git stash pop` 5. `docker-compose build` 6. Consultez le [ChangeLog](../CHANGELOG.md) pour avoir les éventuelles informations de migration @@ -52,14 +60,28 @@ Utilisez la commande `docker-compose up -d`. GLHF! ### Configuration d'ElasticSearch (pour la fonction de recherche) *1.* Préparation de l'environnement ---------------------------------------------------------------- -1. `mkdir elasticsearch && chown 1000:1000 elasticsearch` Permet de créer le dossier d'accueil de la base ElasticSearch aves les bons droits -2. `sysctl -w vm.max_map_count=262144` Augmente la valeur max du paramètre map_count du système (valeur minimum pour pouvoir lancer ES) +1. Permet de créer le dossier d'accueil de la base ElasticSearch aves les bons droits + + `mkdir elasticsearch && chown 1000:1000 elasticsearch` + +2. Augmente la valeur max du paramètre map_count du système (valeur minimum pour pouvoir lancer ES) + + `sysctl -w vm.max_map_count=262144` *2.* Après lancement du docker-compose, initialisation de la base ElasticSearch ---------------------------------------------------------------- -1. `docker-compose -it web /bin/sh` Connexion dans le conteneur web -2. `apk add curl` Ajout du paquet curl -3. `curl -X PUT "es:9200/misskey" -H 'Content-Type: application/json' -d'{ "settings" : { "index" : { } }}'` Création de la base ES +1. Connexion dans le conteneur web + + `docker-compose -it web /bin/sh` + +2. Ajout du paquet curl + + `apk add curl` + +3. Création de la base ES + + `curl -X PUT "es:9200/misskey" -H 'Content-Type: application/json' -d'{ "settings" : { "index" : { } }}'` + 4. `exit` ---------------------------------------------------------------- diff --git a/docs/docker.ja.md b/docs/docker.ja.md index 9d702fa795..4aa84675e0 100644 --- a/docs/docker.ja.md +++ b/docs/docker.ja.md @@ -9,9 +9,17 @@ Dockerを使ったMisskey構築方法 *1.* Misskeyのダウンロード ---------------------------------------------------------------- -1. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン -2. `cd misskey` misskeyディレクトリに移動 -3. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認 +1. masterブランチからMisskeyレポジトリをクローン + + `git clone -b master git://github.com/syuilo/misskey.git` + +2. misskeyディレクトリに移動 + + `cd misskey` + +3. [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認 + + `git checkout master` *2.* 設定ファイルの作成と編集 ---------------------------------------------------------------- @@ -71,9 +79,9 @@ docker-compose run --rm web npm run init `docker-compose up -d`するだけです。GLHF! ### Misskeyを最新バージョンにアップデートする方法: -1. `git fetch` -2. `git stash` -3. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` +1. `git stash` +2. `git checkout master` +3. `git pull` 4. `git stash pop` 5. `docker-compose build` 6. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する diff --git a/docs/examples/misskey.nginx b/docs/examples/misskey.nginx index 2b4a0548e6..2bc92fa492 100644 --- a/docs/examples/misskey.nginx +++ b/docs/examples/misskey.nginx @@ -29,7 +29,7 @@ server { listen [::]:443 http2; server_name example.tld; ssl on; - ssl_session_cache shared:ssl_session_cache:10m; + ssl_session_cache shared:ssl_session_cache:10m; # To use Let's Encrypt certificate ssl_certificate /etc/letsencrypt/live/example.tld/fullchain.pem; diff --git a/docs/setup.en.md b/docs/setup.en.md index 45e3e2c68b..b38ef64a02 100644 --- a/docs/setup.en.md +++ b/docs/setup.en.md @@ -32,15 +32,32 @@ Please install and setup these softwares: *3.* Install Misskey ---------------------------------------------------------------- -1. `su - misskey` Connect to misskey user. -2. `git clone -b master git://github.com/syuilo/misskey.git` Clone the misskey repo from master branch. -3. `cd misskey` Navigate to misskey directory -4. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) -5. `npm install` Install misskey dependencies. +1. Connect to misskey user. + + `su - misskey` + +2. Clone the misskey repo from master branch. + + `git clone -b master git://github.com/syuilo/misskey.git` + +3. Navigate to misskey directory + + `cd misskey` + +4. Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) + + `git checkout master` + +5. Install misskey dependencies. + + `npm install` *4.* Configure Misskey ---------------------------------------------------------------- -1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`. +1. Copy the `.config/example.yml` and rename it to `default.yml`. + + `cp .config/example.yml .config/default.yml` + 2. Edit `default.yml` *5.* Build Misskey @@ -74,37 +91,45 @@ Just `NODE_ENV=production npm start`. GLHF! ### Launch with systemd -1. Create a systemd service here: `/etc/systemd/system/misskey.service` +1. Create a systemd service here + + `/etc/systemd/system/misskey.service` + 2. Edit it, and paste this and save: -``` -[Unit] -Description=Misskey daemon + ``` + [Unit] + Description=Misskey daemon -[Service] -Type=simple -User=misskey -ExecStart=/usr/bin/npm start -WorkingDirectory=/home/misskey/misskey -Environment="NODE_ENV=production" -TimeoutSec=60 -StandardOutput=syslog -StandardError=syslog -SyslogIdentifier=misskey -Restart=always + [Service] + Type=simple + User=misskey + ExecStart=/usr/bin/npm start + WorkingDirectory=/home/misskey/misskey + Environment="NODE_ENV=production" + TimeoutSec=60 + StandardOutput=syslog + StandardError=syslog + SyslogIdentifier=misskey + Restart=always -[Install] -WantedBy=multi-user.target -``` + [Install] + WantedBy=multi-user.target + ``` -3. `systemctl daemon-reload ; systemctl enable misskey` Reload systemd and enable the misskey service. -4. `systemctl start misskey` Start the misskey service. +3. Reload systemd and enable the misskey service. + + `systemctl daemon-reload ; systemctl enable misskey` + +4. Start the misskey service. + + `systemctl start misskey` You can check if the service is running with `systemctl status misskey`. ### How to update your Misskey server to the latest version -1. `git fetch` -2. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` +1. `git checkout master` +2. `git pull` 3. `npm install` 4. `NODE_ENV=production npm run build` 5. Check [ChangeLog](../CHANGELOG.md) for migration information diff --git a/docs/setup.fr.md b/docs/setup.fr.md index e6d36aeff8..7ab88a6cde 100644 --- a/docs/setup.fr.md +++ b/docs/setup.fr.md @@ -32,15 +32,32 @@ Installez les paquets suivants : *3.* Installation de Misskey ---------------------------------------------------------------- -1. `su - misskey` Basculez vers l'utilisateur misskey. -2. `git clone -b master git://github.com/syuilo/misskey.git` Clonez la branche master du dépôt misskey. -3. `cd misskey` Accédez au dossier misskey. -4. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` Checkout sur le tag de la [version la plus récente](https://github.com/syuilo/misskey/releases/latest) -5. `npm install` Installez les dépendances de misskey. +1. Basculez vers l'utilisateur misskey. + + `su - misskey` + +2. Clonez la branche master du dépôt misskey. + + `git clone -b master git://github.com/syuilo/misskey.git` + +3. Accédez au dossier misskey. + + `cd misskey` + +4. Checkout sur le tag de la [version la plus récente](https://github.com/syuilo/misskey/releases/latest) + + `git checkout master` + +5. Installez les dépendances de misskey. + + `npm install` *4.* Création du fichier de configuration ---------------------------------------------------------------- -1. `cp .config/example.yml .config/default.yml` Copiez le fichier `.config/example.yml` et renommez-le`default.yml`. +1. Copiez le fichier `.config/example.yml` et renommez-le`default.yml`. + + `cp .config/example.yml .config/default.yml` + 2. Editez le fichier `default.yml` *5.* Construction de Misskey @@ -68,37 +85,45 @@ Lancez tout simplement `NODE_ENV=production npm start`. Bonne chance et amusez-v ### Démarrage avec systemd -1. Créez un service systemd sur : `/etc/systemd/system/misskey.service` +1. Créez un service systemd sur + + `/etc/systemd/system/misskey.service` + 2. Editez-le puis copiez et coller ceci dans le fichier : -``` -[Unit] -Description=Misskey daemon + ``` + [Unit] + Description=Misskey daemon -[Service] -Type=simple -User=misskey -ExecStart=/usr/bin/npm start -WorkingDirectory=/home/misskey/misskey -Environment="NODE_ENV=production" -TimeoutSec=60 -StandardOutput=syslog -StandardError=syslog -SyslogIdentifier=misskey -Restart=always + [Service] + Type=simple + User=misskey + ExecStart=/usr/bin/npm start + WorkingDirectory=/home/misskey/misskey + Environment="NODE_ENV=production" + TimeoutSec=60 + StandardOutput=syslog + StandardError=syslog + SyslogIdentifier=misskey + Restart=always -[Install] -WantedBy=multi-user.target -``` + [Install] + WantedBy=multi-user.target + ``` -3. `systemctl daemon-reload ; systemctl enable misskey` Redémarre systemd et active le service misskey. -4. `systemctl start misskey` Démarre le service misskey. +3. Redémarre systemd et active le service misskey. + + `systemctl daemon-reload ; systemctl enable misskey` + +4. Démarre le service misskey. + + `systemctl start misskey` Vous pouvez vérifier si le service a démarré en utilisant la commande `systemctl status misskey`. ### Méthode de mise à jour vers la plus récente version de Misskey -1. `git fetch` -2. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` +1. `git checkout master` +2. `git pull` 3. `npm install` 4. `NODE_ENV=production npm run build` 5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration. diff --git a/docs/setup.ja.md b/docs/setup.ja.md index 1b1730b69e..fcbef2af13 100644 --- a/docs/setup.ja.md +++ b/docs/setup.ja.md @@ -33,15 +33,32 @@ adduser --disabled-password --disabled-login misskey *3.* Misskeyのインストール ---------------------------------------------------------------- -1. `su - misskey` misskeyユーザーを使用 -2. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン -3. `cd misskey` misskeyディレクトリに移動 -4. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認 -5. `npm install` Misskeyの依存パッケージをインストール +1. misskeyユーザーを使用 + + `su - misskey` + +2. masterブランチからMisskeyレポジトリをクローン + + `git clone -b master git://github.com/syuilo/misskey.git` + +3. misskeyディレクトリに移動 + + `cd misskey` + +4. [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認 + + `git checkout master` + +5. Misskeyの依存パッケージをインストール + + `npm install` *4.* 設定ファイルを作成する ---------------------------------------------------------------- -1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする。 +1. `.config/example.yml`をコピーし名前を`default.yml`にする。 + + `cp .config/example.yml .config/default.yml` + 2. `default.yml` を編集する。 *5.* Misskeyのビルド @@ -73,38 +90,47 @@ npm run init `NODE_ENV=production npm start`するだけです。GLHF! ### systemdを用いた起動 -1. systemdサービスのファイルを作成: `/etc/systemd/system/misskey.service` +1. systemdサービスのファイルを作成 + + `/etc/systemd/system/misskey.service` + 2. エディタで開き、以下のコードを貼り付けて保存: -``` -[Unit] -Description=Misskey daemon + ``` + [Unit] + Description=Misskey daemon -[Service] -Type=simple -User=misskey -ExecStart=/usr/bin/npm start -WorkingDirectory=/home/misskey/misskey -Environment="NODE_ENV=production" -TimeoutSec=60 -StandardOutput=syslog -StandardError=syslog -SyslogIdentifier=misskey -Restart=always + [Service] + Type=simple + User=misskey + ExecStart=/usr/bin/npm start + WorkingDirectory=/home/misskey/misskey + Environment="NODE_ENV=production" + TimeoutSec=60 + StandardOutput=syslog + StandardError=syslog + SyslogIdentifier=misskey + Restart=always -[Install] -WantedBy=multi-user.target -``` -CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。 + [Install] + WantedBy=multi-user.target + ``` -3. `systemctl daemon-reload ; systemctl enable misskey` systemdを再読み込みしmisskeyサービスを有効化 -4. `systemctl start misskey` misskeyサービスの起動 + CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。 + +3. systemdを再読み込みしmisskeyサービスを有効化 + + `systemctl daemon-reload ; systemctl enable misskey` + +4. misskeyサービスの起動 + + `systemctl start misskey` `systemctl status misskey`と入力すると、サービスの状態を調べることができます。 ### Misskeyを最新バージョンにアップデートする方法: -1. `git fetch` -2. `git checkout $(git tag -l | grep -Ev -- '-(rc|alpha)\.[0-9]+$' | sort -V | tail -n 1)` +1. `git checkout master` +2. `git pull` 3. `npm install` 4. `NODE_ENV=production npm run build` 5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 82115a7224..eb87d4f204 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -313,6 +313,7 @@ common: nav: "ナビゲーション" tips: "ヒント" hashtags: "ハッシュタグ" + queue: "キュー" dev: "アプリの作成に失敗しました。再度お試しください。" ai-chan-kawaii: "藍ちゃかわいい" @@ -1549,6 +1550,7 @@ desktop/views/widgets/polls.vue: desktop/views/widgets/post-form.vue: title: "投稿" note: "投稿" + something-happened: "何らかの事情で投稿できませんでした。" desktop/views/widgets/profile.vue: update-banner: "クリックでバナー編集" @@ -1641,7 +1643,7 @@ mobile/views/components/post-form.vue: quote-placeholder: "この投稿を引用... (オプション)" reply-placeholder: "この投稿への返信..." cw-placeholder: "内容への注釈 (オプション)" - location-alert: "お使いの端末は位置情報に対応していません" + geolocation-alert: "お使いの端末は位置情報に対応していません" error: "エラー" username-prompt: "ユーザー名を入力してください" diff --git a/package.json b/package.json index 4bca452936..c835c851f3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo ", - "version": "11.1.3", + "version": "11.1.4", "codename": "daybreak", "repository": { "type": "git", @@ -64,8 +64,6 @@ "@types/lolex": "3.1.1", "@types/minio": "7.0.1", "@types/mocha": "5.2.6", - "@types/mongodb": "3.1.22", - "@types/monk": "6.0.0", "@types/node": "11.13.4", "@types/nodemailer": "4.6.7", "@types/nprogress": "0.0.29", @@ -167,8 +165,6 @@ "mocha": "6.1.3", "moji": "0.5.1", "moment": "2.24.0", - "mongodb": "3.2.3", - "monk": "6.0.6", "ms": "2.1.1", "nested-property": "0.0.7", "node-fetch": "2.3.0", diff --git a/src/client/app/admin/views/drive.vue b/src/client/app/admin/views/drive.vue index e4565b78fe..22b3b7eb96 100644 --- a/src/client/app/admin/views/drive.vue +++ b/src/client/app/admin/views/drive.vue @@ -242,7 +242,7 @@ export default Vue.extend({ > div:nth-child(1) > .thumbnail - display block + display flex width 64px height 64px background-size cover diff --git a/src/client/app/admin/views/instance.vue b/src/client/app/admin/views/instance.vue index bc2a5fba85..cca4e5f669 100644 --- a/src/client/app/admin/views/instance.vue +++ b/src/client/app/admin/views/instance.vue @@ -195,7 +195,7 @@ export default Vue.extend({ }, created() { - this.$root.getMeta().then(meta => { + this.$root.getMeta(true).then(meta => { this.maintainerName = meta.maintainerName; this.maintainerEmail = meta.maintainerEmail; this.disableRegistration = meta.disableRegistration; diff --git a/src/client/app/common/scripts/note-mixin.ts b/src/client/app/common/scripts/note-mixin.ts index 67bbe8c0ae..4b454f8800 100644 --- a/src/client/app/common/scripts/note-mixin.ts +++ b/src/client/app/common/scripts/note-mixin.ts @@ -134,7 +134,7 @@ export default (opts: Opts = {}) => ({ }, reactDirectly(reaction) { - (this.$root.api('notes/reactions/create', { + this.$root.api('notes/reactions/create', { noteId: this.appearNote.id, reaction: reaction }); diff --git a/src/client/app/common/views/components/messaging-room.form.vue b/src/client/app/common/views/components/messaging-room.form.vue index 6c8b09c244..ee6c312bce 100644 --- a/src/client/app/common/views/components/messaging-room.form.vue +++ b/src/client/app/common/views/components/messaging-room.form.vue @@ -85,7 +85,10 @@ export default Vue.extend({ } } else { if (items[0].kind == 'file') { - alert(this.$t('only-one-file-attached')); + this.$root.dialog({ + type: 'error', + text: this.$t('only-one-file-attached') + }); } } }, @@ -107,7 +110,10 @@ export default Vue.extend({ return; } else if (e.dataTransfer.files.length > 1) { e.preventDefault(); - alert(this.$t('only-one-file-attached')); + this.$root.dialog({ + type: 'error', + text: this.$t('only-one-file-attached') + }); return; } diff --git a/src/client/app/common/views/components/messaging-room.vue b/src/client/app/common/views/components/messaging-room.vue index 6f13d50c1e..83a0c463e0 100644 --- a/src/client/app/common/views/components/messaging-room.vue +++ b/src/client/app/common/views/components/messaging-room.vue @@ -125,7 +125,10 @@ export default Vue.extend({ this.form.upload(e.dataTransfer.files[0]); return; } else if (e.dataTransfer.files.length > 1) { - alert(this.$t('only-one-file-attached')); + this.$root.dialog({ + type: 'error', + text: this.$t('only-one-file-attached') + }); return; } diff --git a/src/client/app/common/views/components/post-form-attaches.vue b/src/client/app/common/views/components/post-form-attaches.vue index 467e430ccf..1fe476be77 100644 --- a/src/client/app/common/views/components/post-form-attaches.vue +++ b/src/client/app/common/views/components/post-form-attaches.vue @@ -1,6 +1,6 @@ {{ $t('email-address') }} - {{ $t('save') }} + {{ $t('save') }} diff --git a/src/client/app/common/views/components/settings/settings.vue b/src/client/app/common/views/components/settings/settings.vue index c81a0e0cd5..001b692551 100644 --- a/src/client/app/common/views/components/settings/settings.vue +++ b/src/client/app/common/views/components/settings/settings.vue @@ -542,8 +542,8 @@ export default Vue.extend({ this.latestVersion = newer; if (newer == null) { this.$root.dialog({ - title: this.$t('no-updates'), - text: this.$t('no-updates-desc') + title: this.$t('@._settings.no-updates'), + text: this.$t('@._settings.no-updates-desc') }); } else { this.$root.dialog({ diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue index 477f25680e..e05085cdbf 100644 --- a/src/client/app/common/views/components/signin.vue +++ b/src/client/app/common/views/components/signin.vue @@ -79,7 +79,10 @@ export default Vue.extend({ localStorage.setItem('i', res.i); location.reload(); }).catch(() => { - alert(this.$t('login-failed')); + this.$root.dialog({ + type: 'error', + text: this.$t('login-failed') + }); this.signing = false; }); } diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue index 45c2eabd45..9b1df79771 100644 --- a/src/client/app/common/views/components/signup.vue +++ b/src/client/app/common/views/components/signup.vue @@ -153,7 +153,10 @@ export default Vue.extend({ location.href = '/'; }); }).catch(() => { - alert(this.$t('some-error')); + this.$root.dialog({ + type: 'error', + text: this.$t('some-error') + }); if (this.meta.enableRecaptcha) { (window as any).grecaptcha.reset(); diff --git a/src/client/app/common/views/deck/deck.widgets-column.vue b/src/client/app/common/views/deck/deck.widgets-column.vue index fcf3afd3f7..f2385c8a48 100644 --- a/src/client/app/common/views/deck/deck.widgets-column.vue +++ b/src/client/app/common/views/deck/deck.widgets-column.vue @@ -21,7 +21,7 @@ - + @@ -33,7 +33,7 @@
diff --git a/src/client/app/common/views/widgets/post-form.vue b/src/client/app/common/views/widgets/post-form.vue index b30168b879..120de0f17b 100644 --- a/src/client/app/common/views/widgets/post-form.vue +++ b/src/client/app/common/views/widgets/post-form.vue @@ -188,7 +188,10 @@ export default define({ }).then(data => { this.clear(); }).catch(err => { - alert('Something happened'); + this.$root.dialog({ + type: 'error', + text: this.$t('something-happened') + }); }).then(() => { this.posting = false; this.$nextTick(() => { diff --git a/src/client/app/desktop/views/components/drive.folder.vue b/src/client/app/desktop/views/components/drive.folder.vue index 02f219a98e..fd6de5a05e 100644 --- a/src/client/app/desktop/views/components/drive.folder.vue +++ b/src/client/app/desktop/views/components/drive.folder.vue @@ -161,7 +161,10 @@ export default Vue.extend({ }); break; default: - alert(this.$t('unhandled-error')); + this.$root.dialog({ + type: 'error', + text: this.$t('unhandled-error') + }); } }); } diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue index fcabb4b8eb..48443669ac 100644 --- a/src/client/app/desktop/views/components/drive.vue +++ b/src/client/app/desktop/views/components/drive.vue @@ -320,7 +320,10 @@ export default Vue.extend({ }); break; default: - alert(this.$t('unhandled-error')); + this.$root.dialog({ + type: 'error', + text: this.$t('unhandled-error') + }); } }); } diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index fe39a17e67..7d3593d9c9 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -364,7 +364,10 @@ export default Vue.extend({ setGeo() { if (navigator.geolocation == null) { - alert(this.$t('geolocation-alert')); + this.$root.dialog({ + type: 'warning', + text: this.$t('geolocation-alert') + }); return; } @@ -372,7 +375,11 @@ export default Vue.extend({ this.geo = pos.coords; this.$emit('geo-attached', this.geo); }, err => { - alert(`%i18n:@error%: ${err.message}`); + this.$root.dialog({ + type: 'error', + title: this.$t('error') + text: err.message + }); }, { enableHighAccuracy: true }); diff --git a/src/client/app/desktop/views/home/home.vue b/src/client/app/desktop/views/home/home.vue index d0b2fc10bc..d4677df842 100644 --- a/src/client/app/desktop/views/home/home.vue +++ b/src/client/app/desktop/views/home/home.vue @@ -34,7 +34,7 @@
- +

{{ $t('@.trash') }}

@@ -45,7 +45,8 @@ :list="widgets[place]" :class="place" :data-place="place" - :options="{ group: 'x', animation: 150 }" + group="x" + animation="150" @sort="onWidgetSort" :key="place" > diff --git a/src/client/app/desktop/views/pages/drive.vue b/src/client/app/desktop/views/pages/drive.vue index 2916569a5f..b389392ec8 100644 --- a/src/client/app/desktop/views/pages/drive.vue +++ b/src/client/app/desktop/views/pages/drive.vue @@ -34,7 +34,7 @@ export default Vue.extend({ document.title = title; }, onOpenFolder(folder) { - const title = folder.name + ' | %i18n:@title%'; + const title = `${folder.name} | ${this.$t('title')}`; // Rewrite URL history.pushState(null, title, `/i/drive/folder/${folder.id}`); diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts index a3525ed319..b69c340528 100644 --- a/src/client/app/mios.ts +++ b/src/client/app/mios.ts @@ -4,7 +4,7 @@ import { EventEmitter } from 'eventemitter3'; import * as uuid from 'uuid'; import initStore from './store'; -import { apiUrl, version } from './config'; +import { apiUrl, version, locale } from './config'; import Progress from './common/scripts/loading'; import Err from './common/views/components/connect-failed.vue'; @@ -281,7 +281,7 @@ export default class MiOS extends EventEmitter { // トークンが再生成されたとき // このままではMisskeyが利用できないので強制的にサインアウトさせる main.on('myTokenRegenerated', () => { - alert('%i18n:common.my-token-regenerated%'); + alert(locale['common']['my-token-regenerated']) this.signout(); }); } diff --git a/src/client/app/mobile/views/components/drive.file-detail.vue b/src/client/app/mobile/views/components/drive.file-detail.vue index 98124354ed..b9960e5433 100644 --- a/src/client/app/mobile/views/components/drive.file-detail.vue +++ b/src/client/app/mobile/views/components/drive.file-detail.vue @@ -136,7 +136,10 @@ export default Vue.extend({ }, showCreatedAt() { - alert(new Date(this.file.createdAt).toLocaleString()); + this.$root.dialog({ + type: 'info', + text: (new Date(this.file.createdAt)).toLocaleString() + }); } } }); @@ -150,11 +153,13 @@ export default Vue.extend({ > .preview width fit-content + width -moz-fit-content max-width 100% margin 0 auto box-shadow 1px 1px 4px rgba(#000, 0.2) overflow hidden color var(--driveFileIcon) + justify-content center > footer padding 8px 8px 0 8px diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 6b26cdf890..82cbdcc547 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -283,14 +283,21 @@ export default Vue.extend({ setGeo() { if (navigator.geolocation == null) { - alert(this.$t('location-alert')); + this.$root.dialog({ + type: 'warning', + text: this.$t('geolocation-alert') + }); return; } navigator.geolocation.getCurrentPosition(pos => { this.geo = pos.coords; }, err => { - alert(`%i18n:@error%: ${err.message}`); + this.$root.dialog({ + type: 'error', + title: this.$t('error') + text: err.message + }); }, { enableHighAccuracy: true }); diff --git a/src/client/app/mobile/views/pages/favorites.vue b/src/client/app/mobile/views/pages/favorites.vue index 6f175a0053..92823db7cc 100644 --- a/src/client/app/mobile/views/pages/favorites.vue +++ b/src/client/app/mobile/views/pages/favorites.vue @@ -32,7 +32,7 @@ export default Vue.extend({ this.fetch(); }, mounted() { - document.title = `${this.$root.instanceName} | %i18n:@notifications%`; + document.title = `${this.$root.instanceName} | ${this.$t('@.favorites')}`; }, methods: { fetch() { diff --git a/src/client/app/mobile/views/pages/games/reversi.vue b/src/client/app/mobile/views/pages/games/reversi.vue index c67e3fadd1..69b7bdffb4 100644 --- a/src/client/app/mobile/views/pages/games/reversi.vue +++ b/src/client/app/mobile/views/pages/games/reversi.vue @@ -15,7 +15,7 @@ export default Vue.extend({ XReversi: () => import('../../../../common/views/components/games/reversi/reversi.vue').then(m => m.default) }, mounted() { - document.title = `${this.$root.instanceName} %i18n:@reversi%`; + document.title = `${this.$root.instanceName} | ${this.$t('reversi')}`; }, methods: { nav(game, actualNav) { diff --git a/src/client/app/mobile/views/pages/search.vue b/src/client/app/mobile/views/pages/search.vue index f4b2512809..0225dd9e9f 100644 --- a/src/client/app/mobile/views/pages/search.vue +++ b/src/client/app/mobile/views/pages/search.vue @@ -50,7 +50,7 @@ export default Vue.extend({ } }, mounted() { - document.title = `%i18n:@search%: ${this.q} | ${this.$root.instanceName}`; + document.title = `${this.$t('search')}: ${this.q} | ${this.$root.instanceName}`; }, methods: { inited() { diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue index 2647f96de2..33166825cb 100644 --- a/src/client/app/mobile/views/pages/widgets.vue +++ b/src/client/app/mobile/views/pages/widgets.vue @@ -29,7 +29,8 @@
@@ -106,7 +107,10 @@ export default Vue.extend({ methods: { hint() { - alert(this.$t('widgets-hints')); + this.$root.dialog({ + type: 'info', + text: this.$t('widgets-hints') + }); }, widgetFunc(id) { diff --git a/src/client/style.styl b/src/client/style.styl index c6a8e4f19d..968e66e754 100644 --- a/src/client/style.styl +++ b/src/client/style.styl @@ -1,4 +1,4 @@ -@charset 'utf-8' +@charset "utf-8" /* ::selection diff --git a/src/docs/stream.ja-JP.md b/src/docs/stream.ja-JP.md index 0e9afa7332..40fc49916e 100644 --- a/src/docs/stream.ja-JP.md +++ b/src/docs/stream.ja-JP.md @@ -130,10 +130,12 @@ Misskeyのストリームに接続しただけでは、まだリアルタイム ```json { type: 'api', - id: 'xxxxxxxxxxxxxxxx', - endpoint: 'notes/create', - data: { - text: 'yee haw!' + body: { + id: 'xxxxxxxxxxxxxxxx', + endpoint: 'notes/create', + data: { + text: 'yee haw!' + } } } ``` diff --git a/src/misc/fetch-meta.ts b/src/misc/fetch-meta.ts index cf1fc474ce..800f0b9e63 100644 --- a/src/misc/fetch-meta.ts +++ b/src/misc/fetch-meta.ts @@ -1,14 +1,21 @@ import { Meta } from '../models/entities/meta'; -import { Metas } from '../models'; -import { genId } from './gen-id'; +import { getConnection } from 'typeorm'; export default async function(): Promise { - const meta = await Metas.findOne(); - if (meta) { - return meta; - } else { - return Metas.save({ - id: genId(), - } as Meta); - } + return await getConnection().transaction(async transactionalEntityManager => { + // バグでレコードが複数出来てしまっている可能性があるので新しいIDを優先する + const meta = await transactionalEntityManager.findOne(Meta, { + order: { + id: 'DESC' + } + }); + + if (meta) { + return meta; + } else { + return await transactionalEntityManager.save(Meta, { + id: 'x' + }) as Meta; + } + }); } diff --git a/src/models/entities/meta.ts b/src/models/entities/meta.ts index f3ac23bac7..be41cf3589 100644 --- a/src/models/entities/meta.ts +++ b/src/models/entities/meta.ts @@ -1,9 +1,11 @@ import { Entity, Column, PrimaryColumn } from 'typeorm'; -import { id } from '../id'; @Entity() export class Meta { - @PrimaryColumn(id()) + @PrimaryColumn({ + type: 'varchar', + length: 32 + }) public id: string; @Column('varchar', { diff --git a/src/models/entities/note.ts b/src/models/entities/note.ts index 969363da3b..b71c022341 100644 --- a/src/models/entities/note.ts +++ b/src/models/entities/note.ts @@ -93,12 +93,12 @@ export class Note { }) public localOnly: boolean; - @Column('integer', { + @Column('smallint', { default: 0 }) public renoteCount: number; - @Column('integer', { + @Column('smallint', { default: 0 }) public repliesCount: number; @@ -129,12 +129,14 @@ export class Note { }) public score: number; + @Index() @Column({ ...id(), array: true, default: '{}' }) public fileIds: DriveFile['id'][]; + @Index() @Column('varchar', { length: 256, array: true, default: '{}' }) diff --git a/src/models/repositories/note.ts b/src/models/repositories/note.ts index 7a48d24e13..98ed2bddc1 100644 --- a/src/models/repositories/note.ts +++ b/src/models/repositories/note.ts @@ -103,7 +103,7 @@ export class NoteRepository extends Repository { const host = note.userHost; async function populatePoll() { - const poll = await Polls.findOne({ noteId: note.id }).then(ensure); + const poll = await Polls.findOne(note.id).then(ensure); const choices = poll.choices.map(c => ({ text: c, votes: poll.votes[poll.choices.indexOf(c)], diff --git a/src/models/repositories/user.ts b/src/models/repositories/user.ts index 9e4247545a..30c77e78ca 100644 --- a/src/models/repositories/user.ts +++ b/src/models/repositories/user.ts @@ -84,6 +84,8 @@ export class UserRepository extends Repository { const pins = opts.detail ? await UserNotePinings.find({ userId: user.id }) : []; const profile = opts.detail ? await UserProfiles.findOne({ userId: user.id }).then(ensure) : null; + const falsy = opts.detail ? false : undefined; + return await rap({ id: user.id, name: user.name, @@ -91,10 +93,10 @@ export class UserRepository extends Repository { host: user.host, avatarUrl: user.avatarUrl ? user.avatarUrl : config.url + '/avatar/' + user.id, avatarColor: user.avatarColor, - isAdmin: user.isAdmin || undefined, - isBot: user.isBot || undefined, - isCat: user.isCat || undefined, - isVerified: user.isVerified || undefined, + isAdmin: user.isAdmin || falsy, + isBot: user.isBot || falsy, + isCat: user.isCat || falsy, + isVerified: user.isVerified || falsy, // カスタム絵文字添付 emojis: user.emojis.length > 0 ? Emojis.find({ @@ -123,7 +125,7 @@ export class UserRepository extends Repository { bannerUrl: user.bannerUrl, bannerColor: user.bannerColor, isLocked: user.isLocked, - isModerator: user.isModerator || undefined, + isModerator: user.isModerator || falsy, description: profile!.description, location: profile!.location, birthday: profile!.birthday, diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts index e242ac71a1..3c6380acb4 100644 --- a/src/server/api/endpoints/admin/update-meta.ts +++ b/src/server/api/endpoints/admin/update-meta.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import define from '../../define'; -import { Metas } from '../../../../models'; +import { getConnection } from 'typeorm'; import { Meta } from '../../../../models/entities/meta'; export const meta = { @@ -505,11 +505,17 @@ export default define(meta, async (ps) => { set.swPrivateKey = ps.swPrivateKey; } - const meta = await Metas.findOne(); + await getConnection().transaction(async transactionalEntityManager => { + const meta = await transactionalEntityManager.findOne(Meta, { + order: { + id: 'DESC' + } + }); - if (meta) { - await Metas.update(meta.id, set); - } else { - await Metas.save(set); - } + if (meta) { + await transactionalEntityManager.update(Meta, meta.id, set); + } else { + await transactionalEntityManager.save(Meta, set); + } + }); }); diff --git a/src/services/chart/core.ts b/src/services/chart/core.ts index 0a9ec8dae0..fe762f2b24 100644 --- a/src/services/chart/core.ts +++ b/src/services/chart/core.ts @@ -79,7 +79,7 @@ export default abstract class Chart> { flatColumns(v.properties, p); } else { columns[this.columnPrefix + p] = { - type: 'integer', + type: 'bigint', }; } } diff --git a/src/services/drive/delete-file.ts b/src/services/drive/delete-file.ts index bba453b982..f1280822a4 100644 --- a/src/services/drive/delete-file.ts +++ b/src/services/drive/delete-file.ts @@ -2,7 +2,7 @@ import * as Minio from 'minio'; import config from '../../config'; import { DriveFile } from '../../models/entities/drive-file'; import { InternalStorage } from './internal-storage'; -import { DriveFiles, Instances } from '../../models'; +import { DriveFiles, Instances, Notes } from '../../models'; import { driveChart, perUserDriveChart, instanceChart } from '../chart'; export default async function(file: DriveFile, isExpired = false) { @@ -40,6 +40,11 @@ export default async function(file: DriveFile, isExpired = false) { }); } else { DriveFiles.delete(file.id); + + // TODO: トランザクション + Notes.createQueryBuilder().delete() + .where(':id = ANY(fileIds)', { id: file.id }) + .execute(); } // 統計を更新