Merge remote-tracking branch 'origin/main' into feature/047
This commit is contained in:
@@ -1,14 +1,16 @@
|
||||
class ApplicationController < ActionController::API
|
||||
before_action :reject_banned_ip_address!
|
||||
before_action :authenticate_user
|
||||
before_action :reject_banned_user!
|
||||
|
||||
def current_user
|
||||
@current_user
|
||||
end
|
||||
def current_user = @current_user
|
||||
|
||||
private
|
||||
|
||||
def authenticate_user
|
||||
code = request.headers['X-Transfer-Code'] || request.headers['HTTP_X_TRANSFER_CODE']
|
||||
return if code.blank?
|
||||
|
||||
@current_user = User.find_by(inheritance_code: code)
|
||||
end
|
||||
|
||||
@@ -22,4 +24,17 @@ class ApplicationController < ActionController::API
|
||||
s.in?(['', '1', 'true', 'on', 'yes'])
|
||||
end
|
||||
end
|
||||
|
||||
def reject_banned_ip_address!
|
||||
ip_address = IpAddress.find_by(ip_address: IPAddr.new(request.remote_ip).hton)
|
||||
return unless ip_address&.banned?
|
||||
|
||||
head :forbidden
|
||||
end
|
||||
|
||||
def reject_banned_user!
|
||||
return unless current_user&.banned?
|
||||
|
||||
head :forbidden
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
require 'net/http'
|
||||
require 'uri'
|
||||
|
||||
|
||||
class TagsController < ApplicationController
|
||||
def index
|
||||
post_id = params[:post]
|
||||
@@ -182,7 +186,8 @@ class TagsController < ApplicationController
|
||||
.find_by(id: params[:id])
|
||||
return head :not_found unless tag
|
||||
|
||||
render json: DeerjikistRepr.many(tag.deerjikists)
|
||||
render json: { tag: TagRepr.base(tag),
|
||||
deerjikists: DeerjikistRepr.many(tag.deerjikists) }
|
||||
end
|
||||
|
||||
def deerjikists_by_name
|
||||
@@ -194,7 +199,31 @@ class TagsController < ApplicationController
|
||||
.find_by(tag_names: { name: })
|
||||
return head :not_found unless tag
|
||||
|
||||
render json: DeerjikistRepr.many(tag.deerjikists)
|
||||
render json: { tag: TagRepr.base(tag),
|
||||
deerjikists: DeerjikistRepr.many(tag.deerjikists) }
|
||||
end
|
||||
|
||||
def update_deerjikists
|
||||
return head :unauthorized unless current_user
|
||||
return head :forbidden unless current_user.gte_member?
|
||||
|
||||
tag = Tag.joins(:tag_name)
|
||||
.includes(:tag_name, tag_name: :wiki_page)
|
||||
.find_by(id: params[:id])
|
||||
return head :not_found unless tag
|
||||
|
||||
ApplicationRecord.transaction do
|
||||
tag.deerjikists = []
|
||||
params[:_json].each do
|
||||
platform = _1[:platform]
|
||||
code = normalise_deerjikist_code(platform, _1[:code])
|
||||
deerjikist = Deerjikist.find_or_initialize_by(platform:, code:)
|
||||
deerjikist.tag = tag
|
||||
deerjikist.save!
|
||||
end
|
||||
end
|
||||
|
||||
render json: DeerjikistRepr.many(tag.reload.deerjikists)
|
||||
end
|
||||
|
||||
def materials_by_name
|
||||
@@ -391,4 +420,21 @@ class TagsController < ApplicationController
|
||||
TagImplication.create!(tag:, parent_tag:)
|
||||
end
|
||||
end
|
||||
|
||||
def normalise_deerjikist_code platform, code
|
||||
return code if platform != 'youtube' || code[0] != '@'
|
||||
|
||||
url = "https://www.youtube.com/#{ code }"
|
||||
|
||||
html = Net::HTTP.get(URI(url))
|
||||
|
||||
canonical = html[
|
||||
/<link rel="canonical" href="https:\/\/www\.youtube\.com\/channel\/(UC[a-zA-Z0-9_-]{22})"/,
|
||||
1]
|
||||
return canonical if canonical
|
||||
|
||||
html[/"channelId":"(UC[a-zA-Z0-9_-]{22})"/, 1] || html[/\bUC[a-zA-Z0-9_-]{22}\b/]
|
||||
rescue
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
class UsersController < ApplicationController
|
||||
def create
|
||||
return head :unprocessable_entity if request.remote_ip.blank?
|
||||
|
||||
user = nil
|
||||
|
||||
User.transaction do
|
||||
user = User.create!(inheritance_code: SecureRandom.uuid, role: :guest)
|
||||
attach_ip_address!(user)
|
||||
@@ -17,8 +14,7 @@ class UsersController < ApplicationController
|
||||
def verify
|
||||
user = User.find_by(inheritance_code: params[:code])
|
||||
return render json: { valid: false } unless user
|
||||
|
||||
return head :unprocessable_entity if request.remote_ip.blank?
|
||||
return head :forbidden if user.banned?
|
||||
|
||||
attach_ip_address!(user)
|
||||
|
||||
|
||||
@@ -4,11 +4,7 @@ class IpAddress < ApplicationRecord
|
||||
has_many :user_ips, dependent: :destroy
|
||||
has_many :users, through: :user_ips
|
||||
|
||||
def banned? = banned_at?
|
||||
def banned = banned?
|
||||
|
||||
def banned= value
|
||||
bool = ActiveModel::Type::Boolean.new.cast(value)
|
||||
self.banned_at = bool ? banned_at || Time.current : nil
|
||||
end
|
||||
def banned? = banned_at.present?
|
||||
def ban! = banned? || update!(banned_at: Time.current)
|
||||
def unban! = update!(banned_at: nil)
|
||||
end
|
||||
|
||||
@@ -79,6 +79,8 @@ class Tag < ApplicationRecord
|
||||
|
||||
def material_id = materials.first&.id
|
||||
|
||||
def has_deerjikists = deerjikists.present?
|
||||
|
||||
def self.tagme = find_or_create_by_tag_name!('タグ希望', category: :meta)
|
||||
def self.bot = find_or_create_by_tag_name!('bot操作', category: :meta)
|
||||
def self.no_deerjikist = find_or_create_by_tag_name!('ニジラー情報不詳', category: :meta)
|
||||
|
||||
@@ -17,14 +17,11 @@ class User < ApplicationRecord
|
||||
has_many :updated_wiki_pages,
|
||||
class_name: 'WikiPage', foreign_key: :updated_user_id, dependent: :nullify
|
||||
|
||||
def banned? = banned_at?
|
||||
def banned = banned?
|
||||
|
||||
def banned= value
|
||||
bool = ActiveModel::Type::Boolean.new.cast(value)
|
||||
self.banned_at = bool ? (banned_at || Time.current) : nil
|
||||
end
|
||||
|
||||
def viewed?(post) = user_post_views.exists?(post_id: post.id)
|
||||
|
||||
def gte_member? = member? || admin?
|
||||
|
||||
def banned? = banned_at.present?
|
||||
def ban! = banned? || update!(banned_at: Time.current)
|
||||
def unban! = update!(banned_at: nil)
|
||||
end
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
module TagRepr
|
||||
BASE = { only: [:id, :category, :post_count, :created_at, :updated_at],
|
||||
methods: [:name, :has_wiki, :material_id] }.freeze
|
||||
methods: [:name, :has_wiki, :material_id, :has_deerjikists] }.freeze
|
||||
|
||||
module_function
|
||||
|
||||
|
||||
Reference in New Issue
Block a user