ぼざクリタグ広場 https://hub.nizika.monster
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

119 lines
3.6 KiB

  1. class MaterialsController < ApplicationController
  2. def index
  3. page = (params[:page].presence || 1).to_i
  4. limit = (params[:limit].presence || 20).to_i
  5. page = 1 if page < 1
  6. limit = 1 if limit < 1
  7. offset = (page - 1) * limit
  8. tag_id = params[:tag_id].presence
  9. parent_id = params[:parent_id].presence
  10. q = Material.includes(:tag, :created_by_user).with_attached_file
  11. q = q.where(tag_id:) if tag_id
  12. q = q.where(parent_id:) if parent_id
  13. count = q.count
  14. materials = q.order(created_at: :desc, id: :desc).limit(limit).offset(offset)
  15. render json: { materials: materials.map { |m| material_json(m) }, count: count }
  16. end
  17. def show
  18. material =
  19. Material
  20. .includes(:tag)
  21. .with_attached_file
  22. .find_by(id: params[:id])
  23. return head :not_found unless material
  24. render json: material.as_json(methods: [:content_type]).merge(
  25. file: if material.file.attached?
  26. rails_storage_proxy_url(material.file, only_path: false)
  27. end,
  28. tag: TagRepr.base(material.tag))
  29. end
  30. def create
  31. return head :unauthorized unless current_user
  32. tag_name_raw = params[:tag].to_s.strip
  33. file = params[:file]
  34. url = params[:url].to_s.strip.presence
  35. return head :bad_request if tag_name_raw.blank? || (file.blank? && url.blank?)
  36. tag_name = TagName.find_undiscard_or_create_by!(name: tag_name_raw)
  37. tag = tag_name.tag
  38. tag = Tag.create!(tag_name:, category: :material) unless tag
  39. material = Material.new(tag:, url:,
  40. created_by_user: current_user,
  41. updated_by_user: current_user)
  42. material.file.attach(file)
  43. if material.save
  44. render json: material_json(material), status: :created
  45. else
  46. render json: { errors: material.errors.full_messages }, status: :unprocessable_entity
  47. end
  48. end
  49. def update
  50. return head :unauthorized unless current_user
  51. return head :forbidden unless current_user.gte_member?
  52. material = Material.with_attached_file.find_by(id: params[:id])
  53. return head :not_found unless material
  54. tag_name_raw = params[:tag].to_s.strip
  55. file = params[:file]
  56. url = params[:url].to_s.strip.presence
  57. return head :bad_request if tag_name_raw.blank? || (file.blank? && url.blank?)
  58. tag_name = TagName.find_undiscard_or_create_by!(name: tag_name_raw)
  59. tag = tag_name.tag
  60. tag = Tag.create!(tag_name:, category: :material) unless tag
  61. material.update!(tag:, url:, updated_by_user: current_user)
  62. if file
  63. material.file.attach(file)
  64. else
  65. material.file.purge(file)
  66. end
  67. if material.save
  68. render json: material.as_json(methods: [:content_type]).merge(
  69. file: if material.file.attached?
  70. rails_storage_proxy_url(material.file, only_path: false)
  71. end,
  72. tag: TagRepr.base(material.tag))
  73. else
  74. render json: { errors: material.errors.full_messages }, status: :unprocessable_entity
  75. end
  76. end
  77. def destroy
  78. return head :unauthorized unless current_user
  79. return head :forbidden unless current_user.gte_member?
  80. material = Material.find_by(id: params[:id])
  81. return head :not_found unless material
  82. material.discard
  83. head :no_content
  84. end
  85. private
  86. def material_json(material)
  87. MaterialRepr.base(material).merge(
  88. 'filename' => material.file.attached? ? material.file.filename.to_s : nil,
  89. 'byte_size' => material.file.attached? ? material.file.byte_size : nil,
  90. 'content_type' => material.file.attached? ? material.file.content_type : nil,
  91. 'url' => material.file.attached? ? url_for(material.file) : nil
  92. )
  93. end
  94. end