From e336542063f42e03fe2473de1aa7288603f4ed42 Mon Sep 17 00:00:00 2001 From: KMY Date: Sun, 20 Aug 2023 09:56:00 +0900 Subject: [PATCH] Add antenna elements limit --- .../api/v1/antennas/keywords_controller.rb | 2 ++ app/models/antenna.rb | 4 ++++ app/models/antenna_account.rb | 13 +++++++++++++ app/models/antenna_domain.rb | 7 +++++++ app/models/antenna_tag.rb | 13 +++++++++++++ config/locales/en.yml | 6 ++++++ config/locales/ja.yml | 5 +++++ 7 files changed, 50 insertions(+) diff --git a/app/controllers/api/v1/antennas/keywords_controller.rb b/app/controllers/api/v1/antennas/keywords_controller.rb index d486d1a585..b35fb535dc 100644 --- a/app/controllers/api/v1/antennas/keywords_controller.rb +++ b/app/controllers/api/v1/antennas/keywords_controller.rb @@ -21,6 +21,8 @@ class Api::V1::Antennas::KeywordsController < Api::BaseController new_keywords << keyword end + raise Mastodon::ValidationError, I18n.t('antennas.errors.limit.keywords') if new_keywords.size > Antenna::KEYWORDS_PER_ANTENNA_LIMIT + @antenna.update!(keywords: new_keywords, any_keywords: new_keywords.empty?) render_empty diff --git a/app/models/antenna.rb b/app/models/antenna.rb index 5476a6d149..a52e78192d 100644 --- a/app/models/antenna.rb +++ b/app/models/antenna.rb @@ -30,6 +30,10 @@ class Antenna < ApplicationRecord include Expireable LIMIT = 30 + DOMAINS_PER_ANTENNA_LIMIT = 20 + ACCOUNTS_PER_ANTENNA_LIMIT = 100 + TAGS_PER_ANTENNA_LIMIT = 50 + KEYWORDS_PER_ANTENNA_LIMIT = 100 has_many :antenna_domains, inverse_of: :antenna, dependent: :destroy has_many :antenna_tags, inverse_of: :antenna, dependent: :destroy diff --git a/app/models/antenna_account.rb b/app/models/antenna_account.rb index 78c6255c30..29da021425 100644 --- a/app/models/antenna_account.rb +++ b/app/models/antenna_account.rb @@ -14,4 +14,17 @@ class AntennaAccount < ApplicationRecord belongs_to :antenna belongs_to :account + + validate :duplicate_account + validate :limit_per_antenna + + private + + def duplicate_account + raise Mastodon::ValidationError, I18n.t('antennas.errors.duplicate_account') if AntennaAccount.exists?(antenna_id: antenna_id, account_id: account_id, exclude: exclude) + end + + def limit_per_antenna + raise Mastodon::ValidationError, I18n.t('antennas.errors.limit.accounts') if AntennaAccount.where(antenna_id: antenna_id).count >= Antenna::ACCOUNTS_PER_ANTENNA_LIMIT + end end diff --git a/app/models/antenna_domain.rb b/app/models/antenna_domain.rb index 3b387b7c19..09e481ad9f 100644 --- a/app/models/antenna_domain.rb +++ b/app/models/antenna_domain.rb @@ -15,8 +15,15 @@ class AntennaDomain < ApplicationRecord belongs_to :antenna validate :duplicate_domain + validate :limit_per_antenna + + private def duplicate_domain raise Mastodon::ValidationError, I18n.t('antennas.errors.duplicate_domain') if AntennaDomain.exists?(antenna_id: antenna_id, name: name, exclude: exclude) end + + def limit_per_antenna + raise Mastodon::ValidationError, I18n.t('antennas.errors.limit.domains') if AntennaDomain.where(antenna_id: antenna_id).count >= Antenna::DOMAINS_PER_ANTENNA_LIMIT + end end diff --git a/app/models/antenna_tag.rb b/app/models/antenna_tag.rb index 194b5eba8a..0fbdbc0932 100644 --- a/app/models/antenna_tag.rb +++ b/app/models/antenna_tag.rb @@ -14,4 +14,17 @@ class AntennaTag < ApplicationRecord belongs_to :antenna belongs_to :tag + + validate :duplicate_tag + validate :limit_per_antenna + + private + + def duplicate_tag + raise Mastodon::ValidationError, I18n.t('antennas.errors.duplicate_tag') if AntennaTag.exists?(antenna_id: antenna_id, tag_id: tag_id, exclude: exclude) + end + + def limit_per_antenna + raise Mastodon::ValidationError, I18n.t('antennas.errors.limit.tags') if AntennaTag.where(antenna_id: antenna_id).count >= Antenna::TAGS_PER_ANTENNA_LIMIT + end end diff --git a/config/locales/en.yml b/config/locales/en.yml index a20ae7f33c..5530c3e88e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1028,6 +1028,12 @@ en: domain: Domains keyword: Keywords tag: Tags + errors: + limit: + accounts: 登録できるアカウント数の上限に達しています + domains: 登録できるドメイン数の上限に達しています + keywords: 登録できるキーワード数の上限に達しています + tags: 登録できるタグ数の上限に達しています edit: accounts_hint: \@askyq or @askyq@example.com accounts_raw: Account list diff --git a/config/locales/ja.yml b/config/locales/ja.yml index b2904429b5..d8c103c07f 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1027,6 +1027,11 @@ ja: duplicate_keyword: すでに同じキーワードが登録されています empty_contexts: 絞り込み条件が1つも指定されていないため無効です(除外条件はカウントされません) invalid_list_owner: これはあなたのリストではありません + limit: + accounts: 登録できるアカウント数の上限に達しています + domains: 登録できるドメイン数の上限に達しています + keywords: 登録できるキーワード数の上限に達しています + tags: 登録できるタグ数の上限に達しています over_limit: 所持できるアンテナ数 %{limit}を超えています over_stl_limit: 所持できるSTLモード付きアンテナ数 (ホーム/リストそれぞれにつき%{limit}) を超えています remove_list_with_antenna: アンテナが関連付けられているリストは削除できません