| @@ -1,110 +1,80 @@ | |||||
| class Users::MessagesController < Users::BaseController | class Users::MessagesController < Users::BaseController | ||||
| before_action :private_user_resources! | before_action :private_user_resources! | ||||
| before_action :find_receivers, only: [:create] | |||||
| def index | def index | ||||
| data = { | |||||
| "receiver": 2, | |||||
| "type": @message_type, | |||||
| "unread_total": 5, | |||||
| "unread_notification": 3, | |||||
| "unread_atme": 2, | |||||
| "records": [ | |||||
| { | |||||
| "id": 1, | |||||
| "sender": 5, | |||||
| "receiver": 2, | |||||
| "content": "Atme Message Content 1", | |||||
| "status": 1, | |||||
| "type": 2, | |||||
| "source": "PullRequestAtme", | |||||
| "notification_url": "http://www.baidu.com", | |||||
| "created_at": "2021-09-09 14:34:40" | |||||
| }, | |||||
| { | |||||
| "id": 2, | |||||
| "sender": 4, | |||||
| "receiver": 2, | |||||
| "content": "Atme Message Content 2", | |||||
| "status": 2, | |||||
| "type": 2, | |||||
| "source": "IssueAtme", | |||||
| "notification_url": "http://www.baidu.com", | |||||
| "created_at": "2021-09-09 14:34:40" | |||||
| }, | |||||
| { | |||||
| "id": 3, | |||||
| "sender": -1, | |||||
| "receiver": 2, | |||||
| "content": "Notification Message Content 1", | |||||
| "status": 1, | |||||
| "type": 1, | |||||
| "source": "IssueDelete", | |||||
| "notification_url": "http://www.baidu.com", | |||||
| "created_at": "2021-09-09 14:34:40" | |||||
| }, | |||||
| { | |||||
| "id": 4, | |||||
| "sender": -1, | |||||
| "receiver": 2, | |||||
| "content": "Notification Message Content 2", | |||||
| "status": 2, | |||||
| "type": 1, | |||||
| "source": "IssueChanged", | |||||
| "notification_url": "http://www.baidu.com", | |||||
| "created_at": "2021-09-09 14:34:40" | |||||
| }, | |||||
| { | |||||
| "id": 5, | |||||
| "sender": -1, | |||||
| "receiver": 2, | |||||
| "content": "Notification Message Content 3", | |||||
| "status": 2, | |||||
| "type": 1, | |||||
| "source": "ProjectJoined", | |||||
| "notification_url": "http://www.baidu.com", | |||||
| "created_at": "2021-09-09 14:34:40" | |||||
| } | |||||
| ], | |||||
| "records_count": 5, | |||||
| "page_num": 1, | |||||
| "total_page_size": 1, | |||||
| "page_size": 10 | |||||
| } | |||||
| result = [1, "请求成功", data] | |||||
| limit = params[:limit] || params[:per_page] | |||||
| limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i | |||||
| page = params[:page].to_i.zero? ? 1 : params[:page].to_i | |||||
| result = Notice::Read::ListService.call(observed_user.id, message_type, message_status, page, limit) | |||||
| return render_error if result.nil? | return render_error if result.nil? | ||||
| puts result | |||||
| @data = result[2].stringify_keys | |||||
| @data = result[2] | |||||
| end | end | ||||
| def create | def create | ||||
| return render_forbidden unless %w(3).include(@message_type) | |||||
| return render_forbidden unless %w(atme).include?(params[:type]) | |||||
| case params[:type] | |||||
| when 'atme' | |||||
| Notice::Write::CreateAtmeForm.new(atme_params).validate! | |||||
| result = Notice::Write::CreateService.call(@receivers.pluck(:id), '发送了一个@我消息', base_url, "IssueAtme", 2) | |||||
| return render_error if result.nil? | |||||
| end | |||||
| render_ok | render_ok | ||||
| rescue Exception => e | |||||
| uid_logger_error(e.message) | |||||
| tip_exception(e.message) | |||||
| end | end | ||||
| def delete | def delete | ||||
| return render_forbidden unless %w(2).include(@message_type) | |||||
| return render_forbidden unless %w(atme).include?(params[:type]) | |||||
| result = Notice::Write::DeleteService.call(params[:ids], observed_user.id) | |||||
| return render_error if result.nil? | |||||
| render_ok | render_ok | ||||
| rescue Exception => e | |||||
| uid_logger_error(e.message) | |||||
| tip_exception(e.message) | |||||
| end | end | ||||
| def read | def read | ||||
| render_ok | |||||
| return render_forbidden unless %w(notification atme).include?(params[:type]) | |||||
| result = Notice::Write::ChangeStatusService.call(params[:ids], observed_user.id) | |||||
| if result.nil? | |||||
| render_error | |||||
| else | |||||
| render_ok | |||||
| end | |||||
| rescue Exception => e | |||||
| uid_logger_error(e.message) | |||||
| tip_exception(e.message) | |||||
| end | end | ||||
| private | private | ||||
| def message_type | def message_type | ||||
| @message_type = begin | @message_type = begin | ||||
| case params[:type] | case params[:type] | ||||
| when "notification" | |||||
| 1 | |||||
| when "atme" | |||||
| 2 | |||||
| when "notification" then 1 | |||||
| when "atme" then 2 | |||||
| else | else | ||||
| -1 | -1 | ||||
| end | end | ||||
| end | end | ||||
| end | end | ||||
| def message_status | |||||
| @message_status = begin | |||||
| case params[:status] | |||||
| when "1" then 1 | |||||
| else | |||||
| 2 | |||||
| end | |||||
| end | |||||
| end | |||||
| def atme_params | |||||
| params.permit(:atmeable_type, :atmeable_id, receivers_login: []) | |||||
| end | |||||
| def message_params | def message_params | ||||
| { | { | ||||
| sender: current_user.id, | sender: current_user.id, | ||||
| @@ -114,8 +84,8 @@ class Users::MessagesController < Users::BaseController | |||||
| } | } | ||||
| end | end | ||||
| def find_receiver | |||||
| @receiver = User.find_by(login: params[:receiver_login]) | |||||
| def find_receivers | |||||
| @receivers = User.where(login: params[:receivers_login]) | |||||
| return render_not_found if @receivers.size == 0 | |||||
| end | end | ||||
| end | end | ||||
| @@ -0,0 +1,23 @@ | |||||
| class Notice::Write::CreateAtmeForm | |||||
| include ActiveModel::Model | |||||
| attr_accessor :receivers_login, :atmeable_type, :atmeable_id | |||||
| validate :check_receivers | |||||
| def check_receivers | |||||
| receivers_login.each do |login| | |||||
| receiver = User.find_by(login: login) || User.find_by_id(login) | |||||
| raise 'receivers_login值无效.' unless receiver.present? | |||||
| end | |||||
| end | |||||
| def check_atmeable | |||||
| begin | |||||
| raise 'atmeable对象无效.' unless atmeable_type.constantize.find_by_id(atmeable_id).present? | |||||
| rescue => exception | |||||
| raise 'atmeable对象无效.' | |||||
| end | |||||
| end | |||||
| end | |||||
| @@ -1,4 +1,4 @@ | |||||
| class Notice::ClientService < ApplicationService | |||||
| class Notice::Read::ClientService < ApplicationService | |||||
| attr_reader :url, :params | attr_reader :url, :params | ||||
| def initialize(options={}) | def initialize(options={}) | ||||
| @@ -7,7 +7,7 @@ class Notice::ClientService < ApplicationService | |||||
| end | end | ||||
| def post(url, params={}) | def post(url, params={}) | ||||
| puts "[notice][POST] request params: #{params}" | |||||
| puts "[notice][read][POST] request params: #{params}" | |||||
| conn.post do |req| | conn.post do |req| | ||||
| req.url = full_url(url) | req.url = full_url(url) | ||||
| req.body = params[:data].to_json | req.body = params[:data].to_json | ||||
| @@ -15,7 +15,7 @@ class Notice::ClientService < ApplicationService | |||||
| end | end | ||||
| def get(url, params={}) | def get(url, params={}) | ||||
| puts "[notice][GET] request params: #{params}" | |||||
| puts "[notice][read][GET] request params: #{params}" | |||||
| conn.get do |req| | conn.get do |req| | ||||
| req.url full_url(url, 'get') | req.url full_url(url, 'get') | ||||
| params.each_pair do |key, value| | params.each_pair do |key, value| | ||||
| @@ -25,31 +25,31 @@ class Notice::ClientService < ApplicationService | |||||
| end | end | ||||
| def delete(url, params={}) | def delete(url, params={}) | ||||
| puts "[notice][DELETE] request params: #{params}" | |||||
| puts "[notice][read][DELETE] request params: #{params}" | |||||
| conn.delete do |req| | conn.delete do |req| | ||||
| req.url full_url(url) | req.url full_url(url) | ||||
| reb.body = params[:data].to_json | |||||
| req.body = params[:data].to_json | |||||
| end | end | ||||
| end | end | ||||
| def patch(url, params={}) | def patch(url, params={}) | ||||
| puts "[notice][PATCH] request params: #{params}" | |||||
| puts "[notice][read][PATCH] request params: #{params}" | |||||
| conn.patch do |req| | conn.patch do |req| | ||||
| req.url full_url(url) | req.url full_url(url) | ||||
| reb.body = params[:data].to_json | |||||
| req.body = params[:data].to_json | |||||
| end | end | ||||
| end | end | ||||
| def put(url, params={}) | def put(url, params={}) | ||||
| puts "[notice][PUT] request params: #{params}" | |||||
| puts "[notice][read][PUT] request params: #{params}" | |||||
| conn.put do |req| | conn.put do |req| | ||||
| req.url full_url(url) | req.url full_url(url) | ||||
| reb.body = params[:data].to_json | |||||
| req.body = params[:data].to_json | |||||
| end | end | ||||
| end | end | ||||
| #private | #private | ||||
| def conn | |||||
| def conn | |||||
| @client ||= begin | @client ||= begin | ||||
| Faraday.new(url: domain) do |req| | Faraday.new(url: domain) do |req| | ||||
| req.request :url_encoded | req.request :url_encoded | ||||
| @@ -66,7 +66,7 @@ class Notice::ClientService < ApplicationService | |||||
| end | end | ||||
| def domain | def domain | ||||
| Notice.notice_config[:domain] | |||||
| Notice.notice_config[:read_domain] | |||||
| end | end | ||||
| def platform | def platform | ||||
| @@ -74,25 +74,25 @@ class Notice::ClientService < ApplicationService | |||||
| end | end | ||||
| def api_url | def api_url | ||||
| [domain, base_url].join('') | |||||
| [domain, base_url, "/#{platform}"].join('') | |||||
| end | end | ||||
| def full_url(api_rest, action='post') | def full_url(api_rest, action='post') | ||||
| url = [api_url, api_rest].join('').freeze | url = [api_url, api_rest].join('').freeze | ||||
| url = action === 'get' ? url : URI.escape(url) | url = action === 'get' ? url : URI.escape(url) | ||||
| url = URI.escape(url) unless url.ascii_only? | url = URI.escape(url) unless url.ascii_only? | ||||
| puts "[notice] request url: #{url}" | |||||
| puts "[notice][read] request url: #{url}" | |||||
| return url | return url | ||||
| end | end | ||||
| def log_error(status, body) | def log_error(status, body) | ||||
| puts "[notice] status: #{status}" | |||||
| puts "[notice] body: #{body&.force_encoding('UTF-8')}" | |||||
| puts "[notice][read] status: #{status}" | |||||
| puts "[notice][read] body: #{body}" | |||||
| end | end | ||||
| def render_response(response) | def render_response(response) | ||||
| status = response.status | status = response.status | ||||
| body = response&.body | |||||
| body = JSON.parse(response&.body) | |||||
| log_error(status, body) | log_error(status, body) | ||||
| @@ -100,8 +100,8 @@ class Notice::ClientService < ApplicationService | |||||
| if body["code"] == 1 | if body["code"] == 1 | ||||
| return [body["code"], body["message"], body["data"]] | return [body["code"], body["message"], body["data"]] | ||||
| else | else | ||||
| puts "[notice][ERROR] code: #{body["code"]}" | |||||
| puts "[notice][ERROR] message: #{body["message"]}" | |||||
| puts "[notice][read][ERROR] code: #{body["code"]}" | |||||
| puts "[notice][read][ERROR] message: #{body["message"]}" | |||||
| end | end | ||||
| end | end | ||||
| end | end | ||||
| @@ -0,0 +1,25 @@ | |||||
| class Notice::Read::CountService < Notice::Read::ClientService | |||||
| attr_accessor :receiver, :type | |||||
| def initialize(receiver, type=-1) | |||||
| @receiver = receiver | |||||
| @type = type | |||||
| end | |||||
| def call | |||||
| result = get(url, request_params) | |||||
| response = render_response(result) | |||||
| end | |||||
| private | |||||
| def request_params | |||||
| { | |||||
| receiver: receiver, | |||||
| type: type | |||||
| }.stringify_keys | |||||
| end | |||||
| def url | |||||
| "/count".freeze | |||||
| end | |||||
| end | |||||
| @@ -0,0 +1,40 @@ | |||||
| class Notice::Read::ListService < Notice::Read::ClientService | |||||
| attr_accessor :receiver, :type, :status, :page, :size | |||||
| def initialize(receiver, type=-1, status=2, page=1, size=15) | |||||
| @receiver = receiver | |||||
| @type = type | |||||
| @status = status | |||||
| @page = page | |||||
| @size = size | |||||
| end | |||||
| def call | |||||
| result = get(url, request_params) | |||||
| response = render_response(result) | |||||
| end | |||||
| private | |||||
| def request_status | |||||
| case status | |||||
| when 1 then 1 | |||||
| else | |||||
| 2 | |||||
| end | |||||
| end | |||||
| def request_params | |||||
| { | |||||
| receiver: receiver, | |||||
| page: page, | |||||
| show: request_status, | |||||
| size: size, | |||||
| type: type | |||||
| }.stringify_keys | |||||
| end | |||||
| def url | |||||
| "/list".freeze | |||||
| end | |||||
| end | |||||
| @@ -0,0 +1,29 @@ | |||||
| class Notice::Write::ChangeStatusService < Notice::Write::ClientService | |||||
| attr_accessor :notification_ids, :receiver, :status | |||||
| def initialize(notification_ids, receiver, status=2) | |||||
| @notification_ids = notification_ids | |||||
| @receiver = receiver | |||||
| @status = status | |||||
| end | |||||
| def call | |||||
| result = put("", request_params) | |||||
| response = render_response(result) | |||||
| end | |||||
| private | |||||
| def request_notification_ids | |||||
| notification_ids.join(",") | |||||
| end | |||||
| def request_params | |||||
| Hash.new.merge(data: { | |||||
| notificationIds: request_notification_ids, | |||||
| receiver: receiver, | |||||
| status: status | |||||
| }.stringify_keys) | |||||
| end | |||||
| end | |||||
| @@ -0,0 +1,108 @@ | |||||
| class Notice::Write::ClientService < ApplicationService | |||||
| attr_reader :url, :params | |||||
| def initialize(options={}) | |||||
| @url = options[:url] | |||||
| @params = options[:params] | |||||
| end | |||||
| def post(url, params={}) | |||||
| puts "[notice][write][POST] request params: #{params}" | |||||
| conn.post do |req| | |||||
| req.url full_url(url) | |||||
| req.body = params[:data].to_json | |||||
| end | |||||
| end | |||||
| def get(url, params={}) | |||||
| puts "[notice][write][GET] request params: #{params}" | |||||
| conn.get do |req| | |||||
| req.url full_url(url, 'get') | |||||
| params.each_pair do |key, value| | |||||
| req.params["#{key}"] = value | |||||
| end | |||||
| end | |||||
| end | |||||
| def delete(url, params={}) | |||||
| puts "[notice][write][DELETE] request params: #{params}" | |||||
| conn.delete do |req| | |||||
| req.url full_url(url) | |||||
| req.body = params[:data].to_json | |||||
| end | |||||
| end | |||||
| def patch(url, params={}) | |||||
| puts "[notice][write][PATCH] request params: #{params}" | |||||
| conn.patch do |req| | |||||
| req.url full_url(url) | |||||
| req.body = params[:data].to_json | |||||
| end | |||||
| end | |||||
| def put(url, params={}) | |||||
| puts "[notice][write][PUT] request params: #{params}" | |||||
| conn.put do |req| | |||||
| req.url full_url(url) | |||||
| req.body = params[:data].to_json | |||||
| end | |||||
| end | |||||
| #private | |||||
| def conn | |||||
| @client ||= begin | |||||
| Faraday.new(url: domain) do |req| | |||||
| req.request :url_encoded | |||||
| req.headers['Content-Type'] = 'application/json' | |||||
| req.adapter Faraday.default_adapter | |||||
| end | |||||
| end | |||||
| @client | |||||
| end | |||||
| def base_url | |||||
| Notice.notice_config[:base_url] | |||||
| end | |||||
| def domain | |||||
| Notice.notice_config[:write_domain] | |||||
| end | |||||
| def platform | |||||
| Notice.notice_config[:platform] | |||||
| end | |||||
| def api_url | |||||
| [domain, base_url, "/#{platform}"].join('') | |||||
| end | |||||
| def full_url(api_rest, action='post') | |||||
| url = [api_url, api_rest].join('').freeze | |||||
| url = action === 'get' ? url : URI.escape(url) | |||||
| url = URI.escape(url) unless url.ascii_only? | |||||
| puts "[notice][write] request url: #{url}" | |||||
| return url | |||||
| end | |||||
| def log_error(status, body) | |||||
| puts "[notice][write] status: #{status}" | |||||
| puts "[notice][write] body: #{body}" | |||||
| end | |||||
| def render_response(response) | |||||
| status = response.status | |||||
| body = JSON.parse(response&.body) | |||||
| log_error(status, body) | |||||
| if status == 200 | |||||
| if body["code"] == 1 | |||||
| return [body["code"], body["message"], body["data"]] | |||||
| else | |||||
| puts "[notice][write][ERROR] code: #{body["code"]}" | |||||
| puts "[notice][write][ERROR] message: #{body["message"]}" | |||||
| end | |||||
| end | |||||
| end | |||||
| end | |||||
| @@ -0,0 +1,37 @@ | |||||
| class Notice::Write::CreateService < Notice::Write::ClientService | |||||
| attr_accessor :receivers, :sender, :content, :notification_url, :source, :extra, :type | |||||
| def initialize(receivers, content, notification_url, source, type=1, extra={},sender=-1) | |||||
| @receivers = receivers | |||||
| @sender = sender | |||||
| @content = content | |||||
| @notification_url = notification_url | |||||
| @source = source | |||||
| @extra = extra | |||||
| @type = type | |||||
| end | |||||
| def call | |||||
| result = post("", request_params) | |||||
| response = render_response(result) | |||||
| end | |||||
| private | |||||
| def request_receivers | |||||
| receivers.join(",") | |||||
| end | |||||
| def request_params | |||||
| Hash.new.merge(data: { | |||||
| receivers: request_receivers, | |||||
| sender: sender, | |||||
| content: content, | |||||
| notification_url: notification_url, | |||||
| source: source, | |||||
| extra: extra.to_json.to_s, | |||||
| type: type | |||||
| }.stringify_keys) | |||||
| end | |||||
| end | |||||
| @@ -0,0 +1,27 @@ | |||||
| class Notice::Write::DeleteService < Notice::Write::ClientService | |||||
| attr_accessor :notification_ids, :receiver | |||||
| def initialize(notification_ids, receiver) | |||||
| @notification_ids = notification_ids | |||||
| @receiver = receiver | |||||
| end | |||||
| def call | |||||
| result = delete("", request_params) | |||||
| response = render_response(result) | |||||
| end | |||||
| private | |||||
| def request_notification_ids | |||||
| notification_ids.join(",") | |||||
| end | |||||
| def request_params | |||||
| Hash.new.merge(data: { | |||||
| notificationIds: request_notification_ids, | |||||
| receiver: receiver | |||||
| }.stringify_keys) | |||||
| end | |||||
| end | |||||
| @@ -58,7 +58,9 @@ default: &default | |||||
| base_url: '/api/v1' | base_url: '/api/v1' | ||||
| notice: | notice: | ||||
| domain: '' | |||||
| platform: '' | |||||
| write_domain: '' | |||||
| read_domain: '' | |||||
| base_url: '' | base_url: '' | ||||
| production: | production: | ||||
| @@ -302,11 +302,13 @@ Rails.application.routes.draw do | |||||
| # resource :unread_message_info, only: [:show] | # resource :unread_message_info, only: [:show] | ||||
| # 通知中心 | # 通知中心 | ||||
| resources :messages, only: [:index, :create, :delete] do | |||||
| resources :messages, only: [:index, :create] do | |||||
| collection do | collection do | ||||
| post :read | post :read | ||||
| end | end | ||||
| end | end | ||||
| delete 'messages', to: 'messages#delete' | |||||
| end | end | ||||
| resources :tidings, only: [:index] | resources :tidings, only: [:index] | ||||