add: notice system api

This commit is contained in:
yystopf 2021-09-13 17:51:34 +08:00
parent 877a20350d
commit 465a3a67a5
11 changed files with 365 additions and 102 deletions

View File

@ -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 = { limit = params[:limit] || params[:per_page]
"receiver": 2, limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i
"type": @message_type, page = params[:page].to_i.zero? ? 1 : params[:page].to_i
"unread_total": 5, result = Notice::Read::ListService.call(observed_user.id, message_type, message_status, page, limit)
"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]
return render_error if result.nil? return render_error if result.nil?
puts result @data = result[2]
@data = result[2].stringify_keys
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" when "notification" then 1
1 when "atme" then 2
when "atme"
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_receivers
def find_receiver @receivers = User.where(login: params[:receivers_login])
@receiver = User.find_by(login: params[:receiver_login]) return render_not_found if @receivers.size == 0
end end
end end

View File

@ -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

View File

@ -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][read] status: #{status}"
puts "[notice] body: #{body&.force_encoding('UTF-8')}" 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][read][ERROR] code: #{body["code"]}"
puts "[notice][ERROR] message: #{body["message"]}" puts "[notice][read][ERROR] message: #{body["message"]}"
end end
end end
end end

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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]